/************************************** Índice de funções ******************************************/
// isNum(digito)
// limpaString(Str)
// ehCPF(Str)
// ehCNPJ(Str)
// formataRG(Str)
// formataCPF(Str)
// formataCNPJ(Str)
// formataISBN(Str)
// formataCEP(Str)
// txtKeyUp(pObjeto)
// txtKeyPress()
// txtFocus(pObjeto)
// txtNmrFocus(pObjeto)
// validaNmr(pObjeto)
// ehData(pDia, pMes, pAno)
// charsLeft(target, maxChars)
// abrePopUp(page, nome, largura, altura)
// dateAdd(startDate, numDays, numMonths, numYears)
// yearAdd(startDate, numYears)
// monthAdd(startDate, numMonths)
// dayAdd(startDate, numDays)
/**************************************************************************************************/

// Funções utilizadas para validação e tratamento de caixas de texto

var verTAB = true;

// O objeto emailValido serve para validar um endereço de e-mail.
// Forma de utilização: emailValido.test('endereço de email').
// Retorno: boolean (true se o endereço fornecido for válido e false caso contrário).
var emailValido = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/;

// A função isNum verifica se um dígito é numérico ou não.
// Forma de utilização: isNum('digito').
// Retorno: boolean (true se o dígito fornecido for numérico e false caso contrário).
function isNum(digito) { 
  var Digitos = "0123456789";
  if (Digitos.indexOf(digito) == -1 ) 
    return false; 
  return true; 
} 

// A função limpaString elimina qualquer caractere não numérico de uma string.
// Forma de utilização: limpaString('string a ser limpada').
// Retorno: string (a string de entrada sem os caracteres não numéricos).
function limpaString(Str) {
  var temp = "";
  var digito = "";
  
  for (var i = 0; i < Str.length; i++) {
    digito = Str.charAt(i);
    if (isNum(digito))
      temp += digito;
  }
  return temp
}

// A função ehCPF verifica se um número de CPF é válido.
// Forma de utilização: ehCPF('número de CPF a ser testado').
// Retorno: boolean (true se o número for um CPF válido e false caso contrário).
function ehCPF(Str)  {
  var i;
  Str = limpaString(Str);
  var c = Str.substr(0, 9);
  var dv = Str.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;
}

// A função ehCNPJ verifica se um número de CNPJ é válido.
// Forma de utilização: ehCNPJ('número de CNPJ a ser testado').
// Retorno: boolean (true se o número for um CNPJ válido e false caso contrário).
function ehCNPJ(Str) {
  var i;
  Str = limpaString(Str);
  var c = Str.substr(0, 12);
  var dv = Str.substr(12, 2);
  var d1 = 0;
  
  for (i = 0; i < 12; i++)
    d1 += c.charAt(11 - i) * (2 + (i % 8));
  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 < 12; i++)
    d1 += c.charAt(11 - i) * (2 + ((i + 1) % 8));
  d1 = 11 - (d1 % 11);
  if (d1 > 9)
    d1 = 0;
  if (dv.charAt(1) != d1)
    return false;
  
  return true;
}

// A função formataRG formata um número de RG colocando '.' e '-' nos lugares corretos.
// Forma de utilização: formataRG('número de RG a ser formatado').
// Retorno: string (a formatação é feita na própria string de entrada).
function formataRG(Str) {
  var aux = Str.value;
  aux = limpaString(aux);
  var tam = aux.length;
  
  if (tam < 8)
    Str.value = aux;
  else
    Str.value = aux.substr(0, 1) + "." + aux.substr(1, 3) + "." + aux.substr(4, 3) + "-" + aux.substr(7, 1);
  
  return true;
}

// A função formataCPF formata um número de CPF colocando '.' e '-' nos lugares corretos.
// Forma de utilização: formataCPF('número de CPF a ser formatado').
// Retorno: string (a formatação é feita na própria string de entrada).
function formataCPF(Str) {
  var aux = Str.value;
  aux = limpaString(aux);
  var tam = aux.length;
  
  if (tam <= 3)
    Str.value = aux;
  if ((tam > 3) && (tam <= 7))
    Str.value = aux.substr(0, 3) + "." + aux.substr(4, tam);
  if ((tam >= 8) && (tam <= 11))
    Str.value = aux.substr(0, 3) + "." + aux.substr(3, 3) + "." + aux.substr(5, 3) + "-";
  if ((tam >= 11) && (tam <= 18))
    Str.value = aux.substr(0, 3 ) + "." + aux.substr(3, 3) + "." + aux.substr(6, 3) + "-" + aux.substr(9, 2);
  
  return true;
}

// A função formataCNPJ formata um número de CNPJ colocando '.' e '-' nos lugares corretos.
// Forma de utilização: formataCNPJ('número de CNPJ a ser formatado').
// Retorno: string (a formatação é feita na própria string de entrada).
function formataCNPJ(Str) { 
  var aux = Str.value;
  aux = limpaString(aux);
  var tam = aux.length;
  
  if (tam <= 2 )
    Str.value = aux;
  if ((tam > 2) && (tam <= 6))
    Str.value = aux.substr(0, 2) + "." + aux.substr(2, tam);
  if ((tam > 6) && (tam <= 10))
    Str.value = aux.substr(0, 2) + "." + aux.substr(2, 3) + "." + aux.substr(5, 3) + "/";
  if ((tam > 10) && (tam <= 18))
    Str.value = aux.substr(0, 2) + "." + aux.substr(2, 3) + "." + aux.substr(5, 3) + "/" + aux.substr(8, 4) + "-" + aux.substr(12, 2);
  
  return true;
}

// A função formataISBN formata um número de ISBN colocando '-' nos lugares corretos.
// Forma de utilização: formataISBN('número de ISBN a ser formatado').
// Retorno: string (a formatação é feita na própria string de entrada).
function formataISBN(Str) {
  var aux = Str.value;
  aux = limpaString(aux);
  var tam = aux.length;
  
  if (tam < 10)
    Str.value = aux;
  else
    Str.value = aux.substr(0, 2) + "-" + aux.substr(2, 3) + "-" + aux.substr(5, 4) + "-" + aux.substr(9, 2);
  
  return true;
}

// A função formataCEP formata um CEP colocando '.' e '-' nos lugares corretos.
// Forma de utilização: formataCEP('CEP a ser formatado').
// Retorno: string (a formatação é feita na própria string de entrada).
function formataCEP(Str) {
  var aux = Str.value;
  aux = limpaString(aux);
  var tam = aux.length;
  
  if (tam < 8)
    Str.value = aux;
  else
    Str.value = aux.substr(0, 2) + "." + aux.substr(2, 3) + "-" + aux.substr(5, 3);
  
  return true;
}

// A função txtKeyUp se refere ao evento onKeyUp de uma caixa de texto.
// Forma de utilização: onKeyUp=javascript:txtKeyUp(this);, onde this é o objeto que está chamando a função.
// Retorno: N/A.
function txtKeyUp(pObjeto) {
  //Só aceita números de 0 a 9
  if (!isNum(pObjeto.value.charAt(pObjeto.value.length - 1))) {
    pObjeto.value = pObjeto.value.substr(0, pObjeto.value.length - 1)
  }
  //Se o tamanho do conteúdo da caixa for igual ao tamanho máximo da caixa, passa para a próxima caixa de texto
  if ((pObjeto.value.length == pObjeto.maxLength) && (verTAB)) {
    var i = 0;
    for (i = 0; i < document.forms[0].elements.length; i++) {
      if (document.forms[0].elements[i].name == pObjeto.name) {
        while ((i < document.forms[0].elements.length) && (document.forms[0].elements[(i+1)].type == "hidden")) {
          i++;
          if (i == (document.forms[0].elements.length - 1))
            break;
        }
        if (i < (document.forms[0].elements.length - 1))
          document.forms[0].elements[(i+1)].focus();
        verTAB = false;
        break;
      }
    }
  }
}

// A função txtKeyPress se refere ao evento onKeyPress de uma caixa de texto.
// Forma de utilização: onKeyUp=javascript:txtKeyPress();.
// Retorno: N/A.
function txtKeyPress() {
  verTAB = true; 
} 

// A função txtFocus se refere ao evento onFocus de uma caixa de texto.
// Forma de utilização: onFocus=javascript:txtFocus(this);, onde this é o objeto que está chamando a função.
// Retorno: N/A.
function txtFocus(pObjeto) {
  pObjeto.className = "textBoxOver";
  //Se o tamanho do conteúdo da caixa for maior do que zero, seleciona toda a caixa de texto
  if (pObjeto.value.length > 0) {
    pObjeto.select();
  }
  verTAB = false;
}

// A função txtNmrFocus se refere ao evento onFocus de uma caixa de texto.
// Forma de utilização: onFocus=javascript:txtNmrFocus(this);, onde this é o objeto que está chamando a função.
// Retorno: N/A.
function txtNmrFocus(pObjeto) {
  pObjeto.className = "numericBoxOver";
  //Se o tamanho do conteúdo da caixa for maior do que zero, seleciona toda a caixa de texto
  if (pObjeto.value.length > 0) {
    pObjeto.select();
  }
}

// A função validaNmr valida uma caixa de texto verificando se o valor nela contido é um número e ainda substituindo ',' por '.'.
// Forma de utilização: onBlur=javascript:validaNmr(this);, onde this é o objeto que está chamando a função.
// Retorno: N/A.
function validaNmr(pObjeto) {
  if (pObjeto.value.search(",") != -1) {
    pObjeto.value = pObjeto.value.replace(",", ".");
  }
  if (isNaN(pObjeto.value) || pObjeto.value.length == 0) {
    pObjeto.value = 0;
  }
  pObjeto.className = "numericBoxNormal";
}

// A função ehData verifica se uma data é válida.
// Forma de utilização: ehData('dia', 'mês', 'ano').
// Retorno: boolean (true se os valores formarem uma data válida e false caso contrário).
function ehData(pDia, pMes, pAno) {
  var dia, mes, ano, diaMax
  dia = parseInt(pDia, 10);
  mes = parseInt(pMes, 10);
  ano = parseInt(pAno, 10);
  if ((dia > 0) && ((mes > 0) && (mes < 13)) && (ano >= 0)) {
    switch (mes) {
      case 1 :
        diaMax = 31;
        break;
      case 3 :
        diaMax = 31;
        break;
      case 5 :
        diaMax = 31;
        break;
      case 7 :
        diaMax = 31;
        break;
      case 8 :
        diaMax = 31;
        break;
      case 10 :
        diaMax = 31;
        break;
      case 12 :
        diaMax = 31;
        break;
      case 2 :
        if ((ano % 4) == 0)
          diaMax = 29;
        else 
          diaMax = 28;
        break;
      case 4 :
        diaMax = 30;
        break;
      case 6 :
        diaMax = 30;
        break;
      case 9 :
        diaMax = 30;
        break;
      case 11 :
        diaMax = 30;
        break;
      default :
        diaMax = -1;
        break;
    }
    if (dia <= diaMax)
      return true;
    else
      return false;
  }
  else 
    return false;
}

// A função charsLeft retorna a quantidade de caracteres disponíveis para digitação num 'textarea'. Um limite é fornecido como parâmetro e se esse limite for atingido a string é truncada.
// Forma de utilização: txtCharsLeft.value = charsLeft(this, 150).
// Retorno: numero (a qtde de caracteres disponíveis).
function charsLeft(target, maxChars) {
	aux = maxChars;
  strLen = target.value.length;
	if (strLen == 1 && target.value.substring(0, 1) == " ") {
		target.value = "";
		strLen = 0;
	}
	if (strLen > maxChars) {
		target.value = target.value.substring(0, target.value.length-1);
		aux = 0;
	}
	else {
		aux = aux - strLen;
	}
	return aux;
}

// A função abrePopUp abre uma janela carregando um arquivo que é passado como parâmetro. Os outros parâmetros são o nome (que pode ser utilizado para referenciá-la posteriormente) a largura e a altura da janela. O último parâmetro é opcional e serve para definir as características da nova janela. A popUp aparecera centralizada na tela.
// Forma de utilização: abrePopUp("exemplo.php", "Janela_Exemplo", 150, 200).
// Retorno: N/A.
function abrePopUp(page, nome, largura, altura, params) {
	var posicaoX = screen.width - largura;
	var posicaoY = screen.height - altura;
	if (posicaoX != 0) {
		posicaoX = Math.round(posicaoX / 2);
		posicaoY = Math.round(posicaoY / 2);
	}
	if (abrePopUp.arguments.length > 4)
		window.open(page, nome, params + ',width='+largura+',height='+altura+",left="+posicaoX+",top="+posicaoY);
	else
		window.open(page, nome, 'toolbar=no,location=no,address=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,copyhistory=no,maximized=yes,width='+largura+',height='+altura+",left="+posicaoX+",top="+posicaoY);
}

// A função dateAdd soma um número de dias, meses ou anos a uma data.
// Forma de utilização: dateAdd(data_inicial, 10, 2, 1), onde data_inicial é um objeto do tipo Date.
// Retorno: Um objeto Date com a data resultante.
function dateAdd(startDate, numDays, numMonths, numYears) {
	var returnDate = new Date(startDate.getTime());
	var yearsToAdd = numYears;
	
	var month = returnDate.getMonth()	+ numMonths;
	if (month > 11) {
		yearsToAdd = Math.floor((month+1)/12);
		month -= 12*yearsToAdd;
		yearsToAdd += numYears;
	}
	returnDate.setMonth(month);
	returnDate.setFullYear(returnDate.getFullYear()	+ yearsToAdd);
	
	returnDate.setTime(returnDate.getTime()+60000*60*24*numDays);
	
	return returnDate;
}

// A função yearAdd é uma simplificação da função dateAdd e é utilizada quando se deseja somar apenas anos.
// Forma de utilização: yearAdd(data_inicial, 5), onde data_inicial é um objeto do tipo Date.
// Retorno: Um objeto Date com a data resultante.
function yearAdd(startDate, numYears) {
	return dateAdd(startDate, 0, 0, numYears);
}

// A função monthAdd é uma simplificação da função dateAdd e é utilizada quando se deseja somar apenas meses.
// Forma de utilização: monthAdd(data_inicial, 5), onde data_inicial é um objeto do tipo Date.
// Retorno: Um objeto Date com a data resultante.
function monthAdd(startDate, numMonths) {
	return dateAdd(startDate, 0, numMonths, 0);
}

// A função dayAdd é uma simplificação da função dateAdd e é utilizada quando se deseja somar apenas dias.
// Forma de utilização: dayAdd(data_inicial, 5), onde data_inicial é um objeto do tipo Date.
// Retorno: Um objeto Date com a data resultante.
function dayAdd(startDate, numDays)	{
	return dateAdd(startDate, numDays, 0, 0);
}
