function testpunti(stringa, sep) {
	var sezioni = stringa.split(sep);	//divido il numero in base ai punti
	var blocchi = sezioni.length;		//conto quanti blocchi sono risultati
	for (var ind = 1; ind < blocchi; ind++) {	//controllo che ogni blocco (escluso il primo) abbia tre cifre
		if (sezioni[ind].length != 3)
			return false;
	}
	var ritorno = sezioni.join('');		//riunifico il numero senza punti
	return ritorno;
}

//Questa funzione testa un generico campo di input di un modulo; i parametri sono:
//- campoin: riferimento al campo da testare
//- descrizione: descrizione del campo, per eventuali alert di errore;
//- tipo: 'alfa', 'num'
//- minimo: lunghezza minima del campo; 0 se non è obbligatorio; -1 se non deve essere valorizzato
//- dec: solo per campi 'num', true o false a seconda che possa averne oppure no
//- dec_sep: per campi 'num', separatore dei decimali; 
//- bool_out: true se esiste un campo che deve ricevere il valore validato
//- campoout: riferimento al campo che deve ricevere il valore validato (solo se bool_out è true)
function testcampo(campoin, descrizione, tipo, minimo, dec, dec_sep, bool_out, campoout) {
        if (tipo == 'alfa') campoin.value = trim(campoin.value);     //faccio il trim per gli alfanumerici
	var lunghezza = campoin.value.length;
	if (minimo > 0) {
		if (lunghezza < minimo) {
			alert(retrieveAlert('obbl',descrizione));
			campoin.select();
			return false;
		}
	} else {
		if (lunghezza > 0 && minimo == -1) {
			alert(retrieveAlert('proib',descrizione));
			campoin.select();
			return false;
		}
	}
	if (tipo=='num' && lunghezza > 0) {
		var stringa = campoin.value;
//		stringa = stringa.replace(/\./g,"");	//elimino i punti
		if (dec) {
			var virgola = stringa.indexOf(dec_sep);
				if (virgola > -1) {
				 	virg1 = virgola + 1;
					var ultimo = stringa.length ;
				 	var interi = stringa.substring(0, virgola);
					var decimali = stringa.substring(virg1, ultimo); }
			    else { var interi = stringa; var decimali = 0; }
		} else { var interi = stringa; var decimali = 0; }
		interi = testpunti(interi,'.');
		var interi2 = parseInt(interi,10);
		var decimali2 = parseInt(decimali,10);
	    if (isNaN(interi) || isNaN(decimali) || (interi != interi2) || (decimali != decimali2)) {
	      alert(retrieveAlert('num',descrizione));
		  campoin.select();
		  return false; }
	    if (bool_out)	
			campoout.value = (dec) ? (interi + "." +  decimali) : interi ;
	} else {
    if (bool_out)	
		campoout.value = campoin.value;
	}
	return true;
}

// Questa funzione testa la validità di una data. Si occupa di sottrarre 1 al mese per renderlo compatibile
// col conteggio di JavaScript
// Restituisce un array contenente:
// - res => booleano che indica la validità della data
// - ts => timestamp in millisecondi relativo alla data
function testdata(anno, mese, giorno) {
	mese = mese - 1;
	var dataTest = new Date(anno,mese,giorno);
	var annoTest = dataTest.getFullYear();
	var meseTest = dataTest.getMonth();
	var giornoTest = dataTest.getDate();
	var risp = new Array();
	if (anno == annoTest && mese == meseTest && giorno == giornoTest) {
		risp.res = true;
		risp.ts = dataTest.getTime();
	} else {
		risp.res = false;
		risp.ts = 0;
	}
	return risp;
}

function testradio(campo,nome) {
         var chk = false;
         if (campo.length) {
                var len = campo.length;
                for (var i=0; i<len; i++) {
                    if (campo[i].checked == true)
                       chk = true;
                }
         } else {
                if (campo.checked == true) chk = true;
         }
         if (! chk)
            alert(retrieveAlert('opz',nome));
        return chk;
}

//Questa funzione è una "scorciatoia" per la chiamata di testcampo per campi alfanumerici
function testAlfa(campo, descrizione, minimo) {
         return testcampo(campo,descrizione,'alfa',minimo,false,'',false,'');
}
//Questa funzione è una "scorciatoia" per la chiamata di testcampo per campi numerici senza decimali e senza campo d'appoggio
function testInt(campo,descrizione,minimo) {
         return testcampo(campo,descrizione,'num',minimo,false,'',false,'');
}
//Questa funzione è una "scorciatoia" per la chiamata di testcampo per campi numerici con decimali senza campo d'appoggio
//Si considera che il campo venga digitato con le virgole come separatore dei decimali
function testDec(campo,descrizione,minimo) {
         return testcampo(campo,descrizione,'num',minimo,true,',',false,'');
}
//Questa funzione è una "scorciatoia" per la chiamata di testcampo per campi numerici con decimali e campo d'appoggio
//Si considera che il campo venga digitato con le virgole come separatore dei decimali
function testDecApp(campo,descrizione,minimo,appoggio) {
         return testcampo(campo,descrizione,'num',minimo,true,',',true,appoggio);
}
function testData(campo) {
         var arrData = campo.value.split('-');
         var risData = testdata(arrData[0],arrData[1],arrData[2]);
         if (! risData.res) {
            alert(retrieveAlert('date',null));
            campo.select();
            return false;
         }
         return true;
}
function testOra(campo) {
         var arrOra = campo.value.split('.');
         if (arrOra.length < 2 || isNaN(arrOra[0]) || isNaN(arrOra[1])) {
            alert(retrieveAlert('time',null));
            campo.select();
            return false;
         }
         var ore = parseInt(arrOra[0],10);
         var minuti = parseInt(arrOra[1],10);
         if (ore < 0 || ore > 23 || minuti < 0 || minuti > 59) {
            alert(retrieveAlert('time',null));
            campo.select();
            return false;
         }
         return true;
}
function testDataOra(campoData,ora) {
         if (! testData(campoData) || ! testOra(ora))
            return false;
         return true;
}
// questa funzione effettua il trim di una stringa
function trim(s) {
  // spazi e \n\r all'inizio
  while ((s.substring(0,1) == ' ') || (s.substring(0,1) == '\n') || (s.substring(0,1) == '\r')) {
    s = s.substring(1,s.length);
  }
  // spazi e \n\r alla fine
  while ((s.substring(s.length-1,s.length) == ' ') || (s.substring(s.length-1,s.length) == '\n') || (s.substring(s.length-1,s.length) == '\r')) {
    s = s.substring(0,s.length-1);
  }
  return s;
}

//questa funzione restituisce un array di campi con un determinato nome (o il cui nome inizia per...)
function fieldsArray(fieldName,modulo,completo) {with(modulo) {
         var lunghezza = fieldName.length;
         var numCampi = length;
         var arrayCampi = new Array(); var j=0;
         for (var i=0; i<length; i++) {
             if (completo) {
               if (elements[i].name == fieldName)
                 arrayCampi[j++] = elements[i];
             } else {
               if (elements[i].name.substr(0,lunghezza) == fieldName)
                 arrayCampi[j++] = elements[i];
             }
         }
         return arrayCampi;
}}
function fieldsArrayName(fieldName,modulo) {return fieldsArray(fieldName,modulo,true);}
function fieldsArrayPrefix(fieldName,modulo) {return fieldsArray(fieldName,modulo,false);}

//questa funzione riceve una stringa (nome di campo) contenente un indice tra parentesi quadre, e restituisce il valore di tale indice
function nameIndex(fieldName) {
         var q1 = fieldName.lastIndexOf('[');
         var q2 = fieldName.lastIndexOf(']');
         if (q1 == -1 || q2 == -1) return null;
         if (q1 >= q2) return null;
         return fieldName.substr((q1+1),(q2-q1-1));
}

function round(value,decimals) {
         var f = Math.pow(10,decimals);
         var v1 = value * f;
         var v2 = Math.round(v1);
         return v2/f;
}
function lunghezza(field) {
   var str = trim(field.value);
   return str.length;
}
function emailCheck(emailField) {
	var emailAdd=emailField.value;
	if (window.RegExp) {
		var nonvalido = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)";
		var valido = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
		var regnv = new RegExp(nonvalido);
		var regv = new RegExp(valido);
		if (!regnv.test(emailAdd) && regv.test(emailAdd)){
			  }
		else {
            alert(retrieveAlert('email',null));
			emailField.select();
			return false;
		}
	}
	else {
		if(emailAdd.indexOf("@") >= 0){
		}
		else {
            alert(retrieveAlert('email',null));
			emailField.select();
			return false;
		}
	}
	return true;
}
function retrieveAlert(msg,desc) {
  switch(msg) {
	case 'obbl':
	    if (english)
	        return desc + ' field is mandatory';
	    else
	        return 'Campo ' + desc + ' obbligatorio';
	 	break;
	 case 'proib':
	    if (english)
	        return 'You can\'t type in ' + desc + ' field';
	    else
	        return 'Non puoi valorizzare il campo ' + desc;
	 	break;
	 case 'num':
	    if (english)
	        return 'You must digit a numeric value in ' + desc + ' field';
	    else
	        return "Devi inserire un valore numerico per il campo " + desc;
	 	break;
	 case 'opz':
	    if (english)
	        return 'You must choose an option for \'' + desc + '\'';
	    else
	        return 'Devi scegliere un\'opzione per \'' + desc + '\'';
	 	break;
	 case 'date':
	    if (english)
	        return 'Date is not valid';
	    else
	        return 'Data non valida';
	 	break;
	 case 'time':
	    if (english)
	        return 'Time is not valid';
	    else
	        return 'Ora non valida';
	 	break;
	 case 'email':
	    if (english)
	        return 'Please type a valid e-mail address';
	    else
	        return 'Si prega di inserire un indirizzo email valido';
	 	break;
	 default:
		return 'Unknown error';
  }
}
