/* 
Check.js version 2.3 (05/01/2001)
StefO

Historique:
-----------

version 2.3 - SO
  Correction d'un bug dans la fonction testChampsDate.
  la date n'était jamais valide si le mois était 01 (janvier)
  
version 2.2 - SO
	Modification du test email. Si la valeur sans est null, on oblige l'internaute à saisir
	une adresse email valide et on ne propose pas de valeur par défaut

version 2.1 - SO
	Ajout de la possibilité de mettre null pour les messages d'alert. ils n'apparaissent plus.
	ça peut être utile pour les formulaires qui affichent toutes les erreurs d'un coup.

version 2.0 - SO
	Ajout d'un paramètre Message dans toutes les fonctions. Ceci permet d'avoir des messages personnalisés.
	
version 1.9
	Correction d'un problème dans la fonction champSuivant
		lorsque le champ suivant était DISABLED, une erreur avait lieu
		car il est impossible de donner le focus a un champ désactivé
		
version 1.8
	Correction d'un problème dans la fonction checkChampsDate
		lorsque la date était bonne, la chaine renvoyée ne contenait pas
		de 0 pour les jour et les mois inférieur à 10
		
version 1.7
	Correction d'un problème dans la fonction champSuivant
	
version 1.6
	Ajout de la fonction champSuivant

version 1.5
	Correction d'un problème dans la fonction testChampsDate

version 1.4
	Correction d'un problème dans la fonction Y2K

Version 1.3
	Ajout des fonctions testChampsDate et Y2K

version 1.2
	Correction de la fonction testChampsNumerique

version 1.1
	Ajout de la fonction testChampsEmail

version 1.0
	Première version

*/

/*-----------------------------------------------------------------------------------*\
 * Affiche une fenetre de confirmation avec le Message passé en paramètre            *
\*-----------------------------------------------------------------------------------*/
function confirmBeforeSubmit(Message) {
  if (confirm(Message))
    return true;
  else
    return false;
}     

/*-----------------------------------------------------------------------------------*\
 * Teste si un champ est remplit                                                     *
\*-----------------------------------------------------------------------------------*/
function testChampsTexte(Champ, Message) {
  if ((Champ.value == null) || (Champ.value == "")) {
    if (Message != null)
      alert(Message);
    Champ.focus();
    return(false);
  }
  else
    return(true);
}
      
/*-----------------------------------------------------------------------------------*\
 * Teste un champ numérique avec un mini et maxi éventuels (null sinon)              *
\*-----------------------------------------------------------------------------------*/
function testChampsNumerique(Champ, Mini, Maxi, Message) {
  var v = parseFloat((Champ.value).replace(/\,/g, "."));
  // le séparateur des décimals est un '.' pour javascript et un ',' pour bdd
  if (isNaN(v)) {
    if (Message != null)
      alert(Message);
    Champ.focus();
    return(false);
  }
  if (Mini != null) {
    if (v < Mini) {
      if (Message != null)
        alert("La valeur est inférieure au minimum.");
      Champ.focus();
      return(false);
    }
  }
  if (Maxi != null) {
    if (v > Maxi) {
      if (Message != null)
        alert("La valeur est supèrieure au maximum.");
      Champ.focus();
      return(false);
    }
  }
  // on remplace le '.' du séparateur des décimals par une ',' pour l'insertion dans la bdd
  Champ.value = v.toString().replace(/\./g, ",");
  // on ne remplace pas le '.' du séparateur des décimals par une ',' pour l'insertion dans la bdd
  //Champ.value = v;

  return(true);
}

/*-----------------------------------------------------------------------------------*\
 * Teste si une valeur à bien été choisie dans une liste déroulante                  *
\*-----------------------------------------------------------------------------------*/
function testListBox(Champ, Message) {
  if ((Champ.options[Champ.selectedIndex].value == null) || (Champ.options[Champ.selectedIndex].value <= 0 )) {
    if (Message != null)
      alert(Message);
    Champ.focus();
    return(false);
  }
  else
    return(true);
}

/*-----------------------------------------------------------------------------------*\
 * Teste si un champ email est valide avec une éventuelle valeur sans email          *
\*-----------------------------------------------------------------------------------*/
function testChampsEmail(Champ, ValeurSans, Message) {
  var texte = Champ.value;

  if (ValeurSans != null) {
    if (texte == ValeurSans)
      return(true);
  }

  var pattern = /^([0-9A-Z\.\-_]+)@([0-9A-Z\.\-_]+)\.([A-Z]{2,4})$/i;
  var result = texte.match(pattern);

  if (result != null) {
    // ---- l'email est valide
    return(true);
  }
  else {
    if (ValeurSans != null) {
      // --- l'email n'est pas valide et la valeur par défaut est définie
      if (Message != null) {
        if (confirm(Message)) {
          Champ.value = ValeurSans;
          return(true);
        }
        else
          return(false);
      }
      else {
        Champ.value = ValeurSans;
        return(true);
      }
    }
    else {
      // ---- l'email n'est pas valide et la valeur par défaut n'est pas définie
      if (Message != null)
        alert(Message);
      Champ.focus();
      return(false);
    }
  }
}

/*-----------------------------------------------------------------------------------*\
 * Retourne une date en Y2K en fonction de limiteInf pour les années en 2 chiffres   *
 *   ex: limitInf = 29 ....  29 -> 2029 et 30 -> 1930                                *
\*-----------------------------------------------------------------------------------*/
function Y2K(Annee, LimiteInf) {
  Annee = parseInt(Annee);
  if ((Annee >= 1000) && (Annee <= 9999))
    return(Annee);
    
  if (Annee > LimiteInf)
    Annee += 1900;
  else
    Annee += 2000;
    
  return(Annee);
}

/*-----------------------------------------------------------------------------------*\
 * Teste si un champ Date                                                            *
\*-----------------------------------------------------------------------------------*/
function testChampsDate(Champ, Message) {
  var texte = Champ.value;
  var tabDate = texte.split("/");
 
  var day   = tabDate[0];
  var month = tabDate[1] - 1; //les mois sont gérés de 0 à 11
  var year  = Y2K(tabDate[2], 29);

  if ((day < 1) || (month < 0) || (!year)) {
    if (Message != null)
      alert(Message);
    Champ.focus();
    return(false);
  }
  
  var test = new Date(year, month, day);
  if ( (Y2K(test.getYear(), 29) == year) && (month == test.getMonth()) && (day == test.getDate()) ) {
    Champ.value = ((day < 10) ? "0" : "") + parseInt(day) + "/" + ((month < 9) ? "0" : "") + parseInt(month + 1) + "/" + year;
    return(true);
  }
  else {
    if (Message != null)
      alert(Message);
    Champ.focus();
    return(false);
  }
}


/*-----------------------------------------------------------------------------------*\
 * permet d'intercepter l'appui sur la touche entree pour passer au champ suivant    *
\*-----------------------------------------------------------------------------------*/
function champSuivant(E, Champ) {
  // exemple d'utilisation :
  // onKeyDown="return(champSuivant(event, this));"
  var whichCode = (window.Event) ? E.which : E.keyCode;
  var ChampCourant;
  var ChampSuivant;

  switch (whichCode) {
    case 13: //appui sur la touche entrée
      for (var cpt = 0; cpt < Champ.form.length; cpt++) {
        ChampCourant = Champ.form.elements[cpt];
        if (ChampCourant == Champ) { // on retrouve le champ
          if (cpt < Champ.form.length - 1) { // on vérifie que ce ne soit pas le dernier
            ChampSuivant = Champ.form.elements[cpt + 1];
            if (ChampSuivant.type == "text"){ // si c'est un type texte on passe au suivant
              if (!ChampSuivant.disabled) { //le champ ne doit pas être disabled
                //alert('avant focus');
                ChampSuivant.focus();
                //alert('avant select');
                ChampSuivant.select();
              }
            }
          }
        }
      }
      return(false);
      break;
    default:
  }
}

