/********************************************/
/*	checkForm 0.2 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 = {
	
	init : function( _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.DEFAULT_LABEL_EMAIL = 'email errata';
		Forms.DEFAULT_LABEL_CAMPO = 'campo obbligatorio';
		Forms.DEFAULT_LABEL_SCELTA = 'scelta obbligatoria';
		Forms.DEFAULT_LABEL_PASSWORD = 'il numero minimo di caratteri &egrave; ';
		Forms.DEFAULT_LABEL_SAME = 'le password non coincidono';
		Forms.DEFAULT_LABEL_CAPTCHA = 'captcha non corretto';
		Forms.DEFAULT_LABEL_NUMBER = 'campo numerico';
		Forms.DEFAULT_LABEL_DATA = 'data errata';
		Forms.DEFAULT_LENGTH_PASSWORD = 6;
		Forms.DEFAULT_OFFSET_X = -15;
		Forms.DEFAULT_OFFSET_Y = -35;
		Forms.DEFAULT_LABEL_CONTINUOUS = true;
		
		// setto la lunghezza minima della password
		Forms.lengthPassword = _labels.lengthPassword != null ? _labels.lengthPassword : Forms.DEFAULT_LENGTH_PASSWORD;		
		
		// 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.labelEmail = _labels.labelEmail != null ? _labels.labelEmail : Forms.DEFAULT_LABEL_EMAIL;
		Forms.labelData = _labels.labelData != null ? _labels.labelData : Forms.DEFAULT_LABEL_DATA;
		Forms.labelCampo = _labels.labelCampo != null ? _labels.labelCampo : Forms.DEFAULT_LABEL_CAMPO;
		Forms.labelScelta = _labels.labelScelta != null ? _labels.labelScelta : Forms.DEFAULT_LABEL_SCELTA;
		Forms.labelPassword = _labels.labelPassword != null ? _labels.labelPassword : Forms.DEFAULT_LABEL_PASSWORD;
		Forms.labelSame = _labels.labelSame != null ? _labels.labelSame : Forms.DEFAULT_LABEL_SAME;
		Forms.labelCaptcha = _labels.labelCaptcha != null ? _labels.labelCaptcha : Forms.DEFAULT_LABEL_CAPTCHA;
		Forms.labelNumber = _labels.labelNumber != null ? _labels.labelNumber : Forms.DEFAULT_LABEL_NUMBER;
		Forms.labelOffsetX = _labels.labelOffsetX != null ? _labels.labelOffsetX : Forms.DEFAULT_OFFSET_X;
		Forms.labelOffsetY = _labels.labelOffsetY != null ? _labels.labelOffsetY : Forms.DEFAULT_OFFSET_Y;
		Forms.labelContinuous = _labels.labelContinuous != null ? _labels.labelContinuous : Forms.DEFAULT_LABEL_CONTINUOUS;

		// 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 = [];
		
		$(".valueSwap").each(function(i){
		
		   swapValue[i] = $(this).val();
		   
		   $(this).clearingInput( { text: $(this).val() } );
		      
		});	
	
	},
	
	/* metodo che aggiunge un tooltip */
	addTooltip : function( target ) {
	
		$(target).tooltip({
		    delay: 0,
		    track: true,
		    fade: 250,
		    top: Forms.labelOffsetX, 
			left: Forms.labelOffsetY
		});
	
	},
	
	
	/**
	* 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 = $('.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 = $(target).offset().top;
		  $('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');
		
		// 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);
		
		// 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();

		// rimuovo tutti gli alert
		for ( var i = 0 ; i < alertRequired.length ; i++ ) { $(alertRequired[i]).remove(); }
		for ( var j = 0 ; j < alertCheck.length ; j++ ) { $(alertCheck[j]).remove(); }
		for ( var k = 0 ; k < alertEmail.length ; k++ ) { $(alertEmail[k]).remove(); }
		for ( var m = 0 ; m < alertPassword.length ; m++ ) { $(alertPassword[m]).remove(); }
		for ( var y = 0 ; y < alertSame.length ; y++ ) { $(alertSame[y]).remove(); }
		for ( var u = 0 ; u < alertCaptcha.length ; u++ ) { $(alertCaptcha[u]).remove(); }
		for ( var x = 0 ; x < alertNumber.length ; x++ ) { $(alertNumber[x]).remove(); }
		for ( var z = 0 ; z < alertData.length ; z++ ) { $(alertData[z]).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 == fieldsRequired[src].rel )

						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.labelCampo;
						alertNode.className=Forms.CLASS_REQUIRED_FIELD;
						alertNode.innerHTML="<em>"+Forms.labelCampo+"</em>";
						$(required[src]).closest('p').append(alertNode);
						
						// associo il tooltip all'alert
						Forms.addTooltip( $(alertNode) );
						
					break;
					
					case "radio":
					case "checkbox":
						
						var alertNode = document.createElement('span');
						alertNode.title = Forms.labelScelta;
						alertNode.className= Forms.CLASS_REQUIRED_CHECK;
						alertNode.innerHTML= "<em>"+Forms.labelScelta+"</em>";
						
						$(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.labelEmail;
				alertNode.className= Forms.CLASS_EMAIL_ERROR;
				alertNode.innerHTML= "<em>"+Forms.labelEmail+"</em>";
				
				$(emails[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( $(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.labelPassword + Forms.lengthPassword;
				alertNode.className= Forms.CLASS_PASSWORD_ERROR;
				alertNode.innerHTML= "<em>"+Forms.labelPassword+"</em><strong>"+Forms.lengthPassword+"</strong>";
				
				$(passwords[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( $(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.labelSame;
				alertNode.className=Forms.CLASS_SAME_ERROR;
				alertNode.innerHTML="<em>"+Forms.labelSame+"</em>";
				
				$(sames[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( $(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.labelCaptcha;
				alertNode.className=Forms.CLASS_CAPTCHA_ERROR;
				alertNode.innerHTML="<em>"+Forms.labelCaptcha+"</em>";
				
				$(captchas[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( $(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.labelData;
				alertNode.className=Forms.CLASS_DATA_ERROR;
				alertNode.innerHTML="<em>"+Forms.labelData+"</em>";
				
				$(dates[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( $(alertNode) );				
			
			}
	
		}
		
		
		/**
		* ciclo tutti i numeri
		*/
		for ( var src = 0 ; src < fieldsNumber.length ; src ++ ) {
			
			// controllo la correttezza dei numeri
			value = fieldsNumber[src].value
			value = value.replace(",", ".")
			if (isNaN(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.labelNumber;
				alertNode.className=Forms.CLASS_NUMBER_ERROR;
				alertNode.innerHTML="<em>"+Forms.labelNumber+"</em>";
				
				$(numbers[src]).closest('p').append(alertNode);
				
				// associo il tooltip all'alert
				Forms.addTooltip( $(alertNode) );				
			
			}
	
		}
		
		
		// scrollo la pagina al primo input del form che ha inviato il submit
		if( required.length != 0 ) {
			required[0].focus();
			if(Forms.labelContinuous) {	Forms.scrollTo($(required[0]).parent(), 500); }
		}
		else if ( emails.length != 0 ) {
			emails[0].focus();
			if(Forms.labelContinuous) {	Forms.scrollTo($(emails[0]).parent(), 500); }
		}
		else if ( passwords.length != 0 ) {
			passwords[0].focus();
			if(Forms.labelContinuous) {	Forms.scrollTo($(passwords[0]).parent(), 500); }
		}
		else if ( sames.length != 0 ) {
			sames[0].focus();
			if(Forms.labelContinuous) {	Forms.scrollTo($(sames[0]).parent(), 500); }
		}
		else if ( dates.length != 0 ) {
			dates[0].focus();
			if(Forms.labelContinuous) {	Forms.scrollTo($(dates[0]).parent(), 500); }
		}
		else if ( numbers.length != 0 ) {
			numbers[0].focus();
			if(Forms.labelContinuous) {	Forms.scrollTo($(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 ? false : true;
		return required.length == 0 && emails.length == 0 && passwords.length == 0 && sames.length == 0 && numbers.length == 0 && dates.length == 0 ? true : false;
	}

};