/********************************************/
/*	checkForm 0.3 for mootools release 1.2
/*	luca strazzullo | nascar
/*	davide reppucci | nascar
/*******************************************/

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_NUMBER_ERROR = 'numberError';
		
		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_NUMBER = 'campo numerico';
		Forms.DEFAULT_LENGTH_PASSWORD = 6;
		Forms.DEFAULT_OFFSET_X = -15;
		Forms.DEFAULT_OFFSET_Y = -35;
		
		// 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.labelEmail = _labels.labelEmail != null ? _labels.labelEmail : Forms.DEFAULT_LABEL_EMAIL;
		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.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.scrolling = new Fx.Scroll(window, {duration: 600, wait: false, transition: Fx.Transitions.quadInOut});
		
		// esempio di html dell'alert
		// che viene creato nel <p> contentente
		// la <label> e <input> relativo
		//
		// <span class="requiredField">
		//	 <em>campo obbligatorio</em>
		// </span>


		// instanzio i tooltip
		
		Forms.toolTips = new Tips(null,{
		
			className: 'tooltipAlert',
			offsets: {'x':Forms.labelOffsetX,'y':Forms.labelOffsetY },
			fixed: true
		
		});
		Forms.toolTips.addEvent('show', function(tip){
			
			tip.fade('in');
			
		});
		Forms.toolTips.addEvent('hide', function(tip){
			
			tip.fade('out');
			
		});
		
		
		
		// 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() {
		
		var valueSwap = $$('input.valueSwap');
		
		for ( var i = 0 ; i < valueSwap.length ; i ++ ) {
			
			valueSwap[i].rel = valueSwap[i].value;
			
			valueSwap[i].addEvent( 'focus' , Forms.inputFocus );
			valueSwap[i].addEvent( 'blur' , Forms.inputBlur );
			
		}
	
	},
	
	
	
	/**
	* eventi richiamati dagli input
	*/
	
	inputFocus : function(event) {
		
		if ( event.target.value == event.target.rel ) event.target.value = "";
	
	},
	
	inputBlur : function(event) {
		
		if ( event.target.value == "" ) event.target.value = event.target.rel;
	
	},
	
	
	
	/**
	* 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.addEvent('submit',Forms.check);
		
	
	},
	
	
	/**
	* metodo che mostra gli alert
	* con il tween di opacity
	*/
	
	showAlert : function( _alert ) {
		
		$$(_alert).setStyle('display','none');
		$$(_alert).setStyle('opacity','0');
		$$(_alert).setStyle('display','block');
		$$(_alert).tween('opacity','1');
		
	},
	
	
	/**
	* metodo che crea due array,
	* required. la lista dei campi non ancora compilati
	* emails. la lista delle email errate.
	*/
	
	check : function( event ) {
	
		
		// lista dei campi obbligatori
		
		var fieldsRequired = event.target.getElements('.required');
		var fieldsEmail = event.target.getElements('.email');
		var fieldsPassword = event.target.getElements('.password');
		var fieldsSame = event.target.getElements('.same');
		var fieldsNumber = event.target.getElements('.number');
		
		// array che indicano i campi da controllare
		
		var required = new Array();
		var emails = new Array();
		var passwords = new Array();
		var sames = new Array();
		var numbers = new Array();
		
		
		
		// rimuovo i tooltips
		
		Forms.toolTips.detach('.'+Forms.CLASS_EMAIL_ERROR);
		Forms.toolTips.detach('.'+Forms.CLASS_REQUIRED_FIELD);
		Forms.toolTips.detach('.'+Forms.CLASS_PASSWORD_ERROR);
		Forms.toolTips.detach('.'+Forms.CLASS_SAME_ERROR);
		Forms.toolTips.detach('.'+Forms.CLASS_NUMBER_ERROR);
		
		
		
		
		
		
		/**
		* ciclo tutte le passwords
		*/
		
		for ( var src = 0 ; src < fieldsPassword.length ; src ++ ) {
			
			
			// rimuovo l'alert password da tutti i campi
			
			var alertNode = fieldsPassword[src].getParent().getElement(' .'+Forms.CLASS_PASSWORD_ERROR);
			
			if (alertNode) fieldsPassword[src].getParent().removeChild(alertNode);
			
			// controllo la lunghezza della password
			if (fieldsPassword[src].value.length < Forms.lengthPassword) passwords.push(fieldsPassword[src]);
		
		}
		
				
		
		// se ci sono delle password con meno di 6 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].getParent().appendChild(alertNode);
			
			}
			
			
			// setto il tooltip a tutti gli alert
			
			Forms.toolTips.attach('.'+Forms.CLASS_PASSWORD_ERROR);
		
		}
		
		
		
		
		// salvo la prima password
		if ( fieldsSame.length > 0 ) Forms.firstPassword = fieldsSame[0].value;
		
		/**
		* ciclo tutte le passwords uguali
		*/
		
		for ( var src = 0 ; src < fieldsSame.length ; src ++ ) {
			
			
			// rimuovo l'alert password da tutti i campi
			
			var alertNode = fieldsSame[src].getParent().getElement(' .'+Forms.CLASS_SAME_ERROR);
			
			if (alertNode) fieldsSame[src].getParent().removeChild(alertNode);
			
			// controllo la lunghezza della password
			if (fieldsSame[src].value != Forms.firstPassword) sames.push(fieldsSame[src]);
		
		}
		
				
		
		// se ci sono delle password diverse
		// 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].getParent().appendChild(alertNode);
			
			}
			
			
			// setto il tooltip a tutti gli alert
			
			Forms.toolTips.attach('.'+Forms.CLASS_SAME_ERROR);
		
		}
		
		
		
		
		
		/**
		* ciclo tutti i numeri
		*/
		
		for ( var src = 0 ; src < fieldsNumber.length ; src ++ ) {
			
			// rimuovo l'alert number da tutti i campi
			
			var alertNode = fieldsNumber[src].getParent().getElement(' .'+Forms.CLASS_NUMBER_ERROR);
			
			if (alertNode) fieldsNumber[src].getParent().removeChild(alertNode);
			
			// controllo la correttezza dei numeri
			if (isNaN(fieldsNumber[src].value)) numbers.push(fieldsNumber[src]);
		
		}
		
				
		
		// se ci sono dei number 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].getParent().appendChild(alertNode);
			
			}
			
			
			// setto il tooltip a tutti gli alert
			
			Forms.toolTips.attach('.'+Forms.CLASS_NUMBER_ERROR);
		
		}
		
		
		
		/**
		* ciclo tutte le emails
		*/
		
		for ( var src = 0 ; src < fieldsEmail.length ; src ++ ) {
			
			
			// rimuovo l'alert email da tutti i campi
			
			var alertNode = fieldsEmail[src].getParent().getElement(' .'+Forms.CLASS_EMAIL_ERROR);
			
			if (alertNode) fieldsEmail[src].getParent().removeChild(alertNode);
			
			
			// controllo la correttezza dell'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].getParent().appendChild(alertNode);
			
			}
			
			
			// setto il tooltip a tutti gli alert
			
			Forms.toolTips.attach('.'+Forms.CLASS_EMAIL_ERROR);
		
		}
		
		
		/**
		* ciclo tutti i campi obbligatori
		*/
		
		for ( var src = 0 ; src < fieldsRequired.length ; src ++ ) {
			
		
			// rimuovo l'alert required da tutti i campi
			
			switch ( fieldsRequired[src].type ) {
			
				case "text":
				case "textarea":
				case "password":
				case "hidden":
				case "file":
				case "select":
				case "select-one":
					
					var alertNode = fieldsRequired[src].getParent().getElement(' .'+Forms.CLASS_REQUIRED_FIELD);
					
					if (alertNode) fieldsRequired[src].getParent().removeChild(alertNode);
					
					break;
				
				case "radio":
				case "checkbox":
					
					var alertNode = fieldsRequired[src].getParent().getElement(' .'+Forms.CLASS_REQUIRED_CHECK);
					
					if (alertNode) fieldsRequired[src].getParent().removeChild(alertNode);
					
					break;
			
			}
			
			
			
			// 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 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].getParent().appendChild(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].getParent().appendChild(alertNode);
							
						break;
				
				}
			
			}
			
			
			// setto il tooltip a tutti gli alert
			Forms.toolTips.attach('.'+Forms.CLASS_REQUIRED_FIELD);
	
		}
		
		
		// mostro gli alert con la funzione showAlert();
		
		/*Forms.showAlert('.requiredField');
		Forms.showAlert('.emailError');
		Forms.showAlert('.passwordError');
		Forms.showAlert('.sameError');
		Forms.showAlert('.numberError');*/

		// scrollo la pagina al primo input del form che ha inviato il submit
		if( required.length != 0 ) { required[0].focus(); Forms.scrolling.toElement(required[0].getParent().getElement('label')); }
		else if( emails.length != 0 ) { emails[0].focus(); Forms.scrolling.toElement(emails[0].getParent().getElement('label')); }
		else if( passwords.length != 0 ) { passwords[0].focus(); Forms.scrolling.toElement(passwords[0].getParent().getElement('label')); }
		else if( sames.length != 0 ) { sames[0].focus(); Forms.scrolling.toElement(sames[0].getParent().getElement('label')); }
		else { numbers[0].focus(); Forms.scrolling.toElement(numbers[0].getParent().getElement('label')); }
		
		// se non ci sono errori ritorno il valore true
		return required.length == 0 && emails.length == 0 && passwords.length == 0 && sames.length == 0 && numbers.length == 0 ? true : false;
		
	}
	

};