// JavaScript Document

// JavaScript Document

var OrdZero = '0'.charCodeAt(0);

function CharToInt(ch) {  
	return ch.charCodeAt(0) - OrdZero;
}


function IntToChar(intt) {
return String.fromCharCode(intt + OrdZero);
}


function CheckIEAC(ie){
if (ie.length != 13)
return false;
var b = 4, soma = 0;

for (var i = 0; i <= 10; i++)
{
soma += CharToInt(ie.charAt(i)) * b;
--b;
if (b == 1) { b = 9; }
}
dig = 11 - (soma % 11);
if (dig >= 10) { dig = 0; }
resultado = (IntToChar(dig) == ie.charAt(11));
if (!resultado) { return false; }

b = 5;
soma = 0;
for (var i = 0; i <= 11; i++)
{
soma += CharToInt(ie.charAt(i)) * b;
--b;
if (b == 1) { b = 9; }
}
dig = 11 - (soma % 11);
if (dig >= 10) { dig = 0; }
if (IntToChar(dig) == ie.charAt(12)) { return true; } else { return false; }
} //AC


function CheckIEAL(ie)
{
if (ie.length != 9)
  return false;
var b = 9, soma = 0;
for (var i = 0; i <= 7; i++)
{
   soma += CharToInt(ie.charAt(i)) * b;
   --b;
}
soma *= 10;
dig = soma - Math.floor(soma / 11) * 11;
if (dig == 10) { dig = 0; }
return (IntToChar(dig) == ie.charAt(8));
} //AL


function CheckIEAM(ie)
{
if (ie.length != 9)
  return false;
var b = 9, soma = 0;
for (var i = 0; i <= 7; i++)
{
  soma += CharToInt(ie.charAt(i)) * b;
  b--;
}
if (soma < 11) { dig = 11 - soma; }
else {
   i = soma % 11;
   if (i <= 1) { dig = 0; } else { dig = 11 - i; }
}
return (IntToChar(dig) == ie.charAt(8));
} //am


function CheckIEAP(ie)
{
if (ie.length != 9)
  return false;
var p = 0, d = 0, i = ie.substring(1, 8);
if ((i >= 3000001) && (i <= 3017000))
{
  p =5;
  d = 0;
}
else if ((i >= 3017001) && (i <= 3019022))
{
  p = 9;
  d = 1;
}
b = 9;
soma = p;
for (var i = 0; i <= 7; i++)
{
  soma += CharToInt(ie.charAt(i)) * b;
  b--;
}
dig = 11 - (soma % 11);
if (dig == 10)
{
   dig = 0;
}
else if (dig == 11)
{
   dig = d;
}
return (IntToChar(dig) == ie.charAt(8));
} //ap


function CheckIEBA(ie)
{
if (ie.length != 8)
  return false;
die = ie.substring(0, 8);
var nro = new Array(8);
var dig = -1;
for (var i = 0; i <= 7; i++)
{
  nro[i] = CharToInt(die.charAt(i));
}
var NumMod = 0;
if (String(nro[0]).match(/[0123458]/))
   NumMod = 10;
else
   NumMod = 11;
b = 7;
soma = 0;
for (i = 0; i <= 5; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % NumMod;
if (NumMod == 10)
{
  if (i == 0) { dig = 0; } else { dig = NumMod - i; }
}
else
{
  if (i <= 1) { dig = 0; } else { dig = NumMod - i; }
}
resultado = (dig == nro[7]);
if (!resultado) { return false; }
b = 8;
soma = 0;
for (i = 0; i <= 5; i++)
{
  soma += nro[i] * b;
  b--;
}
soma += nro[7] * 2;
i = soma % NumMod;
if (NumMod == 10)
{
  if (i == 0) { dig = 0; } else { dig = NumMod - i; }
}
else
{
  if (i <= 1) { dig = 0; } else { dig = NumMod - i; }
}
return (dig == nro[6]);
} //ba


function CheckIECE(ie)
{
if (ie.length > 9)
  return false;
die = ie;
if (ie.length < 9)
{
  while (die.length <= 8)
   die = '0' + die;
}
var nro = Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(die[i]);
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
dig = 11 - (soma % 11);
if (dig >= 10)
  dig = 0;
return (dig == nro[8]);
} //ce


function CheckIEDF(ie)
{
if (ie.length != 13)
  return false;
var nro = new Array(13);
for (var i = 0; i <= 12; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 4;
soma = 0;
for (i = 0; i <= 10; i++)
{
  soma += nro[i] * b;
  b--;
  if (b == 1)
   b = 9;
}
dig = 11 - (soma % 11);
if (dig >= 10)
  dig = 0;
resultado = (dig == nro[11]);
if (!resultado)
  return false;  
b = 5;
soma = 0;
for (i = 0; i <= 11; i++)
{
  soma += nro[i] * b;
  b--;
  if (b == 1)
   b = 9;
}
dig = 11 - (soma % 11);
if (dig >= 10)
  dig = 0;
return (dig == nro[12]);
}


// CHRISTOPHE T. C. <wG @ codingz.info>
function CheckIEES(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % 11;
if (i < 2)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
}


function CheckIEGO(ie)
{
if (ie.length != 9)
  return false;
s = ie.substring(0, 2);
if ((s == '10') || (s == '11') || (s == '15'))
{
  var nro = new Array(9);
  for (var i = 0; i <= 8; i++)
   nro[i] = CharToInt(ie.charAt(i));
  n = Math.floor(ie / 10);
  if (n = 11094402)
  {
   if ((nro[8] == 0) || (nro[8] == 1))
return true;
  }
  b = 9;
  soma = 0;
  for (i = 0; i <= 7; i++)
  {
   soma += nro[i] * b;
   b--;
  }
  i = soma % 11;
  if (i == 0)
   dig = 0;
  else
  {
   if (i == 1)
   {
if ((n >= 10103105) && (n <= 10119997))
  dig = 1;
else
  dig = 0;
   }
   else
dig = 11 - i;
  }
  return (dig == nro[8]);
}
}


function CheckIEMA(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
}


function CheckIEMT(ie)
{
if (ie.length < 9)
  return false;
die = ie;
if (die.length < 11)
{
  while (die.length <= 10)
   die = '0' + die;
  var nro = new Array(11);
  for (var i = 0; i <= 10; i++)
   nro[i] = CharToInt(die[i]);
  b = 3;
  soma = 0;
  for (i = 0; i <= 9; i++)
  {
   soma += nro[i] * b;
   b--;
   if (b == 1)
b = 9;
  }
  i = soma % 11;
  if (i <= 1)
   dig = 0;
  else
   dig = 11 - i;
  return (dig == nro[10]);
}
} //muito


function CheckIEMS(ie)
{
if (ie.length != 9)
  return false;
if (ie.substring(0,2) != '28')
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
} //ms


function CheckIEPA(ie)
{
if (ie.length != 9)
  return false;
if (ie.substring(0, 2) != '15')
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
} //pra


function CheckIEPB(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;  
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
} //pb


function CheckIEPR(ie)
{
if (ie.length != 10)
  return false;
var nro = new Array(10);
for (var i = 0; i <= 9; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 3;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
  if (b == 1)
   b = 7;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
resultado = (dig == nro[8]);
if (!resultado)
  return false;
b = 4;
soma = 0;
for (i = 0; i <= 8; i++)
{
  soma += nro[i] * b;
  b--;
  if (b == 1)
   b = 7;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[9]);
} //pr


function CheckIEPE(ie)
{
if (ie.length != 14)
  return false;
var nro = new Array(14);
for (var i = 0; i <= 13; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 5;
soma = 0;
for (i = 0; i <= 12; i++)
{
  soma += nro[i] * b;
  b--;
  if (b == 0)
   b = 9;
}
dig = 11 - (soma % 11);
if (dig > 9)
  dig = dig - 10;
return (dig == nro[13]);
} //pe


function CheckIEPI(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
} //pi


function CheckIERJ(ie)
{
if (ie.length != 8)
  return false;
var nro = new Array(8);
for (var i = 0; i <= 7; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 2;
soma = 0;
for (i = 0; i <= 6; i++)
{
  soma += nro[i] * b;
  b--;
  if (b == 1)
   b = 7;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[7]);
} //rj


// CHRISTOPHE T. C. <wG @ codingz.info>
function CheckIERN(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
soma *= 10;
dig = soma % 11;
if (dig == 10)
  dig = 0;
return (dig == nro[8]);
} //rn


function CheckIERS(ie)
{
if (ie.length != 10)
  return false;
i = ie.substring(0, 3);
if ((i >= 1) && (i <= 467))
{
  var nro = new Array(10);
  for (var i = 0; i <= 9; i++)
   nro[i] = CharToInt(ie.charAt(i));
  b = 2;
  soma = 0;
  for (i = 0; i <= 8; i++)
  {
   soma += nro[i] * b;
   b--;
   if (b == 1)
b = 9;
  }
  dig = 11 - (soma % 11);
  if (dig >= 10)
   dig = 0;
  return (dig == nro[9]);
} //if i&&i
} //rs


function CheckIEROantigo(ie)
{
if (ie.length != 9) {
return false;
}

var nro = new Array(9);
b=6;
soma =0;

for( var i = 3; i <= 8; i++) {

    nro[i] = CharToInt(ie.charAt(i));

        if( i != 8 ) {
            soma = soma + ( nro[i] * b );
            b--;
        }

}

dig = 11 - (soma % 11);
if (dig >= 10)
  dig = dig - 10;

return (dig == nro[8]);

} //ro-antiga


function CheckIERO(ie)
{

if (ie.length != 14) {
return false;
}

var nro = new Array(14);
b=6;
soma=0;

        for(var i=0; i <= 4; i++) {
    
            nro[i] = CharToInt(ie.charAt(i));

        
                soma = soma + ( nro[i] * b );
                b--;

        }

        b=9;
        for(var i=5; i <= 13; i++) {
    
            nro[i] = CharToInt(ie.charAt(i));

                if ( i != 13 ) {        
                soma = soma + ( nro[i] * b );
                b--;
                }

        }

                        dig = 11 - ( soma % 11);
                            
                            if (dig >= 10)
                                  dig = dig - 10;

                                    return(dig == nro[13]);
                        
} //ro nova


function CheckIERR(ie)
{
if (ie.length != 9)
  return false;
if (ie.substring(0,2) != '24')
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
var soma = 0;
var n = 0;
for (i = 0; i <= 7; i++)
  soma += nro[i] * ++n;
dig = soma % 9;
return (dig == nro[8]);
} //rr


function CheckIESC(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
i = soma % 11;
if (i <= 1)
  dig = 0;
else
  dig = 11 - i;
return (dig == nro[8]);
} //sc


// CHRISTOPHE T. C. <wG @ codingz.info>
function CheckIESP(ie)
{
if (((ie.substring(0,1)).toUpperCase()) == 'P')
{
  s = ie.substring(1, 9);
  var nro = new Array(12);
  for (var i = 0; i <= 7; i++)
   nro[i] = CharToInt(s[i]);
  soma = (nro[0] * 1) + (nro[1] * 3) + (nro[2] * 4) + (nro[3] * 5) +
   (nro[4] * 6) + (nro[5] * 7) + (nro[6] * 8) + (nro[7] * 10);
  dig = soma % 11;
  if (dig >= 10)
   dig = 0;
  resultado = (dig == nro[8]);
  if (!resultado)
   return false;
}
else
{
  if (ie.length < 12)
   return false;
  var nro = new Array(12);
  for (var i = 0; i <= 11; i++)
   nro[i] = CharToInt(ie.charAt(i));
  soma = (nro[0] * 1) + (nro[1] * 3) + (nro[2] * 4) + (nro[3] * 5) +
   (nro[4] * 6) + (nro[5] * 7) + (nro[6] * 8) + (nro[7] * 10);
  dig = soma % 11;
  if (dig >= 10)
   dig = 0;
  resultado = (dig == nro[8]);
  if (!resultado)
   return false;
  soma = (nro[0] * 3) + (nro[1] * 2) + (nro[2] * 10) + (nro[3] * 9) +
   (nro[4] * 8) + (nro[5] * 7) + (nro[6] * 6)  + (nro[7] * 5) +
   (nro[8] * 4) + (nro[9] * 3) + (nro[10] * 2);
  dig = soma % 11;
  if (dig >= 10)
   dig = 0;
  return (dig == nro[11]);
}
} //sp


function CheckIESE(ie)
{
if (ie.length != 9)
  return false;
var nro = new Array(9);
for (var i = 0; i <= 8; i++)
  nro[i] = CharToInt(ie.charAt(i));
b = 9;
soma = 0;
for (i = 0; i <= 7; i++)
{
  soma += nro[i] * b;
  b--;
}
dig = 11 - (soma % 11);
if (dig >= 10)
  dig = 0;
return (dig == nro[8]);
} //se


function CheckIETO(ie)
{
if (ie.length != 9) {
return false;
}

var nro = new Array(9);
b=9;
soma=0;

for (var i=0; i <= 8; i++ ) {

  nro[i] = CharToInt(ie.charAt(i));
  
  if(i != 8) {
  soma = soma + ( nro[i] * b );
  b--;
  }

}

ver = soma % 11;

if ( ver < 2 )

dig=0;

if ( ver >= 2 )
dig = 11 - ver;

return(dig == nro[8]);
} //to


//inscrição estadual antiga
function CheckIETOantigo(ie)
{

if ( ie.length != 11 ) {
    return false;

}


var nro = new Array(11);
b=9;
soma=0;

s = ie.substring(2, 4);

    if( s != '01' || s != '02' || s != '03' || s != '99' ) {


        for ( var i=0; i <= 10; i++)
        {

            nro[i] = CharToInt(ie.charAt(i));    

            if( i != 3 || i != 4) {

            soma = soma + ( nro[i] * b );
            b--;
            
            } // if ( i != 3 || i != 4 )

        } //fecha for


            resto = soma % 11;        
            
                if( resto < 2 ) {    

                    dig = 0;

                }


                if ( resto >= 2 ) {

                    dig = 11 - resto;

                }            

                return (dig == nro[10]);

    } // fecha if


}//fecha função CheckIETOantiga


function CheckIEMG(ie)
{
  if (ie.substring(0,2) == 'PR')
    return true;
  if (ie.substring(0,5) == 'ISENT')
    return true;
  if (ie.length != 13)
    return false;
  dig1 = ie.substring(11, 12);
  dig2 = ie.substring(12, 13);
  inscC = ie.substring(0, 3) + '0' + ie.substring(3, 11);
  insc=inscC.split('');
  npos = 11;
  i = 1;
  ptotal = 0;
  psoma = 0;
  while (npos >= 0)
  {
    i++;
    psoma = CharToInt(insc[npos]) * i;  
    if (psoma >= 10)
     psoma -= 9;
    ptotal += psoma;
    if (i == 2)
     i = 0;
    npos--;
  }
  nresto = ptotal % 10;
  if (nresto == 0)
    nresto = 10;
  nresto = 10 - nresto;
  if (nresto != CharToInt(dig1))
    return false;
  npos = 11;
  i = 1;
  ptotal = 0;
  is=ie.split('');
  while (npos >= 0)
  {
    i++;
    if (i == 12)
     i = 2;
    ptotal += CharToInt(is[npos]) * i;
    npos--;
  }
  nresto = ptotal % 11;
  if ((nresto == 0) || (nresto == 1))
    nresto = 11;
  nresto = 11 - nresto;  
  return (nresto == CharToInt(dig2));
}


function CheckIE(ie, estado) {
ie = ie.replace(/\./g, '');
ie = ie.replace(/\\/g, '');
ie = ie.replace(/\-/g, '');
ie = ie.replace(/\//g, '');
if ( ie == 'ISENTO')
  return true;
	switch (estado)
	{
		case 'MG': return CheckIEMG(ie); break;
		case 'AC': return CheckIEAC(ie); break;
		case 'AL': return CheckIEAL(ie); break;
		case 'AM': return CheckIEAM(ie); break;
		case 'AP': return CheckIEAP(ie); break;
		case 'BA': return CheckIEBA(ie); break;
		case 'CE': return CheckIECE(ie); break;
		case 'DF': return CheckIEDF(ie); break;
		case 'ES': return CheckIEES(ie); break;
		case 'GO': return CheckIEGO(ie); break;
		case 'MA': return CheckIEMA(ie); break;
		case 'MT': return CheckIEMT(ie); break;
		case 'MS': return CheckIEMS(ie); break;
		case 'pra': return CheckIEPA(ie); break;
		case 'PB': return CheckIEPB(ie); break;
		case 'PR': return CheckIEPR(ie); break;
		case 'PE': return CheckIEPE(ie); break;
		case 'PI': return CheckIEPI(ie); break;
		case 'RJ': return CheckIERJ(ie); break;
		case 'RN': return CheckIERN(ie); break;
		case 'RS': return CheckIERS(ie); break;
		case 'RO': return ((CheckIERO(ie)) || (CheckIEROantigo(ie))); break;
		case 'RR': return CheckIERR(ie); break;
		case 'SC': return CheckIESC(ie); break;
		case 'SP': return CheckIESP(ie); break;
		case 'SE': return CheckIESE(ie); break;
		case 'TO': return ((CheckIETO(ie)) || (CheckIETOantigo(ie))); break;//return CheckIETO(ie); break;        
	}
}

function strtrim(str) {
   //Match spaces at beginning and end of text and replace
   //with null strings
   return str.replace(/^\s+/,'').replace(/\s+$/,'');
}

/** 
 * Função fg_bln_validar_obrigatorio
 *
 * Checa se um campo obrigatorio possui algum valor. Caso não possua, avisa o usuário e seta o foco naquele campo.
 * Os parâmetros passados são:
 * vl_obj_campo_formulario               => Campo do formulario para checagem. Ex.: form1.field1
 * vl_str_titulo_campo                          => Nome do campo na interface para o retorno da função. Ex.: "Nome"
 *
 * @access public
 * @author Gianfranco Zucoloto <zucoloto@casetecnologia.com.br>
 * @copyright Copyright&copy; 2003, CASE Tecnologia
 * @param object vl_obj_campo_formulario Campo do formulario html a ser checado. Ex.: form1.field1
 * @param string vl_str_titulo_campo Título do campo na interface para o retorno da função. Ex.: "Nome"
 * @version 0.1
 * @return boolean Retorna true caso o campo esteja preenchido. Senão, um popup o avisará.
 * @todo
 */
function fg_bln_validar_obrigatorio(vl_obj_campo_formulario,vl_str_titulo_campo)
{
  var vg_bln_resultado = true;

  if (strtrim(vl_obj_campo_formulario.value) == "")
  {
    alert('Por favor informe um valor para o campo "' + vl_str_titulo_campo +'".');
    vl_obj_campo_formulario.focus();
    vg_bln_resultado = false;
  }
  
  return vg_bln_resultado;
}

/*
 * funcao fecharAviso
 
 * verifica se ha alguma id com o valor e oculta a mesma
 * autor: Renato Medina
 * data: 11/01/2006
*/
// fecha o alerta da execucao
function fecharAviso()
{
	if(null != $id("alertas"))
		$id("alertas").style.display = 'none';
}

/*
 * funcao fg_bln_validar_campos_iguais
 
 * verifica se os campos estao preenchidos e, caso sim, se sao iguais
 * autor: Renato Medina
 * data: 13/01/2006
*/
function fg_bln_validar_campos_iguais(vl_obj_campo_1,vl_obj_campo_2,vl_obj_titulo_campo_1, vl_obj_titulo_campo_2)
{
	var vg_bln_resultado = true;
	
	// verifica antes se os campos estao preenchidos
	if(!fg_bln_validar_obrigatorio(vl_obj_campo_1, vl_obj_titulo_campo_1))
		return false;
	else if(!fg_bln_validar_obrigatorio(vl_obj_campo_2, vl_obj_titulo_campo_2))
		return false;
		
	else {
		if(vl_obj_campo_1.value != vl_obj_campo_2.value) {
			alert('Os valores dos campos "'+vl_obj_titulo_campo_1+'" e "'+vl_obj_titulo_campo_2+'" não correspondem');
			vl_obj_campo_1.value = ""; // limpa o campo 1
			vl_obj_campo_2.value = ""; // limpa o campo 2
			vl_obj_campo_1.focus(); // coloca em foco
			
			vg_bln_resultado = false;
		}
	}
	return vg_bln_resultado; // retorna o resultado
}

/*
 *	Eu num vo explicar nada naum.. se vc num entender isso ai de baixo vai 
 * estudar js q vc num sabe nada.... seu burro
 * POR RENATO MEDINA 09/2006
*/
function fg_bln_validar_acao(e)
{
	if(confirm("Tem certeza que deseja executar essa ação?"))
		return true;
	else
		return cancelEvent(e);
}

/**
 * function mask(_mask, val)
 *
 * _mask = Mascara Exemplo: ##/##/#### ou ###.###.###-##
 * val   = Valor a ser formatado.
 *
 * Formata um valor  para a mascara definida.
 *
 */
function mask(_mask, val, maximo) {
	var i, mki;
	var aux="";
	for(i=mki=0; i<val.length; i++, mki++) {
                        if(_mask.charAt(mki)=='' || _mask.charAt(mki)=='#' || _mask.charAt(i)==val.charAt(i)) {
                                aux+=val.charAt(i);
                        } else {
                                aux+=_mask.charAt(mki)+val.charAt(i);
                                mki++;
                        }
                }
	return aux;
}

/**
 * function fg_bln_format(field, _mask, event)
 *
 * field = Objeto que esta enviando o evendo onKeyPress()
 * _mask = Mascara Exemplo: ##/##/#### ou ###.###.###-##
 * event = Evento a ser observado.
 *
 * Formata um valor para a mascara definida conforma o valor vai sendo digitado.
 *
 */
function fg_bln_formata(e) {
	var field = getSource(e); // campo
	var _mask = field.title; // mascara
	var maximo = parseInt(field.title.length); // tamanho maximo para exibicao 
	var strCheck = '0123456789';
	var rcode = getKeyCode(e);
	var aux = '';

	if(rcode < 20)
		return true;
	
	if(rcode == 9)
		field.form[(getIndex(field)+1) % field.form.length].focus();

	key=String.fromCharCode(rcode);

	if(strCheck.indexOf(key)==-1)
		return cancelEvent(e);

	if(field.value.length < maximo)
		aux = field.value+key;
	else
		return cancelEvent(e);

	aux = mask(_mask,aux,maximo);
	field.value = aux;

	return cancelEvent(e);
}

/**
 * Função fg_bln_validar_data
 *
 * Checa se o valor de um campo é uma data escrita no formato DD/MM/AAAA. Caso não seja, avisa o usuário e seta o foco naquele campo.
 * Como opcional, também pode checar se o campo é obrigatório. Verifica dias de acordo com meses e se o ano é bissexto para o dia mes.
 * Os parâmetros passados são:
 * vl_obj_campo_formulario 	=> Campo do formulario para checagem. Ex.: form1.field1
 * vl_str_titulo_campo 		=> Nome do campo na interface para o retorno da função. Ex.: "Data"
 * vl_bln_obrigatorio 		=> Diz se o campo também é obrigatório ou não.
 * bissexto			 		=> Variavel do bissexto, determina o dia de fevereiro. 
 *
 * @access public
 * @author Gianfranco Zucoloto <zucoloto@casetecnologia.com.br>
 * @copyright Copyright&copy; 2003, CASE Tecnologia
 * @param object vl_obj_campo_formulario Campo do formulario html a ser checado. Ex.: form1.field1
 * @param string vl_str_titulo_campo Título do campo na interface para o retorno da função. Ex.: "Data"
 * @param boolean vl_bln_obrigatorio True para campo obrigatorio e False para opcional
 * @param string vg_str_resultado Caso haja erro ele é preenchido e cria mensagem de retorno.
 * @version 0.1
 * @uses function fg_bln_validar_obrigatorio
 * @return boolean Retorna true caso o campo esteja preenchido e válido. Senão, um popup o avisará.
 * @todo
 */
function fg_bln_validar_data(vl_obj_campo_formulario,vl_str_titulo_campo,vl_bln_obrigatorio)
{
	var vg_bln_resultado = true;
	var vg_str_resultado = false;
	var bissexto;
	
	if (vl_bln_obrigatorio)
	{
		if (!fg_bln_validar_obrigatorio(vl_obj_campo_formulario,vl_str_titulo_campo))
			vg_bln_resultado = false;
	}
	
	if (vl_bln_obrigatorio==true && vg_bln_resultado==true)
	{
		var elems = vl_obj_campo_formulario.value;
	
		if (elems.length == 10)
		{
			elems = elems.split('/');
			
			var day = parseInt(elems[0],10);
			var month = parseInt(elems[1],10);
			var year = parseInt(elems[2],10);
			bissexto=(((year%4)==0&&(year%100)!=0)||(year%400)==0)?29:28; // data fevereiro
	
			if(month==4 || month==6 || month==9 || month==11)
			{
				if(day>30)
					vg_str_resultado = 'Data inválida. Verifique os valores digitados.';
			}
			// caso fevereiro
			if(month==02 && day>bissexto)
				vg_str_resultado = 'Data inválida para o mes de fevereiro, digite até 28.';
			
			// caso uma data inválida
			if(month>12 || day>31 || month<1 || day<1)
				vg_str_resultado = 'Data inválida. Verifique os valores digitados.';	
		}
		else
		{
			vg_str_resultado = 'Data inválida. Preencha no formato dd/mm/aaaa.';
		}	  
		
		if (!vl_bln_obrigatorio && vl_obj_campo_formulario.value == "") 
		{ 
			vg_bln_resultado = true;
		}
	
		if (vg_str_resultado)
		{
			alert(vg_str_resultado);
			vl_obj_campo_formulario.focus();
			vg_bln_resultado = false;
		}
		else
			vg_bln_resultado = true;
	}
	
	return vg_bln_resultado;
}

// function soNumsInt
// Função que permite apenas teclas numéricas
// Se o código for menor que 20 é porque deve ser caracteres de controle
// ex.: <ENTER>, <TAB>, <BACKSPACE> portanto devemos permitir
// as teclas numéricas vão de 48 a 57
function soNumsInt(e)
{       
	var field = getSource(e); // campo
	var aux = '';
	
	var rcode = getKeyCode(e);
	key=String.fromCharCode(rcode);

	if (rcode <20 || (rcode >47 && rcode<58))
		aux = field.value+key;
	else
		return cancelEvent(e);
} 

// function soNumsInt
// Função que permite apenas teclas numéricas e 
// todos os caracteres que estiverem na lista
// de argumentos.
// Se o código for menor que 20 é porque deve ser caracteres de controle
// ex.: <ENTER>, <TAB>, <BACKSPACE> portanto devemos permitir
// as teclas numéricas vão de 48 a 57
function soNumsFlt(e)
{       
	var field = getSource(e); // campo
	var args = ',.';
	var aux = '';
	
	var rcode = getKeyCode(e);
	key=String.fromCharCode(rcode);

	if (rcode <20 || (rcode >47 && rcode<58) || (args.indexOf(key)>-1 ) )
		aux = field.value+key;
	else
		return cancelEvent(e);
} 

function replace(argvalue, x, y) {

  if ((x == y) || (parseInt(y.indexOf(x)) > -1)) {
    errmessage = "replace function error: \n";
    errmessage += "Second argument and third argument could be the same ";
    errmessage += "or third argument contains second argument.\n";
    errmessage += "This will create an infinite loop as it's replaced globally.";
    alert(errmessage);
    return false;
  }

  while (argvalue.indexOf(x) != -1) {
    var leading = argvalue.substring(0, argvalue.indexOf(x));
    var trailing = argvalue.substring(argvalue.indexOf(x) + x.length,
	argvalue.length);
    argvalue = leading + y + trailing;
  }

  return argvalue;
}

/**
 * Checa o(s) dígito(s) verificador(es) de um número passado como parâmero.
 *
 * A função checa os dígitos verificadores através do algorítmo de módulo de 11.
 * Funciona para CPF, CNPJ, e outros.
 * O primeiro parâmetro deve ser uma string contendo o número, um traço, e o(s) dígito(s) verificador(es).
 * O segundo parâmetro indica o tipo de multiplicador utilizado no algorítmo (cíclico ou linear). Utilizar cíclico para CNPJ e linear para CPF.
 * Exemplo: "1234-39"
 *
 * @access private
 * @author Felipe Martino Gagno Ceotto <felipe@casetecnologia.com.br>
 * @copyright Copyright&copy; 2003, CASE Tecnologia
 * @version 0.1
 * @param string vl_str_valor Número contendo o(s) dígito(s) verificador(es) separados do próprio por um traço. Exemplo: "1234-39".
 * @param boolean vl_bln_ciclico Indica se o algorítmo utilizado deve usar multiplicadores cíclicos (CNPJ) ou não (CPF).
 * @return boolean Retorna true se os dígitos verificadores estiverem corretos, ou false se estiverem incorretos.
 * @todo
 */
function fl_bln_checa_dv(vl_str_valor, vl_bln_ciclico)
{
	var vl_bln_resultado = true;

	// Separa os dígitos verificadores do número propriamente dito.
	// var elems_inicio = vl_str_valor.split("/");
	var vla_str_valor = vl_str_valor.split("-");

	if (vla_str_valor[1].length != 2)
	{
		vl_bln_resultado = false;
	}
	else
	{
		vl_bln_resultado = true;
		var vl_int_num_dvs = vla_str_valor[1].length;
		var vl_str_digitos;
		var vl_int_num_digitos;
		var vl_int_multiplicador;
		var vl_int_soma;
		var vl_int_i2;
		for (var vl_int_i1 = 0; vl_int_i1 < vl_int_num_dvs; vl_int_i1++)
		{
			vl_str_digitos = vla_str_valor[0] + vla_str_valor[1].substring(0, vl_int_i1);
			vl_int_num_digitos = vl_str_digitos.length;
			vl_int_multiplicador = vl_int_num_digitos + 1;
			// Checa se é necessário acertar o multiplicador, no caso de números com mais de 8 dígitos no algorítmo cíclico.
			if ((vl_bln_ciclico) && (vl_int_multiplicador > 9))
			{
				vl_int_multiplicador = (vl_int_multiplicador % 10) + 2;
			}
			vl_int_soma = 0;
			for (vl_int_i2 = 0; vl_int_i2 < vl_int_num_digitos; vl_int_i2++)
			{
				vl_int_soma += (vl_str_digitos.substring(vl_int_i2, (vl_int_i2 + 1)) * vl_int_multiplicador);
				vl_int_multiplicador--;
				// Checa se é necessário acertar o multiplicador, no caso de números com mais de 8 dígitos.
				if ((vl_bln_ciclico) && (vl_int_multiplicador < 2))
				{
					vl_int_multiplicador = 9;
				}
			}
			vl_int_dv = 11 - (vl_int_soma % 11);
			if (vl_int_dv > 9)
			{
				vl_int_dv = 0;
			}
			if (vl_int_dv != vla_str_valor[1].substring(vl_int_i1, (vl_int_i1 + 1)))
			{
				vl_bln_resultado = false;
			}
		}
	}
	return vl_bln_resultado;
}

/**
 * Função fg_bln_seleciona_checkboxs (em desuso... utilize a selecionaCheckboxs)
 *
 * (Des)Marca os campos checkbox, de uma lista
 * O parâmetro a ser passado é:
 * vl_obj_campo_formulario => Caminho do campo a ser marcado
 *
 * O if serve para quando apenas existe uma opção no length e o js considera como um único arquivo
 * caso contrário, execulta o loop no array de arquivos
 * @access public
 * @author Renato Medina <medinadato@hotmail.com>
 * @version 0.1
 * @marca como selecionado ou nao os campos (busca por id).
 * @todo
 */

function fg_bln_seleciona_checkboxs(nome_campo) {

	var vl_obj_campo_formulario = $name(nome_campo);
	
	if(vl_obj_campo_formulario.length==null)
	{	
		if(vl_obj_campo_formulario.checked==true)
			vl_obj_campo_formulario.checked=false;
		else
			vl_obj_campo_formulario.checked=true;
	}
	
	for(var i=0; i<vl_obj_campo_formulario.length; i++)
	{
		if(vl_obj_campo_formulario[i].checked==true)
			vl_obj_campo_formulario[i].checked=false;
		else
			vl_obj_campo_formulario[i].checked=true;
	} 
}

/**
 * Função selecionaCheckboxs (substituiu a fg_bln_seleciona_checkboxs)
 *
 * (Des)Marca os campos checkbox, de uma lista
 * O parâmetro a ser passado é:
 * nome campo => nome do campo sem cochetes []
 *
 * @author Renato Medina <medinadato@hotmail.com>
*/

function selecionaCheckboxs(nome_campo) {

	var inputs = $tags('input'); // pego todos os inputs do documento
	
	// loop nos campos
	for(var i=0; i<inputs.length; i++) {
    // verifico se é um input do campo em questao
    if(inputs[i].name.indexOf(nome_campo) != -1) {
   		if(inputs[i].checked==true)	inputs[i].checked = false; // desmarco
    	else inputs[i].checked = true; // marco
  	}
  } // fim for 
}

/*
* catado na net por Renato Medina 09/11/2006
* FormatoMoeda(d)
* d - valor a ser convertido
*/
function FormatoMoeda(d) {
	if(typeof(d) == "string" && d == "")
		return "";

	if(d == null)
		return "";
		
    if(typeof(d) == "string" && d.indexOf(',') > 0)
		return d;

    var neg = d < 0.00;
    d = d < 0.0 ? -d : d;
    var c = d + "";
    
    var index = c.indexOf('.');
    var cInt = index >  0 ? c.substring(0, index)  : c; 
    var cDec = index >= 0 ? c.substring(index + 1) : "00";

    var cInt2 = "";
    var count = 0;
    for(i = cInt.length - 1; i >= 0; i--) {
        count++;
        if(count == 4) {
            count = 1;
            cInt2 = cInt.charAt(i) + (i != cInt.length ? "." : "") + cInt2;
        }
        else
            cInt2 = cInt.charAt(i) + cInt2;
    }
    
    if(cDec.length == 1)
        cDec += "0";
    if(cDec.length > 2)
        cDec = cDec.substring(0, 2);

    return (neg ? "-" : "") + cInt2 + "," + cDec;
}

// ABRE UMA POPUP CENTRALIZADA - IE 4+, NS 4+
// openPopup(event, 'about:mozilla', 'POP_NAME', 400, 300, 1, 0 );
function abrePopup(e) {
	
	var key = getSource(e);
	
	// conf padrao para centralizar janela
	iLeft = ( screen.width - 500 ) / 2;
	iTop = ( screen.height - 550 ) / 2;
	
	window.open(key.href, 
	'ajuda', 
	'location=no, toolbar=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=450,height=550,top='+iTop+',left='+iLeft);

	return cancelEvent(e);
}

// gera impressao da pg atal
function fg_bln_imprimir(e) {
	window.print();
	return cancelEvent(e);
}

function g_bln_valida_campos(campos,avisos) {
	// variaveis
	var retorno = ""; var temp = "";

	// loop para montar retorno
	for(var i=0; i<campos.length; i++) {
		temp = '<li id="erro"><strong>Campo '+$id(campos[i]).alt+':</strong> '+avisos[i];
		// coloca apenas um fechamento
		if(i == 0) temp = temp+'<img src="../imagens/icon_fechar.gif" alt="fechar" id="fechar"></li>';	else temp = temp+'</li>'; 
		retorno = retorno+temp;
	}
	$id('alertas').innerHTML = retorno;
}

/*
 * funcao g_bln_valida_acao_sobre_checkbox (em desuso. utilize a verificaCheckboxs)
 * pega o nome do campo em questao (checkbox) e verifica se algum esta selecionado
 * caso haja algum selecionado retorna true
 * caso contrario retorna false
 * @access public
 * @author Renato Medina <medinadato@hotmail.com>
 * @data 10/04/2007
*/
function g_bln_valida_acao_sobre_checkbox(nome_campo) {

	var vl_obj_campo_formulario = $name(nome_campo);
	var checado = false;
 
	if(vl_obj_campo_formulario.length==null) {	
		if(vl_obj_campo_formulario.checked==true)
			checado = true;
	}
	else {
		for(var i=0; i<vl_obj_campo_formulario.length; i++) {
			if(vl_obj_campo_formulario[i].checked==true)
				checado = true;
		} 
	}
	if(checado == true)
		return true;
	else
		return false;
}

/*
 * funcao verificaCheckboxs (substituindo a g_bln_valida_acao_sobre_checkbox)
 * pega o nome do campo em questao (checkbox) e verifica se algum esta selecionado (utilizar nome sem colchetes [])
 * caso haja algum selecionado retorna true
 * caso contrario retorna false
 * @access public
 * @author Renato Medina <medinadato@hotmail.com>
 * @data 15/04/2008
*/
function verificaCheckboxs(nome_campo) {
  // pego todos os inputs do documento
	var inputs = $tags('input'); 
	
	// variavel booleana
	var checado = false;
	
	// loop nos campos
	for(var i=0; i<inputs.length; i++) {
    // verifico se é um input do campo em questao
    if(inputs[i].name.indexOf(nome_campo) != -1) {
   		if(inputs[i].checked == true)	checado = true; // ha checados
  	}
  } // fim for 

	if(checado == true)	return true; // caso algum checado
	else	return false;
}

/**
 * Função fg_bln_seleciona_cleckboxs
 *
 * (Des)Marca os campos checkbox, de uma lista
 * O parâmetro a ser passado é:
 * vl_obj_campo_formulario => Caminho do campo a ser marcado
 *
 * O if serve para quando apenas existe uma opção no length e o js considera como um único arquivo
 * caso contrário, execulta o loop no array de arquivos
 * @access public
 * @author Renato Medina <medinadato@hotmail.com>
 * @version 0.1
 * @marca como selecionado ou nao os campos (busca por id).
 * @todo
 */

function fg_bln_seleciona_cleckboxs(vl_obj_campo_formulario)
{
	if(vl_obj_campo_formulario.length==null)
	{	
		if(vl_obj_campo_formulario.checked==true)
			vl_obj_campo_formulario.checked=false;
		else
			vl_obj_campo_formulario.checked=true;
	}
	
	for(var i=0; i<vl_obj_campo_formulario.length; i++)
	{
		if(vl_obj_campo_formulario[i].checked==true)
			vl_obj_campo_formulario[i].checked=false;
		else
			vl_obj_campo_formulario[i].checked=true;
	} 
}

/** 
 * Função fg_bln_verifica_vazio
 *
 * Checa se um campo possui algum valor. Caso não possua, apenas retorna false.
 * Os parâmetros passados são:
 * vl_obj_campo_formulario               => Campo do formulario para checagem. Ex.: form1.field1
 *
 * @access public
 * @author Gianfranco Zucoloto <zucoloto@casetecnologia.com.br>
 * @copyright Copyright&copy; 2003, CASE Tecnologia
 * @param object vl_obj_campo_formulario Campo do formulario html a ser checado. Ex.: form1.field1
 * @version 0.1
 * @return boolean Retorna true caso o campo esteja preenchido. Senão, retorna false
 * @todo
 */

function fg_bln_verifica_vazio(vl_obj_campo_formulario)
{
	var vg_bln_resultado = true;
	
		if (strtrim(vl_obj_campo_formulario.value) == "")
			vg_bln_resultado = false;

	return vg_bln_resultado;
}

/**
 * Função fg_bln_valida_checkbox
 *
 * Verifica se determinados checkbox possuem ao menos um de seus campos selecionados.
 * O parâmetro a ser passado é:
 * vl_obj_campo_formulario => Caminho do campo a ser marcado
 * vl_str_titulo_campo     => Nome do campo na interface para o retorno da função. Ex.: "Nome"
 * @access public
 * @author Renato Medina <medinadato@hotmail.com>
 * @version 0.1
 * @marca como selecionado ou nao os campos (busca por id).
 * @todo
 */
function fg_bln_valida_checkbox(vl_obj_campo_formulario,vl_str_titulo_campo)
{
	if(vl_obj_campo_formulario.length==null)
	{	
		if(vl_obj_campo_formulario.checked==false)
		{
			alert('Selecione ao menos um(a) '+vl_str_titulo_campo+'!');
			return false;
		}
		else
			return true;
	}
	else
	{
		var novo = 0;
		for(var i=0; i<vl_obj_campo_formulario.length; i++)
		{
			if(vl_obj_campo_formulario[i].checked==true)
				novo+=1;
			else
				continue;
		} 
		if(novo==0)
		{	
			alert('Selecione ao menos um(a) '+vl_str_titulo_campo+'!');
			return false;
		}
		else
			return true;
	}
}

// ############################### CPFs e CNPJs ###############################
/**
 * @author Márcio d'Ávila
 * @version 1.02, 2004-2007
 *
 * Este script foi retirado de:
 * http://www.mhavila.com.br/topicos/web/cpf_cnpj.html
 *
 * Licenciado sob os termos da licença Creative Commons,
 * Atribuição - Compartilhamento pela mesma licença 2.5:
 * http://creativecommons.org/licenses/by-sa/2.5/br/
 * Qualquer outra forma de uso requer autorização expressa do autor.
 *
 * PROTÓTIPOS:
 * método String.lpad(int pSize, char pCharPad)
 * método String.trim()
 *
 * String unformatNumber(String pNum)
 * String formatCpfCnpj(String pCpfCnpj, boolean pUseSepar, boolean pIsCnpj)
 * String dvCpfCnpj(String pEfetivo, boolean pIsCnpj)
 * boolean isCpf(String pCpf)
 * boolean isCnpj(String pCnpj)
 * boolean isCpfCnpj(String pCpfCnpj)
 */


NUM_DIGITOS_CPF  = 11;
NUM_DIGITOS_CNPJ = 14;
NUM_DGT_CNPJ_BASE = 8;


/**
 * Adiciona método lpad() à classe String.
 * Preenche a String à esquerda com o caractere fornecido,
 * até que ela atinja o tamanho especificado.
 */
String.prototype.lpad = function(pSize, pCharPad)
{
	var str = this;
	var dif = pSize - str.length;
	var ch = String(pCharPad).charAt(0);
	for (; dif>0; dif--) str = ch + str;
	return (str);
} //String.lpad


/**
 * Adiciona método trim() à classe String.
 * Elimina brancos no início e fim da String.
 */
String.prototype.trim = function()
{
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
} //String.trim


/**
 * Elimina caracteres de formatação e zeros à esquerda da string
 * de número fornecida.
 * @param String pNum
 * 	String de número fornecida para ser desformatada.
 * @return String de número desformatada.
 */
function unformatNumber(pNum)
{
	return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
} //unformatNumber


/**
 * Formata a string fornecida como CNPJ ou CPF, adicionando zeros
 * à esquerda se necessário e caracteres separadores, conforme solicitado.
 * @param String pCpfCnpj
 * 	String fornecida para ser formatada.
 * @param boolean pUseSepar
 * 	Indica se devem ser usados caracteres separadores (. - /).
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String de CPF ou CNPJ devidamente formatada.
 */
function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	if (pUseSepar==null) pUseSepar = true;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var numero = unformatNumber(pCpfCnpj);

	numero = numero.lpad(maxDigitos, '0');
	if (!pUseSepar) return numero;

	if (pIsCnpj)
	{
		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
		numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5");
	}
	else
	{
		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
		numero = numero.replace(reCpf, "$1.$2.$3-$4");
	}
	return numero;
} //formatCpfCnpj


/**
 * Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de
 * CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e
 * informa se o número-efetivo fornecido é CNPJ (default = false).
 * @param String pEfetivo
 * 	String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF.
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é de um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String com os dois dígitos verificadores.
 */
function dvCpfCnpj(pEfetivo, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	var i, j, k, soma, dv;
	var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITOS_CPF;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var calculado = formatCpfCnpj(pEfetivo, false, pIsCnpj);
	calculado = calculado.substring(2, maxDigitos);
	var result = "";

	for (j = 1; j <= 2; j++)
	{
		k = 2;
		soma = 0;
		for (i = calculado.length-1; i >= 0; i--)
		{
			soma += (calculado.charAt(i) - '0') * k;
			k = (k-1) % cicloPeso + 2;
		}
		dv = 11 - soma % 11;
		if (dv > 9) dv = 0;
		calculado += dv;
		result += dv
	}

	return result;
} //dvCpfCnpj


/**
 * Testa se a String pCpf fornecida é um CPF válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpf
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF válido.
 */
function isCpf(campoCpf)
{
  var pCpf = campoCpf.value;
	var numero = formatCpfCnpj(pCpf, false, false);
	var base = numero.substring(0, numero.length - 2);
	var digitos = dvCpfCnpj(base, false);
	var algUnico, i;

	// Valida dígitos verificadores
	if (numero != base + digitos) return false;

	/* Não serão considerados válidos os seguintes CPF:
	 * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44,
	 * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
	 */
	algUnico = true;
	for (i=1; algUnico && i<NUM_DIGITOS_CPF; i++)
	{
		algUnico = (numero.charAt(i-1) == numero.charAt(i));
	}
	return (!algUnico);
} //isCpf


/**
 * Testa se a String pCnpj fornecida é um CNPJ válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCnpj
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CNPJ válido.
 */
function isCnpj(campoCnpj)
{
  var pCnpj = campoCnpj.value;
	var numero = formatCpfCnpj(pCnpj, false, true);
	var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
	var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
	var digitos = dvCpfCnpj(base + ordem, true);
	var algUnico;

	// Valida dígitos verificadores
	if (numero != base + ordem + digitos) return false;

	/* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS:
	 * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555,
	 * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
	 */
	algUnico = numero.charAt(0) != '0';
	for (i=1; algUnico && i<NUM_DGT_CNPJ_BASE; i++)
	{
		algUnico = (numero.charAt(i-1) == numero.charAt(i));
	}
	if (algUnico) return false;

	/* Não será considerado válido CNPJ com número de ORDEM igual a 0000.
	 * Não será considerado válido CNPJ com número de ORDEM maior do que 0300
	 * e com as três primeiras posições do número BÁSICO com 000 (zeros).
	 * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
	 */
	if (ordem == "0000") return false;
	return (base == "00000000"
		|| parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000");
} //isCnpj


/**
 * Testa se a String pCpfCnpj fornecida é um CPF ou CNPJ válido.
 * Se a String tiver uma quantidade de dígitos igual ou inferior
 * a 11, valida como CPF. Se for maior que 11, valida como CNPJ.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpfCnpj
 * @tituloCampo
 * @blnObrigatorio  
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF ou CNPJ válido.
 */
function isCpfCnpj(campoCpfCnpj, tituloCampo)
{
  var blnResultado = true;
  
  // verifico se foi enviado, caso n ja dou como falso
  if(!fg_bln_validar_obrigatorio(campoCpfCnpj, tituloCampo))
  {
  	blnResultado = false;
  }
  
  // caso seja obrigatorio e tenha valor no campo	
  if(true == blnResultado)
  {
  	var numero = campoCpfCnpj.value.replace(/\D/g, "");
  	if (numero.length > NUM_DIGITOS_CPF)
  	{
  		blnResultado = isCnpj(campoCpfCnpj)
  		// alerta em caso de erro
  		if((blnResultado == false)) 
  		  alert('CNPJ inválido! Digite Novamente');
  	}
  	else
  	{
  		blnResultado = isCpf(campoCpfCnpj);
  		// alerta em caso de erro
  		if((blnResultado == false)) 
  		  alert('CPF inválido! Digite Novamente');
  	}
	}	
	
	return blnResultado;
} // isCpfCnpj

/*
	function bloqueia_acoes_tags_submeter
	cancela todo tipo de click sobre a tag em questao
	author: Renato Medina
	date: 30/05/2007
*/
function bloqueia_acoes_tags_submeter() {
  try {
  	var tags = $tags('input');
  	for(var i=0; i<tags.length; i++) {
  		if(tags[i].type == 'submit')
  			addEvent(tags[i], "click", tb_show_block);
  	}
  	
  	var tags = $tags('a');
  	for(var i=0; i<tags.length; i++) {
  
  		if(tags[i].title == 'submit')
  			addEvent(tags[i], "click", tb_show_block);
  	}
	} catch(e) { }
}

/***********************************************
* Cool DHTML tooltip script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code

* alterado: 01/06/2007 - por renato medina
* movimenta caixas de texto de acordo com a movimentacao do mouse
***********************************************/
var offsetxpoint=-60 //Customize x offset of tooltip
var offsetypoint=20 //Customize y offset of tooltip
var ie=document.all
var ns6=document.getElementById && !document.all
var enabletip=false

function ietruebody(){
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
}

function ddrivetip(e){
	var key = getSource(e);
	var tipobj = key.childNodes[1];
	
	try { 
		tipobj.style.visibility='visible';
		tipobj.style.display='block';
	}
	catch(i) { }
	enabletip=true
	return false
}

function positiontip(e){	
	var key = getSource(e);
	
	if(document.all) {
		x = e.clientX;
		y = e.clientY;
	} else {
		x = e.pageX;
		y = e.pageY;
	}
	
	if (enabletip) {		
		var divs = $tags('span');
		for(var i=0; i<divs.length; i++) {
			if(divs[i].className == 'comentarios') {
				var tipobj = divs[i].childNodes[1];
				tipobj.style.left = x;	tipobj.style.top = y;
				
				var curX=x;	var curY=y;
				
				//Find out how close the mouse is to the corner of the window
				var rightedge=ie&&!window.opera? ietruebody().clientWidth-x-offsetxpoint : window.innerWidth-x-offsetxpoint-20;
				var bottomedge=ie&&!window.opera? ietruebody().clientHeight-y-offsetypoint : window.innerHeight-y-offsetypoint-20;
				
				var leftedge=(offsetxpoint<0)? offsetxpoint*(-1) : -1000;
				
				//if the horizontal distance isn't enough to accomodate the width of the context menu
				if (rightedge<tipobj.offsetWidth) //move the horizontal position of the menu to the left by it's width
					tipobj.style.left=ie? ietruebody().scrollLeft+x-tipobj.offsetWidth+"px" : window.pageXOffset+x-tipobj.offsetWidth+"px"
				else if (curX<leftedge)
					tipobj.style.left="5px";
				else //position the horizontal position of the menu where the mouse is positioned
					tipobj.style.left=curX+offsetxpoint+"px";
/*
//	tem q corrigir esse trecho para que a caixa suba ao estar colado na tela em baixo
				//same concept with the vertical position
				if (bottomedge<tipobj.offsetHeight)
					tipobj.style.top=ie? ietruebody().scrollTop+y-tipobj.offsetHeight-offsetypoint+"px" : window.pageYOffset+y-tipobj.offsetHeight-offsetypoint+"px"
				else
					tipobj.style.top=curY+offsetypoint+"px";
*/
			}
		}
	}
}

function hideddrivetip(e){
	var key = getSource(e);
	var tipobj = key.childNodes[1];
	
	enabletip=false
	try { tipobj.style.visibility="hidden"; }
	catch(e) { }
}

// adaptacao de Renato Medina
function fg_bln_inicia_tooltip(e) {
	var divs = $tags('span');
	for(var i=0; i<divs.length; i++) {
		if(divs[i].className == 'comentarios') {
			addEvent(divs[i], "mouseover", ddrivetip);
			addEvent(divs[i], "mouseout", hideddrivetip);
		}
	}
	addEvent(window.document, "mousemove", positiontip);
}

/***********************************************
* End Cool DHTML tooltip script
***********************************************/

/*
	exibe ou oculta determinado elemento
	checkbox: name="oculta_exibe"
	target: id="oculta_exibe[1]"
*/ 
function oculta_exibe(e) {
	var campo = $id('oculta_exibe'); // campo clicado

	if(campo.checked == true)
		$id('oculta_exibe[1]').style.visibility = 'visible';
	else
		$id('oculta_exibe[1]').style.visibility = 'hidden';
}

/* 
	Encontra o segmento entre os valores
	i: elemento inicial
	f: elemento final
	sttr: string da busca
*/
function strSegmento(i,f,str)
{
	i = str.indexOf(i)+1;
	f = str.lastIndexOf(f);
	return str.substring(i,f);
}	 

/*
  autor: RENATO MEDINA 16/01/2008
  exibe e oculta abas
*/
function fg_exibe_oculta_fieldset(index)
{
  try {
    var fieldsets = $name('fieldset'); // array de fieldsets   
        
    if(index == null) index = 0; // caso n envie o index o primeiro q conta
    
    for(var i=0; i<fieldsets.length; i++)
    {
      if(index == i) // torna visivel
        fieldsets[i].style.display = 'block';
      else // oculta
        fieldsets[i].style.display = 'none';
    }  
    
    // altera a classe do li
    var abas = $id('fieldset_abas').childNodes; // pego os topicos
    var cont = 0;

    for(var i=0; i<abas.length; i++) // loop para pegar somente as li
    {
      if(abas[i].tagName == 'LI') {
        if(index == cont)
        {
          abas[i].className = 'selecionado';
        }
        else
          abas[i].className = '';
        cont = cont+1; // incremento
      } // fim if
    } // fim for
  } catch(e) {}
}

/*
  autor: RENATO MEDINA 16/01/2008
  faz a troca de abas a serem exibidas
*/ 
function fg_inicia_abas_fieldset()
{
  try {
    var abas = $id('fieldset_abas').childNodes; // pego os topicos
    var cont = 0;
    
    for(var i=0; i<abas.length; i++) // loop para pegar somente as li
    {
      if(abas[i].tagName == 'LI') {
        var arg = new Array;  arg[0] = cont; // monto argumetos
        addEvent(abas[i], "click", fg_exibe_oculta_fieldset, true, arg);
        cont = cont+1; // incremento
      }
    }
  } catch(e) { }
}

/* 
  funcao que verifica ql dos campos radio esta selecionado, 
  retorna o valor do selecionado
*/
function fg_str_busca_valor_radio(campo) {
  try {
    for(var i=0; i<$name(campo).length; i++) {
      if($name(campo)[i].checked == true) 
        return $name(campo)[i].value;
    }
  } catch(e) { }
}

// torno visivel campos de id tal
function exibeCamposOcultos(idCampo) {
  $id(idCampo).style.display = 'table';
}

/*
 * funcao de busca de valores de determinado atributo nem arrajo de URL
 * param: array contendo valores ('atributo=valor')
 * param: nome do atributo
 * author: Renato Medina
*/
function retornaValorAtributoUrl(arranjo, valorCampo)
{        
  var bln = false; // validacao
  
  // loop para resgatar o dado
  for(var j=(arranjo.length-1); j>=0; j--)
  {
    // crio array atributo/valor
    var atributos = arranjo[j].split('=');
    // retorno valor especifico
    if(atributos[0] == valorCampo) {
      bln = true; // valido busca
      return atributos[1]; // retorno valor
    }
  }
  if(bln == false) return false;
}

// inicializacao padrao para todas as pgs
function inicializar_padrao()
{ 
	// botao fechar
	if(null != $id("fechar"))	addEvent($id("fechar"), "click", fecharAviso);

	// array com botoes excluir/imprimir
	$l_arr_links = $tags('a');
	for(var i=0; i<$l_arr_links.length ; i++)
	{
		if($l_arr_links[i].title == 'excluir')
			addEvent($l_arr_links[i], "click", fg_bln_validar_acao); // ao clicar excluir pede confirmacao
			
    else if($l_arr_links[i].title == 'validar')
			addEvent($l_arr_links[i], "click", fg_bln_validar_acao); // ao clicar pede confirmacao
			
		else if($l_arr_links[i].title == 'Imprimir')	// array com botoes imprimir
			addEvent($l_arr_links[i], "click", fg_bln_imprimir); // ao clicar print
	
	  // busca todos os links de classe formbox  
		if($l_arr_links[i].className == 'formbox') {

		   var url = $l_arr_links[i].href;
		   
		   // pego o codigo de tb_inline
  	   if(url.indexOf("#") !== -1){ 
  			 baseURL = url.substr(url.indexOf("#"), url.length);
  	   }else{ 
  	   	 baseURL = url;
  	   }
  	  
  	   // pego somente o codigo com informacoes de configuracoes
  	   url = baseURL.substr((baseURL.indexOf("?")+1), baseURL.length);
		    
		   // array com infos
		   var dados = url.split('&');
       
       // caso encontre valor
       var inlineId = retornaValorAtributoUrl(dados, 'inlineId'); 
       if(inlineId !== false)
       {
          // altero propriedades caso solicitado          
          var height = retornaValorAtributoUrl(dados, 'height');
          if(height !== false) { $id(inlineId).style.height = height+'px'; }
        
          var width = retornaValorAtributoUrl(dados, 'width');
          if(width !== false) { $id(inlineId).style.width = width+'px'; }
          
          // crio array para post
          var args = new Array;
          args[0] = inlineId; // id da inline
              
          addEvent($l_arr_links[i], 'click', exibeCamposOcultos, true, args);
       }
    }
  }

	
	// array com botoes excluir/imprimir
	$l_arr_tags = $tags('input');
	for(var i=0; i<$l_arr_tags.length ; i++)
	{
		if($l_arr_tags[i].title == 'excluir')
			addEvent($l_arr_tags[i], "click", fg_bln_validar_acao); // ao clicar excluir pede confirmacao
	}

	// loop para divs 
	$l_arr_tags = $tags('div');
	for(var i=0; i<$l_arr_tags.length ; i++)
	{
		if($l_arr_tags[i].className == 'camposOcultos')
			$l_arr_tags[i].innerHTML = '<p style="text-align:right; padding:3px; background:#EFEBEF;"><a href="#" onclick="$tags(\'div\')['+i+'].style.display=\'none\'">X Fechar</a></p>'+$l_arr_tags[i].innerHTML;
	}
	
	// botao ajuda
	if(null != $id("ajuda")) {
		addEvent($id("ajuda"), "click", abrePopup);
	}
	
	// trava acoes apos submissoes e clicks em urls
	bloqueia_acoes_tags_submeter();
	
	// inicia tooltip
	fg_bln_inicia_tooltip();
	
  // inicio de abas
	fg_inicia_abas_fieldset(); // inicia as abas
	fg_exibe_oculta_fieldset(); // inicializa o ocultar e exibir de abas 
}

// o paramentro deve ser enviado como string, dentro de aspas
function converteMoedaEua(d) {
  if(typeof(d) == "string") {
    d = d.replace('.','');
    if(d.indexOf(',') > 0) { // caso haja virgula    
      d = d.replace(',','.'); // caso seja fracao
    }
    else { // adiciono casas decimais
      d = d+'.00';
    }
  }
  return parseFloat(d);
}

/*
* function converteParaDecimal
* author: Renato Medina
* data: 20/03/2008
* funcao funciona como o parseFloat.. mas ao invez de retornar NaN retorna 0 em conversoes
*/	
function converteParaDecimal(valor) {
  valor = parseFloat(valor);
  // caso n seja um numero valido é 0
  if(valor == NaN) valor = 0;
  
  return valor;
}

function g_str_inverte_data(l_obj_campo_formulario)
{
  var elems = l_obj_campo_formulario.value;
	if (elems.length == 10)
	{
      elems = elems.split('/');
			
			var day = elems[0];
			var month = elems[1];
			var year = elems[2];
			
			return year+'/'+month+'/'+day;
  }
  else
  {
    return '';
  }
}

addEvent(window, "load", inicializar_padrao); // inicializa os eventos da pag ao ser carregada

