
function valideForm(f) {
	var champsObligatoires = [];
	var erreurs = [];
	var adresse1;

	function textePrecedent(element) {
		var ELEMENTNODE = 1;
		var TEXTNODE = 3;

		if(!element.nodeType) return "no nodetype";

		while((element.nodeType != TEXTNODE) || (element.nodeValue.search(/^\s*$/) == 0)) {

			if(element.previousSibling)
				element = element.previousSibling;

			else if(element.parentNode && element.parentNode.previousSibling)
				element = element.parentNode.previousSibling;

			else return;


			while((element.nodeType == ELEMENTNODE) && element.lastChild)
				element = element.lastChild;
		}
		return element.nodeValue;
	}


	function valideEmail(adr1) {
		adresse1 = adr1;
		if(adresse1 && !estVide(adresse1)) {
			if(adresse1.length > 100)
				erreurs.push('This email address is too long.');

			var atom = "[!#-'*+\\-\\/-9=?A-Z^-~]+";
			var regex_adresse =
				new RegExp("^"+atom+"(\\."+atom+")*@"+atom+"(\\."+atom+")*\\.[a-zA-Z]{2,4}$");
			if(adresse1.search(regex_adresse) != 0)
				erreurs.push("Adresse invalide.");

		}
		else if(champsObligatoires["email"])
			erreurs.push("You forgot the email address.");
	}

	function confirmeEmail(adresse2) {
		if(adresse2) {
			if(adresse1 && (adresse2 != adresse1))
				erreurs.push("Il y a une faute de frappe entre les deux adresses entrées.");
		}
		else if(champsObligatoires["email2"])
			erreurs.push("La confirmation d'adresse email est obligatoire.");
	}



	function estVide(valeur) {
		return (!valeur || (valeur.search(/^[\n\r]*(.)\1*[\n\r]*$/) >= 0));
	}


	if(!f) f = document.forms[0];
	erreurs = [];
	adresse1 = '';
	var erreursFatales = [];


	var nom, node, texte;
	var radios = [];
	var multiples = [];
	for(var i = 0; i < f.elements.length; i++) {
		node = f.elements[i];
		nom = node.name;


		texte = textePrecedent(node);
		if(texte && texte.search(/\*\s*$/) >= 0)
			champsObligatoires[nom] = 1;


		if((node.type == 'checkbox') || (node.type == 'select-multiple')) {

			if(nom.substr(nom.length-2) != '[]') {
				if(!multiples[nom]) multiples[nom] = {t:node.type, n:0};
				multiples[nom].n++;
			}
		} else
			if(nom.substr(nom.length-2) == '[]')
				erreurs.push("Le champ "+nom+" n'est ni de type checkbox ni de "+
				"type select-multiple, son nom ne doit pas se terminer par []");
		if(nom == "email") valideEmail(node.value);
		else if(nom == "email2") confirmeEmail(node.value);
		else if(champsObligatoires[nom]) {
			if((node.type == 'radio') ||
			   (node.type == 'checkbox')) {
				if(radios[nom] == undefined) radios[nom] = false;
				radios[nom] |= node.checked;
			}
			else
			if(((node.type == 'select-one') && !node.selectedIndex) ||
			   ((node.type == 'select-multiple') && (node.selectedIndex < 0)) ||
				estVide(node.value))
				erreurs.push("You forgot the "+nom+" field.");
		}
	}

	for(var r in radios)
		if(!radios[r]) erreurs.push("You forgot the "+r+" est field.");


	for(var m in multiples)
		if(multiples[m].n > 1)
			erreursFatales.push("Le champ "+m+" est de type "+multiples[m].t+
				" et peut prendre plusieurs valeurs, son nom doit se terminer par []");

	if(erreursFatales.length) {
		alert("ATTENTION :\n"+erreursFatales.join("\n"));
		return false;
	}
	if(erreurs.length) {
		alert(erreurs.join("\n"));
		return false;
	}
	return true;
}
