/**
 * Librairie javascript Tool
 *
 * @package       lesite
 * @subpackage    js
 * @author        David Desbouis
 * @author        $Author: kris $
 * @version       $Revision: 41297 $
 * @date          $Date: 2009-07-06 13:01:06 +0200 (Mon, 06 Jul 2009) $
 * @id            $Id: tool.js 41297 2009-07-06 11:01:06Z kris $
 */
if (undefined===window.MIA)
{
   var MIA = {};
}
MIA.Tool =
{
   class_name : "Tool",

   /**
    * Fonction qui initialise un throbber.
    *
    * @author     David Desbouis
    * @param      string          throbber_elt_id : id de l'élément qui accueille le throbber
    * @param      string          elt_id_to_show : id de l'élément que l'on veut montrer (optionnel)
    * @return     bool            true si tout va bien, false sinon
    * @access     public
    */
   initialiserThrobber : function(throbber_elt_id, elt_id_to_show,display_style)
   {
      if (!display_style)
      {
         display_style = 'inline';
      }
      document.getElementById(throbber_elt_id).innerHTML = "";
      document.getElementById(throbber_elt_id).style.display = "none";
      if (elt_id_to_show != "")
      {
         document.getElementById(elt_id_to_show).style.display = display_style;
      }
   },


   /**
    * Fonction qui affiche un throbber.
    *
    * @author     David Desbouis
    * @param      string          throbber_elt_id : id de l'élément qui accueille le throbber
    * @param      string          throbber_text : texte à placer dans l'élément qui accueille le throbber
    * @param      string          elt_id_to_hide : id de l'élément que l'on veut cacher (optionnel)
    * @return     bool            true si tout va bien, false sinon
    * @access     public
    */
   afficherThrobber : function(throbber_elt_id, throbber_text, elt_id_to_hide)
   {
      if (elt_id_to_hide != "")
      {
         document.getElementById(elt_id_to_hide).style.display = "none";
      }
      document.getElementById(throbber_elt_id).innerHTML = throbber_text;
      document.getElementById(throbber_elt_id).style.display = "inline";
   },


   /**
    * Fonction qui supprime les espaces en début ou en fin de chaine
    *
    * @author     David Desbouis
    * @param      string          chaine
    * @return     string          chaine
    * @access     public
    */
   trim : function(chaine)
   {
      // espaces au debut
      while (chaine.substring(0,1) == ' ')
      {
         chaine = chaine.substring(1, chaine.length);
      }

      // espaces a la fin
      while (chaine.substring(chaine.length-1,chaine.length) == ' ')
      {
         chaine = chaine.substring(0, chaine.length-1);
      }
      return chaine;
   },


   /**
    * Fonction qui calcul l'age d'une personne à partir de sa date de naissance
    *
    * @author     Kris
    * @param      string   date  la date de naissance
    * @access     public
    */
   calculAge : function( date )
   {
      var date_jour = new Date()
      annee = date.substring(0, 4);
      mois = date.substring(5, 7);
      jour = date.substring(8, 10);
      var date_naissance = new Date(annee, mois - 1, jour);  // janvier -> 0 ... décembre -> 11 (-1 par rapport au vrai mois)

      var age = date_jour.getFullYear() - date_naissance.getFullYear();

      if( (date_naissance.getMonth() > date_jour.getMonth()) || (date_naissance.getMonth() == date_jour.getMonth() && date_naissance.getDate() > date_jour.getDate()) )
      {
         age --;
      }

      return(age);
   },


   /**
    * Fonction qui décode une chaine.
    *
    * @author    Kris
    * @param      string	utftext		la chaine à décoder
    * access      public
    */
   utf8_decode : function( utftext )
   {
      var string = "";
      var i = 0;
      var c = c1 = c2 = 0;

      while ( i < utftext.length ) {
         c = utftext.charCodeAt(i);

         if (c < 128) {
         	string += String.fromCharCode(c);
         	i++;
         }
         else if((c > 191) && (c < 224)) {
         	c2 = utftext.charCodeAt(i+1);
         	string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
         	i += 2;
         }
         else {
         	c2 = utftext.charCodeAt(i+1);
         	c3 = utftext.charCodeAt(i+2);
         	string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
         	i += 3;
         }
      }
      return string;
   },
   
   
   utf8_encode : function (string)
   {
      string = string.replace(/\r\n/g,"\n");
      var utftext = "";
 
      for (var n = 0; n < string.length; n++)
      {
         var c = string.charCodeAt(n);
 
         if (c < 128)
         {
            utftext += String.fromCharCode(c);
         }
         else if((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
         }
         else
         {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
         }
      }
      return utftext;
   },


   /**
    * Fonction qui reinitialise la valeur d'un champ.
    *
    * @author     David Desbouis
    * @param      dom      élément dom
    * access      public
    */
   clearDefault : function(el)
   {
      if (el.defaultValue==el.value)
      {
         el.value = "";
      }
   },


   addBookmark : function ()
   {
      var agent = navigator.userAgent.toLowerCase();
      var is_ie = (agent.indexOf("msie") != -1);
      var titre = "LePost : A la Une";
      var url   = "http://www.lepost.fr/";
      if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function"))
      {
         window.sidebar.addPanel(titre, url, "");
      }
      else if (is_ie)
      {
         window.external.AddFavorite(url, titre);
      }
      else
      {
         alert(MIA.Tool.utf8_decode("Pour ajouter '"+titre+"' à vos favoris, utilisez <CTRL>+D."));
      }
      return true;
   },

   addHomepage : function (e, obj)
   {
      var elt = obj.dom_element;
      if (document.all && document.getElementById)
      {
         elt.style.behavior='url(#default#homepage)';
         elt.setHomePage('http://www.lepost.fr/');
      }
      else
      {
         alert(MIA.Tool.utf8_decode("Pour mettre LePost.fr en page d'accueil, rendez-vous dans les options/préférences de votre navigateur."));
      }
   },


   /**
    * Fonction qui permet de retourver la liste des éléments DOM en fonction d'un nom de balise et de la valeur de l'attribut 'name'.
    * Pour scanner tout le document, il suffit de mettre '*' dans l'argument 'tag_name'.
    *
    * IMPORTANT :
    * Cette fonction est à utiliser en lieu et place de la méthode native document.getElementsByName() qui ne fonctionne pas
    * sous IE avec les balises dont l'attribut 'name' n'est pas un attribut "valable".
    *
    * @author     David Desbouis
    * @param      string   tag_name    nom du tag qui possède l'attribut recherché
    * @param      string   attr_value  valeur de l'attribut recherché
    * access      public
    */
   getElementsByName : function (tag_name, name_value, rootElement)
   {
      // tableau des éléments à retourner
      var tab_elts = new Array();

      if (!rootElement || !rootElement.getElementsByTagName)
      {
         rootElement = document;
      }

      var elts_with_tag_name = rootElement.getElementsByTagName(tag_name);
      var val = "";
      for(var i=0, n=0; i < elts_with_tag_name.length; i++)
      {
         if (elts_with_tag_name[i].getAttribute("name"))
         {
            val = elts_with_tag_name[i].getAttribute("name");
            if (val == name_value)
            {
               tab_elts[n] = elts_with_tag_name[i];
               n++;
            }
         }
      }
      return tab_elts;
   },

   /**
    * Formatte (naïvement) une chaîne passée en paramètre en fonction d'un nombre
    *
    * Attention, cette méthode ne fait qu'ajouter un 's' : elle ne gère pas
    * les exceptions (par exemple, "souris" s'écrit au singulier et au pluriel
    * de la même manière).
    *
    * @param   int           nombre
    * @param   string        chaîne
    * @param   bool          true pour ajouter le nombre en début de chaîne (optionnel, par défaut, vaut true)
    * @param   bool          true pour faire un echo du résultat, false pour retourner le résultat (optionnel, par défaut, vaut false)
    * @return  string|void   la chaîne résultat ou aucun retour si l'affichage a été demandé
    *
    * @assert  (0, 'projet%s trouve%s')  == '0 projet trouve'
    * @assert  (1, 'projet%s trouve%s')  == '1 projet trouve'
    * @assert  (2, 'projet%s trouve%s')  == '2 projets trouves'
    * @assert  (2, 'he loves his dog%s!', false) == 'he loves his dogs!'
    * @assert  (2, 'projet%s trouve%s mais %%s ou %string') == '2 projets trouves mais %%s ou %string'
    *
    */
   pluralize : function (n, format, prepend, echo)
   {
      // Calcul du caractère pluriel 's' ou ''
      var c = n > 1 ? 's' : '';

      // Remplacement de '%s' (lorsque précédé d'une lettre et suivi d'un séparateur de mot) par 'c'
      var re = /([^%])%s(\b)/;
      s = format.replace(re, "$1"+c+"$2");

      // Ajout du nombre en début de chaîne
      if (prepend)
      {
         s = n+" "+s;
      }

      // Retour
      if (echo)
      {
         document.write(s);
         return true;
      }
      else
      {
         return s;
      }
   },

   /**
    * Fonction qui permet de dire si on est sous Firefox
    *
    * @author     Chabe (Francois CHABROU)
    * access      public
    */
   isFirefox : function ()
   {
      if(navigator.userAgent.indexOf("Firefox")!=-1)
      {
         return(1);
      }
      return(0);
   },


   /**
    * Fonction qui charge un script
    *
    * @author     Doug
    * @url        L'url absolue du script à charger
    * access      public
    */
   chargerScript : function (url)
   {
      var full_url, script_deja_charger;
      full_url = MIA.Conf.general.www_medias_url + url;

      // Vérification si le script est déjà présent dans la page
      var elt_head = document.getElementsByTagName('head')[0];
      if (elt_head)
      {
         var elt_script = elt_head.getElementsByTagName('script');
         script_deja_charger = false;
         for (var i = 0 ; i < elt_script.length ; i ++)
         {
            if (elt_script[i].src && elt_script[i].src == full_url)
            {
               // Le script est déjà présent
               script_deja_charger = true;
            }
         }
      }

      // Le script n'est pas présent dans la page - on l'ajoute
      if (!script_deja_charger)
      {
         var e = document.createElement("script");
         e.src = full_url;
         e.type="text/javascript";
         document.getElementsByTagName("head")[0].appendChild(e);
      }
   },


   /**
    * Fonction qui ouvre une popup centrée dans la page en fonction de la taille de la fenêtre
    *
    * @author       Kris
    * @url          L'url de la page
    * @titre        Le titre de la page
    * @parametres   Les parametres de la popup
    * access        public
    */
   ouvrirPopup : function(url, titre, parametres)
   {
      // On récupère la largeur de la fenetre
		var expression = /[^*]width=([0-9]*)[^*]/;
		expression.exec(parametres);
      var popup_width = RegExp.$1;
		// On récupère la largeur de la fenetre
		expression = /[^*]height=([0-9]*)[^*]/;
      expression.exec(parametres);
      var popup_height = RegExp.$1;
		// Calcul de la position
		var left = (screen.width - popup_width) / 2;
		var topp  = (screen.height - popup_height) / 2;
		
		// Ouverture de la popup
		var win = window.open(url, titre, parametres + ', top=' + topp + ', left=' + left);
   },


	/**
	 * Affiche/Masque un bloc HTML
	 * @param  string  bloc_id      l'identifiant du bloc HTML à afficher/masquer
	 * @param  string  lien_id      l'identifiant du lien
	 * @param  string  lien_label   le label du lien
	 */
	cacherOuMontrerSpsSupplementaires: function(bloc_id, lien_id, lien_label){
   	var lien;
   	if (lien_id) {
   		lien = document.getElementById(lien_id);
   	}
   	else {
   		lien = null;
   	}
   	
   	if (document.getElementById(bloc_id).style.display == 'none') {
   		document.getElementById(bloc_id).style.display = 'block';
   		if (lien) {
   			lien.innerHTML = "Masquer";
   		}
   	}
   	else {
   		document.getElementById(bloc_id).style.display = 'none';
   		if (lien) {
   			lien.innerHTML = lien_label;
   		}
   	}
   },
	
	/**
	 * transforme un code heaxe décimal en un tableau de valeur RGB
	 * @param  String   code_hexa
	 * @author Kris
	 */
   hex2rgb: function(code_hexa)
	{
   	var red, green, blue;
   	var triplet = code_hexa.toLowerCase().replace(/#/, '');
   	var rgbArr = new Array();
   	
   	if (triplet.length == 6)
		{
   		rgbArr[0] = parseInt(triplet.substr(0, 2), 16)
   		rgbArr[1] = parseInt(triplet.substr(2, 2), 16)
   		rgbArr[2] = parseInt(triplet.substr(4, 2), 16)
   		return rgbArr;
   	}
   	else
		{
			if (triplet.length == 3)
			{
            rgbArr[0] = parseInt((triplet.substr(0, 1) + triplet.substr(0, 1)), 16);
            rgbArr[1] = parseInt((triplet.substr(1, 1) + triplet.substr(1, 1)), 16);
            rgbArr[2] = parseInt((triplet.substr(2, 2) + triplet.substr(2, 2)), 16);
            return rgbArr;
         }
         else
			{
            alert('Erreur dans le code hexa');
         }
		} 
   }
} // fin classe Tool
