	//////////////////////////////////// DESCRIÇÃO ///////////////////////////////////
	//										//
	//  Biblioteca para varredura e validação automática de campos de formulários.  //
	//  E mais algumas funções.                                                     //
	//										//
	//////////////////////////////////////////////////////////////////////////////////
	
	////////////////////////////// FORMA DE UTILIZAÇÃO ///////////////////////////////
	//										//
	// Existem dois tipos de vallidação: a tipagem do campo e a sua obrigatoriedade	//
	// Para validar a tipagem, deve-se colocar no objeto do formulário o atributo   //
	// tipo="", sendo que entre as aspas deve-se colocar o tipo conforme a lista:	//
	//										//
	// 1  - email    ---> Valida e-mail.                                           //
	// 2  - inteiro   ---> Aceita somente valores inteiros positivos ou negativos.  //
	// 3  - decimal   ---> Aceita números decimais, positivos ou negativos, com     //
	//                     pelo menos 1 casa decimal.                               //
	// 4  - moeda     ---> Aceita números decimais, positivos ou negativos, com     //
	//                     pelo menos 1 casa decimal.                               //
	// 5  - cep       ---> Valida CEP.                                              //
	// 6  - data      ---> Valida data no formato brasileiro.                       //
	// 7  - hora      ---> Valida hora no formato 12 ou 24 horas.                   //
	// 8  - cpf       ---> Valida CPF.                                              //
	// 9  - cnpj      ---> Valida CNPJ.                                             //
	// 10 - url       ---> Valida url com ou sem o http e o www.                    //
	// 11 - telefone  ---> Valida telefone com todos os tipos de entrada.           //
	// 12 - ddg       ---> Valida números de telefone 0800.                         //
	// 13 - rg        ---> Valida RG.                                               //
	// 14 - cartao    ---> Valida cartão de crédito (amex, visa e master).          //
	//										//
	// Para validar a obrigatoriedade, deve-se colocar no objeto do formulário o    //
	// atributo obrigatorio="", sendo que entre as aspas deve-se colocar            //
	// a obrigatoriedade conforme a lista:                                          //
	//										//
	// 1 - naovazio ---> Se não puder ficar vazio.                                  //
	// 2 - depende  ---> Utiliza o atributo complemento da sequinte forma:          //
	//                   complemento="campo1,campo2", sendo que caso o campo1 ou o  //
	//                   campo2 forem selecionados ou checados, ou != de vazio, o   //
	//                   campo em questão torna-se obrigatório. O complemento deve  //
	//                   ser o ID do campo e não o nome dele.                       //
	// 3 - umdos    ---> Utiliza o atributo complemento da sequinte forma:          //
	//                   complemento="campo1,campo2", sendo que só pode ser         //
	//                   preenchido um dos campos que constam em complemento ou o   //
	//                   próprio campo em questão. O complemento deve ser o ID do   //
	//                   campo e não o nome dele.                                   //
	// 4 - iguala   ---> Utiliza o atributo complemento da sequinte forma:          //
	//                   complemento="campo1,campo2", sendo que: se for textfield,  //
	//                   senha, textarea ou radio, o complemento deve ser o texto   //
	//                   do valor do campo ou o ID do campo que deve ser igual ele. //
	// 5 - maiorque ---> Utiliza o atributo complemento da sequinte forma:          //
	//                   complemento="xx", sendo que complemento é o número mínimo  //
	//                   de dígitos que o campo deve ter.                           //
	// 6 - menorque ---> Utiliza o atributo complemento da sequinte forma:          //
	//                   complemento="xx", sendo que complemento é o número máximo  //
	//                   de dígitos que o campo deve ter.                           //
	// 7 - igual    ---> Utiliza o atributo complemento da sequinte forma:          //
	//                   complemento="xx", sendo que complemento é o número de      //
	//                   dígitos que o campo deve ter.                              //
	//										//
	// Se for checkbox ou select multiplo, deve-se colocar o intervalo de seleção   //
	// mínima e máxima desta forma: complemento="1,4"                               //
	//										//
	//////////////////////////////////////////////////////////////////////////////////

	///////////////////////// FORMA DE UTILIZAÇÃO - FUNÇÕES //////////////////////////
	//										//
	//////////////////// ABRE UMA JANELA POP-UP NO CENTRO DA TELA ////////////////////
	// abrePop(pPagina,pLargura,pAltura,pScroll,pResize,pMenuBar,pStatus,pClose):   //
	// pPagina   ---> URL da página que irá abrir na popup.                         //
	// pLargura  ---> Largura da janela.                                            //
	// pAltura   ---> Altura da Janela.                                             //
	// pScroll   ---> Scrollbars: yes ou no.                                        //
	// pResize   ---> Resizable: yes ou no.                                         //
	// pMenuBar  ---> MenuBar: yes ou no.                                           //
	// pStatus   ---> Status: yes ou no.                                            //
	// pClose    ---> Fechar ao fechar a janela principal: yes ou no.               //
	//										//
	////////////////////// DA FOCO NO PRIMEIRO CAMPO DE UM FORM //////////////////////
	// focusForm(qualForm):                                                         //
	// qualForm  ---> ID do form que queremos que dê focus.                         //
	// Ex.: <body onload="focusForm('idDoFormulario');">                            //
	//										//
	///////////////////// ADICIONA MASKARA DE INSERÇÃO À UM CAMPO ////////////////////
	// maskedit(eve,obj,str,'',''):                                                 //
	// eve       ---> Sempre event.                                                 //
	// obj       ---> Objeto, neste caso this.                                      //
	// str       ---> Tipo de Teclas aceitas.                                       //
	//                TIPOS: letrasmai, letrasmin, numeros, emails, telefones.      //
	// Ex.: <input onkeypress="return maskedit(event,this,numeros,'','');">         //
	// No exemplo acima o campo aceitaria somente números                           //
	//										//
	//////////////////////////////////////////////////////////////////////////////////


var letrasmai = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var letrasmin = "abcdefghijklmnopqrstuvwxyz";
var numeros   = "0123456789";
var emails    = letrasmin+"-_.@"+numeros;
var telefones = "()-x "+numeros;
var agt = navigator.userAgent.toLowerCase();
var is_ie	    = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_opera  = (agt.indexOf("opera") != -1);
var is_mac    = (agt.indexOf("mac") != -1);
var is_mac_ie = (is_ie && is_mac);
var is_win_ie = (is_ie && !is_mac);
var is_gecko  = (navigator.product == "Gecko");


function abrePop(pPagina,pLargura,pAltura,pScroll,pResize,pMenuBar,pStatus,pClose){
	var name = pPagina.substr(pPagina.lastIndexOf("/")+1,pPagina.lastIndexOf(".")-pPagina.lastIndexOf("/")-1);
	var posX = (window.screen.width - pLargura - 16) / 2;
	var posY = (window.screen.height - pAltura) / 2;
	var win = window.open(pPagina,"name","width=" + pLargura + ",height=" + pAltura + ",top=" + posY + ",left=" + posX + ",scrollbars=" + pScroll + ",resizable=" + pResize + ",menubar=" + pMenuBar + ",status=" + pStatus + "");
	if(win){
		win.focus();
		if (pClose){
			if (is_ie){
				attachEvent("onunload", function(){closePop(win)});
			} else {
				addEventListener("unload", function(){closePop(win)}, true);
			}
		}
	}
}

function closePop(obj){
	if(!isnull(obj))
	if(!obj.closed)
	obj.close();
	return true;
}

function testaMascara(obj,str,strone,mask,mykey){
	if (obj.readOnly) return false;
	if (document.selection){
		document.selection.createRange().text = "";
	}else if (obj.selectionStart || obj.selectionStart == "0"){
		var selectionStart = obj.selectionStart;
		var selectionEnd = obj.selectionEnd;
		obj.value = obj.value.substring(0, selectionStart) + obj.value.substring(selectionEnd);
		obj.setSelectionRange(selectionStart, selectionStart);
	}

	if (mykey == mask.charAt(obj.value.length) && mykey != " " && mykey != "%") return true;
	if ((str+strone)!="" && (str+strone).indexOf(mykey) ==-1) return false;
	if (strone!="" && obj.value.indexOf(mykey)!=-1 && strone.indexOf(mykey)!=-1) return false;

	if(mask.charAt(0)=="%"){
		var mylength=0;
		var i=mask.length;
		while(i>0 && mylength==0){
			i--;
			if(obj.value.lastIndexOf(mask.charAt(i))!=-1) mylength=i;
		}
		obj.value=obj.value.substr(0,obj.value.length-mylength)+mykey+mask.substr(1,mask.length);
		return false;
	}

	if(mask.charAt(mask.length-1)=="%"){
		if(obj.value=="") obj.value=mask.substr(0,mask.indexOf("%"));
		return true;
	}

	var tam=obj.value.length;
	while (mask.charAt(tam) && mask.charAt(tam)!=" " && tam<=mask.length){
		if(mask.charAt(tam)!=" ") obj.value+=mask.charAt(tam);
		tam++;
	}

	if(mask.substr(tam+1,mask.length-tam).indexOf(" ")==-1 && tam<mask.length && mask.length-tam!=1){
		obj.value+=mykey+mask.substr(tam+1,mask.length-tam);
		return false;
	}

	if(obj.value.length<mask.length || mask.length==0) return true;
	if(obj.value.length>mask.length) obj.value=obj.value.substr(0,mask.length);
	return false;
}

function maskedit(eve,obj,str,strone,mask){
	var codesIE = new Array(8,9,13);
	var codesMZ = new Array(8,9,13,33,35,36,37,38,39,40,46,112,113,114,115,116,117,118,119,120,121,122,123);
	if (!eve) eve = window.event;
	var code;
	var li;
	if (is_gecko){
		code = eve.keyCode;
		for (li=0; li<codesMZ.length; li++) if(code == codesMZ[li]) return true;
		code = eve.charCode;
	}else{
		code = eve.keyCode ? eve.keyCode : eve.which ? eve.which : void 0;
		for (li=0; li<codesIE.length; li++) if(code == codesIE[li]) return true;
	}
	return testaMascara(obj,str,strone,mask,String.fromCharCode(code));
}

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;
		}
	}
}

function validaForm(qualForm){
	var objeto = "";
	var complemento = "";
	var nomedocampo = "";
	var inicioMensagem = "";
	var mensagemFim = "";
	var numeroElementos = qualForm.elements.length;
	var valor = "";
	var expressao = "";
	var x = 0;
	var i = 0;
	var z = 0;
	var soma = 0;
	var resto = 0;
	var temp = "";
	var temp2 = "";
	var temparr = [];

	for(x=0; x<numeroElementos; x++){
		
		objeto = qualForm.elements[x];
		valor = objeto.value;
		mensagemFim = "";
		
		if(valor.length > 1){
			if(valor.charCodeAt(0) == '32'){
				i = 0;
				while (valor.charCodeAt(0) == '32'){
					valor = valor.substring(i,valor.length);
					i++;
				}
				objeto.value = valor;
			}
			if(valor.charCodeAt(valor.length-1) == "32"){
				while(valor.charCodeAt(valor.length-1) == "32"){
					valor = valor.substring(0,valor.length-1);
				}
				objeto.value = valor;
			}
		}
		
		if(objeto.getAttribute("tipo") != undefined || objeto.getAttribute("obrigatorio") != undefined){
			nomedocampo = objeto.name;
			if(nomedocampo == undefined || nomedocampo == ""){
				alert("Atenção\n\nNão foi possivel resgatar o nome do campo " + x + ".\n\nPor favor, contate o administrador do sistema informando esta mensagem.");
				objeto.focus();
				return false;
			}
			
			inicioMensagem = "Atenção\n\nO campo " + nomedocampo;
			
			if(objeto.disabled == false){
				if((objeto.getAttribute("obrigatorio") != undefined && objeto.getAttribute("obrigatorio") != "") || (objeto.getAttribute("obrigatório") != undefined && objeto.getAttribute("obrigatório") != "")){
					switch (objeto.getAttribute("obrigatorio").toLowerCase()){
						case "naovazio":
							if(valor == ""){
								alert(inicioMensagem + " não pode ficar em branco.");
								objeto.focus();
								return false;
							}
						break;
						
						case "depende":
							if(objeto.value == ""){
								if(objeto.getAttribute("complemento") == undefined || objeto.getAttribute("complemento") == ""){
									alert(inicioMensagem + " não possui um complemento de verificação válido.\n\nContate o administrador do sistema.");
									objeto.focus();
									return false;
								}else{
									complemento = objeto.getAttribute("complemento");
									temparr = complemento.split(",");
									for(i = 0; i < temparr.length; i++){
										temp = document.getElementById(temparr[i]);
										if(temp == undefined){
											alert("Atenção\n\nO campo " + nomedocampo + " está vinculado com o campo " + temparr[i] + ", que é inexistente.\n\nContate o administrador do sistema.");
											objeto.focus();
											return false;
										}else{
											if(temp.value != ""){
												switch (temp.type){
													case "checkbox":
														if(temp.checked){
															alert(inicioMensagem + " não pode ficar em branco.");
															objeto.focus();
															return false;
														}
													break;
													case "radio":
														if(temp.checked){
															alert(inicioMensagem + " não pode ficar em branco.");
															objeto.focus();
															return false;
														}
													break;
													case "text":
														alert(inicioMensagem + " não pode ficar em branco.");
														objeto.focus();
														return false;
													break;
													case "password":
														alert(inicioMensagem + " não pode ficar em branco.");
														objeto.focus();
														return false;
													break;
													case "textarea":
														alert(inicioMensagem + " não pode ficar em branco.");
														objeto.focus();
														return false;
													break;
												}
											} 
										}	
									}
								}
							}
						break;
						
						case "umdos":
							if(objeto.getAttribute("depende") == undefined || objeto.getAttribute("depende") == ""){
								alert(inicioMensagem + " não possui um complemento de verificação (depende) válido.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}
							complemento = objeto.getAttribute("depende");
							temparr = complemento.split(",");
							
							if (objeto.value != ""){
								temp2 = 1;
							}
							else{
								temp2 = 0;
							}
							for(i = 0; i < temparr.length; i++){
								temp = document.getElementById(temparr[i]);
								if(temp == undefined){
									alert("Atenção\n\nO campo " + nomedocampo + " está vinculado com o campo " + temparr[i] + ", que é inexistente.\n\nContate o administrador do sistema.");
									objeto.focus();
									return false;
								}else{
									if (temp.value != ""){
										temp2 += 1;
										if (temp2 > 1){
											alert("Você deve preencher apenas um dos campos: "+ objeto.name + ", " + complemento);
											objeto.focus();
											return false;
											break;
										}
									}
								}
							}
							if (temp2 == 0){
								alert("Você deve preencher apenas um dos campos: "+ objeto.name + ", " + complemento);
								objeto.focus();
								return false;
								break;
							}
							
						break;
	
						case "iguala":
							if(objeto.getAttribute("complemento") == undefined || objeto.getAttribute("complemento") == ""){
								alert(inicioMensagem + " não possui um complemento de verificação (complemento) válido.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}else{
								complemento = objeto.getAttribute("complemento");
								switch (objeto.type){
									case "checkbox":
										temp = 0;
										temparr = complemento.split(",");
										for(z=0; z<numeroElementos; z++){
											if(qualForm.elements[z].name == objeto.name && qualForm.elements[z].type == "checkbox"){
												if(qualForm.elements[z].checked == true){
													temp += 1;
													if(temparr[1].value != ""){
														if(temp > temparr[1]){
															alert(inicioMensagem + " não foi devidamente preenchido.\n\nVocê deve selecionar no máximo " + temparr[1] + " opções.");
															objeto.focus();
															return false;
															break;
														}
													}
												}
											}
										}
										if(temp < temparr[0]){
											if(temparr[0] > 1){
												alert(inicioMensagem + " não foi devidamente preenchido.\n\nVocê deve selecionar pelo menos " + temparr[0] + " opções.");
											}else{
												alert(inicioMensagem + " não foi devidamente preenchido.\n\nVocê deve selecionar pelo menos " + temparr[0] + " opção.");
											}
											objeto.focus();
											return false;
											break;
										}
									break;
									case "text":
									case "password":
									case "textarea":
										if(document.getElementById(complemento) != undefined){
											if(document.getElementById(complemento).value != objeto.value){
												alert(inicioMensagem + " deve ser preenchido com o mesmo valor do campo " + document.getElementById(complemento).name + ".");
												objeto.focus();
												return false;
											} 
										}else{
											if(objeto.value != complemento){
												alert(inicioMensagem + " deve ser preenchido com o valor: '" + complemento + "'.");
												objeto.focus();
												return false;
											}
										}
									break;
								}
							}
						break;

						case "maiorque":
							if(objeto.getAttribute("complemento") == undefined || objeto.getAttribute("complemento") == "" || objeto.getAttribute("complemento") == "0"){
								alert(inicioMensagem + " não possui um complemento de verificação (complemento) válido.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}else{
								complemento = objeto.getAttribute("complemento");
								switch (objeto.type){
									case "text":
									case "password":
									case "textarea":
										if(objeto.value.lenght < complemento){
											alert(inicioMensagem + " deve ter no mínimo " + complemento + " dígitos.");
											objeto.focus();
											return false;
										} 
									break;
								}
							}
						break;

						case "menorque":
							if(objeto.getAttribute("complemento") == undefined || objeto.getAttribute("complemento") == "" || objeto.getAttribute("complemento") == "0"){
								alert(inicioMensagem + " não possui um complemento de verificação (complemento) válido.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}else{
								complemento = objeto.getAttribute("complemento");
								switch (objeto.type){
									case "text":
									case "password":
									case "textarea":
										if(objeto.value.lenght > complemento){
											alert(inicioMensagem + " deve ter no máximo " + complemento + " dígitos.");
											objeto.focus();
											return false;
										} 
									break;
								}
							}
						break;

						case "igual":
							if(objeto.getAttribute("complemento") == undefined || objeto.getAttribute("complemento") == "" || objeto.getAttribute("complemento") == "0"){
								alert(inicioMensagem + " não possui um complemento de verificação (complemento) válido.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}else{
								complemento = objeto.getAttribute("complemento");
								switch (objeto.type){
									case "text":
									case "password":
									case "textarea":
										if(objeto.value.lenght = complemento){
											alert(inicioMensagem + " deve ter exatamente " + complemento + " dígitos.");
											objeto.focus();
											return false;
										} 
									break;
								}
							}
						break;
					}
				}
				
				
				if(objeto.getAttribute("tipo") != undefined && objeto.getAttribute("tipo") != "" && valor != ""){
					switch (objeto.getAttribute("tipo").toLowerCase()){
						case "email":
							expressao = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "inteiro":
							expressao = /^[+-]?[ ]?\d+$/;
							if(testarExpresao(expressao,valor) == false){
								mensagemFim = "\n\nPreencha-o apenas com números inteiros positivos ou negativos";
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "decimal":
							expressao = /^[+-]?[ ]?\d{1,3}(\.?\d{3})*,\d+$/;
							if(testarExpresao(expressao,valor) == false){
								mensagemFim = "\n\nPreencha-o apenas com números inteiros positivos ou negativos, pontos (para separar milhar) e vírgula (para determinar decimal)";
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "moeda":
							expressao = /^[+-]?[ ]?\d{1,3}(\.?\d{3})*,\d{2}$/;
							if(testarExpresao(expressao,valor) == false){
								mensagemFim = "\n\nPreencha-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(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "cep":
							expressao = /^\d{5}[- .]?\d{3}$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
							if(parseInt(valor.substring(0,5),10) < 1000){
								mensagemFim = "\n\nO CEP digitado não existe.";
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;						
							}
						break;
						
						case "data":
							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(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
							var ano = valor.split("/");
							if(ano[0] == 29 && ano[1] == 2){
								if (ano[2]%4 == 0 && !(ano[2]%100 == 0 && ano[2]%400 != 0)){ 
								}else{
									retorna(inicioMensagem,objeto,mensagemFim);
									return false;
								}   
							}
						break;
						
						case "hora":
							expressao = /^(((0?[1-9]|[1][0-2])(([hH] ?|:)| ([hH]|:) )(0?[0-9]|[1-5]\d) ?(([mM]|(min)|(MIN)|(Min)) )?(AM|PM|Am|Pm|am|pm)))|(((0?[0-9])|1[0-9]|2[0-3])(([hH] ?|:)| ([hH]|:) )(0?[0-9]|[1-5]\d) ?([mM]|(min)|(MIN)|(Min))?)$/;
							if(testarExpresao(expressao,valor) == false){
								mensagemFim = "\n\nPreencha-o no formato hh:mm";
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "cpf":
							expressao = /^(\d{3}[. -]?){3}\d{2}$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
							
							i = 0;
							for(i=0;i<valor.length;i++)
							{
								temp = valor.substring(i,i+1);
								if(temp == "." || temp == "-" || temp == " ")
								{
									valor = valor.substring(0,i) + valor.substring(i+1,valor.length);
									objeto.value = valor;
								}
							}
	
							if (valor.length != 11 || valor == "00000000000" || valor == "11111111111" || valor == "22222222222" ||	valor == "33333333333" || valor == "44444444444" || valor == "55555555555" || valor == "66666666666" || valor == "77777777777" || valor == "88888888888" || valor == "99999999999"){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
							soma = 0;
							for (i=0; i < 9; i ++){
								soma += parseInt(valor.charAt(i)) * (10 - i);
							}
							resto = 11 - (soma % 11);
							if (resto == 10 || resto == 11){resto = 0;}
							if (resto != parseInt(valor.charAt(9))){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
							soma = 0;
							for (i = 0; i < 10; i ++){soma += parseInt(valor.charAt(i)) * (11 - i);}
							resto = 11 - (soma % 11);
							if (resto == 10 || resto == 11){resto = 0;}
							if (resto != parseInt(valor.charAt(10))){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "cnpj":
							expressao = /^\d{2}[. -]?\d{3}[. -]?\d{3}[. - \/]?\d{4}[. -]?\d{2}$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
							i = 0;
							for(i=0;i<valor.length;i++){
								temp = valor.substring(i,i+1);
								if(temp == "." || temp == "-" || temp == " " || temp == "/"){
									valor = valor.substring(0,i) + valor.substring(i+1,valor.length);
									objeto.value = valor;
								}
							}
							var numeros, digitos, soma, resultado, pos, tamanho, digitos_iguais;
							digitos_iguais = 1;
							for (i = 0; i < 14; i++){
								if (valor.charAt(i) != valor.charAt(i + 1)){
									digitos_iguais = 0;
									break;
								}
							}
							if (!digitos_iguais){
								tamanho = valor.length - 2;
								numeros = valor.substring(0,tamanho);
								digitos = valor.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(inicioMensagem,objeto,mensagemFim);
									return false;	
								}
								tamanho = tamanho + 1;
								numeros = valor.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(inicioMensagem,objeto,mensagemFim);
									return false;
								}
							}else{
								retorna(inicioMensagem,objeto,mensagemFim);
								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(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "ddg":
							expressao = /^0800[ -.]?\d{3}[ -.]?\d{4}$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "rg":
							expressao = /^\d{2}[\. -]?\d{3}[\. -]?\d{3}([\. -]?(\d|x|X))?$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
						
						case "telefone":
							//expressao = /^((\(0?(..)?[0-9]{2}\) )|(\+\d{2}[ -])?(0?(..)?[0-9]{2})[- ])?[0-9]{3,4}[- \.]?[0-9]{4}$/;
							if(testarExpresao(expressao,valor) == false){
								retorna(inicioMensagem,objeto,mensagemFim);
								return false;
							}
						break;
	
						case "cartao":
							tempMes = objeto.getAttribute("mes");
							tempAno = objeto.getAttribute("ano");
							if(tempMes == undefined || tempMes == ""){
								alert(inicioMensagem + " não possui o campo de mês para verificação.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}else{
							if(tempAno == undefined || tempAno == ""){
								alert(inicioMensagem + " não possui o campo de ano para verificação.\n\nContate o administrador do sistema.");
								objeto.focus();
								return false;
							}else{
								tempMes = document.getElementById(tempMes).value;
								tempAno = document.getElementById(tempAno).value;
								if(tempMes == undefined || tempMes == ""){
									alert(inicioMensagem + "/Mes não pode ficar em branco.");
									objeto.focus();
									return false;
								}else{
									if(tempAno == undefined || tempAno == ""){
										alert(inicioMensagem + "/Ano não pode ficar em branco.");
										objeto.focus();
										return false;
									}else{
										if (tempAno.length == 2) {
											tempAno = "20" + tempAno;
										}
										if (validateCard(valor, tempMes, tempAno) == false){
											return false;
										}
	
									}
								}
							}}
	
						break;
					}
				}
			}
		}
	}
	return true;
}
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();
}

///////////////////////////////   Amplia Imagem   /////////////////////////////////


function jczResetWindow(bmp)
{ 
 self.moveTo(2,2);
 self.resizeTo(bmp.width+15,bmp.height+60);
 if (parseInt(navigator.appVersion) >= 4)
 {
 	window.moveTo((screen.width/2)-((bmp.width+50)/2+10),(screen.height/2)-((bmp.height+50)/2));
 }
}


function growup(idObj,pIni,pFin)
{
	var obj = document.getElementById(idObj);
	obj.style.top=pIni+"px";
	pIni=parseInt(pIni)+18;
	if(pIni<pFin)
	{
		setTimeout("growup('"+idObj+"','"+pIni+"','"+pFin+"')",1);
	}
}
function growdown(idObj,pIni,pFin)
{
	var obj = document.getElementById(idObj);
	obj.style.top=pIni+"px";
	pIni=parseInt(pIni)-18;
	if(pIni>pFin)
	{
		setTimeout("growdown('"+idObj+"','"+pIni+"','"+pFin+"')",1);
		//alert("roll('"+idObj+"','"+pIni+"','"+pFin+"')");
	}
}

///////////////////////////////////////  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," "));
	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;
		}
	}
	if(temscript){executaRetorno();}
	ifila++;
	if(ifila<fila.length){
		if(fila[ifila][2]){
			document.getElementById("carregando").style.display = "block";
		}
		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; 
				}
				 
				 
				  
				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 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";
					}
				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 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;
        }
    }
}
