var gmap = null;
var gmap_bounds = null;

var divebases = new Array();
var waters = new Array();
var borders = new Array();

function load() {
  if (GBrowserIsCompatible()) {
    gmap = new GMap2(document.getElementById("gmap"));
    gmap.addControl(new GSmallMapControl());
    gmap.addControl(new GMapTypeControl());
    //gmap.addControl(new GScaleControl(200));

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

    var accommodation_icon = new GIcon(base_icon_2);
    accommodation_icon.image = "http://labs.google.com/ridefinder/images/mm_20_yellow.png";

    var divecenter_icon = new GIcon(base_icon_2);
    divecenter_icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
    //var divecenter_icon = new GIcon(base_icon_2);
    //divecenter_icon.image = "/img/icons/earth/divebase.png";

    var divesite_icon = new GIcon(base_icon_2);
    divesite_icon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";

    // Init
    var point = new GLatLng(0,0);
    gmap.setCenter(point);

    // Tests
    if (0) {
      addBorder(48, 9, 49, 10, 'Test', 'region');
    }

    // Markers und View
    for (var i=0; i < divebases.length; i++) {
      var point = divebases[i][0];
      var text = divebases[i][1];
      var marker = createMarker(point, divecenter_icon, text);
      gmap.addOverlay(marker);
      bounds().extend(point);
    }
    for (var i=0; i < waters.length; i++) {
      var point = waters[i][0];
      var text = waters[i][1];
      var marker = createMarker(point, divesite_icon, text);
      gmap.addOverlay(marker);
      bounds().extend(point);
    }
    for (var i=0; i < borders.length; i++) {
      var point_min = borders[i][0];
      var point_max = borders[i][1];
      var text = borders[i][2];
      var type = borders[i][3];
      var polylines = createPolyline(point_min, point_max);     
      if (type == "country") {
        gmap.addOverlay(new GPolyline(polylines, '#ff0000', 2, 0.5));
      } else if (type == "region") {
        gmap.addOverlay(new GPolyline(polylines, '#ff0000', 1, 0.5));
      } else if (type == "unknown") {
        gmap.addOverlay(new GPolyline(polylines, '#0000ff', 1, 0.5));
      } else {
        gmap.addOverlay(new GPolyline(polylines, '#ffff00', 1, 0.5));
      }
    }

    // Resize bounds
    var point_sw = bounds().getSouthWest();
    var point_ne = bounds().getNorthEast();
    var span = bounds().toSpan();
    var span_lat = span.lat()/20;
    var span_lng = span.lng()/20;
    var new_sw = new GLatLng(point_sw.lat()-span_lat, point_sw.lng()-span_lng);
    bounds().extend(new_sw);
    var new_ne = new GLatLng(point_ne.lat()+span_lat, point_ne.lng()+span_lng);
    bounds().extend(new_ne);

    if (0) {
      var point_sw = bounds().getSouthWest();
      var point_ne = bounds().getNorthEast();
      var polylines = createPolyline(point_sw, point_ne);
      gmap.addOverlay(new GPolyline(polylines, '#00ff00', 2, 0.5));
    }

    var center = bounds().getCenter();
    gmap.setCenter(center);

    var zoom = Math.min(gmap.getBoundsZoomLevel(bounds()), 15);
    if (zoom >= 15) zoom = 14;
    gmap.setZoom(zoom);
    if (zoom >= 10) gmap.setMapType(G_SATELLITE_MAP);
  }
}

// paint

function createMarker(point, icon, text) {
  var marker = new GMarker(point, icon);
  var html = '<span style="font-family:Verdana,Arial,Helvetica;font-size:9px;color:#000000;">' + text + '</span>';
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  return marker;
}

function createPolyline(point_min, point_max) {
  var point_1 = new GLatLng(point_min.lat(), point_min.lng());
  var point_2 = new GLatLng(point_min.lat(), point_max.lng());
  var point_3 = new GLatLng(point_max.lat(), point_max.lng());
  var point_4 = new GLatLng(point_max.lat(), point_min.lng());
  var point_5 = new GLatLng(point_min.lat(), point_min.lng());
  var polyline = [point_1, point_2, point_3, point_4, point_5];
  return polyline;
}

// visible

function addDivebase(latitude, longitude, text) {
  var point = new GLatLng(latitude, longitude);
  divebases.push(new Array(point, text));
}

function addWater(latitude, longitude, text) {
  var point = new GLatLng(latitude, longitude);
  waters.push(new Array(point, text));
}

function addRegion(latitude_min, longitude_min, latitude_max, longitude_max, text) {
  var point_min = new GLatLng(latitude_min, longitude_min);
  var point_max = new GLatLng(latitude_max, longitude_max);
  borders.push(new Array(point_min, point_max, text, 'region'));
}

function addCountry(latitude_min, longitude_min, latitude_max, longitude_max, text) {
  var point_min = new GLatLng(latitude_min, longitude_min);
  var point_max = new GLatLng(latitude_max, longitude_max);
  borders.push(new Array(point_min, point_max, text, 'region'));
}

function addRegionOrCountry(latitude_min, longitude_min, latitude_max, longitude_max, text) {
  var point_min = new GLatLng(latitude_min, longitude_min);
  var point_max = new GLatLng(latitude_max, longitude_max);
  borders.push(new Array(point_min, point_max, text, 'region'));
}

function addBorder(latitude_min, longitude_min, latitude_max, longitude_max, text) {
  var point_min = new GLatLng(latitude_min, longitude_min);
  var point_max = new GLatLng(latitude_max, longitude_max);
  borders.push(new Array(point_min, point_max, text, 'unknown'));
}

// invisible

function addBound(latitude, longitude) {
  var point = new GLatLng(latitude, longitude);
  bounds().extend(point);
}

function bounds() {
  if (gmap_bounds == null) gmap_bounds = new GLatLngBounds();
  return gmap_bounds;
}
