var allowedBounds = new Array();
allowedBounds[1] = new GLatLngBounds(new GLatLng(42, 5.625), new GLatLng(42,5.625));
allowedBounds[2] = new GLatLngBounds(new GLatLng(-74,-54.49), new GLatLng(74,54.49));
allowedBounds[3] = new GLatLngBounds(new GLatLng(-81.33,-116.89), new GLatLng(81.33,116.89));
allowedBounds[4] = new GLatLngBounds(new GLatLng(-83.48,-148.44), new GLatLng(83.48,148.44));
allowedBounds[5] = new GLatLngBounds(new GLatLng(-84.31,-164.04), new GLatLng(84.31,164.04));
allowedBounds[6] = new GLatLngBounds(new GLatLng(-84.69,-172), new GLatLng(84.69,172));
allowedBounds[7] = new GLatLngBounds(new GLatLng(-84.87,-175.91), new GLatLng(84.87,175.91));
allowedBounds[8] = new GLatLngBounds(new GLatLng(-85,-177.94), new GLatLng(85,177.94));
allowedBounds[9] = new GLatLngBounds(new GLatLng(-85,-177.85), new GLatLng(85,177.85));


// Set map zoom limits
G_NORMAL_MAP.getMinimumResolution = function () { return 1 };
G_NORMAL_MAP.getMaximumResolution = function () { return 17 };

// Namespaces
if (typeof(pedalroom) == 'undefined') { pedalroom = function() {}; }
pedalroom.membermap = function() {};


pmm = null;
pedalroom.membermap.move_timer = null;

pedalroom.membermap.points = null;
pedalroom.membermap.markers = null;

pedalroom.membermap.view_type = 'all'; // "all" or "reduced"

// Define our icon that we use for every pin when in reduced mode
pedalroom.membermap.reduced_icon = new GIcon();
pedalroom.membermap.reduced_icon.image = "/img/maps/highlight_pink.png";
pedalroom.membermap.reduced_icon.iconSize = new GSize(66, 66);
pedalroom.membermap.reduced_icon.iconAnchor = new GPoint(33, 33);

// This is to track if we just zoomed when we handle the move. Initially set
// to just some ridiculously high number.
pedalroom.membermap.prev_zoom = 99;


// Flag to see if a pin was just clicked. Gets checked in handle_move to make
// sure we don't reload data if a pin was just clicked.
pedalroom.membermap.pin_clicked = false;


// For editing
pedalroom.membermap.edit_marker = null;
pedalroom.membermap.saved_lat = null;
pedalroom.membermap.saved_lat = null;


pedalroom.membermap.init = function() {
  
  var default_lat = 39.909736;
  var default_lng = -32.695312;
  var default_zoom = 2;
  var custom_default_location = false;
  
  var default_location_elem = document.getElementById('default_location');
  if (default_location_elem)
  {
    var default_parts = default_location_elem.value.split(',');
    
    if (default_parts.length == 2)
    {
      default_lat = default_parts[0];
      default_lng = default_parts[1];
      default_zoom = 8;
      custom_default_location = true;
    }
  }
  
  pmm = new google.maps.Map2(document.getElementById('map'));
  pmm.setCenter(new google.maps.LatLng(default_lat, default_lng), default_zoom);
  pmm.addControl(new GLargeMapControl());
  
  var save_button = document.getElementById('save_button');
  
  GEvent.addListener(pmm, "move", function() {
    pedalroom.membermap.check_bounds();
  });
  
  if (!save_button)
  {
    GEvent.addListener(pmm, "moveend", function() {
      if (pedalroom.membermap.move_timer)
      {
        clearTimeout(pedalroom.membermap.move_timer);
      }
      pedalroom.membermap.move_timer = setTimeout('pedalroom.membermap.handle_move();', 100);
    });
    
    pedalroom.membermap.load_data();
  }
  else
  {
    // Edit pin mode
    pedalroom.membermap.drop_pin();
  }
};


// If the map position is out of range, move it back
pedalroom.membermap.check_bounds = function() {
  var ab = allowedBounds[pmm.getZoom()];
  if (typeof(ab) == 'undefined')
  {
    return;
  }
  
  // Perform the check and return if OK
  if (ab.contains(pmm.getCenter())) {
    return;
  }

  // It`s not OK, so find the nearest allowed point and move there
  var C = pmm.getCenter();
  var X = C.lng();
  var Y = C.lat();

  var AmaxX = ab.getNorthEast().lng();
  var AmaxY = ab.getNorthEast().lat();
  var AminX = ab.getSouthWest().lng();
  var AminY = ab.getSouthWest().lat();

  if (X < AminX) {X = AminX;}
  if (X > AmaxX) {X = AmaxX;}
  if (Y < AminY) {Y = AminY;}
  if (Y > AmaxY) {Y = AmaxY;}
  
  pmm.setCenter(new GLatLng(Y,X));
}


pedalroom.membermap.handle_move = function()
{
  if (pedalroom.membermap.pin_clicked)
  {
    pedalroom.membermap.pin_clicked = false;
    return false;
  }
  
  if (pedalroom.membermap.view_type == 'all' && pedalroom.membermap.prev_zoom < pmm.getZoom())
  {
    pedalroom.membermap.prev_zoom = pmm.getZoom();
    return false;
  }
  
  if (pedalroom.membermap.prev_zoom == 1 && pmm.getZoom() == 1)
  {
    return false;
  }
  
  pedalroom.membermap.load_data();
};


pedalroom.membermap.load_data = function()
{
  var bounds = pmm.getBounds();
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();
  var lat_top = northEast.lat();
  var lat_bottom = southWest.lat();
  var lng_left = southWest.lng();
  var lng_right = northEast.lng();
  
  pedalroom.membermap.prev_zoom = pmm.getZoom();
  
  $.getJSON('/tools/map_data', {lat_top: lat_top, lat_bottom: lat_bottom, long_left: lng_left, long_right: lng_right}, function(data) {
    
    if (!data.success)
    {
      pedalroom.membermap.load_data_error(data);
      return false;
    }
    
    pedalroom.membermap.load_data_success(data);
  });
};


pedalroom.membermap.load_data_success = function(data)
{
  pedalroom.membermap.view_type = data.display_type;
  
  pedalroom.membermap.points = data.pins;
  
  pedalroom.membermap.display_markers();
};


pedalroom.membermap.load_data_error = function(error)
{
  // do nothing
};


pedalroom.membermap.display_markers = function() {
  pedalroom.membermap.delete_markers();
  pedalroom.membermap.add_markers();
};


pedalroom.membermap.delete_markers = function()
{
  pedalroom.membermap.markers = null;
  pmm.clearOverlays();
};


pedalroom.membermap.add_markers = function()
{
  pedalroom.membermap.markers = pedalroom.membermap.get_pins();
  
  for (var i = 0, len = pedalroom.membermap.markers.length; i < len; i++)
  {
    pmm.addOverlay(pedalroom.membermap.markers[i]);
  }
};


pedalroom.membermap.get_pins = function()
{
  var batch = [];
  for (var i = 0, len = pedalroom.membermap.points.length; i < len; i++)
  {
    var point = pedalroom.membermap.points[i];
    
    batch.push(pedalroom.membermap.create_pin(point));
  }
  
  return batch;
};


pedalroom.membermap.create_pin = function(point, lat_lng, member_name, member_id, member_has_photo)
{
  marker_options = {title: point.name};
  
  if (pedalroom.membermap.view_type == 'reduced')
  {
    marker_options = {icon: pedalroom.membermap.reduced_icon, clickable: false, title: 'Zoom to view members.'};
  }
  
  // Create point for the pin
  var lat_lng = new GLatLng(point.latitude, point.longitude);
  var pin = new GMarker(lat_lng, marker_options);
  
  if (pedalroom.membermap.view_type == 'all')
  {
    GEvent.addListener(pin, 'click', function() {
      pedalroom.membermap.pin_clicked = true;
      var html = '<a href="/members/' + point.name + '" title="View profile" style="float: left; padding-top: 20px; font-size: 12px; font-weight: bold;">' + point.name + '</a>';
      if (point.has_photo)
      {
        html = '<a href="/members/' + point.name + '" title="View profile" style="display: block; float: left; padding-top: 4px; padding-right: 6px;"><img src="/m/' + point.id + 's.jpg" width="48" height="48" style="border: 0;"></a>' + html;
      }
      pmm.openInfoWindowHtml(lat_lng, html, {onOpenFn: pedalroom.membermap.on_pin_click});
    });
  }
  return pin;
};

pedalroom.membermap.on_pin_click = function()
{
  // This feels kinda hackish. We anticipate the map movement that may result
  // from a pin being clicked to be less than 1 second. If it takes longer,
  // the map data will reload because pin_clicked will be set to false, which
  // will close the pin popup window, which is bad.
  setTimeout(function() { pedalroom.membermap.pin_clicked = false; }, 1000);
}


pedalroom.membermap.drop_pin = function()
{
  var bounds = pmm.getBounds();
  var center = bounds.getCenter();

  pedalroom.membermap.edit_marker = new GMarker(center, {draggable: true});

  pmm.addOverlay(pedalroom.membermap.edit_marker);
  
  var save_button = document.getElementById('save_button');
  save_button.disabled = false;
  save_button.onclick = function()
  {
    pedalroom.membermap.save_pin_click();
  }
};

pedalroom.membermap.save_pin_click = function()
{
  var save_button = document.getElementById('save_button');
  save_button.disabled = 'disabled';
  save_button.blur();
  
  var position = pedalroom.membermap.edit_marker.getLatLng();
  
  pedalroom.membermap.saved_lat = position.lat();
  pedalroom.membermap.saved_lng = position.lng();
  
  $.post('/controlpanel/edit_map_pin', {lat: pedalroom.membermap.saved_lat, lng: pedalroom.membermap.saved_lng}, function(data) {
    
    if (data != 'success')
    {
      alert('Could not save your map pin. Please try again later.');
      return false;
    }
    
    pedalroom.membermap.save_success();
  }, 'text');
};

pedalroom.membermap.save_success = function()
{
  var params_str = '?l=' + pedalroom.membermap.saved_lat + ',' + pedalroom.membermap.saved_lng;
  window.location.replace('/map' + params_str);
};


window.onload = function()
{
  pedalroom.membermap.init();
};
