/* ========================================================================== */
/*	  																		  */
/* (NNNNNN)(NNNNNN)                                                           */
/*      NN)(NN       stiweb.it                                                */
/*      NN)(NN       (c)2009 Stive Barison                                    */
/*      NN)(NN       http://www.stiweb.it 									  */
/*																			  */
/* ========================================================================== */

/******************************************************************************/
/* File               : frm_val.js                                            */
/* -------------------------------------------------------------------------- */
/* Autore             : Steve Barison                                         */
/* -------------------------------------------------------------------------- */
/* Versione originale : 11/07/2009                                            */
/* Revisione          : 01/09/2009                                            */
/*          																  */
/* ========================================================================== */
/*                                                                            */
/* Descrizione        :  Validazione delle form                               */
/*                                                                            */
/* -------------------------------------------------------------------------- */
/* Note: uso:                                                                 */
/*                                                                            */
/*  Event.observe(window,"load",function() 							 		  */
/* 			     {														      */
/*			   		new Protoform('miaform', { ajax: true });                 */	
/*			     });													      */
/*		  																	  */
/*                                                                            */
/* <input id = "id_cam+Ric" />         Campo richiesto						  */			
/* <input id = "id_cam+Liv" />         Campo non richiesto solo controllo live*/
/* <input id = "id_cam+Ric+Liv" />     Campo richiesto con controllo live     */
/* <input id = "id_cam+Ric+Liv+Num" /> Campo richiesto con controllo live e   */
/*                                     solo con input di numeri 			  */  
/*																		      */
/******************************************************************************/

/*============================================================================*/
/* Setup delle espressioni regolari da usare nella validazione dei campi      */ 
/*============================================================================*/
/*----------------------------------------------------------------------------*/
/* Controlla che nell'id del campo la forma di richiesta validazione sia pas- */
/* sata in forma corretta ES: nom_Ric_Num                                     */
/*----------------------------------------------------------------------------*/
REG_CHK_FOR	 = /^[^\+]+(\+Ric)?(\+Liv)?(\+(Tel|Num|Alf|Email|Url|Data|CodFis|Piva|Int|Val|Ran|Prg|Pass|Pasv))?$/;

/*----------------------------------------------------------------------------*/
/* Controlla che nell'id del campo sia presente la tipologia di validazione   */
/*----------------------------------------------------------------------------*/
REG_TYP_CAM	= /\+(Tel|Num|Alf|Email|Url|Data|CodFis|Piva|Int|Val|Ran|Prg|Pass|Pasv)$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi vuoti lasciati in bianco                                   */
/*----------------------------------------------------------------------------*/
REG_CAM_VTO = /^\s*$/;

/*----------------------------------------------------------------------------*/
/* Check di tutti i campi accetta solo lettere numeri ed underscore e meno    */
/*----------------------------------------------------------------------------*/
REG_CHK_CAR = /^[A-z a-z 0-9 _ -]+$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi email                                                      */
/*----------------------------------------------------------------------------*/
REG_EMA = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-]{2,})+\.)+([a-zA-Z0-9]{2,})+$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi numero telefono											  */
/*----------------------------------------------------------------------------*/
REG_TEL = /^([0-9]*\-?\ ?\/?[0-9]*)$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi numerici													  */
/*----------------------------------------------------------------------------*/
REG_NUM = /^[-+]?\d+(\.\d+)?$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi alfabetici                                                 */
/*----------------------------------------------------------------------------*/
REG_ALF = /^[a-zA-z\s]+$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi url													      */
/*----------------------------------------------------------------------------*/
REG_URL = /^(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?/;

/*----------------------------------------------------------------------------*/
/* Check dei campi giorno													  */
/*----------------------------------------------------------------------------*/
REG_GIO = /^(0?[1-9]|[1-2][0-9]|3[01])$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi mese		    											  */
/*----------------------------------------------------------------------------*/
REG_MES = /^(0?[1-9]|1[0-2])$/;

/*----------------------------------------------------------------------------*/
/* Check dei campi anno	     												  */
/*----------------------------------------------------------------------------*/
REG_ANN = /^[0-9]{2,4}$/;

/*----------------------------------------------------------------------------*/
/* Check forma del codice fiscale	    									  */
/*----------------------------------------------------------------------------*/
REG_COD_FIS = /^[a-zA-Z]{6}[0-9]{2}[abcdehlmprstABCDEHLMPRST]{1}[0-9]{2}([a-zA-Z]{1}[0-9]{3})[a-zA-Z]{1}$/;

/*----------------------------------------------------------------------------*/
/* Check lunghezza e caratteri alfabetici nella partita iva                   */
/*----------------------------------------------------------------------------*/
REG_PAR_IVA = /^\d{11}$/;

/*----------------------------------------------------------------------------*/
/* Check dei numeri interi positivi											  */
/*----------------------------------------------------------------------------*/
REG_NUM_INT = /^\d+$/;

/*----------------------------------------------------------------------------*/
/* Check del campo valuta euro												  */
/*----------------------------------------------------------------------------*/
REG_VAL_EUR = /^(-?)(,?)(\d{1,3}(\.\d{3})*|(\d+))(\,\d{2})?$/;

/*----------------------------------------------------------------------------*/
/* Check del campo range di numeri da 1 a 50								  */
/*----------------------------------------------------------------------------*/
REG_RAN_NUM = /^[1-9]{1}$|^[1-4]{1}[0-9]{1}$|^50$/;

/*----------------------------------------------------------------------------*/
/* Check del campo programmi tangram										  */
/*----------------------------------------------------------------------------*/
REG_PRG_TGM = /^[A-Za-z]{3}[0-9]*$/;

/*----------------------------------------------------------------------------*/
/* Numero minimo di caratteri nelle password								  */
/*----------------------------------------------------------------------------*/
REG_MIN_PAS = 4;

/*----------------------------------------------------------------------------*/
/* Numero massimo di caratteri nelle password								  */
/*----------------------------------------------------------------------------*/
REG_MAX_PAS = 8;

/*----------------------------------------------------------------------------*/
/* Caratteri legali nelle password lettere, numeri e underscore, max 20 car   */
/*----------------------------------------------------------------------------*/
REG_CAR_PAS = /^([0-9A-Za-z_\s@.]{1,20})$/;

/*----------------------------------------------------------------------------*/
/* Time del fade della label errore         							      */
/*----------------------------------------------------------------------------*/
TIM_FAD = 0.3;


/*============================================================================*/
/* Inizio della classe validazione										      */ 
/*============================================================================*/
/*----------------------------------------------------------------------------*/
/* Creazione della classe con di valutazione form							  */
/*----------------------------------------------------------------------------*/
var frm_val = Class.create({

	/*------------------------------------------------------------------------*/
	/* Avvio della classe													  */
	/*------------------------------------------------------------------------*/
	initialize: function(frm, abl_ajx) 
				{	  	
				/*------------------------------------------------------------*/
        	    /* Abilitazione di default all'invio della form mezzo ajax	  */
        	    /*------------------------------------------------------------*/
				this.abl_ajx = {
			      					ajax: true
			    			   }
				/*------------------------------------------------------------*/
        	    /* Passa alla proprieta' della classe il dato abl_ajx         */
				/* Nel caso di argomento non passato prende quello di default */
        	    /*------------------------------------------------------------*/
				Object.extend(this.abl_ajx, abl_ajx || {});
				
				/*------------------------------------------------------------*/
        	    /* Punta alla form presa in considerazione                    */
        	    /*------------------------------------------------------------*/
				this.frm = $(frm);
				
				/*------------------------------------------------------------*/
        	    /* Restituisce un'istanza del metodo chk_frm all'evento submit*/
				/* della form												  */
        	    /*------------------------------------------------------------*/
				this.pro_frm = this.chk_frm.bindAsEventListener(this);
				
				this.frm.observe("submit", this.pro_frm);
				
				/*------------------------------------------------------------*/
        	    /* Prende in carico gli elementi della form per gestire il    */
				/* fuoco del campo durante la digitazione                     */
        	    /*------------------------------------------------------------*/
				this.hov_foc();
				
	},
	
	/*========================================================================*/
    /* Funzione classe : Blocca tutti i caratteri non convenzionali e spuri   */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - eve : Evento passato - tasto premuto                             () */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : true/false                                               */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	blo_ins: function(eve)
	{
		var key;

		var cod_key;
		
		/*--------------------------------------------------------------------*/
		/* Per IE															  */
		/*--------------------------------------------------------------------*/
		if (window.event)
		{
			key = window.event.keyCode;
		} 
		
		/*--------------------------------------------------------------------*/
		/* Per Netscape/Firefox/Opera										  */
		/*--------------------------------------------------------------------*/
		if (eve)
		{
			key = eve.which;
		} 
		
		else
		{
			return true;
		}
		
		/*--------------------------------------------------------------------*/
		/* Ricava il codice del tasto premuto								  */
		/*--------------------------------------------------------------------*/
		cod_key = String.fromCharCode(key);
		
		/*--------------------------------------------------------------------*/
		/* Tasti accettati nella digitazione								  */
		/*--------------------------------------------------------------------*/
		if ((key==null) ||
			(key==0) ||		// Tasti direzionali frecce
			(key==8) ||  	// Tasto DEL
			(key==46)||		// Tasto CANC
			(key==109)||	// Tasto -
			(key == 64)		// Tasto chiocciola
			)
		{
			return true;
		} 
		/*--------------------------------------------------------------------*/
		/* Controlla il tipo di caratteri accettati dal campo, se corrispon-  */
		/* dono fa passare il valore del carattere associato al tasto         */
		/* Regex solo lettere numeri e underscore							  */
		/*--------------------------------------------------------------------*/
		else if (!cod_key.match(REG_CHK_CAR))
		{
			
			// alert(cod_key);
			return false;
		} 
		else
		{
			return true;
		}
	},
	
	
	/*========================================================================*/
    /* Funzione classe : Metodo richiamato per il live check del campo input  */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - itm : Campo input della form preso in considerazione      (stringa) */
	/*  - val : Valore del campo input a cui fare il check          (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	avv_liv: function(itm,
					  val)
	{
		/*--------------------------------------------------------------------*/
		/* Rende proprieta dell'oggetto l'item input preso in considerazione  */
		/*--------------------------------------------------------------------*/
		this.itm = itm;
		
		/*--------------------------------------------------------------------*/
		/* Rende proprieta dell'oggetto il valore dell'input                  */
		/*--------------------------------------------------------------------*/
		this.val_inp = val;
		
		/*--------------------------------------------------------------------*/
		/* Il controllo live viene effettuato solo se richiesto con +Liv      */
		/*--------------------------------------------------------------------*/
		if (itm.id.match(/\+Liv/))
		{
			/*----------------------------------------------------------------*/
			/* Richiama il metodo di live check del campo input               */
			/*----------------------------------------------------------------*/
			this.chk_liv();
		}
	},
	
	/*========================================================================*/
    /* Funzione classe : Effettua il live check del valore inserito           */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  :   none                                                        () */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	chk_liv: function()
	{
		/*--------------------------------------------------------------------*/
		/* Se il campo non e' vuoto e richiesto un controllo sulla tipologia  */
		/* dei dati inseriti    										      */
		/*--------------------------------------------------------------------*/
		if (this.val_inp) 
		{
			/*----------------------------------------------------------------*/
        	/* Ottiene l'id dell'elemento (campo) da processare               */
        	/*----------------------------------------------------------------*/
			var idd_ele = this.itm.id;
			
			/*----------------------------------------------------------------*/
        	/* Ottiene il tipo di campo dall'id per procedere con la valida-  */
		    /* zione appropriata, il valore restituito e' un array            */
        	/*----------------------------------------------------------------*/					  
			var typ_cam = idd_ele.match(REG_TYP_CAM);
			
			/*----------------------------------------------------------------*/
        	/* Se il campo in errore viene corretto e non lasciato vuoto      */
        	/*----------------------------------------------------------------*/
			if (!(idd_ele.match(/\+Ric/) && this.val_inp.match(REG_CAM_VTO)) ) 
			{
	            
				/*------------------------------------------------------------*/
	        	/* Viene spenta la label di visualizzazione errore            */
	        	/*------------------------------------------------------------*/
				this.err_off(idd_ele);
	        }
			
			/*----------------------------------------------------------------*/
        	/* Se e' richiesta il check dato con l'analisi typ_cam            */
        	/*----------------------------------------------------------------*/
			if (typ_cam)
			{
				/*------------------------------------------------------------*/
	    	    /* Tipo di campo preso dall'array del match di regex		  */
	    	    /*------------------------------------------------------------*/
				var typ = typ_cam[1];
				
				/*------------------------------------------------------------*/
	        	/* Recupera il messaggio di errore dal tille del campo input  */
	        	/*------------------------------------------------------------*/
				var mes_err	= $(idd_ele).readAttribute('title');
				
				/*------------------------------------------------------------*/
	    	    /* Richiama il metodo di valutazione campo                    */
	    	    /*------------------------------------------------------------*/
		    	var err_val = this.chk_cmp(this.val_inp, typ, this.itm);
		    	
		    	/*------------------------------------------------------------*/
	    	    /* Se il campo e' in errore	richiama il metodo che visualizza */
		    	/* la label contenente il messaggio di errore				  */
	    	    /*------------------------------------------------------------*/
		    	if (err_val) 
		    	{
		    		/*--------------------------------------------------------*/
        	        /* Se il metodo restituisce una stringa dell'errore       */
		    		/* sostituisce la stringa fornita dal <title> del campo   */      
        	        /*--------------------------------------------------------*/
		    		if (err_val != true) 
		    		{
		    			mes_err = err_val;
		    		}
		    		
		    		this.err_onn(idd_ele, 
		    				     mes_err);
		    		
		    		/**
		    		 * Debug
		    		 */
		    		//alert(idd_ele +'err> '+mes_err);
		    		
		    	}
		    			    	
		    	/*------------------------------------------------------------*/
        	    /* Se il campo non e' più in errore rimuove la label di error */
        	    /*------------------------------------------------------------*/
		    	else 
				{
		        	this.err_off(idd_ele);
		        }
			}
			
		}
	},	
	
	/*========================================================================*/
    /* Funzione classe : Metodo classe da il fuoco al campo selezionato       */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  :  none						                                   () */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	hov_foc: function() 
	{ 
		/*--------------------------------------------------------------------*/
		/* Carica tutti gli elementi della form in un array 'ele'             */
		/*--------------------------------------------------------------------*/
	 	this.frm.select('input').each(function(ele) 
	 	{
	 		/*----------------------------------------------------------------*/
        	/* Controlla il focus nel campo, bind passa l'elemento alla fun-  */
	 		/* zione addClassName                                             */
        	/*----------------------------------------------------------------*/
	    	Event.observe(ele, 'focus', function() 
	    	{
	      		Element.addClassName(this,'foc_hov');
	    	
	    	}.bind(ele));
	    	
	    	/*----------------------------------------------------------------*/
        	/* Rimuove il focus del campo, bind passa l'elemento alla fun-    */
	 		/* zione removeClassName                                          */
        	/*----------------------------------------------------------------*/
	    	Event.observe(ele, 'blur', function() 
	    	{
	      		Element.removeClassName(this,'foc_hov');
	    	
	    	}.bind(ele));
		});
	},

	/*========================================================================*/
    /* Funzione classe : Modifica l'aspetto con un css al campo form dove si  */
	/*                   verifica l'errore                                    */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - cam_idd : Id del campo della form da processare           (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	err_foc: function(cam_idd)
	{
		Element.addClassName($(cam_idd),'val_err');
		
	},
	
	/*========================================================================*/
    /* Funzione classe : Qunado il campo della form e' corretto elimina il css*/
	/*                   applicato                                            */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
	/*  - cam_idd : Id del campo della form da processare           (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	err_can: function(cam_idd)
	{
		Element.removeClassName($(cam_idd),'val_err');
		
	},
	
	/*========================================================================*/
    /* Funzione classe : Visualizza il messaggio di errore a fianco del campo */
	/*                   input											      */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - ele :  Id degli elementi della form                       (stringa) */
	/*  - msg :  Messaggio di avviso errore      				    (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	err_onn: function(ele, 
					  msg) 
	{
	    /*--------------------------------------------------------------------*/
		/* Assegna la classe errore all'elemento della form				      */
		/*--------------------------------------------------------------------*/
	    $(ele).addClassName('val_err');
	    
	    /*--------------------------------------------------------------------*/
		/* Id della label che appare con il messaggio di errore               */
		/*--------------------------------------------------------------------*/
	    var new_ele = 'err_' + ele;
	    
	    /*--------------------------------------------------------------------*/
		/* Se l'id della nuova label e' presente viene eliminata              */
		/*--------------------------------------------------------------------*/
	    if ($(new_ele))
	    {
	    	this.err_off(new_ele);
	    }
	    
	    /*--------------------------------------------------------------------*/
		/* Se presente il messaggio di errore accoda all'elemento input, con  */
	    /* up(), il nuovo elemento label che conterra' l'errore				  */
	    /* Update inserisce il messaggio di errore dentro la label            */
		/*--------------------------------------------------------------------*/
	    if (msg)
	    {
	    	$(ele).up().appendChild(new Element('label',{
	    									            	'id'    :  new_ele, 
	    									            	'class' : 'lab_err',
	    									            	'style' : 'display:none;'
						    		 					}
	    									   ).update(msg));
	    	
	    	/*----------------------------------------------------------------*/
        	/* Applica l'effetto fade alla label - da sac   				  */
        	/*----------------------------------------------------------------*/
	    	Effect.Appear(new_ele, { duration: TIM_FAD }); return false;
	    }
	},

	/*========================================================================*/
    /* Funzione classe : Elimina il messaggio di errore a fianco del campo    */
	/*				     input												  */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
	/*  - ele :  Id degli elementi della form                       (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*      Effect.Fade('test_div'); return false;                            */
    /*------------------------------------------------------------------------*/
	err_off: function(ele) 
	{
		/*--------------------------------------------------------------------*/
		/* Elimina il css applicato al campo di input sotto errore            */
		/*--------------------------------------------------------------------*/
	    $(ele).removeClassName('val_err');
	    
	    /*--------------------------------------------------------------------*/
		/* Se esiste al label corrispondente al campo input sotto errore la   */
	    /* rimuove															  */
		/*--------------------------------------------------------------------*/
	    if ($(ele).up().down('label.lab_err')) 
	    {
	    	$(ele).up().down('label.lab_err').remove();
	    }
	},

	/*========================================================================*/
    /* Funzione classe : Reset dei campi della form                           */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  :   none								                           () */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	res_frm : function() {
		
		/*--------------------------------------------------------------------*/
		/* Resetta i campi della form								   	      */
		/*--------------------------------------------------------------------*/
		this.frm.reset();

		/*--------------------------------------------------------------------*/
		/* Raccoglie i campi della form in un array che poi viene ciclato     */
		/*--------------------------------------------------------------------*/
		arr_ele = this.frm.getElements();
		
		arr_ele.each(function(frm_ele)
		{
			/*----------------------------------------------------------------*/
        	/* Rimuove la classe di errore dagli elementi della form          */
        	/*----------------------------------------------------------------*/
			frm_ele.removeClassName('val_err');
			
			/*----------------------------------------------------------------*/
        	/* Rimuove la classe di errore dalle label di ogni elemento in err*/
        	/*----------------------------------------------------------------*/
			if ($(frm_ele).up().down('label.lab_err')) 
		    {
		    	$(frm_ele).up().down('label.lab_err').remove();
		    }
		});
	},
	
	/*========================================================================*/
    /* Funzione classe : Controllo dei campi della form                       */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - eve :  Evento che si sta verificando nella form "submit"  (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	chk_frm: function(eve) 
	{ 
		/*--------------------------------------------------------------------*/
		/* Blocca il submit della form per effettuare il controllo dei campi  */
		/*--------------------------------------------------------------------*/
		Event.stop(eve);
	    
		/*--------------------------------------------------------------------*/
		/* Identifica errore presente										  */
		/*--------------------------------------------------------------------*/
		var err = '';
		
		/*--------------------------------------------------------------------*/
		/* Elemento della form in errore validazione						  */
		/*--------------------------------------------------------------------*/
	    var ele_err	= null;
	    
	    /*--------------------------------------------------------------------*/
		/* Identifica se il div risposta e' attivo, se lo e' lo rimuove e lo  */
	    /* sostituisce con quello nuovo di risposta dal server                */
		/*--------------------------------------------------------------------*/
	    if ($('risposta')) { $('risposta').remove(); }
		
	    /*--------------------------------------------------------------------*/
		/* Ottiene tutti gli elementi della form in un array con getElements  */
	    /* ogni elemento dell'array viene passato alla funzione da each, per  */
	    /* essere controllato											      */
		/*--------------------------------------------------------------------*/
		this.frm.getElements().each(function(frm_ele) 
		{
			/*----------------------------------------------------------------*/
        	/* Ritorna il valore di ogni campo della form mettendolo in una   */
			/* variabile												      */
        	/*----------------------------------------------------------------*/
			var val_inp = $F(frm_ele);
			
			/*----------------------------------------------------------------*/
        	/* Ottiene l'id del campo preso in considerazione, se esiste lo   */
			/* registra in una var altrimenti passa un campo vuoto e non viene*/
			/* effettuato nessun controllo sul campo di input				  */
        	/*----------------------------------------------------------------*/
			var idd_ele	= frm_ele.readAttribute('id') ? 
						  frm_ele.readAttribute('id') : 
						  '';
			
			/*----------------------------------------------------------------*/
        	/* Ottiene il tipo di campo dall'id per procedere con la valida-  */
		    /* zione appropriata, il valore restituito e' un array            */
        	/*----------------------------------------------------------------*/					  
			var typ_cam = idd_ele.match(REG_TYP_CAM);
			
			/*----------------------------------------------------------------*/
        	/* Recupera il messaggio di errore dal tille del campo input      */
        	/*----------------------------------------------------------------*/
			var mes_err	= frm_ele.readAttribute('title');
	
			/*----------------------------------------------------------------*/
        	/* Se non vengono passati le informazioni di autenticazione in for*/
			/* ma corretta, la funzione viene terminata	ES: nom_Ric_Num		  */
        	/*----------------------------------------------------------------*/
			if (!idd_ele.match(REG_CHK_FOR)) 
			{
	            return;
			}  
			
			/*----------------------------------------------------------------*/
        	/* Se il campo e' richiesto e lasciato vuoto                      */
        	/*----------------------------------------------------------------*/
			if (idd_ele.match(/\+Ric/) && val_inp.match(REG_CAM_VTO)) 
			{
	            /*------------------------------------------------------------*/
        	    /* Viene visualizzato il messaggio di errore validazione      */
        	    /*------------------------------------------------------------*/
				this.err_onn(idd_ele, 
							 mes_err);
				
				/*------------------------------------------------------------*/
        	    /* Errore presente											  */
        	    /*------------------------------------------------------------*/
				err = 1;
	            
				/*------------------------------------------------------------*/
        	    /* Assegna alla variabile l'elemento della form in errore val */
        	    /*------------------------------------------------------------*/
				ele_err = frm_ele;
				
	            return;
	        }
			/*----------------------------------------------------------------*/
        	/* Viene spenta la label di visualizzazione errore                */
        	/*----------------------------------------------------------------*/
			else 
			{
	        	this.err_off(idd_ele);
	        }
			
			/*----------------------------------------------------------------*/
			/* Se il campo non e' vuoto e richiesto un controllo sulla tipolo-*/
			/* gia di dati 													  */
			/*----------------------------------------------------------------*/
			if (typ_cam && !val_inp.match(REG_CAM_VTO)) 
			{
		    	/*------------------------------------------------------------*/
        	    /* Tipo di campo preso dall'array del natch di regex		  */
        	    /*------------------------------------------------------------*/
				var typ = typ_cam[1];
		    	
				/*------------------------------------------------------------*/
        	    /* Richiama il metodo di valutazione campo                    */
        	    /*------------------------------------------------------------*/
		    	var err_val = this.chk_cmp(val_inp, typ, this.itm);
		    	
		    	/*------------------------------------------------------------*/
        	    /* Se il campo e' in errore	richiama il metodo che visualizza */
		    	/* la label contenente il messaggio di errore				  */
        	    /*------------------------------------------------------------*/
		    	if (err_val) 
		    	{
		    		
		    		/*--------------------------------------------------------*/
        	        /* Se il metodo restituisce una stringa dell'errore       */
		    		/* sostituisce la stringa fornita dal <title> del campo   */      
        	        /*--------------------------------------------------------*/
		    		if (err_val != true) 
		    		{
		    			mes_err = err_val;
		    		}
		    		
		    		this.err_onn(idd_ele, 
		    				     mes_err);
		    		
		    		/*--------------------------------------------------------*/
	        	    /* Errore presente				    					  */
	        	    /*--------------------------------------------------------*/
					err = 1;
		    		
		    		/*--------------------------------------------------------*/
	        	    /* Assegna alla var l'elemento della form in errore val   */
	        	    /*--------------------------------------------------------*/
		    		ele_err = frm_ele;
		    	}
			}
		/*--------------------------------------------------------------------*/
		/* bindAsEventListener passa al verificarsi del submit l'oggetto alla */
		/* funzione per l'eleaborazione di tutti gli elemeti della form       */
		/*--------------------------------------------------------------------*/
		}.bindAsEventListener(this));
		
		/*--------------------------------------------------------------------*/
		/* Se non esistono errori di validazione si avviano i campi della form*/
		/* al server per essere gestiti										  */
		/*--------------------------------------------------------------------*/
		if (err == 0) 
		{
			/*----------------------------------------------------------------*/
        	/* Se e' richiesto ajax invia i dati mezzo ajax, altrimenti effet-*/
			/* ta un normale submit                                           */
        	/*----------------------------------------------------------------*/
			if (this.abl_ajx.ajax)
			{
				this.inv_dat(); 
			} 
			else 
			{
				this.frm.submit();
			}
		} 
		/*--------------------------------------------------------------------*/
		/* Se invece esistono errori effettua il focus dei campi in errore    */
		/*--------------------------------------------------------------------*/
		else 
		{
			ele_err.focus();
		}
	},
	
	/*========================================================================*/
    /* Funzione classe : Metodo di check dei campi form con uso delle espres- */
	/*                   sioni regolari impostate sopra                       */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - cma_val  :  Valore inserito al campo della form       (stringa/num) */
	/*  - typ_val  :  Tipo di validazione da effettuare         (stringa)     */
	/*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	chk_cmp: function (cmp_val, 
					   typ_val,
					   itm_frm) 
	{
		switch (typ_val) 
		{
			/*----------------------------------------------------------------*/
	        /* Controllo solo numero				        				  */
	        /*----------------------------------------------------------------*/
			case 'Num':
			
				var cmp_num = cmp_val;
						
				if (!cmp_num.match(REG_NUM)) 
				{ 
					return true; 
				}     
			
				break;
					
			/*----------------------------------------------------------------*/
        	/* Controllo solo alfabetico					        		  */
        	/*----------------------------------------------------------------*/
			case 'Alf':
						
				var cmp_alf = cmp_val;
					
				if (!cmp_alf.match(REG_ALF)) 
				{ 
					return true; 
				}     
				
				break;
				
			/*----------------------------------------------------------------*/
	       	/* Controllo numero telefono					        		  */
	       	/*----------------------------------------------------------------*/
			case 'Tel':
			
				var cmp_tel = cmp_val;
				
				if (!cmp_tel.match(REG_TEL)) 
				{ 
					return true; 
				}     
					break;
			
			/*----------------------------------------------------------------*/
        	/* Controllo email                                                */
        	/*----------------------------------------------------------------*/	
			case 'Email':
			
				var cmp_ema = cmp_val;
				
				if (!cmp_ema.match(REG_EMA)) 
				{ 
					return true;
				}     
			break;
					
			/*----------------------------------------------------------------*/
        	/* Controllo url												  */
        	/*----------------------------------------------------------------*/	
			case 'Url':
			
				var cmp_url = cmp_val;
						
				if (!cmp_url.match(REG_URL)) 
				{ 
					return true; 
				}
			break;
					
			/*----------------------------------------------------------------*/
        	/* Controllo data												  */
        	/*----------------------------------------------------------------*/		
			case 'Data':
			
				var cmp_dat = cmp_val.split('/');
			
				if (3 != cmp_dat.length || 
			        	!cmp_dat[0].match(REG_GIO) || 
			        	!cmp_dat[1].match(REG_MES) || 
			        	!cmp_dat[2].match(REG_ANN)
			        ) { 
						return true; 
					  }
						
			break;
					
			/*----------------------------------------------------------------*/
			/* Controllo codice fiscale					         			  */
			/*----------------------------------------------------------------*/	
			case 'CodFis':


				var fis_cod = cmp_val;

				/*------------------------------------------------------------*/
				/* Se il check ritorna true									  */
				/*------------------------------------------------------------*/
				if (this.cod_fis(fis_cod) == true) 
				{
					return true; 
				}
				/*------------------------------------------------------------*/
				/* Se il check ritorna una stringa di messaggio errore		  */
				/*------------------------------------------------------------*/
				else if (this.cod_fis(fis_cod) != true)
				{
					return this.cod_fis(fis_cod);
				}

			break;

			/*----------------------------------------------------------------*/
			/* Controllo partita iva		        						  */
			/*----------------------------------------------------------------*/
			case 'Piva':

				var cod_iva = cmp_val;

				/*------------------------------------------------------------*/
				/* Se il check ritorna true, controllo solo all'inserimento   */
				/* dell'11a cifra (carattere di controllo)       			  */
				/*------------------------------------------------------------*/
				if ( (this.par_iva(cod_iva) == true) && (cod_iva.length > 10) ) 
				{
					return true; 
				}
			break;	
				
			/*----------------------------------------------------------------*/
			/* Controlla la validita' di una password  						  */
			/*----------------------------------------------------------------*/
			case 'Pass':
				
				var dat_pas = cmp_val;
				
				/*------------------------------------------------------------*/
				/* Se il check ritorna una stringa di messaggio errore		  */
				/*------------------------------------------------------------*/
				if (this.val_pas(dat_pas))
				{
					return this.val_pas(dat_pas);
				}
			break;
			
			/*----------------------------------------------------------------*/
			/* Effettua la verifica della password  						  */
			/*----------------------------------------------------------------*/
			case 'Pasv':
				
				var dat_pas = cmp_val;
				
				/*------------------------------------------------------------*/
        	    /* Pat ricerca del nome del campo contenente la password, lo  */
				/* ricava dal nome del campo di verifica					  */
        	    /*------------------------------------------------------------*/
				var pat = /[a-z A-Z 0-9 _]*$/;
				
				/*------------------------------------------------------------*/
        	    /* Recupera il nome del campo password						  */
        	    /*------------------------------------------------------------*/
				nom_cmp_pas = itm_frm.name.match(pat);
				
				/*------------------------------------------------------------*/
        	    /* Valore del campo password								  */
        	    /*------------------------------------------------------------*/
				val_cmp_pas = this.frm.elements[nom_cmp_pas].value;
				
				if ( (dat_pas != val_cmp_pas)  && (dat_pas.length > 3) )
				{
					return true;
				}
				
			break;	

			/*----------------------------------------------------------------*/
			/* Controllo numero intero positivo                               */
			/*----------------------------------------------------------------*/
			case 'Int':
				var cmp_int = cmp_val;

				if (!cmp_int.match(REG_NUM_INT))  
				{ 
					return true; 
				}     
			break;

			/*----------------------------------------------------------------*/
			/* Controllo campo valuta                                         */
			/*----------------------------------------------------------------*/
			case 'Val':
				var cmp_val = cmp_val;

				if (!cmp_val.match(REG_VAL_EUR)) 
				{ 
					return true; 
				}     
			break;

			/*----------------------------------------------------------------*/
			/* Controllo campo range numeri                                   */
			/*----------------------------------------------------------------*/
			case 'Ran':
				var cmp_ran = cmp_val;

				if (!cmp_ran.match(REG_RAN_NUM)) 
				{ 
					return true; 
				}     
			break;

						
			/*----------------------------------------------------------------*/
			/* Controllo campo richiamo programmi tangram                     */
			/*----------------------------------------------------------------*/
			case 'Prg':
				
				var cmp_prg = cmp_val;
				
				/*------------------------------------------------------------*/
        	    /* Il match viene effettuato alla digitazione del 3o digit	  */
        	    /*------------------------------------------------------------*/
				if ( (!cmp_prg.match(REG_PRG_TGM)) && (cmp_prg.length >= 3) )
				{ 
					return true; 
				}     
				break;
				
				default:
				return null;
		}
	
	}, 
	
	/*========================================================================*/
    /* Funzione classe : Controllo codice fiscale                             */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
	/*  -  cod_fis :  Dato da nalizzare                             (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
	/*  - return   : true o false                                             */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	cod_fis: function(cod_fis)
	{
		/*--------------------------------------------------------------------*/
		/* Passatutto in uppercase											  */
		/*--------------------------------------------------------------------*/		    
		cod_fis = cod_fis.toUpperCase();
		
		/*--------------------------------------------------------------------*/
		/* Controlla i caratteri inseriti numero e non alfabetici **in piu'** */
		/*--------------------------------------------------------------------
		if ( (!cod_fis.match(REG_COD_FIS)) && (cod_fis.length > 15) )
		{
			return "Codice fiscale incompleto!";
		}*/
		
		var set_uno = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		    
		var set_due = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
		    
		var set_par = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		    
		var set_dis = "BAKPLCQDREVOSFTGUHMINJWZYX";

		/*--------------------------------------------------------------------*/
		/* Variabile stringa codice fiscale per concatenazione dei calcoli    */
		/*--------------------------------------------------------------------*/
		s = 0;
		    
		for( i = 1; i <= 13; i += 2 )
		{
			s += set_par.indexOf( set_due.charAt( set_uno.indexOf( cod_fis.charAt(i) )));
		}
		    
		for( i = 0; i <= 14; i += 2 )
		{
		    s += set_dis.indexOf( set_due.charAt( set_uno.indexOf( cod_fis.charAt(i) )));
		}
		    
		if( s % 26 != cod_fis.charCodeAt(15)-'A'.charCodeAt(0) )
		{
			return true;
		}
	},
	
	
	/*========================================================================*/
    /* Funzione classe : Controlla la corettezza della partita iva            */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  cod_iva :  Dato da analizzare                                (num) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : true o false                                             */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	par_iva: function(cod_iva)
	{ 
		/*--------------------------------------------------------------------*/
		/* Variabile numerica partita iva per concatenazione dei calcoli      */
		/*--------------------------------------------------------------------*/
		s = 0;
		
		/*--------------------------------------------------------------------*/
		/* Somma delle cifre di posto dispari                                 */
		/*--------------------------------------------------------------------*/
		for( i = 0; i <= 9; i += 2 )
		{
			s += cod_iva.charCodeAt(i) - '0'.charCodeAt(0);
		}
		/*--------------------------------------------------------------------*/
		/* Somma del doppio delle cifre di posto pari						  */
		/*--------------------------------------------------------------------*/   
		for( i = 1; i <= 9; i += 2 )
		{
			c = 2*( cod_iva.charCodeAt(i) - '0'.charCodeAt(0) );
			
			if( c > 9 )
		    {
		    	c = c - 9;
		    }
		        s += c;
		}
		
		/*--------------------------------------------------------------------*/
		/* Controlla la corettezza con il check dell'ultimo numero, il calcolo*/
		/* deve dare come risultato 0, altrimenti la p.iva e' errata          */
		/* s%10 restituisce il resto della divisione di s/10                  */
		/*--------------------------------------------------------------------*/
		if( ( 10 - s % 10 )% 10 != cod_iva.charCodeAt(10) - '0'.charCodeAt(0) )
		{
			return true;
		}
		
	},	
	
	/*========================================================================*/
    /* Funzione classe : Controlla la lunghezza di una password inserita      */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  pas :  Password da analizzare                                (num) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : true o false                                             */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	val_pas: function(pas)
	{ 
		var err = "";
	    
		/*--------------------------------------------------------------------*/
		/* Controla la lunghezza della password passata						  */
		/*--------------------------------------------------------------------*/
	    if ((pas.length < REG_MIN_PAS) || (pas.length > REG_MAX_PAS)) 
	    {
	        err = "La password ha lunghezza errata, min "+ REG_MIN_PAS + 
	               " caratteri max " + REG_MAX_PAS + " caratteri. \n";
	        
	        return err;
	        
	    } 
	    /*--------------------------------------------------------------------*/
		/* Controla che non ci siano caratteri illegali nella password		  */
		/*--------------------------------------------------------------------*/
	    else if (!pas.match(REG_CAR_PAS)) 
	    {
	        err = "La password contiene caratteri illegali.\n";
	        
	        return err;
	    	    
	    }
	},	
	
	/*========================================================================*/
    /* Funzione classe : Invia i dati della form mezzo ajax                   */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  :  none								                           () */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	inv_dat: function() 
	{
		/*--------------------------------------------------------------------*/
		/* Rileva l'action della form                                         */
		/*--------------------------------------------------------------------*/
		var url =  this.frm.readAttribute('action');
		
		/*--------------------------------------------------------------------*/
		/* Tipologia di invio GET o POST                                      */
		/*--------------------------------------------------------------------*/
		var typ_inv	= this.frm.readAttribute('method');
		
		/*--------------------------------------------------------------------*/
		/* I dati dei campi form vengono serializzati per l'invio tipo url    */
		/*--------------------------------------------------------------------*/
		var dat = this.frm.serialize();
		
		/*--------------------------------------------------------------------*/
		/* Invio della form													  */
		/*--------------------------------------------------------------------*/
		var inv_ajx = new Ajax.Request( url, 
									    { method	: 	typ_inv, 
			                              parameters: 	dat, 
			                              onCreate	: 	this.mos_loa.bind(this), 
			                              onComplete: 	this.ott_dat.bind(this)
			                            });
	},

	/*========================================================================*/
    /* Funzione classe : Mostra il loading durante la transazione ajax        */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  -  : none                        								   () */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	mos_loa: function() 
	{
		/*--------------------------------------------------------------------*/
		/* Inserisce dopo l'elemento form un campo html con il dato loading   */
		/*--------------------------------------------------------------------*/
		this.frm.insert({
							after: '<p id="loading">loading...</p>'
					    });
		
		/*--------------------------------------------------------------------*/
		/* Se e' presente qualche errore nei campi form li rimuove			  */
		/*--------------------------------------------------------------------*/
		if ($('err')) 
		{ 
			$('err').remove(); 
		}
	},
	
	/*========================================================================*/
    /* Funzione classe : Raccoglie e visualizza la risposta del server        */
    /* ---------------------------------------------------------------------- */
    /* Valori in input                                                        */
    /*                                                                        */
    /*  - transport :  Risposta del server                          (stringa) */
    /*                                                                        */
    /* ---------------------------------------------------------------------- */
    /* Valori in output                                                       */
    /*                                                                        */
    /*  - return   : none                                                     */
    /*                                                                        */
    /*------------------------------------------------------------------------*/
	ott_dat: function(transport) 
	{
		/*--------------------------------------------------------------------*/
		/* Elimina la dicitura loading										  */
		/*--------------------------------------------------------------------*/
		$('loading').remove();
		
		/*--------------------------------------------------------------------*/
		/* Mette in una var la risposta del server                            */
		/*--------------------------------------------------------------------*/
		var new_dat = transport.responseText;
		
		/*--------------------------------------------------------------------*/
		/* Inserisce dopo l'elemento form la risposta del server              */
		/*--------------------------------------------------------------------*/
		this.frm.insert({
							after: new_dat
						});
		
		/*--------------------------------------------------------------------*/
		/* Reset della form													  */
		/*--------------------------------------------------------------------*/
		this.frm.reset();
		
	}	
  
});
/*============================================================================*/
/* Fine della classe validazione										      */ 
/*============================================================================*/
