/*
* @package validMe - jQuery plugin
* @author  Nicolas Gutierrez <nicmanzana@gmail.com> per Yourinspirationweb.com
* @license MIT License
*/

(function($) {
	$.fn.validMe = function(options) {
		
		// valori personalizzabili
		var config = {
				'shaker'					: false
			 , 'shakers'				: 5
			 , 'showMessage'			: false
			 , 'errorClass'			: 'error'
			 , 'requiredClass'		: 'required'
			 , 'requiredMail'			: 'mail'
			 , 'requiredNumber'		: 'numeric'
			 ,	messages : {
			 			'blank'		: 'Questo campo non pu&ograve; rimanere vuoto!'
			 		 , 'check'		: 'Questo campo deve essere selezionato!'
			 		 , 'email'		: 'Inserire un indirizzo email valido!'
			 		 , 'numbe'		: 'Inserire solo numeri!'
			 	}
		};

		// estendiamo i valori di default con quelli specificati dall'utente
		if (options) $.extend(config, options);
		
		
		return this.each(
			function (){
				// creiamo la funzione che controller i campi richiesti al momento dell'invio del form
				$(this).submit(
					function(){

						// parametri per il funzionamento del plugin
					   var validMe = {
					   			'errors'			: false
					   }
						
						// cicliamo tutti gli input trovati
			   		$(this).find('.'+config.requiredClass+'').each(
			   			function() {
			   				var $input 		= $(this);
			   				var type			= $input.attr('type');
			   				var groupName 	= $input.attr('name');
			   				
			   				// controlliamo che il contenuto dell'input non sia vuoto
			   				if( !$input.val() ){
			   					error						= true;
			   					errorType				= 'blank';
			   					validMe.errors 		= true;
			   				// se si tratta di una checkbox che non  stata selezionata
			   				}else if( (type == 'checkbox') && ( !$input.is(':checked') ) ){
			   					error						= true;
			   					errorType				= 'check';
			   					validMe.errors			= true;
			   				// se si tratta di una email controlliamo che ci sia il simbolo "@" e "."
			   				}else if( $input.hasClass(config.requiredMail) && ( ($input.val().indexOf('@') == -1) || ($input.val().indexOf('.') == -1) ) ){
			   					error						= true;
			   					errorType				= 'email';
			   					validMe.errors			= true;
			   				// se si tratta di un input numerico controlliamo che il valore inserito sia di questo tipo
			   				}else if( ($input.hasClass(config.requiredNumber)) && isNaN($input.val()) ){
			   					error						= true;
			   					errorType				= 'numbe';
			   					validMe.errors			= true;
			   				// se non  nessuno di questi casi resettiamo l'errore
			   				}else{
			   					error 					= false;
			   					errorType				= null;
			   				}
			   				
			   				// notifichiamo l'utente dell'errore di validazione
			   				if(error){
			   					// assegnamo la classe di errore all'input
			   					$input.addClass(config.errorClass);
			   					
			   					// se  abilitata l'opzione shaker, shakeriamo un po' l'input !!!!
			   					if(config.shaker){
			   						for (i=0; i<config.shakers; i++) { 
			   							$input.animate({ marginLeft: "2px"}, 100 );
			   							$input.animate({ marginLeft: "-2px"}, 100 );
			   						}
			   						$input.animate({ marginLeft: "0"}, 100 );
			   					}
			   					
			   					// se  abilitata l'opzione showMessage mostriamo anche un messaggio
			   					if(config.showMessage){
			   						// il messaggio viene mostrato solo se non  gi stato mostrato
			   						if($input.next('label').length == 0){
			   							$input.after('<label class="'+config.errorClass+'">'+config.messages[errorType]+'</label>');
			   						}else{
			   							$input.next('label').html(config.messages[errorType]);
			   						}
			   					}
			   					
			   				}
			
			   				// se  abilitata l'opzione showMessage e non ci sono errori togliamo il messaggio
			   				if(!error && $input.next('label').length != 0){
			   					$input.next('label').remove();
			   				}
			
			   				// se l'input che stiamo controllando non contiene errori ed ha la classe error, la togliamo
			   				if(!error && $input.hasClass(config.errorClass)){
			   					$input.removeClass(config.errorClass);
			   					if(config.removeCustom){
			   						config.removeCustom($input);
			   					}
			   				}
			   				
			
			   			}
						);
						
						// se non ci sono errori procedo con il submit del formulario
						if(validMe.errors){
							return false;
						}else{
							return true
						}
					}
				);
			
			}
		);
	}
})(jQuery);
