var shopMarkers = new Hash();
var map, smallmap;
var shopId;
var infoWindowOpened = false;

var smallIcon = new GIcon();
smallIcon.image="http://labs.google.com/ridefinder/images/mm_20_yellow.png";
smallIcon.shadow="http://labs.google.com/ridefinder/images/mm_20_shadow.png";
smallIcon.iconSize=new GSize(12,20);
smallIcon.shadowSize=new GSize(22,20);
smallIcon.iconAnchor=new GPoint(6,20);
smallIcon.infoWindowAnchor=new GPoint(6,1);
smallIcon.infoShadowAnchor=new GPoint(13,13);

function createShopMarker(shop) {
  var marker;
  if(shop.id == shopId) {
    marker = new GMarker(new GLatLng(shop.lat, shop.lng));
  } else {
    marker = new GMarker(new GLatLng(shop.lat, shop.lng), smallIcon);
  }
  marker.html = shop.html;
  return marker;
}

function onMapMoveEnd() {
  var center = map.getCenter();
  $('map_center').innerHTML = center.lat() + "," + center.lng();

  new Ajax.Request(
    "/top/ajax_neighbors",
    {
      parameters: {lat: center.lat(), lng: center.lng()},
      method: "get",
      onComplete: function(originalRequest) {
        var neighbors = eval(originalRequest.responseText);
        var shopsToAdd = new Array();
        var neighborShops = new Hash();
        neighbors.each(function(shop) {
          neighborShops.set(shop.id, shop);
          if(!shopMarkers.get(shop.id)) {
          shopsToAdd.push(shop.id)
          }
        });
        shopsToAdd.each(function(id) {
          var shop = neighborShops.get(id);
          var marker = createShopMarker(shop);
          shopMarkers.set(id, marker);
          map.addOverlay(marker);
          if(id == shopId && !infoWindowOpened) {
            marker.openInfoWindowHtml(marker.html);
            infoWindowOpened = true;
          }
        });
        shopMarkers.each(function(arg) {
          var id = arg[0];
          var marker = arg[1];
          if(!neighborShops.get(id) && id != shopId) {
            map.removeOverlay(marker);
            shopMarkers.unset(id);
          }
        });
      }
    });
}

function load(lat, lng, shop) {
  shopId = shop;
  var latlng = new GLatLng(lat, lng);
  // ---- main map
  map = new GMap2($("gmap"));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GScaleControl());
  map.setCenter(latlng,18);

  // add event listener
  GEvent.addListener(map, 'click', function(overlay, point) {
    if(overlay && overlay.html) {
      overlay.openInfoWindowHtml(overlay.html);
    }
  });
  GEvent.addListener(map, "moveend", onMapMoveEnd);
  onMapMoveEnd();

  // ---- small map
  smallmap = new GMap2($("smallmap"));
  smallmap.addControl(new GSmallMapControl());
  smallmap.setCenter(latlng, 13);
  smallmap.addOverlay(new GMarker(latlng));
}
