function validazione(objForm, lingua, test) {
	/* ----------------------------
	Validazione campi nei forms
	TWS snc - Vicenza [Italy]
	by Marino T
		V1.0  #16/05/2002
		V1.1  #13/08/2002 - Inserito controllo validita' date
		V1.11 #26/08/2002 - Inserito controllo validita' non vuoti
		V1.12 #04/12/2002 - Migliorato il controllo email: ora si puo' inserire anche un campo vuoto
		V1.13 #12/03/2003 - Aggiunto controllo sui campi password
		V1.2  #09/05/2003 - Aggiunti parametri in input per lingua e test, sistemate variabili senza la dichiarazione esplicita
		V1.21 #18/06/2003 - Aggiunto controllo sui campi file
		V1.3  #27/02/2004 - Aggiunto controllo float
	------------------------------- */

	var msg="";
	var lin, campo, nome, blocca, xini, x, email, j, data, non_vuoto, flag_no_vuoti;

	// opzione per la fase di sviluppo: presenta tutti i campi del form
	if (test) {
		msg  =  "N.\tNome\tTipo\tValue\t\tChecked\tArray\n";
		msg += "--\t------\t-------\t--------\t\t--------\t-------\n";
		for (j = 0; j < objForm.length; j++)
			msg += j + "\t[" + objForm[j].name + "]\t(" + objForm[j].type + ")\t[" + objForm[j].value + "]\t\t[" + objForm[j].checked + "]\t[" + objForm[j].length + "]\n";

		alert (msg);
		return (false);
	}

	// decide l'indice nell'array msg
	if (lingua.toUpperCase()=="ITA")
		lin=0;
	else
		lin=1;

	var i18n = new Array(
		["Campo obbligatorio", "Obligatory field!"],
		["Campo email non conforme.\nInserire un indirizzo email valido", "Not consistent field.\nTo write a valid email"],
		["Data non valida.\nScrivere la data nella forma GG MM AAAA\nseparando i campi con . (punto) - (meno) oppure / (barra)", "Not a valid date field.\nTo write the date using pattern GG MM AAAA\nand separating the fields with . (point) - (less) or / (bar)"],
		["Tutti i campi significativi sono vuoti.\nI dati non possono essere inseriti.", "All important fields are empty.\nThe record cannot be inserted."],
		["Campo numerico non conforme", "Non consistent field!\nTo write a numeric field"],
		["Il prodotto non puņ essere su listino ricambi e vendita", "Il prodotto non puņ essere su listino ricambi e vendita"]
	);

	// ---- patterns espressioni regolari
	// tutte le parole (eliminando gli spazi prima e dopo) separate da una virgola
	var pattern_campi = /\s*,\s*/;
	// pattern per email
	var pattern_email = /^([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}$/;
	// pattern per date nella forma gg-/.mm-/.aaaa OPPURE niente (|^$)
	var pattern_data = /^([0-9]{1,2}[-\/\.]+[0-9]{1,2}[-\/\.]+[0-9]{4})$|^$/;

	// inizio controllo array -- obbligatori --
	if (objForm._valid_obbligatori) {
		var obbligatori = objForm._valid_obbligatori.value.split(pattern_campi);

		for (j = 0; j < obbligatori.length; j++) {
			// verifica il tipo di campo e pone la condizione necessaria
			campo = objForm[obbligatori[j]];
			nome = obbligatori[j];
			if (!campo.length) { // se non e' un array...
				switch (campo.type) {
					case "text":
						blocca = (campo.value == "");
						break;
					case "password":
						blocca = (campo.value == "");
						break;
					case "textarea":
						blocca = (campo.value == "");
						break;
					case "checkbox":
						blocca = !campo.checked;
						break;
					case "radio":
						blocca = !campo.checked;
						break;
					/*case "select-one": 
						blocca = (campo.value == "");
						break;*/
					/*
					case "select-multiple":
						blocca = (campo.value == "");
						break;
					*/
					case "file":
						blocca = (campo.value == "");
						break;
					default:
						blocca = false;
				}
			} else { // se e' un array di campi (proprieta' .name uguale)
				xini = 0;
				blocca = false;
				for (x = 0; x < campo.length; x++) { 
					switch (campo[x].type) {
						case "text":
							if (campo[x].value != "") xini++;
							break;
						case "textarea":
							if (campo[x].value != "") xini++;
							break;
						case "checkbox":
							if (campo[x].checked) xini++;
							break;
						case "radio":
							if (campo[x].checked) xini++;
							break;
						/*case "select-one": 
							if (campo[x].value != "") xini++;
							break;*/
						/*
						case "select-multiple":
							if (campo[x].value != "") xini++;
							break;
						*/
					}
				}
				if (xini==0) blocca=true;
			}

			// controlla la condizione per questo campo
			if (blocca) {
				avviso(nome, i18n[0][lin]);
				if (!campo.length) campo.focus();
				return (false);
			}
		}
	}
	// fine controllo array -- obbligatori --

	// inizio controllo array -- email --
	if (objForm._valid_email) {
		email = objForm._valid_email.value.split(pattern_campi);
		for (j = 0; j < email.length; j++) {
			if ((objForm[email[j]].value) && !pattern_email.test(objForm[email[j]].value)) {
				avviso(objForm[email[j]].name, i18n[1][lin]);
				objForm[email[j]].focus();
				return (false);
			}
		}
	}
	// fine controllo array -- email --

	// inizio controllo array -- data --
	if (objForm._valid_data) { 
		data = objForm._valid_data.value.split(pattern_campi);
		for (j = 0; j < data.length; j++) {
			if (!pattern_data.test(objForm[data[j]].value)) {
				avviso(objForm[data[j]].name, i18n[2][lin]);
				objForm[data[j]].focus();
				return (false);
			}
		}
	}
	// fine controllo array -- data --

	// inizio controllo array -- non vuoti --
	if (objForm._valid_no_vuoti) {
		non_vuoto = objForm._valid_no_vuoti.value.split(pattern_campi);
		flag_no_vuoti = true;
		for (j = 0; j < non_vuoto.length; j++) {
			if (objForm[non_vuoto[j]].value != "") {
				flag_no_vuoti = false;
			}
		}
		if (flag_no_vuoti) {
			avviso("-", i18n[3][lin]);
			return (false);
		}
	}
	// fine controllo array -- non vuoti --
	
	// inizio controllo array -- checkbox esclusivi --
	if (objForm._valid_esclusivi) {
		non_si = objForm._valid_esclusivi.value.split(pattern_campi);
		flag_no_si = 0;
		for (j = 0; j < non_si.length; j++) {
			if (objForm[non_si[j]][0].checked) {
				flag_no_si += 1;
			}
		}
		if (flag_no_si==non_si.length) {
			avviso("-", i18n[5][lin]);
			return (false);
		}
	}
	// fine controllo array -- esclusivi --

	// controllo numeri float
	if (objForm._valid_float) { 
	numero = objForm._valid_float.value.split(pattern_campi);
		for (j = 0; j < numero.length; j++) {
			if ((objForm[numero[j]].value) && !parseFloat(objForm[numero[j]].value)) {
				//alert("Il campo [" + objForm[numero[j]].name + "] non e' conforme.\nInserire un numero valido");
				avviso(objForm[numero[j]].name, i18n[4][lin]);
				objForm[numero[j]].focus();
				return (false);
			}
		}
	}
	// fine controllo numeri float
	
	// controllo numeri interi
	if (objForm._valid_intero) { 
	intero = objForm._valid_intero.value.split(pattern_campi);
		for (j = 0; j < intero.length; j++) {
			if ((objForm[intero[j]].value) && !parseInt(objForm[intero[j]].value)) {
				avviso(objForm[intero[j]].name, i18n[4][lin]);
				objForm[intero[j]].focus();
				return (false);
			}
		}
	}
	// fine controllo numeri interi

return (true);
}

function avviso(nome_campo, errore) {
	var msg;
	msg  = "[" + nome_campo + "] : " + errore;
	alert(msg);
	return true;
}
