// ***************************************
// **** UTILITY FUNCTIONS - VER.3.5.0 ****
// ***************************************
// Vedi documentazione (20050802_UtilityFunctions.rtf e 20050802_ValidazioneForm.rtf).


// ****************************
// **** FUNZIONI GENERICHE ****
// ****************************

// funzioni per togliere gli spazi vuoti prima e dopo una stringa
function strltrim(){
  return this.replace(/^\s+/,'');
}
function strrtrim(){
	return this.replace(/\s+$/,'');
}
function strtrim(){
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
}
String.prototype.ltrim = strltrim;
String.prototype.rtrim = strrtrim;
String.prototype.trim = strtrim;


// ***********************************************************
// **** MAPPATURA CARATTERI SPECIALI UNICODE PER Reg.Exp. ****
// ***********************************************************

// caratteri accentati e altri speciali
var unicodeSpecialChars = '';
codList = '138,154,156,158,159,181,192,193,194,195,196,';
codList += '197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,';
codList += '217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,';
codList += '235,236,237,238,239,240,241,242,243,244,245,246,249,250,251,252,253,254,255';
codArray = codList.split(',');
for (i=0; i<codArray.length; i++){
	unicodeSpecialChars += String.fromCharCode(codArray[i]);
}

// punteggiatura (escaped)
var unicodePunctChars = '';
codList = '33,34,38,39,40,41,44,45,46,47,58,59,60,62,63,91,92,93,94,95,96,123,124,125,126,130,132,133,';
codList += '136,139,145,146,147,148,149,150,151,152,155,161,167,168,171,173,175,180,182,183,187,191';
codArray = codList.split(',');
for (i=0; i<codArray.length; i++){
	unicodePunctChars += String.fromCharCode(92) + String.fromCharCode(codArray[i]);
}

// simboli matematici e di valuta (escaped)
var unicodeCrLfTabSp = '';
codList = '9,10,13,20';
codArray = codList.split(',');
for (i=0; i<codArray.length; i++){
	unicodeCrLfTabSp += String.fromCharCode(92) + String.fromCharCode(codArray[i]);
}

// simboli matematici e di valuta (escaped)
var unicodeSymbolChars = '';
codList = '35,36,37,43,45,64,128,131,137,153,162,170,176,178,179,185,186,163,165,169,174,188,189,190,215,216,247,248';
codArray = codList.split(',');
for (i=0; i<codArray.length; i++){
	unicodeSymbolChars += String.fromCharCode(92) + String.fromCharCode(codArray[i]);
}

// caratteri ammessi per l'URL di una pagina web
var unicodeUrlChars = '';
codList = '35,36,37,43,45,64,33,38,39,40,41,44,46,47,58,59,';
codList += '60,62,63,91,92,93,94,95,123,124,125,126,136,152';
codArray = codList.split(',');
for (i=0; i<codArray.length; i++){
	unicodeUrlChars +=  String.fromCharCode(codArray[i]);
}

// caratteri ammessi per username
var unicodeUsernameChars = '';
codList = '45,46,95';
codArray = codList.split(',');
for (i=0; i<codArray.length; i++){
	unicodeUsernameChars += String.fromCharCode(92) + String.fromCharCode(codArray[i]);
}
	

// ****************************************************
// **** FUNZIONI GENERICHE DI VALIDAZIONE DEI DATI ****
// ****************************************************


//funzione che restituisce true solo se il campo di input contiene una Username valida
function isUsername(inputField,acceptEmpty){
	var message = msgUsername;
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	message = message + '\n' + msgAcceptUsernameChars;
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	var re = new RegExp('^[a-zA-Z0-9][a-zA-Z0-9' + unicodeUsernameChars + ']+[a-zA-Z0-9]$');
	if (!inputField.value.match(re)){
		alert(message);
		return false;
	}
	return true;
}

//funzione che restituisce true solo se il campo di input contiene una stringa alfanumerica
function isAlfanumeric(inputField,acceptEmpty,acceptWhiteSpace,acceptPunctuation){
	var message = msgAlfanum;
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (acceptPunctuation) {
		message = message + '\n' + msgAcceptPunctuation;
	}
	if (acceptWhiteSpace){
		message = message + '\n' + msgAcceptWhiteSpace;
	}
	if (!(acceptWhiteSpace)&&!(acceptPunctuation)){
		message = message + '\n' + msgOnlyChars;
	}
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	if ((acceptPunctuation)&&(acceptWhiteSpace)){
		var re = new RegExp('^[a-zA-Z0-9' + unicodeCrLfTabSp + unicodePunctChars + ' ]+$');
	} else if (acceptPunctuation){
		var re = new RegExp('^[a-zA-Z0-9' + unicodePunctChars + ']+$');
	} else if (acceptWhiteSpace){
		var re = new RegExp('^[a-zA-Z0-9' + unicodeCrLfTabSp + ' ]+$');
	} else {
		var re = new RegExp('^[a-zA-Z0-9]+$');
	}
	if (!inputField.value.match(re)){
		alert(message);
		return false;
	}
	return true;
}

// funzione che restituisce true solo se il campo di input contiene una stringa di sole lettere
function isString(inputField,acceptEmpty,acceptWhiteSpace,acceptPunctuation){
	var message = msgAlfanum;
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (acceptPunctuation){
		message = message + '\n' + msgAcceptPunctuation;
	}
	if (acceptWhiteSpace){
		message = message + '\n' + msgAcceptWhiteSpace;
	}
	if (!(acceptWhiteSpace)&&!(acceptPunctuation)){
		message = message + '\n' + msgOnlyLetters;
	}
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	if ((acceptPunctuation)&&(acceptWhiteSpace)){
		var re = new RegExp('^[a-zA-Z0-9' + unicodeCrLfTabSp + unicodeSpecialChars + unicodePunctChars + unicodeSymbolChars + ' ]+$');
	} else if (acceptPunctuation){
		var re = new RegExp('^[a-zA-Z0-9' + unicodeSpecialChars + unicodePunctChars + unicodeSymbolChars + ']+$');
	} else if (acceptWhiteSpace){
		var re = new RegExp('^[a-zA-Z0-9' + unicodeCrLfTabSp + unicodeSpecialChars + unicodeSymbolChars + ' ]+$');
	} else {
		var re = new RegExp('^[a-zA-Z0-9' + unicodeSpecialChars + unicodeSymbolChars + ']+$');
	}
	if (!inputField.value.match(re)){
		alert(message);
		return false;
	}
	return true;
}

//funzione che verifica un ID valido
function isValidId(inputField,acceptEmpty){
	var message = msgIdAlfanum;
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	var re = new RegExp('^[a-zA-Z][a-zA-Z0-9\_]+[a-zA-Z0-9]$');
	if (!inputField.value.match(re)){
		alert(message);
		return false;
	}
	return true;
}

// funzione che verifica se il campo di input contiene una sequenza di numeri separati da "delimiter" (default ',')
function isValidNumberList(inputField,acceptEmpty,delimiter){
	var message = msgNumberList +  ' \'' + delimiter + '\'';
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	if (!delimiter) var delimiter = ',';
	var re = new RegExp('^[ ]?[0-9]+[ ]?$');
	if (inputField.value.indexOf(delimiter)>=0){
		var tmpArray = inputField.value.split(delimiter);
		for (i = 0 ; i < tmpArray.length ; i++){
			if (!tmpArray[i].match(re)){
				alert(message);
				return false;
			}
		}
	} else {
		if (!inputField.value.match(re)){
			alert(message);
			return false;
		}
	}
	return true;
}

// funzione che verifica se il campo di input contiene una sequenza di stringhe separate da "delimiter" (default ',')
function isValidStringList(inputField,acceptEmpty,acceptWhiteSpace,acceptPunctuation,delimiter){
	if (!delimiter) var delimiter = ',';
	var message = msgWordList + ' \'' + delimiter + '\'';
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (acceptPunctuation){
		message = message + '\n' + msgAcceptPunctuation;
	}
	if (acceptWhiteSpace){
		message = message + '\n' + msgAcceptWhiteSpace;
	}
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	if (unicodeSpecialChars.indexOf(delimiter)>=0){
		aChars = unicodeSpecialChars.split(delimiter);
		unicodeSpecialChars = aChars[0] + aChars[1];
	}
	if (unicodePunctChars.indexOf(String.fromCharCode(92)+delimiter)>=0){
		aChars = unicodePunctChars.split(String.fromCharCode(92)+delimiter);
		unicodePunctChars = aChars[0] + aChars[1];
	}
	if (unicodeSymbolChars.indexOf(String.fromCharCode(92)+delimiter)>=0){
		aChars = unicodeSymbolChars.split(String.fromCharCode(92)+delimiter);
		unicodeSymbolChars = aChars[0] + aChars[1];
	}
	if ((acceptPunctuation)&&(acceptWhiteSpace)){
		var re = new RegExp('^[ ]?[a-zA-Z0-9' + unicodeCrLfTabSp + unicodeSpecialChars + unicodePunctChars + ' ]+[ ]?$');
	} else if (acceptPunctuation){
		var re = new RegExp('^[ ]?[a-zA-Z0-9' + unicodeSpecialChars + unicodePunctChars + ']+[ ]?$');
	} else if (acceptWhiteSpace){
		var re = new RegExp('^[ ]?[a-zA-Z0-9' + unicodeCrLfTabSp + unicodeSpecialChars + ' ]+[ ]?$');
	} else {
		var re = new RegExp('^[ ]?[a-zA-Z0-9' + unicodeSpecialChars + ']+[ ]?$');
	}
	if (inputField.value.indexOf(delimiter)>=0){
		var tmpArray = inputField.value.split(delimiter);
		for (i = 0 ; i < tmpArray.length ; i++){
			if (!tmpArray[i].match(re)){
				alert(message);
				return false;
			}
		}
	} else {
		if (!inputField.value.match(re)){
			alert(message);
			return false;
		}
	}
	return true;
}

// funzione che verifica se il campo di input contiene una stringa di lunghezza compresa tra minLength e maxLength
function isValidLengthRange(inputField,minLength,maxLength){
	var message = msgCharRange + ' ' + minLength + ' ' + msgAnd + ' ' + maxLength;
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (inputField.value.length >= minLength && inputField.value.length <= maxLength){
		return true;
	} else {
		alert(message);
		return false;
	}
}

// funzione che fa il match del valore contenuto nel campo con una Regular Expression generica passata come parametro
function isMatchingRegExp(inputField,acceptEmpty,regExp){
	if ((regExp)&&(regExp!='')){
		var message = msgRegExp + ' \'' + regExp + '\'';
		if ((msgFieldName)&&(msgFieldName!='')){
			message = message + ' ' + msgIntoField + ' ' + msgFieldName;
		}
		if (inputField.value==''){
			if (acceptEmpty){
				return true;
			} else {
				alert(message);
				return false;
			}
		}
		if (!inputField.value.match(regExp)){
			alert(message);
			return false;
		}
	}
	return true;
}

// funzione che verifica se il campo di input file contiene un'immagine nel formato richiesto
function isImage(inputField,acceptEmpty,imageFormat){
	imageFormat = imageFormat.toLowerCase();
	var message = msgImage + ' ' + imageFormat;
	if ((msgFieldName)&&(msgFieldName!='')){
		message = message + ' ' + msgIntoField + ' ' + msgFieldName;
	}
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	var aImageName = inputField.value.split('.');
	var imageExt = aImageName[aImageName.length-1].toLowerCase();
	if (imageExt==imageFormat){
		return true;
	} else {
		alert(message);
		return false;
	}
}


// ********************************************************************
// **** FUNZIONI DI VALIDAZIONE DEI DATI SECONDO LA LORO TIPOLOGIA ****
// ********************************************************************

// **** DATA ****
// carattere separatore per le date, anno minimo e massimo
var dtCh= '/';
var minYear=1900;
var maxYear=2100;

// funzione che controlla che una stringa contenga solo numeri interi
function isInteger(str){
	var i;
	for (i = 0; i < str.length; i++){
		var chr = str.charAt(i);
		if ((chr < '0') || (chr > '9')) return false;
    }
    return true;
}

// funzione che cerca i caratteri contenuti nella stringa str all'interno di bag e restituisce i caratteri non presenti
function stripCharsInBag(str, bag){
	var i;
	var returnString = '';
   for (i = 0; i < str.length; i++){
	   var chr = str.charAt(i);
	   if (bag.indexOf(chr) == -1){
	   	returnString += chr;
	   }
	}
	return returnString;
}

// funzione che calcola se l'anno passato come parametro è bisestile
// Un anno è bisestile se divisibile per 4, tranne che se sia divisibile per 100,
// ma è bisestile se divisibile per 400
function daysInFebruary(year){
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

// funzione che crea un array di N elementi (1 per ogni mese dell'anno)
// ogni elemento contiene il numero di giorni di cui e' composto il mese
function DaysArray(n){
	for (var i = 1; i <= n; i++){
		this[i] = 31;
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this;
}

// funzione che controlla i valori di giorno, mese e anno di una data nel formato gg/mm/aaaa o g/m/aaaa
function isDate(dataStr, internazionale){
	var daysInMonth = DaysArray(12);
		var pos1;
		var pos2;
		var strYear;
		var strMonth;
		var strDay;
	if(internazionale) {
		dtCh='-';
		pos1=dataStr.indexOf(dtCh);
		pos2=dataStr.indexOf(dtCh,pos1+1);
		strYear=dataStr.substring(0,pos1);
		strMonth=dataStr.substring(pos1+1,pos2);
		strDay=dataStr.substring(pos2+1);
	}else {
		pos1=dataStr.indexOf(dtCh);
		pos2=dataStr.indexOf(dtCh,pos1+1);
		strDay=dataStr.substring(0,pos1);
		strMonth=dataStr.substring(pos1+1,pos2);
		strYear=dataStr.substring(pos2+1);
	}
	strYr=strYear;
	if (strDay.charAt(0)=='0' && strDay.length>1){
		strDay=strDay.substring(1);
	}
	if (strMonth.charAt(0)=='0' && strMonth.length>1){
		strMonth=strMonth.substring(1);
	}
	for (var i = 1; i <= 3; i++){
		if (strYr.charAt(0)=='0' && strYr.length>1){
			strYr=strYr.substring(1);
		}
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1){
		if(internazionale) {
			alert(msgDateWorld);
		}else{
			alert(msgDate);
		}
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert(msgMonth);
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert(msgDay);
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert(msgYear);
		return false;
	}
	if (dataStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dataStr, dtCh))==false){
		if(internazionale) {
			alert(msgDateWorld);
		}else{
			alert(msgDate);
		}
		return false;
	}
	return true;
}

//funzione che restituisce true solo se il campo di input contiene una data nel formato gg/mm/aaaa o g/m/aaaa
function isValidDate(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoDate);
			return false;
		}
	}
	var re = new RegExp('^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$');
	if (!inputField.value.match(re)){
		alert(msgDate);
		return false;
	} else {
		return isDate(inputField.value, false);
	}
}
function isValidDateWorld(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoDate);
			return false;
		}
	}
	var re = new RegExp('^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$');
	if (!inputField.value.match(re)){
		alert(msgDateWorld);
		return false;
	} else {
		return isDate(inputField.value, true);
	}
}

// DEPRECATED, richiamo alla funzione sopra per i siti sviluppati prima del 20/09/2005
function ValidateDate(inputField,acceptEmpty){
	return isValidDate(inputField,acceptEmpty);
}

//funzione che restituisce true solo se il campo di input contiene un anno / mese / giorno 
function isValidYear(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoYear);
			return false;
		}
	}
	var re = new RegExp('^[12][0-9][0-9][0-9]$');
	if (!inputField.value.match(re)){
		alert(msgYear);
		return false;
	}
	return true;
}
function isValidMonth(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoMonth);
			return false;
		}
	}
	var re = new RegExp('^(0?[1-9])|(1[012])$');
	if (!inputField.value.match(re)){
		alert(msgMonth);
		return false;
	}
	return true;
}
function isValidDay(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoDay);
			return false;
		}
	}
	var re = new RegExp('^(0[1-9])|(1[0-9])|(2[0-9])|(3[01])$');
	if (!inputField.value.match(re)){
		alert(msgDay);
		return false;
	}
	return true;
}

//funzione che restituisce true solo se il campo di input contiene un ora nel formato HH:mm
function isValidTime(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoTime);
			return false;
		}
	}
	var re = new RegExp('^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
	if (!inputField.value.match(re)){
		alert(msgTime);
		return false;
	}
	return true;
}

// **** NUMERO ****
// funzione che restituisce true solo se il campo di input contiene un numero
// convalida numeri interi o float con un numero di decimali compreso fra 0 e decimalPositions
// decimalSeparator: 0=(default) acceta virgola o punto; 1=solo la virgola; 2=solo il punto;
// decimalPositions: numero di decimali dopo la virgola (default=0);
// digitPositions: numero di cifre del numero intero prima della virgola (default=non definito)
function isNumber(inputField,acceptEmpty,decimalPositions,decimalSeparator,digitPositions){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoNumber);
			return false;
		}
	}
	if (!decimalSeparator) var decimalSeparator = 0;
	if (decimalSeparator>2) var decimalSeparator = 0;
	if (!decimalPositions) var decimalPositions = 0;
	if ((!digitPositions)||(digitPositions==0)){
		var digitPositions = '+';
	} else {
		digitPositions = '{'+ digitPositions +'}';
	}
	var validateNumber = false;
	var reInt = new RegExp('^[0-9]'+ digitPositions +'$');
	if (inputField.value.match(reInt)) validateNumber = true;
	if (decimalPositions>0){
		if (decimalSeparator==0){
			var reDec = new RegExp('^[0-9]' + digitPositions + '([,\.][0-9]{1,' + decimalPositions + '})?$');
		} else if (decimalSeparator==1){
			var reDec = new RegExp('^[0-9]' + digitPositions + '([,][0-9]{1,' + decimalPositions + '})?$');
		} else if (decimalSeparator==2){
			var reDec = new RegExp('^[0-9]' + digitPositions + '([\.][0-9]{1,' + decimalPositions + '})?$');
		}
		if (inputField.value.match(reDec)) validateNumber = true;
	}
	if (!validateNumber){
		alert(msgNumber);
	}
	return validateNumber;
}

// **** URL (sito/dominio o pagina) ****
//funzione che restituisce true solo se il campo di input contiene un url valido
function isValidUrl(inputField,acceptEmpty,withHttp){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoUrl);
			return false;
		}
	}
	if ((withHttp) && ((inputField.value.indexOf('http://')<0)||(inputField.value.indexOf('https://')<0))){
		alert(msgUrlHttp);
		return false;
	} else if ((!withHttp) && ((inputField.value.indexOf('http://')>=0)||(inputField.value.indexOf('https://')>=0))){
		alert(msgUrlNoHttp);
		return false;
	}
	
	var reDomain = new RegExp('^[a-zA-Z0-9\.\\-_]+\.[a-zA-Z]{2,4}$');
	var rePage = new RegExp('^[a-zA-Z0-9'+ unicodeUrlChars +']+$');
	var url = inputField.value.replace('http://','').replace('https://','');
	if (url.indexOf('?')>=0){
		url = url.slice(0,url.indexOf('?'));
	}
	if (url.indexOf('/')>=0){
		var aUrl = url.split('/');
		if (!aUrl[0].match(reDomain)){
			alert(msgUrl);
			return false;
		} else {
			for (i=1; i<aUrl.length; i++){
				if (!aUrl[i].match(rePage)){
					alert(msgUrl);
					return false;
					break;
				}
			}
		}
	} else {
		if (!url.match(reDomain)){
			alert(msgUrl);
			return false;
		}
	}
	/*
	if (!pageUrl.match(re)){
		var domainUrl = pageUrl.slice(0,inputField.value.indexOf('/'));
		if (!domainUrl.match(re)){
			var domainUrl = pageUrl.slice(0,inputField.value.indexOf('?'));
			if (!domainUrl.match(re)){
				alert(msgUrl);
				return false;
			} else {
				var pageUrl = pageUrl.slice(inputField.value.indexOf('?'),pageUrl.length);
			}
		} else {
			var pageUrl = pageUrl.slice(inputField.value.indexOf('/'),pageUrl.length);
		}
	}
	if (!pageUrl.match(re)){
		alert(msgUrl);
		return false;
	}
	*/
	return true;
}

// **** INDIRIZZI IP ****
// funzione che restituisce true solo se il campo di input contiene una IP valido
function isValidIPAddress(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoIPAddress);
			return false;
		}
	}
	var re = new RegExp('^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$');
	if (!inputField.value.match(re)){
		alert(msgIPAddress);
		return false;
	}
	return true;
}

// **** E-MAIL ****
// funzione che restituisce true solo se il campo di input contiene una e-mail valida
function isValidEmail(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoEmail);
			return false;
		}
	}
	// var re = new RegExp('^[a-zA-Z0-9][a-zA-Z0-9_\\-]*(\\.[a-zA-Z0-9_\\-]+)*(\\.)?[a-zA-Z0-9]@[a-zA-Z0-9][a-zA-Z0-9_\\-]*(\\.[a-zA-Z0-9_\\-]+)*[a-zA-Z0-9]\\.[a-zA-Z]{2,4}(\\.[a-zA-Z]{2})?$');
	var re = new RegExp('^[a-zA-Z0-9_\\-]+(\\.[a-zA-Z0-9_\\-]+)*@[a-zA-Z0-9_\\-]+(\\.[a-zA-Z0-9_\\-]+)*\\.[a-zA-Z]{2,4}(\\.[a-zA-Z]{2})?$');
	if (!inputField.value.match(re)){
		alert(msgEmail);
		return false;
	}
	return true;
}

// **** CODICE FISCALE ****
// funzione che verifica se il campo contiene un codice fiscale corretto
function isValidCodiceFiscale(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoCodFisc);
			return false;
		}
	}
	var re = new RegExp('^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$');
	if (!inputField.value.match(re)){
		alert(msgCodFisc);
		return false;
	}
	return true;
}

// **** PARTITA IVA ****
// funzione che verifica se il campo contiene una partita IVA corretta
function isValidPartitaIva(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoIva);
			return false;
		}
	}
	var re = new RegExp('^[0-9]{11}$');
	if (!inputField.value.match(re)){
		alert(msgIva);
		return false;
	}
	return true;
}

// **** CODICE FISCALE / PARTITA IVA (AZIENDALE) ****
// funzione che verifica se il campo contiene un codice fiscale corretto
function isValidCodiceFiscaleIva(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoCodFisc);
			return false;
		}
	}
	var reA = new RegExp('^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$');
	var reB = new RegExp('^[0-9]{11}$');
	if ((!inputField.value.match(reA))&&(!inputField.value.match(reB))){
		alert(msgCodFisc);
		return false;
	}
	return true;
}

// **** CAP ****
// funzione che verifica se il campo contiene un CAP corretto
function isValidZipCode(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoZipCode);
			return false;
		}
	}
	var re = new RegExp('^[0-9]{5}$');
	if (!inputField.value.match(re)){
		alert(msgZipCode);
		return false;
	}
	return true;
}
function isValidZipCodeWorld(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoZipCode);
			return false;
		}
	}
	var re = new RegExp('^[0-9A-Za-z]{1,4}[ \\-]?[0-9A-Za-z]{1,4}$');
	if (!inputField.value.match(re)){
		alert(msgZipCode);
		return false;
	}
	return true;
}

// **** TELEFONO ****
// funzione che verifica se il campo contiene un numero di telefono italiano corretto
function isValidTel(inputField,acceptEmpty,acceptSeparator){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoTel);
			return false;
		}
	}
	if (acceptSeparator){
		//var re = new RegExp('^0?[0-9]{1,3}[ \\-\.\/]?[1-9][0-9]{4,7}$');
		var re = new RegExp('^0?[0-9]{1,3}[ \\-\.\/]?[ 0-9]{5,12}$');
	} else {
		//var re = new RegExp('^0?[0-9]{1,3}[1-9][0-9]{4,7}$');
		var re = new RegExp('^0?[0-9]{1,3}[0-9]{5,8}$');
	}
	if (!inputField.value.match(re)){
		alert(msgTel);
		return false;
	}
	return true;
}
function isValidTelWorld(inputField,acceptEmpty,acceptSeparator){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoTel);
			return false;
		}
	}
	if (acceptSeparator){
		//var re = new RegExp('^((\\+|00)[0-9]{1,4}[ \\-\.\/]?)?[0-9]{1,4}[ \\-\.\/\]?[0-9]{4,8}$');
		var re = new RegExp('^((\\+|00)[0-9]{1,4}[ \\-\.\/]?)?[0-9]{1,4}[ \\-\.\/\]?[ 0-9]{5,12}$');
	} else {
		//var re = new RegExp('^((\\+|00)[0-9]{1,4})?[0-9]{1,4}[0-9]{4,8}$');
		var re = new RegExp('^((\\+|00)[0-9]{1,4})?[0-9]{1,4}[0-9]{4,8}$');
	}
	if (!inputField.value.match(re)){
		alert(msgTel);
		return false;
	}
	return true;
}

// **** FAX ****
// funzione che verifica se il campo contiene un numero di fax italiano corretto
function isValidFax(inputField,acceptEmpty,acceptSeparator){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoFax);
			return false;
		}
	}
	if (acceptSeparator){
		//var re = new RegExp('^0?[0-9]{1,3}[ \\-\.\/]?[1-9][0-9]{4,7}$');
		var re = new RegExp('^0?[0-9]{1,3}[ \\-\.\/]?[ 0-9]{5,12}$');
	} else {
		//var re = new RegExp('^0?[0-9]{1,3}[1-9][0-9]{4,7}$');
		var re = new RegExp('^0?[0-9]{1,3}[0-9]{5,8}$');
	}
	if (!inputField.value.match(re)){
		alert(msgFax);
		return false;
	}
	return true;
}
function isValidFaxWorld(inputField,acceptEmpty,acceptSeparator){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoFax);
			return false;
		}
	}
	if (acceptSeparator){
		//var re = new RegExp('^((\\+|00)[0-9]{1,4}[ \\-\.\/]?)?[0-9]{1,4}[ \\-\.\/]?[0-9]{4,8}$');
		var re = new RegExp('^((\\+|00)[0-9]{1,4}[ \\-\.\/]?)?[0-9]{1,4}[ \\-\.\/\]?[ 0-9]{5,12}$');
	} else {
		//var re = new RegExp('^((\\+|00)[0-9]{1,4})?[0-9]{1,4}[0-9]{4,8}$');
		var re = new RegExp('^((\\+|00)[0-9]{1,4})?[0-9]{1,4}[0-9]{4,8}$');
	}
	if (!inputField.value.match(re)){
		alert(msgFax);
		return false;
	}
	return true;
}

// **** CELLULARE ****
// funzione che verifica se il campo contiene un numero di cellulare italiano corretto
function isValidCell(inputField,acceptEmpty,acceptSeparator){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoCell);
			return false;
		}
	}
	if (acceptSeparator){
		//var re = new RegExp('^3((2[03789])|(3[013456789])|(4[036789])|(6[0368])|(7[70])|(8[0389])|(9[0123]))[ \\-\.\/]?[ 0-9]{6,7}$');
		var re = new RegExp('^3((2[03789])|(3[013456789])|(4[036789])|(6[0368])|(7[70])|(8[0389])|(9[0123]))[ \\-\.\/]?[ 0-9]{6,12}$');
	} else {
		var re = new RegExp('^3((2[03789])|(3[013456789])|(4[036789])|(6[0368])|(7[70])|(8[0389])|(9[0123]))[0-9]{6,7}$');
	}
	if (!inputField.value.match(re)){
		alert(msgCell);
		return false;
	}
	return true;
}
function isValidCellWorld(inputField,acceptEmpty,acceptSeparator){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgNoCell);
			return false;
		}
	}
	if (acceptSeparator){
		//var re = new RegExp('^((\\+|00)[0-9]{1,4}[ \\-\.\/]?)?[0-9]{3}[ \\-\.\/]?[0-9]{6,7}$');
		var re = new RegExp('^((\\+|00)[0-9]{1,4}[ \\-\.\/]?)?[0-9]{3}[ \\-\.\/]?[ 0-9]{6,12}$');
	} else {
		var re = new RegExp('^((\\+|00)[0-9]{1,4})?[0-9]{9,10}$');
	}
	if (!inputField.value.match(re)){
		alert(msgCell);
		return false;
	}
	return true;
}

// **** LUNGHEZZA TESTO CON LIMITE NUMERO DI CARATTERI ****
// funzione che individua il limite di caratteri di un campo di testo dal Title e richiama la funzione LimitChars()
function LimitCharNumber(inputField){
	var re = new RegExp(dcMaxChar);
	if (inputField.title.match(re)){
		tmpTitle = inputField.title.match(re)[0];
		start = tmpTitle.indexOf(':')+1;
		if(start>0){
			var limit = parseInt(tmpTitle.slice(start,tmpTitle.length));
			LimitChars(inputField,limit);
		}
	}
}

// funzione che limita il numero di caratteri in un campo di testo (text o textarea)
function LimitChars(inputField,limit){
	if ((inputField.type=='text')||(inputField.type=='textarea')){
		var tmp=inputField.value;
		if(tmp.length>limit){
			inputField.value=tmp.substr(0,limit);
		}
		charNumField = inputField.name+'CharNum';
		if(inputField.form[charNumField]){
			inputField.form[charNumField].value=limit-inputField.value.length;
		}
	}
}


// **** FUNZIONE GENERALE DI VALIDAZIONE DI UN FORM ****
// Utilizza l'attributo Title dei campi di Input per individuare il tipo di dato,
// in funzione del quale richiama la relativa funzione di verifica (vedi documentazione)

// variabile globale contenente il nome del campo, splittato dal title
var msgFieldName = '';
var rememberPassword = '';

function ValidateFormField(formInstance){
	var validateField = true;
	var i = 0;
	var field = formInstance.elements[i];
	while(field){
		// dal title del campo si estrae il nome (prima occorenza della funzione split con ;)
		msgFieldName = '';
		if (field.title!=''){
			if (field.title.indexOf(';')>0){
				msgFieldName = field.title.split(';')[0];
			} else {
				msgFieldName= field.title;
			}
		}
		
		// PARAMETRI OPZIONALI GENERALI
		// campo obbligatorio
		var canBeEmpty = true;
		if (field.title.indexOf(dcRequired)>=0){
			canBeEmpty = false;
		}		
		// numero di N cifre
		var digitPos = 0;
		var reDgtPos = new RegExp(dcMaxDigit);
		if (field.title.match(reDgtPos)){
			tmpTitle = field.title.match(reDgtPos)[0];
			start = tmpTitle.indexOf(': ')+2;
			if (start>0){
				var digitPos = parseInt(tmpTitle.slice(start,tmpTitle.length));
			}
		}
		// posizioni decimali
		var decimalPos = 0;
		var reDecPos = new RegExp(dcMaxDecimal);
		if (field.title.match(reDecPos)){
			tmpTitle = field.title.match(reDecPos)[0];
			start = tmpTitle.indexOf(': ')+2;
			if (start>0){
				var decimalPos = parseInt(tmpTitle.slice(start,tmpTitle.length));
			}
		}
		// separatore per i decimali
		var decimalSep = 0;
		var reDecSep = new RegExp(dcDecimalSep);
		if (field.title.match(reDecSep)){
			tmpTitle = field.title.match(reDecSep)[0];
			if (tmpTitle.match(/,/)){
				decimalSep = 1;
			} else {
				decimalSep = 2;
			}
		}
		// limite max numero di caratteri
		var reMaxChar = new RegExp(dcMaxChar);
		if (field.title.match(reMaxChar)){
			LimitCharNumber(field);
		}
		// limite min numero di caratteri
		var reMinChar = new RegExp(dcMinChar);
		if (field.title.match(reMinChar)){
			tmpTitle = field.title.match(reMinChar)[0];
			start = tmpTitle.indexOf(': ')+2;
			var minLength = parseInt(tmpTitle.slice(start,tmpTitle.length));
			if ((!canBeEmpty)&&(field.value.length<minLength)){
				alert(msgString +' '+ msgIntoField +' '+ msgFieldName +'\n'+ msgMinChar +' '+ minLength);
				validateField = false;
				break;
			}
		}
		// lunghezza compresa fra min e max
		var reMinMax = new RegExp(dcCharRange);
		if (field.title.match(reMinMax)){
			tmpTitle = field.title.match(reMinMax)[0];
			start = tmpTitle.indexOf(': ')+2;
			mid = tmpTitle.indexOf('-')-1;
			if ((start>0)&&(mid>0)){
				var minLength = parseInt(tmpTitle.slice(start,mid));
				var maxLength = parseInt(tmpTitle.slice(mid+2,tmpTitle.length));
				if (!isValidLengthRange(field,minLength,maxLength)){
					validateField = false;
					break;
				}
			}
		}
		// separatore per le liste
		var reDelim = new RegExp(dcListSep);
		if (field.title.match(reDelim)){
			tmpTitle = field.title.match(reDelim)[0];
			start = tmpTitle.indexOf(': ')+2;
			if (start>0){
				var delimiter = (tmpTitle.slice(start,tmpTitle.length));
			}
		}
		// tel/fax/cell con o senza separatore (/ o altro)
		var hasSeparator = 1;
		if (field.title.indexOf(dcNoSeparator)>=0){
			hasSeparator = 0;
		}
		// stringhe con o senza punteggiatura (.,-')
		var hasPunctuation = 1;
		if (field.title.indexOf(dcNoPunctuation)>=0){
			hasPunctuation = 0;
		}
		// stringhe con o senza spazi bianchi
		var hasWhiteSpace = 1;
		if (field.title.indexOf(dcNoWhiteSpace)>=0){
			hasWhiteSpace = 0;
		}
		// stringhe solo con lettere e numeri
		if (field.title.indexOf(dcOnlyChars)>=0){
			hasWhiteSpace = 0;
			hasPunctuation = 0;
		} else if (field.title.indexOf(dcOnlyLetters)>=0){
			hasWhiteSpace = 0;
			hasPunctuation = 0;
		}
		// url con prefisso http
		var withHttp = false;
		if (field.title.indexOf(dcURLWithHttp)>=0){
			withHttp = true;
		}
		// formato immagine
		var reImgFormat = new RegExp(dcImgFormat);
		if (field.title.match(reImgFormat)){
			tmpTitle = field.title.match(reImgFormat)[0];
			start = tmpTitle.indexOf(': ')+2;
			if (start>0){
				var imgFormat = (tmpTitle.slice(start,tmpTitle.length));
			}
		}
		
		// TIPI DI DATI

		// data / data di nascita / data internazionale
		 if ((field.title.indexOf(dtDate)>=0)||(field.title.indexOf(dtBirthday)>=0)||(field.title.indexOf(dtDateWorld)>=0)){
			if (field.title.indexOf(dtDateWorld)>=0){
				if (!isValidDateWorld(field,canBeEmpty)){
					validateField = false;
					break;
				}
			} else {
				if (!isValidDate(field,canBeEmpty)){
					validateField = false;
					break;
				}
			}
		// anno
		} else if (field.title.indexOf(dtYear)>=0){
			if (!isValidYear(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// mese
		} else if (field.title.indexOf(dtMonth)>=0){
			if (!isValidMonth(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// giorno
		} else if (field.title.indexOf(dtDay)>=0){
			if (!isValidDay(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// ora
		} else if (field.title.indexOf(dtTime)>=0){
			if (!isValidTime(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// e-mail
		} else if (field.title.indexOf(dtEmail)>=0){
			if (!isValidEmail(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// url
		} else if (field.title.indexOf(dtUrl)>=0){
			if (!isValidUrl(field,canBeEmpty,withHttp)){
				validateField = false;
				break;
			}
		// IP
		} else if (field.title.indexOf(dtIPAddress)>=0){
			if (!isValidIPAddress(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// codice fiscale / partita iva (aziendale)
		} else if (field.title.indexOf(dtCodFiscIva)>=0){
			if(!isValidCodiceFiscaleIva(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// codice fiscale
		} else if (field.title.indexOf(dtCodFisc)>=0){
			if(!isValidCodiceFiscale(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// partita iva
		} else if (field.title.indexOf(dtIva)>=0){
			if(!isValidPartitaIva(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// numero di telefono estero
		} else if (field.title.indexOf(dtTelWorld)>=0){
			if(!isValidTelWorld(field,canBeEmpty,hasSeparator)){
				validateField = false;
				break;
			}
		// numero di telefono italiano
		} else if (field.title.indexOf(dtTel)>=0){
			if(!isValidTel(field,canBeEmpty,hasSeparator)){
				validateField = false;
				break;
			}
		// numero di fax estero
		} else if (field.title.indexOf(dtFaxWorld)>=0){
			if(!isValidFaxWorld(field,canBeEmpty,hasSeparator)){
				validateField = false;
				break;
			}
		// numero di fax italiano
		} else if (field.title.indexOf(dtFax)>=0){
			if(!isValidFax(field,canBeEmpty,hasSeparator)){
				validateField = false;
				break;
			}
		// numero di cellulare estero
		} else if (field.title.indexOf(dtCellWorld)>=0){
			if(!isValidCellWorld(field,canBeEmpty,hasSeparator)){
				validateField = false;
				break;
			}
		// numero di cellulare italiano
		} else if (field.title.indexOf(dtCell)>=0){
			if(!isValidCell(field,canBeEmpty,hasSeparator)){
				validateField = false;
				break;
			}
		// numero (intero o decimale)
		} else if (field.title.indexOf(dtNumber)>=0){
			if(!isNumber(field,canBeEmpty,decimalPos,decimalSep,digitPos)){
				validateField = false;
				break;
			}
		// euro
		} else if (field.title.indexOf(dtEuro)>=0){
			if (!isNumber(field,canBeEmpty,2)){
				validateField = false;
				break;
			}
		// nome e cognome
		} else if (field.title.indexOf(dtFullName)>=0){
			if (!isString(field,canBeEmpty,1,1)){
				validateField = false;
				break;
			}
		// nome/cognome
		} else if ((field.title.indexOf(dtName)>=0)||(field.title.indexOf(dtSurname)>=0)){
			if (!isString(field,canBeEmpty,1,1)){
				validateField = false;
				break;
			}
		// azienda (nome)
		} else if (field.title.indexOf(dtFarm)>=0){
			if (!isString(field,canBeEmpty,1,1)){
				validateField = false;
				break;
			}
		// username
		} else if (field.title.indexOf(dtUsername)>=0){
			if (!isUsername(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// password
		} else if (field.title.indexOf(dtPassword)>=0){
			if (!isAlfanumeric(field,canBeEmpty,0,0)){
				validateField = false;
				break;
			} else {
				rememberPassword = field.value;
			}
		// conferma password
		} else if (field.title.indexOf(dtConfirmPassword)>=0){
			if (!isAlfanumeric(field,canBeEmpty,0,0)){
				validateField = false;
				break;
			} else {
				if ((rememberPassword!='')&&(rememberPassword!=field.value)){
					alert(msgConfirmPassword);
					validateField = false;
					break;
				}
			}
		// citta'
		} else if (field.title.indexOf(dtCity)>=0){
			if (!isString(field,canBeEmpty,1,1)){
				validateField = false;
				break;
			}
		// indirizzo
		} else if (field.title.indexOf(dtAddress)>=0){
			if (!isString(field,canBeEmpty,1,1)){
				validateField = false;
				break;
			}
		// selezione provincia
		} else if (field.title.indexOf(dtSelectProvince)>=0){
			if ((!canBeEmpty)&&(field.value==dcNoValue)){
				message = msgSelectBox;
				if ((msgFieldName)&&(msgFieldName!='')){
					message = message + ' ' + msgFieldName;
				}
				alert(message);
				validateField = false;
				break;
			}
		// provincia
		} else if (field.title.indexOf(dtProvince)>=0){
			if (!isString(field,canBeEmpty,0,0)){
				validateField = false;
				break;
			}
		// selezione nazione
		} else if (field.title.indexOf(dtSelectCountry)>=0){
			if ((!canBeEmpty)&&(field.value==dcNoValue)){
				message = msgSelectBox;
				if ((msgFieldName)&&(msgFieldName!='')){
					message = message + ' ' + msgFieldName;
				}
				alert(message);
				validateField = false;
				break;
			}
		// nazione
		} else if (field.title.indexOf(dtCountry)>=0){
			if (!isString(field,canBeEmpty,0,0)){
				validateField = false;
				break;
			}
		// cap estero
		} else if (field.title.indexOf(dtZipCodeWorld)>=0){
			if (!isValidZipCodeWorld(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// cap italiano
		} else if (field.title.indexOf(dtZipCode)>=0){
			if (!isValidZipCode(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// ID alfanumerico
		} else if (field.title.indexOf(dtIdAlfanum)>=0){
			if (!isValidId(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// lista di numeri
		} else if (field.title.indexOf(dtNumberList)>=0){
			if (!isValidNumberList(field,canBeEmpty,delimiter)){
				validateField = false;
				break;
			}
		// lista di parole
		} else if (field.title.indexOf(dtWordList)>=0){
			if (!isValidStringList(field,canBeEmpty,hasWhiteSpace,hasPunctuation,delimiter)){
				validateField = false;
				break;
			}
		// stringa alfanumerica
		} else if (field.title.indexOf(dtAlfanum)>=0){
			if (!isAlfanumeric(field,canBeEmpty,hasWhiteSpace,hasPunctuation)){
				validateField = false;
				break;
			}
		// stringa alfabetica (sole lettere)
		} else if (field.title.indexOf(dtAlfabetic)>=0){
			if (!isString(field,canBeEmpty,hasWhiteSpace,hasPunctuation)){
				validateField = false;
				break;
			}
		// regular expression
		} else if (field.title.indexOf(dtRegExp)>=0){
			start = field.title.indexOf(dtRegExp)+8;
			var tmpTitle = field.title.slice(start,field.title.length);
			start = tmpTitle.indexOf('(')+1;
			end = tmpTitle.indexOf(')');
			var reRegExp = tmpTitle.slice(start,end);
			if (!isMatchingRegExp(field,canBeEmpty,reRegExp)){
				validateField = false;
				break;
			}
		// immagine
		} else if ((field.type=='file')&&(field.title.indexOf(dtImage)>=0)){
			if (!isImage(field,canBeEmpty,imgFormat)){
				validateField = false;
				break;
			}
		// text e textarea generici
		} else if (((field.type=='text')||(field.type =='textarea'))&&(!canBeEmpty)&&(field.value=='')){
			message = msgInput;
			if ((msgFieldName)&&(msgFieldName!='')){
				message = message + ' ' + msgFieldName;
			}
			alert(message);
			validateField = false;
			break;
		// select generica
		} else if ((field.type=='select-one')&&(!canBeEmpty)&&(field.value==dcNoValue)){
			message = msgSelectBox;
			if ((msgFieldName)&&(msgFieldName!='')){
				message = message + ' ' + msgFieldName;
			}
			alert(message);
			validateField = false;
			break;
		// checkbox e radio button generici
		} else if (((field.type=='checkbox')||(field.type=='radio'))&&(!canBeEmpty)){
			var noValueChecked = true;
			var j = 0;
			var option = formInstance.elements[j];
			while(option){
				if ((option.type==field.type)&&(option.name==field.name)&&(option.checked==true)){
					noValueChecked = false;
					break;
				}
				j++;
				var option = formInstance.elements[j];
			}
			if (noValueChecked){
				if (field.type=='checkbox'){
					message = msgCheckBox;
				} else {
					message = msgRadioBtn;
				}
				if ((msgFieldName)&&(msgFieldName!='')){
					message = message + ' ' + msgFieldName;
				}
				alert(message);
				validateField = false;
				break;
			}
		}
		i++;
		var field = formInstance.elements[i];
	}
	// se uno dei campi non è corretto, viene evidenziato con il focus e con un bordino rosso
	if ((!validateField)&&(field)){
		field.focus();
		// field.style.border='1px solid red';
		if ((field.type=='text')||(field.type=='textarea')){
			// nel caso sia un text, viene selezionato il testo all'interno del campo
			field.select();
		}
	}
	return validateField;
}

// funzione per eseguire il submit di un form tramite un link senza il pulsante submit
// (href="javascript:[NomeFunzione()]" o onclick="[NomeFunzione()]") 
// passando comunque attraverso il controllo di validazione
function FormSubmit(formInstance){
	if (ValidateFormField(formInstance)){
		formInstance.submit();
	}
}


// *****************************
// **** FUNZIONI SPECIFICHE ****
// *****************************


// *** VERIFICA PASSWORD ***

// funzione che serve per verificare la corretta digitazione della password, dati due campi di input
function verifyPassword(pwdField1, pwdField2){
	if (pwdField1.value!='' && pwdField1.value==pwdField2.value) return true;
	pwdField1.value='';
	pwdField2.value='';
	alert(msgVerifyPassword);
	return false;
}


// *** GESTIONE CAMPI AUTO-ALIMENTANTI ***

// funzione che implementa la gestione di campi autoalimentanti
function changeCategory(combo,nomeForm,nomeText,nomeHidden){
	var curText=eval('document.'+nomeForm+'.'+nomeText);
	var curHidden=eval('document.'+nomeForm+'.'+nomeHidden);
	var cat; 
	if(combo.value==''){
		curText.disabled=false;
		cat=curText.value;
	} else {
		curText.disabled=true;
		cat=combo.value;
	}
	curHidden.value=cat;
}
function setCategory(field,nomeForm,nomeHidden){
	if (isAlfanumeric(field,false)){
		var curHidden=eval('document.'+nomeForm+'.'+nomeHidden);
		curHidden.value=field.value;
	} else {
		return
	}
}


// *** SELEZIONE TAG PER CLASSE ***

// funziona che ritorna un array contenente gli elementi (tag) aventi una determinata classe CSS
document.getElementsByClassName = function(className,tagName) {
	if (!tagName){var tagName = '*'};
	var children = document.getElementsByTagName(tagName) || document.all;
	var elems = new Array();
	for (i=0; i<children.length; i++){
		var child = children[i];
		var classNames = child.className.split(' ');
		for (j=0; j<classNames.length; j++){
			if (classNames[j] == className){
				elems.push(child);
				break;
			}
		}
	}
	return elems;
}


// *** SWITCH VISUALIZZAZIONE DIV ***

// funzione per lo switch di visualizzazione di un elemento (tag)
function DisplaySwitch(elem,defStatus){
	// defStatus: '', 'none', 'block'.
	if (!defStatus){defStatus = ''}
	var tmpStatus = elem.style.display;
	if (defStatus=='none'){
		if ((tmpStatus=='none')||(tmpStatus=='')){
			elem.style.display = 'block';
		} else {
			elem.style.display = 'none';
		}
	} else if (defStatus=='block'){
		if ((tmpStatus=='block')||(tmpStatus=='')){
			elem.style.display = 'none';
		} else {
			elem.style.display = 'block';
		}
	} else {
		if (tmpStatus==''){
			elem.style.display = 'none';
		} else {
			elem.style.display = '';
		}
	}
}

// funzione per lo switch di visual. tramite l'attributo 'id'
function DisplaySwitchById(idName,defStatus){
	if (!defStatus){defStatus = ''};
	elem = document.getElementById(idName);
	DisplaySwitch(elem,defStatus);
}

// funzione per lo switch di visual. tramite l'attributo 'class'
function DisplaySwitchByClass(className,defStatus,tagName){
	if (!defStatus){defStatus = ''};
	if (!tagName){tagName = '*'};
	elems = document.getElementsByClassName(className,tagName);
	for (i=0; i<elems.length; i++) {
		DisplaySwitch(elems[i],defStatus);
	}
}

// DEPRECATED: vecchia funzione per lo switch di visualizzazione di un div, mantenuta per compatibilta' all'indietro
function DivVisSwitch(idName){
	DisplaySwitchById(idName,'');
}


// *** GESTIONE EVENTI ONLOAD E ONUNLOAD ***
function addLoadEvent(fn) {
	var oldOnLoad = window.onload;
	if (typeof window.onload != 'function'){
		window.onload = fn;
	} else {
		window.onload = function(){
			if (oldOnLoad){oldOnLoad();}
			fn();
		}
	}
}
function addUnloadEvent(fn) {
	var oldOnUnload = window.onunload;
	if (typeof window.onunload != 'function'){
		window.onunload = fn;
	} else {
		window.onunload = function() {
			if (oldOnUnload){oldOnUnload();}
			fn();
		}
	}
}