// JavaScript Document
/************************
*	@Author: George Willian Condomitti
*	@Date: 30/09/2010
*	@Version: 1.0
*
*	Use:
*		Para chamar a função de validação basta passar
*		o objeto que contém os campos do formulário.
*		$("#identificador").validateForm();
*
*		Para sinalizar os campos de valor obrigatório
*		atribuir à estes a classe 'requiredField'.
*
*		Também é possível sinalizar o tipo de campo,
*		para validações específicas (como e-mail por exemplo),
*		para tal fim, colocar o atributo fieldType="email" no campo.
*		Outros fieldTypes que podem ser atribuídos nessa versão são:
*		'cpf' e 'cnpj'
*
*		-- IMPORTANTE: --
*			Os campos input devem estar SEMPRE dentro de um container,
*			seja ele uma célula de tabela, um ítem de lista, uma div
*			ou qualquer outro tipo.
*
*******************************/

var validation_errors = 0;
jQuery.fn.validateForm = function(){
	var o = $(this[0]);

	$(o).find("input,textarea").each(function(){
		
		var field = $(this);
		if($(field).is(".requiredField") || $(field).val().length > 0){
			validateField(field);
		}
							
	});
		
};

jQuery.fn.cleanValidationMessages = function(){
	var o = $(this[0]);
	
	$(o).find("input").each(function(){
		
		var field = $(this);
		if($(field).is(".requiredField") || $(field).val().length > 0){
			$(field).parent().children('div').remove();
			$(field).removeClass("required-field-not-fulfilled");
		}
							
	});
		
};


function validateField(field){

	switch(getFieldType(field)){
		case "email" :
			validateEmail(field);
			break;
		case "cpf" :
			validateCPF(field);
			break;		
		case "cnpj" :
			validateCNPJ(field);
			break;				
		default:
			lengthValidation(field);
	}
	
	validateMatches(field);
	
}


/****************
**  VALIDATIONS
*************************/

function validateMatches(field){
	if($(field).attr("matchField") != null && $(field).attr("matchField").length > 0){
		if($(field).val() != $('#'+$(field).attr("matchField")).val()) {
			var msg = "Campos de confirmação não conferem.";
			setValidationMessage(field,"match-error-message",msg);
			setValidationMessage($('#'+$(field).attr("matchField")) , "match-error-message" , msg);			
		} else {
			fixValidationMessage(field,"match-error-message");			
			fixValidationMessage($('#'+$(field).attr("matchField")) , "match-error-message");						
		}
	}
}


function lengthValidation(field){
	if($(field).val().length == 0){
		
		var msg = "Campo com preenchimento obrigatório.";		
		setValidationMessage(field , "validation-error-message" , msg);
	} else {
		fixValidationMessage(field,"validation-error-message");
	}
}

function validateEmail(field){
	var emailPattern = /\w{2,}@\w{2,}\.\w{2,}[\.\w{2,}]*/;	
	var fieldValue = $(field).val();	
	
	if(emailPattern.test(fieldValue)){
		fixValidationMessage(field,"validation-error-message");
	} else {
		var msg = "Por favor digite um e-mail válido.";
		setValidationMessage(field , "validation-error-message" , msg);
	}
	
}

function validateCPF(field){
	var cpfPattern = /^\d{3}\x2E\d{3}\x2E\d{3}\x2D\d{2}$/;	
	var fieldValue = $(field).val();	
	
	if(cpfPattern.test(fieldValue)){
		fixValidationMessage(field,"validation-error-message");
	} else {
		var msg = "Por favor digite um CPF válido.";
		setValidationMessage(field , "validation-error-message" , msg);
	}
	
	
	
}

function validateCNPJ(field){
	var cnpjPattern = /^[0-9]{2,3}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}-[0-9]{2}$/;	
	var fieldValue = $(field).val();	
	
	if(cnpjPattern.test(fieldValue)){
		fixValidationMessage(field,"validation-error-message");
	} else {
		var msg = "Por favor digite um CNPJ válido.";
		setValidationMessage(field , "validation-error-message" , msg);
	}
	
}







/****************
**  GETTERS FOR FIELD PROPERTIES
*************************/



function getFieldType(field){
	return $(field).attr("fieldType");
}



/****************
**  MESSAGES
*************************/


function fixValidationMessage(field,cssClass){

	if($(field).parent().children('.'+cssClass).length > 0){
			$(field).parent().children('.'+cssClass).remove();
			$(field).removeClass("required-field-not-fulfilled");
	}
	if(validation_errors > 0) validation_errors--;

}

function setValidationMessage(field,cssClass,msg){

	if($(field).parent().find('.'+cssClass).length == 0){
			$(field).parent().append("<div class='" + cssClass + "'>"+ msg +"</div>").css("display","none").fadeIn();
			$(field).addClass("required-field-not-fulfilled");
			validation_errors++;
	}
}

