/**
 *	
 * Copyleft (c) 2008 Carlos Alan P. Alves (carlosalan86@gmail.com)
 * --------------------------------------------------------------------------------------
 * Plugin com a função de fazer a validação de formulários. com intuito de ajudar novatos 
 * que queiram apren-der. Peço apenas que não tire a minha autoria. Muito Obrigado.
 * --------------------------------------------------------------------------------------
 *
 * Versão: 1.0.7	
 *
 * LOG:
	Versão: 1.0.7 - 13/02/09 - Validação dos inputs type radio;
							 - Remoção da variavel vl_elementos;
	Versão: 1.0.6 - 19/12/08 - Melhoramento da validação de e-mail;
	Versão: 1.0.5 - 12/09/08 - Melhoramento da validação de e-mail;
	Versão: 1.0.4 - 05/09/08 - Padronizando as variaveis;
	Versão: 1.0.3 - 05/09/08 - Agora o plugin apenas faz a validação sem enviar para canto algum[ var: vl_formaenvio:validar ];
	Versão: 1.0.2 - 28/08/08 - Plugin agora funciona com mais de um form na página;
	Versão: 1.0.1 - 27/08/08 - Organização da estrutura dos settings;
 *
 *
 */

jQuery.fn.validacao = function(options) 
{
    var form = this;
    var settings = 
	{
		vl_bsubmit: 'button[id="goform"]', //Elemento que ativa a validação;
		vl_formaenvio: 'validar' //file, ajax, validar;
	};

	if(options) { jQuery.extend(settings, options); } 
	
    jQuery(settings.vl_bsubmit).click(function() 
	{
		if(form.is('form')) 
		{
            var x = 0;
            var ca = "";
			
			/*  
				@ Inicio  
				@ Verificação todos os campos que tiverem o atributo title; 
			*/			
            jQuery.each(jQuery(form).find('[title]'), function()
			{
                var elemento = jQuery(this);
				var tipo = jQuery(elemento)[0].type;
				switch(tipo) 
				{
					case 'radio':
						var r = 0;
						jQuery(jQuery('input[name="'+elemento.attr('name')+'"]'), form).each(function() {
							if(jQuery(this).attr('checked') == true)
								r++;
						});
						
						if (r <= 0)
							if(jQuery('#'+elemento.attr('name')).attr('id') == null)
								jQuery('<span id="'+elemento.attr('name')+'" class="msgErro">'+elemento.attr('title')+'</span>').insertBefore(jQuery('input[name="'+jQuery(this).attr('name')+'"]:last'));
					break;
					case 'password':
					case 'text':
					case 'textarea':
					case 'file':
					case 'select-one':
						if(elemento.val() == "" || elemento.val() == 0) 
						{
							if(ca == "")
								ca = elemento;
							
							ca.focus();
							x = (x + 1);
							if(jQuery('#'+elemento.attr('name')).attr('id') == null)
								jQuery('<span id="'+elemento.attr('name')+'" class="msgErro">'+elemento.attr('title')+'</span>').insertAfter(elemento);
						}
					break;
				}
				
				jQuery("[name="+elemento.attr('name')+"]").click(function (e) { if(jQuery('#'+jQuery(this).attr('name'))) { jQuery('#'+jQuery(this).attr('name')).remove(); } });
                jQuery("[name="+elemento.attr('name')+"]").keypress(function (e) { if(jQuery('#'+jQuery(this).attr('name'))) jQuery('#'+jQuery(this).attr('name')).remove(); });
            });
			
			/*  
				@ Inicio  
				@ Verificação do campo e-mail; 
			*/	
        	if (settings.vl_campoemail) 
			{
    			if(x == 0) 
				{
					
					var elemento = jQuery(settings.vl_campoemail);
					if(elemento.val() != "" && elemento.val() != null) 
					{
						var erEmail = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;						
						if (!erEmail.test(elemento.val())) 
						{
							x = 1;
							elemento.focus();
							elemento.addClass("erro");
							if(jQuery('#'+elemento.attr('name')).attr('id') == null)
								jQuery('<span id="'+elemento.attr('name')+'" class="msgErro">Por favor confira seu e-mail.</span>').insertAfter(elemento);
						} 
					}
    			}
        	}
			
			/*  
				@ Inicio  
				@ Verificação do campo arquivo; 
			*/				
        	if (settings.vl_file) 
			{
	
				if(x == 0) 
				{
					var spli = settings.vl_file.split('#');
					var campoFile = jQuery(spli[0]);
					if(campoFile.attr('class') != null) 
					{
						if(campoFile.val() != '')
						{
							
							if(spli[1] == 'imagens')	{ var ext = /(.jpg|.JPG)$/; textArq = '.jpg' }
							if(spli[1] == 'documentos')	{ var ext = /(.doc|.DOC|.pdf|.PDF)$/; textArq = '.doc ou .pdf' }
							
							if (!ext.test(campoFile.val()))
							{
								x = (x + 1);
								if(jQuery('#'+jQuery(settings.vl_file).attr('name')).attr('id') == null)
									jQuery('<span id="'+jQuery(settings.vl_file).attr('name')+'" class="msgErro">Aceito apenas arquivos '+textArq+'</span>').insertAfter(campoFile);					
							}
							
							campoFile.click(function (e) 
							{
								var campo = jQuery(this);
								if(jQuery('#'+jQuery(settings.vl_file).attr('name')).attr('id'))
									jQuery('span[id="'+jQuery(settings.vl_file).attr('name')+'"]').remove();
							});	
						}
					}
				}
        	 }	
			
			/* @ Se todos os campos estiverem ok, a variavel x deve estar como 0, então os dados serão enviados;  */			
			if(x == 0) 
			{
				switch(settings.vl_formaenvio) 
				{
					case 'ajax':	
						var avisoOriginal = jQuery(".aviso").html();	
						
						jQuery(".aviso").css('display', 'block');
					    jQuery(".aviso").html('Aguarde...');
					    jQuery.ajax({
					        type: "POST",
		                    url: settings.vl_pgexterna,
		                    data: jQuery(form).serialize(),
		                    success: function(msg) 
							{
								/* 
									@ Área Livre para desenvolvimento dos retornos do [ vl_pgexterna ];
								*/
								switch(msg)
								{
									case 'cadastro_duplicado':
										jQuery(".aviso").html('E-mail ja cadastrado.');
									break;
									
									case 'cadastro_ok':
									default:
										jQuery(".aviso").html(avisoOriginal);
										jQuery(":input", form).each(function() 
										{
											var elemento = jQuery(this);
											elemento.val('');
										});										
									break;
								}
		                    }
		                })
					break;
					
					case 'file':
					    window.document.trabalhe.action = settings.vl_pgexterna;
		                window.document.trabalhe.submit();
					break;					
					
					default:
					    return true;
					break;
				}
			}
		}
	 return false;
    });
};
