/*
 * Map Detail
 * Returns a map with a single plotted point.
 */
jQuery.fn.map_detail = function(p_business_obj, mapDefaults) {
  var mapDefaults = {};

  return this.each(function() {
    if (GBrowserIsCompatible()) {
      var map = new GMap2(this);
      var business = p_business_obj;

      map.addControl(new GSmallZoomControl());
      map.addControl(new GMenuMapTypeControl());
      map.setCenter(new GLatLng(business.latitude, business.longitude), 15);

      var point = new GLatLng(business.latitude, business.longitude);

      var icon = new GIcon();
      icon.image = business.icon_image;
      icon.iconSize = new GSize(25, 25);
      icon.iconAnchor = new GPoint(12, 12);
      icon.infoWindowAnchor = new GPoint(0, 0);
      icon.shadow = business.icon_shadow;

      var marker = new GMarker(point, icon);
      map.addOverlay(marker);
    }
  });
}


/*
 * Map Results
 * Returns a map with plotted points.
 */
jQuery.fn.map_results = function(p_business_list, mapDefaults) {
  var mapDefaults = {};

  return this.each(function() {
    if (GBrowserIsCompatible()) {
      var current_marker = null;
      var map = new GMap2(this);
      var business_list = p_business_list;
      var marker_list = [];
      var marker_balloon_list = [];
      var bounds = new GLatLngBounds();

      map.addControl(new GSmallZoomControl());
      map.addControl(new GMenuMapTypeControl());
      map.setCenter(new GLatLng(0, 0), 0);

      var manager = new MarkerManager(map);

      /*
       * Pane Open
       * Displays the current markers overlay and triggers the
       * map:paneOpened event.
       */
      function paneOpen(e, marker_index) {
        if (current_marker) {
          $(document).trigger('map:paneClose');
        }
        current_marker = marker_list[marker_index];
        current_marker.overlay = new DefaultOverlay(current_marker, marker_balloon_list[marker_index]);
        map.addOverlay(current_marker.overlay);
        map.panTo(current_marker.getLatLng());
        $(document).trigger('map:paneOpened', [marker_index]);
      }

      /*
       * Close Pane
       * Removes the current_maker's overlay from map and clears out
       * the current_marker variable.
       */
      function paneClose() {
        if (current_marker) {
          map.removeOverlay(current_marker.overlay);
          current_marker.show();
        }
        current_marker = null;
      }

      /*
       * Map Resize
       * Listens for map:resize trigger so the map can refresh itself.
       */
      function mapResize(e) {
        map.checkResize();
        map.setCenter(bounds.getCenter());
      }

      $(document).bind('map:resize', mapResize);
      $(document).bind('map:paneOpen', paneOpen);
      $(document).bind('map:paneClose', paneClose);

      for (var i=0; i<business_list.length; i++) {
        var business = business_list[i];
        if (business.latitude && business.longitude) {
        }
        else {
          business_list.pop(business_list[i]);
        }
      }

      for (var i=0; i<business_list.length; i++) {
        var business = business_list[i];
        var point = new GLatLng(business.latitude, business.longitude);
        var icon = new GIcon({
          image: business.icon_image,
          iconSize: new GSize(25, 25),
          iconAnchor: new GPoint(12, 12),
          infoWindowAnchor: new GPoint(0, 0),
          shadow: business.icon_shadow
        });

        var marker_balloon = '<div class=\"marker_balloon\" style="border-color:'+business.balloon_border_color+';">';
        if (business.url) {
          marker_balloon += '<h4><a href="'+business.url+'">'+business.name+'</a></h4>';
        }
        else {
          marker_balloon += '<h4>'+business.name+'</h4>';
        }
        marker_balloon += '<p>'+business.address+'</p>';
        marker_balloon += '</div>';
        marker_balloon_list.push(marker_balloon);

        var marker = new GMarker(point, {icon: icon});
        marker.id = i;
        GEvent.addListener(marker, 'click', function() {
          $(document).trigger('map:paneOpen', [this.id]);
        });
        marker_list.push(marker);
        bounds.extend(point);
      };

      map.setZoom(map.getBoundsZoomLevel(bounds));
      map.setCenter(bounds.getCenter());
      manager.addMarkers(marker_list, 10);
      manager.refresh();
    }
  });
}


/*
 * Map Results
 * Returns a map with plotted points.
 */
jQuery.fn.geoxml_map_results = function(p_obj, mapDefaults) {
  var mapDefaults = {};

  return this.each(function() {
    if (GBrowserIsCompatible()) {
      var map = new GMap2(this);
      map.addControl(new GSmallZoomControl());
      map.addControl(new GMenuMapTypeControl());
      map.setCenter(new GLatLng(p_obj.latitude, p_obj.longitude), p_obj.zoom);
      map.addOverlay(p_obj.geo_xml);
    }
  });
}