function google_map( element_name, set_default_center, small_format ){
   this.api_key = 'KEY';
   this.gmap = null;
   this.element_name = element_name;

   if (small_format == undefined){
      this.small_format = false;
   } else {
      this.small_format = small_format;
   }

   this.init( set_default_center );
}

google_map.prototype.getMap = function(){
   return this.gmap;
}

google_map.prototype.init = function(set_default_center){
  if (GBrowserIsCompatible()) {
    var mapel = $(this.element_name);
    if (compare(mapel, undefined) == 0){
      logError("Map element '" + this.element_name + "' is null!");
    }
    this.gmap = new GMap2(mapel, {draggableCursor: 'crosshair'});

    if ( set_default_center == undefined || set_default_center == true ) {
       this.set_user_map_center();
    }

    if (!this.small_format){
       this.gmap.addControl( new GSmallMapControl() );
       this.gmap.addControl( new GMapTypeControl() );
    }

    mapel.style.cursor = "cross";
  }
}

google_map.prototype.set_center_by_ip = function(){
   // @todo use clients'ip
   this.gmap.setCenter(new GLatLng(49.785254242737636, 6.4434814453125), 10);
}

google_map.prototype.set_user_map_center = function(){
   var url="/users/get_user_map_center";
   var d = loadJSONDoc(url);
   var inner_gmap = this.gmap;
   var gotInfos = function(result){
       if (result.center == null || result.zoom == null){
          inner_gmap.setCenter(new GLatLng(49.785254242737636, 6.4434814453125), 10);
       } else {
          inner_gmap.setCenter(new GLatLng(result.center[0],result.center[1]), result.zoom);
       }
   }

   var fetchFailed = function(err){
      inner_gmap.setCenter(new GLatLng(49.785254242737636, 6.4434814453125), 8);
      log(err);
      this.set_center_by_ip();
   }
   d.addCallbacks(gotInfos, fetchFailed);
}

/**
 * Delegate method to the encapsulated map object
 */
google_map.prototype.set_center = function( center ){
   this.gmap.setCenter( center );
}

/**
 * Centers the map on the given point, and puts a marker on that point
 */
google_map.prototype.display_point = function( point, requested_zoom ){

   var zoom;
   if ( requested_zoom == undefined ) {
      zoom = 13;
   } else {
      zoom = requested_zoom;
   }

   this.gmap.setCenter( point, zoom );
   var marker = new GMarker( point );
   this.gmap.addOverlay(marker);

}


