var premierePasse = true;
var TabClass = new Array();
function validate(form,LONGUEUR_MOTPASSE)
{
 changeSubmit(form,true);

 // enleve les espaces
 trim_all(form);

 var nbError = 0;
 var msg = "";
 var classError = form.className+'_err_input';
 var firstError = null;
 for (var i=0;i<form.elements.length;i++)
 {
  curError = false;

  champ = form.elements[i];
  nom   = champ.name;

  // traitement des attributs
  var requis  = false;
  var subtype = '';
  var constraint = new Array();
  var comment    = '';
  var maxlength  = '';
  for (var j=0;j<champ.attributes.length;j++)
  {
   date = false;
   attName = champ.attributes[j].name.toLowerCase();
   attVal  = champ.attributes[j].value;
   switch ( attName )
   {
    case 'required':
     if ( attVal.toLowerCase() == 'required' ) requis = true;
     break;
    case 'subtype':
     subtype = attVal.toLowerCase();
     break;
    case 'constraint':
     constraint = attVal.toLowerCase().split(',');
     break;
    case 'comment':
     comment = champ.attributes[j].value;
     break;
    case 'maxlength':
     maxlength = parseInt(attVal);
     break;
   }
  }

  if ( requis && champ.value == "" && subtype != 'check_date' && subtype != 'check_timestamp' )
  {
   msg = msg + "\n * Veuillez saisir une valeur pour le champ '"+comment+"' !";
   curError = true;
  }

  // si requis ou non-requis et champ non vide
  if ( (subtype != '' || constraint.length > 0) && (requis || (! requis && champ.value != '' )) )
  {
   switch ( subtype )
   {
    case 'check_varchar':
     if ( maxlength != '' )
     {
      if ( ! ( champ.value.length <= maxlength ) )
      {
       msg = msg + "\n * 'La texte saisi pour le champ '"+comment+"' est trop long !'";
       curError = true;
      }
     }
     break;
    case 'check_text':
     break;
    case 'check_date':
    case 'check_timestamp':
     eval('var year  = form.'+nom+'_aa');
     eval('var month = form.'+nom+'_mm');
     eval('var day   = form.'+nom+'_jj');
     if ( year.value != '-' && month.value != '-' && day.value != '-' && ! isDate(year.value,month.value,day.value) )
     {
      msg = msg + "\n * 'La date saisie n'est pas valide pour le champ '"+comment+"' !'";
      curError = true;
     }
     date = true;
     break;
   }
   if ( constraint.length > 0  && ! curError )
   {
    for (var k=0;k<constraint.length;k++)
    {
     switch ( constraint[k] )
     {
      case 'check_integer':
       RE = /^\-?[0-9]+$/;
       if ( ! RE.test(champ.value) )
       {
        msg = msg + "\n * 'Veuillez saisir un entier pour le champ '"+comment+"' !'";
        curError = true;
       }
       if ( ! ( champ.value.length < (Math.pow(2,4*8) / 2 - 1) ) )
       {
        msg = msg + "\n * 'La valeur saisie est trop grande pour le champ '"+comment+"' !'";
        curError = true;
       }
       break;
      case 'check_numeric':
       RE = /^\-?[0-9]*\.?[0-9]*$/;
       if ( ! RE.test(champ.value) )
       {
        msg = msg + "\n * 'Veuillez saisir un nombre réel pour le champ '"+comment+"' !'";
        curError = true;
       }
       break;
      case 'check_positif':
       if ( ! ( champ.value > 0 ) )
       {
        msg = msg + "\n * 'Veuillez saisir un nombre positif pour le champ '"+comment+"' !'";
        curError = true;
       }
       break;
      case 'check_email':
       RE = /^[A-Za-z0-9\.\-_]+[@][A-Za-z0-9\-\.]+[\.][a-zA-Z]{2,6}$/;
       if ( ! RE.test(champ.value) )
       {
        msg = msg +  "\n * 'Le champ '"+comment+"' n\'est pas une adresse email correcte !'";
        curError = true;
       }
       break;
      case 'check_nonvide':
       if ( ! ( champ.value != "" ) )
       {
        msg = msg + "\n * 'Veuillez saisir une valeur pour le champ '"+comment+"' !'";
        curError = true;
       }
       break;
      case 'check_url':
       if ( champ.value != "" )
       {
        RE = /^[A-Za-z]+[:\/\/]+[A-Za-z0-9]+[A-Za-z0-9\.\-_%\?&\/=~]+$/;
        if ( ! RE.test(champ.value) )
        {
         msg = msg + "\n * 'Le champ '"+comment+"' n\'est pas une adresse URL correcte !'";
         curError = true;
        }
       }
       break;
      case 'check_password':
       RE = /^[a-zA-Z0-9]*$/;
       if ( ! ( RE.test(champ.value) ) )
       {
        msg = msg + "\n * 'Le mot de passe ne doit contenir que des lettres ou des chiffres !'";
        curError = true;
       }
       if ( ! ( champ.value.length >= LONGUEUR_MOTPASSE ) )
       {
        msg = msg + "\n * 'Le mot de passe doit faire au moins "+LONGUEUR_MOTPASSE+" caractères !'";
        curError = true;
       }
       break;
      case 'check_file':
       if ( form.mode && form.mode.value != 'insert' )
       {
        RE = /(\|)|(:)|(\*)|(<)|(>)|(\\\\)|(\/)|(\?)|(")/;
        if ( RE.test(champ.value) )
        {
         msg = msg + "\n * 'Le champ '"+comment+"' n'est pas un nom de fichier correct !'";
         curError = true;
        }
       }
       break;
	  case 'check_norepeat':
	   longueur = champ.value.length;
	   var norepeat = false;
	   for (var l=0;l<(longueur-1);l++)
	   {
	    if ( champ.value.substr(l,1) != champ.value.substr(l+1,1) )
        {
		 norepeat = true;
		 break;
		}
	   }
	   if ( ! norepeat )
	   {
         msg = msg + "\n * 'Le champ '"+comment+"' est une répétition !'";
         curError = true;
	   }
	   break;
     }
    }
   }
  }

  if ( premierePasse )
  {
   if ( date )
   {
    TabClass[nom] = year.className;
   }
   else
   {
    TabClass[nom] = champ.className;
   }
  }

  if ( curError )
  {
   if ( date )
   {
    year.className  += ' '+ classError;
    month.className += ' '+ classError;
    day.className   += ' '+ classError;
    if ( nbError == 0 )
    {
     firstError = year;
    }
   }
   else
   {
    champ.className += ' '+ classError;
    if ( nbError == 0 )
    {
     firstError = champ;
    }
   }
   nbError = nbError + 1;
  }
  else
  {
   if ( date )
   {
    year.className  = TabClass[nom];
    month.className = TabClass[nom];
    day.className   = TabClass[nom];
   }
   else
   {
    champ.className = TabClass[nom];
   }
  }
 } // boucle sur les champs

 if ( premierePasse ) premierePasse = false;

 if ( msg != "" )
 {
  msg = 'Données saisies non valides.'+msg;
  if ( nbError > 1 )
  {
   msg = msg + "\nVeuillez corriger ces erreurs.";
  }
  else
  {
   msg = msg + "\nVeuillez corriger cette erreur.";
  }
  alert(msg);
  if ( firstError )
  {
   firstError.focus();
  }
  changeSubmit(form,false);
  return false;
 }

 return true;
}

function changeSubmit(form,disabled)
{
 for (var i=0;i<form.elements.length;i++)
 {
  if ( (form.elements[i].type == 'submit' || form.elements[i].type == 'reset') && form.elements[i].tagName.toLowerCase() == 'input' )
  {
   form.elements[i].disabled = disabled;
  }
 }
}

function focusFirst(name)
{
 var form = document.forms[name];
 for (var i=0;i<form.elements.length;i++)
 {
  tag = form.elements[i].tagName.toLowerCase();
  if ( form.elements[i].type != 'hidden' && ! form.elements[i].disabled && (tag == 'input' || tag == 'select' || tag == 'textarea') )
  {
   form.elements[i].focus();
   return;
  }
 }
}

function isDate(year,month,day)
{
 month = month - 1;
 var tempDate = new Date(year,month,day);
 if ( tempDate.getFullYear() == year && month == tempDate.getMonth() && day == tempDate.getDate() )
 {
  return true;
 }
 else
 {
  return false;
 }
}
var FormulaireModifie = false;
function FormChange()
{
 FormulaireModifie = true;
}
function FormulaireChange(url)
{
 if ( FormulaireModifie )
 {
  if ( confirm('Le formulaire a été modifié : voulez-vous vraiment quitter cette page sans sauvegarde ?') )
  {
   redirection(url);
  }
 }
 else
 {
   redirection(url);
 }
}
function countLinesTextarea(element)
{
 cols = element.cols;
 strtocount = element.value;
 nbrLigne = 0;
 l = 0;
 for (var i=0;i<strtocount.length;i++)
 {
  if ( strtocount.substr(i,1) == "\n" )
  {
   l = 0;
   nbrLigne = nbrLigne + 1;
  }
  else
  {
   if ( l % 40 == 0 )
   {
    l = 0;
    nbrLigne = nbrLigne + 1;
   }
  }
  l = l + 1;
 }
 return nbrLigne;
}

function RedimTextarea(form)
{
 for (var i=0;i<form.elements.length;i++)
 {
  tag = form.elements[i].tagName.toLowerCase();
  if ( tag == 'textarea' )
  {
   nbr = countLinesTextarea(form.elements[i]);
   if ( nbr > form.elements[i].rows )
   {
   	form.elements[i].rows = nbr;
   }
  }
 }
}