//**********************************************************//
//                                                          //
//              Projeto de Validação Única                  //
//                                                          //
//**********************************************************//

// Vetor com as expressões regulares que serão utilizadas na validação.
var	ExReg 		= new Array();
	ExReg[0]	= /[0-9]{5}\-[0-9]{3}/; 			                // CEP
	ExReg[1]	= /\(\d{2}\)?[ ]?\d{4}[-]?\d{4}$/; 	                // Telefone com DDD
	ExReg[2]	= /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;   // E-Mail
	ExReg[3]	= /^\d{1,2}\/\d{1,2}\/\d{4}$/;		 	            // Data
	ExReg[4]	= /\d{3}\.\d{3}\.\d{3}\-\d{2}/;						// CPF
	ExReg[5]	= /\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}/;				// CNPJ
	ExReg[6]	= /^[http:\/\/www.|www.][\S]+$/;					// URL
		
// Teclas que devem ser desconsideradas na construção da máscara.
var	Teclas		= [8, 9, 37, 38, 39, 40, 46, 16];

function PVU(){
	
	// Dados recebidos
	this.formulario = document.getElementById(arguments[0]);
	
	// Métodos
	this.setCEP 	= setCEP;
	this.setTel		= setTelefone;
	this.setMail	= setMail;
	this.setData	= setData;
	this.setCPF		= setCPF;
	this.setCNPJ	= setCNPJ;
	this.setURL		= setURL;
	
}

// Confirgurar um campo com as restrições de URL.
function setURL(){

		for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] );
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && ( !ExReg[6].test(this.value) ) ){
				alert( "Digite a url corretamente." );
				this.focus();
			}
		}		
	}

}

// Confirgurar um campo com as restrições de CNPJ.
function setCNPJ(){
	
	for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] );
		
		obj.onkeypress = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				
				if( this.value.length == 2 || this.value.length == 6 )
					this.value += ".";
					
				if( this.value.length == 10 )
					this.value += "/"; 
					
				if( this.value.length == 15 )
					this.value += "-"; 
				
			}
		}
		
		// Travar tamanho máximo e permitir somente números
		obj.onkeydown = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				if( !isNumero( event.keyCode ) || this.value.length == 18 )
					return false;
				else
					return true;
			}
		}
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && ( !ExReg[5].test(this.value) || !isCNPJ(this.value) ) ){
				alert( "Digite o CNPJ corretamente." );
				this.focus();
			}
		}		
	}
	
}

// Confirgurar um campo com as restrições de CPF.
function setCPF(){

	for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] );
		
		obj.onkeypress = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				
				if( this.value.length == 3 || this.value.length == 7 )
					this.value += ".";
					
				if( this.value.length == 11 )
					this.value += "-"; 					
				
			}
		}
		
		// Travar tamanho máximo e permitir somente números
		obj.onkeydown = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				if( !isNumero( event.keyCode ) || this.value.length == 14 )
					return false;
				else
					return true;
			}
		}
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && ( !ExReg[4].test(this.value) || !isCPF(this.value) ) ){
				alert( "Digite o CPF corretamente." );
				this.focus();
			}
		}		
	}

}

// Configurar um campo com as restrições de data.
function setData(){
	
	for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] );
		
		obj.onkeypress = function(){
			if( !Pesquisa(Teclas, event.keyCode) )
			{
				
				var	txt = this.value;
				
				if( Number(txt.charAt(0)) > 3 )
					txt = "0" + txt;
				
				if( Number(txt.substr(0,2)) > 31 )
					txt = Format("{0}{1}/{2}","0",txt.charAt(0),txt.charAt(1));	
				
				if( Number(txt.charAt(3)) > 1 )
					txt = Format("{0}{1}{2}",txt.substr(0,3),"0",txt.charAt(3));
				
				if( txt.length == 2 || txt.length == 5 )
					this.value = txt + "/";
				
			}
		}
		
		// Travar tamanho máximo e permitir somente números
		obj.onkeydown = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				if( !isNumero( event.keyCode ) )
					return false;
				else
					return true;
			}
		}
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && ( !ExReg[3].test(this.value) )){
				alert( "Digite a data corretamente." );
				this.focus();
			}
		}
	
	}
	
}

// Configura um campo com as restrições de e-mail.
function setMail(){
	
	for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] );
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && !ExReg[2].test(this.value) ){
				alert( "Digite o e-mail corretamente." );
				this.focus();
			}
		}
		
	
	}
	
}

// Configura um campo com as restrições de tel.
function setTelefone(){
		
		for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] )
		
		// Máscara
		obj.onkeypress = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				
				if( this.value.length == 1 && this.value.charAt(0) != "(" ){
					this.value = "(" + this.value;
				}
				
				if( this.value.length == 3 ){
					this.value += ")";
				}
				
				if( this.value.length == 8 ){
					this.value += "-";
				}
			}
		}
		
		// Travar tamanho máximo e permitir somente números
		obj.onkeydown = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				if( !isNumero( event.keyCode ) || this.value.length == 13 )
					return false;
				else
					return true;
			}
		}
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && !ExReg[1].test(this.value) ){
				alert( "Digite o telefone corretamente." );
				this.focus();
			}
		}
	
	}
		
}

// Configura um campo com as restrições de cep.
function setCEP(){
	
	for( var i = 0 ; i < arguments.length ; i++ ){
	
		var obj = document.getElementById( arguments[i] )
		
		// Máscara
		obj.onkeypress = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				if( this.value.length == 5 ){
					this.value += "-";
				}
			}
		}
		
		// Travar tamanho máximo e permitir somente números
		obj.onkeydown = function(){
			if( !Pesquisa(Teclas, event.keyCode) ){
				if( !isNumero( event.keyCode ) || this.value.length == 9 )
					return false;
				else
					return true;
			}
		}
		
		// Validação ao perder o foco
		obj.onblur = function(){
			if( this.value != "" && !ExReg[0].test(this.value) ){
				alert( "Digite o CEP corretamente." );
				this.focus();
			}
		}
	
	}
}

// Checa se o keycode é numérico
function isNumero( codigo ){
    return ( codigo >= 48 && codigo <= 57 ) || ( codigo >= 96 && codigo <= 105 );
}

// Busca um determinado ítem no vetor e retorna true se existir
function Pesquisa( vetor, vp ){
	var	resp= false;
	for( var i = 0 ; i < vetor.length ; i++ ){
		if( vetor[i] == vp ){
			resp = true;
			break;
		}
	}
	return resp;
}

// Este método é igual ao String.Format() do C#
function Format()
{
	
	var	t	= arguments[0].toString(),
		n	= arguments.length - 1,
		j;
		
	for( var i = 0 ; i < n ; i++ ){
		j 	= "{".concat(i,"}");
		t 	= t.replace(j, arguments[i+1].toString());
	}
	
	return	t;	
	
}

// Checa se a data é válida ou não
function isData()
{
	var	DataOriginal        =  arguments[0].split("/");
	var	NovaData            =  new Date(DataOriginal[2], DataOriginal[1], DataOriginal[0]);	
	
	return DataOriginal[0]  == NovaData.getDate() && DataOriginal[1] == NovaData.getMonth() && DataOriginal[2] == NovaData.getFullYear();
	
}

// Remover caracter
function remove( string, char )
{
	while( string.indexOf(char) != -1 )
	{
		string = string.replace(char, "");
	}
		
	return string;
}

// Checa se o cpf é válido
function isCPF( cpf )
{
	
	cpf = remove(remove(cpf, "."), "-");
	
	if( cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999" )
	{
		return false;
	}
		
	var	t = 0,
		resto,
		d1,
		d2;
	
	// D1
	for( var i = 0 ; i <= 8 ; i++ )
		t += cpf.charAt(i) * (10 - i);
		
	resto = t % 11;
	if( resto < 2 )
		d1 = 0;
	else
		d1 = 11 - ( t % 11);
	t = 0;
	
	// D2
	for( var i = 0 ; i <= 9 ; i++ )
		t += cpf.charAt(i) * (11 - i);
	
	resto = t % 11;
	if( resto < 2 )
		d2 = 0;
	else
		d2 = 11 - ( t % 11);
	
	if( d1 != cpf.charAt(9) || d2 != cpf.charAt(10) )
		return false;
	
	return true;
	
}

// Verificar o CNPJ
function isCNPJ( CNPJ ){
	
	if (CNPJ.length < 18) 
		return false; 
	
	if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-"))
		return false;
	
	//substituir os caracteres que não são números
	CNPJ = remove(remove(remove(CNPJ, "."), "/"), "-");
	
	if ( /\D/.test(CNPJ) ) 
		return false;
	
	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]))
		   return false;
	
	return true;

}

// serve para exibir na tela no formato moeda R$ 1.000.000,00 no momento em que é digitado
// para chamá-la : onKeyPress="return(FormataMoeda(this,'.',',',event))"
function FormataMoeda(fld, milSep, decSep, e) 
{
    var sep = 0;
    var key = '';
    var i = j = 0;
    var len = len2 = 0;
    var strCheck = '0123456789';
    var aux = aux2 = '';
    var whichCode = (window.Event) ? e.which : e.keyCode;
    if (whichCode == 13) return true;  // Enter
    key = String.fromCharCode(whichCode);  // Get key value from key code
    if (strCheck.indexOf(key) == -1) return false;  // Not a valid key
    len = fld.value.length;
    for(i = 0; i < len; i++)
    if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) break;
    aux = '';
    for(; i < len; i++)
    if (strCheck.indexOf(fld.value.charAt(i))!=-1) aux += fld.value.charAt(i);
    aux += key;
    len = aux.length;
    if (len == 0) fld.value = '';
    if (len == 1) fld.value = '0'+ decSep + '0' + aux;
    if (len == 2) fld.value = '0'+ decSep + aux;
    if (len > 2) {
    aux2 = '';
    for (j = 0, i = len - 3; i >= 0; i--) {
    if (j == 3) {
    aux2 += milSep;
    j = 0;
    }
    aux2 += aux.charAt(i);
    j++;
    }
    fld.value = '';
    len2 = aux2.length;
    for (i = len2 - 1; i >= 0; i--)
    fld.value += aux2.charAt(i);
    fld.value += decSep + aux.substr(len - 2, len);
    }
    return false;
}

function PegarValor( strTitulo )
{
    var strValor;
    
    do
    {
        strValor = prompt( strTitulo,"");
    }while(strValor == "")
    
    return strValor;
}

function txtBoxFormat(objeto, sMask, evtKeyPress) {
    var i, nCount, sValue, fldLen, mskLen,bolMask, sCod, nTecla;


    if(document.all) { // Internet Explorer
        nTecla = evtKeyPress.keyCode;
    } else if(document.layers) { // Nestcape
        nTecla = evtKeyPress.which;
    } else {
        nTecla = evtKeyPress.which;
        if (nTecla == 8) {
            return true;
        }
    }

    sValue = objeto.value;

    // Limpa todos os caracteres de formatação que
    // já estiverem no campo.
    sValue = sValue.toString().replace( "-", "" );
    sValue = sValue.toString().replace( "-", "" );
    sValue = sValue.toString().replace( ".", "" );
    sValue = sValue.toString().replace( ".", "" );
    sValue = sValue.toString().replace( "/", "" );
    sValue = sValue.toString().replace( "/", "" );
    sValue = sValue.toString().replace( ":", "" );
    sValue = sValue.toString().replace( ":", "" );
    sValue = sValue.toString().replace( "(", "" );
    sValue = sValue.toString().replace( "(", "" );
    sValue = sValue.toString().replace( ")", "" );
    sValue = sValue.toString().replace( ")", "" );
    sValue = sValue.toString().replace( " ", "" );
    sValue = sValue.toString().replace( " ", "" );
    fldLen = sValue.length;
    mskLen = sMask.length;

    i = 0;
    nCount = 0;
    sCod = "";
    mskLen = fldLen;

    while (i <= mskLen) {
      bolMask = ((sMask.charAt(i) == "-") || (sMask.charAt(i) == ".") || (sMask.charAt(i) == "/") || (sMask.charAt(i) == ":"))
      bolMask = bolMask || ((sMask.charAt(i) == "(") || (sMask.charAt(i) == ")") || (sMask.charAt(i) == " "))

      if (bolMask) {
        sCod += sMask.charAt(i);
        mskLen++; }
      else {
        sCod += sValue.charAt(nCount);
        nCount++;
      }

      i++;
    }

    objeto.value = sCod;

    if (nTecla != 8) { // backspace
      if (sMask.charAt(i-1) == "9") { // apenas números...
        return ((nTecla > 47) && (nTecla < 58)); }
      else { // qualquer caracter...
        return true;
      }
    }
    else {
      return true;
    }
}
