//<![CDATA[
/**
FRAMEWORK GMAP V3 BAPTISTE GAUTHIER
 * @fileOverview Un objet regroupement des fonctions diverses 
 * @name Utils
 */



/*
TODO 


*/


Utils = 
{
	debugMode	: true,
	tabLettre : ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 'P', 'Q','R','S','T','U','V','W','X','Y','Z'],
	
	/**
	 * Fonction de debugage
	 *
	 *
	 * @param {String} mess message d'erreur personnalisé
	  * @param {String} erreur erreur js
	 */
	debug : function(mess,erreur) 
	{
		if (Utils.debugMode) 
		{
			alert("Erreur : "+mess+'   =>    '+erreur);
		}
		
	},
	
	/**
	 * Fonction de message utilisateur
	 *
	 *
	 * @param {String} str
	 */
	trace : function(str) 
	{
		if(window.console && console.log){
			console.log(str);
		}else{
			alert(str);	
		}
	},
	
	/**
	 * Fonction de convetion degrés en radian
	 *
	 *
	 * @param {Integer} angle en degrès
	 * @return {Float} angle en radian
	 */
	
	deg2rad : function(angle) 
	{
		 return (angle/180)*Math.PI;
	},
	
	
	/**
	 * Fonction de calcul d'une distance entre 2 duo de lat, long
	 *
	 *
	 * @param {Float} lat1 latitude du point 1
	  * @param {Float} lng1 longitude du point 1
	  * @param {Float} lat2 latitude du point 2
	  * @param {Float} lng2 longitude du point 2
	  
	 * @return {int} distance en mètre
	 */
	get_distance_m : function(lat1, lng1, lat2, lng2) 
	{
		  var earth_radius = 6378137;   // Terre = sphère de 6378km de rayon
		  var rlo1 = Utils.deg2rad(lng1);
		  var  rla1 = Utils.deg2rad(lat1);
		  var  rlo2 = Utils.deg2rad(lng2);
		  var  rla2 =  Utils.deg2rad(lat2);
		  var  dlo = (rlo2 - rlo1) / 2;
		  var  dla = (rla2 - rla1) / 2;
		  var  a = (Math.sin(dla) * Math.sin(dla)) + Math.cos(rla1) * Math.cos(rla2) * (Math.sin(dlo) * Math.sin(dlo));
		  var  d = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
		  return (earth_radius * d);
	},
	
	/**
	 * Fonction pour verifier la présence d'un element dans un tableau
	 *
	 *
	 * @param {Array} tableau tableau ou est peut etre l'élèment
	  * @param {*} valeur a rechercher
	 * @return {Boolean} si l'element est present
	 */
	in_array : function(tableau, valeur)
	{
		for(var u=0;u<tableau.length;u++)
			if(tableau[u] == valeur) return true;
		
		return false;
	},
	
	/**
	 * Fonction pour verifier la validité d'un mail
	 *
	 *
	 * @param {String} mail email a verifier
	 * @return {Boolean} si le mail est valide 
	 */
	is_mail : function (mail){
		var filter_email=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
		return filter_email.test(mail);
	},
	
	
	/**
	 * Fonction pour enlever les espace en début et fin de chaine de caractère
	 *
	 * @param {String} myString chaine de caractère sur lequel enlever les espaces en début et fin de chaine
	 
	 * @return {String} chaine de caractère nettoyée
	 */
	trim : function(myString)
	{	
		if(typeof(myString) == 'string'){
			return myString.replace(/^\s+/g,'').replace(/\s+$/g,'')
		}
	},
		
	/**
	 * Fonction pour obtenir la coordonnée x d'un element
	 *
	 * @param {id} id de l'element 
	 * @return {Integer} la valeur de la coordonnée x 
	 */
	getX : function(id){
			var x = 0;
			var e = document.getElementById(id);
			while(e){
				x += e.offsetLeft;
				e = e.offsetParent;
			}
			return x;
	},
		
	/**
	 * Fonction pour obtenir la coordonnée y d'un element
	 *
	 * @param {id} id de l'element 
	 
	 * @return {Integer} la valeur de la coordonné y
	 */
	getY : function(id){
			var y = 0;
			var element = document.getElementById(id);
			for(var e = element; e; e = e.offsetParent)
				y += e.offsetTop;
				
			for(e = element.parentNode; e &&e != document.body ; e = e.parentNode)
				if(e.scrollTop) y -= e.scrollTop;
				
			return y;
	},
	
	/**
	 * Fonction de conversion de coordonnée GPS
	 *
	 * @param {int} degre
	 * @param {int} minute
	 * @param {int} seconde
	 * @param {Boolean} isLat si c'est la latitude
	 * @return {Float} la latitude ou la longitude de la coordonnée GPS

	 */
	convertDMS2DDD : function(degre, minute, seconde, isLat) {
			sign = (degre < 0 ? -1 : 1);
			absDeg = Math.abs(degre);
			if (isLat && absDeg > 90) {
				alert('La valeur degré de latitude doit être dans entre -90 et 90');
			} else if (!isLat && absDeg > 180) {
				alert('La valeur degré de longitude doit être dans entre -180 et 180');		
			} else if(0 > minute || minute >= 60) { 
				alert('La valeur minute doit être dans entre 0 et 59');
			} else if(0 > seconde  || seconde  > 60) {
				alert('La valeur seconde doit être dans entre 0 et 60');
			} else {
				 value = (absDeg + (minute/60) + (seconde/3600)) * sign;
				 return Math.round(value * 10000) / 10000;
			}
			return null;
	},
	
	/**
	 * Fonction de conversion de coordonnée GPS
	 *
	 * @param {int} degre
	 * @param {int} minute
	 * @param {Boolean} isLat si c'est la latitude
	 * @return {Float} la latitude ou la longitude de la coordonnée GPS
	 */
	convertDMM2DDD : function(degre, minute, isLat) {
			minute_int = Math.floor(minute);
			seconde = (minute - minute_int) * 100;
		
			sign = (degre < 0 ? -1 : 1);
			absDeg = Math.abs(degre);
			if (isLat && absDeg > 90) {
				alert('La valeur degré de latitude doit être dans entre -90 et 90');
			} else if (!isLat && absDeg > 180) {
				alert('La valeur degré de longitude doit être dans entre -180 et 180');		
			} else if(0 > minute || minute >= 60) { 
				alert('La valeur minute doit être dans entre 0 et 59');
			} else {
			 	value = (absDeg + (minute/60)) * sign;
				return Math.round(value * 10000) / 10000;
			}	
			return null;
	},
	
	/**
	 * Fonction de creation d'objet ajax
	 *
	 * @return {XMLHttpRequest} objet de la requete
	 */
	createXmlHttpRequest : function() {
	 try {
	   if (typeof ActiveXObject != 'undefined') {
		 return new ActiveXObject('Microsoft.XMLHTTP');
	   } else if (window["XMLHttpRequest"]) {
		 return new XMLHttpRequest();
	   }
	 } catch (e) {
	   changeStatus(e);
	 }
	 return null;
	},
	
	
	/**
	 * Appel ajax
	* @param {String} url chemin du script a questionner
	 * @param {Function} callback function retour pour traiter la réponse de l'ajax
	 */
	downloadUrl : function(url, callback) {
	 var status = -1;
	 var request = Utils.createXmlHttpRequest();
	 if (!request) {
	   return false;
	 }
	
	 request.onreadystatechange = function() {
	   if (request.readyState == 4) {
		 try {
		   status = request.status;
		 } catch (e) {
		   // Usually indicates request timed out in FF.
		 }
		 if (status == 200) {
		   callback(request.responseXML, request.status);
		   request.onreadystatechange = function() {};
		 }
	   }
	 }
	 request.open('GET', url, true);
	 try {
	   request.send(null);
	 } catch (e) {
	   changeStatus(e);
	 }
	},
	
	/**
	 * Parsage des données 
	 * @param {string} str XML string.
	 * @return {Element|Document} DOM.
	 */
	xmlParse : function(str) {
	  if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') {
		var doc = new ActiveXObject('Microsoft.XMLDOM');
		doc.loadXML(str);
		return doc;
	  }
	
	  if (typeof DOMParser != 'undefined') {
		return (new DOMParser()).parseFromString(str, 'text/xml');
	  }
	
	  return createElement('div', null);
	},
	
	/**
	 * Ajouter un script dans la page
	 * @param {string} url
	 */
	downloadScript :function(url) {
	  var script = document.createElement('script');
	  script.src = url;
	  document.body.appendChild(script);
	},
	
	/**
	 * Etendre un object
	 * @param {Object} obj1 objet a étendre
	  * @param {Object} obj2 objet qui prend le dessus 
	   * @return {Object} objet étendu
	 */
	extend :function (obj1, obj2){
	  for (property in obj2) {
		obj1[property] = obj2[property];
	  }
	  return obj1;
	},
	
	/**
	 * Obtenir le scroll Y de la page
	   * @return {Integer} la valeur du scroll Y
	 */
	getScrollY : function(){
		 var w = window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft;
		 return w ? w : 0;
	},
	
	/**
	 * Obtenir le scroll X de la page
	   * @return {Integer} la valeur du scroll X
	 */
	getScrollX : function(){
		 var h = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;
		 return h ? h : 0;
	}
	


};

//]]>



