var map;
var mgr;
var geocoder;
var allmarkers = [];
var apamarkers = [];
var attraction;
var polylines = [];

function initialize() 
{
  if (GBrowserIsCompatible())
  {
    SetAttractionView();
    
    var closest = document.getElementById("closest");
    
    closest.style.display = "none";

    map = new GMap2(document.getElementById("map_canvas"));
    
    map.setCenter(new GLatLng(42.651763142725095, -73.76134872436523), 14, G_NORMAL_MAP);
    map.addControl(new GLargeMapControl());
    map.addControl(new GScaleControl());

    mgr = new MarkerManager(map);
    
    geocoder = new GClientGeocoder();

    GDownloadUrl("/MapServices.asmx/GetFacilityMarkers", function(data, responseCode)
    {
      processMarkers(data, true);
    }); 
    
    var Tab = document.getElementById("AttrTab");
    Tab.className = "selected";  

    var AttrSelect = document.getElementById("AttrTab"); 
    Tab.className = "selected";  
    
    ShowMeters();
  }
}

//*******************************************************************************
function processAttraction(oSelect)
{
  var iAttrID = oSelect.options[oSelect.selectedIndex].value;
  
  GDownloadUrl("/MapServices.asmx/GetAttractionMarkers?a="+iAttrID, function(data, responseCode)
  {
    clearMarkers();
    processMarkers(data, false);
    showClosest(data);
  });      
}

//*******************************************************************************
function processMarkers(data, bAPAOnly)
{
  var xml = GXml.parse(data);
  var mark;
  var counter = 0;
  var bCenter = false;
  var CenterPoint;

  // Process the facilities
  var markers = xml.documentElement.getElementsByTagName("facility");

  for (var i = 0; i < markers.length; i++)
  {
    var OwnedByAPA = (markers[i].getAttribute("apa") == 'Y');
    var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                        parseFloat(markers[i].getAttribute("lng")));

    var infohtml = formatMarkerInfo(markers[i], false);

    if (OwnedByAPA)
    {
      mark = makeMarker("P", point, infohtml, "", counter++);
      allmarkers.push(mark);
    }
    else if (!bAPAOnly)
    {
      mark = makeMarker("F", point, infohtml, "", counter++);
      allmarkers.push(mark);
    }
  }

  // Process the attractions
  var markers = xml.documentElement.getElementsByTagName("attraction");

  for (var i = 0; i < markers.length; i++)
  {
    var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                        parseFloat(markers[i].getAttribute("lng")));

    CenterPoint = point;

    var infohtml = formatMarkerInfo(markers[i], true);

    mark = makeMarker("A", point, infohtml, "", 0);

    allmarkers.push(mark);

    bCenter = true;
  }

  mgr.addMarkers(allmarkers, 11);
  mgr.refresh();

  if (bCenter)
    map.setCenter(CenterPoint, 16, G_NORMAL_MAP);
}

//*******************************************************************************
function makeMarker(type, point, info, address, index) 
{
  var NewMarker;
  var icon = new GIcon();
  
  switch (type)
  {
     case "A" :
        icon.image = "/images/map/red_star_icon.png";
        icon.shadow = "/images/map/star_icon_shadow.png";
        icon.iconSize = new GSize(20.0, 34.0);
        icon.shadowSize = new GSize(38.0, 34.0);
        icon.iconAnchor = new GPoint(10.0, 34.0);
        icon.infoWindowAnchor = new GPoint(10.0, 17.0);
        //NewMarker = new GMarker(point, icon, {zIndexProcess:importanceOrder});
        NewMarker = new GMarker(point,{icon:icon,zIndexProcess:importanceOrder}); 
        NewMarker.importance = 100;
        break;
     case "P" :
        /*
	icon.image = "/images/map/apa_icon.png";
        icon.shadow = "/images/map/apa_icon_shadow.png";
        icon.iconSize = new GSize(35.0, 34.0);
        icon.shadowSize = new GSize(53.0, 34.0);
        icon.iconAnchor = new GPoint(17.0, 34.0);
        icon.infoWindowAnchor = new GPoint(17.0, 17.0);
        NewMarker = new GMarker(point,{icon:icon,zIndexProcess:importanceOrder});
        */
        //icon.image = "/images/map/orange_" + letters[index] + "_icon.png";
        icon.image = "/images/map/orange_" + String.fromCharCode(97 + index) + "_icon.png";
        icon.shadow = "/images/map/star_icon_shadow.png";
        icon.iconSize = new GSize(20.0, 34.0);
        icon.shadowSize = new GSize(38.0, 34.0);
        icon.iconAnchor = new GPoint(10.0, 34.0);
        icon.infoWindowAnchor = new GPoint(10.0, 17.0);
        NewMarker = new GMarker(point,{icon:icon,zIndexProcess:importanceOrder});
        NewMarker.importance = 1;
        break;
     default :
        //NewMarker = new GMarker(point);
        //icon.image = "/images/map/purple_" + letters[index] + "_icon.png";
        icon.image = "/images/map/purple_" + String.fromCharCode(97 + index) + "_icon.png";
        icon.shadow = "/images/map/star_icon_shadow.png";
        icon.iconSize = new GSize(20.0, 34.0);
        icon.shadowSize = new GSize(38.0, 34.0);
        icon.iconAnchor = new GPoint(10.0, 34.0);
        icon.infoWindowAnchor = new GPoint(10.0, 17.0);
        NewMarker = new GMarker(point,{icon:icon,zIndexProcess:importanceOrder});
        NewMarker.importance = 50 - index;
  } 
  
  //map.addOverlay(NewMarker);  
  
  if (address.length > 0)
  {
    var tabs_array = [ new GInfoWindowTab("Info", info), new GInfoWindowTab("Address", "") ];

    GEvent.addListener(NewMarker, "click", function() {
      NewMarker.openInfoWindowTabsHtml(tabs_array);
    });
  }
  else
    GEvent.addListener(NewMarker, "click", function() {
      NewMarker.openInfoWindowHtml(info);
    });
      
  return NewMarker;
}

//*******************************************************************************
function formatMarkerInfo(marker, attraction)
{
  var info = "";

  info = "<div class=\"MapInfo\">";
  info += "<h1>" + marker.getAttribute("name") + "</h1>";
  if (NotNothing(marker.getAttribute("description")))
    info += "<p>" + marker.getAttribute("description") + "</p>";
  
  if (!attraction)
  {
    if (NotNothing(marker.getAttribute("spaces")))
      info += "<h2>" + marker.getAttribute("spaces") + " Spaces</h2>";
    if (NotNothing(marker.getAttribute("hours")))
      info += "<h2>Hours</h2><p>" + marker.getAttribute("hours") + "</p>";
    if (NotNothing(marker.getAttribute("rates")))
      info += "<h2>Rates</h2><p>" + marker.getAttribute("rates") + "</p>";
  }

  info += "</div>";
  
  return info;
}

//*******************************************************************************
function clearMarkers()
{
  for (var i=0; i<allmarkers.length; i++)
  {
    map.removeOverlay(allmarkers[i]);
  }

  allmarkers = [];
  mgr.clearMarkers();
  mgr.addMarkers(apamarkers, 3);
  mgr.refresh();
}

//*******************************************************************************
function showClosest(data)
{
  var closest = document.getElementById("closest");
  var cf = document.getElementById("cf");
  var xml = GXml.parse(data);
  var HTML = "";
  var dist = 0;

  cf.innerHTML = "";

  // Process the facilities
  var facilities = xml.documentElement.getElementsByTagName("facility");

  for (var i = 0; i < facilities.length; i++)
  {
    HTML = "<div"

    var OwnedByAPA = (facilities[i].getAttribute("apa") == 'Y');

    if (OwnedByAPA)
      HTML += " class=\"APAFacility\"><span class=\"dist\">"
    else
      HTML += "><span class=\"dist\">"
      
    dist = new Number(facilities[i].getAttribute("distance"));
    
    if (dist.toFixed)
      HTML += dist.toFixed(2);
    else
      HTML += dist;

    HTML += "</span>" + String.fromCharCode(65 + i) + ".&nbsp;&nbsp;"
    HTML += facilities[i].getAttribute("name")
    HTML += "</div>"
      
    cf.innerHTML += HTML;
  }

  closest.style.display = "";
}

//*******************************************************************************
function inverseOrder(marker,b) {
  return -GOverlay.getZIndex(marker.getPoint().lat());
}

//*******************************************************************************
function orderOfCreation(marker,b) {
  return 1;
}

//*******************************************************************************
function importanceOrder (marker,b) {
  return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
}

//*******************************************************************************
function SetAddressView()
{  
  var AttrPanel = document.getElementById("AttrPanel");
  var AddrPanel = document.getElementById("AddrPanel");
  var AttrTab = document.getElementById("AttrTab");
  var AddrTab = document.getElementById("AddrTab");
  
  AttrPanel.style.display = "none";
  AddrPanel.style.display = "";
  
  AttrTab.className = "";
  AddrTab.className = "selected";
}

//*******************************************************************************
function SetAttractionView()
{  
  var AttrPanel = document.getElementById("AttrPanel");
  var AddrPanel = document.getElementById("AddrPanel");
  var AttrTab = document.getElementById("AttrTab");
  var AddrTab = document.getElementById("AddrTab");
  
  AttrPanel.style.display = "";
  AddrPanel.style.display = "none";
  
  AttrTab.className = "selected";
  AddrTab.className = "";
}

//*******************************************************************************
function findAddress()
{
  var Street = document.getElementById("street");
  var address = Street.value + ", Albany, NY";
  
  geocoder.getLocations(address, processAddress);
}

//*******************************************************************************
function processAddress(response) 
{
  var mark;
  var icon = new GIcon();

  if (!response || response.Status.code != 200) 
  {
    alert("Sorry, we were unable to find that address");
  } 
  else 
  {
    clearMarkers()
    place = response.Placemark[0];
    point = new GLatLng(place.Point.coordinates[1],
                        place.Point.coordinates[0]);
                        
                        
    mark = makeMarker("A", point, place.address, "", 0);

    allmarkers.push(mark);
    GDownloadUrl("/MapServices.asmx/GetFacilityMarkersNearAddress?lat="+place.Point.coordinates[1]+"&lng="+place.Point.coordinates[0], function(data, responseCode) 
    {
      processMarkers(data, false);
      showClosest(data);
    });
  }
}

//*******************************************************************************
function ShowMeters()
{
  var i = 0;
  var oMeter;
  var PolyLine;

  for (i = 0; i < arMeters.length; i++)
  {
     oMeter = arMeters[i];

     polylines[i] = new GPolyline.fromEncoded({
          color: oMeter.color,
          weight: 4,
          points: oMeter.line,
          levels: oMeter.level,
          zoomFactor: 32,
          opacity: 0.7,
          numLevels: 4
     });
 
     map.addOverlay(polylines[i]);

     PolyLine = polylines[i];

     if (oMeter.blurb.length > 0)
     {
        addMeterEvent(PolyLine, oMeter.blurb);
     }
  }
}

//*******************************************************************************
function NotNothing(sValue)
{
    if (sValue != null)
        if (sValue.length > 0)
            return true;
        else
            return false;
    else
        return false;
}

//*******************************************************************************
function objMeter(id, line, level, color, blurb)
{
    this.id = id
    this.line = line
    this.level = level
    this.color = color
    this.blurb = blurb
}

//*******************************************************************************
function addMeterEvent(PolyLine, blurb)
{
   GEvent.addListener(PolyLine, "click", function(latlng) {
     map.openInfoWindowHtml(latlng, blurb);
   });
}