var map;
var center;
var cadMap;
var cadMapVisible;
var contours;
var contoursVisible;
var placemarks = new Array();
var placemarksVisible;
var measurements = new Hash();

// measure
var COLORS = [["blue", "#0000ff"],["orange", "#ffa500"], ["lime","#00ff00"],
              ["red", "#ff0000"], ["fuchsia", "#ff00ff"], ["aqua", "#00ffff"], ["yellow", "#ffff00"]];
var options = {};
var colorIndex_ = 0;
// measure

function initialize() {

  if (! GBrowserIsCompatible()) {
    alert("Your browser doesn't support Google Map");
    return;
  }

  map = new GMap2($("map_canvas"));
  map.setUIToDefault();
  map.disableDoubleClickZoom();
  center = new GLatLng(25.668, 28.871);
  resetMap();

  G_PHYSICAL_MAP.getMaximumResolution = function () { return 23 };
  G_NORMAL_MAP.getMaximumResolution = function () { return 23 };
  G_SATELLITE_MAP.getMaximumResolution = function () { return 23 };
  G_HYBRID_MAP.getMaximumResolution = function () { return 23 };

  // measure
  select("hand_b");
  // measure

  //  GEvent.addListener(map, "mousemove", function(latlng) {
  //    $('coord').innerHTML = latlng.lat() + ', ' + latlng.lng();
  //  });

  GEvent.addListener(map, "zoomend", function(oldZoom, newZoom) {
    if (oldZoom >= 14 && newZoom <= 14 && cadMapVisible || oldZoom <= 14 && newZoom >= 14 && ! cadMapVisible){
       cadMapToggle();
       contoursToggle();
    };
  });

  GEvent.addListener(map, "moveend", function() {
    if (map.getZoom() >= 19 ){clearOverzoom()};
  });

  cadMapVisible = true;
  cadMap = new GGeoXml("http://www.nyu.edu/isaw/amheida/inc/kmz/plan.kmz");
  map.addOverlay(cadMap);
  contoursVisible = true;
  contours = new GGeoXml("http://www.nyu.edu/isaw/amheida/inc/kmz/contours.kmz");
  map.addOverlay(contours);

  // Add placemarks
  placemarksVisible = true;
  placemarks[0] = createMarker(new GLatLng(25.669366, 28.873105), "A1", "Area 1");
  placemarks[1] = createMarker(new GLatLng(25.6678, 28.8715), "A2", "Area 2");
  placemarks[2] = createMarker(new GLatLng(25.666859, 28.872654), "A3", "Area 3");
  placemarks[3] = createMarker(new GLatLng(25.668263, 28.869560), "A4", "Area 4");
  placemarks.each(function(placemark) {
    map.addOverlay(placemark)
  });
}

function CustomGetTileUrl(point, zoom) {
  return "http://bb.railsplayground.net/white.png";
}

function createMarker(point, id, label) {
  var marker = new GMarker(point, {title: label});
  marker.value = id;
  GEvent.addListener(marker, "click", function() {
    //showPanel(this.value);
    marker.openInfoWindowHtml($(this.value).innerHTML, {maxWidth: 300});
  });
  return marker;
}

function addLabel(coordinates, id, label){
  var html = $('elabel').innerHTML.interpolate({elabel_id: id, label: label});
  var label = new ELabel(coordinates, html, null, null, 65);
  map.addOverlay(label);
  return label;
}

function resetMap(){
  map.setMapType(G_SATELLITE_MAP);
  map.setCenter(center, 17);
  $('chkPlan').checked = true;
  $('chkContours').checked = true;
  $('chkPlacemarks').checked = true;
}

function clearOverzoom(){
   var mapType = map.getCurrentMapType();
   if (mapType == G_SATELLITE_MAP) {map.setMapType(G_NORMAL_MAP);}
   else {map.setMapType(G_SATELLITE_MAP);};
   map.setMapType(mapType);
}

function cadMapToggle(){
  cadMapVisible = overlayToggle(cadMap, cadMapVisible)
  $('chkPlan').checked = cadMapVisible;
}

function contoursToggle(){
  contoursVisible = overlayToggle(contours, contoursVisible)
  $('chkContours').checked = contoursVisible;
}

function overlayToggle(overlay, visible){
  if (visible){map.removeOverlay(overlay)}
  else{map.addOverlay(overlay)}
  return ! visible;
}

function placemarksToggle(){
  placemarks.each(function(placemark) {
    if (placemarksVisible){placemark.hide()}
    else{placemark.show()}
  });
  placemarksVisible = ! placemarksVisible;
}

// measure

function select(buttonId) {
  $("hand_b").className="unselected";
  $("shape_b").className="unselected";
  $("line_b").className="unselected";
  $(buttonId).className="selected";
}

function stopEditing() {
  select("hand_b");
}

function getColor(named) {
  return COLORS[(colorIndex_++) % COLORS.length][named ? 0 : 1];
}

function startShape() {
  select("shape_b");
  var color = getColor(false);
  var polygon = new GPolygon([], color, 2, 0.7, color, 0.3);
  var d = new Date();
  polygon.id = d.getHours() * 3600000 + d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds();
  measurements.set(polygon.id, polygon);
  map.addOverlay(polygon);
  polygon.enableDrawing(options);
  polygon.enableEditing({onEvent: "mouseover"});
  polygon.disableEditing({onEvent: "mouseout"});

    GEvent.addListener(polygon, "endline", function() {
	    select("hand_b");
	});

	GEvent.addListener(polygon, "click", function(latlng, index) {
		if (typeof index == "number") {
			polygon.deleteVertex(index);
		}
		else
		{
			displayArea(polygon);
		}
	});

	GEvent.addListener(polygon, "lineupdated", function() {
		displayArea(polygon);
	});
}

function displayArea(polygon, field) {
    area = polygon.getArea();
    if (area == 0) return;
    area = Math.round(area) + "&nbsp;sq&nbsp;m";
    var id = 'm' + polygon.id;
    if (measurements.get(id)) map.removeOverlay(measurements.get(id));
    var label = addLabel(polygon.getVertex(polygon.getVertexCount()-1), id, area);
    measurements.set(id, label);
}

function startLine() {
  select("line_b");
  var color = getColor(false);
  var line = new GPolyline([], color);
  var d = new Date();
  line.id = d.getHours() * 3600000 + d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds();
  measurements.set(line.id, line);
  map.addOverlay(line);
  line.enableDrawing(options);
  line.enableEditing({onEvent: "mouseover"});
  line.disableEditing({onEvent: "mouseout"});

  GEvent.addListener(line, "endline", function() {
	    select("hand_b");
	});

  GEvent.addListener(line, "click", function(latlng, index) {
	if (typeof index == "number") {
		line.deleteVertex(index);
	}
	else
	{
		$('debug').innerHTML = $('debug').innerHTML + '<br>c ' + latlng.lat() + ', ' + latlng.lng();
                displayLength(line);
	}
  });

  GEvent.addListener(line, "lineupdated", function() {
	displayLength(line);
  });
}

function displayLength(line) {
  var len = line.getLength();
  if (len == 0) return;
  len = Math.round(len) + "&nbsp;m";
  var id = 'm' + line.id;
  if (measurements.get(id)) map.removeOverlay(measurements.get(id));
  var label = addLabel(line.getVertex(line.getVertexCount()-1), id, len);
  measurements.set(id, label);
  line.disableEditing();
  select("hand_b");
}

function clear_map() {
  // map.clearOverlays();
  measurements.each(function(measurement){
    map.removeOverlay(measurement.value);
  });
}
