/**
 * Ensemble de méthodes permettant de valider un formulaire
 *
 * ################################################################
 * Méthode à appeler : CheckForm
 * Exemple :
 *   - "toto" est le champ textuel à tester
 *   - "[toto]" est le champ caché contenant les filtres
 *   - "<toto>" est le champ caché contenant la réponse
 * d'alerte en cas de test déféctueux
 *
 * La valeur du filtre tient sur 2 caractères.
 * Le premier prend la valeur "*" si le champ n'est pas obligatoire
 * sinon il prend la valeur "+" si le champ est obligatoire
 * Le second peu prendre les valeurs "N", "A", "E" ou "#" selon la
 * nature de la donnée à tester :
 *   - N : donnée numérique
 *   - A : donnée alphabétique
 *   - E : email
 *   - # : donnée alphanumérique
 * ################################################################
 *
 * @author Sébastien Fernandez, sfernandez@sdv.fr
 * @date 2003-11-03
 * @version 1.0
 **/

/**
 * Méthode retournant vrai si le type du champ est textuel
 * @param type type du champ
 * @return vrai ou faux
 **/
function isText(type)
{
	var rtn = false;
	if (type.toLowerCase() == 'text')
		rtn = true;
	if (type.toLowerCase() == 'textarea')
		rtn = true;
	if (type.toLowerCase() == 'password')
		rtn = true;
	return rtn;
}
/**
 * Méthode retournant vrai si le champ test existe
 * @param frm objet formulaire
 * @param name nom de l'objet test
 * @return vrai ou faux
 **/
function doTest(frm, name)
{
	rtn = false;
	if (frm.elements['['+name+']'])
		rtn = true;
	return rtn;
}
/**
 * Méthode découpant tous les espaces dans une chaine de caractères
 * @param value chaine de caractères
 * @return chaine de caractères
 **/
function cutSpace(value)
{
	return value.replace(/\s*/g,'').toLowerCase();
}
/**
 * Méthode retournant le(s) type(s) de filtre qui correspond à la valeur à tester
 * @param value valeur à tester
 * @param factor nombre de caractères
 * @return chaine de caractères
 **/
function getFilter(value, factor)
{
	var Filter = new Array(new RegExp("^[0-9]+$"),
			       new RegExp("^[a-z]+$"),
			       new RegExp("^[a-zA-Z0-9_-][a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,3})$"),
			       new RegExp("^([0-9]{2}\/){2}[0-9]{4}$"),
			       new RegExp("^.+$"));
	var Result = new Array('N',
			       'A',
			       'E',
			       'D',
			       '#');
	var rtn = '';
	for (var i = 0; i < Filter.length; i++)
	{
		if (value.match(Filter[i]))
			rtn += Result[i];
	}
	if ((factor == '*') && (rtn == ''))
	{
		for (i = 0; i < Filter.length; i++)
			rtn += Result[i];
	}
	return rtn;
}
/**
 * Méthode testant la valeur d'objet du formulaire
 * @param frm objet formulaire
 * @param value valeur de l'objet à tester
 * @param name nom de l'objet test
 * @return vrai ou faux
 **/
function isSuccessful(frm, value, name)
{
	var rtn    = false;
	var filter = '';
	if (frm.elements[name].value.length == 2)
	{
		filter = getFilter(value, frm.elements[name].value.charAt(0))
			for (var i = 0; i < filter.length; i++)
			{
				if (frm.elements[name].value.charAt(1) == filter.charAt(i))
					rtn = true;
			}
	}
	else
		alert("Attention: problème d'encodage du champ "+name);
	return rtn;
}
/**
 * Méthode vérifiant la présence d'une alerte personnalisée
 * @param frm objet formulaire
 * @param name nom de l'objet à tester
 * @return vrai ou faux
 **/
function doAlert(frm, name)
{
	rtn = false;
	if (frm.elements[name])
		rtn = true;
	return rtn;
}
/**
 * Méthode testant les objets textuels du formulaire
 * Retourne vrai si tous les objets textuels répondent aux critères donnés
 * @param frm objet formulaire
 * @return vrai ou faux
 **/
function CheckForm(frm)
{
	var Item   = null;
	var art    = '';
	var rtn    = true;
	for (var i = 0; i < frm.length; i++)
	{
		Item = frm.elements[i];
		if (isText(Item.type))
		{
			if (doTest(frm, Item.name))
			{
				if (!isSuccessful(frm, cutSpace(Item.value), '['+Item.name+']'))
				{
					if (doAlert(frm, '<'+Item.name+'>'))
						art += "\n"+frm.elements['<'+Item.name+'>'].value;
					else
						art += "\nProblème avec le champ : "+Item.name;
				}
			}
		}
	}
	if (art != '')
	{
		alert(art.substring(1, art.length));
		rtn = false;
	}
	return rtn;
}
