var MAJUSCULES ="ABCDEFGHIJKLMNOPQRSTUVWXYZÉÈÇ_";
var MINUSCULES ="abcdefghijklmnopqrstuvwxyzéçè";
var SPECIAUX   =" '-_";
var CHIFFRES   ="0123456789";                    //Caractères autorisés pour une valeur numérique
var PHONES     ="0123456789 .-()+";              //Caractères autorisés pour un n° de téléphone
//var EMPTY_OK = true;


function trim(strToTrim)
{
  return strToTrim.replace(/^\s+/g,'').replace(/\s+$/g,'');
} 

function bissextile(year)
{
  return (((year%4 == 0)&&(year%100 != 0))||(year%400 == 0));
}

function isDateOK(D,vide)
{
  var jour = 0;
  var mois = 0;
  var annee = 0;
  if ((D == null || D.length==0) && !vide) //date ne doit pas etre vide!!
  { return false;}
  //On eclate la date en jj puis mm puis aaaa
  switch (D.length)
  {
    case 10://ecriture jj/mm/aaaa
      if ((D.charAt(2) !='/')||(D.charAt(5) !='/'))
      {return false;}
      if ((D.charAt(0)<'0')||(D.charAt(0)>'9')||(D.charAt(1)<'0')||(D.charAt(1)>'9')||
          (D.charAt(3)<'0')||(D.charAt(3)>'9')||(D.charAt(4)<'0')||(D.charAt(4)>'9')||
          (D.charAt(6)<'0')||(D.charAt(6)>'9')||(D.charAt(7)<'0')||(D.charAt(7)>'9')||
          (D.charAt(8)<'0')||(D.charAt(8)>'9')||(D.charAt(9)<'0')||(D.charAt(9)>'9'))
      {return false;}
      jour  = D.charAt(0) + D.charAt(1);
      mois  = D.charAt(3) + D.charAt(4);
      annee = D.charAt(6) + D.charAt(7) + D.charAt(8) + D.charAt(9);
      break;
    case 8://ecriture jj/mm/aa ou jjmmaaaa
      if ((D.charAt(2) =='/')&&(D.charAt(5) =='/'))//cas jj/mm/aa
      {
        if ((D.charAt(0)<'0')||(D.charAt(0)>'9')||(D.charAt(1)<'0')||(D.charAt(1)>'9')||
            (D.charAt(3)<'0')||(D.charAt(3)>'9')||(D.charAt(4)<'0')||(D.charAt(4)>'9')||
            (D.charAt(6)<'0')||(D.charAt(6)>'9')||(D.charAt(7)<'0')||(D.charAt(7)>'9'))
        {return false;}
        jour  = D.charAt(0) + D.charAt(1);
        mois  = D.charAt(3) + D.charAt(4);
        annee = D.charAt(6) + D.charAt(7);
        if (annee < 50)
        {annee = annee*1 + 2000;}
        else
        {annee = annee*1 + 1900;}
      }
      else //cas jjmmaaaa
      {
        if ((D.charAt(0)<'0')||(D.charAt(0)>'9')||(D.charAt(1)<'0')||(D.charAt(1)>'9')||
            (D.charAt(2)<'0')||(D.charAt(2)>'9')||(D.charAt(3)<'0')||(D.charAt(3)>'9')||
            (D.charAt(4)<'0')||(D.charAt(4)>'9')||(D.charAt(5)<'0')||(D.charAt(5)>'9')||
            (D.charAt(6)<'0')||(D.charAt(6)>'9')||(D.charAt(7)<'0')||(D.charAt(7)>'9'))
        {return false;}
        jour   = D.charAt(0) + D.charAt(1);
        mois   = D.charAt(2) + D.charAt(3);
        annee  = D.charAt(4) + D.charAt(5) + D.charAt(6) + D.charAt(7);
      }
      break;
    case 6://cas jj/mm/aa
      if ((D.charAt(0)<'0')||(D.charAt(0)>'9')||(D.charAt(1)<'0')||(D.charAt(1)>'9')||
          (D.charAt(2)<'0')||(D.charAt(2)>'9')||(D.charAt(3)<'0')||(D.charAt(3)>'9')||
          (D.charAt(4)<'0')||(D.charAt(4)>'9')||(D.charAt(5)<'0')||(D.charAt(5)>'9'))
      {return false;}
      jour   = D.charAt(0) + D.charAt(1);
      mois   = D.charAt(2) + D.charAt(3);
      annee  = D.charAt(4) + D.charAt(5);
      if (annee < 50)
      {annee = annee*1 + 2000;}
      else
      {annee = annee*1 + 1900;}
      break;
    default:
      return false;
  }
  if (annee>2200 || annee<1900)
  {return false;}
  if (mois>12 || mois<1)
  {return false;}
  if ((jour<1) || ((mois == 1 || mois == 3 || mois == 5 || mois == 7 ||
                    mois == 8 ||   mois == 10 || mois == 12) && jour>31)
               || ((mois == 4 || mois == 6 || mois == 9 || mois == 11) && jour>30)
               || (mois == 2 && bissextile(annee) && jour>29)
               || (mois == 2 && !bissextile(annee) && jour>28))
  {return false;}
  return true;
}

function isNumberOK(valeur,vide)
{
  //La valeur est valide si chacun de ses caracteres est >=0 et <=9.
  //Le second parametre vide (true/false) indique s'il est permis d'avoir une
  // valeur vide
  var i;
  
  if ((valeur==null || valeur.length==0) && !vide)
  {return false;}
  for (i=0;(i<valeur.length);i++)
  {
    if (valeur.charAt(i)<'0' || valeur.charAt(i)>'9')
    {return false;}
  }
  return true;
}

function isPhoneNumberFrench(chaine,vide)
{
  //le numero de telephone est correct s'il contient des caractères
  //autorisés: (0-1 .-).
  //Le second parametre vide(true/false) indique s'il est permis d'avoir une
  // valeur chaine vide
  if ((chaine == null || chaine.length==0) && !vide)
  {return false;}
  switch (chaine.length)
  {
    case 15: //cas .. .. .. .. ..
      if(((chaine.charAt(2)==' ')||(chaine.charAt(2)=='.')||(chaine.charAt(2)=='-')) &&
      	((chaine.charAt(5)==' ')||(chaine.charAt(5)=='.')||(chaine.charAt(5)=='-')) &&
      	((chaine.charAt(8)==' ')||(chaine.charAt(8)=='.')||(chaine.charAt(8)=='-')) &&
    	((chaine.charAt(11)==' ')||(chaine.charAt(11)=='.')||(chaine.charAt(11)=='-')) &&
    	((chaine.charAt(14)==' ')||(chaine.charAt(14)=='.')||(chaine.charAt(14)=='-')) &&
         ((chaine.charAt(0)>=0)&&(chaine.charAt(0)<='9'))&&
         ((chaine.charAt(1)>=0)&&(chaine.charAt(1)<='9'))&&
         ((chaine.charAt(3)>=0)&&(chaine.charAt(3)<='9'))&&
         ((chaine.charAt(4)>=0)&&(chaine.charAt(4)<='9'))&&
         ((chaine.charAt(6)>=0)&&(chaine.charAt(6)<='9'))&&
         ((chaine.charAt(7)>=0)&&(chaine.charAt(7)<='9'))&&
         ((chaine.charAt(9)>=0)&&(chaine.charAt(9)<='9'))&&
         ((chaine.charAt(10)>=0)&&(chaine.charAt(10)<='9'))&&
        ((chaine.charAt(12)>=0)&&(chaine.charAt(12)<='9'))&&
         ((chaine.charAt(13)>=0)&&(chaine.charAt(13)<='9')))
        {return true;}
      else
        {return false;}
      break;
    case 14: //cas .. .. .. .. ..
      if(((chaine.charAt(2)==' ')||(chaine.charAt(2)=='.')||(chaine.charAt(2)=='-')) &&
         ((chaine.charAt(5)==' ')||(chaine.charAt(5)=='.')||(chaine.charAt(5)=='-')) &&
         ((chaine.charAt(8)==' ')||(chaine.charAt(8)=='.')||(chaine.charAt(8)=='-')) &&
         ((chaine.charAt(11)==' ')||(chaine.charAt(11)=='.')||(chaine.charAt(11)=='-')) &&
         ((chaine.charAt(0)>=0)&&(chaine.charAt(0)<='9'))&&
         ((chaine.charAt(1)>=0)&&(chaine.charAt(1)<='9'))&&
         ((chaine.charAt(3)>=0)&&(chaine.charAt(3)<='9'))&&
         ((chaine.charAt(4)>=0)&&(chaine.charAt(4)<='9'))&&
         ((chaine.charAt(6)>=0)&&(chaine.charAt(6)<='9'))&&
         ((chaine.charAt(7)>=0)&&(chaine.charAt(7)<='9'))&&
         ((chaine.charAt(9)>=0)&&(chaine.charAt(9)<='9'))&&
         ((chaine.charAt(10)>=0)&&(chaine.charAt(10)<='9'))&&
         ((chaine.charAt(12)>=0)&&(chaine.charAt(12)<='9'))&&
         ((chaine.charAt(13)>=0)&&(chaine.charAt(13)<='9')))
        {return true;}
      else
        {return false;}
      break;
    case 10: //cas ..........
      if(((chaine.charAt(0)>=0)&&(chaine.charAt(0)<='9'))&&
         ((chaine.charAt(1)>=0)&&(chaine.charAt(1)<='9'))&&
         ((chaine.charAt(2)>=0)&&(chaine.charAt(2)<='9'))&&
         ((chaine.charAt(3)>=0)&&(chaine.charAt(3)<='9'))&&
         ((chaine.charAt(4)>=0)&&(chaine.charAt(4)<='9'))&&
         ((chaine.charAt(5)>=0)&&(chaine.charAt(5)<='9'))&&
         ((chaine.charAt(6)>=0)&&(chaine.charAt(6)<='9'))&&
         ((chaine.charAt(7)>=0)&&(chaine.charAt(7)<='9'))&&
         ((chaine.charAt(8)>=0)&&(chaine.charAt(8)<='9'))&&
         ((chaine.charAt(9)>=0)&&(chaine.charAt(9)<='9')))
        {return true;}
      else
        {return false;}
      break;
    case 9: //cas .......... pe 164714235
      if(((chaine.charAt(0)>=0)&&(chaine.charAt(0)<='9'))&&
         ((chaine.charAt(1)>=0)&&(chaine.charAt(1)<='9'))&&
         ((chaine.charAt(2)>=0)&&(chaine.charAt(2)<='9'))&&
         ((chaine.charAt(3)>=0)&&(chaine.charAt(3)<='9'))&&
         ((chaine.charAt(4)>=0)&&(chaine.charAt(4)<='9'))&&
         ((chaine.charAt(5)>=0)&&(chaine.charAt(5)<='9'))&&
         ((chaine.charAt(6)>=0)&&(chaine.charAt(6)<='9'))&&
         ((chaine.charAt(7)>=0)&&(chaine.charAt(7)<='9'))&&
         ((chaine.charAt(8)>=0)&&(chaine.charAt(8)<='9')))
        {return true;}
      else
        {return false;}
      break;
    default:
      return false;
  }
} 

function isPhoneNumberInter(chaine,vide)
{
  //le numero est international s'il n'est pas vide, et s'il contient (.).... (..)....
  //ou(...).....donc s'il possède ( et ), que l'écart entre ( et ) vaut 1,2, ou 3, si 
  //les caractères autres que ( et ) sont des chiffres
  //Le second parametre vide(true/fase) indique s'il est permis d'avoir une
  // valeur chaine vide
  var i;
  var idxOpenPar = -1;
  var idxClosedPar = -1;
  var str;
  if ((chaine == null || chaine.length==0) && !vide)
  {return false;}
  for (i=0;i< chaine.length;i++)
  {
    if (chaine.charAt(i)=='(')
    {
      if (idxOpenPar ==-1)
      {idxOpenPar = i;} //on a la pos de '('
      else //il y a plusieurs '('
      {return false;}
    }
    if (chaine.charAt(i)==')')
    {
      if (idxClosedPar ==-1)
      {idxClosedPar = i;}//on a la pos de ')'
      else
      {return false;}//il y a plusieurs )
    }
  }
  if ((idxOpenPar == -1)||(idxClosedPar == -1)||(idxOpenPar != 0)||
      (idxClosedPar - idxOpenPar<=1)||(idxClosedPar - idxOpenPar>4))
  {return false;}

  str = chaine.substring(idxOpenPar+1,idxClosedPar); //on extrait la chaine entre ()
  //on verifie que les caracteres entre () sont valides
  for (i=0;i<str.length;i++)
  {
    if(CHIFFRES.indexOf(str.charAt(i))==-1)
    {return false;}
  }
  if (idxClosedPar+1>=chaine.length)
  {return false;}//il n'y a pas de caracteres apres
  str = chaine.substring(idxClosedPar+1,chaine.length);//On extrait les caracteres apres()
  for (i=0;i<str.length;i++)
  {
    if(CHIFFRES.indexOf(str.charAt(i))==-1)//on verifie que les caracteres après () sont valides
    {return false;}
  }
  return true;
}

function isPhoneNumberOK(str,vide)
{
  //le numero de telephone est correct s'il contient des caractères
  //autorisés contenus dans la variable PHONES
  //Le second parametre vide(true/false) indique s'il est permis d'avoir une
  // valeur chaine vide

  var intCount = 0;
  var plusCount = 0;
  var oParCount = 0;
  var cParCount = 0;
  var oParenthesisIdx = 0;
  var cParenthesisIdx = 0;
  //on verifie que les caracteres sont valides
  for (i=0;i<str.length;i++)
  {
    if(PHONES.indexOf(str.charAt(i))==-1)
      {return false;}
  }
  //On vérifie qu'il y a au moins 8 chiffres
  for (i=0;i<str.length;i++)
  {
    if(CHIFFRES.indexOf(str.charAt(i))>=0)
      intCount++;
  }
  if (intCount < 8)
    {return false;}
  //On vérifie qu'il n'y a au plus qu'un seul signe "+"
  for (i=0;i<str.length;i++)
  {
    if(str.charAt(i)=='+')
      plusCount++;
  }
  if (plusCount > 1)
    {return false;}
  //On vérifie qu'il n'y a au plus qu'un seul "("  
  for (i=0;i<str.length;i++)
  {
    if(str.charAt(i)=='(')
    {
      oParCount++;
      oParenthesisIdx = i
    }
  }
  if (oParCount > 1)
    {return false;}

  //On vérifie qu'il n'y a au plus qu'un seul ")"  
  for (i=0;i<str.length;i++)
  {
    if(str.charAt(i)==')')
    {
      cParCount++;
      cParenthesisIdx = i
    }
  }
  if (cParCount > 1)
    {return false;}
  //S'il y a à la fois une parenthèse ouvrante et une parenthèse fermante
  if (oParCount == 1 && cParCount == 1)
    //S'il y a moins de 2 ou plus de 3 caractères entre les 2 parenthèse
    if ((cParenthesisIdx - oParenthesisIdx) <= 2 || (cParenthesisIdx - oParenthesisIdx) >= 5)
      {return false;}
  return true;
  //return (isPhoneNumberFrench(chaine,vide) || isPhoneNumberInter(chaine,vide)); 
}

function isMailOK(chaine,vide)
{
  //Doit y avoir un seul @ avec quelque chose avant et apres
  //On doit trouver les . qui doivent avoir quelque chose avant et apres
  //rmq: s'il y a un arobas, on parcourt la chaine jusqu'a l'@ puis du caractere
  //     apres l'@ jusqu'a la fin pour trouver les . et verifier leur correction
  //     S'il n'y a pas d'arobas, arobasPos = 0 et le premier for n'est pas execute
  var i;
  var dotPos=-1;
  var arobasPos=-1;
  var nbArobas=0;
  
  chaine = trim(chaine);
  if ((chaine == null || chaine.length==0) && !vide)
  {return false;}
  //On cherche la position de l'@
  for (i=0;i<chaine.length;i++)//Un passage pour trouver l'arobas (et combien y en a)
  {
    if (chaine.charAt(i)=='@')
    {
      arobasPos = i;
      nbArobas++;
    }
  }
  if (nbArobas !=1)
  {return false;}//il doit y avoir un seul '@'
  if(arobasPos<=0 || arobasPos==chaine.length-1)
  {return false;}//la position de l'arobas ne peut être en première ou dernière position
  for (i=0;i<arobasPos;i++)
  {
    if (chaine.charAt(i)=='.')
    {
      if (i==dotPos+1 || i==(arobasPos-1))
      {return false;}//Si le nouveau point est juste à côté du précédent ou à côté de l'arobas
      dotPos = i;
    }
  }
  dotPos = arobasPos;
  for (i=(arobasPos+1);i<chaine.length;i++)
  {
    if (chaine.charAt(i)=='.')
    {
      if (i==dotPos+1 || i==(chaine.length-1))
      {return false;}
      dotPos = i;
    }
  }
  return true;
}

function isNameOK(chaine,vide)
{
  //Le nom est correct  s'il contient des caractères autorisés:
  //A-Z, a-z, les caractères accentués, les tirets, les espaces(s'il n'y en a pas de 
  //consécutifs)
  //Le second parametre vide (true/false) indique s'il est permis d'avoir une
  // valeur chaine vide
  var i;
  var specialBefore=false;
  
  chaine = trim(chaine);
  if ((chaine == null || chaine.length==0) && !vide)
  {return false;}
  if (SPECIAUX.indexOf(chaine.charAt(0)) != -1)
  {return false;}//pas de caractère spécial sur le premier caractère
  for (i=0;i<chaine.length;i++)
  {
    if ((MAJUSCULES.indexOf(chaine.charAt(i)) == -1) && 
        (MINUSCULES.indexOf(chaine.charAt(i)) == -1) &&
        (SPECIAUX.indexOf(chaine.charAt(i)) == -1))
    {return false;}
    if (SPECIAUX.indexOf(chaine.charAt(i)) != -1)
    {
      if (specialBefore)
      {return false;}
      specialBefore = true;
    }
    else
    {specialBefore = false;}; 
  }
  return true;
}

function formatDate(D)
{
  var jour = 0;
  var mois = 0;
  var annee = 0;
  if (D == null || D.length==0)
  {return "";}
  switch (D.length)
  {
    case 10: //ecriture jj/mm/aaaa
      jour = D.charAt(0) + D.charAt(1);
      mois = D.charAt(3) + D.charAt(4);
      annee = D.charAt(6) + D.charAt(7) + D.charAt(8) + D.charAt(9);
      break;
    case 8: //ecriture jj/mm/aa ou jjmmaaaa
      if ((D.charAt(2) =='/')&&(D.charAt(5) =='/'))//cas jj/mm/aa
      {
        jour   = D.charAt(0) + D.charAt(1);
        mois   = D.charAt(3) + D.charAt(4);
        annee  = D.charAt(6) + D.charAt(7);
        if (annee < 50)
        {annee = annee*1 + 2000;}
        else
        {annee = annee*1 + 1900;}
      }
      else//cas jjmmaaaa
      {
        jour   = D.charAt(0) + D.charAt(1);
        mois   = D.charAt(2) + D.charAt(3);
        annee  = D.charAt(4) + D.charAt(5) + D.charAt(6) + D.charAt(7);
      }
      break;
    case 6: //ecriture jjmmaa (y en a pas d'autre!!)
      jour   = D.charAt(0) + D.charAt(1);
      mois   = D.charAt(2) + D.charAt(3);
      annee  = D.charAt(4) + D.charAt(5);
      if (annee < 50)
      {annee = annee*1 + 2000;}
      else
      {annee = annee*1 + 1900;}
      break;
    default:
      return D;
  }
  return (jour + "/" + mois + "/" + annee);
}


function cmpDates(D1,D2)
{
  //Comparaison des dates D1 et D2 rend +1 si D1 est > à D2, 0 D1 = D2
  //et -1 si D1<D2
  //D1 et D2 sont écrites jj/mm/aaaa en texte et doivent avoir été mises
  //en forme avec formatDate (apres vérification du bon format: isDateOK())  
  var jour1 = D1.charAt(0) + D1.charAt(1);
  var mois1 = D1.charAt(3) + D1.charAt(4);
  var annee1 = D1.charAt(6) + D1.charAt(7) + D1.charAt(8) + D1.charAt(9);
  var jour2 = D2.charAt(0) + D2.charAt(1);
  var mois2 = D2.charAt(3) + D2.charAt(4);
  var annee2 = D2.charAt(6) + D2.charAt(7) + D2.charAt(8) + D2.charAt(9);
  if (annee1 > annee2)
  {return 1;}
  if (annee2 > annee1)
  {return -1;}
  if (mois1 > mois2)
  {return 1;}
  if (mois2 > mois1)
  {return -1;}
  if (jour1 > jour2)
  {return 1;}
  if (jour2 > jour1)
  {return -1;}
  return 0;
}

function getTodayMajored(days)
{
  var day;
  var month;
  var year;
  var dateInMs;  //date en ms depuis le 01/01/1970
  var curDate;
  var futurDate;

  //On détermine la date du jour + N jours
  curDate = new Date();
  dateInMs = curDate.getTime();
  futurDate = new Date(dateInMs + days*24*3600*1000);
  day = futurDate.getDate();
  month = futurDate.getMonth() + 1;
  year = futurDate.getYear();
  //On met en forme la date: JJ/MM/AAAAA
  if (day < 10)
    day = "0" + day;
  if (month < 10)
    month = "0" + month;
  if (year < 200)
    year += 1900
  return (day + "/" + month + "/" + year);
}

function formatLastName(lastName)
{
  return lastName.toUpperCase();
}

function formatFirstName(firstName)
{
  //On éclate le prénom en sous-prénoms (séparateur = '-')
  var subParts = firstName.split("-");
  var firstLetter;
  var otherLetters;
  var newName;
  var result = "";
  for (var i=0; i<subParts.length; i++)
  {
    if (subParts[i] != null && subParts[i].length!=0)
    {
      firstLetter = subParts[i].charAt(0);
      otherLetters = subParts[i].slice(1, subParts[i].length);
      newName = firstLetter.toUpperCase() + otherLetters.toLowerCase();
    }
    //On reforme le prénom
    if (result.length != 0)
      result += '-';
    result += newName;
  }
  return result;
}


