/**
 * Plugin Name: Magic Validator  v1.1
 * Creator: Oscar Pasache Elias
 * Copyright: Manya.pe (c) 2010
 **/

(function($){
	$.fn.validator = function(option){
		var defaults = {
			/* Type: (normal,style,alert). Default:normal(style-text) */
			Type : 'normal',
			Messages : {
				password : 'Passwords do not match', // Las contraseñas no coinciden
				required : 'This field can not be left empty.', //Este campo no puede dejarse vacío
				email : 'Please enter a valid email address.', //Por favor, introduzca una dirección de correo electrónico válida.
				number : 'Please enter only numbers.', //Ingrese solo numeros.
				letters : 'Please enter only letters.' //Ingrese solo letras.
			},
			all : true,
			animated : true // Valid only for Type text
		};
		
		var options = $.extend(defaults, option);
		
		return this.each(function(){
			$(this).bind('submit', init);
		});
		
		/*function alerts(elemen){
			var element = $(elemen);
			element.addClass('validatorInputError');
		}*/
		function alerts(elemen,txt,type){
			if(type == undefined || type == ''){
				var alerts = options.Type;
			}else{
				var alerts = type;
			}
			var element = $(elemen);
			if(alerts == 'normal'){
				element.addClass('validatorInputError');
				element.after("<div class='validatorDivError'>"+ txt +"</div>");
				element.focus();
				return false;
			}else if(alerts == 'style'){
				element.addClass('validatorInputError');
				return true;
			}else if(alerts == 'alert'){
				alert(txt);
				element.focus();
				return false;
			}
		}
		
		function removeAlerts(elemen){
			var element = $(elemen);
			element.removeClass('validatorInputError');
		}
		
		function init(ev){
			var txt = ''; // Alerta
			var err = 0; // Error
			
			/**********************  REQUIRED  **********************/
			$(this).find('.required').each(function(){
				var element = $(this);
				var attr = element.attr('class').split(' ');
				var equa = element.attr('equalTo');// Input igual a
				var disa = element.attr('disabled');// Input desabilitado
				var aler = (element.attr('alert') == undefined || element.attr('alert') == '')? '' : element.attr('alert');
				//alert(disa);
				if(disa != undefined && disa != true){
				
				$(this).next('.validatorDivError').remove();
				
				if($.trim(element.val()) == ''){
					if(element.attr('rel') == undefined || element.attr('rel') == ''){
						if(options.Type == 'style'){
							txt += options.Messages.required + "\n";
						}else{
							txt = options.Messages.required;
						}
					}else{
						if(options.Type == 'style'){
							txt += element.attr('rel') + "\n";
						}else{
							txt = element.attr('rel');
						}
					}
					element.val('');
					err = 1;
					alerts(this,txt);
				}else{
					for(var n=0;n < attr.length; n++){
						/**********************  EMAIL  *********************/
						if(attr[n] == 'email'){
							if(!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test($(this).val())){
								if(options.Type == 'style'){
									txt += options.Messages.email + "\n";
								}else{
									txt = options.Messages.email + "\n";
								}
								err = 1;
								alerts(this,txt);
							}else{
								removeAlerts(this);
							}
						/**********************  NUMBER  ********************/
						}else if(attr[n] == 'number'){
							if(!/^([0-9\s\+\-])+$/.test($(this).val())){
								if(options.Type == 'style'){
									txt += options.Messages.number + "\n";
								}else{
									txt = options.Messages.number + "\n";
								}
								err = 1;
								alerts(this,txt);
							}else{
								removeAlerts(this);
							}
						/**********************  LETTERS  ********************/
						}else if(attr[n] == 'letters'){
							if(!/^([A-Za-zñÑ \s])+$/.test($(this).val())){
								if(options.Type == 'style'){
									txt += options.Messages.letters + "\n";
								}else{
									txt = options.Messages.letters + "\n";
								}
								err = 1;
								alerts(this,txt);
							}else{
								removeAlerts(this);
							}
						}
					}
					
					if(equa != undefined && equa != ''){
						var igua = $('#'+ equa);
						if(igua.val() != element.val()){
							if(options.Type == 'style'){
								txt += options.Messages.password + "\n";
							}else{
								txt = options.Messages.password + "\n";
							}
							err = 1;
							igua.addClass('validatorInputError');
							alerts(this,txt);
						}else{
							removeAlerts(this);
						}
					}
					
					element.val($.trim(element.val()));
					if(err < 1){element.removeClass('validatorInputError');}
				}
				}
			});
			if(err == 1){
				if(options.Type == 'style'){jAlert(txt);}
				return false;
			}else{
				var form = $(this);
				if(form.attr('send') != '' && form.attr('send') != undefined){
					var idForm = form.attr('id');
					var func = form.attr('send') +"('"+ idForm +"')";
					eval(func);
					return false;
				}else{
					return true;
				}
			}
			return false;
		}
	};
})(jQuery);
