
var routeController = null;
var routeIcon = null;
var polylineEncoder = null;
var allowedBounds = null;

var timeOut = 250;
var map = null;

var autoCompleteDefaultValue ="";
function autoCompleteClearField(elemId, elemValue) {
   autoCompleteDefaultValue = elemValue;
   if($F(elemId) == autoCompleteDefaultValue) {
     Form.Element.setValue(elemId, "");
   }
}
function autoCompleteCheckAndFillField(elemId) {
 if($F(elemId) == "") {
   Form.Element.setValue(elemId, autoCompleteDefaultValue);
 }
}

function gotoPlace(field, selectedItem) {
  var points = selectedItem.id.substring(2).split(':');
  var point = new GLatLng(points[0], points[1]);
  //window.location.hash = escape(points[2]);
  map.panTo(point);
}

function mapLoaded(){
  Debug.log("maploaded");
  routeController.loadAllInBound();
  document.getElementById("map-loading").style.visibility = 'hidden';
}

function mapLoading(){
  Debug.log("maploading");
  document.getElementById("map-loading").style.visibility = 'visible'
}
// FIXME
// If the map position is out of range, move it back
function checkBounds() {
  var aberration = 0.2; // this value is a good choice for germany (?!)
  // Perform the check and return if OK
  var currentBounds = map.getBounds();
  var cSpan = currentBounds.toSpan(); // width and height of the bounds
  var offsetX = cSpan.lng() / (2+aberration); // we need a little border
  var offsetY = cSpan.lat() / (2+aberration);
  var C = map.getCenter(); // current center coords
  var X = C.lng();
  var Y = C.lat();

  // now check if the current rectangle in the allowed area
  var checkSW = new GLatLng(C.lat()-offsetY,C.lng()-offsetX);
  var checkNE = new GLatLng(C.lat()+offsetY,C.lng()+offsetX);

  if (allowedBounds.containsLatLng(checkSW) &&
    allowedBounds.containsLatLng(checkNE)) {
    return; // nothing to do
  }

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

  if (X < (AminX+offsetX)) {X = AminX + offsetX;}
  if (X > (AmaxX-offsetX)) {X = AmaxX - offsetX;}
  if (Y < (AminY+offsetY)) {Y = AminY + offsetY;}
  if (Y > (AmaxY-offsetY)) {Y = AmaxY - offsetY;}

  map.panTo(new GLatLng(Y,X));
  return;
}


function loadMap() {
  if (GBrowserIsCompatible()) {

	  if(GUnload != undefined){
	    window.onunload = GUnload;
	  }

		var centerPoint = new GLatLng(centerLatitude, centerLongitude);

		if(routeEdit) {
			map = new GMap2(document.getElementById("map"),{draggableCursor:"crosshair"});
		}
		else {
			map = new GMap2(document.getElementById("map"));
		}

    var minRes = 9;
    var maxRes = 18;

    allowedBounds = new GLatLngBounds(new GLatLng( swBoundaries.lat, swBoundaries.lng) , new GLatLng( neBoundaries.lat, neBoundaries.lng) );

    // Get the list of map types
    var mt = map.getMapTypes();

    // Overwrite the getMinimumResolution() and getMaximumResolution() methods
    for (var i=0; i<mt.length; i++) {
      mt[i].getMinimumResolution = function() {return minRes;}
      mt[i].getMaximumResolution = function() {return maxRes;}
    }

		map.setCenter(centerPoint, initialZoom);

		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
		map.addControl(new GLargeMapControl() , new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(10,45)));
    map.addControl(new GOverviewMapControl(new GSize(120,120)));

		map.enableContinuousZoom();
		map.enableScrollWheelZoom();

    routeIcon = new RouteIcon(map);
    routeController = new RouteController(map);
    //GEvent.addListener(map, "movestart", routeController.captureMoveStartEvent);
    GEvent.addListener(map, "moveend", routeController.captureMoveEndEvent);
//    GEvent.addListener(map, "moveend", function() {
//      checkBounds();
//    });

	// edit functions need to be called here
		if(routeEdit){
			initRouteControls( map );
		}

	window.setTimeout(mapLoaded,timeOut);
 }
}

function activateMap() {

  script = document.createElement("script");
  script.setAttribute("src", "http://maps.google.com/maps?file=api&v=2.x&async=2&callback=loadMap&key=" + apiKey);
  script.setAttribute("type", "text/javascript");
  document.documentElement.firstChild.appendChild(script);
}
