// ***************************************
// **** UTILITY FUNCTIONS - VER.3.0.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;


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

//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 (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(message);
			return false;
		}
	}
	if ((acceptPunctuation)&&(acceptWhiteSpace)){
		var re = new RegExp('^[a-zA-Z0-9 ,\'\.\\-]+$');
	} else if (acceptPunctuation){
		var re = new RegExp('^[a-zA-Z0-9,\'\.\\-]+$');
	} else if (acceptWhiteSpace){
		var re = new RegExp('^[a-zA-Z0-9 ]+$');
	} 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 = msgAlfabetic;
	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 ((acceptPunctuation)&&(acceptWhiteSpace)){
		var re = new RegExp('^[a-zA-Z ,\'\.\\-]+$');
	} else if (acceptPunctuation){
		var re = new RegExp('^[a-zA-Z,\'\.\\-]+$');
	} else if (acceptWhiteSpace){
		var re = new RegExp('^[a-zA-Z ]+$');
	} else {
		var re = new RegExp('^[a-zA-Z]+$');
	}
	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){
	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 (!delimiter) var delimiter = ',';
	//var re = new RegExp('^[ ]?[a-zA-Z0-9]+[ ]?$');
	if ((acceptPunctuation)&&(acceptWhiteSpace)){
		if (delimiter==','){
			var re = new RegExp('^[ ]?[a-zA-Z \'\.\\-]+[ ]?$');
		} else {
			var re = new RegExp('^[ ]?[a-zA-Z ,\'\.\\-]+[ ]?$');
		}
	} else if (acceptPunctuation){
		if (delimiter==','){
			var re = new RegExp('^[ ]?[a-zA-Z\'\.\\-]+[ ]?$');
		} else {
			var re = new RegExp('^[ ]?[a-zA-Z,\'\.\\-]+[ ]?$');
		}
	} else if (acceptWhiteSpace){
		var re = new RegExp('^[ ]?[a-zA-Z ]+[ ]?$');
	} else {
		var re = new RegExp('^[ ]?[a-zA-Z]+[ ]?$');
	}
	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;
}


// ********************************************************************
// **** 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 √® 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){
	var daysInMonth = DaysArray(12);
	var pos1=dataStr.indexOf(dtCh);
	var pos2=dataStr.indexOf(dtCh,pos1+1);
	var strDay=dataStr.substring(0,pos1);
	var strMonth=dataStr.substring(pos1+1,pos2);
	var 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){
		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){
		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('^([1-9]|0[1-9]|[12][0-9]|3[01])/([1-9]|0[1-9]|1[012])/((19|20)[0-9][0-9])$');
	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);
	}
}

// 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 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;
}

//funzione che restituisce true solo se il campo di input contiene un ora nel formato HH:mm
function isValidYear(inputField,acceptEmpty){
	if (inputField.value==''){
		if (acceptEmpty){
			return true;
		} else {
			alert(msgYear);
			return false;
		}
	}
	var re = new RegExp('^[12][0-9][0-9][0-9]$');
	if (!inputField.value.match(re)){
		alert(msgYear);
		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 ****
//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) var withHttp = 0;
	if (withHttp && (inputField.value.indexOf('http://')!=0)){
		alert(msgUrlHttp);
		return false;
	}
	if (withHttp){
		var re = new RegExp('^http://[a-zA-Z0-9\.\\-_]+\.[a-zA-Z]{2,4}$');
	} else {
		var re = new RegExp('^[a-zA-Z0-9\.\\-_]+\.[a-zA-Z]{2,4}$');
	}
	if (!inputField.value.match(re)){
		alert(msgUrl);
		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-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-Z0-9][a-zA-Z0-9\\-_]+((\.[a-zA-Z0-9\\-_]+)*)?[a-zA-Z0-9]\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2})?$');
	if (!unescape(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;
}

// **** CAP ****
// funzione che verifica se il campo contiene un CAP corretto
function isValidCap(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 isValidCapWorld(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}$');
	} else {
		var re = new RegExp('^0?[0-9]{1,3}[1-9][0-9]{4,7}$');
	}
	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}$');
	} else {
		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}$');
	} else {
		var re = new RegExp('^0?[0-9]{1,3}[1-9][0-9]{4,7}$');
	}
	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}$');
	} else {
		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[3890])|(3[34567890])|(4[37890])|(6[3680])|(8[890])|(9[0123]))[\\-\.\/\ ]?[0-9]{6,7}$');
	} else {
		var re = new RegExp('^3((2[3890])|(3[34567890])|(4[37890])|(6[3680])|(8[890])|(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}$');
	} 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);
		}
		// 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;
		}
		
		// TIPI DI DATI
		// data / data di nascita
		if ((field.title.indexOf(dtDate)>=0)||(field.title.indexOf(dtBirthday)>=0)){
			if (!isValidDate(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// ora
		} else if (field.title.indexOf(dtTime)>=0){
			if (!isValidTime(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// anno
		} else if (field.title.indexOf(dtYear)>=0){
			if (!isValidYear(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,0)){
				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,0)){
				validateField = false;
				break;
			}
		// nome/cognome
		} else if ((field.title.indexOf(dtName)>=0)||(field.title.indexOf(dtSurname)>=0)){
			if (!isString(field,canBeEmpty,1,0)){
				validateField = false;
				break;
			}
		// azienda (nome)
		} else if (field.title.indexOf(dtFarm)>=0){
			if (!isAlfanumeric(field,canBeEmpty,1,1)){
				validateField = false;
				break;
			}
		// username
		} else if (field.title.indexOf(dtUsername)>=0){
			if (!isAlfanumeric(field,canBeEmpty,0,0)){
				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 (!isAlfanumeric(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;
			}
		// cap estero
		} else if (field.title.indexOf(dtZipCodeWorld)>=0){
			if (!isValidCapWorld(field,canBeEmpty)){
				validateField = false;
				break;
			}
		// cap italiano
		} else if (field.title.indexOf(dtZipCode)>=0){
			if (!isValidCap(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;
			}
		// 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;
}


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

// 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;
}

// 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
	}
}

// funzione per lo switch di visualizzazione di un div
function DivVisSwitch(nomediv){
	var div = document.getElementById(nomediv);
	if(div.style.display == 'none')
	{div.style.display = '';}
	else
	{div.style.display = 'none';}
}