
function validAll (campo){
	
	/*exemplo de utilização

	<input type="text" name="textfield" id="textfield" tipoValidacao="branco,numero,cpf" tipoRetorno="alert" mensagem="O campo deve conter um número de cpf valido!" foco="1"/>

	*/

	if ($('#'+campo)) {
		/* Campo a validar */
		var element	= $('#'+campo);
	} else {
		alert ('Um dos campos do form não possui o parametro ID.');
		return false;
	}
	
	/* Testa se existem validações a serem feitas */
	if (element.attr('tipoValidacao')) {
	
			/*Pega o atributo tipo de validação a ser feita ex:'branco,numero'
					branco - Campo em branco
					naoobrigatorio - Valida apenas se o campo estiver preenchido, criado para casos de campos não obrigatórios
					numero - Número
					max+n - Maxlenght + quant de caracteres que não pode ultrapassar
					min-n - Minlenght - quant minima de caracteres necessario
					email - Email
					carac - Caracteres especiais
					visa - valida se é um cartão do tipo Visa
					master - valida se é um cartão do tipo Master
					checked - valida se um checkbox ou radio estão marcados
					cpf - valida se é um CPF válido	
					cnpj - valida se é um CNPJ válido
					cep - valida CEP válido
					selected-n - Verifica se existe algum item marcado em um select, ou se está marcado um item que não pode ser selecionado
					igual - Verifica se um campo é igual a outro campo, é necessário incluir um parametro no campo informando com qual deve ser comparado, parametro campoIgual. ex: campoIgual="senha"
			*/
			var tipoValidacao	= element.attr('tipoValidacao').split(",");
		
			for(i = 0; i < tipoValidacao.length; i++){
				//alert('Element '+ i +' = '+ tipoValidacao[i]); 
		
				/*Valida se está em branco*/
				if (tipoValidacao[i] == 'branco') {
					if (!element.val() || element.val() =='' || element.val() ==' ') {
						msg(element);
						return false;	
					}
				}
				
				/*Valida se está preenchido*/
				else if (tipoValidacao[i] =='naoobrigatorio') {
					if (!element.val() || element.val() == '' || element.val() == ' ') {
						return true;	
					}
				}				
				
				/*Valida se é número*/		
				else if (tipoValidacao[i] =='numero') {
				
				
					 var n = element.val();
					 var filter  = /^[0-9]+$/;
					 
					 if (!filter.test(n)){
						msg(element);
						return false;								
					 }			
		
				}
					
				/*Valida maxlenght*/		
				else if (tipoValidacao[i].indexOf('max+') != -1) {
		
					var num = tipoValidacao[i].split("+");
					
					if (element.val().length > num[1]) {
						msg(element);
						return false;			
					}
				}
				
				/*Valida minlenght*/		
				else if (tipoValidacao[i].indexOf('min-') != -1) {
		
					var num = tipoValidacao[i].split("-");
					
					if (element.val().length < num[1]) {
						msg(element);
						return false;							
					}
				}
				
				/*Valida email*/				
				else if (tipoValidacao[i] =='email') {
		
					 var e = element.val();
					 var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
					 
					 if (!filter.test(e)){
						msg(element);
						return false;				
					 }
						/*
						else if (!validateProvider(element)) {
							return false;
						}
						*/
						else validateProvider(element);
			 
				}
		
				/*Valida caracteres especiais*/				
				else if (tipoValidacao[i] =='carac') {
		
					 var c = element.val();
					 var filter  = /^[A-Z0-9]+$/i;
					 
					 if (!filter.test(c)){
						msg(element);
						return false;				
					 }		
			 
				}	
				
				/*Valida cartão Visa*/				
				else if (tipoValidacao[i] =='visa') {
		
					 var visa = element.val();
					 if (!validaCartaoVisa(visa)) {
						 msg(element);
						 return false;											
						}			 
				}
				
				/*Valida cartão Master*/				
				else if (tipoValidacao[i] =='master') {
		
					 var master = element.val();
					 if (!validaCartaoMaster(master)) {
						 msg(element);
						 return false;											
						}			 
				}
				
				/*Valida marcado*/				
				else if (tipoValidacao[i] =='checked') {
					 
					 if (!element.checked){
						msg(element);
						return false;				
					 }		
			 
				}
		
				/*Valida CPF*/				
				else if (tipoValidacao[i] =='cpf') {
					 
					 if (!isCpf(element.val())){
						msg(element);
						return false;				
					 }		
			 
				}
				
				/*Valida CNPJ*/				
				else if (tipoValidacao[i] =='cnpj') {
					 
					 if (!isCnpj(element.val())){
						msg(element);
						return false;				
					 }		
			 
				}	
				
				/*Valida CEP*/				
				else if (tipoValidacao[i] =='cep') {
					 
					 var cep = element.val();
					 var filter  = /((^\d{5}$)|(^\d{8}$))|(^\d{5}-\d{3}$)/;
					 
					 if (!filter.test(cep)){
						msg(element);
						return false;				
					 }			
			 
				}	
				
				/*Valida Selected*/				
				else if (tipoValidacao[i].indexOf('selected-') != -1) {
		
					var itemSelect = tipoValidacao[i].split("-");
									 
					if (element.selectedIndex == -1 || element.options[itemSelect[1]].selected){
						msg(element);
						return false;				
					}			
			 
				}	
				
				/*Valida campos iguais*/				
				else if (tipoValidacao[i]== 'igual') {
		
					var campo1 = element.val();
					var campo2 = eval('document.getElementById(\''+element.attr('campoIgual')+'\').value');
					
					if (campo1 != campo2){
						msg(element);
						return false;				
					}			
			 
				}
				
				/*Valida campos iguais*/				
				else if (tipoValidacao[i]== 'diferente') {
		
					var campo1 = element.val();
					var campo2 = eval('document.getElementById(\''+element.attr('campoDiferente')+'\').value');
					
					if (campo1 == campo2){
						msg(element);
						return false;				
					}			
			 
				}					
				
			}
			
			/*Validação OK */	
			return true;
	} else {
		
		/*Sem Validação */	
		return true;
	}
}

/*-----------------------VALIDA CARTOS DE CREDITO----------------*/
function validaCartaoVisa(cartao) {
	var filter  = /^4[0-9]{12}(?:[0-9]{3})?$/;	
	return filter.test(cartao)?true:false;
}

function validaCartaoMaster(cartao) {
 var filter  = /^5[1-5][0-9]{14}$/;
	return filter.test(cartao)?true:false;
}

function isValidCreditCardNumber(cardNumber, cardType){
	var isValid = false;
	var ccCheckRegExp = /[^\d ]/;
	isValid = !ccCheckRegExp.test(cardNumber);
	if (isValid){
					var cardNumbersOnly = cardNumber.replace(/ /g,"");
					var cardNumberLength = cardNumbersOnly.length;
					var lengthIsValid = false;
					var prefixIsValid = false;
					var prefixRegExp;
	switch(cardType){
					case "mastercard":
									lengthIsValid = (cardNumberLength == 16);
									prefixRegExp = /^5[1-5]/;
					break;
					case "visa":
									lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
									prefixRegExp = /^4/;
					break;
					case "amex":
									lengthIsValid = (cardNumberLength == 15);
									prefixRegExp = /^3(4|7)/;
					break;
					default:
									prefixRegExp = /^$/;
									alert("Card type not found");
	}

	prefixIsValid = prefixRegExp.test(cardNumbersOnly);
	isValid = prefixIsValid && lengthIsValid;
	}
	if (isValid){
					var numberProduct;
					var numberProductDigitIndex;
					var checkSumTotal = 0;
					for (digitCounter = cardNumberLength - 1; digitCounter >= 0; digitCounter--){
									checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
									digitCounter--;
									numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
									for (var productDigitCounter = 0; productDigitCounter < numberProduct.length; productDigitCounter++){
													checkSumTotal += parseInt(numberProduct.charAt(productDigitCounter));
									}
					}
					isValid = (checkSumTotal % 10 == 0);
	}

	return isValid;
}

/*-----------------------VALIDA CNPJ e CPF-----------------------*/

NUM_DIGITOS_CPF  = 11;
NUM_DIGITOS_CNPJ = 14;
NUM_DGT_CNPJ_BASE = 8;


/**
 * Adiciona método lpad() à classe String.
 * Preenche a String à esquerda com o caractere fornecido,
 * até que ela atinja o tamanho especificado.
 */
String.prototype.lpad = function(pSize, pCharPad)
{
	var str = this;
	var dif = pSize - str.length;
	var ch = String(pCharPad).charAt(0);
	for (; dif>0; dif--) str = ch + str;

	return (str);
} //String.lpad


/**
 * Adiciona método trim() à classe String.
 * Elimina brancos no início e fim da String.
 */
String.prototype.trim = function()
{
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
} //String.trim


/**
 * Elimina caracteres de formatação e zeros à esquerda da string
 * de número fornecida.
 * @param String pNum
 * 	String de número fornecida para ser desformatada.
 * @return String de número desformatada.
 */
function unformatNumber(pNum)
{
	return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
} //unformatNumber


/**
 * Formata a string fornecida como CNPJ ou CPF, adicionando zeros
 * à esquerda se necessário e caracteres separadores, conforme solicitado.
 * @param String pCpfCnpj
 * 	String fornecida para ser formatada.
 * @param boolean pUseSepar
 * 	Indica se devem ser usados caracteres separadores (. - /).
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String de CPF ou CNPJ devidamente formatada.
 */
function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	if (pUseSepar==null) pUseSepar = true;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var numero = unformatNumber(pCpfCnpj);

	numero = numero.lpad(maxDigitos, '0');
	if (!pUseSepar) return numero;

	if (pIsCnpj)
	{
		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
		numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5");
	}
	else
	{
		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
		numero = numero.replace(reCpf, "$1.$2.$3-$4");
	}
	return numero;
} //formatCpfCnpj


/**
 * Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de
 * CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e
 * informa se o número-efetivo fornecido é CNPJ (default = false).
 * @param String pEfetivo
 * 	String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF.
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é de um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String com os dois dígitos verificadores.
 */
function dvCpfCnpj(pEfetivo, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	var i, j, k, soma, dv;
	var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITOS_CPF;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var calculado = formatCpfCnpj(pEfetivo, false, pIsCnpj);
	calculado = calculado.substring(2, maxDigitos);
	var result = "";

	for (j = 1; j <= 2; j++)
	{
		k = 2;
		soma = 0;
		for (i = calculado.length-1; i >= 0; i--)
		{
			soma += (calculado.charAt(i) - '0') * k;
			k = (k-1) % cicloPeso + 2;
		}
		dv = 11 - soma % 11;
		if (dv > 9) dv = 0;
		calculado += dv;
		result += dv
	}

	return result;
} //dvCpfCnpj


/**
 * Testa se a String pCpf fornecida é um CPF válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpf
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF válido.
 */
function isCpf(pCpf)
{
	var numero = formatCpfCnpj(pCpf, false, false);
	var base = numero.substring(0, numero.length - 2);
	var digitos = dvCpfCnpj(base, false);
	var algUnico, i;

	// Valida dígitos verificadores
	if (numero != base + digitos) return false;

	/* Não serão considerados válidos os seguintes CPF:
	 * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44,
	 * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
	 */
	algUnico = true;
	for (i=1; i<NUM_DIGITOS_CPF; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	return (!algUnico);
} //isCpf


/**
 * Testa se a String pCnpj fornecida é um CNPJ válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCnpj
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CNPJ válido.
 */
function isCnpj(pCnpj)
{
	var numero = formatCpfCnpj(pCnpj, false, true);
	var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
	var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
	var digitos = dvCpfCnpj(base + ordem, true);
	var algUnico;

	// Valida dígitos verificadores
	if (numero != base + ordem + digitos) return false;

	/* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS:
	 * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555,
	 * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
	 */
	algUnico = numero.charAt(0) != '0';
	for (i=1; i<NUM_DGT_CNPJ_BASE; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	if (algUnico) return false;

	/* Não será considerado válido CNPJ com número de ORDEM igual a 0000.
	 * Não será considerado válido CNPJ com número de ORDEM maior do que 0300
	 * e com as três primeiras posições do número BÁSICO com 000 (zeros).
	 * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
	 */
	if (ordem == "0000") return false;
	return (base == "00000000"
		|| parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000");
} //isCnpj


/**
 * Testa se a String pCpfCnpj fornecida é um CPF ou CNPJ válido.
 * Se a String tiver uma quantidade de dígitos igual ou inferior
 * a 11, valida como CPF. Se for maior que 11, valida como CNPJ.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpfCnpj
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF ou CNPJ válido.
 */
function isCpfCnpj(pCpfCnpj)
{
	var numero = pCpfCnpj.replace(/\D/g, "");
	if (numero.length > NUM_DIGITOS_CPF)
		return isCnpj(pCpfCnpj)
	else
		return isCpf(pCpfCnpj);
} //isCpfCnpj

/*-----------------------VALIDA CNPJ e CPF-----------------------*/


/*-----------------------ENVIA MENSAGEM DE ERRO DE VALIDACAO-----------------------*/
function msg (element){

	if (element.attr('tipoRetorno') && element.attr('mensagem')) {
	
			/* Pega o atributo tipo de retorno desejado: alert, div, ajax */	
			var tipoRetorno = element.attr('tipoRetorno');
			
			/* Pega o atributo mensagem desejado */		
			var mensagem = element.attr('mensagem');

			switch (tipoRetorno) {
			
				case 'alert': 
								alert(mensagem);
								break;
				case 'inner':
								if (element.attr('local')) {
									/* Pega o atributo do local de retorno desejado: div, td, etc... */	
									var local = element.attr('local');
						
									document.getElementById(local).innerHTML = mensagem;
								}
								else {
									alert ('Falta o parametro local no campo '+element.id+' para utilizar esta opção');
								}
								break;
				default:
								alert ('Parametro incorreto no campo '+element.id+' para utilização da função!');
								break;			
			}
			
			if (element.attr('foco')) {
				/* Pega o atributo foco, 1 para dar foco no campo e 0 para não dar foco */			
				var foco = element.attr('foco');
			
				if (foco = 1) {
					//element.style.border = 'solid 1px #FF0000';
					element.addClass('input_error').effect('highlight', {}, 1000);
					element.focus();
				}
			}		

	} else {

		alert ('O campo '+element.id+' deve ser preenchido corretamente!');
		element.focus();
		
	}
		
}
/*-----------------------ENVIA MENSAGEM DE ERRO DE VALIDACAO-----------------------*/

/*-----------------------PERCORRE OS ITENS DO FORM VALIDANDO-----------------------*/
function validaForm(formulario) {

	var form = eval('document.'+formulario);
	
	for (var i = 0; i < form.elements.length; i++) {
		//alert(form.elements[i].id);
		if (!form.elements[i].disabled) {
			if (!validAll(form.elements[i].id)) {
				return false;
			}
		}
	}

	return true;
}
/*-----------------------PERCORRE OS ITENS DO FORM VALIDANDO-----------------------*/


function validateProvider(email, checkProvider) {

	var dado = email.val().split('@');
	var dom  = dado[1].split('.');
	t_ext = new Array();
	for (i = 1; i < dom.length; i++) t_ext[i-1] = dom[i];
	
	ext = t_ext.join('.');

	if (checkProvider) {

		$.get('scripts/lev.php', {'p':dom[0]},
					function(returned_data) {
						sugestao = returned_data.split('-', 2);
						if (sugestao[0] <= 2) {
								if (dom[0] != sugestao[1]) {
									$('#divSugestaoEmail').slideDown('fast');
									$('#sugestaoEmail').html(dado[0] + "@" + sugestao[1] + '.' + ext);
								}
						}						
					});
		/*
		$('#divAux').load('scripts/lev.php', {'p':dom[0]}, function() {
				var check   = $('#divAux').html();
				sugestao = check.split('-', 2);
				if (sugestao[0] <= 2) {
						if (dom[0] != sugestao[1]) {
							$('#divSugestaoEmail').slideDown('fast');
							$('#sugestaoEmail').html(dado[0] + "@" + sugestao[1] + '.' + ext);
						}
				}
		});
		*/
	}
	/* lista dos domínios válidos */
	lista_ok  = new Array('', 
						  'msn.com',
						  'gmail.com', 
						  'globo.com',
						  'aol.com',
						  
						  'bol.com.br',
						  'uol.com.br',
						  'brturbo.com.br',
						  'ig.com.br',
						  'oi.com.br',
						  'pop.com.br',
						  'superig.com.br',
						  'ibest.com.br',
						  'zipmail.com.br',
						  'uai.com.br'
						  );

	/* lista dos possíveis domínios inválidos */					  
	lista_err  = new Array('', 
						  'msn.com.br',
						  'gmail.com.br', 
						  'globo.com.br',
						  'aol.com.br',
						  
						  'bol.com',
						  'uol.com',
						  'brturbo.com',
						  'ig.com',
						  'oi.com',
						  'pop.com',
						  'superig.com',
						  'ibest.com',
						  'zipmail.com',
						  'uai.com'
						  );

	/* lista dos domínios que podem várias extensões */
	lista_multi = new Array('',
						   'terra.com',
						   'yahoo.com'
						   );
	
	/* trata se o e-mail é válido*/
	var check = array_search(lista_err, dado[1]);
	var check_multi = array_search(lista_multi, dado[1]);
	
	/* verifica se o e-mail foi digitado erroneamente*/	
	if (check != false) {
		//if (confirm('O e-mail informado não é válido. O correto não seria '+dado[0]+'@'+lista_ok[check]+'?')) {
			alert('Registramos seu e-mail como '+dado[0]+'@'+lista_ok[check]);
			email.val(dado[0]+'@'+lista_ok[check]);
			email.select();
		//}
	}
	else if (check_multi != false) {
		if (!$('body').data('confirm_multi_extensao')) {
			if (confirm('Você tem certeza que este e-mail não é '+lista_multi[check_multi]+'.br?')) {
				email.val(email.val() + '.br');
			} else {
				$('body').data('confirm_multi_extensao', true);
				return true;
			}
		}
	}
	else return true;
}