///////////////////////////////////////  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.	//
// 																															//
// 										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;
										}
									}
								}
								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;
}

function AbrePopUp(url, nomedajanela, w, h)
{ 
	var winl = (screen.width - w) / 2;
	var wint = (screen.height - h) / 2 - 50;
	winprops = 'height=' + h + ', width=' + w + ', top=' + wint + ', left=' + winl + ',status=no, scrollbars=no, resizable=yes, menubar=yes'
	 
	win = window.open (url, nomedajanela, winprops);
	if (parseInt(navigator.appVersion) >= 4) { win.window.focus(); }
}


function mod10( cardNumber ) {
	var ar = new Array( cardNumber.length );
	var i = 0,sum = 0;


		for( i = 0; i < cardNumber.length; ++i ) {
			ar[i] = parseInt(cardNumber.charAt(i));
		}
		for( i = ar.length -2; i >= 0; i-=2 ) { 
			ar[i] *= 2;							 
			if( ar[i] > 9 ) ar[i]-=9;			 
		}										


			for( i = 0; i < ar.length; ++i ) {
				sum += ar[i];						 
			}
			return (((sum%10)==0)?true:false);	 	
	}


function expired( month, year ) {
		var now = new Date();							
		var expiresIn = new Date(year,month,0,0,0);		
		expiresIn.setMonth(expiresIn.getMonth()+1);		
		if( now.getTime() < expiresIn.getTime() ) return false;
		return true;									
}


function validateCard(cardNumber,cardMonth,cardYear) {
		if( cardNumber.length == 0 ) {						
			alert("Por Favor, Digite corretamente o número do Cartão de crédito.");
			return false;				
		}
		while ((cardNumber.search(" ") != -1) || (cardNumber.search("-") != -1) || (cardNumber.search("/") != -1))
		{
			cardNumber = cardNumber.replace(" ","");
			cardNumber = cardNumber.replace("-","");
			cardNumber = cardNumber.replace("/","");						
		}

	
		for( var i = 0; i < cardNumber.length; ++i ) {		
			var c = cardNumber.charAt(i);


				if( c < '0' || c > '9' ) {
					alert("Por Favor, digite um número válido de Cartão de Crédito.");
					return false;
				}
			}
			
			var length = cardNumber.length;			

		   cardType = "UNKNOWN";
	
		   if ( length == 15 && cardNumber.substr(0, 1) == '3' )                 	{ cardType = "amex"; }
		   if ( length == 16 && cardNumber.substr(0, 4) == '6011' )              	{ cardType = "discover"; }
		   if ( length == 16 && cardNumber.substr(0, 1) == '5'  )                	{ cardType = "mc"; }
		   if ( (length == 16 || length == 13) && cardNumber.substr(0, 1) == '4' ) { cardType = "visa"; }
	
	
				switch( cardType ) {
					case 'amex':


							if( length != 15 ) {
								alert("Entre o número correto do seu Cartão Amercian Express Card.");
								return;
							}
							var prefix = parseInt( cardNumber.substring(0,2));


								if( prefix != 34 && prefix != 37 ) {
									alert("Entre o número correto do seu Cartão Amercian Express Card.");
									return;
								}
								break;
								
					case 'discover':
					
						
						if( length != 16 ) {
							alert("Entre o número correto do seu Cartão Discover Card.");
							return;
						}
						var prefix = parseInt( cardNumber.substring(0,4));
						
						
						if( prefix != 6011 ) {
							alert("Entre o número correto do seu Cartão Discover Card.");
							return;
						}
						break;
						
					case 'mc':
					
					
						if( length != 16 ) {
							alert("Entre o número correto do seu Cartão MasterCard.");
							return;
						}
						var prefix = parseInt( cardNumber.substring(0,2));
					
					
						if( prefix < 51 || prefix > 55) {
							alert("Entre o número correto do seu Cartão MasterCard.");
							return;
						}
						break;
						
					case 'visa':
					
						if( length != 16 && length != 13 ) {
							alert("Entre o número correto do seu Cartão Visa.");
							return;
						}
						var prefix = parseInt( cardNumber.substring(0,1));
					
					
						if( prefix != 4 ) {
							alert("Entre o número correto do seu Cartão Visa.");
							return;
						}
						break;
					}
					
					if( !mod10( cardNumber ) ) { 		
						alert("Desculpe! Esse não é um número de Cartão de Crédito válido.");
						return false;
					}
					
					if( expired( cardMonth, cardYear ) ) {							
						alert("Desculpe! A data que você digitou torna este Cartão de Crédito inválido.");
						return false;
		}
		return true; 
}	

function testarExpresao(expressao,string){
	if(expressao.test(string) != true){
		return false;
	}else{
		return true;
	}
}
function retorna(inicioMensagem,objeto,mensagemFim){
	alert(inicioMensagem + " não parece estar correto." + mensagemFim);
	objeto.focus();
}

// Esta função serve para dar um focus automático no primeiro campo de texto ou senha do formulário quando a página é carregada. O focus acontece no onload, portanto deve ser setada assim:
// <body onload="focusForm('idDoFormulario');">, sendo que idDoFormulario é realmente o id do form que queremos que dê focus.
function focusForm(qualForm){
	var nomeForm = document.getElementById(qualForm);
	var i = 0;
	for(i=0; i < nomeForm.elements.length; i++){
		if(nomeForm.elements[i].type=="text" || nomeForm.elements[i].type=="password"){
			nomeForm.elements[i].focus();
			break;
		}
	}
}

///////////////////////////////   		HABILITA / DESABILITA CAMPOS /////////////////////
//
// campos separados por , --> acao = true ou false.
function habilita(campos,acao){
	var temparr = [];
	var temp;
	temparr = campos.split(",");
	if(temparr.length == 0){
		alert("Atenção\n\nNão foi informado nenhum campo para habilitar/desabilitar.\n\nContate o administrador do sistema.");
		return false;
	}
	if(acao == true){
		for(i=0;i<temparr.length;i++){
				temp = document.getElementById(temparr[i]);
				if(temp == undefined || temp == ""){
					alert("Atenção\n\nNão foi encontrado o elemento " + temp + ".\n\nContate o administrador do sistema.");
					return false;
				}else{
					temp.disabled = false;
				}
		}
	}else{
		for(i=0;i<temparr.length;i++){
				temp = document.getElementById(temparr[i]);
				if(temp == undefined || temp == ""){
					alert("Atenção\n\nNão foi encontrado o elemento " + temp + ".\n\nContate o administrador do sistema.");
					return false;
				}else{
					temp.disabled = true;
				}
		}
	}
}

///////////////////////////////   Muda a cor da linha da tabela ///////////////////////////
// Cor quando o Mouse estiver sobre a linha
// onMouseOver="MouseOver(this,'#000000');"
// onMouseOut="MouseOut(this);"
//
////////////////////////////////////////////////////////////////////////////////////////////

function MouseOver(src) {
	if (!src.contains(event.fromElement)){
			src.style.cursor = 'hand';
			src.bgColor = "#000000";
		}
	}

function MouseOut(src){
	if (!src.contains(event.toElement)){
		src.style.cursor = 'default';
		src.bgColor = "";
	}
}

///////////////////////////////   fim Muda a cor da linha da tabela ////////////////////////

///////////////////////////////////////  AJAX //////////////////////////////////////////////////////
///////////////////////////////////////  AJAX //////////////////////////////////////////////////////
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," "));
	//if(document.getElementById("carregando")) document.getElementById("carregando").style.display = "none";
	carrega('fim');
	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;
		}
	}
	
	if(temscript){setTimeout("executaRetorno()",20);}
	ifila++;
	if(ifila<fila.length){
		if(fila[ifila][2]){
			//document.getElementById("carregando").style.display = "block";
			carrega();
		}
		setTimeout("ajaxRun()",20)
	}
}
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 = ""; 
				var strFin = "";
				var tipo = e.type.toLowerCase();
				
				if(tipo=="select-multiple"){
					for(j=0; j<e.length; j++){
						if(e.options[j].selected){
							strFin = strFin + e.options[j].value+",";
						}
					}
					strFin = strFin.substr(0,strFin.length-1)
				}else{
					strFin = e.value
				}

				/*
				for(var x = 0; x < strFin.length; x++) { 
					 codeA = strFin.charCodeAt(x); 
					 codeA = DecHex(codeA); 
					 nVal += "%" + codeA; 
				}
				*/
				 
				nVal = escape(strFin);
  
				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";
			//carrega();
			setTimeout("carrega()",500);
		}
		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 ajax(funcao,retorno,carregando,cache,formulario,parametros){
	if(parametros != ""){
		url = ajaxFuncoes(funcao) + "&" + parametros;
	}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";
					carrega('fim');
					}
				alert(httpStatus(ajax1.status));
				ifila++;
            	if(ifila<fila.length){
					if(fila[ifila+1][2]){
						//document.getElementById("carregando").style.display = "block";
						carrega();
					}
					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 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 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;
        }
    }
}




///////////////////////////////   Painel Rotativo   ////////////////////////////////////////

/*
Painel rotativo com imagens e textos
*/

function delItem(arr,item){
	for(;item<arr.length;item++) arr[item]=arr[item + 1];
	arr.length=arr.length-1;
} 
function goURL(){
	(Item[atual][3].indexOf('_blank')!=-1) ? window.open(Item[atual][3].substring(0,Item[atual][3].indexOf(' '))) : location.href=Item[atual][3];
} 
function startSlide(){ 
	loadImages();
	if(!paused) timeoutId=setTimeout('changeImg(1)',7000);
} 
function initialize(){
	timeoutId=0;
	textareaContent=document.getElementById('select_cr').innerHTML.split(/[$%$%$]/i);
	Item = new Array();
	for(x=0,y=0;x<textareaContent.length;x++){ 
		if(textareaContent[x].length>30) Item[y++]=textareaContent[x].split('|');
	}
	for(i=Item.length-1;i>=0;i--){
		Item[i][0]=Item[i][0].replace(/([ \n\t\r])+/, " ");
		if(Item[i][1].length<3||Item[i][3].length<3||Item[i][2].length<3||Item[i][0].length<2) delItem(Item,i);
	}
	if(Item.length==1) document.write('<style>#anterior,#proximo,#pause{visibility:hidden;}</style>');
	atual = Math.random().toString().substring(2,6) % Item.length;
} 
function startPanel(){
	usaCredito = '';
	initialize();
	if(arguments.length>0){
		if(!isNaN(arguments[0])) atual = arguments[0];
	}
	if(paused) {imgpause='on'; altpause='alt="Ligar" title="Ligar"';}
	else {imgpause='off'; altpause='alt="Parar" title="Parar"';}
	document.write('<div id="to-blend"><a href="javascript:goURL()"><img src='+Item[atual][1]+' id="imgslide" name="img1" border="0" title="'+Item[atual][0]+'" alt="'+Item[atual][0]+'"></a></div>');
} 
function pauseSlide(){
	if(paused){
		document.getElementById('pause').src='imagens/botao-pause1-off.gif';
		document.getElementById('pause').title='Parar'; document.getElementById('pause').alt = 'Parar';
		document.cookie="homepause=0;domain=.agenciadmk.com.br;expires=Thu, 2 Aug 1970 20:47:11 UTC;"; 		
		paused=false;
		startSlide();
	}else{
		clearTimeout(timeoutId);
		document.cookie="homepause=1;domain=.agenciadmk.com.br;expires=Thu, 2 Aug 2222 20:47:11 UTC;"; 	
		document.getElementById('pause').src='imagens/botao-pause1-on.gif';
		document.getElementById('pause').title='Ligar'; document.getElementById('pause').alt = 'Ligar';
		paused = true;
	}
}
var okToGo=false;
var paused=(document.cookie.indexOf('homepause=1')!=-1) ? true : false;

// painel rotativo //
function changeOpac(opacity){
	var obj = document.getElementById('to-blend').style;
	obj.opacity=(opacity/101);
	obj.MozOpacity=(opacity/101);
	obj.KhtmlOpacity=(opacity/101);
} 
function blend(imagefile){
	var speed=7;
	var timer=0;
	for(i=100;i>0;i-=2) setTimeout('changeOpac('+i+')', timer++ * speed);
	setTimeout('changeContent()', timer * speed);
	for(i=0;i<=100;i+=2) setTimeout('changeOpac('+i+')', timer++ * speed);
} 
function changeImg(id){
	clearTimeout(timeoutId);
	atual+=parseInt(id);
	if(atual>Item.length-1) atual=0;
	if(atual<0) atual=Item.length-1;
	
	if(imgDsp[atual].complete==false){
		atual--;
		timeoutId = setTimeout('changeImg('+id+')',500);
		return;
	} 
	if(document.all && navigator.userAgent.indexOf('Opera')==-1){
		try {
			oDiv = document.getElementById('to-blend');
			oDiv.style.filter="blendTrans(duration=0.7)";
			oDiv.filters.blendTrans.apply();
			oDiv.filters.blendTrans.play();
			changeContent();
		} 
		catch(e) { changeContent(); }
	} else { 
		blend(); 
	}

	if(!paused) timeoutId=setTimeout('changeImg(1)',7000);
} 
function loadImages(){
	imgDsp = new Array();
	for(n=0;n<Item.length;n++){
		imgDsp[n]=new Image();
		imgDsp[n].src=Item[n][1];
		}
	okToGo = true;
} 
function changeContent(){
	document.img1.src=imgDsp[atual].src;
	document.img1.alt=document.img1.title=Item[atual][0];
//	document.getElementById('txt1').innerHTML=Item[atual][2];
//	if(usaCredito!='') document.getElementById('credito').innerHTML=Item[atual][0];
}





/* Atualiza data e/ou Finaliza sessão*/
function atualizabd(id){
	ajax('atualiza_data','',false,false,'','id='+id);
	setTimeout("atualizabd("+id+");",30000);
}
function finaliza(){
    ajax('finaliza_sessao','',false,false,'','');
} 
/* fim */


/* Insere e remove linhas de uma tabela*/
function insereLinha(tabela,pos,colspan) {
	if(document.getElementById('traberta') != null) document.getElementById(tabela).tBodies[0].deleteRow(document.getElementById('traberta').rowIndex-1);
	var linha = document.getElementById(tabela).tBodies[0].insertRow(pos);
	linha.setAttribute('id', 'traberta');
	var coluna = linha.insertCell(0);
	coluna.setAttribute('id', 'td'+pos);
	
	if (document.all) {
		coluna.colSpan = colspan;
	} else {
		coluna.setAttribute('colspan', colspan);
	}

}
function removeLinha(tabela,pos) {
	document.getElementById(tabela).tBodies[0].deleteRow(document.getElementById('traberta').rowIndex-1);
}
/* fim */




function verificar(nome,quantidade,tipo) {  
	var cks = '';
	for (i = 0; i <= quantidade; i++) {  
		checkBox = document.getElementById( nome + (i) );  
		if ( checkBox.checked ) {
			cks = cks + checkBox.value + ', ';
		}
	}
	cks = cks.substring(0,(cks.length)-2);
	if(tipo == "motor") {
		ajax('executa_busca_motores','conteudo_busca',true,false,'','filtrar=ok&ck='+cks);
	}else if(tipo == 'transmissao'){
		ajax('executa_busca_transmissoes','conteudo_busca',true,false,'','filtrar=ok&ck='+cks);
	}else{
		ajax('executa_busca_frota','conteudo_busca',true,false,'','filtrar=ok&ck='+cks);
	}
}





