/********************************************/
/*	checkForm 0.3 for jquery
/*	davide reppucci | nascar
/*
/*  esempio di html dell'alert
/*  che viene creato nel <p> contentente
/*  la <label> e <input> relativo
/*
/*  <span class="requiredField">
/* 		<em>campo obbligatorio</em>
/*  </span>
/*******************************************/

// variabile globale
block = false;

var Forms = {

	_labels: { },
	defaults: { },
	
	init : function( _labels ) {
	
		// valori di default
		Forms.defaults = {
		
			lengthPassword:6,
            lengthUser: 30,
			labelEmail:'email errata', 
			labelCampo:'campo obbligatorio',
			labelWarning: 'attenzione: compila tutti i campi obbligatori',
			labelScelta:'scelta obbligatoria',
			labelPassword:'il numero minimo di caratteri &egrave; ',
			labelUser:'questo campo pu&ograve; contenere solo caratteri alfanumerici e "_-"',
			labelUserLength:'il numero massimo di caratteri &egrave; ',
			labelSame:'le password non coincidono',
			labelNumber:'campo numerico',
			labelData:'data errata',
			labelOffsetY: 0,
			labelOffsetX: 15,
			labelContinuous: true
		
		};

		// se i parametri sono stati passati
		// allora sostituisco quelli
		// di default
		Forms._labels = jQuery.extend(Forms.defaults, _labels);

		// setto le costanti
		Forms.CLASS_REQUIRED_FIELD = 'requiredField';
		Forms.CLASS_REQUIRED_CHECK = 'requiredCheck';
		Forms.CLASS_EMAIL_ERROR = 'emailError';
		Forms.CLASS_PASSWORD_ERROR = 'passwordError';
		Forms.CLASS_SAME_ERROR = 'sameError';
		Forms.CLASS_CAPTCHA_ERROR = 'captchaError';
		Forms.CLASS_NUMBER_ERROR = 'numberError';
		Forms.CLASS_DATA_ERROR = 'dataError';
		Forms.CLASS_USER_ERROR = 'userError';
		Forms.CLASS_USERLENGTH_ERROR = 'userLengthError';	
		
		// setto le variabili
		Forms.emailFilter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		Forms.dataFilter  = /^([0-9]{2})+\/(([0-9]{2})+\/)+([0-9]{4})+$/;
		Forms.userFilter  = /^([a-zA-Z0-9_\.])+$/;
		Forms.numberRegex = /^([+\_\.\/\s\-\d])+$/;

		// setto gli eventi agli input 
		// con il controllo dello swap
		Forms.setSwaps();
		
		// setto i controlli sui form con 
		// i campi obbligatori
		Forms.addRequired();
		
	
	},
	
	
	
	/**
	* metodo che assegna gli eventi del mouse
	* agli input che avranno il controllo dello swap
	*/
	
	setSwaps : function() {
		
		swapValue = [];
		
		jQuery(".valueSwap").each(function(i){
		
		   swapValue[i] = jQuery(this).val();
			
			jQuery(this).attr('default',jQuery(this).val());
			jQuery(this).clearingInput( { text: jQuery(this).val() } );
		      
		});	
	
	},
	
	/* metodo che aggiunge un tooltip */
	addTooltip : function( target ) {
	
		jQuery(target).tooltip({
		    delay: 0,
		    track: true,
		    fade: 250,
		    top: Forms._labels.labelOffsetY, 
			left: Forms._labels.labelOffsetX,
			showBody: " - "
		});
	
	},	
	
	/**
	* metodo che ricerca in tutti i form
	* i campi obbligatori, e fa i controlli
	* all'action del form
	*/	
	addRequired : function() {
	
		// cerco i form da controllare
		Forms.checkForms = jQuery('.checkForm');
	
		// setto i controlli sul form
		Forms.checkForms.submit(Forms.check);
		
	
	},
	
	getElementsByClassName : function(oElm, strTagName, strClassName) {
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}
		}
		return (arrReturnElements)
	},
	
	scrollTo : function(target, speed, easing) {
	
		return target.each(function() {
		
		  var targetOffset = jQuery(target).offset().top;
		  jQuery('html,body').animate({scrollTop: targetOffset}, speed, easing);
		  
		});
		
	},

	/**
	* metodo che controlla la correttezza del form.
	* in caso negativo mostra gli alert
	* altrimenti prosegue il submit
	*/
	check : function( event ) {

		// azione per debug
		//event.preventDefault();

		// lista dei campi obbligatori
		var fieldsRequired = Forms.getElementsByClassName(event.target, '*', 'required');
		var fieldsEmail = Forms.getElementsByClassName(event.target, '*', 'email');
		var fieldsPassword = Forms.getElementsByClassName(event.target, '*', 'password');
		var fieldsSame = Forms.getElementsByClassName(event.target, '*', 'same');
		var fieldsCaptcha = Forms.getElementsByClassName(event.target, '*', 'captcha');
		var fieldsNumber = Forms.getElementsByClassName(event.target, '*', 'number');
		var fieldsData = Forms.getElementsByClassName(event.target, '*', 'data');
		var fieldsUser = Forms.getElementsByClassName(event.target, '*', 'user');
		
		// lista degli alert
		var alertRequired = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_REQUIRED_FIELD);
		var alertCheck = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_REQUIRED_CHECK);
		var alertEmail = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_EMAIL_ERROR);
		var alertPassword = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_PASSWORD_ERROR);
		var alertSame = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_SAME_ERROR);
		var alertCaptcha = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_CAPTCHA_ERROR);
		var alertNumber = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_NUMBER_ERROR);
		var alertData = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_DATA_ERROR);
		var alertUser = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_USER_ERROR);
		var alertUserLength = Forms.getElementsByClassName(event.target, '*', Forms.CLASS_USERLENGTH_ERROR);
		
		// array che indicano i campi da controllare
		var required = new Array();
		var emails = new Array();
		var passwords = new Array();
		var sames = new Array();
		var captchas = new Array();
		var numbers = new Array();
		var dates = new Array();
		var users = new Array();
		var usersl = new Array();

		// rimuovo tutti gli alert
		for ( var i = 0 ; i < alertRequired.length ; i++ ) { jQuery(alertRequired[i]).remove(); }
		for ( var j = 0 ; j < alertCheck.length ; j++ ) { jQuery(alertCheck[j]).remove(); }
		for ( var k = 0 ; k < alertEmail.length ; k++ ) { jQuery(alertEmail[k]).remove(); }
		for ( var m = 0 ; m < alertPassword.length ; m++ ) { jQuery(alertPassword[m]).remove(); }
		for ( var y = 0 ; y < alertSame.length ; y++ ) { jQuery(alertSame[y]).remove(); }
		for ( var u = 0 ; u < alertCaptcha.length ; u++ ) { jQuery(alertCaptcha[u]).remove(); }
		for ( var x = 0 ; x < alertNumber.length ; x++ ) { jQuery(alertNumber[x]).remove(); }
		for ( var z = 0 ; z < alertData.length ; z++ ) { jQuery(alertData[z]).remove(); }
		for ( var s = 0 ; s < alertUser.length ; s++ ) { jQuery(alertUser[s]).remove(); }
		for ( var s = 0 ; s < alertUserLength.length ; s++ ) { jQuery(alertUserLength[s]).remove(); }
		

		/**
		* ciclo tutti i campi obbligatori
		*/
		for ( var src = 0 ; src < fieldsRequired.length ; src ++ ) {
			
			// controllo i campi obbligatori
			switch ( fieldsRequired[src].type ) {
			
				case "text":
				case "textarea":
				case "password":
				case "hidden":
				case "file":
				case "select":
				case "select-one":
		
					if ( fieldsRequired[src].value == "" || fieldsRequired[src].value == jQuery(fieldsRequired[src]).attr('default') )

						required.push( fieldsRequired[src] );

					break;
				
				case "radio":
				case "checkbox":
									
					if ( fieldsRequired[src].checked != true) required.push( fieldsRequired[src] );
					
					break;
			
			}
		
		}


		// se ci sono dei campi obbligatori non compilati
		// visualizzo gli alert
		if (required.length > 0) {

			for ( var src = 0 ; src < required.length ; src ++ ) {
				
				switch ( required[src].type ) {
			
					case "text":
					case "textarea":
					case "password":
					case "hidden":
					case "file":
					case "select":
					case "select-one":
						
						var alertNode = document.createElement('span');
						alertNode.title = Forms._labels.labelCampo;
						alertNode.className=Forms.CLASS_REQUIRED_FIELD;
						alertNode.innerHTML="<em>"+Forms._labels.labelCampo+"</em>";
						
						jQuery(required[src]).closest('p').append(alertNode);
						
						// associo il tooltip all'alert
						Forms.addTooltip( jQuery(alertNode) );
						
					break;
					
					case "radio":
					case "checkbox":
						
						var alertNode = document.createElement('span');
						alertNode.title = Forms._labels.labelScelta;
						alertNode.className= Forms.CLASS_REQUIRED_CHECK;
						alertNode.innerHTML= "<em>"+Forms._labels.labelScelta+"</em>";
						
						jQuery(required[src]).closest('p').append(alertNode);
						
					break;
				
				}
			
			}
	
		}
		
		
		/**
		* ciclo tutte le email
		*/
		for ( var src = 0 ; src < fieldsEmail.length ; src ++ ) {
			
			// controllo le email
			if ( fieldsEmail[src].value != 0 && !Forms.emailFilter.test(fieldsEmail[src].value) ) emails.push(fieldsEmail[src]);
		
		}
		
		// se ci sono delle email errate
		// visualizzo gli alert
		if (emails.length > 0) {

			for ( var src = 0 ; src < emails.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelEmail;
				alertNode.className= Forms.CLASS_EMAIL_ERROR;
				alertNode.innerHTML= "<em>"+Forms._labels.labelEmail+"</em>";
				
				jQuery(emails[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		/**
		* ciclo tutti gli user
		*/
		for ( var src = 0 ; src < fieldsUser.length ; src ++ ) {
			
			// controllo la correttezza degli user
			if ( fieldsUser[src].value != 0 && !Forms.userFilter.test(fieldsUser[src].value) ) users.push(fieldsUser[src]);
			
			// controllo la lunghezza degli user			
			if ( fieldsUser[src].value.length > Forms.lengthUser && fieldsUser[src].value.length != 0 ) usersl.push(fieldsUser[src]);
		
		}
		
		// se ci sono degli user errati
		// visualizzo gli alert
		if (users.length > 0) {

			for ( var src = 0 ; src < users.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelUser;
				alertNode.className=Forms.CLASS_USER_ERROR;
				alertNode.innerHTML="<em>"+Forms._labels.labelUser+"</em>";
				
				jQuery(users[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		// se ci sono degli user con piť di n caratteri
		// visualizzo gli alert
		if (usersl.length > 0) {

			for ( var src = 0 ; src < usersl.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelUserLength + Forms._labels.lengthUser;
				alertNode.className= Forms.CLASS_USERLENGTH_ERROR;
				alertNode.innerHTML= "<em>"+Forms._labels.labelUserLength+"</em><strong>"+Forms._labels.lengthUser+"</strong>";
				
				jQuery(usersl[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		
		/**
		* ciclo tutte le password
		*/
		for ( var src = 0 ; src < fieldsPassword.length ; src ++ ) {
			
			// controllo la lunghezza della password
			if (fieldsPassword[src].value.length < Forms.lengthPassword && fieldsPassword[src].value.length != 0 ) passwords.push(fieldsPassword[src]);
		
		}
		
		// se ci sono delle password con meno di n caratteri
		// visualizzo gli alert
		if (passwords.length > 0) {

			for ( var src = 0 ; src < passwords.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelPassword + Forms._labels.lengthPassword;
				alertNode.className= Forms.CLASS_PASSWORD_ERROR;
				alertNode.innerHTML= "<em>"+Forms._labels.labelPassword+"</em><strong>"+Forms._labels.lengthPassword+"</strong>";
				
				jQuery(passwords[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		
		// salvo la prima password
		if ( fieldsSame.length > 0 ) Forms.firstPassword = fieldsSame[0].value;
		
		/**
		* ciclo tutte le password
		*/
		
		for ( var src = 0 ; src < fieldsSame.length ; src ++ ) {
			
			// controllo la lunghezza della password
			if (fieldsSame[src].value != Forms.firstPassword && fieldsSame[0].value.length != 0 ) sames.push(fieldsSame[src]);
		
		}
		
		// se ci sono delle password non coincidenti
		// visualizzo gli alert

		if (sames.length > 0) {

			for ( var src = 0 ; src < sames.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelSame;
				alertNode.className=Forms.CLASS_SAME_ERROR;
				alertNode.innerHTML="<em>"+Forms._labels.labelSame+"</em>";
				
				jQuery(sames[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		// salvo il primo captcha
		if ( fieldsCaptcha.length > 0 ) Forms.firstCaptcha = fieldsCaptcha[0].value;
		
		/**
		* ciclo tutti i captcha
		*/
		
		for ( var src = 0 ; src < fieldsCaptcha.length ; src ++ ) {
			
			// controllo la lunghezza della password
			if (fieldsCaptcha[src].value != Forms.firstCaptcha && fieldsCaptcha[0].value.length != 0 ) captchas.push(fieldsCaptcha[src]);
		
		}
		
		// se ci sono dei captcha errati
		// visualizzo gli alert

		if (captchas.length > 0) {

			for ( var src = 0 ; src < captchas.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelCaptcha;
				alertNode.className=Forms.CLASS_CAPTCHA_ERROR;
				alertNode.innerHTML="<em>"+Forms._labels.labelCaptcha+"</em>";
				
				jQuery(captchas[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		
		/**
		* ciclo tutte le date
		*/
		for ( var src = 0 ; src < fieldsData.length ; src ++ ) {
			
			// controllo la correttezza delle password
			if ( !Forms.dataFilter.test(fieldsData[src].value) && fieldsData[src].value.length != 0 ) dates.push(fieldsData[src]);
		
		}
		
		// se ci sono delle date errate
		// visualizzo gli alert

		if (dates.length > 0) {

			for ( var src = 0 ; src < dates.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelData;
				alertNode.className=Forms.CLASS_DATA_ERROR;
				alertNode.innerHTML="<em>"+Forms._labels.labelData+"</em>";
				
				jQuery(dates[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		
		/**
		* ciclo tutti i numeri
		*/
		for ( var src = 0 ; src < fieldsNumber.length ; src ++ ) {
			
			// controllo la correttezza dei numeri
			//if (isNaN(fieldsNumber[src].value)) numbers.push(fieldsNumber[src]);
			if ( fieldsNumber[src].value != 0 && !Forms.numberRegex.test(fieldsNumber[src].value) ) numbers.push(fieldsNumber[src]);
		
		}
		
		// se ci sono dei numeri errati
		// visualizzo gli alert

		if (numbers.length > 0) {

			for ( var src = 0 ; src < numbers.length ; src ++ ) {
						
				var alertNode = document.createElement('span');
				alertNode.title = Forms._labels.labelNumber;
				alertNode.className=Forms.CLASS_NUMBER_ERROR;
				alertNode.innerHTML="<em>"+Forms._labels.labelNumber+"</em>";
				
				jQuery(numbers[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( jQuery(alertNode) );				
			
			}
	
		}
		
		
		// scrollo la pagina al primo input del form che ha inviato il submit
		if( required.length != 0 ) {
			required[0].focus();
			if(Forms._labels.labelContinuous) {	Forms.scrollTo(jQuery(required[0]).parent(), 500); }
		}
		else if ( emails.length != 0 ) {
			emails[0].focus();
			if(Forms._labels.labelContinuous) {	Forms.scrollTo(jQuery(emails[0]).parent(), 500); }
		}
		else if ( passwords.length != 0 ) {
			passwords[0].focus();
			if(Forms._labels.labelContinuous) {	Forms.scrollTo(jQuery(passwords[0]).parent(), 500); }
		}
		else if ( sames.length != 0 ) {
			sames[0].focus();
			if(Forms._labels.labelContinuous) {	Forms.scrollTo(jQuery(sames[0]).parent(), 500); }
		}
		else if ( dates.length != 0 ) {
			dates[0].focus();
			if(Forms._labels.labelContinuous) {	Forms.scrollTo(jQuery(dates[0]).parent(), 500); }
		}
		else if ( numbers.length != 0 ) {
			numbers[0].focus();
			if(Forms._labels.labelContinuous) {	Forms.scrollTo(jQuery(numbers[0]).parent(), 500); }
		}

		// se non ci sono errori ritorno il valore true
		block = required.length == 0 && emails.length == 0 && passwords.length == 0 && sames.length == 0 && numbers.length == 0 && dates.length == 0 && users.length == 0 && usersl.length == 0 ? false : true;
		return required.length == 0 && emails.length == 0 && passwords.length == 0 && sames.length == 0 && numbers.length == 0 && dates.length == 0 && users.length == 0 && usersl.length == 0 ? true : false;
	}

};