var map;
var yourLatLng;

function Points()
{
   this.points = new Array();
}

Points.prototype = {
   addPoint:function(point)
   {
      var found = false;
      
      if (!point.draggable)
         for(var i=0; i<this.points.length; i++)
            if (point.equals(this.points[i]) && !this.points[i].draggable)
            {
               found = true;
               this.points[i].username += ("\n" + point.username);
            }
   
      if (!found) this.points.push(point);
   },
   length:function()
   {
      return this.points.length;
   },
   getPoint:function(i)
   {
      return this.points[i];
   },
   draw:function(map)
   {
      var yourMarker = false;
      for (i=0; i<this.points.length; i++)
         if (!this.points[i].draggable)
            map.addOverlay(createMarker(map, this.points[i], this.points[i].draggable));
         else
            yourMarker = this.points[i];
      
      if (yourMarker)
         map.addOverlay(createMarker(map, yourMarker, yourMarker.draggable));
   }
};
   
var points = new Points();

function Point(lat, lng, un, gid, loc, drg)
{
   this.latlng = new GLatLng(lat, lng);
   this.username = "<span class='usergroup" + gid + "'>" + un + "</span>";
   this.location = loc;
   this.draggable = drg;
}

Point.prototype = {
   getlatlng:function()
   {
      return this.latlng;
   },
   toString:function()
   {
      return this.latlng.toString();
   },
   equals:function(point)
   {
      return this.latlng.equals(point.getlatlng());
   },
   setLatLng:function(ll)
   {
      this.latlng = ll;
   }
};

function GInitialize(lat, lng, zoom)
{
   if (GBrowserIsCompatible())
   {
      map = new GMap2(document.getElementById("map_canvas"));
      map.enableScrollWheelZoom();
      if (map.getSize().width >= 300 && map.getSize().height >= 300)
      {
         map.addControl(new GSmallMapControl());
         map.addControl(new GMapTypeControl());
      }
      map.setCenter(new GLatLng(lat, lng), zoom);
      createMarkers();
   }
   loadimages();
}

function focusMarker(lat, lng, zoom)
{
   var latlng = new GLatLng(lat, lng);
   map.setZoom(zoom);
   map.panTo(latlng);
}

function createMarker(map, point, draggable)
{
   if (draggable)
   {
      var marker = new GMarker(point.getlatlng(), {draggable: true});
      yourLatLng = point.getlatlng();
   }
   else
      var marker = new GMarker(point.getlatlng());
   
   GEvent.addListener(marker, "click", function() {
      var users = point.username.split("\n");
      var myHtml = "";
      
      for (var i=0; i<users.length; i++) 
         myHtml += "<a href=\"javascript:focusMarker(" +
            marker.getLatLng().lat() + "," +
            marker.getLatLng().lng() + ",14);\">" +
            users[i] + "</a><br />";
            
      myHtml += "<i>" + point.location + "</i>";
      
      if (!draggable)
      {
         if (yourLatLng)
         {
            var meters = point.getlatlng().distanceFrom(yourLatLng);
            var miles = Math.round(meters / 16.09344) / 100;
            myHtml += "<p />Distance: " + miles + " miles.<br />";
            myHtml += "Commie Miles: " + (Math.round(meters / 10) / 100) + " kilometers.";
         }
      }
      else
         myHtml += "<p /><a href='map.php?action=delete'>Delete Location</a>";
      
      marker.openInfoWindowHtml(myHtml);
   });
   
   GEvent.addListener(marker, "dragend", function() {
      marker.closeInfoWindow();
      map.panTo(marker.getLatLng());
      ajaxRequest("GET", "/map.php?lat=" + marker.getLatLng().lat() + "&lng=" + marker.getLatLng().lng(), null, locationCallback, true);
      yourLatLng = new GLatLng(marker.getLatLng().lat(), marker.getLatLng().lng());
      point.setLatLng(yourLatLng);
   });

   return marker;
}

