 //Pointer vers le formulaire ... sera initialisé par validateForm()
var oForm=null;
//function permettant de récuperer le contenu du tags <LABEL FOR=..> ..</LABEL> associé à un champ ..
function labelField(oField) {
 var cLabels=document.getElementsByTagName("LABEL")
 var sLabel=null;
 var sIdentifier=(/^(checkbox|radio)$/i.test(oField.type))?"id"+oField.name.substr(5,4):oField.id;
 for (var m=0;m<cLabels.length;m++) {
  var sFor=(cLabels[m].getAttribute("for"))?cLabels[m].getAttribute("for"):cLabels[m].getAttribute("htmlFor");
  if (sFor==sIdentifier) {
   if (cLabels[m].innerText) {
     sLabel=cLabels[m].innerText;
  } else {
     var oRange=document.createRange();
     oRange.selectNode(cLabels[m]);
     sLabel=oRange.toString();
  }
   sLabel=sLabel.replace(/[\*:]|[\r\n]/gi,"");
   sLabel=sLabel.replace(/\s+$/,"");
   break;
  }
 }
 if (sLabel!=null) 
  return sLabel;
 else 
  return oField.name.replace(/[\-_]/g," ");
}
//permet de créer et initialiser ou modifier un champ du type hidden 
function setHidden(sField,sValue,sForm) {
 if (sForm) oForm=document.forms[sForm];
 var cFields=document.getElementsByName(sField);
 var oField=null;
 for (var k=0;k<cFields.length;k++) {
  if (cFields[k].type=="hidden") {
   oField=cFields[k];
   break;
  }
 }
 if (oField==null) {
  if (document.all) {
   //pour forcer que IE positionne le NAME correctement 
   oField=document.createElement("<INPUT NAME='" + sField + "'>");
  }
  else {
   oField=document.createElement("INPUT");
   oField.name=sField;
  }
  oField.type="hidden";
  oForm.appendChild(oField);
 }
 oField.value=sValue;
}
//function permetant de supprimer un champ hidden ... 
function delHidden(sField) {
 var cFields=document.getElementsByName(sField);
 for (var k=0;k<cFields.length;k++) {
  if (cFields[k].type=="hidden") {
   oField.removeNode();
   break;
  }
 }
}
//function pour afficher le message d'erreur ...
function showError(oField) {
 if(oField.onbeforeactivate) oField.onbeforeactivate();
 alert("Le champ " + labelField(oField) + " est obligatoire." + (oField.getAttribute("help")?"\n\n"+oField.getAttribute("help").replace(/\\n/g,"\n"):""))
 oField.focus();
 return false;
}
/*
 function permettant de controler la valeur d'un champ 
 avec une expression régulaire précisée par le rédacteur dans l'attribut PATTERN
*/
function checkPattern(oField) {
 var rPat=new RegExp(oField.getAttribute("pattern"),"gi");
 if (!rPat.test(oField.value)) {
  var sHelp=(oField.getAttribute("help")?"\n"+oField.getAttribute("help").replace(/\\n/g,"\n"):"");
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " est incorrect.\n" + sHelp);
  oField.focus();
  return false;
 }
 return true;
}
//function pour mettre à jour le champ sMailFrom ...
function setEmail(oField,soPrenom,soNom) {
 if (oForm==null) oForm=oField.form;
 var sMailFrom="";
 if (soPrenom) sMailFrom+=oForm.elements[soPrenom].value+" ";
 if (soNom) sMailFrom+=oForm.elements[soNom].value;
 setHidden("mailFromName",sMailFrom);
 setHidden("mailFrom",oField.value);
}
// vérifie la validité de la date
//##############################-
function verifDate(oField)
{
if (oField.value.length==0) 
 return true;
var aDate=oField.value.split(/[\s-_\/]/);
var iYear=parseInt(new Number(aDate[2]));
if (iYear<100) {
 iYear+=2000;
 }
var iMonth=parseInt(new Number(aDate[1]));
var iDay=parseInt(new Number(aDate[0]));
if (isNaN(iMonth)||1>iMonth || iMonth>12) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("Le mois est incorrect.")
  oField.focus();
  return false;
 }
var iDayMax=30;
switch (iMonth) {
 case 1:
 case 3:
 case 5:
 case 7:
 case 8:
 case 10:
 case 12:
  iDayMax=31;
  break;
 case 2: 
  iDayMax=((iYear%4==0&&iYear%100!=0)||(iYear%1000==0))?29:28;
  break;
 default: 
  iDayMax=30;
  break;
 }
if (isNaN(iDay) || 1>iDay || iDay>iDayMax) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("Le jour est incorrect.")
  oField.focus();
  return false;
 }
if (isNaN(iYear)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("L'année est incorrect.")
  oField.focus();
  return false;
 }
if (iDay<10) aDate[0]="0" + iDay;
if (iMonth<10) aDate[1]="0" + iMonth;
return true;
}
//Controle format email
function verifEmail(oField) {
 var rEmail=new RegExp("^[-_\.a-z0-9]+@[-_\.a-z0-9]+[\.][a-z\.]+$","ig");
 if (!rEmail.test(oField.value)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " n'est pas un adresse Email.")
  oField.focus();
  return false;
 }
 //mise à jour adresse email ...
 var rSetEmail=new RegExp("setemail","ig")
 if (rSetEmail.test(oField.onchange)) oField.onchange();
 return true;
}
//controle format numerique
function verifNumeric(oField) {
 var rNum=new RegExp("^[0-9]+$","g");
 if (!rNum.test(oField.value)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " devrait être numérique (sans décimales).")
  oField.focus();
  return false;
 }
 return true;
}
//control format decimal
function verifDecimal(oField,iDecimal) {
 var rDec=new RegExp("^[0-9]+([.,][0-9]{1,"+iDecimal+"})?$");
 if (!rDec.test(oField.value)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " devrait être numérique ("+((iDecimal==0)?"sans décimales":"avec "+iDecimal+" décimales max.")+").")
  oField.focus();
  return false;
 }
 return true;
}
//control format money
function verifMoney(oField,iDecimal) {
 var rDec=new RegExp("^[0-9]+([.,][0-9]{1,"+iDecimal+"})?$");
 if (!rDec.test(oField.value)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " devrait être numérique ("+((iDecimal==0)?"sans décimales":"avec "+iDecimal+" décimales max.")+").")
  oField.focus();
  return false;
 }
 return true;
}
//controle format time
function verifTime(oField) {
 if (!/\d{2}\:\d{2}/g.test(oField.value)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " n'a pas le bon format (HH:MM).")
  oField.focus();
  return false;
 }
 
 var aTime=oField.value.split(/\:/);
 var iHour=parseInt(aTime[0]);
 var iMin=parseInt(aTime[1]);
 if (iHour > 24 || iMin>60 || (iHour==24 && iMin!=0)) {
  if(oField.onbeforeactivate) oField.onbeforeactivate();
  alert("La valeur du champ " + labelField(oField) + " n'a pas le bon format (HH:MM).")
  oField.focus();
  return false;
 }
 return true;
}
//Fonctions to add extra field attributes ... 
function verifText(oField) {
 var aClass=oField.className.split(/\s+/);
 for (var c=0;c<aClass.length;c++) {
  var aValue=aClass[c].replace(/([A-Z0-9]+)/g," $1").split(/\s+/);
  switch(aValue[0].toLowerCase()) {
   case "decimal" : 
    oField.setAttribute("decimal",aValue[1]);
    break; 
   case "format" : 
    oField.setAttribute("format",aValue[1].toLowerCase());
    break; 
   case "required" :
    oField.setAttribute("required",1);
    break;
  }
 }
 if(oField.getAttribute("required")==1 && !oField.disabled && oField.value.replace(/\s/gi,"")=="")  return showError(oField);
 if(oField.value.length>0) { 
  switch (oField.getAttribute("format")) {
   case "date" : 
    if (!verifDate(oField)) return false;
    break;
   case "decimal" : 
    if (!verifDecimal(oField,oField.getAttribute("decimal"))) return false;
    break;
   case "email" : 
    if (!verifEmail(oField)) return false;
    break;
   case "money" : 
    if (!verifMoney(oField,oField.getAttribute("decimal"))) return false;
    break;
   case "numeric" : 
   case "numerique" : 
    if (!verifNumeric(oField)) return false;
    break;
   case "time" : 
    if (!verifTime(oField)) return false;
    break;
  }
 }
 if (oField.getAttribute("pattern")!=null && oField.value) {
  return checkPattern(oField);
 }
 return true;
}
function verifRadio(oField) {
 //établir la collection des radios en cours 
 var cRadio=document.getElementsByName(oField.name)
 var bRadioObl=false;
 var bRadioCkd=false;
 for (var j=0;j<cRadio.length;j++) {
  if (/required/i.test(cRadio[j].className)) bRadioObl=true;
  if (cRadio[j].checked) bRadioCkd=true;
 }
 if (bRadioObl && !bRadioCkd) {
  return showError(oField);
 }
 //mettre valeur defaut pour checkbox ...
 if (oField.type=="checkbox" && oField.getAttribute("default")) {
  if (oField.checked) {
   delHidden(oField.name);
  }
  else {
   setHidden(oField.name,oField.getAttribute("default"));
  }
 }
 return true;
}
function verifSelect(oField) {
 if (oField.getAttribute("required")!=null && oField.selectedIndex<1) {
  return showError(oField);
 }
 return true;
}
function verifyForm(olForm) {
 try {
  oForm=olForm; 
  for (var i=0;i<oForm.elements.length;i++) {
   switch (oForm.elements[i].type) {
    case "button" :
    case "hidden" :
    case "image" :
    case "reset" :
    case "submit" :
     break;
    case "file" :
    case "password" :
    case "text" :
    case "textarea" :
     if (!verifText(oForm.elements[i])) return false;
     break;
    case "radio" :
    case "checkbox" :
     if (!verifRadio(oForm.elements[i])) return false;
     break;
    case "select-one" :
    case "select-multiple" :
     if (!verifSelect(oForm.elements[i])) return false;
     break;
    default : 
     //window.status=oForm.elements[i].tagName +" :: "+ ((oForm.elements[i].type)?oForm.elements[i].type:"notTyped");
     break;
   }
  }
  oForm.formpage.value=document.location.pathname.replace(/^.*\/([^\/]+)\.html?$/,"$1");
  if(oForm.formpage.value=="/") oForm.formpage.value=document.location.search.substr(1).replace(/\.html/i,"");
  return true;
 }
 catch(e) {
  alert(e.description);
  return false;
 }
}