function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { // avec 4 arguments
	var oFgp,groupe,ok,i,j,d,p,q,nm,test,field,num,min,max,car,errors='',args=MM_validateForm.arguments;
	var sM = "[a-z0-9_]+((-[a-z0-9_]+)|([.][a-z0-9_]+)|(_[a-z0-9_]+))*@[a-z0-9]+(([.]|-)[a-z0-9]+)*[.][a-z]{2,}";
	var sF = "(^[/(/)a-z0-9_-]+[.])";
	
	var regEmail	= new RegExp("^" + sM + "$","i");
	var regMailing	= new RegExp("^((" + sM + ");?){1,}$","i");
	var regEntier	= new RegExp("^[0-9]+$","");
	var regDecimal	= new RegExp("^[0-9]+[,.]?[0-9]*$","");
	var regDate		= new RegExp("^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$","i");
	var regHeure	= new RegExp("^(([0-1][0-9])|(2[0-3]))(:[0-5][0-9]){2}$","i");
	var regFileAll	= new RegExp(sF + "[a-z0-9]{3,4}$","i");
	var regFileJPG	= new RegExp(sF + "((jpg)|(jpeg))$","i");
	var regFileImg	= new RegExp(sF + "((gif)|(jpg)|(jpeg)|(png))$","i");
	var regFileAnim	= new RegExp(sF + "((gif)|(jpg)|(jpeg)|(png)|(swf))$","i");
	var regFileFich	= new RegExp(sF + "((gif)|(jpg)|(jpeg)|(png)|(doc)|(pdf)|(zip)|(bmp)|(wmv)|(swf))$","i");
	var regFileMov	= new RegExp(sF + "((gif)|(jpg)|(jpeg)|(png)|(mov)|(mpg)|(mpe)|(mpeg)|(avi)|(wmv)|(rpm)|(ra)|(rm)|(fli)|(asf)|(asx))$","i");
	var regFileCst	= new RegExp(sF + "((doc)|(rtf)|(pdf)|(xls)|(gif)|(jpg)|(jpeg)|(png)|(bmp)|(wmv)|(swf))$","i"); //Cette ligne peut être modifiée selon le projet, ici doit être identique à : cfg_FORUM_ext.
	var regSuppr	= new RegExp("^(oui)$","i");
	var regFolder	= new RegExp("^[a-z0-9_-]*$","i");
	var regColorHexa= new RegExp("^(#)+[0-9A-F]{6}$|^$","gi");
	var val, tab;	

	for (i=0; i<(args.length-3); i+=4) { 
		test=args[i+2];
		field=args[i+3];
		val=MM_findObj(args[i]);

		if (val) {	
			nm = val.name; val = val.value;			
			if (test.indexOf('Trim')!=-1) val = val.trim(); // fonction trim

			if (val!="" || val=="null") {	
				if (test.indexOf('isColorHexa')!=-1)
					if (!regColorHexa.exec(val)) errors+='- '+field+' doit être de la forme : #xxxxxx (soit x un caractère de A à F et 0 à 9)\n';

				if (test.indexOf('isFolder')!=-1)
					if (!regFolder.exec(val)) errors+='- '+field+' ne doit contenir que des caractères alphanumériques (de A à Z, 0 à 9, _ ou -)\n';

				if (test.indexOf('isSuppr')!=-1)
					if (!regSuppr.exec(val)) errors+='- '+field+' doit contenir "Oui" si vous voulez supprimer l\'enregistrement, sinon cliquez sur le bouton annuler\n';

				if (test.indexOf('isEmail')!=-1)
					if (!regEmail.exec(val)) errors+='- '+field+' doit contenir une adresse e-mail valide Ex : nom@domaine.fr\n  (un seul arobas (@) et au moins un point entre l\'arobas et la fin de l\'adresse)\n';
				
				if (test.indexOf('isMailing')!=-1)
					if (!regMailing.exec(val)) errors+='- '+field+' doit contenir une adresse e-mail valide Ex : nom@domaine.fr\n  (un seul arobas (@) et au moins un point entre l\'arobas et la fin de l\'adresse.)\n  Si plusieurs destinataire, séparer les adresses email par un ;\n';

				if (test.indexOf('isLimitecar')!=-1) {
					p=test.indexOf(':');
					car=test.substring(p+1);
		        	if (car > 0 && val.length>car) errors+='- '+field+' comporte '+val.length+' caractères et ne doit pas dépasser '+car+' caractères\n'; 
		    	}
				
				if (test.indexOf('isHeure')!=-1)
					if (!regHeure.exec(val)) errors+='- '+field+' doit contenir une heure valide Ex : 12:20:00\n';
				
				if (test.indexOf('isDate')!=-1 || test.indexOf('isADate')!=-1) {
					ok = false;
					if( test.indexOf('isADate')!=-1 && val=="Toujours visible")	ok = true;

					if (!regDate.exec(val) && !ok) errors+='- '+field+' doit être une date au format jj/mm/yyyy\n';
					else if (!ok) { // la date existe t-elle ?
					
						// tab_mois[0] est janvier, [11] est decembre
						var tab_mois = new Array(31,29,31,30,31,30,31,31,30,31,30,31);	
						var tab_moisList = new Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre");

						var jour = parseInt(eval(val.substring(0,2)));					
						var mois = parseInt(eval(val.substring(3,5)));												
						var an = parseInt(eval(val.substring(6,10)));
							
						// année bissextile ?
						if ((an % 100 != 0 && an % 4 == 0) || (an % 400 == 0)) { tab_mois[1] = 29; }
						else { tab_mois[1] = 28; }						
						
						var bErreur = false;
						if(mois>12 || mois<1) { 
							bErreur = true; 
							errors+='- '+field+' contient un mois invalide.\n';
						}
						if(jour>31 || jour<1) { 
							bErreur = true; 
							errors+='- '+field+' contient un jour invalide.\n';
						}
						
						if (!bErreur) {
							mois = mois - 1;
						
							// on teste si la date choisie est anterieure au lundi 20 decembre 1582
							if ((an * 10000 + mois * 100 + jour) < 15821220)
								errors+='- '+field+' contient une date antérieure au 20 décembre 1582, hors du calendrier Grégorien. Veuillez sélectionner une date plus récente.\n';
							else if (tab_mois[mois] < jour) { // on vérifie si la date est coherente
								errors+='- Il n\'y a pas ' + jour + ' jours en ' + tab_moisList[mois] + ' ' + an + ' mais ' + tab_mois[mois] + '. Veuillez choisir une autre date.\n';
							}
						}
					}								
		    	}
				if (test.indexOf('isSelect')!=-1)
					if	(val == "null" && test.charAt(0) == 'R') errors+='- La première option de la liste '+field+' n\'est pas une sélection valide. Choisissez une des autres options.\n';

				if (test.indexOf('isEntier') != -1)
			        if (!regEntier.exec(val)) errors+='- '+field+' ne doit contenir que des Entiers.\n';

				if (test.indexOf('isEntierRange') != -1) {
					d=test.indexOf(':');
					p=test.indexOf('to');											
		        	min=parseInt(test.substring(d+1,p)); max=parseInt(test.substring(p+2));
			        if (val<min || max<val) errors+='- '+field+' doit contenir un nombre Entier compris entre '+min+' et '+max+'.\n';
			    }
				if (test.indexOf('isNombreMax') != -1) {			
					d=test.indexOf('>');
					p=test.indexOf(':');						
	        		max=parseFloat(test.substring(d+1,p));
			        if (val>max) errors+='- Le rapport > ou = des champs '+field+' est incorrect.\n';
				}
				if (test.indexOf('isDecimal') != -1)
					if (!regDecimal.exec(val)) errors+='- '+field+' ne doit contenir que Chiffres et vigule.\n';		

				if (test.indexOf('isDecimalRange') != -1) {
					d=test.indexOf(':');
					p=test.indexOf('to');						
		        	min=test.substring(d+1,p); max=test.substring(p+2);						
			        if (val<min || max<val) errors+='- '+field+' doit contenir un nombre compris entre '+min+' '+val+'  et '+max+'.\n';
			    }
				if (test.indexOf('isMin') != -1) {			
					d=test.indexOf('<');
					p=test.indexOf(':');						
	        		min=test.substring(d+1,p);																		
			        if (val.length<min) errors+='- '+field+' doit comporter au moins '+min+' caractères.\n';
				}
				// fractionne aux caractères \ ou / ou  pour ne récupérer que le nom de fichier
				if (test.indexOf('isFileAll') != -1) {
				   	tab = val.split(/\\|\//);
					var ext = val.substr(val.lastIndexOf(".") + 1); 
					ext = ext.toLowerCase(); 			
					if (!regFileAll.exec(tab[tab.length-1]) || ext=="exe" || ext=="com" || ext=="bat") errors+='- '+field+' contient un NOM de fichier incorrect : \"'+tab[tab.length-1]+'\" n\'est pas un fichier valide.\nLes fichiers dont l\'extention est .exe, .com ou .bat ne sont pas autorisés.\n';		
			    }
				if (test.indexOf('isFileMov') != -1) {					
				   	tab = val.split(/\\|\//);
					if (!regFileMov.exec(tab[tab.length-1])) errors+='- '+field+' contient un NOM de fichier incorrect : \"'+tab[tab.length-1]+'\" n\'est pas un fichier Vidéo valide\n';		
			    }
				if (test.indexOf('isFileImg') != -1) {
				   	tab = val.split(/\\|\//);
					if (!regFileImg.exec(tab[tab.length-1])) errors+='- '+field+' contient un NOM de fichier incorrect : \"'+tab[tab.length-1]+'\" n\'est pas un fichier Image valide\n';		
			    }
				if (test.indexOf('isFileJPG') != -1) {
				   	tab = val.split(/\\|\//);
					if (!regFileJPG.exec(tab[tab.length-1])) errors+='- '+field+' ne doit contenir que des images .JPG/.JPEG\n';		
			    }
			    if (test.indexOf('isFileFich') != -1 || test.indexOf('isFileAnim') != -1) {
				   	tab = val.split(/\\|\//);
					if (!regFileFich.exec(tab[tab.length-1])) errors+='- '+field+' contient un NOM de fichier incorrect : \"'+tab[tab.length-1]+'\" n\'est pas un fichier valide\n';														        
			    }
				if (test.indexOf('isFileCst') != -1) {
				   	tab = val.split(/\\|\//);
					if (!regFileCst.exec(tab[tab.length-1])) errors+='- '+field+' ne doit contenir que des fichiers au format spécifié\n';		
			    }
				
				if (test.indexOf('isRadio') != -1) {
					groupe = document.getElementsByName(args[i]);	
					bCheck = false; 					
					for(j=0;j<groupe.length;j++)									
						if(groupe[j].checked == true){
							 bCheck = true;
							 break;
						}
					
					if (!bCheck) errors += '- '+field+' est obligatoire.\n';						
				}
				
				if (test.indexOf('isCheckbox') != -1) { // spec géné de form
					bCheck = false;
					var tempobjtype;
					oFgp = document.forms['ff_' + document.getElementById(args[i]).value];

					for(j=0;j<oFgp.length;j++) {
						groupe = oFgp.elements[j];				
						if (groupe.type != null) {							
							tempobjtype = groupe.type.toLowerCase();
							if (tempobjtype == "checkbox" && groupe.name.indexOf(args[i] + "_") != -1)
								if(groupe.checked == true) bCheck = true;;
						}
					}							
					if (!bCheck) errors += '- '+field+' est obligatoire.\n';										
				}
				
			} else if (test.charAt(0) == 'R') errors += '- '+field+' est obligatoire.\n';
		}
	}
	if (errors)
		alert('Veuillez corriger les données suivantes :\n\n'+errors);
	
	document.MM_returnValue = (errors == '');
}

function alertForm( sMod ) {
	switch (sMod) {
		case "rechercher" :
			alert("Recherche en cours de traitement, veuillez patienter.");
			break;
		default :
			alert("Formulaire en cours d'envoi, veuillez patienter.");
	}
}

addEvents(window, 'load', countCar);
document.getElementsByClassName = function (needle) {
	var my_array = document.getElementsByTagName("*");
	var retvalue = new Array();
	var i, j, c;
	
	for (i=0,j=0; i<my_array.length; i++) {
		c = " " + my_array[i].className + " ";
		if (c.indexOf(" " + needle + " ") != -1)
		  retvalue[j++] = my_array[i];
	}
	return retvalue;
}
function countCar() {
	var counts = document.getElementsByClassName('maxlength');
	var i, count, matches, countHolder;

	for (i=0; i<counts.length; i++)	{
		count = counts[i];	
		matches = count.className.match(/max_([0-9]+)/);
		count.maxVal = RegExp.$1;
		count.holder = document.getElementById(count.id + 'Count');
		if (count.holder) {
			count.holder.value = 'caract. maxi : ' + (count.maxVal - count.value.length);
			count.onkeyup = chkCountCar;
			count.onfocus = chkCountCar;
			count.onblur = chkCountCar;
		}
	}	
}
function chkCountCar() {
	if (this.value.length > this.maxVal) this.value = this.value.substring(0, this.maxVal);
	this.holder.value = 'caract. maxi : ' + (this.maxVal - this.value.length);	
}


function disableForm() {
	if (document.all || document.getElementById) { // ns6+ ou ie4+
		var aForm = document.forms;
		var tempobj, tempobjtype, i, ii;

		for (ii=0;ii<aForm.length;ii++) {	// tous les formulaires de la page					
			for (i=0;i<aForm[ii].length;i++) {
				tempobj = aForm[ii].elements[i];				
				if (tempobj.type != null) {
					tempobjtype = tempobj.type.toLowerCase();
					if (tempobjtype == "submit" || tempobjtype == "button" || tempobjtype == "reset" || tempobjtype == "image")
						tempobj.disabled = true;
				}
			}
		}
	}
}

// Ajoute la fonction trim comme méthode de l'objet String.
String.prototype.trim = function()
{ return this.replace(/(^\s*)|(\s*$)/g, ""); }

// test 2 dates
function DateToNumber(oFormName, oDebName, oFinName, oNbdebName, oNbfinName) {
	var oForm = document.forms[oFormName];		
	var deb = oForm.elements[oDebName].value.split("/");
	var fin = oForm.elements[oFinName].value.split("/");
	oForm.elements[oNbdebName].value = deb[2] + deb[1] + deb[0];
	oForm.elements[oNbfinName].value = fin[2] + fin[1] + fin[0];
}