var trovato=true; 
var file=null;
var youtube=null;

function formValidator(objForm,mandatoryMessage,wrongFormatMessage,showPopUp,strErrorColor,strOriginalColor,confirmMessage){
	/*
	PARAMETRI:
	objForm: e' obbligatorio , e' il form da submittare
	mandatoryMessage: e' obbligatorio , e' il messaggio che segnala l'obbligatorieta' di un campo
	wrongFormatMessage: e' obbligatorio , e' il messaggio che segnala un formato errato di un campo
	showPopUp: 	e' obbligatorio
				true = visualizzazione del popup javascript con elenco errori
				false = errori evidenziati sulla pagina al fianco dei campi
	strErrorColor: 	e' opzionale , specifica il colore di evidenziazione degli errori,
					se vale 'none' non viene definito nessun colore per gli errori
	strOriginalColor:	e' opzionale , specifica il colore originale degli input del form,
						se vale 'none' non viene definito nessun colore
	confirmMessage:	e' opzionale ,
					se ha un valore viene visualizzato una confirm box con il relativo messaggio prima della submit
					se '' o null la submit e' eseguita senza messaggio di conferma

	TIPI CONTROLLATI:
	literal [abcABC ']
	name [abcABC '.éè...]
	toponym [123abcABC 'éè...]
	address [123abcABC 'éè./,]
	username [abcABC_123]
	alphanumeric [abcABC 123]
	text [abcABC _123'"<>!?&...]
	integer [123]
	numeric [12.3]
	phone [123-+\ ]
	email [a1.b2@c3.c4]
	web [123abc./-_]
	file [123abc.:/\ -_]
	
	STRUTTURA DELL'ATTRIBUTO ID DEI CONTROLLI HTML
	L'attributo id degli input,select,radio o checkbox deve essere composto cosi':
	id="id|check|mandatory|type|label|mandatoryMessage|wrongFormatMessage"
	id: e' obbligatorio , e' usato per visualizzare il messaggio d'errore sulla pagina e non sul popup
	check: e' obbligatorio per la validazione, se non c'e' l'input non viene controllato
	mandatory: e' obbligatorio e puo' valere 'mandatory' se il campo e' obbligatorio o qulsiasi altra stringa nel caso non si voglia il campo obbligatorio 
	type: e' obbligatorio e puo' valere 'literal','name','toponym'(citta',regioni...),'address','username','alphanumeric','text','integer','numeric','email','phone','web','none'(nessun controllo sul formato,solo l'eventuale obbligatorieta')
	label: e' obbligatorio ed e' il nome del campo che si vuole far apparire in caso di errore
	mandatoryMessage: e' opzionale , se c'e' sostituisce il messaggio di errore impostato nell'omonimo parametro della funzione formValidator
	wrongFormatMessage: e' opzionale , se c'e' sostituisce il messaggio di errore impostato nell'omonimo parametro della funzione formValidator
	*/
	var objInput = null;
	try{
		var messages = ''; 
		var objMessage = null;
		/*pink e' il colore di default per l'errore se non viene specificato nell'onSubmit del form*/
		var errorColor = 'pink';
		if (strErrorColor) errorColor=strErrorColor;
		
		var originalColor = '#ffffff';
		if (strOriginalColor) originalColor=strOriginalColor;
	
		/*
		Le seguenti regular expressions le ho fatte io, 
		quindi non sono un gran che, soprattutto email e numeric....
		*/
		var RegExpLiteral = new RegExp("[^a-zA-Z ']");
		var RegExpAphanumeric = new RegExp("[^a-zA-Z0-9_]");
		//var RegExpName = new RegExp("[^À-ÖØ-öø-ÿa-zA-Z .']");
		var RegExpName = new RegExp("[^\xC0-\xD6\xD8-\xF6\xF8-\xFFa-zA-Z .']");
		//var RegExpToponym = new RegExp("[^À-ÖØ-öø-ÿ0-9a-zA-Z ']");
		var RegExpToponym = new RegExp("[^\xC0-\xD6\xD8-\xF6\xF8-\xFF0-9a-zA-Z ']");
		//var RegExpAddress = new RegExp("[^À-ÖØ-öø-ÿ0-9a-zA-Z '\\\\/.,&]");
		var RegExpAddress = new RegExp("[^\xC0-\xD6\xD8-\xF6\xF8-\xFF0-9a-zA-Z '\\\\/.,&]");
		var RegExpEmail = /[a-zA-Z0-9_\.]+[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z]+/;
		/*var RegExpEmail = /.+@.+\\.[a-z]+/;*/
		var RegExpUsername = new RegExp("[^a-zA-Z0-9_\-]");
		//var RegExpText = new RegExp("[^!-}¿-ÿ \f\r\n\t\v\s]");
		var RegExpText = new RegExp("[^!-}\xBF-\xFF \f\r\n\t\v\s]");
		var RegExpInteger = new RegExp("[^0-9]");
		var RegExpNumeric = new RegExp("[0-9]?[\.]?[0-9]");
		var RegExpPhone = /[^0-9 \-\\\\+]/;
		var RegExpWeb = new RegExp("[^a-zA-Z0-9_.?&=:\\\\/\-]");
		var RegExpFile = new RegExp("[^a-zA-Z0-9 _.:\\\\/\-]");
	
		for (var iInput=0;iInput<objForm.elements.length;iInput){
			objInput = objForm.elements[iInput++];
			
			if (objInput.value && objInput.type != 'file')
				objInput.value = trim(objInput.value);
			if (objInput.id && objInput.id && objInput.id!=''){
				var arrCheck = objInput.id.split("|");
				if (arrCheck.length>=5 && arrCheck[1]=='check'){
					if (originalColor!='none')
						objInput.style.backgroundColor=originalColor;
					objMessage = null;
					if (window.document.getElementById(arrCheck[0])){
						objMessage = window.document.getElementById(arrCheck[0])
						if (errorColor!='none')
							objMessage.style.color = errorColor;
						objMessage.innerHTML = '';
						//objMessage.style.display = 'none';
					}
					
					//alert('match-type:'+objInput.type.match('select'));
					//alert('type:'+objInput.type);
					//alert('name:'+objInput.name+' value:'+objInput.value);
					if (arrCheck[2]=='mandatory' && 
						 (
							(objInput.type == 'text' && objInput.value=='' && objInput.name!='youtube') ||
							(objInput.type == 'textarea' && objInput.value=='') ||
							(objInput.type.match('select') && objInput.value=='') ||
							(objInput.type == 'checkbox' && !objInput.checked) ||
							(objInput.type == 'radio' && !objInput.checked) 
						  )
						){
						messages = setMandatoryError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,mandatoryMessage);
					}
					
					if (
						arrCheck[3]=='literal' ||
						arrCheck[3]=='name' ||
						arrCheck[3]=='toponym' ||
						arrCheck[3]=='address' ||
						arrCheck[3]=='username' ||
						arrCheck[3]=='alphanumeric' ||
						arrCheck[3]=='text' ||
						arrCheck[3]=='integer' ||
						arrCheck[3]=='numeric' ||
						arrCheck[3]=='phone' ||
						arrCheck[3]=='email' ||
						arrCheck[3]=='web' ||
						arrCheck[3]=='youtube' ||
						arrCheck[3]=='file' ||
						arrCheck[3]=='none'
						){
						if (arrCheck[3]=='literal'){
							//alert(objInput.value.match(RegExpLiteral));
							if (objInput.value!='' && objInput.value.match(RegExpLiteral)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='name'){
							//alert(objInput.value.match(RegExpName));
							if (objInput.value!='' && objInput.value.match(RegExpName)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='toponym'){
							//alert(objInput.value.match(RegExpToponym));
							if (objInput.value!='' && objInput.value.match(RegExpToponym)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='address'){
							//alert(objInput.value.match(RegExpAddress));
							if (objInput.value!='' && objInput.value.match(RegExpAddress)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='alphanumeric'){
							//alert(objInput.value.match(RegExpAphanumeric));
							if (objInput.value!='' && objInput.value.match(RegExpAphanumeric)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='email'){
							//alert(objInput.value.match(RegExpEmail));
							if (objInput.value!='' && !objInput.value.match(RegExpEmail)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='web'){
							//alert(objInput.value.match(RegExpWeb));
							if (objInput.value!='' && objInput.value.match(RegExpWeb)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='youtube'){
							if (objInput.value!='')
							{
									var link=objInput.value;
									var indirizzo=link.substring(0,31);
									if(indirizzo!='http://www.youtube.com/watch?v=' || link == 'http://www.youtube.com/watch?v=xxx')
									{
										messages = setWrongFormatError(	arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
										youtube=objInput;
										trovato=false;
									}
									else
										trovato=true;
							}
							else
							{
								youtube=objInput;
								trovato=false;
							}
						}
						if (arrCheck[3]=='file'){
							if (objInput.value=='')
							{
								file=objInput;
								trovato=false;
							}
							else
							{
								var nomefile=objInput.value;
								var lunghezza=nomefile.length;
								var estensione  =nomefile.substring(lunghezza-4); 
								if(estensione=='.jpg')
									trovato=true;
								else
								{
									messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
									file=objInput;								
									trovato=false;
								}
							}
						}
							
						if (arrCheck[3]=='phone'){
							//alert(objInput.value.match(RegExpPhone));
							if (objInput.value!='' && objInput.value.match(RegExpPhone)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='username'){
							//alert(objInput.value.match(RegExpUsername));
							if (objInput.value!='' && objInput.value.match(RegExpUsername)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='text'){
							//alert(objInput.value.match(RegExpText));
							if (objInput.value!='' && objInput.value.match(RegExpText)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='integer'){
							//alert(objInput.value.match(RegExpInteger));
							if (objInput.value!='' && objInput.value.match(RegExpInteger)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
						}
						if (arrCheck[3]=='numeric'){
							//alert('float:'+parseFloat(objInput.value));
							//alert(objInput.value.match(RegExpNumeric));
							if (objInput.value!='' && !objInput.value.match(RegExpNumeric)){
								messages = setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage);
							}
							else{
								if (objInput.value!='') objInput.value = parseFloat(objInput.value);
							}
						}
						if (arrCheck[3]=='none'){
							//alert('no format control');
						}
					}
					else{
						alert('For developers:\nInvalid check type '+arrCheck[3]+' for input field \''+objInput.name+'\'');
						return false;
					}
				}
				//alert('check next field');
			}
		}
		
		if(!trovato)
		{
			messages = setMandatoryError(arrCheck,messages,file,errorColor,showPopUp,objMessage,mandatoryMessage);
			messages = setMandatoryError(arrCheck,messages,youtube,errorColor,showPopUp,objMessage,mandatoryMessage);
		}
		if (messages==''){
			if (confirmMessage){
				var conferma = confirm(confirmMessage);
				if (conferma) 
				{
					return true;
				}
				else
					return false;
			}
			return true;
		}
		else{
			if (showPopUp) alert(messages);
			return false;
		}
	}
	catch(e){
		if (objInput)
			alert('For developers: error for input '+objInput.name+' '+e);
		else
			alert('For developers: error '+e);
		return false;
	}
	return false;
}

function setWrongFormatError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,wrongFormatMessage){
	if (messages=='') objInput.focus();
	if (arrCheck.length>=7 && arrCheck[6]!='')
		messages += arrCheck[6]+'\n';
	else
		messages += wrongFormatMessage+' \''+arrCheck[4]+'\'\n';
	if (errorColor!='none')
		objInput.style.backgroundColor=errorColor;
	if (!showPopUp && objMessage){
		//objMessage.style.display = 'block';
		if (arrCheck.length>=7 && arrCheck[6]!='')
			objMessage.innerHTML = arrCheck[6];
		else
			objMessage.innerHTML = wrongFormatMessage;
	}
	return messages;
}

function setMandatoryError(arrCheck,messages,objInput,errorColor,showPopUp,objMessage,mandatoryMessage){
	if (messages=='') objInput.focus();
	if (arrCheck.length>=6 && arrCheck[5]!='')
		messages += arrCheck[5]+'\n';
	else
		messages += mandatoryMessage+' \''+arrCheck[4]+'\'\n';
	if (errorColor!='none')
		objInput.style.backgroundColor=errorColor;
	if (!showPopUp && objMessage){
		//objMessage.style.display = 'block';
		if (arrCheck.length>=6 && arrCheck[5]!='')
			objMessage.innerHTML = arrCheck[5];
		else
			objMessage.innerHTML = mandatoryMessage;
	}
	return messages;
}

