/*
constantes
*/
var MAP_FRAME_ID='mapFrame';
var MAP_ID='mapID';
var LAT_ID='lat';
var LONG_ID='long';
var POINT_ID='divPoint';
var MASSIF_ID='massifId';
var DEPARTEMENT_ID='departementId';
var STATION_ID='stationId';
var ZOOM_ID='zoom';
var DIV_TRACE ='divtrace';
var MAP_LOADING='mapLoading';

var CSS_VISIBLE='visible';
var CSS_MASQUE='masque';

var ITEM_PAYS='Pays';
var ITEM_MASSIF='Massif';
var ITEM_STATION='Station';

//log : true-false
//var LOG_ENABLED=true;
var LOG_ENABLED=false;

//niveau de zoom par defaut
var ZOOM_LEVEL_EUROPE=6;



var LOG_ON=true;

var NL='\n';
var BR='<br/>';
var LISTE_VIDE='';


//pour transformer objet json et select-option
var TEMPLATE_LISTE_PAYS='<li><a href="javascript:goPoint(#{id})">#{label}</a></li>';

//pour transformer objet json et html affiche sur click punaise
var TEMPLATE_HTML_PUNAISE_PAYS='<h1>#{label}</h1>';




/*
variables
*/
var map=null;/*la map*/
var markerMgr=null;/*markerManager*/

var mapFrame=null;
var divTrace=null;

//listes
var tabPoints=null;




function bodyOnUnLoad(){
	traceMess("bodyOnUnLoad");
	GUnload();
}

function traceMess(mess)
{
	if (LOG_ENABLED)
	{
		affiche(divTrace);
		divTrace.update(mess+BR+divTrace.innerHTML);
	}
}

    

/* 
appel au chargement de la page
 */
function initMap() {
	//init des div
	mapFrame=$(MAP_FRAME_ID);
	divTrace=$(DIV_TRACE);
	
	affiche(mapFrame);
	if (LOG_ON)
	{
		affiche(divTrace);
	}
	
	//log
	traceMess('initMap');
	
	//creation de la carte
	map = new 	google.maps.Map2(mapFrame);
	
	//choix de carte
	map.addControl(new google.maps.MapTypeControl());
	map.addControl(new google.maps.LargeMapControl());	


	//feed back position
	google.maps.Event.addListener(map, "move", function() 
		{
  			majPosition();
		}
	);

	//	affichage de base : san pedro
	
	centerMap(-22.88948,-68.13573,ZOOM_LEVEL_EUROPE);
	
	//marker manager
	markerMgr=new GMarkerManager(map);
	
	GEvent.addListener(map, 'zoomend', function(){
		var infoWindow=map.getInfoWindow();
		infoWindow.hide();
	}
	
	)
	
	/*
	chargement des listes
	*/
	initListePoint();
} 

function centreCarteEtZoom(objPoint)
{
	if (!objPoint)
	{
		if ($(ZOOM_ID).value>0)
		{
			//pas d'objet a afficher : cas joker = zoomup
			$(ZOOM_ID).value=$(ZOOM_ID).value-1;
		}
		
		
	}
	else
	{
		traceMess('centre la carte sur '+objPoint.label+' lat:'+ objPoint.lat + ' long:'+ objPoint.long );
	
		$(LAT_ID).value=objPoint.lat;
		$(LONG_ID).value=objPoint.long;
		$(ZOOM_ID).value=objPoint.zoom;
		
	}
	
	  	
  	getPosition();
}

function getPosition()
{
	centerMap($F(LAT_ID),$F(LONG_ID),$F(ZOOM_ID));
		
}


function initListePoint()
{
	traceMess('initListePays');
	//protection cache navigateur
	var uniq=Math.random();
	
	//parametres de requete
	var ajaxParams=	{ method : 'get',
		             parameters : {'uniq':uniq,'dataType':'listePays'},
		             onSuccess: function(transport){
						  	traceMess('initListePays - onSuccess');
						  	/*
						  	retour code 2XX ok
						  	*/
						    
						    //parse du flux retourne
						    var ret = transport.responseText.evalJSON(true);
						    
						    //maj liste des pays
						    tabPoints=ret.tabPoint;
						    
						    tabPoints.masqueSelect=TEMPLATE_LISTE_PAYS;
						    
						    tabPoints.zoomLevel=13;
						    tabPoints.minZoomLevel=0;
						    tabPoints.maxZoomLevel=15;
						    
							tabPoints.masqueHtmlPunaise=TEMPLATE_HTML_PUNAISE_PAYS;	
													    
						    //ajout punaises et maj liste deroulante
						    transformeTableauResultat(tabPoints,$(POINT_ID));
						   
							
					},/*onSuccess*/
		            asynchronous : true /*optionnel mais bon...*/ };
		
	var req = new Ajax.Request('altiplano.php', ajaxParams);
	
}


function ajoutePunaise(curent)
{

	//ajout de la punaise du pays
	var point = new GLatLng(curent.lat,curent.long);
	

	//todo logo et lettre associe au marker
	
	var marker = new GMarker(point);
	
	//action liee
	var templateHtml= new Template(curent.masqueHtmlPunaise);
	var htmlPunaise=templateHtml.evaluate(curent);


	GEvent.addListener(marker, "click", 
		function(){
		map.openInfoWindowHtml(point, htmlPunaise);
			}
	);
	
	traceMess("ajoute marker:"+ curent.label +" min zoom:" +curent.minZoomLevel+" max zoom:"+curent.maxZoomLevel );   
	
	//ajout marker selon plage de zoom	
	markerMgr.addMarker(marker,curent.minZoomLevel,curent.maxZoomLevel);
//	markerMgr.addMarker(marker);
	
	//affichage
	markerMgr.refresh();
	
}

/*
transforme tableau de resultat 

split des coordonnées en lat et long
ajout du niveau de zoom
maj liste deroulante si not null
*/
function transformeTableauResultat(tabItem, objSelect)
{
	traceMess('transformeTableauResultat');
		//niveau de zoom pour ce tableau
		var zoomLevel=tabItem.zoomLevel; 
		var minZoomLevel=tabItem.minZoomLevel; 
		var maxZoomLevel=tabItem.maxZoomLevel; 
		
		//html ou js
		var actionOnClick=tabItem.actionOnClick;
	    
	    //masque pour la popup sur punaise
	    var masqueHtmlPunaise=tabItem.masqueHtmlPunaise; 
	    
	    //recup de masque pour construire les selects
	    var templateSelect= new Template(tabItem.masqueSelect);

	    //joker
	    var op=LISTE_VIDE;
		
		
	    tabItem.each( function(curent,index){
	    	//id = position
		    curent.id=index;
		    
		    //plage d'affichage
		    curent.minZoomLevel=minZoomLevel;
		    curent.maxZoomLevel=maxZoomLevel;
		    
		    //action sur click
   			curent.masqueHtmlPunaise=masqueHtmlPunaise;
			
			//construction select			
			op = op +   templateSelect.evaluate(curent);
			
			//decode latitude-longitude
			transformeCoordonnes(curent,zoomLevel);
			
			//ajout marker + action liee
		 	ajoutePunaise(curent);
						
		});
		
		//maj de la liste déroulante
		objSelect.update(op);
							
}

function transformeCoordonnes(curent, zoomLevel)
{
   	//decoupe le tag <coordinates>- 4.921875,45.65244828675087</coordinates>
	//en latitude et longitude
    //- 4.921875 -> longitude
    //45.65244828675087 -> latitude
    //regexp
	curent.cords.sub(/([-]?\s?\d+\.?\d+),([-]?\s?\d+\.?\d+)/, function(match){
		/*
		(\d+\.?\d+) 1
		*/
		curent.lat=match[2]; 
		/*
		(\d+\.?\d+) 2
		*/
		curent.long=match[1];
		});	
	
	//niveau de zoom par defaut	
	curent.zoom=zoomLevel;
		
	return true;								
}


/*
tabItem : le tableau a rechercher : pays,massif,station
itemId : la cle = position
*/
function getItem(tabItem,itemId)
	{
		traceMess('getItem id:'+itemId);
		var ret=null;
		
		
		if (tabItem==null)
		{
			return null;
		}
		
		tabItem.each( function(curent,index)
			{
			    if(index==itemId)
				{
				    	ret=curent;
				    	traceMess('getItem - lat:'+ curent.lat + ' long:'+ curent.long );
				}
			});
			
		return ret;
}

/*
 retrouve l'objet pays
 id = index dans le tableau
 */
	
function getPoint(id){
	return getItem(tabPoints,id);
}

function goPoint(index)
{
	var pays=getPoint(index);
	centreCarteEtZoom(pays);
}
	


/*
positionne la map sur point et niveau de zoom
*/
function centerMap(lat,long,zoom)
{
	traceMess('in - latitude:'+lat+' longitude:'+long+' zoom:'+zoom);
	var point=new GLatLng(lat,long,zoom);
	map.setCenter(point);
	map.setZoom(parseInt(zoom));

	traceMess('out - latitude:'+map.getCenter().lat()+' longitude:'+map.getCenter().lng()+' zoom:'+map.getZoom());
}

/*
feed back position courante
*/
function majPosition()
{
	$(LAT_ID).value=map.getCenter().lat();
	$(LONG_ID).value=map.getCenter().lng();
	$(ZOOM_ID).value=map.getZoom();

}	

function affiche(obj)
{
	//affiche un objet
	$(obj).addClassName(CSS_VISIBLE);
	$(obj).removeClassName(CSS_MASQUE);
}
 
function masque(obj)
{
	//masque un objet
	$(obj).addClassName(CSS_MASQUE);
	$(obj).removeClassName(CSS_VISIBLE);
}
    
  
