///////////////////////////////////////  VALIDAÇÃO GENÉRICA DE FORM V. 2.0 ///////////////////////////////////////////////////
//																															//
//	CRIADA POR: 			Denis Carneiro - denis@agenciadmk.com.br - São Paulo - Brasil									//
//	DATA DE FINALIZAÇÃO: 	03/06/2007 20:00																				//
//																															//
//									INSTRUÇÕES DE CONFIGURAÇÃO																//
//																															//
// Colocar um campo do tipo hidden com o nome (nome do formulario) + validação. Ex: form1validacao.							//
// No <form> colocar onsubmit="return validaForm(this);"																	//
//																															//
// 						A CONFIGURAÇÃO DE CADA CAMPO DEVE SER FEITA ASSIM:													//
// 																															//
//		1- id_do_campo(regra_de_validação{}tipo_de_validação)Outro_id_de_campo(...											//
// 		2- Para colocar várias alternativas, colocar || (ou). EX: senha(regra1 || regra2 {} tipo)							//
// 		3- Para colocar várias alternativas obrigatórias, basta colocar 2 validações para o mesmo							//
//		   campo. Ex: senha(regra{}validação)senha(regra2{}validação)...													//
// 		4- O campo pode ter ou não uma validação. Neste caso usar: campo(regra) ou campo(regra{})							//
// 																															//
// 									AS VALIDAÇÕES DISPONIVEIS SÃO:															//
// 																															//
// 		1- 	dt 	 -	data formato: dd/mm/aa																					//
// 		2- 	dt2  -	data formato: dd/mm/aaaa																				//
// 		3- 	dt3  -	data formato: dd/mm																						//
// 		4- 	dt4  -	data formato: mm/aa																						//
// 		5- 	dt5  -	data formato: mm/aaaa																					//
// 		6- 	h 	 -	hora formato: hh:mm:ss																					//
// 		7- 	h2   -	hora formato: hh:mm																						//
// 		9- 	n  	 -	numérico																								//
// 		10- em   -	e-mail																									//
// 		11- cep  -	cep																										//
// 		12- cpf  -	cpf																										//
// 		13- cnpj -	cnpj																									//
// 		14- rg   -	rg																										//
// 		15- url  -	url																										//
// 		16- fl   -	float com 1 casa decimal, positivos ou negativos, com ou sem separação de milhar.						//
// 		17- fl2  -	float com 2 casas decimais, positivos ou negativos, com ou sem separação de milhar.						//
// 		18- fl3  -	float com 3 casas decimais, positivos ou negativos, com ou sem separação de milhar. 					//
// 		19- fl4  -	float com de uma até infinitas casas decimais, positivos ou negativos, com ou sem separação de milhar.	//
// 		20- fl5  -	float com de duas casas decimais, positivos ou negativos, com ou sem separação de milhar, podendo não   //
// 					ter casas decimais.																						//
// 																															//
// 										AS REGRAS DE VALIDAÇÃO SÃO															//
// 																															//
// 		1- Para forçar o preenchimento ou seleção de um campo, colocar campo(ni;nf), sendo que								//       
//		   ni = a quantidade inicial (para não obrigatório, colocar 0) e nf é a quantidade final (para  					//
// 		   não obrigar a quantidade máxima, pode-se colocar n ou nada (campo(2;n) ou campo(2;))								//
// 		   esta regra serve tanto para caracteres, quanto seleção em checkbox ou select múltiplo.							//
// 																															//
// 		2- Para forçar o campo a ser igual a uma string, colocar a string entre aspas simples.								//
//		   Ex: campo('denis') ou campo('denis'{})																			//
// 																															//
// 		3- Para forçar um campo a ser preenchido com o valor igual ao valor de outro campo, colocar o						//
// 		   Id do outro campo sem aspas. Ex: confirmasenha(senha)															//
// 																															//
// 		4- Para o caso 2 ou 3, podemos querer que o campo tenha parte de uma string ou do valor de outro					//
// 		   campo. Neste caso, usamos o sinal de %:																			//
// 		   a) campo(%'enis') 	- o campo termina com "enis" - pode ser: "tenis" ou "denis"...								//
// 		   b) campo('denis'%) 	- o campo começa com "denis"  -	pode ser: "denis" ou "denise"								//
// 		   c) campo(%'bomba'%) 	- o campo contém "bomba" 	 -	pode ser: "bomba" ou "bombas" ou "anti-bombas" 				//
// 		   d) campo(%outrocampo)- o campo termina com o valor de outro campo								  				//
// 		   e) campo(outrocampo%)- o campo começa com o valor de outro campo													//
// 		   f) campo(%outrocampo%)- o campo contém o valor de outro campo									  				//
// 		 																													//
// 		5- Para usar uma condição, usar o "<" antes do nome do campo 														//
// 		   Ex. <onde('outro')qual(1;) --> se o campo onde tiver o valor outro, o campo qual torna-se obrigatório			//
// 		   Ex.2 <pessoa('fisica')documento(1;{}cpf) -> se o radio pessoa for selecionado como física, então					//
// 		   o campo documento deve ser preenchido com um cpf válido															//
// 																															//
// 												EXEMPLO DE USO																//
// 																															//
// 		1- Suponhamos que temos uma tela de cadastro de usuário com os campos: 												//
// 		   a) Login (id = login - textfielf, tipo e-mail, obrigatório)														//
// 		   b) Senha (id = senha - textfield, tipo numérica, deve ser preenchida de 8 a 10 caracteres)						//
// 		   c) Confirma senha (id = confirmasenha - textfield, deve ter valor igual ao campo senha)							//
// 		   d) Onde conheceu o site? (id = onde - select múltiplo - pelo menos um deve ser preenchido)						//
// 		   e) Aceito os termos (id = aceito	- radio - a opção "sim" deve ser selecionada									//
// 		   f) cidades (id = cidades - checkbox - deve ser selecionada de 5 a 10 ciaddes)									//
// 		   g) Sexo	(id = sexo - radio - uma opção deve ser selecionada)													//
// 		   h) outro (id = outro - textfield - é obrigatório se o onde tiver o value "outros"								//
// 																															//
// 																															//
// 										A validação ficaria assim:															//
// 																															//
//login(1;{}em)senha(8;10{}n)confirmasenha(senha)onde(1;)aceito('sim')cidades(5;10)sexo(1;1)<onde('outros')outro(1;)		//
// 																															//
// 									O HTML DESTE FORM FICARIA ASSIM															//
// 																															//
//<form id="formteste" name="formteste" method="post" action="#" onsubmit="return validaForm(this);">						//
//  Login: <input type="text" name="login" id="login" maxlength="64" /><br />												//
//  Senha: <input type="text" name="senha" id="senha" maxlength="10" /><br />												//
//  Confirme a senha: <input type="text" name="confirmasenha" id="confirmasenha" maxlength="10" /><br />					//
//  Onde conheceu o site?																									//
//  <select name="onde" size="4" multiple>																					//
//  	<option value="Revista">Revista</option>																			//
//	<option value="Internet">Internet</option>																				//
//	<option value="Televisão">Televisão</option>																			//
//	<option value="Outro">Outro</option>																					//
//  </select> 																												//
//  Qual? <input type="text" name="outro" id="outro" maxlength="32" /><br />												//
//  Selecione de 5 a 10 cidades abaixo:<br />																				//
//  cidade1 <input name="cidades" type="checkbox" value="cidade1" /><br />													//
//  cidade2 <input name="cidades" type="checkbox" value="cidade2" /><br />													//
//  cidade3 <input name="cidades" type="checkbox" value="cidade3" /><br />													//
//  cidade4 <input name="cidades" type="checkbox" value="cidade4" /><br />													//
//  cidade5 <input name="cidades" type="checkbox" value="cidade5" /><br />													//
//  cidade6 <input name="cidades" type="checkbox" value="cidade6" /><br />													//
//  cidade7 <input name="cidades" type="checkbox" value="cidade7" /><br />													//
//  cidade8 <input name="cidades" type="checkbox" value="cidade8" /><br />													//
//  cidade9 <input name="cidades" type="checkbox" value="cidade9" /><br />													//
//  cidade10 <input name="cidades" type="checkbox" value="cidade10" /><br />												//
//  cidade11 <input name="cidades" type="checkbox" value="cidade11" /><br />												//
//  Sexo:<br />																												//
//  Masculino <input name="sexo" type="radio" value="Masculino" /> 															//
//	Feminino <input name="sexo" type="radio" value="Feminino" />															//
//  <br />																													//
//  Você aceita os termos? sim <input name="aceito" type="radio" value="sim" /> 											//
//  não <input name="aceito" type="radio" value="não" /><br />																//
//  <input type="hidden" name="formtestevalidacao" id="formtestevalidacao" value="login(1;{}em)senha(8;{}n)					//
//  confirmasenha(senha)onde(1;)<onde(%'Outro'%)outro(1;)cidades(5;10)sexo(1;1)aceito('sim')" />							//
//  <input type="submit" />																									//
//</form>																													//
//																															//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function validaForm(qualForm){
	var hidden = "";
	hidden = qualForm.name + "validacao";
	hidden = $(hidden);
	if(hidden != null && hidden != undefined){
		if(hidden.value != "" && hidden.type == "hidden"){
			hidden = hidden.value.replace(/ /g,"");
			if(processaER(/^[<\w-]+\(.+?\)/,hidden,false)){
				var elementos = "";
				var mensagem 	= "Atenção\n\n";
				var valor 		= [1];
				var validacao 	= "";
				var regra 		= "";
				var campo		= "";
				var passou 		= false;
				var mensagemFim = "";
				var condicao 	= false;
				var errocondicao= false;
				var numElementos= qualForm.elements.length;
				hidden 			= hidden.replace(/\)/g,")!@#$%");
				hidden 			= hidden.replace(/!@#\$%$/,"");
				elementos 		= hidden.split("!@#$%");
				for(x = 0; x < elementos.length; x++){
					if(condicao){
						condicao = false;
					}else{
						if(!processaER(/^[<\w-]+\(.+?\)$/,elementos[x],false)){
							alert(mensagem + "A " + (x+1) + "ª validação está com má formação.\n\nPor favor, contate o administrador do sistema informando esta mensagem.");
							return false;
						}else{
							if(elementos[x].substring(0,1) == "<"){
								elementos[x] = elementos[x].substring(1,elementos[x].length);
								condicao = true;
							}
							campo = $(processaER(/^[\w-]+(?=\()/,elementos[x],true));										   
							if(campo == null || campo == undefined){
								campo = $_(processaER(/^[\w-]+(?=\()/,elementos[x],true));
								if(campo != null || campo != undefined){
									campo = campo[0];
								}
							}
							if(campo == null || campo == undefined){
								alert(mensagem + "O campo com o ID ou nome '" + processaER(/^[\w-]+(?=\()/,elementos[x],true) + "' não foi encontrado.\n\nPor favor, contate o administrador do sistema informando esta mensagem.");
								return false;
							}else{
								valor[0]	= "";
								valor[1]	= 0;
								mensagemFim = "";
								validacao = ((elementos[x].substring(elementos[x].indexOf("(")+1,elementos[x].indexOf(")"))).replace(/{}$/,"")).split("{}");
								if(campo.type == "radio" || campo.type == "checkbox" || campo.type == "select-multiple"){
									switch(campo.type){
										case "radio":
										case "checkbox":
											for(y=0; y<numElementos; y++){
												if(qualForm.elements[y].name == campo.name && (qualForm.elements[y].type == "radio" || qualForm.elements[y].type == "checkbox") && qualForm.elements[y].checked){
													valor[0]	+= qualForm.elements[y].value;
													if(qualForm.elements[y].checked){valor[1] += 1;}													
												}
											}
										break;
										case "select-multiple":
											for (y = 0; y < campo.options.length; y++){
												if(campo.options[y].selected){
													valor[0]	+= campo.options[y].value;
													if(campo.options[y].selected){valor[1] += 1;}
												}
											}
										break;
									}
								}else{
									valor[0] = campo.value;
									valor[1] = campo.value.length;
								}
								mensagem = "Atenção\n\nO campo " + campo.name + " não foi preenchido corretamente.\n\n"
								if(validacao.length > 1 && condicao == false){
									if(valor[0].length >= 1){
										regra = validacao[1];
										switch(regra.toLowerCase()){
											case "dt":
												expressao = /^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma data válida no formato dd/mm/aa.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "dt2":
												expressao = /^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma data válida no formato dd/mm/aaaa.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "dt3":
												expressao = /^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma data válida no formato dd/mm.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "dt4":
												expressao = /^((0?[1-9])|1[0-2])\/\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma data válida no formato mm/aa.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "dt5":
												expressao = /^((0?[1-9])|1[0-2])\/(19|20)\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma data válida no formato mm/aaaa.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "h":
												expressao = /^(2[0–3]|[01]\d):[0–5]\d:[0–5]\d$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma hora válida no formato hh:mm:ss.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "h2":
												expressao = /^(2[0–3]|[01]\d):[0–5]\d$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com uma hora válida no formato hh:mm.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "n":
												expressao = /^\d+$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o apenas com números.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "em":
												expressao = /^[a-zA-Z0-9]{1}([\._a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,3}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o com um formato de e-mail válido.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "cep":
												expressao = /^\d{5}[- .]?\d{3}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o no formato ddddd-ddd ou ddddd.ddd ou ddddd ddd ou.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
												if(parseInt(valor[0].substring(0,5),10) < 1000){
													mensagemFim = "\n\nO CEP digitado não existe.";
													retorna(mensagem,campo,mensagemFim);
													return false;					
												}
											break;
											case "cpf":
												expressao = /^(\d{3}[. -]?){3}\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													retorna(mensagem,campo,"");
													return false;
												}
												i = 0;
												for(i=0;i<valor[0].length;i++)
												{
													temp = valor[0].substring(i,i+1);
													if(temp == "." || temp == "-" || temp == " ")
													{
														valor[0] = valor[0].substring(0,i) + valor[0].substring(i+1,valor[0].length);
														campo.value = valor[0];
													}
												}
						
												if (valor[0].length != 11 || valor[0] == "00000000000" || valor[0] == "11111111111" || valor[0] == "22222222222" ||	valor[0] == "33333333333" || valor[0] == "44444444444" || valor[0] == "55555555555" || valor[0] == "66666666666" || valor[0] == "77777777777" || valor[0] == "88888888888" || valor[0] == "99999999999"){
													retorna(mensagem,campo,"");
													return false;
												}
												soma = 0;
												for (i=0; i < 9; i ++){
													soma += parseInt(valor[0].charAt(i)) * (10 - i);
												}
												resto = 11 - (soma % 11);
												if (resto == 10 || resto == 11){resto = 0;}
												if (resto != parseInt(valor[0].charAt(9))){
													retorna(mensagem,campo,"");
													return false;
												}
												soma = 0;
												for (i = 0; i < 10; i ++){soma += parseInt(valor[0].charAt(i)) * (11 - i);}
												resto = 11 - (soma % 11);
												if (resto == 10 || resto == 11){resto = 0;}
												if (resto != parseInt(valor[0].charAt(10))){
													retorna(mensagem,campo,"");
													return false;
												}
											break;
											case "cnpj":
												expressao = /^\d{2}[. -]?\d{3}[. -]?\d{3}[. - \/]?\d{4}[. -]?\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													retorna(mensagem,campo,"");
													return false;
												}
												i = 0;
												for(i=0;i<valor[0].length;i++){
													temp = valor[0].substring(i,i+1);
													if(temp == "." || temp == "-" || temp == " " || temp == "/"){
														valor[0] = valor[0].substring(0,i) + valor[0].substring(i+1,valor[0].length);
														campo.value = valor[0];
													}
												}
												var numeros, digitos, soma, resultado, pos, tamanho, digitos_iguais;
												digitos_iguais = 1;
												for (i = 0; i < 14; i++){
													if (valor[0].charAt(i) != valor[0].charAt(i + 1)){
														digitos_iguais = 0;
														break;
													}
												}
												if (!digitos_iguais){
													tamanho = valor[0].length - 2;
													numeros = valor[0].substring(0,tamanho);
													digitos = valor[0].substring(tamanho);
													soma = 0;
													pos = tamanho - 7;
													for (i = tamanho; i >= 1; i--){
														soma += numeros.charAt(tamanho - i) * pos--;
														if (pos < 2){pos = 9;}
													}
													resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
													if (resultado != digitos.charAt(0)){
														retorna(mensagem,campo,"");
														return false;
													}
													tamanho = tamanho + 1;
													numeros = valor[0].substring(0,tamanho);
													soma = 0;
													pos = tamanho - 7;
													for (i = tamanho; i >= 1; i--){
														soma += numeros.charAt(tamanho - i) * pos--;
														if (pos < 2){
															pos = 9;
														}
													}
													resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
													if (resultado != digitos.charAt(1)){
														retorna(mensagem,campo,"");
														return false;
													}
												}else{
													retorna(mensagem,campo,"");
													return false;
												} 
											break;
											case "rg":
												expressao = /^\d{2}[\. -]?\d{3}[\. -]?\d{3}([\. -]?(\d|x|X))?$/;
												if(processaER(expressao,valor[0],false) == false){
													retorna(mensagem,campo,"");
													return false;
												}
											break;
											case "url":
												expressao = /^(http:\/\/)?(www.)?([_a-zA-Z-\d]{3,}(\.?[_a-zA-Z-\d]+)?)(\.[a-z]{2,3})(\.[a-z]{2})?$/;
												if(processaER(expressao,valor[0],false) == false){
													retorna(mensagem,campo,"");
													return false;
												}
											break;
											case "fl":
												expressao = /^\d{1,3}(\.?\d{3})*,\d$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o apenas com números inteiros positivos ou negativos, pontos (para separar milhar) e vírgula (para determinar decimal), com UM número decimal.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "fl2":
												expressao = /^\d{1,3}(\.?\d{3})*,\d{2}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o apenas com números inteiros positivos ou negativos, pontos (para separar milhar) e vírgula (para determinar decimal), com DOIS números decimais.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "fl3":
												expressao = /^\d{1,3}(\.?\d{3})*,\d{3}$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o apenas com números inteiros positivos ou negativos, pontos (para separar milhar) e vírgula (para determinar decimal), com TRÊS números decimais.";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "fl4":
												expressao = /^\d{1,3}(\.?\d{3})*,\d+$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o apenas com números inteiros positivos ou negativos, pontos (para separar milhar) e vírgula (para determinar decimal).";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
											case "fl5":
												expressao = /^\d{1,3}(\.?\d{3})*(,\d{2})?$/;
												if(processaER(expressao,valor[0],false) == false){
													mensagemFim = "Preencha-o apenas com números inteiros positivos ou negativos, pontos (para separar milhar) e vírgula (para determinar decimal).";
													retorna(mensagem,campo,mensagemFim);
													return false;
												}
											break;
										}
									}
								}
								regra 	= validacao[0].split("||");
								passou 	= false;
								for(i=0;i<regra.length;i++){
									expressao = "";
									if(regra[i].indexOf(";") == -1){
										if(regra[i].indexOf("'") != -1 && regra[i].lastIndexOf("'") > regra[i].indexOf("'")){
											expressao = regra[i].replace(/[%']/g,"");
										}else{
											expressao = $(regra[i].replace(/[%']/g,""));
											if(expressao == undefined){
												alert("Atenção\n\nO campo com o ID '" + regra[i].replace(/[%']/g,"") + "' não foi encontrado.\n\nPor favor, contate o administrador do sistema informando esta mensagem.");
												return false;																														 
											}
											expressao = expressao.value;
										}
										expressao = expressao.replace(/\\/g,"\\\\");
										expressao = expressao.replace(/\./g,"\\.");
										expressao = expressao.replace(/\[/g,"\\[");
										expressao = expressao.replace(/\]/g,"\\]");
										expressao = expressao.replace(/\?/g,"\\?");
										expressao = expressao.replace(/\+/g,"\\+");
										expressao = expressao.replace(/\{/g,"\\{");
										expressao = expressao.replace(/\}/g,"\\}");
										if(regra[i].charAt(0) != "%"){
											expressao = "^" + expressao;
										}else{
											expressao = expressao.replace(/^\^/,"\\^");
										}
										if(regra[i].charAt(regra[i].length-1) != "%"){
											expressao += "$";
										}else{
											expressao = expressao.replace(/\$$/,"\\$");
										}
										expressao = new RegExp(expressao)
										if(processaER(expressao,valor[0],false) == true){
											passou = true;
											condicao = false;
											break;
										}else{
											if(condicao){passou = true;}
										}
									}else{
										passou = true;
										errocondicao = false;
										intervalo = regra[i].split(";");
										if(parseInt(intervalo[0]) > valor[1]){
											if(condicao){
												errocondicao = true;
											}else{
												if(campo.type == "select-multiple" || campo.type == "radio" || campo.type == "checkbox"){
													mensagemFim += "Por favor, selecione no mínimo " + parseInt(intervalo[0]) + " opç"
													if(parseInt(intervalo[0]) > 1){
														mensagemFim += "ões."
													}else{
														mensagemFim += "ão."
													}
												}else{
													mensagemFim += "Por favor, preencha-o com no mínimo " + parseInt(intervalo[0]) + " caractere"
													if(parseInt(intervalo[0]) > 1){
														mensagemFim += "s."
													}else{
														mensagemFim += "."
													}
												}
												retorna(mensagem,campo,mensagemFim);
												return false;
											}
										}
										if(intervalo.length > 1){
											if(intervalo[1].toLowerCase() != "n" || intervalo[1].toLowerCase() != ""){
												if(parseInt(intervalo[1]) < valor[1]){
													if(condicao){
														errocondicao = true;
													}else{
														if(campo.type == "select-multiple" || campo.type == "radio" || campo.type == "checkbox"){
															mensagemFim += "Por favor, selecione no máximo " + parseInt(intervalo[1]) + " opç"
															if(parseInt(intervalo[1]) > 1){
																mensagemFim += "ões."
															}else{
																mensagemFim += "ão."
															}
														}else{
															mensagemFim += "Por favor, preencha-o com no máximo " + parseInt(intervalo[1]) + " caractere"
															if(parseInt(intervalo[1]) > 1){
																mensagemFim += "s."
															}else{
																mensagemFim += "."
															}
														}
														retorna(mensagem,campo,mensagemFim);
														return false;
													}
												}
											}
										}
										if(errocondicao == false){
											condicao = false;
											break;
										}
									}
								}
								if(!passou){
									mensagemFim += ""
									retorna(mensagem,campo,mensagemFim);
									return false;
								}
							}
						}
					}
				}
			}
		}
	}
	function processaER(expressao,string,metodo){
		if(metodo){
			return expressao.exec(string);
		}else{
			return expressao.test(string);
		}
	}
	function retorna(inicioMensagem,objeto,mensagemFim){
		alert(inicioMensagem + mensagemFim);
		objeto.focus();
	}
	function $(id){
		return document.getElementById(id);
	}
	function $_(nome){
		return document.getElementsByName(nome);
	}
	return true;
}

///////////////////////////////////////  FUNÇÕES PARA USO DE AJAX //////////////////////////////////////////////////////
// Autor: Agência DMK																							  	  //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fila=[];
ifila=0;
arrCache=[];
function initAd(){
	var ie = (document.all);
	if(!ie){return false;}
	adDiv=eval('document.all.carregando.style');
	randAd=Math.ceil(Math.random()*1);
	if(randAd==1) showAd();
}
function showAd(){
	documentWidth =truebody().offsetWidth/2+truebody().scrollLeft-20;
	documentHeight =truebody().offsetHeight/2+truebody().scrollTop-20;
	adDiv.top =documentHeight+'px';
	setTimeout("showAd()",1);
}
function truebody(){
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}
function processaRetorno(url,data,cache){
	if(cache){
		var encontrou = false;
		for(x=0;x<arrCache.length;x++){
			if(arrCache[x][0] == url){
				encontrou = true;
				break;
			}
		}
		if(encontrou == false){
			arrCache[arrCache.length]=[url,data];
		}
	}
	data=unescape(data.replace(/\+/g," "));
	document.getElementById("carregando").style.display = "none";
	var temscript = false;
	expressao = /<script/;
	if(testarExpresao(expressao,data)){
		var ini = 0;
		while (ini!=-1){
			ini = data.indexOf('<script', ini);
			if (ini >=0){
				ini = data.indexOf('>', ini) + 1;
				var fim = data.indexOf('</script>', ini);
				var codigo = data.substring(ini,fim);
				var novo = document.createElement("script")
				novo.text = codigo;
				document.body.appendChild(novo);
				data = data.substring(0,data.indexOf('<script')) + data.substring(data.indexOf('</script>')+9);
				temscript = true;
			}
		}
	}
	if(fila[ifila][1].length > 0){
		retorno = document.getElementById(fila[ifila][1]);
		if(retorno.tagName.toLowerCase()=="input"){
			data=unescape(data.replace(/\+/g," "))
			retorno.value = data;
		}else if(retorno.tagName.toLowerCase()=="select"){        
			select_innerHTML(retorno,data)
		}else if(retorno.tagName){
			//retorno.innerHTML = data;
			$(retorno).html(data);
		}
	}
	if(temscript){executaRetorno();}
	ifila++;
	if(ifila<fila.length){
		if(fila[ifila][2]){
			document.getElementById("carregando").style.display = "block";
		}
		setTimeout("ajaxRun()",20)
	}
	function select_innerHTML(objeto,innerHTML){
		objeto.innerHTML = "";
		var selTemp = document.createElement("micoxselect");
		var opt;
		selTemp.id="micoxselect1";
		document.body.appendChild(selTemp);
		selTemp = document.getElementById("micoxselect1");
		selTemp.style.display="none";
		if(innerHTML.toLowerCase().indexOf("<option")<0){
			innerHTML = "<option>" + innerHTML + "</option>";
		}
		innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span");
		selTemp.innerHTML = innerHTML;
		for(var i=0;i<selTemp.childNodes.length;i++){
			if(selTemp.childNodes[i].tagName){
				opt = document.createElement("OPTION");
				for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){
					opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true));
				}
				opt.value = selTemp.childNodes[i].getAttribute("value");
				opt.text = selTemp.childNodes[i].innerHTML;
				if(document.all){
					objeto.add(opt);
				}else{
					objeto.appendChild(opt);
				}                    
			}    
		}
		document.body.removeChild(selTemp);
		selTemp = null;
	}
}
function solicitaAjax(url,retorno,carregando,cache,formulario){
	var taNaFila = false;
	for(x=ifila;x<fila.length;x++){
		if(fila[ifila][0] == url){
			taNaFila = true;
			break;
		}
	}
	if(taNaFila == false){
		if(formulario.length > 0){
			formulario = document.getElementById(formulario);
			if(formulario == null){alert("Atenção\n\nO formulário não foi encontrado.");}
			var send = new Array(); 
			var elementos = formulario.elements; 
			  
			for(var i = 0; i < elementos.length; i++) { 
				 var e = elementos[i]; 
				 if(!e.name) 
					 continue; 			  

				 var nVal = ""; 
          
				 for(var x = 0; x < e.value.length; x++) { 
					 codeA = e.value.charCodeAt(x); 
					 codeA = DecHex(codeA); 
					 nVal += "%" + codeA; 
				 }
				 
				 var tipo = e.type.toLowerCase();
				  
				if(tipo != "checkbox" && tipo != "radio") { 
				 	send[send.length] = e.id + "=" + nVal; 
				} else { 
					 if(e.checked) { 
						 send[send.length] = e.id + "=" + nVal; 
					 } 
				}
			 }
			 send = send.join("&");
		}
		
		fila[fila.length]=[url,retorno,carregando,cache,send];
	}
	if((ifila+1)==fila.length && taNaFila == false){
		 if(carregando){
				document.getElementById("carregando").style.display = "block";
		}
		ajaxRun();

	}
}

function DecHex(dec2) { 
 var hex_chars = "0123456789ABCDEF"; 

 var n1 = hex_chars.charAt(Math.floor(dec2 / 16)); 
 var n2 = hex_chars.charAt(dec2 % 16); 

 return n1 + n2; 
} 
function ajaxDMK(funcao,retorno,carregando,cache,formulario,parametros){
	if(parametros != ""){
		// ALTERADO POR ALEXANDRO DELGADO PARA PASSAR OS PARAMETROS DEVIDO A RETIRADA DO REFLESH DO CARRINHO 3
		// url = ajaxFuncoes(funcao) + "&" + parametros;
		url = ajaxFuncoes(funcao) + "&" + parametros + "&Sub=" + document.frm_entrega.ajax_SubTotal_final.value + "&Frete=" + document.frm_entrega.ajax_total_frete.value;
	}else{
		url = ajaxFuncoes(funcao);
	}
	
	if(cache){
		if(arrCache.length>0){
			var encontrou = false;
			for(x=0;x<arrCache.length;x++){
				if(arrCache[x][0] == url){
					ifila -=1;
					processaRetorno(url,arrCache[x][1], false);
					encontrou = true;
					break;
				}
			}
			if(encontrou == false){
				solicitaAjax(url,retorno,carregando,cache,formulario);
			}
		}else{
			solicitaAjax(url,retorno,carregando,cache,formulario);
		}
	}else{
		solicitaAjax(url,retorno,carregando,cache,formulario);
	}
}
function ajaxRun(){
    var ajax1 = pegaAjax();
    if(ajax1){
		url = fila[ifila][0];
        ajax1.onreadystatechange = ajaxOnReady
		if(fila[ifila][4] != undefined){ 
			ajax1.open("POST", url, true); 
			ajax1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		} else { 
			ajax1.open("GET", url ,true);
		}
        ajax1.setRequestHeader("Cache-Control", "no-cache");
        ajax1.setRequestHeader("Pragma", "no-cache");
	   if(fila[ifila][4] != undefined) { 
			 ajax1.send(fila[ifila][4]);
		 } else { 
			 ajax1.send(null); 
		 }
    }else{
        return false;
    }
    function ajaxOnReady(){
        if (ajax1.readyState==4){
			if(ajax1.status == 200){
				var data=ajax1.responseText;
				processaRetorno(fila[ifila][0],data, fila[ifila][3]);
			}else{
				if(fila[ifila][2]){
					document.getElementById("carregando").style.display = "none";
					}
				alert(httpStatus(ajax1.status));
				ifila++;
            	if(ifila<fila.length){
					if(fila[ifila+1][2]){
						document.getElementById("carregando").style.display = "block";
					}
					setTimeout("ajaxRun()",20)
				}
			}
			ajax1 = null;
        }
    }
    function pegaAjax(){
        if(typeof(XMLHttpRequest)!='undefined'){return new XMLHttpRequest();}
        var axO=['Microsoft.XMLHTTP','Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
        for(var i=0;i<axO.length;i++){ try{ return new ActiveXObject(axO[i]);}catch(e){} }
        return null;
    }   
	
	function httpStatus(stat){
        switch(stat){
            case 0: return "Erro desconhecido de javascript";
            case 400: return "400: Solicitção incompreensível"; break;
            case 403: case 404: return "404: Não foi encontrada a URL solicitada"; break;
            case 405: return "405: O servidor não suporta o método solicitado"; break;
            case 500: return "500: Erro desconhecido de natureza do servidor"; break;
            case 503: return "503: Capacidade máxima do servidor alcançada"; break;
            default: return "Erro " + stat + ". Mais informações em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"; break;
        }
    }
}

function testarExpresao(expressao,string){
	if(expressao.test(string) != true){
		return false;
	}else{
		return true;
	}
}

// *********************************************************************************************************************
// FUNÇÃO NUMÉRICO
// chama a função: onKeyPress="return funNumerico(event);"
// descrição: Esta função retorna apenas numeros
// *********************************************************************************************************************
function funNumerico(event) {
    if (window.event) {
        key = event.keyCode;
    } // ie
    else if (event.which) {
        key = event.which;
    } // nestcape
    if (key != 8 || key != 13 || key < 48 || key > 57) {
        return (((key > 47) && (key < 58)) || (key == 8) || (key == 13));
        return true;
    }
}

///////////////////////////////////////  FUNÇÃO PARA EXIBIÇÃO DA DIV DE CARTÕES DE CRÉDITO /////////////////////////////
// Autor: Buddy System																							  	  //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function showHideGenerico(Id, Exibir) {
        if ((Exibir == 1) && (document.getElementById(Id).style.display == "none")) {
            document.getElementById(Id).style.display = "";
        }
        else if ((Exibir == 0) && (document.getElementById(Id).style.display == "")) {
            document.getElementById(Id).style.display = "none";
        }
    }

// *********************************************************************************************************************
// FUNÇÃO RETORNA A MENSSAGEM
// chama a função: onKeyPress="return funMascMesAno(event, this);"
// descrição: 
// *********************************************************************************************************************
    function funMascMesAno(event, campo) {
        if (window.event) {
            key = event.keyCode;
        } // ie
        else if (event.which) {
            key = event.which;
        } // nestcape
        if (key != 8 || key != 13 || key < 48 || key > 57) {
            if (campo.value.length == 2) {
                if (campo.value == 00) {
                    alert('Mês inválido!');
                    campo.value = '';
                    return false;
                }
                else if (campo.value > 12) {
                    alert('Mês inválido!');
                    campo.value = '';
                    return false;
                }
                else {
                    campo.value = campo.value + '/'
                } 
            }
            else if (campo.value.length == 4) {
                varData = new Date();
                varMesAtual = varData.getMonth() + 1;
                varMesInformado = campo.value.substr(0, 2);
                varAnoAtual = varData.getFullYear().toString().substr(2, 3);
                varAnoInformado = campo.value.substr(3, 4) + String.fromCharCode(key);
                if (varAnoAtual > varAnoInformado) {
                    alert('Ano inválido!');
                    campo.value = '';
                    return false;
                }
                else if ((varAnoAtual == varAnoInformado) && (varMesAtual > varMesInformado)) {
                    alert('Data vencida!');
                    campo.value = '';
                    return false;
                } 
            }
            return (((key > 47) && (key < 58)) || (key == 8) || (key == 13));
            return true;
        }
    }

    // *********************************************************************************************************************
    // FUNÇÃO RETORNA A MENSSAGEM
    // chama a função: onKeyPress="return funNumerico(event);" onblur="funValCartaoCredito('frmCCVisa.ccNumber');"
    // descrição: valida cartão de crédito, caso seja nessário emite o alerta da bandeira do cartão que passou como verdadeiro
    // *********************************************************************************************************************
    // valida Cartão de Crédito
    function ccValidate(ccNumber) {
        var digits = '';
        var number = ccNumber;
        var digitPosRight = 0;

        for (var ccDigit = 1; ccDigit <= number.length; ccDigit++) {
            digitPosRight++;
            var digitPos = number.length - ccDigit;
            digits = (digitPosRight % 2 == 0)
					    ? ((number.charAt(digitPos) / 1) * 2) + digits
						: number.charAt(digitPos) + digits;
        }

        digitPosRight = 0;

        for (var ccDigit = 0; ccDigit < digits.length; ccDigit++) {
            digitPosRight += (digits.charAt(ccDigit) / 1);
        }

        return ((digitPosRight % 10 == 0) || ((number.length == 15) && ((number.substr(0, 4) == '2014') || (number.substr(0, 4) == '2149'))));
    }

    // procura o tipo do cartão de crédito
    function ccFindType(ccNumber) {
        var arrCCNames = new Array('MasterCard' //	0
											, 'Visa' //	1
											, 'Amex' //	2
											, 'Diners Club' //	3
											, 'Discover' //	4
											, 'enRoute' //	5
											, 'JCB' //	6
											);

        switch (ccNumber.length) {
            case 13: switch (ccNumber.charAt(0)) {
                    case '4': return arrCCNames[1];
                        break;
                }

            case 14: switch (ccNumber.substr(0, 2)) {
                    case '36':
                    case '38': return arrCCNames[3];
                        break;
                }

                switch (ccNumber.substr(0, 3)) {
                    case '300':
                    case '301':
                    case '302':
                    case '303':
                    case '304':
                    case '305': return arrCCNames[3];
                        break;
                }
                break;

            case 15: switch (ccNumber.substr(0, 2)) {
                    case '34':
                    case '37': return arrCCNames[2];
                        break;
                }

                switch (ccNumber.substr(0, 4)) {
                    case '2014':
                    case '2149': return arrCCNames[5];
                        break;
                    case '2131':
                    case '1800': return arrCCNames[6];
                        break;
                }
                break;

            case 16: switch (ccNumber.charAt(0)) {
                    case '3': return arrCCNames[6];
                        break;
                    case '4': return arrCCNames[1];
                        break;
                }

                switch (ccNumber.substr(0, 2)) {
                    case '51':
                    case '52':
                    case '53':
                    case '54':
                    case '55': return arrCCNames[0];
                        break;
                }

                switch (ccNumber.substr(0, 4)) {
                    case '6011': return arrCCNames[4];
                        break;
                }
                break;
        }
        return '';
    }

    function funValCartaoCredito(numeroCartao) {
        if (ccValidate(numeroCartao) != true) {
            return false;
        }
        else {
            return ccFindType(numeroCartao);
        }
    }

    function funValRetCartaoCredito(numeroCartao) {
        if (funValCartaoCredito(numeroCartao) == false) {
            return false;
        }
        else {
            return true;
        }
    }

    // *********************************************************************************************************************
    // FUNÇÃO VALIDA FECHAMENTO
    // chama a função: 
    // descrição: Valida o fechamento da forma de pagamento
    // *********************************************************************************************************************
    function Valida(form) {
        preencheu = false;
        enviar = false;
        campo = eval('document.' + form + '.pagamento');
        botoes = campo.length;

        if (document.frm_pagamento.validadeEndereco.value != 0) {
            alert('Endereço inválido!');
        }
        else {
            for (i = 0; i < botoes; i++) {
                if (campo[i].checked) {
                    if ((campo[i].value == 4) || (campo[i].value == 5) || (campo[i].value == 6) || (campo[i].value == 7)) {
                        if (document.frm_pagamento.nome_comprador_cartao.value == '') {
                            preencheu = true;
                            enviar = false;
                            alert('Nome no cartão, não informado!');
                            document.frm_pagamento.nome_comprador_cartao.focus();
                        }
                        else if (document.frm_pagamento.cartao_numero.value == '') {
                            preencheu = true;
                            enviar = false;
                            alert('Número do cartão, não informado!');
                            document.frm_pagamento.cartao_numero.focus();
                        }
                        else if (funValRetCartaoCredito(document.frm_pagamento.cartao_numero.value) == false) {
                            preencheu = true;
                            enviar = false;
                            alert('Número do cartão, inválido!');
                            document.frm_pagamento.cartao_numero.select();
                        }
                        else if (document.frm_pagamento.cartao_expiracao.value == '') {
                            preencheu = true;
                            enviar = false;
                            alert('Data de expiração do cartão, não informada!');
                            document.frm_pagamento.cartao_expiracao.focus();
                        }
                        else if (document.frm_pagamento.cartao_codigo.value == '') {
                            preencheu = true;
                            enviar = false;
                            alert('Código de segurança do cartão, não informado!');
                            document.frm_pagamento.cartao_codigo.focus();
                        }
                        else {
                            preencheu = true;
                            enviar = true;
                        }
                    }
                    else {
                        preencheu = true;
                        enviar = true;
                    }
                    break;
                }
            }
            if (preencheu) {
                if (enviar) {
                    eval('document.' + form + '.submit()');
                }
            }
            else {
                alert('Forma de pagamento não informada!');
            }
        }
    }