// -------------------
// P R O T O T Y P E S

String.prototype.decale = function(nDecalage) {
  // Effectue un décalage de nDecalage sur le code Unicode de chaque caractère
  // Permet de crypter la chaîne. Pour la décrypter, il faut utiliser la même fonction, avec -nDecalage en paramètre
  var nUnicode = 0
  var sRetour = ""
  for (var i = 1 ; i <= this.length ; i++) {
    nUnicode = this.charCodeAt(i-1)
	nUnicode = nUnicode + nDecalage
    sRetour += String.fromCharCode(nUnicode)
  }
  return sRetour
}


String.prototype.sansAccent = function() {
  // Supprime les accents dans la chaîne
  var sRetour = ""
  var sListeAvecAccent = "áàâãäåèéêëìíîïòóôõöúûüÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ";
  var sListeSansAccent = "aaaaaaeeeeiiiiooooouuuAAAAAAEEEEIIIIOOOOOUUUU";
  var j = 0
  for (var i = 1 ; i <= this.length ; i++) {
    j = sListeAvecAccent.indexOf(this.charAt(i-1))
	if (j == -1) {
      sRetour += this.charAt(i-1);
	}
	else {
      sRetour += sListeSansAccent.charAt(j);
	}
  }
  return sRetour
}


String.prototype.motsMajuscule = MotsMajuscule = function() {
  // Met la première lettre de chaque mot en majuscule (un prénom composé par exemple)
  // Repère :
  // - le 1er caractère
  // - un caractère alphabétique précédé d'un caractère non alphabétique
  var sRetour = "";
  var bMajuscule = false;
  var j = 0;
  for (var i = 1 ; i <= this.length ; i++) {
    bMajuscule = false;
    if (i == 1) {
	  bMajuscule = true}
	else {
	  j = this.toUpperCase().sansAccent().charCodeAt(i-1);
	  if ((j >= 65) && (j <= 90)) {
	    // Caractère courant alpha
  	    j = this.toUpperCase().sansAccent().charCodeAt(i-2);
	    if (!((j >= 65) && (j <= 90))) {
	      // caractère précédent non alpha
    	    bMajuscule = true
		}
	  }
	}
	if (bMajuscule) {
	  sRetour += this.charAt(i-1).sansAccent().toUpperCase()}
	else {
	  sRetour += this.charAt(i-1)
	}
  }
  return sRetour
}


String.prototype.initiales = Initiales = function() {
  // Retourne les initiales dans un groupe de mots
  var sRetour = "";
  var bMajuscule = false;
  var j = 0;
  for (var i = 1 ; i <= this.length ; i++) {
    bMajuscule = false;
    if (i == 1) {
	  bMajuscule = true}
	else {
	  j = this.toUpperCase().sansAccent().charCodeAt(i-1);
	  if ((j >= 65) && (j <= 90)) {
	    // Caractère courant alpha
  	    j = this.toUpperCase().sansAccent().charCodeAt(i-2);
	    if (!((j >= 65) && (j <= 90))) {
	      // caractère précédent non alpha
    	    bMajuscule = true
		}
	  }
	}
	if (bMajuscule) {
	  sRetour += this.charAt(i-1).sansAccent().toUpperCase()
	}
  }
  return sRetour
}


String.prototype.minuscule = Minuscule = function() {
  // Convertit la chaîne en minuscules, sans accent
  return this.sansAccent().toLowerCase()
}


String.prototype.majuscule = function() {
  // Convertit la chaîne en majuscules, sans accent
  return this.sansAccent().toUpperCase()
}


String.prototype.premiereMajuscule = function() {
  // Met la 1ère lettre de la chaîne en majuscule, sans accent
  return this.charAt(0).majuscule() + this.substr(1)
}


String.prototype.toDate = function() {
  var Tableau = this.split("/");
  if (Tableau.length < 3) {
    alert("La date doit être saisie au format JJ/MM/AAAA !")
	return null
  }
  var JJ = Number(Tableau[0]);
  var MM = Number(Tableau[1]);
  var AAAA = Number(Tableau[2]);
  if (AAAA < 50) {
    AAAA += 2000}
  else {
    if (AAAA < 100) {AAAA += 1900};
  }
  var DateATester = new Date(AAAA, MM-1, JJ);
  if ((DateATester.getFullYear() == AAAA) && (DateATester.getMonth() == (MM-1)) && (DateATester.getDate() == JJ)) {
    return DateATester
  }
  else {
     alert("Date incorrecte !")
     return null
  }
}


// Fonction de formatage de nombre
// Renvoie un nombre sur 2 caractères s'il est < 10 (pour l'instant...)
Number.prototype.format = function(sFormat) {
  switch (sFormat) {
    default :
      var s1 = this.valueOf().toString()
      if (s1.length >= 2) {
        return s1}
      else {
        s1 = "0" + s1
        s1 = s1.substring(s1.length-2,2)
        return s1
      }
  }
}


// Date.Format : Retourne la date au format donné
// Formats supportés : "aaaammjj", "jj/mm/aaaa", "hh:mm" (pour l'instant)
// Ajout de la fonction aux méthodes de Date()
//function FormateDate(sFormat) {
Date.prototype.format = function(sFormat) {
  if (typeof(sFormat) == "undefined") {
     Format = "aaaammjj"
  }
  var nJour = this.getDate()
  var nMois = this.getMonth()+1
  var nAnnee = this.getFullYear()
  var nHeures = this.getHours()
  var nMinutes = this.getMinutes();
  switch (sFormat) {
    case "jj/mm/aaaa" :
      return nJour.format() + "/" + nMois.format() + "/" + nAnnee ;
      break;
    case "hh:mm" :
      return nHeures.format() + ":" + nMinutes.format();
      break;
    default :
      var DateNum = 0;
      DateNum = nAnnee * 10000
      DateNum = DateNum + (nMois * 100) + nJour ;
      return DateNum.toString();
  }
}


// -----------------
// F O N C T I O N S

function MailToDecrypte(sAdresseCryptee) {
  // Ouvre la messagerie avec pour destinataire l'adresse decryptée (décalage de -1 sur UniCode des caractères)
  window.open("mailto:" + sAdresseCryptee.decale(-1))
}


function MailToRecompose(sNom, sDomaine1, sDomaine2) {
  // Ouvre la messagerie avec pour destinataire l'adresse recomposée à partir des paramètres
  window.open("mailto:" + sNom + "@" + sDomaine1 + "." + sDomaine2)
}


function getCookieVal (offset) {
  // Retourne la valeur décodée d'un cookie
  var endstr = document.cookie.indexOf (";", offset);
  if (endstr == -1)
    endstr = document.cookie.length;
  return unescape(document.cookie.substring(offset, endstr));
}


function GetCookie (name) {
  // Retourne un cookie
  var arg = name + "=";
  var alen = arg.length;
  var clen = document.cookie.length;
  var i = 0;
  while (i < clen) {
    var j = i + alen;
	   if (document.cookie.substring(i, j) == arg)
     return getCookieVal (j);
    i = document.cookie.indexOf(" ", i) + 1;
    if (i == 0) break; 
  }
  return null;
}


function SetCookie (name, value) {
  // Enregistrement d'un cookie
  var argv = SetCookie.arguments;
  var argc = SetCookie.arguments.length;
  var expires = (argc > 2) ? argv[2] : null;
  var path = (argc > 3) ? argv[3] : null;
  var domain = (argc > 4) ? argv[4] : null;
  var secure = (argc > 5) ? argv[5] : false;
  document.cookie = name + "=" + escape (value) +
    ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
    ((path == null) ? "" : ("; path=" + path)) +
    ((domain == null) ? "" : ("; domain=" + domain)) +
    ((secure == true) ? "; secure" : "");
}


function DeleteCookie (name) {
  // Suppression d'un cookie
  var exp = new Date();
  exp.setTime (exp.getTime() - 1);  // This cookie is history
  var cval = GetCookie (name);
  if (cval != null)
    document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}


function TestDate(ChampTexte) {
  // Teste et formate la date saisie dans un champ de formulaire
  var DateSaisie = ChampTexte.value.toDate();
  if (DateSaisie == null) {
    ChampTexte.focus();}
  else {
    ChampTexte.value = DateSaisie.format("jj/mm/aaaa");
  }
}
