/*
 * Plug in per la validazione di form con integrazione dello stile di jquery ui
 * da utilizzare per validazione di singoli form (richiamare la funzione per form specifico)
* @package valid - jQuery plugin
* @author Somma Michele <djdrake88@gmail.com>
* @license MIT License
*/

(function($) {
$.fn.valid = function(options) {

    // valori di default
    var config = {        
        'classeerror' : 'error-valid ui-state-error ui-corner-all',
        messages : {
                  'blank'   : 'Campo richiesto ',
                  'mail'   : 'Mail non valida '                  
           }
    };
    
    //valori interni
    var setup = {
    		'error': false,
    		'msg':''
    };
    
    
    
    var temp  = this[0]; //prendiamo il primo elemento per ricavare il form
    var arrobj = this;
    var formparent=$(temp).parents('form'); //ricaviamo il form genitore
    
    // estendiamo i valori di default con quelli specificati dall'utente
    if (options) $.extend(config, options);



   formparent.submit(function(){
	  
	   if(!setup.error){
		 
		   $.each(arrobj,function(i,obj){
			   	if (!setup.error){
			   		setup.msg='';
		 		 	var error=false;
			  		var classi = $(obj).attr('class');			
			  		var index = classi.indexOf('[')+1;
			  		var end = classi.indexOf(']');
			  		var attributi  = classi.substring(index,end);
			  		attributi = attributi.split(",");
			  		
			
		  			 $.each(attributi,function(n,attributo){
		  				 if(!error){
		  					 error = control(attributo,obj);
		  					 avviso(obj,setup.msg);
		  					 setup.error = error;		  				  
		  				 }	  				
		  			 });
		  			 
		  			 
			   	}
			 
		  		 			   
			});
	   	}
 		
  		return !setup.error; //non invio il form se ci sono errori
   });
   
    // cicliamo tutti gli elementi
    return this.each(
         function (){ 		
        	 	//se l'oggetto da validare perde il focus
        		$(this).blur(function(){
        			
        			//reinizializiamo i parametri
        			obj = this;
        			error = true;
           		 	setup.msg='';
           		 
           		 	//ricavo gli attributi della classe
	        		var classi = $(this).attr('class');			
	        		var index = classi.indexOf('[')+1;
	        		var end = classi.indexOf(']');
	        		var attributi  = classi.substring(index,end);	        		
	        		attributi = attributi.split(",");
	        		
	        		//fin quando non troviamo un errore cicliamo il controllo degli attributi
	        		if(error){
	        			$.each(attributi,function(n,attributo){
	        				 //controlliamo il campo con il specifico attributo
	        				 error = control(attributo,obj);
	        			});
	        			
	        			//aggiungiamo il box al campo con l'avviso con il relativo cambio di css
	        			avviso(obj,setup.msg);
	        		}       	
	        		return error;
        		});		
         }
    );
    
    
    function control(op,oggetto){
		
		var val= $(oggetto).val();				
		switch (op){
		
			//campo ricchiesto
			case 'require':
				if(!val){
					setup.msg+=config.messages.blank;					
					return true;
				}				
			break;
			
			//campo mail
			case 'mail':				
				var espressione = /^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$/;
				if (!espressione.test(val))
				{
				    setup.msg+=config.messages.mail;
				    return true;
				}
			break;
		}
		
		//se non ci sono errori ritorno true
		return false;		
		
	}
	
    //creo un box adiacente all'input con il messaggio di errore
	function avviso(oggetto,msg){
		
		var y = $(oggetto).height();
		var x = $(oggetto).width();			
		var offset = $(oggetto).offset();
		
		if (msg){		
			
			$(oggetto).animate({'background-color':'#ffdfdf','border':'1px solid #ff9797'},2000);
			var div = '<div class="'+config.classeerror+'"> <span style="float: left; margin-right: 0.3em;" class="ui-icon ui-icon-alert"></span>'+msg+'</div>';
			
			$('body').prepend(div);			
				
			var divstyle = $('.error-valid:first');
			
			divstyle.css({
				'position':'absolute',
				'top':offset.top+'px',
				'left':offset.left+x+5+'px',
				'z-index':'1000',
				'font-size':'0.7em',
				'padding':'1px'
			});
			
			divstyle.fadeIn(500);
			$(oggetto).focus(function(){				
				$(divstyle).fadeOut(500);
			});
			divstyle.click(function(){
				$(this).fadeOut(500);
			});
			
			setTimeout(function(){
				divstyle.fadeOut('1000');				
			},3000);
		}else
			$(oggetto).animate({'background-color':'#f0fff0','border':'1px solid #d2ffd2'},2000);
	}

}
})(jQuery);

