function validateForm( formName ) {
	validateForm( formName , null ) ;
}
function validateForm( formName , func ) {
	
	if( $(formName) != null ) {
		
		var response = true ;
		$(formName+'_error_message').set('text','') ;
		var field = $$('#'+formName+' input.toValidate', '#'+formName+' select.toValidate', '#'+formName+' textarea.toValidate') ;
		
		field.each(function(el, i) {
			
			var id 			= el.get('id') ;
			var classes 	= el.get('class').split(' ') ;
			var label 		= null ;
				if( el.hasClass('self') ) 	label = el ;
				else 						label = $(id+'_label') ;
			var style 		= null ;
				if( el.hasClass('bg') ) 		style = 'background' ;
				else if( el.hasClass('sh') ) 	style = 'display' ;
				else 							style = 'color' ;
			var value_ok	= '#000000' ;
			var value_no	= '#ff0000' ;
			
			var valid 		= true ;
			var max 		= null ;
			var min 		= null ;
			var group 		= null ;
			var depends 	= null ;
			var atLeastCount = null ;
			var atLeastGroup = null ;
			
			// check if max length
			for( i = 0 ; i < classes.length ; i++ ) {
				if( classes[i].match('max_') ) {
					var tmp = classes[i].split('_') ;
					max = tmp[1] ;
				}
				if( classes[i].match('min_') ) {
					var tmp = classes[i].split('_') ;
					min = tmp[1] ;
				}
				if( classes[i].match('radio_group_') ) {
					var tmp = classes[i].split('_') ;
					group = tmp[2] ;
				}
				if( classes[i].match('at_least_') ) {
					var tmp = classes[i].split('_') ;
					atLeastCount = tmp[2] ;
					atLeastGroup = tmp[3] ;
				}
				if( classes[i].match('reqIfIsset_') ) {
					var tmp = classes[i].split('_') ;
					depends = tmp[1] ;
				}
				if( classes[i].match('bgok_') ) {
					var tmp = classes[i].split('_') ;
					value_ok = '#'+tmp[1] ;
				}
				if( classes[i].match('bgno_') ) {
					var tmp = classes[i].split('_') ;
					value_no = '#'+tmp[1] ;
				}
				if( classes[i].match('valok_') ) {
					var tmp = classes[i].split('_') ;
					value_ok = tmp[1] ;
				}
				if( classes[i].match('valno_') ) {
					var tmp = classes[i].split('_') ;
					value_no = tmp[1] ;
				}
				if( classes[i].match('colok_') ) {
					var tmp = classes[i].split('_') ;
					value_ok = ';color:'+tmp[1] ;
				}
				if( classes[i].match('colno_') ) {
					var tmp = classes[i].split('_') ;
					value_no += ';color:'+tmp[1] ;
				}
			}
			
			if( depends != null ) {
				var tmp = id.split('_') ;
				var tmp_id = tmp[tmp.length - 1 ] ;
				var required = false ;
				for( i = 1 ; valid && i < depends.length ; i++ ) {
					if( !required && $(depends[i]+'_'+tmp_id) != null && $(depends[i]+'_'+tmp_id).get('value') != "" )	required = true ;
				}
				if( required ) 	el.addClass('required') ;
				else 			el.removeClass('required') ;
				
			}
			
			if( valid && el.hasClass('required') ) {
				if( group != null ) {
					var allItemInGroup = $$('#'+formName+' input.radio_group_'+group) ;
					valid = false ;
					allItemInGroup.each(function(el, i){
						if( el.checked ) valid = true ;
					}) ;
				}
				else {
					if( el.get('tag') == 'textarea' ) {
						if( el.get('value')==null || el.get('value').replace(' ' , '' )=="" ) 	valid = false ;
						//if( el.innerHTML==null || el.innerHTML.replace(' ' , '' )=="" ) 	valid = false ;
						//alert(valid+' - '+el.get('value'));
					}
					else
						if( el.get('value')==null || el.get('value').replace(' ' , '' )=="" ) 	valid = false ;
				}
			}
			if( atLeastGroup != null ) {
				var allItemInGroup = $$('#'+formName+' input.at_least_'+atLeastCount+'_'+atLeastGroup) ;
				valid = false ;
				allItemInGroup.each(function(el, i){
					var filter1 = /^[0-9a-zA-Z\.\-\s\'\"]+$/ ;
					if( filter1.test(el.get('value')) ) valid = true ;
				}) ;
				if( valid )
					allItemInGroup.each(function(el, i){
						el.removeClass('required') ;
				 	}) ;
			}
					
			if( valid && el.hasClass('alpha') ) {
				var filter1 = /^[a-zA-Z\.\-]*$/ ;
				if( !filter1.test(el.get('value')) ) valid = false ;
			}
			
			if( valid && el.hasClass('alphatext') ) {
				var filter1 = /^[0-9a-zA-Z\.\-\s\'\"]*$/ ;
				if( !filter1.test(el.get('value')) ) valid = false ;
			}
			
			if( valid && el.hasClass('text') ) {
				var filter1 = /^[a-zA-Z\.\-\s]*$/ ;
				if( !filter1.test(el.get('value')) ) valid = false ;
			}
			
			if( valid && max != null )
				if( el.get('value').length > max ) 	valid = false ;
			if( valid && min != null )
				if( el.get('value').length < min ) 	valid = false ;
			
			if( valid && el.hasClass('pass') ) {
				var pass1 = $('password').get('value') ;
				var pass2 = $('repassword').get('value') ;
				if( pass1 != pass2 ) 		valid = false ;
				if( $('md5_password') )
					$('md5_password').set('value',hex_md5(pass1))
			}
			
			if( valid && el.hasClass('positive') ) {
				var filter1 = /^[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?$/ ;
				if( !filter1.test(el.get('value')) ) 			valid = false ;
				if( valid && parseInt(el.get('value')) < 0 ) 	valid = false ;
			}
			
			if( valid && el.hasClass('email') ) {
				var filter1 = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/ ;
				var filter2 = /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/ ; 
				if( !filter1.test(el.get('value')) )	valid = false ;
			}
			
			if( valid && el.hasClass('date') ) {
				var filter1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/ ;
				if( !filter1.test(el.get('value')) )	valid = false ;
			}
			
			if( valid && el.hasClass('phone') ) {
				var filter1 = /^\d{2,4} \d{3,10}$/ ;
				if( !filter1.test(el.get('value')) )	valid = false ;
			}
			
			if( valid && el.hasClass('cap') ) {
				var filter1 = /^\d{5}$/ ;
				if( !filter1.test(el.get('value')) )	valid = false ;
			}
			
			if( valid && el.hasClass('iban') ) {
				// IT 31 N 2034 59462 673692 
				var filter1 = /^\w{2} \d{2} \w{1} \d{5} \d{5} \d{6}$/ ;
				if( !filter1.test(el.get('value')) )	valid = false ;
			}
			
			if( valid && el.hasClass('codice_fiscale') ) {
				// CNNFBA83T30G888F
				var filter1 = /^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/;
				if( !filter1.test(el.get('value')) )	valid = false ;
			}
			
			if( valid && el.hasClass('partita_iva') ) {
				var sz_Codice = el.get('value') ;
				var n_Val,n_Som1=0,n_Som2=0,lcv;
				if (sz_Codice.length!=11 || isNaN(parseFloat(sz_Codice)) || parseFloat(sz_Codice)<parseFloat(0)) valid = false;
				else {
					for (lcv=0;lcv<9;lcv+=2) {
						n_Val=parseInt(sz_Codice.charAt(lcv));
						n_Som1+=n_Val;
						n_Val=parseInt(sz_Codice.charAt(lcv+1));
						n_Som1+=Math.floor(n_Val/5) + (n_Val<<1) % 10; }
						n_Som2 = 10 - (n_Som1 % 10);
					n_Val=parseInt(sz_Codice.charAt(10));
					if (n_Som2==n_Val) 	valid = true ;
					else				valid = false;
				}
			}
			
			if( !el.hasClass('required') ) {
				if( el.get('value')==null || el.get('value')=="" ) 	valid = true ;
			}
			
			//alert( id+' el.value: ++'+el.get('value')+'++ valid: '+valid) ;
			
			//alert(style+': '+value_ok) ;
			//alert(style+': '+value_no) ;
			if( valid )		label.set('style' , style+': '+value_ok) ;
			else {			label.set('style' , style+': '+value_no) ;
							response = false ;
			}
		});
		
		if( !response )
			$(formName+'_error_message').set('text' , 'Ci sono degli errori, controlla i campi in rosso!') ;
		else {
			if( func == null) 	$(formName).submit();
			else				eval(func) ;
		}
	}
}
