//Constantes
var initLat = 61;
var initLon = -100;
var initZoom = 3; 
var G_MAP_TELE = null;
var downloadBoxOn = false;
var urlWithOverlay = "";

//Méthode lancé au load de la page
function load() {   
 	if (GBrowserIsCompatible()){
 		//Initialiser la carte
 		window.initMap();
 		
    	//Enlever la touche "enter" sur champs text du formulaire
    	document.onkeypress = stopRKey;
    	//Lancer la première recherche
    	window.search();
    }
}

function initMap(){
	//Obtention de l'instance de carte
    window.map = new GMap2(document.getElementById("map"));
 	
    //Center la carte en utilisant les paramêtre par défaut si aucune valeur passe en paramètre
    if(window.paramLatmin != "" && window.paramLatmax != "" &&  window.paramLngmin != "" && window.paramLngmax){
    	var bnds = new GLatLngBounds(new GLatLng(window.paramLatmin,window.paramLngmin),
    								 new GLatLng(window.paramLatmax,window.paramLngmax))
    	var zoom = window.map.getBoundsZoomLevel(bnds);
    	var centerLat = paramLatmax - ((paramLatmax - paramLatmin)/2);
    	var centerLng = paramLngmax - ((paramLngmax - paramLngmin)/2);
    	window.map.setCenter(new GLatLng(centerLat, centerLng), zoom); 
    
    }else
    	window.map.setCenter(new GLatLng(initLat, initLon), initZoom); 
	window.map.setMapType(G_SATELLITE_MAP);
    //Ajout des controles
    window.map.addControl(new GSmallZoomControl3D());
    //Permettre le zoom avec la molette de la souris
    window.map.enableScrollWheelZoom();
    //Permettre le zoom avec le double click
    window.map.enableDoubleClickZoom();
    
     //Permetre le focus automatique sur la carte
   	function wheelevent(e){
   		if (!e) e = window.event;
   			if (e.preventDefault) e.preventDefault();
   				e.returnValue = false;
	}
	GEvent.addDomListener(document.getElementById("map"), "DOMMouseScroll", wheelevent);
	document.getElementById("map").onmousewheel = wheelevent;
}

/**Fonction qui lance une recherche **/
function search(){
	if(window.validateParameter()){
		//Obtention de l'url du produit
		var url = window.getLayerURL();
		if(url != "")//Lancement du l'ajout du layer de la carte google
			updateMap(url);
		else
			window.showError((window.lg=="fr"?"Le produit demandé n'est pas disponible":"The requested product is unavailable"));
	}
	window.updateTitle();  //Mise à jour du titre
	return(true);
}

/**Méthode qui applique un layer à la carte google selon l'url **/
function updateMap(url){
	window.showLoadingIcon(true);
	//Création du layer
	var tele = window.createWMSSpec(url, "Teledetection", "tele");
	window.G_MAP_TELE = window.createWMSOverlaySpec(G_SATELLITE_MAP, tele, "Tele", "Tele");
	//Modification du layer
	map.setMapType(window.G_MAP_TELE);
	//Afficher le lien de téléchargement
	Element.show("downloadLink");
	//Supprimer l'icone de chargement
	window.showLoadingIcon(false);
	//Mettre à jour la palette de couleur
	window.updateColorPalette();
	return;	
}


//Obtention de la liste de paramêtre sous forme de requete http	
function getLayerURL(){
	
	var url = "";
	//Obtention d'une liste d'un objet httprequest
 	var request = this.getHttpRequest();
 	if(request == null){
 		alert("Désolé, Votre navigateur ne supporte pas AJAX / Sorry, your browser don't support AJAX");
 		return;
 	}else{
 		//Envoi d'une requete au serveur afin d'obtenir l'url du produit
 		request.open("GET",window.getParameterURL(),false);
 		request.send(null);
			//Obtention du XML
			var xmlDoc=request.responseXML.documentElement;
			//Vérification de la présence d'erreurs
		if(xmlDoc.getElementsByTagName("ServiceException").length > 0){
			window.showError(xmlDoc.getElementsByTagName("ServiceException")[0].firstChild.nodeValue);
		}else if(xmlDoc.getElementsByTagName("url").length > 0){
			//Obtention de l'url du produit
			url = xmlDoc.getElementsByTagName("url")[0].firstChild.nodeValue;
			
			//Conservation des dates du produit suivant et précédant
			var date = "";
			if(xmlDoc.getElementsByTagName("previous")[0].hasChildNodes())
				date = xmlDoc.getElementsByTagName("previous")[0].firstChild.nodeValue;
			window.updatePreviousDate(date);
			
			date = "";
			if(xmlDoc.getElementsByTagName("next")[0].hasChildNodes())
				date = xmlDoc.getElementsByTagName("next")[0].firstChild.nodeValue;
			window.updateNextDate(date);
			
			//Conservation de l'url des produit téléchargeable
			if(xmlDoc.getElementsByTagName("prodURLOverlay")[0].hasChildNodes())
				window.urlWithOverlay = xmlDoc.getElementsByTagName("prodURLOverlay")[0].firstChild.nodeValue;
		}
	 }
	return(url);	 
	
}


/** Methode qui affiche la palette selon le type de donnée selectionne**/
function updateColorPalette(){
	var selectedFam = document.forms[0].selFam.value;
	document.getElementById("palette").src = "images/"+selectedFam+".png";
	return;
}

/**Méthode qui affiche le produit de la date précédante **/
function searchPreviousProduct(){
	new Effect.Pulsate("imgPrevious");
	//Modifier le champs date si possible
	if(document.forms[0].txtPrevDate.value != ""){
		document.forms[0].txtDate.value = document.forms[0].txtPrevDate.value;
		//Mettre à jour la liste de produits sans modifications aux liens
		window.updateList('window');
		window.search();
	}
	return;
}

/**Méthode qui affiche le produit de la date suivante **/
function searchNextProduct(){
	new Effect.Pulsate("imgNext");
	//Modifier le champs date si possible
	if(document.forms[0].txtNextDate.value != ""){
		document.forms[0].txtDate.value = document.forms[0].txtNextDate.value;
		//Mettre à jour la liste de produits sans modifications aux liens
		window.updateList('window');
		window.search();
		
	}
	return;
}

var currentFam = "";
var currentPer = "";
var currentWin = "";

/**Méthode qui obtiens tous les paramêtres de la page **/
function getParameterURL(){
	//Obtention des parametres
	currentFam = document.forms[0].selFam.value;
	currentPer = document.forms[0].txtDate.value;
	currentWin = document.forms[0].selWindow.value
	
	var url = "query?lg="+window.lg
	url += "&class=" + document.forms[0].selClass.value;
	url += "&family=" + currentFam;
	url += "&var=mean";
	url += "&period=" + currentPer;
	url += "&window=" + currentWin;
	url += "&bbox=" + this.getGmapBbox();

	return(url);
}

/**Fonction qui retourne les extremums (lat/lon) que couvre présentement la carte google
 **
 ** format: (lonmin, latmin, lonmax, latmax)	
 **/
function getGmapBbox(){
	var gmapbbox = "";
	var bounds = map.getBounds();
	var lngmin = bounds.getSouthWest().lng();
	var lngmax = bounds.getNorthEast().lng();
	
	//Vérification qui valide qu'aucun saut d'émisphère au niveau du méridien 
	//à opposé Greenwich (saut de l'émisphère est à ouest) soit interdit. Cette procédure ne 
	//fonctionne pas pour le moment du côté de la source de donnée 
	if(lngmin > lngmax)
		lngmin = -180;
		
	gmapbbox += lngmin;
	gmapbbox += ","+bounds.getSouthWest().lat();
	gmapbbox += ","+ lngmax;
	gmapbbox += ","+bounds.getNorthEast().lat();
	return(gmapbbox);	
}

/**Méthode qui valide tous les paramêtres de la page **/
function validateParameter(){
	var valid = true;
	if(document.forms[0].selClass.value == "empty" ||
	   document.forms[0].selFam.value == "empty" ||
		document.forms[0].txtDate.value == "empty" ||
		document.forms[0].selWindow.value == "empty")
		valid = false;
	return(valid);	
}

/**Méthode qui affiche une erreur dont le message est passé en paramètres **/
function showError(message){
	//Masquer les icones
	document.forms[0].selWindow.disabled = true;
	Element.hide('imgRefresh');
	Element.hide('downloadLink');
	window.hideNavigationLinks();
	document.getElementById("errorMessage").innerHTML = message;
	Element.show("errorBox");
	return(false);
}

/**Méthode supprime un message d'erreur existant **/
function hideError(){
	//Afficher l'icone de raffraichissement
	document.forms[0].selWindow.disabled = false;
	Element.show('imgRefresh');
	Element.hide("errorBox");
	return;
} 

/**Méthode supprime les bouton de navigation suivant et précédant **/
function hideNavigationLinks(){
	Element.hide('imgPrevious');
	Element.hide('imgNext');
	return;
}

/**Téléchargement de la couche avec le masque de terre**/
function downloadWithOverlay(){
	if(urlWithOverlay != ""){
		//Suppression du boundingbox original
		var ibbox = urlWithOverlay.indexOf("%26bbox",0);
		var fbbox = urlWithOverlay.indexOf("%26", ibbox+1);
		var url = urlWithOverlay.substring(0, ibbox) + urlWithOverlay.substring(fbbox);
		
		//Lancer le changment de page
		window.open(url+'%26bbox%3D'+this.getGmapBbox());
	}
	return;
}

/**Methode qui lance l'acces au mode avance en conservant les parametres
	deja etablis par l'utilisateur**/
function gotoAdvancedMode(){
	document.location.href = "extract.jsp?lg="+lg+"&family="+document.forms[0].selFam.value+
							  "&date="+document.forms[0].txtDate.value+
							  "&window="+document.forms[0].selWindow.value+
							  "&projection=epsg:3395"+
							  "&bbox="+this.getGmapBbox();
	return(false);
}


/**Méthode empeche le lancement du formulaire en appuyant sur ENTER **/
function stopRKey(evt) {
	 var evt = (evt) ? evt : ((event) ? event : null);
	 var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
	 if ((evt.keyCode == 13) && (node.type=="text")) {
	 	return false;
	 }
}

function showLoadingIcon(show){
	if(show)
		Element.show("loading");
	else
		Element.hide("loading");
	return(false);
}


