// JavaScript Document

/* 
Função: Verifica Separador Numerico
Propósito: verificaSeparador(fld) : Verifica o separador de um campo numérico, se o usuario digitar ',' substitui por '.'
*/
		
function verificaSeparador(fld)
{
	if ((fld.value).indexOf(',') != -1) {
	  fld.value = fld.value.substr(0,fld.value.length - 1);
	  fld.value = fld.value + '.';
    }
	if(isNaN(fld.value)) {
	  alert("Digite somente números neste campo.");
	  fld.value = fld.value.substr(0,fld.value.length - 1);
    }
}

/* 
Função: Formata Número Decimal
Propósito: Filtra a entrada de dados para apenas numeros, com "," ou "."
Ex: onKeyPress="return formata_numero_decimal(this)"
*/
		
function formataNumeroDecimal(objeto, p_event) {
	var k = -1;
	if(formataNumeroDecimal.arguments.length == 2) {
		ev = p_event;
	}
	if (window.event && window.event.keyCode) {
		k = window.event.keyCode;
	} else {
		if(p_event) {
			k = p_event.charCode;
		}
		if(k == 0) {
			k = -1;
		}
	}
	if(k == 44 && ((window.event) || (objeto.value.indexOf('.') == -1))) {
		k = 46;
		if(window.event) {
			window.event.keyCode = 46;
		} else {
			objeto.value += '.';
			return false;
		}
		if(document.selection)
			document.selection.createRange().text = '';
	}
	//objeto.value += '.';
	return (k > -1 ? ( (k > 47 && k < 58) || (k == 8 || (k == 46 && objeto.value.indexOf('.') == -1 ))) : true);
}


/* 
Função: Verifica Tipo do Campo
Propósito: Retorno TRUE se o campo é controlado pela função CONTROLA CAMPOS
*/
		
function verificaTipo( p_campo )
{
	switch( p_campo.type ) 
	{
				case 'text' : 
				case 'select-one' : 
				case 'select-multiple' : 
				case 'textarea' : 
				case 'password' : 
					
					return ( true );
				
			   default :	
					return ( false );
	}

}

/* 
Função: Maskara de Formatação
Propósito:
Formata um campo de acordo com uma maskara pré-determinada.
0 indica caracteres somente numericos
X indica caracteres alfa numericos
Ex: 
Formatação de datas
onKeyPress="return formata(this,event, '00/00/0000')
*/
function formata(obj, p_event, p_mask) {
	if(obj.readOnly || obj.disabled)
			return;
		if(formata.arguments.length == 2) {
			mask = p_event;
		} else {
			mask = p_mask;
			ev = p_event;
		}
		var k = -1;
		var v_tipos = '0XxAa';
		if (window.event && window.event.keyCode ) {
			k = window.event.keyCode;
		} else {
			if(formata.arguments.length != 2) {
				k = ev.charCode;
				if(k == 0) {
					return true;
				}
			}
		}
		while (v_tipos.indexOf(mask.substring(obj.value.length, obj.value.length+1)) == -1 && obj.value.length < mask.length) {
			obj.value = obj.value + mask.substring(obj.value.length, obj.value.length+1);
		}
		var v_numeros = '0123456789';
		var v_letras_maius = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
		if(document.selection)
			document.selection.createRange().text = '';
		if(mask.substring(obj.value.length, obj.value.length+1) == '0') {
			ret = (k > -1 ? (v_numeros.indexOf(String.fromCharCode(k)) != -1) : true);
		} else if (mask.substring(obj.value.length, obj.value.length+1) == 'x') {
			//permite somente a entrada de letras, permanecendo maiusculas ou minusculas conforme o usuario digitar
			ret = (k > -1 ? (v_letras_maius.indexOf(String.fromCharCode(k).toUpperCase()) != -1) : true);
		} else if (mask.substring(obj.value.length, obj.value.length+1) == 'X') {
			//permite somente a entrada de letras, tornando todas maiusculas
			if (window.event && window.event.keyCode ) {
				window.event.keyCode = String.fromCharCode(k).toUpperCase().charCodeAt(0);
			} else if(formata.arguments.length != 2) {
				ev.charCode = String.fromCharCode(k).toUpperCase().charCodeAt(0);
			}
			ret = (k > -1 ? (v_letras_maius.indexOf(String.fromCharCode(k).toUpperCase()) != -1) : true);
		} else if (mask.substring(obj.value.length, obj.value.length+1) == 'a') {
			//permite entradas alfa-numericas, permanecendo maiusculas ou minusculas conforme o usuario digitar
			ret = true;
		} else if (mask.substring(obj.value.length, obj.value.length+1) == 'A') {
			//permite entradas alfa-numericas, tornando todas maiusculas
			if (window.event && window.event.keyCode ) {
				window.event.keyCode = String.fromCharCode(k).toUpperCase().charCodeAt(0);
			} else if(formata.arguments.length != 2) {
				ev.charCode = String.fromCharCode(k).toUpperCase().charCodeAt(0);
			}
			ret = true;
		} 

	return ((!(obj.value.length>(mask.length-1)))&&ret);
}


/* 
Função: Verifica Form
Propósito: verificaForm(formulario) : Verifica os dados do formulario, o que pode ser feito apenas em uma secao do form
	* variáveis *
	  - formulario : nome do formulario
	  - secao : Opcional, indica que a verificação deve ser feita apenas em uma parte do form
*/
		
function verificaForm(formulario) {
	var args=verificaForm.arguments;
	// Verifica apenas umas secao do formulario
	var secao = false;
	if (args.length == 2) secao = true;	
	for (var i = 0; i<formulario.length; i++) {
		if (!formulario.elements[i].disable) {
			if ((!secao && !formulario.elements[i].getAttribute("secao")) || args[1] == formulario.elements[i].getAttribute("secao")) {
				if ((formulario.elements[i].getAttribute("obrigatorio") == 1) && (!formulario.elements[i].value) && (!formulario.elements[i].disable)) {
					mensagem = 'O campo '+formulario.elements[i].getAttribute("display")+' '+String.fromCharCode(233)+' requerido.';
					return erro(mensagem,formulario.elements[i], formulario);
				}
			}
		    if ((!secao && !formulario.elements[i].getAttribute("secao")) || args[1] == formulario.elements[i].getAttribute("secao")) {
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'numerico')) {
					formulario.elements[i].value = formulario.elements[i].value.replace(',', '.');
					if(!formulario.elements[i].value.isNumber()) {
						mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser num'+String.fromCharCode(233)+'rico.';
						return erro(mensagem,formulario.elements[i], formulario);
					}
				}			
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'data') && (!formulario.elements[i].value.substr(0,10).isDate())) {
					mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser uma data v'+String.fromCharCode(225)+'lida.';
					return erro(mensagem,formulario.elements[i], formulario)
				}			
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'data_hora') && (!formulario.elements[i].value.isDataHora())) {
					mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser uma data e hora v'+String.fromCharCode(225)+'lida, no formato (dia/m'+String.fromCharCode(234)+'s/ano hora:minuto).';
					return erro(mensagem,formulario.elements[i], formulario)
				}			
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'cpf') && (!formulario.elements[i].value.isCPF())) {
					mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser um nº v'+String.fromCharCode(225)+'lido de CPF.';
					return erro(mensagem,formulario.elements[i], formulario)
				}			
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'email') && (!formulario.elements[i].value.isMail())) {
					mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser um e-mail.';
					return erro(mensagem,formulario.elements[i], formulario)
				}			
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'cnpj') && (!formulario.elements[i].value.isCNPJ())) {
					mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser um CNPJ v'+String.fromCharCode(225)+'lido.';
					return erro(mensagem,formulario.elements[i], formulario)
				}	
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'cnpjcpf') && (!formulario.elements[i].value.isCNPJCPF())) {
					mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser um CNPJ ou CPF v'+String.fromCharCode(225)+'lido.';
					return erro(mensagem,formulario.elements[i], formulario)
				}	
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'placa')) {
                    formulario.elements[i].value = formulario.elements[i].value.replace('-', '');
					if(!formulario.elements[i].value.isPlaca()) {
						mensagem = 'O valor do campo '+formulario.elements[i].getAttribute("display")+' deve ser uma placa v'+String.fromCharCode(225)+'lida..';
						return erro(mensagem,formulario.elements[i], formulario)
					}
				}
				if ((formulario.elements[i].value) && (formulario.elements[i].getAttribute("tipo") == 'upload') && (!uploadOK(formulario.elements[i]))) {
					mensagem = 'O arquivo do campo '+formulario.elements[i].getAttribute("display")+' ainda não foi carregado';
					return erro(mensagem,formulario.elements[i], formulario)
				}
			}
		}
	}
	return true;
}


/*

*/

function uploadOK(){
	var field = arguments[0];
	if(field.getAttribute('uploadOK')){
		if(field.getAttribute('uploadOK') == 1 ){
			return true;
		}
	}
	return false;
}

/* 
Função: Testa CNPJ
Propósito: Testa a validade de um nro de cnpj
*/
		
function testaCnpj(cnpj)
{
  while (cnpj.indexOf('.') > 0)
  {
    cnpj= cnpj.replace('.', '');
  }
  while (cnpj.indexOf('-') > 0)
  {
    cnpj = cnpj.replace('-', '');
  }
  while (cnpj.indexOf('/') > 0)
  {
    cpnj = cnpj.replace('/', '');
  }
  res = false;
  digito = 0;
  if(cnpj.length == 14)
  {
    cnpjdv = cnpj.substring(12, 14);
        digito = 0;
        controle = "";
        for(i=0;i<2;i++)
        {
          soma = 0;
          for(j=0;j<12;j++)
          {
            soma += (cnpj.substring(j, j+1)*1)*((11+i-j)%8+2);
          }
          if(i == 1)
          {
            soma += digito * 2;
          }
          digito = 11 - soma%11;
          if (digito > 9)
          {
            digito = 0;
          }
          controle = controle+""+digito;
    }
        if(controle == cnpjdv)
        {
          res = true;
        }
  }
  return res;
}

/* 
Função: Testa CPF
Propósito: Testa a validade de um nro de CPF
*/
		
function testaCpf(cpf)
{
  while (cpf.indexOf('.') > 0)
  {
    cpf = cpf.replace('.', '');
  }
  while (cpf.indexOf('-') > 0)
  {
    cpf = cpf.replace('-', '');
  }
  while (cpf.indexOf('/') > 0)
  {
    cpf = cpf.replace('/', '');
  }
  if(cpf == '00000000000')
  {
    return true;
  }
  digito1 = 0;
  digito2 = 0;
  if(cpf.length == 11)
  {
    for(i=0;i<9;i++)
        {
          digito1 += (cpf.substring(i, i+1)*1)*(10-i);
        }
        if ((digito1%11==1)||(digito1%11==0))
        {
          digito1 = 0;
        }
        else
        {
          digito1 = 11-(digito1%11);
        }
        for (i=0;i<10;i++)
        {
          digito2 += (cpf.substring(i, i+1)*1)*(11-i);
        }
        if ((digito2%11==1)||(digito2%11==0))
        {
          digito2 = 0;
        }
        else
        {
          digito2 = 11 - (digito2%11);
        }
        return ((digito1+""+digito2)==cpf.substring(9, 11));
  }
  else
  {
    return false;
  }
}

/* 
Função: Testa CNPJ/CPF
Propósito: Testa a validade de um CNPJ ou CPF, de acordo com o tamanho do nro passado
*/
		
function testaCpfCnpj(cpfcnpj)
{
  if(cpfcnpj.length == 14)
  {
    return testaCnpj(cpfcnpj);
  }
  else
  {
    return testaCpf(cpfcnpj);
  }
}

/* 
Função: Prototype isCNPJ
Propósito: Verifica se o valor da string é um CNPJ válido
*/

String.prototype.isCNPJ = function() {
	return testacnpj(this);
}


/* 
Função: Prototype isMail
Propósito: Verifica se o valor da String é um e-mail
*/
		
String.prototype.isMail = function(){
		var test
		var pt1    = this.split( '@' );
		var valid = '.-_@';
		
		if ( ( pt1.length != 2 ) || ( pt1[ 0 ].length == 0 ) || ( pt1[ 1 ].length == 0 ) ) return( false );
		else {
			for ( var i = 0 ; i < valid.length - 1 ; i++ ){
				if ( pt1[ 0 ].split( valid.charAt( i ) ).hasEmptyElements() ) return( false );
				if ( pt1[ 1 ].split( valid.charAt( i ) ).hasEmptyElements() ) return( false );
			}			
		}
		
		for ( var i = 0 ; i < this.length ; i++ ){
			var v_char = this.toUpperCase().charCodeAt( i );
			if ( valid.indexOf( String.fromCharCode( v_char ) ) == -1 )
				if ( !( ( ( v_char >= 65 ) && ( v_char <= 90 ) ) || ( ( v_char >= 48 ) && ( v_char <= 57 ) ) ) ) return( false );
		}	
		
		return( true );
	}

/* 
Função: Prototype isCPF
Propósito: Verifica se o valor da String é um CPF
*/
		
String.prototype.isCPF = function(){
    return testaCpf(this);
}

/* 
Função: Prototype isDataHora
Propósito: Verifica se o valor da String é uma data/Hora no formata dd/mm/yyyy HH:MM válida.
*/
		
String.prototype.isDataHora = function(){
		var pt = this.split( '/' );
		var dt = new Date();
		var dd = Number( pt[ 0 ] );
		var mm = Number( pt[ 1 ] );
		var yy = Number(this.substr(6,4));
		var hh = this.substr(11,2);
		var mi = this.substr(14,2);

		// Data sem HORA
		if ( this.length < 15 ) return false ;
		
		// Caso seja preenchida com segundos
		if (this.length > 15) 
			var ss = this.substr(17,2); 
		else 
			var ss = '00';

		if ( !( ( hh >= 00 ) && ( hh < 24 ) && ( mi >= 00 ) && ( mi < 60 ) && ( ss >= 00 ) && ( ss < 60 ) ) )
		   return( false );
			
		if ( pt.length < 3 ) return( false );
		
		if ((mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12) && (dd <= 0 || dd > 31)) return false;
			
		if ((mm == 4 || mm == 6 || mm == 9 || mm == 11 ) && (dd <= 0 || dd > 30)) return false;

		if ((mm == 2 ) && (dd <= 0 || (yy%4 == 0 && dd > 29 ) || (yy%4 != 0 && dd > 28 ))) return false;

		if (yy < 1900 || yy > 2100) return false;
		return true;
	}

/* 
Função: Prototype isDate
Propósito: Verifica se o valor da string é uma data valida
*/
		
String.prototype.isDate = function(){
		var pt = this.split( '/' );
		var dt = new Date();
		var dd = Number( pt[ 0 ] );
		var mm = Number( pt[ 1 ] );
		var yy = Number( pt[ 2 ] );
		if ( pt.length != 3 ) return( false );
		if ((mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12) && (dd <= 0 || dd > 31)) return false;
		if ((mm == 4 || mm == 6 || mm == 9 || mm == 11 ) && (dd <= 0 || dd > 30)) return false;
		if ((mm == 2 ) && (dd <= 0 || (yy%4 == 0 && dd > 29 ) || (yy%4 != 0 && dd > 28 ))) return false;
		if (yy < 1900 || yy > 2100) return false;
		return true;
	}

/* 
Função: Prototype isPlaca
Propósito: Verifica se o valor de uma string é uma placa valida no formato 'XXX0000'
*/
		
String.prototype.isPlaca = function(){
		if ( this.replace('-','').length != 7) return( false );
		v_num = this.replace('-','').substr(3,4);
		if ( isNaN( v_num ) ) return( false );
		return( true );
	}

/* 
Função: Prototype isNumber
Propósito: Verifica se o valor da string é um numero
*/
		
String.prototype.isNumber = function(){
  return( !isNaN( this.split( '.' ).join( '' ).split( ',' ).join( '' ).split( '-' ).join( '' ) ) );
}


/* 
Função: Prototype hasEmptyElements
Propósito: Verifica se um array possui elementos em branco, nulos ou indefinidos
*/
		
Array.prototype.hasEmptyElements = function(){
		for ( var i = 0 ; i < this.length ; i++ )
			if ( ( this[ i ] == '' ) || ( this[ i ] == null ) || ( this[ i ] == undefined ) )
				return( true );
		return( false );
	}

/* 
Função: Prototype Dtos
Propósito: ???
*/
		
Date.prototype.Dtos = function(){
		var dd = this.getDate();
		var mm = this.getMonth() + 1;
		var yy = this.getFullYear();
		
		return( [ yy , ( mm < 10 ? '0' : '' ) + mm , ( dd < 10 ? '0' : '' ) + dd ].join( '' ) );
	}



/* 
Função: Tamanho do texto
Propósito: Aumenta ou diminui tamanho do texto de um elemento
*/
		
var startSz = 2;
function textSize( trgt,inc,value ) {
	try {
		if(!value)
			value = false;
	} catch(e) {}
	var tgs = new Array( 'div','td','tr','table','span','p');
	var szs = new Array( '8','10','11','14','18','22','24' );
	if (!document.getElementById) return
	var d = document,cEl = null,sz,i,j,cTags;
	cEl = trgt;
//	if ( !( cEl = d.getElementById( trgt ) ) ) 
//		cEl = d.getElementsByTagName( trgt )[ 0 ];

//	startSz = 2;
	sz = startSz;
/*	for(var i=0;i<szs.length;i++) {
		if(cEl.style.fontSize == szs[i]+'px') {
			startSz = i;
			sz = startSz;
		}
	}*/
	if(!value) {
		sz += inc;
	}
	if ( sz < 0 ) sz = 0;
	if ( sz > 6 ) sz = 6;
	startSz = sz;
	cEl.style.fontSize = szs[ sz ];
	for ( i = 0 ; i < tgs.length ; i++ ) {
		cTags = cEl.getElementsByTagName( tgs[ i ] );
		for ( j = 0 ; j < cTags.length ; j++ ) {
//			cTags[ j ].style.fontSize = szs[ sz ];
			textSize(cTags[ j ],inc, true);
		}
	}
}

/* 
Função: Prototype cnpjcpf
Propósito: Valida CNPJ e CPF
*/
		
String.prototype.isCNPJCPF = function() {
	if (this.length == 14)
		return testacnpj(this);
	else 
		return testaCpf(this);
}


/* 
Função: Valida Senha 
*/

function repeteSenha(){
	if(repeteSenha.arguments.length == 2){
		var args = repeteSenha.arguments;
		if((args[0].getAttribute('obrigatorio') == '1') && (args[1].getAttribute('obrigatorio') == '1')){
			if(args[0].value == "" || args[1].value == ""){
				args[0].value = '';
				args[1].value = '';
				args[0].focus();
				return false;
			}
			if((args[0].value) == (args[1].value)){
				return true;
			}else{
				args[0].value = '';
				args[1].value = '';
				args[0].focus();
				return false;	
			}
		}else{
			return true;
		}
	}else{
		return false; 
	}
}

/* 
Função: Formata numero com decimal e milhar
Propósito: Formatar numero com decimais e milhar (00.000,00)
*/
		
function formataDecimalMilhar(_v)
{
  var _dollars=parseInt(_v);
  var _cents=parseInt((_v-_dollars)*100);
  var _negative=_dollars<0;
  if(_negative){_dollars=-_dollars;_cents=-_cents;}
  while(_cents.toString().length<2)_cents="0"+_cents;
  var _dA=_dollars.toString().split("");
  var _d="";
  for(var i=_dA.length-1;i>=0;i--)
  {
    var _comma="";
	if((_dA.length-i)%3==0 && i!=0)_comma=".";
    _d=_comma+_dA[i]+_d;
  }
  var _neg_sign=_negative?"-":"";
  var _result=_neg_sign+_d+","+_cents;
  return _result;
}

/* 
Função: Formata Date
Propósito: Formata objeto Date para data
*/
		
function formatDate(str) {
	var data = new Date(str);
	var v_result = ((String(data.getDate()).length == 1)?'0':'')+data.getDate();
	v_result += '/'+((String(data.getMonth()+1).length == 1)?'0':'')+(data.getMonth()+1);
	v_result += '/'+data.getYear();
	return v_result;
}

/*
Função: algumPreenchido(FILDS,FILDS)
Propósito: Verifica se ao menos um dos campos informados tem
valor válido
*/

function algumPreenchido(){
	for(var i = 0; i < arguments.length; i ++ ){
		if(arguments[i].value != null && arguments[i].value != ''){
			return true;				
		}
	}
	alert('Ao menos um campo deve ser preenchido!');
	return false;
}

/*
	Conta caracteres do Text ÁREA
	Modo de Utilizar
	onpaste="contaChars(this,1000);" onKeyUp="contaChars(this,1000);" onKeyPress="contaChars(this,1000);" 
	
	Criar um div
	<div id="sizeFIELD_NAME" class="nova">0</div> de 1000.
*/

function contaChars(){
		var field = arguments[0];
		var valor = field.value;
		if(valor.length <= arguments[1]){
				document.getElementById("size"+field.name).innerHTML= valor.length;
		}else{
			field.value = valor.substring(0,arguments[1]);
			document.getElementById("size"+field.name).innerHTML= arguments[1];
			alert('Você já atingiu o limite de caracteres');
		}
	}
