// JavaScript Document

/*============================================================
Função que limpa a caixa de texto, deixando apenas números
Ex.: onBlur="soNumeros(this);"
============================================================*/
function soNumeros(quem)
{
	temp	= quem.value;
	ret		= "";
	for (i = 0 ; i < temp.length ; i++)
	{
		c	= temp.substr(i, 1);
		if (!isNaN(c) && c != ' ' && c != '.' && c != ',' && c != ';')
			ret += c;
	}
	quem.value	= ret;
}

function ver(quem)
{
	temp = quem.value
	if (isNaN(temp)==true)
		
		return false;
	else
		return true;
} 


/*============================================================
Função que limpa a caixa de texto, deixando apenas números decimais
Ex.: onBlur="soNumerosDecimais(this);"
============================================================*/
function soNumerosDecimais(quem)
{
	temp	= quem.value;
	ret		= "";
	var reg 	= "[0-9]";
	var regex 	= new RegExp(reg);
	for (i = 0 ; i < temp.length ; i++)
	{
		c	= temp.substr(i, 1);
		if (regex.test(c) || c == ',')
			ret += c;
	}
	quem.value	= ret;
}

/*==========================================================
Função que indica se o campo está preenchido
Ex.: if (preenchido(document.form1.campo)
Só usada quando deve ser alterada a cor do fundo do campo
==========================================================*/
function preenchido(quem)
{
	if (quem.value == "")
		return false;
	else
		return true;
}


/*vTextos================================================================
Função que, quando o campo perde o foco, valida se foi preenchido
Ex.: onBlur="validaTextoSaida(this);"
Só usada quando deve ser alterada a cor do fundo do campo
================================================================*/
function validaTextoSaida(quem)
{
	if (preenchido(quem))
		corOK(quem);
	else
		corErro(quem);
}

/*vCPFs================================================================
Função que, quando o campo perde o foco, valida o CPF digitado
Ex.: onBlur="validaCPFSaida(this);"
Só usada quando deve ser alterada a cor do fundo do campo
================================================================*/
function validaCPFSaida(quem)
{
	if (!preenchido(quem))
		corErro(quem);
	else
	{
		formataCPF(quem);
		if (cpfOK(quem.value))
			corOK(quem);
		else
			corErro(quem);		
	}
}

/*vDatas================================================================
Função que, quando o campo perde o foco, valida se a data é válida
Ex.: onBlur="validaDataSaida(this);"
Só usada quando deve ser alterada a cor do fundo do campo
================================================================*/
function validaDataSaida(quem)
{
	if (!preenchido(quem))
		corErro(quem);
	else
	{
		formataData(quem);
		if (dataOK(quem))
			corOK(quem);
		else
			corErro(quem);
	}
}

/*fCPF================================================================
Função que faz a formatação do texto digitado em um campo CPF
Ex.: onBlur="formataCPF(this);"
================================================================*/
function formataCPF(quem)
{
	soNumeros(quem);
	if (quem.value != '')
	{
		ret			= quem.value;
		ret			= ret.substr(0, 3) + '.' + ret.substr(3, 3) + '.' + ret.substr(6, 3) + '-' + ret.substr(9, 2);
		quem.value	= ret;
	}
}

/*fData================================================================
Função que faz a formatação do texto digitado em um campo data
Ex.: onBlur="formataData(this);"
================================================================*/
function formataData(quem)
{
	soNumeros(quem);
	if (quem.value != '')
	{
		ret			= quem.value;
		ret			= ret.substr(0, 2) + '/' + ret.substr(2, 2) + '/' + ret.substr(4, 4);
		quem.value	= ret;
	}
}

/*cpfOK================================================================
Função que valida um CPF digitado
Ex.: if (cpfOK(document.form1.cpf.value))
================================================================*/
function cpfOK(s){
	limpo = "";
	for (i = 0 ; i < s.length ; i++)
	{
		ch = s.substr(i, 1);
		if (!isNaN(ch) && (ch != "." && ch != "-" & ch != " "))
		{
			limpo += ch;
		}
	}
	s = limpo;
	if (s.length != 11)
		return false;
	var i; 
	var c = s.substr(0,9);
	var dv = s.substr(9,2);
	var d1 = 0;
	for (i = 0; i < 9; i++)
		d1 += c.charAt(i)*(10-i);
	if (d1 == 0)
		return false;
	d1 = 11 - (d1 % 11);
	if (d1 > 9) d1 = 0;
	if (dv.charAt(0) != d1)
		return false;
	d1 *= 2;
	for (i = 0; i < 9; i++)
		d1 += c.charAt(i)*(11-i);
	d1 = 11 - (d1 % 11);
	if (d1 > 9) d1 = 0;
	if (dv.charAt(1) != d1)
		return false;
	return true;
}

/*dataOK================================================================
Função que valida uma data digitada
Ex.: if (validaData(document.form1.data))
================================================================*/
function dataOK(quem)
{
	if (quem.value.indexOf("/") == -1)
		return false;
	ok			= true;
	data		= quem.value;
	meses31dias	= new Array(1,3,5,7,8,10,12);
	meses30dias	= new Array(4,6,9,11);
	//Separa o valor passado em um vetor.	
	vet = data.split("/");
	dia = vet[0];
	mes = vet[1];
	ano = vet[2];
	
	if (data.length != 10)
		ok = false;
	if (mes > 12)
		ok = false;
	else if (mes == 2)
	{
		if (( ano % 4 == 0 && ano % 100 != 0) || ano % 4 == 0)
		{
			//Ano bissexto
			if (dia > 29)
				ok = false;
		}
		else if (dia > 28)
			ok = false;
	}
	else
	{
		for ( i = 0 ; i < meses31dias.length ; i++)
			if (mes == meses31dias[i])
				//Mês de 31 dias
				if (dia > 31)
					ok = false;
		for ( i = 0 ; i < meses30dias.length ; i++)
			if (mes == meses30dias[i])
				//Mês de 30 dias
				if (dia > 30)
					ok = false;
	}
	return ok;
}

/*vemails================================================================
Função que, ao tirar o foco de uma campo, faz a validacao de um e-mail digitado
Ex.: onBlur="validaEmailSaida(this);"
Usada somente quando se deve mudar a cor de fundo do campo
================================================================*/
function validaEmailSaida(quem)
{
	if (!preenchido(quem))
		corErro(quem);
	else
	{
		if (emailOK(quem.value))
			corOK(quem);
		else
			corErro(quem);
	}
}

/*emailOK================================================================
Função que faz a validação de um e-mail passado
Ex.: if (emailOK(document.form1.email.value))
================================================================*/
function emailOK(quem)
{
	var emailReg = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
	var regex = new RegExp(emailReg);
	return regex.test(quem);
}

/*vCEPs================================================================
Função que, ao tirar o foco de um campo, valida o CEP digitado
Ex.: onBlur="validaCEPSaida(this);"
Usada somente quando deve ser alterada a cor do fundo do campo
================================================================*/
function validaCEPSaida(quem)
{
	if (!preenchido(quem))
		corErro(quem);
	else
	{
		formataCEP(quem);
		if (cepOK(quem))
			corOK(quem);
		else
			corErro(quem);
	}
}

/*fCEP================================================================
Função que faz a formatação do texto digitado em um campo CEP
Ex.: onBlur="formataCEP(this);"
================================================================*/
function formataCEP(quem)
{
	soNumeros(quem);
	if (quem.value != '')
	{	
		ret			= quem.value;
		ret			= ret.substr(0, 2) + '.' + ret.substr(2, 3) + '-' + ret.substr(5, 3);
		quem.value	= ret;
	}
}

/*vCNPJs================================================================
Função que, quando tirado o foco de um campo, faz a validação de um CNPJ digitado
Ex.: onBlur="validaCNPJSaida(this);"
Usada somente quando deve ser alterada a cor de fundo do campo
================================================================*/
function validaCNPJSaida(quem)
{
	if (!preenchido(quem))
		corErro(quem);
	else
	{
		formataCNPJ(quem);
		if (cnpjOK(quem))
			corOK(quem);
		else
			corErro(quem);
	}
}

/*cepOK================================================================
Função que faz a validação de um CEP passado
Ex.: if (cepOK(document.form1.CEP))
================================================================*/
function cepOK(quem)
{
	temp	= quem.value;	
	var reg = "[0-9]{2}\.[0-9]{3}\-[0-9]{3}";
	var regex = new RegExp(reg);
	return regex.test(temp);
}

/*fCNPJ================================================================
Função que faz a formatação do texto digitado em um campo CNPJ
Ex.: onBlur="formataCNPJ(this);"
================================================================*/
function formataCNPJ(quem)
{
	soNumeros(quem);
	if (quem.value != '')
	{
		ret			= quem.value;
		ret			= ret.substr(0, 2) + '.' + ret.substr(2, 3) + '.' + ret.substr(5, 3) + '/' + ret.substr(8, 4) + '-' + ret.substr(12, 2);
		quem.value	= ret;
	}
}

/*cnpjOK================================================================
Função que faz a validação de um campo CNPJ
Ex.: if (cnpjOK(document.form1.CNPJ))
================================================================*/
function cnpjOK(quem) {
	CNPJ 	= quem.value;
	vazio	= "";	
	erro 	= false;
	
	//Limpa a string para fazer os cálculos
	for (i = 0 ; i < CNPJ.length ; i++)
	{
		c = CNPJ.substr(i, 1);
		if (!isNaN(c) && c != '.' && c != ',' && c != ' ')
			vazio += c;
	}
	CNPJ = vazio;	
	
	//Verifica se foi digitada alguma letra
	var nonNumbers = /\D/;
    if (nonNumbers.test(CNPJ))
		erro = true;
	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] 	= 	CNPJ.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 ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13]))
	{
		erro = true;
	}
	
	return !erro;
}

/*corO================================================================
Muda a cor de fundo do campo para branco, quando a validação do campo ocorre sem problemas
Ex.: corOK(document.form1.CEP);
================================================================*/
function corOK(quem)
{
	quem.style.backgroundColor	= "#FFFFFF";
}

/*corE================================================================
Muda a cor de fundo do campo para amarelo, quando a validação retorna erro
Ex.: corErro(document.form1.CEP);
================================================================*/
function corErro(quem)
{
	quem.style.backgroundColor	= "#FFFFBB";
}

/*vNumS================================================================
Quando tira o foco do campo, valida um número inteiro digitado
Ex.: onBlur="validaNumeroSaida(this);"
somente usado quando deve ser alterada a cor de fundo do campo
================================================================*/
function validaNumeroSaida(quem)
{
	soNumeros(quem);
	if (quem.value == '')
		corErro(quem);
	else
		corOK(quem);
}

/*vNumDecS================================================================
Quando tira o foco do campo, valida um número decimal digitado
Ex.: onBlur="validaNumeroDecimalSaida(this);"
somente usado quando deve ser alterada a cor de fundo do campo
================================================================*/
function validaNumeroDecimalSaida(quem)
{
	soNumerosDecimais(quem);
	if (quem.value == '')
		corErro(quem);
	else
	{
		if (numeroDecimalOK(quem))
			corOK(quem);
		else
			corErro(quem);
	}
}

/*numDecOK================================================================
Valida se foi digitado um número decimal
Ex.: if (numeroDecimalOK(document.form1.campo))
================================================================*/
function numeroDecimalOK(quem)
{
	temp	= quem.value;
	if (temp.indexOf(',') != temp.lastIndexOf(','))	
		return false;
	return true;
}

/*vTexto================================================================
Faz a validação de um campo do tipo texto, exibindo uma mensagem de erro
Ex.: if (!validaTexto(document.form1.campo, "O campo deve ser preenchido!"))
		return false;
================================================================*/
function validaTexto(quem, msg)
{
	if (quem.value == "")
	{
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vInteiro===============================================================
Faz a validação de um campo do tipo inteiro, exibindo uma mensagem de erro
Ex.: if (!validaInteiro(document.form1.campo, "O campo deve ser preenchido com números inteiros!"))
		return false;
================================================================*/
function validaInteiro(quem, msg){
	
      valor = parseInt(quem.value)
	  if (isNaN(valor)) {
		    window.alert(msg);
		    quem.focus();
            return false;
      }
      return true
      
} 

/*vTexto================================================================
Limpa os espaços em branco a direita e a esquerda da string
================================================================*/
function LimpaEspacoBrancoAll(str) {
  if (str!=null) {
    while (str.length > 0 &&
      "\n\r\t ".indexOf(str.charAt(str.length - 1)) != -1)
      str = str.substring(0, str.length - 1);
    while (str.length > 0 &&
      "\n\r\t ".indexOf(str.charAt(0)) != -1)
      str = str.substring(1, str.length);
  }
  return str;
}

/*vCPF================================================================
Faz a validação de um campo do tipo CPF, exibindo uma mensagem de erro
Ex.: if (!validaCPF(document.form1.campo, "CPF inválido!"))
		return false;
================================================================*/
function validaCPF(quem, msg)
{
	formataCPF(quem);
	if (!preenchido(quem))
		return true;
	if (!cpfOK(quem.value))
	{
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vData================================================================
Faz a validação de um campo do tipo data, exibindo uma mensagem de erro
Ex.: if (!validaData(document.form1.campo, "Data inválida!"))
		return false;
================================================================*/
function validaData(quem, msg)
{
	formataData(quem);
	if (!preenchido(quem))
		return true;
	if (!dataOK(quem))
	{
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vEmail================================================================
Faz a validação de um campo do tipo e-mail, exibindo uma mensagem de erro
Ex.: if (!validaEmail(document.form1.campo, "E-mail inválido!"))
		return false;
================================================================*/
function validaEmail(quem, msg)
{
	if (!preenchido(quem))
		return true;
	if (!emailOK(quem.value))
	{
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vCEP================================================================
Faz a validação de um campo do tipo CEP, exibindo uma mensagem de erro
Ex.: if (!validaCEP(document.form1.campo, "CEP inválido!"))
		return false;
================================================================*/
function validaCEP(quem, msg)
{
	formataCEP(quem);
	if (!preenchido(quem))
		return true;
	if (!cepOK(quem))
	{
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vCNPJ================================================================
Faz a validação de um campo do tipo CNPJ, exibindo uma mensagem de erro
Ex.: if (!validaCNPJ(document.form1.campo, "CNPJ inválido!"))
		return false;
================================================================*/
function validaCNPJ(quem, msg)
{
	formataCNPJ(quem);
	if (!preenchido(quem))
		return true;
	if (!cnpjOK(quem))
	{
		//corErro(quem);
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vList===============================================
Valida ums listbox
Ex.: if (!validaListbox(pListbox, "0", "erro")
====================================================*/
function validaListBox(quem, valorNulo, msg)
{
	if (quem.value == valorNulo)
	{
		window.alert(msg);
		quem.focus();
		return false;
	}
	return true;
}

/*vRadio=============================================
Valida um campo tipo radio, para ver se foi marcado
Ex.: if (!validaRadio(pRadio, "mensagem de erro"))
===================================================*/
function validaRadio(quem, msg)
{
	marcado = false;
	for (i = 0 ; i < quem.length ;  i++)
		if (quem[i].checked)
			marcado = true;
	if (!marcado)
		window.alert(msg);
	return marcado;
}



/*mMascara=============================================
Faz o mascaramento de qualquer campo
Exemplos de uso:
1. CPF: <input type="text" name="cpf" onkeyup="maskIt(this,event,'###.###.###-##')" />
2. Telefone: <input type="text" name="fone" onkeyup="maskIt(this,event,'(##)####-####')" />
3. Dinheiro <input type="text" name="dinheiro" onkeyup="maskIt(this,event,'###.###.###,##',true,{pre:'R$'})" />
3. Graus <input type="text" name="graus" onkeyup="maskIt(this,event,'###,#',true,{pre:'',pos:'º'})" />

/**  
  * Função Principal
  * @param w - O elemento que será aplicado (normalmente this).
  * @param e - O evento para capturar a tecla e cancelar o backspace.
  * @param m - A máscara a ser aplicada.
  * @param r - Se a máscara deve ser aplicada da direita para a esquerda. Veja Exemplos.
  * @param a -
  * @returns null  
  
=======================================================*/

function maskIt(w,e,m,r,a){
    
    // Cancela se o evento for Backspace
    if (!e) var e = window.event
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
    
    // Variáveis da função
    var txt  = (!r) ? w.value.replace(/[^\d]+/gi,'') : w.value.replace(/[^\d]+/gi,'').reverse();
    var mask = (!r) ? m : m.reverse();
    var pre  = (a ) ? a.pre : "";
    var pos  = (a ) ? a.pos : "";
    var ret  = "";

    if(code == 9 || code == 8 || txt.length == mask.replace(/[^#]+/g,'').length) return false;

    // Loop na máscara para aplicar os caracteres
    for(var x=0,y=0, z=mask.length;x<z && y<txt.length;){
        if(mask.charAt(x)!='#'){
            ret += mask.charAt(x); x++;
        } else{
            ret += txt.charAt(y); y++; x++;
        }
    }
    
    // Retorno da função
    ret = (!r) ? ret : ret.reverse()    
    w.value = pre+ret+pos;
}

// Novo método para o objeto 'String'
String.prototype.reverse = function(){
    return this.split('').reverse().join('');
};
