/**Questa libreria necessita delle librerie:
 *	AZArray.js
 *	String_ext.js
 *	Date_ext.js
 */

/**Questa libreria gestisce la validazione dei form.
 */

var sMessageNotNullIT = "I seguenti campi sono obbligatori:";
var sMessageNotNullEN = "The following fields must be non empty:";
function bValidateNotNull(form, sFiledName)
{
	var sValue = eval(sFieldName);
	return (sValue != "");
}

var sMessageNumberIT = "I seguenti campi devono essere numeri:";
var sMessageNumberEN = "The following fields must be numbers:";
function bValidateNumber(form, sFiledName)
{
	var sValue = eval(sFieldName);
	if (sValue == "")
		return true;
	else return !isNaN(sValue);
}

var sMessageIntegerIT = "I seguenti campi devono essere numeri interi:";
var sMessageIntegerEN = "The following fields must be integer numbers:";
function bValidateInteger(form, sFieldName)
{
	var sValue = eval(sFieldName);
	if (sValue == "")
		return true;
	if (isNaN(sValue))
		return false;
	return (Math.round(sValue) == sValue);
}

var sMessageDateIT = "Le seguenti date devono essere nel formato gg/mm/aaaa\n"
	+ "e comprese tra " + sMIN_DATE + " e " + sMAX_DATE + ":";
var sMessageDateEN = "The following dates must respect the format dd/mm/yyyy\n"
	+ "and between " + sMIN_DATE + " and " + sMAX_DATE + ":";
function bValidateDate(form, sFieldName)
{
	var sValue = eval(sFieldName);
	if (sValue == "")
		return true;
	var d = new Date();
	var bRes = d.setFromItalianString(sValue);
	if (bRes)
		eval(sFieldName + " = d.toItalianString();");
	return bRes;
}

/**Chiama ripetutamente la funzione il cui nome è in sValidator.
 * @param form il form contenente i campi da convalidare
 * @param asToValidate array di stringhe con i nomi dei campi da convalidare
 * @param sValidator nome della funzione booleana di un paramentro stringa che testa la nvalidità di un singolo valore
 * @param sMessage messaggio da anteporre all'elenco dei campi non validi
 * @param asFields array di stringhe con i nomi dei campi del form
 * @param asLabels array di stringhe con le etichette corrispondenti ai campi del form
 * @return "" se tutto OK, un messaggio di errore uno o più campi non sono validi.
 */
function sValidateIterator(form, asToValidate, sValidator, sMessage, asFields, asLabels)
{
	var sMsg = "";
	var sField;
	var bValid;
	for (var i = 0; i < asToValidate.length; i++)
	{
		switch (eval("form." + asToValidate[i] + ".type"))
		{
			case "hidden":
			case "text":
			case "textarea":
			case "file":
			case "password":
				sFieldName = "form." + asToValidate[i] + ".value";
				break;
			case "select-one":
				sFieldName = "form." + asToValidate[i] + ".options[form." + asToValidate[i] + ".selectedIndex].value";
				break;
			default:
				sValue = "document.undefined"; // undefined
		}
		bValid = eval(sValidator + "(form, sFieldName)");
		if (!bValid)
			sMsg += "\n   " + asLabels[asFields.indexOf(asToValidate[i])];
	}
	if (sMsg != "")
		sMsg = sMessage + sMsg;
	return sMsg;
}

/**Inidica se i dati del form sono validi.
 * Il form deve contenere i seguento campi hidden:
 * hiddenLanguage: la sigla lingua della pagina
 * hiddenLabels: elenco delle corrispondenze
 *	<nome_campo1>=<etichetta1>,<nome_campo2>=<etichetta1>,...
 * hiddenName<nome_controllo>:  elenco dei campi che sono
 *	soggetti a al controllo <nome_controllo>
 *
 * Gli elenchi sono separati dal carattere ",". se un elemento
 * della stringa contiene il carattere "," lo si può raddoppiare
 * e scrivere ",,": in "ciao,pippo,,pippo" gli elementi sono
 *		"ciao" e "pippo,pippo"
 * non mettere spazi proma e dopo la virgola di separazione.
 * Nell'elenco delle corrispondenze <nome_campo1>=<etichetta1>
 * il separatore è "=" senza spazi prima e dopo.
 *
 * Per ciascun <nome_controllo> deve esserci una funzione booleana
 * di nome bValidate<nome_controllo>
 * il nome della variabile da controllare (contenuto in una stringa)
 * e che ritorna true e false a seconda della validità del valore.
 * Per ciascuna lingua e ciascun controllo deve esserci un
 * messaggio della forma sMessage<nome_controllo><sigla_lingua>
 * 
 * @param form il form da convalidare
 * return "" se tutto ok, il messaggio di errore se ci sono
 * problemi.
 */
function sValidate(form)
{
	/**Separatori, prefissi, suffissi, ....
	 * si possono cambiare se si vuole usare altre convenzioni 
	 */
	var sSeparator = ",";
	var sEscape = ",,";
	var sAssign = "=";
	var sLanguageField = "hiddenLanguage";
	var sLabelField = "hiddenLabels";
	var sNamePrefix = "hiddenName";
	var sValidatorPrefix = "bValidate";
	var sMessagePrefix = "sMessage";
	
	var sLanguage = eval("form." + sLanguageField + ".value");
	var sLabels = eval("form." + sLabelField + ".value");
	var asFields = sLabels.tokensToAZArrayWithEscape(sSeparator, sEscape);
	var asLabels = new AZArray(asFields.length, 0, "");
	for (var i = 0; i < asFields.length; i++)
	{
		var iPos = asFields[i].indexOf("=");
		asLabels[i] = asFields[i].substring(iPos + sAssign.length);
		asFields[i] = asFields[i].substring(0, iPos);
	}
	
	var sMsg = "";
	var sTemp;
	for (var i = 0; i < form.elements.length; i++)
	{
		var iPos = form.elements[i].name.indexOf(sNamePrefix);
		if (iPos == 0)
		{
			var sSuffix = form.elements[i].name.substring(sNamePrefix.length);
			var sToValidate = form.elements[i].value;
			var asToValidate = sToValidate.tokensToAZArrayWithEscape(sSeparator, sEscape);
			sTemp = sValidateIterator(form, asToValidate,
						sValidatorPrefix + sSuffix,
						eval(sMessagePrefix + sSuffix + sLanguage),
						asFields, asLabels);
			sMsg += (sTemp == "") ? "" : sTemp + "\n\n";
		}
	}
	if (sMsg != "")
		sMsg = sMsg.substring(0, sMsg.length - 2);
	return sMsg;
}

/**Verifica la correttezza del form, eventualmente
 * visualizzando il messaggio di errore.
 * @param form il form con i dati da controllare
 * @return true se i dati sono validi, false altrimenti.
 */
function check(form)
{
	var s = sValidate(form);
	if (s != "")
	{
		alert(s);
		return false;
	}
	return true;
}
