//*******************************FUNÇÕES GENÉRICAS***********************************//

	///////////////////// PROCURA EM ARRAYS, KEYS INCOMPATIVEIS
	function searchInArray(array, value){
		for(i=0; i<array.length; i++){
			if (array[i] == value)	return true;
		}
		return false;
	}
	
	///////////////////// LIMPA UMA STRING
	function cleanStr(value){
		while(value.indexOf(".") > -1){			value = value.replace('.',"");	}
		while(value.indexOf(":") > -1){			value = value.replace(':',"");	}
		while(value.indexOf("-") >= 0){			value = value.replace('-',"");	}
		while(value.indexOf("/") >= 0){			value = value.replace('/',"");	}
		while(value.indexOf(" ") >= 0){			value = value.replace(' ',"");	}
		return value;
	}

	///////////////////// PROCURA NUMERO DE LETRAS NA STRING
	function searchText(value, nMin, nMax){
		var letters  = [
			'á','à','ã','ä','â','é','è','ë','ê','í','ì','ï','î',
			'ó','ò','õ','ö','ô','ú','ù','ü','û',
			'a','b','c','ç','d','e','f','g','h','i','j','k','l','m',
			'n','o','p','q','r','s','t','u','v','w','x','y','z',
			
			'Á','À','Ã','Ä','Â','É','È','Ë','Ê','Í','Ì','Ï','Î',
			'Ó','Ò','Õ','Ö','Ô','Ú','Ù','Ü','Û',
			'A','B','C','Ç','D','E','F','G','H','I','J','K','L','M',
			'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
		];
		
		if (nMax){
			var found = 0;
			for(var i=0; i <= value.length; i++){
				if (Number(found) <= Number(nMax)){
					if ( searchInArray(letters, value.charAt(i) ) ) found ++;
				} else {
					return false;
				}
			}
			if (!nMin) return true;
		}
		
		if (nMin){
			var found = 0;
			for(var i=0; i <= value.length; i++){
				if (Number(found) < Number(nMin)){
					if ( searchInArray(letters, value.charAt(i) ) ) found ++;
				} else {
					return true;
				}
			}
			return false;
		}
	}

	///////////////////// PROCURA NUMERO DE NUMEROS NA STRING
	function searchNumber(value, nMin, nMax){
		var numbers  = [0,1,2,3,4,5,6,7,8,9];
		
		if (nMax){
			var found = 0;
			for(var i=0; i <= value.length; i++){
				if (Number(found) <= Number(nMax)){
					if ( searchInArray(numbers, value.charAt(i) ) ) found ++;
				} else {
					return false;
				}
			}
			if (!nMin) return true;
		}
		
		if (nMin){
			var found = 0;
			for(var i=0; i <= value.length; i++){
				if (Number(found) < Number(nMin)){
					if ( searchInArray(numbers, value.charAt(i) ) ) found ++;
				} else {
					return true;
				}
			}
			return false;
		}
	}
	
	///////////////////// SEPARA UMA STRING EM DETERMINADO PONTO 
	function splite(value, posicao) {
		element_1 = value.slice(0,posicao);
		element_2 = value.slice(posicao,value.length);
		return [element_1, element_2];
	}


//*******************************FUNÇÕES INSERIDAS NO HTML***********************************//

	///////////////////// FORMATA O CAMPO
	function formatField(e, field, format){
		var keyCode = e.charCode? e.charCode : e.keyCode;
		var noKey = [8, 38, 40, 37, 46, 39];
		if( !searchInArray(noKey, keyCode) ){
			var string 		= 	field.value;
			var char		=	format.substring(string.length, string.length+1);
			if (char != "x"){
				field.value += char;
			}
		}
	}


	///////////////////// PULA PARA O CAMPO ESPECIFICADO
	function inputJump(e, atualField, totalLength, nextField){
		var keyCode=e.charCode? e.charCode : e.keyCode
		noKey = [8, 38, 40, 37, 46, 39];
		if(keyCode!=9  && atualField.value.length >= totalLength && !searchInArray(noKey, keyCode) ){
			document.getElementById(nextField).focus();
		}
	}

	///////////////////// PERMITE INSERIR APENAS NUMEROS
	function inputNumber(e){
		noKey = [8, 38, 40, 37, 46, 39];
		var keyCode=e.charCode? e.charCode : e.keyCode;
		if (keyCode!=8 && keyCode!=9 && keyCode!=13){
			if ((keyCode<48||keyCode>57) && !searchInArray(noKey, keyCode)){ 
				return false //disable key press
			}
		}
		return true;
	}

//***********************************VALIDAÇÕES ADICIONAIS***********************************//

	///////////////////// VALIDA CNPJ
	function valCnpj(value) {
		value = cleanStr(value);
		
		if (value.length < 14) return false;
		if ((value.charAt(2) != ".") || (value.charAt(6) != ".") || (value.charAt(10) != "/") || (value.charAt(15) != "-")){
			if (erro.length == 0) return false;
		}
	
		while(value.indexOf(".") > -1){
			value = value.replace('.',"");
		}
		while(value.indexOf("-") >= 0){
			value = value.replace('-',"");
		}
		while(value.indexOf("/") >= 0){
			value = value.replace('/',"");
		}
		var a = [];
		var b = new Number;
		var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
		for (i=0; i<12; i++){
			a[i] = value.charAt(i);
			b += a[i] * c[i+1];
		}
		if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
		b = 0;
		for (y=0; y<13; y++) {
			b += (a[y] * c[y]);
		}
		if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
		if ((value.charAt(12) != a[12]) || (value.charAt(13) != a[13])){
			return false;
		}
		return true;
	}

	///////////////////// VALIDA CPF
	function valCpf(value) {
		value = cleanStr(value);

		if (value.length != 11 || value == "00000000000" || value == "11111111111" ||	value == "22222222222" ||
		value == "33333333333" || value == "44444444444" ||	value == "55555555555" || value == "66666666666" ||
		value == "77777777777" ||	value == "88888888888" || value == "99999999999"){
			return false;
		}
		
		var soma = 0;
		for (i=0; i < 9; i ++) soma += parseInt(value.charAt(i)) * (10 - i);
		var resto = 11 - (soma % 11);
		if (resto == 10 || resto == 11)
			resto = 0;
		if (resto != parseInt(value.charAt(9))){
			return false;
		}
		
		var soma = 0;
		for (i = 0; i < 10; i ++) soma += parseInt(value.charAt(i)) * (11 - i);
		var resto = 11 - (soma % 11);
		if (resto == 10 || resto == 11) resto = 0;
		if (resto != parseInt(value.charAt(10))){
			return false;
		}
		return true;
	}
	
	///////////////////// VALIDA E-MAIL
	function valMail(EMAIL){
		var requisito1 = EMAIL.indexOf("@");
		var requisito2 = EMAIL.indexOf(".");
		var requisito3 = EMAIL.length;
		if (!(requisito1 >= 2 && requisito2 >= 5 && requisito3 >= 9)) {
			return false;
		} else return true;
	}
	
	///////////////////// VALIDA CARTÃO DE CREDITO
	function valCredCard(value){
		var value = cleanStr(value);
		
		if (value.length > 16 || value.length < 14) return (false);
		
		var sum = 0;
		var mul = 1;
		var length = value.length;
	
		for (var i=0; i<length; i++) {
			digit = value.substring(length-i-1,length-i);
			tproduct = parseInt(digit,10)*mul;
			
			if (tproduct >= 10) sum += (tproduct % 10) + 1;
			else sum += tproduct;
	
			if (mul == 1) mul++;
			else mul--;
		}
		
		if ((sum % 10) == 0) return true;
		else return false;
		
		return false;
	}
	
	///////////////////// VERIFICA SE UM CAMPO É IGUAL A OUTRO
	function valSame(field, field2){
		if(field.value != field2.value) {
			return false;
		} else return true;
	}

//***********************************VALIDAÇÕES BÁSICAS***********************************//

	///////////////////// MINIMO DE CARACTERES (TEXT)
	function minText(field, minimal){
		var value =	field.value.length;
		if(field.value && value < minimal) return false;
		else return true;
	}
	
	///////////////////// MINIMO DE ITENS CHECKEDS (CHECKBOX)
	function minCheck(field, minimal){
		var found = 0;
		for (var i=0; i<field.length; i++){
			if (found < minimal){
				if (field[i].checked) found ++;
			} else return true;
		}
		return false;
	}

	///////////////////// VALIDA SE UM CAMPO FOI PREENCHIDO (SELECT)
	function valSelect(field){
		if(field.selectedIndex == 0) {
			return false;
		} else return true;
	}

	///////////////////// VALIDA SE UM CAMPO FOI PREENCHIDO (CHECKBOX)
	function valCheck(field){
		var found = 0;
		for (var i=0; i<field.length; i++){
			if (field[i].checked) return true;
		}
		return false;
	}

	///////////////////// VALIDA SE UM CAMPO FOI PREENCHIDO (RADIO)
	function valRadio(field){
		for (var i=0; i<field.length; i++){
			if (field[i].checked){
				if (field[i].checked) return true;
			}
		}
		return false;
	}

	///////////////////// VERIFICA SE UM CAMPO SÓ COMTEM NÚMEROS
	function valNumber(value) {
		var value = cleanStr(value);
		if(isNaN(value)) return false;
		return true;
	}

	///////////////////// VALIDA SE UM CAMPO FOI PREENCHIDO (TEXT)
	function valText(field){
		var value =	field.value;
		if(!field.value) return false;
		else return true;
	}
	
	/*
	///////////////////// RETORNA CONSULTA DE UMA PÁGINA
	function retornPage(page, FIELD, form, array_form){
		var xmlhttp;
		//----------------------------------------------------
		try{
			xmlhttp = new XMLHttpRequest();
		}catch(ee){
			try{
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				}catch(E){
					xmlhttp = false;
				}
			}
		}
	
		dados = FIELD.name + "=" + FIELD.value;
	
		//INICIAL PROCESSO
		xmlhttp.open("POST", page, true);
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		var statusFild = FIELD.attributes.getNamedItem("name").value;
		statusFild = document.getElementById("STATUS_" + statusFild);
		
		//RETORNA RESULTADO
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4){
				var content = xmlhttp.responseText;
				if (!content || content == "") {removeMsn(statusFild); validaForm(form, array_form);}
				else {showMsg(FIELD, content); return false;}
			}
		}
		
		xmlhttp.send(dados);
	}
	*/
	
	///////////////////// RETORNA CONSULTA DE UMA PÁGINA
	function retornPage(page, FIELD) {
		
		var xmlhttp;
		//----------------------------------------------------
		try{
			xmlhttp = new XMLHttpRequest();
		}catch(ee){
			try{
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				}catch(E){
					xmlhttp = false;
				}
			}
		}
	
		dados = FIELD.name + "=" + FIELD.value;
	
		try{
			//INICIAL PROCESSO
			xmlhttp.open("POST", page, false);
			xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			xmlhttp.send(dados);
			return xmlhttp.responseText
		}catch(ex){throw ex;}
	}
	
	

///////////////////// MOSTRA MENSAGEM///////////////////
function showMsg(field, msn){
	if (field[1] &&  field.type != "select-one"){
		//CASO SEJA ROADIO OU CHECKBOX
		nameField = field[0].attributes.getNamedItem("name").value;
		field[0].focus();
	}else{
		nameField = field.attributes.getNamedItem("name").value;
		field.focus();
		//if (field.type == "select-one")	field.select();
	}
	
	var statusBox = document.getElementById("STATUS_" + nameField);
	if (!statusBox){
		var newElement = document.createElement('div');
		newElement.innerHTML = "<div class=\"status\" id=\"STATUS_" + nameField + "\"></div>";
		if (field[0]) field[0].parentNode.appendChild(newElement);
		else		  field.parentNode.appendChild(newElement);
		var statusBox = document.getElementById("STATUS_" + nameField);
	}

	statusBox.style.display 	= "block";
	statusBox.innerHTML 		= msn;
	
	if (field[1] &&  field.type != "select-one"){
		//CASO SEJA ROADIO OU CHECKBOX
		for (var i=0; i<field.length; i++){
			//field[i].onclick 	=  function(e){removeMsn(statusBox)};
			field[i].onchange 	=  function(e){removeMsn(statusBox)};
		}
		//field[0].onblur 	=  function(e){removeMsn(statusBox)};
	}else{
		field.onchange 		= function(e){removeMsn(statusBox)};
		field.onkeypress 	= function(e){removeMsn(statusBox)};
		//field.onblur 		= function(e){removeMsn(statusBox)};
	}
}//////////////////////////////////

///////////////////// REMOVE MWNSAGEM///////////////////
function removeMsn(target){
	target.style.display = "none";
	target.innerHTML = "";
}

///////////////////// VALIDA O FORMULARIO
function validaForm(form, array_form, sendNormal){
	if (!array_form) var array_form = this["elements_" + form.name];
	
	for(var i=0; i<array_form.length; i++){
		var FIELD				= form[ array_form[i][0] ];
			if(!FIELD) return false;
		var TIPO				= array_form[i][1];
		var MSN_TIPO			= array_form[i][2];
		var OBRIGATORIO			= array_form[i][3];
		var MSN_OBRIGATORIO		= array_form[i][4];
		var MINIMO_VADILD		= array_form[i][5];
		var NUMERO_LETRAS		= array_form[i][6];
		var NUMERO_NUMEROS		= array_form[i][7];
		var MAIOR_MENOR_QUE		= array_form[i][8];
		var COMPARA_COM			= form[ array_form[i][9] ];
		var RETORNA_PAGE		= array_form[i][10];
		
		//CASO SEJA OBRIGATORIO, VERIFICA SE ESTA VAZIO
		if (OBRIGATORIO){
			if 		(FIELD[0] && FIELD[0].type == "checkbox")	var fielValidation = valCheck(FIELD);
			else if (FIELD[0] && FIELD[0].type == "radio")		var fielValidation = valRadio(FIELD);
			else if (FIELD.type == "select-one")				var fielValidation = valSelect(FIELD);
			else 												var fielValidation = valText(FIELD);
			if (!fielValidation) {showMsg(FIELD, MSN_OBRIGATORIO);	return false;}
		}
		//-------------------------------------------------------------
		
		if (MINIMO_VADILD){
			if (FIELD.type == "text" || FIELD.type == "password")	var fielValidation = minText(FIELD, MINIMO_VADILD);
			else if (FIELD[0].type == "checkbox")					var fielValidation = minCheck(FIELD, MINIMO_VADILD);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO);	return false;}
		}
		
		//CASO SEJA NUMERO
		if (TIPO == "NUMBER"){
			var fielValidation 	= valNumber(FIELD.value);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		//CASO SEJA EMAIL
		if (TIPO == "EMAIL"){
			var fielValidation 	= valMail(FIELD.value);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		if (TIPO == "CPF"){
			var fielValidation 	= valCpf(FIELD.value);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		if (TIPO == "CREDCARD" && FIELD.value){
			var fielValidation 	= valCredCard(FIELD.value);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}

		//VERIFICAÇÃO DO NUMERO DE LETRAS
		if (NUMERO_LETRAS[0] || NUMERO_LETRAS[1]){
			var fielValidation 	= searchText(FIELD.value, NUMERO_LETRAS[0], NUMERO_LETRAS[1]);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		//VERIFICAÇÃO DO NUMERO DE LETRAS
		if (NUMERO_NUMEROS[0] || NUMERO_NUMEROS[1]){
			var fielValidation 	= searchNumber(FIELD.value, NUMERO_NUMEROS[0], NUMERO_NUMEROS[1]);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		//VERIFICAÇÃO DO NUMERO (MAIOR QUE)
		if (MAIOR_MENOR_QUE[0] || MAIOR_MENOR_QUE[1]){
			if (MAIOR_MENOR_QUE[0]) if ( Number(FIELD.value) < Number(MAIOR_MENOR_QUE[0]) ) {showMsg(FIELD, MSN_TIPO); return false;}
			if (MAIOR_MENOR_QUE[1]) if ( Number(FIELD.value) > Number(MAIOR_MENOR_QUE[1]) ) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		//COMPARAÇÃO
		if (COMPARA_COM){
			var fielValidation 	= valSame(FIELD, COMPARA_COM);
			if (!fielValidation) {showMsg(FIELD, MSN_TIPO); return false;}
		}
		
		//RETORNA CONSULTA DE UMA PÁGINA
		/*
		if (RETORNA_PAGE){
			
			new_array_form = array_form.slice();
			new_array_form.splice(i,1);
			
			showMsg(FIELD, "Verificando...");
			var fielValidation 	= retornPage(RETORNA_PAGE, FIELD, form, new_array_form);
			return false;
			//if (!fielValidation || fielValidation == "false") {showMsg(FIELD, MSN_COMPARA); return false;}
		}
		*/
		//RETORNA CONSULTA DE UMA PÁGINA
		if (RETORNA_PAGE){
			var f_retorna = false;
			f_retorna = retornPage(RETORNA_PAGE, FIELD);
			if (f_retorna != '') {
				showMsg(FIELD, f_retorna);
				return false;
			}
		}
		
		
	}
	
	if(sendNormal){
		return true;
	}else{
		sendForm(form);
		return false;	
	}
}