	var mapform;
	var swapgeolabels = true;
	var hasMoved = 0;
	var debugMode = false  ; 
	var currentMap = "" ; 
	var objTPManagers = new Array() ;  

	//all load time initialising
    function load() 
    {
    	showHideInFoSection("infoWelcome");
    	swapPeaceBanner();
    	//init draggable menu
    	new Draggable('menuWrapper');
    	new Draggable('loaderInfo');
    	if(debugMode) {new Draggable('debugWindow'); new Draggable('debugMenu'); $('debugMenu').show();}
    	
    	//TODO : charger les Layers map après la gmap. 
      	//Initialise Gmap 
      	mapInit();
		//showLayer();
		showLayerOptimise();
		 	
		Effect.BlindUp('loaderInfo');
    }
	
//***************************************************************
//			MAP UTILS
//***************************************************************

	//Initialise Gmap 
	function mapInit(){
		if (GBrowserIsCompatible()) {
		
        mapform = new GMap2(document.getElementById('map',{mapTypes : [G_SATELLITE_MAP,G_NORMAL_MAP]}));
        mapform.setCenter(new GLatLng(0,0),3);
		mapform.addControl(new GSmallMapControl());
		mapform.addControl(new GMapTypeControl());
		mapform.addControl(new GOverviewMapControl ());
		mapform.addControl(new GScaleControl());
		initGZoom(mapform);

		objTPManagers["pmpmap"] = new TPhotoManager(mapform);
		
		//initMapLayers(mapform);
		mapform.setMapType(mapform.getMapTypes()[3]);
		initMapEvent(mapform);	
		
		//init geocoder
		geocoder = new GClientGeocoder();	
      }
	}
	
	function initGZoom(mapform){
		mapform.addControl(new GZoomControl(
			/* first set of options is for the visual overlay.*/
			{
				nOpacity:.2,
				sBorder:"2px solid red"
			},
			/* second set of optionis is for everything else */
			{
				sButtonHTML:"<img src='"+cpath+"/modules/"+moduleName+"/gfx/zoom-button.gif' />",
				sButtonZoomingHTML:"<img src='"+cpath+"/modules/"+moduleName+"/gfx/zoom-button-activated.gif' />",
				oButtonStartingStyle:{width:'24px',height:'24px'}
			},
			/* third set of options specifies callbacks */
			{
				dragEnd:function(nw,ne,se,sw,nwpx,nepx,sepx,swpx,w,h){
					formData.lat = ne.lat();
					formData.long = sw.lng();
					formData.maxlat = sw.lat();
					formData.maxlong = ne.lng();
					formData.width = w;
					formData.height = h;
					//alert(formData.width+" / "+formData.height);
					gettileInfo(true);
					}
			}
		));
	}
	
	var tno = new Object();
	var tse = new Object();
	
	function gettileInfo(init){
		tno = getTilePadding(formData.long , formData.lat , mapform.getZoom());
		tse = getTilePadding(formData.maxlong , formData.maxlat , mapform.getZoom());
		if(!init){
			if(formData.zoom < mapform.getZoom()){
			formData.width*=2;
			formData.height*=2;
			}else{
			formData.width/=2;
			formData.height/=2;
			}
		}
		//alert(formData.width+" / "+formData.height);
		formData.zoom = mapform.getZoom();
		tse.x = 256-tse.x;
		tse.y = 256-tse.y;
		//$("infoSection").innerHTML= "NW="+tno.tileX+"/"+tno.tileY+";SE="+tse.tileX+"/"+tse.tileY+";ZOOM="+tno.z;
	}
	/**
	 * This function returns the top left offset from the enclosing tile.
	*/
	function getTileName(lon, lat, zoom) 
	{
	    var globalCoords = getGlobalBitmapCoordsForZoom(lon, lat, zoom);
	    var x = globalCoords.x;
	    var y = globalCoords.y;
		
		
		var tileX = (globalCoords.x >> 8);//-1;
      	var tileY = (256 << (zoom))- globalCoords.y;
      	tileY = (tileY >> 8);//-2;

	    var rv = new Object();
	    rv.x = x % 256;
	    rv.y = (256 - (y % 256)) % 256; // extra mod because 256-0 becomes 256
	    rv.tileX = tileX;
	    rv.tileY = tileY;
	    return rv;
	
	} 
	/** this function returns an object with x = XbitmapCoord y =YbitmapCoord
	 * based with 0,0 = bottom left
	 * and 1 << 18-zoom being the top left
	*/
	function getGlobalBitmapCoordsForZoom(lon, lat, zoom) 
	{
	      if (lon > 180) 
	         lon -= 360;
	      lon /= 180;
	      lat = Math.log(Math.tan((Math.PI / 4) + ((0.5 * Math.PI * lat) /180))) / Math.PI;
	      var pixelsAroundWorld = 256 << zoom;
	      var x = ((lon+1)/2) * pixelsAroundWorld;
	      var y = ((lat+1)/2) * pixelsAroundWorld;
	      
	      var rv = new Object();
	      rv.x = x;
	      rv.y = y;
	      return rv;
	}
	
	/**
	 * This function returns the top left offset from the enclosing tile.
	*/
	function getTilePadding(lon, lat, zoom) 
	{
	    var globalCoords = getGlobalBitmapCoordsForZoom(lon, lat, zoom);
	    var x = globalCoords.x;
	    var y = globalCoords.y;
		
		var tileX = (globalCoords.x >> 8);//-1;
      	var tileY = (256 << (zoom))- globalCoords.y;
      	tileY = (tileY >> 8);//-2;

	    var rv = new Object();
	    rv.x = x % 256;
	    rv.y = (256 - (y % 256)) % 256; // extra mod because 256-0 becomes 256
	    rv.tileX = tileX;
	    rv.tileY = tileY;
	    //alert(rv.x+" / "+rv.y+" ::: "+rv.tileX+" / "+rv.tileY);
	    return rv;
	} 
	
	/*function initMapLayers(mapform){
		//On Tile Editing only non geo information can be updated 
		//Tile Naming layer to be shown only on First Tile Integration
		var osmlicense = "<a href='http://www.openstreetmap.com' target='_blank'>License</a>";
	    var osmcopyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, osmlicense);
	    var osmcopyrightCollection = new GCopyrightCollection("OpenStreetsMap: ");
	    osmcopyrightCollection.addCopyright(osmcopyright);
		
		var osm = [new GTileLayer(osmcopyrightCollection, 0, 15)];
    	osm[0].getTileUrl = function(a,b) {
      		//openstreetmap 
      		return "http://tile.openstreetmap.org/" + b + "/" + a.x + "/" + a.y + ".png"; 
      		};
       //osm[1] = G_HYBRID_MAP.getTileLayers()[1];
       
		var peaceMapProject = new GMapType(osm, G_SATELLITE_MAP.getProjection(), 'PMP', {minResolution:0, maxResolution:10});
		mapform.addMapType(peaceMapProject);
		
		adminLayer = new GTileLayerOverlay(getLayerbyType("admin","gif"));
       	mapform.addOverlay(adminLayer);
	}
	
	// admin, relief/jpg, water,streets,forest,tundra,swamp,grass,crop,sand,ice,country/png
    function getLayerbyType(type,ext) {
    	var license = "<a href='http://www.maps-for-free.com/html/about.html' target='_blank'>License</a>";
	    var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, license);
	    var copyrightCollection = new GCopyrightCollection("Relief Maps: ");
	    copyrightCollection.addCopyright(copyright);
	    
      var layer = new GTileLayer(copyrightCollection, 0, 12);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/"+type+"/z" +b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + "."+ext;
      };            
      return layer;
    }    */
	
	// Initialise Gmap events.
	function initMapEvent(map){
		map.enableDoubleClickZoom();
	    map.enableContinuousZoom();
	    map.enableScrollWheelZoom();
	    GEvent.addListener(map, "zoomend", function (){gettileInfo();	});
	}
	
	//  Geocoder function 
    function showAddress(address) {
    	formData.loc = address ;
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              //alert(address + " not found");
            } else {
              mapform.setCenter(point, 5);
              var marker = new GMarker(point);
              mapform.addOverlay(marker);
            }
          }
        );
      }
     }
    
	var LTPObj = new Object();

	/****
	 * This fonction get layers 10 by 10. 
	 * A firt packet of 10 images is recovered, then when all images are loaded, 
	 * another packet is recovered. 
	 */ 
	function showLayerOptimise(type) 
	{
		//LTPObj = new Object();
		LTPObj.tpL=new Array() ; 
		LTPObj.swL=new Array();
		LTPObj.mkrL=new Array();
		LTPObj.cpt = 0 ;
	
		// Hide current map.
		if(currentMap != ""){
			mapform.clearOverlays() ; 
			objTPManagers[currentMap].remove() ; 			
		}
		
		type = ( type != null && type != "" ) ? type : "pmpmap" ;
		currentMap = type ; 	

		if( objTPManagers[type] == null ){
			objTPManagers[type] = new TPhotoManager(mapform);
		}

		var startPoint = 0 ; 	
		var tranche = 10 ; 
			
		// When all images are loaded, another call.
		objTPManagers[type].imagesLoaded  = function (){
			if( LTPObj.cpt!= 0) {
				startPoint += tranche ;
				LTPObj.tpL=new Array() ; 
				LTPObj.swL=new Array();
				LTPObj.mkrL=new Array();						
				LTPObj.cpt = 0 ;
				ajaxGetLayers(type, startPoint, tranche) ; 
				
			}
		};
		//  First call
		ajaxGetLayers( type, startPoint, tranche) ; 
	}

	// Get images informations by ajax call. 
	function ajaxGetLayers( type, startPoint, tranche)
	{
		param = "?type="+type+'&limitStart='+startPoint+'&limitEnd='+(startPoint+tranche) ;
	
		LTPObj.cpt = 0 ; 
		new Ajax.Request(cpath+'modules/'+moduleName+'/scripts/getLayerTphotosObj.php'+param, 
			{	method:'get',
				asynchronous:true,
		  		onSuccess: function(requestObj){	
					var str = requestObj.responseText ;
					str.evalScripts() ;
					if( LTPObj.cpt != 0 ) { contructManager();} 
	    		},
	    		onFailure: function(requestObj){
	    			alert('an error occured.') ; 
	    		}
			});
	}
	
	//  Construct the TPhotoManager from LTPObj informations. 
	function contructManager()
	{		
		if( objTPManagers[LTPObj.type] == null ){
			objTPManagers[LTPObj.type] = new TPhotoManager(mapform);
		}			
		var icon = new GIcon(G_DEFAULT_ICON, cpath+'gfx/icons/swapper.gif');
		icon.iconSize = new GSize(40,40);
		icon.imageMap = [5,5, 5,35, 35,35, 35,5, 5,5];	
		 
		objTPManagers[LTPObj.type].imgsTobeLoad += LTPObj.tpL.length ; 		
		// parcourt de la liste de TPhoto
		LTPObj.tpL.each( function(aTphoto){
			objTPManagers[LTPObj.type].addTPhoto(aTphoto[0],cpath+LTPObj.imgPath+aTphoto[1], aTphoto[2], aTphoto[3], aTphoto[4], aTphoto[5], aTphoto[6], aTphoto[7], aTphoto[8]);
		});	 
		 
		// parcourt de la liste de swapimg
		LTPObj.swL.each( function(aSwapimg){
			objTPManagers[LTPObj.type].addSwapList(aSwapimg[0],cpath+LTPObj.imgPath+aSwapimg[1]);
		});	 

		// parcourt de la liste de marker
		LTPObj.mkrL.each( function(aMarker){
			var scMarker = new GMarker( new GLatLng(aMarker[1], aMarker[2]), icon);
			mapform.addOverlay(scMarker);
			GEvent.addListener(scMarker,'click', function() {
				objTPManagers[LTPObj.type].swapImg(aMarker[0], this) ;
			});	
		});	
	}