function frm_valid(objForm, lingua, test) {
	// versione 0.1
	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})$|^$/;

	if (!objForm._valid_msg) {
		alert('Debug: Nel form manca l\'indicazione del layer/div messaggi errore');
		return false;
	}
	
	// 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], objForm);
				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);
				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);
				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], objForm);
			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], objForm);
			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);
				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);
				objForm[intero[j]].focus();
				return (false);
			}
		}
	}
	// fine controllo numeri interi

return (true);
}

function avviso(nome_campo, errore, objform) {
	var msg;
	var laycontainer;
	msg  = "[" + nome_campo + "] " + errore;
	
	if (document.all) { // MS IE 4
		laycontainer=document.all[objform._valid_msg.value];
	} else if (document.getElementById) { // altri
		laycontainer=document.getElementById(objform._valid_msg.value);
	}

	laycontainer.innerHTML = "Errore validazione dati: " + msg;
	objform.elements[nome_campo].style.border="1px solid #FF0000";
	objform.focus();
	laycontainer.style.visibility = "visible";
	laycontainer.style.display = "block";

	return true;
}


// imposta la classe per i campi obbligatori
function frm_set(objForm, class_name) {
	var lin, campo, nome, blocca, xini, x, email, j, data, non_vuoto, flag_no_vuoti;
	// ---- patterns espressioni regolari
	// tutte le parole (eliminando gli spazi prima e dopo) separate da una virgola
	var pattern_campi = /\s*,\s*/;
	
	// 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]];
			campo.className+=' ' + class_name;
		}
	}
}	

// c.s. ma per tutti i forms della pagina
function frm_setall(class_name) {
	var lin, campo, nome, blocca, xini, x, email, j, data, non_vuoto, flag_no_vuoti;
	// ---- patterns espressioni regolari
	// tutte le parole (eliminando gli spazi prima e dopo) separate da una virgola
	var pattern_campi = /\s*,\s*/;
	
	for (var of=0; of=document.forms.length; of++) {
		var objForm=document.forms[of];
		
		// 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]];
				campo.className=class_name;
			}
		}
	}
}	