BACKSPACE_KEY    = 8;
TAB_KEY          = 9;
ENTER            = 13;
ESC              = 27;
DELETE_KEY       = 46;
ZERO_KEY         = 48;
NINE_KEY         = 57;
F1_KEY           = 112;
F12_KEY          = 123;

var VALID_NUMERIC_KEYS    = new Array(8, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57);
var VALID_NAVIGATION_KEYS = new Array(8, 9, 13, 27, 46);


function is_valid_numeric(e)
{
  
  if (!e)
    var e = window.event;
  if (e.keyCode){
    code = e.keyCode;
  }else{
    if (e.which){
      code = e.which;
	}
  }  

		
  for (i = 0; i < VALID_NUMERIC_KEYS.length; i++)
    if (VALID_NUMERIC_KEYS[i] > code)
      return false;
    else
      if (VALID_NUMERIC_KEYS[i] == code)
        return true;

  return false;
}

function is_valid_navigation(key)
{
  for (i = 0; i < VALID_NAVIGATION_KEYS.length; i++)
    if (VALID_NAVIGATION_KEYS[i] > key)
      return false;
    else
      if (VALID_NAVIGATION_KEYS[i] == key)
        return true;

  return false;
}

function chkEmail (f,fld,msg) {
  var frm = f ;
  var e = fld;
  
  if (e.value == null){
    alert(msg);
    e.focus();
    return (false);}
  //tirando os espaços vazios no endereço
  for (x = 1; x < e.value.length; x ++) 
     { e.value= e.value.replace(' ', '')}
	
  var emailStr
  emailStr = e.value;
  var emailPat=/^(.+)@(.+)$/
  var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
  var validChars="\[^\\s" + specialChars + "\]"
  var quotedUser="(\"[^\"]*\")"
  var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
  var atom=validChars + '+'
  var word="(" + atom + "|" + quotedUser + ")"
  var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
  var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
  var matchArray = emailStr.match(emailPat)
  if (matchArray==null){
    alert('O email informado não é válido.');
    e.value="";
    e.focus();
    return (false);}
	
  var user=matchArray[1]
  var domain=matchArray[2]
  if (user.match(userPat)==null){
    //alert("O seu Nome de usuário parece não ser válido.");
	alert("E-mail informado parece não ser válido.");
    e.value="";
    e.focus();
    return (false);}
	
  var IPArray=domain.match(ipDomainPat)
  if (IPArray!=null){
	  for (var i=1;i<=4;i++){
		  if (IPArray[i]>255){
			alert('O endereço do IP parece não ser válido!');
			e.value="";
			e.focus();
			return (false);
		  }
	  }
	  return true;
  }

  var domainArray=domain.match(domainPat)
  if (domainArray==null){
    alert('O domínio parece não ser válido!');
    e.value="";
    e.focus();
    return (false);}
	
  var atomPat=new RegExp(atom,"g")
  var domArr=domain.match(atomPat)
  if (domArr[domArr.length-1].length<2 ||
    domArr[domArr.length-1].length>3){
    alert('O endereço deve conter três letras de domínio ou duas letras do país.');
    e.value="";
    e.focus();
    return (false);}
	
  if (domArr.length<2){
    var errStr="Este endereço não está encontrando o seu provedor!"
    alert(errStr);
    e.value="";
    e.focus();
    return (false);}
return true;
} 

function validaEmail(frm, email){
	if(!chkEmail(frm, email, "O campo EMAIL deve ser válido")){ return false; }
	return true;
}		

function layer_text(layer, value, parent)
{
  if (!parent)
    aux_layer = document.getElementById(layer);
  else
    aux_layer = top.opener.document.getElementById(layer);

  aux_layer.innerHTML = value;
}

function test_if_empty(field, message, formName, fieldName, type)
{
  switch(type)
  {
    case 'Radio':
      rad = eval("document." + formName + "['" + fieldName + "']");
      empty = true;
      for (i = 0; i < rad.length; i++)
        if (rad[i].checked == true)
          empty = false;
      if (empty)
      {
        test_empty = false;
        last_empty_field = fieldName;
        alert(message);
        rad[0].focus();
      }
      else
        test_empty = true;

      return empty;
    break;
    
    case 'Layer':
      layer = document.getElementById(fieldName);
      if (layer.innerHTML.length == 0)
      {
        test_empty = false;
        last_empty_field = fieldName;
        alert(message);
        return true;
      }
      else
      {
        test_empty = true;
        return false;
      }
    break;
    
    case "Editor":
      ed = eval("document." + formName + "['" + fieldName + "']");
      if (ed.value.length == 0)
      {
        test_empty = false;
        last_empty_field = fieldName;
        alert(message);
        return true;
      }
      else
      {
        test_empty = true;
        return false;
      }
    break;
    
    case "DualList":
      dual_list = eval("document." + formName + ".elements['" + fieldName + "']");
        
      if (dual_list.options.length == 0)
      {
        test_empty = false;
        last_empty_field = fieldName;
        alert(message);
        return true;
      }
      else
      {
        test_empty = true;
        return false;
      }
    break;
    
    default:
      if (field.value == undefined)
      {
        cmp = eval("document." + formName + "['" + fieldName + "']");

        if (cmp.value == '')
        {
          test_empty = false;
          last_empty_field = fieldName;
          alert(message);
          if (type != 'Hidden')
            cmp.focus();
          return true;
        }
        else
        {
          test_empty = true;
          return false;
        }//if (cmp.value == '')
      }//if (field.value == undefined)
      else
      {
        if (field.value == '')
        {
          test_empty = false;
          last_empty_field = field.name;
          alert(message);
        }
        else
          test_empty = true;

      }// else - if (field.value == undefined)
    break;
  }//switch(type)

}

function clock(hr, min, sec, formName, fieldName)
{
  //////////////////////////////////////////////////////////
  // passar os parametros para a funcao SEM as aspas "''" //
  // desta forma:                                         //
  //              relogio(1,2,3); ou relogio(01,02,03);   //
  //////////////////////////////////////////////////////////
  if (sec > 59)
  {
    min += 1;
    sec = 0;
  }
  if (min > 59)
  {
    hr += 1;
    min = 0;
  }
  if (hr > 23)
    hr = 0;

  var Shr  = new String(hr);
  var Smin = new String(min);
  var Ssec = new String(sec);

  if (Shr.length == 1)
    Shr = "0" + Shr;
  if (Smin.length == 1)
    Smin = "0" + Smin;
  if (Ssec.length == 1)
    Ssec = "0" + Ssec;
  var clocktext = Shr + ":"  + Smin + ":" + Ssec;
  Shr  = "";
  Smin = "";
  Ssec = "";
  ///////////////// ONDE ESCREVER /////////////////////////
  field = eval("document." + formName + "['" + fieldName + "']");
  field.value = clocktext;
  /////////////////////////////////////////////////////////
  sec += 1;
  setTimeout("clock(" + hr + "," + min + "," + sec + ", '" + formName + "', '" + fieldName + "')",1000);
}

/*
 * Atualiza o frame ou a pagina
 */
function reload (frame)
{
  if (frame)
  {
    frame = 'parent.' + frame + '.location.href = parent.' + frame + '.location.href';
    setTimeout(frame, 0);
  }
  else
    parent.location.href = parent.location.href;
}

/*
 * Abre a janela da receita federal que verifica o CPF
*/
function cpf_cadastre(cpfNumber)
{
  cpfNumber        = cpfNumber.replace( ".", "" );
  cpfNumber        = cpfNumber.replace( ".", "" );
  cpfNumber        = cpfNumber.replace( ".", "" );
  cpfNumber        = cpfNumber.replace( "/", "" );
  cpfNumber        = cpfNumber.replace( "/", "" );
  var height       = 400;
  var width        = 550;
  var top          = (screen.availHeight / 2) - (height / 2);
  var left         = (screen.availWidth / 2) - (width / 2);
  var s            = 'http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp?CPF=' + cpfNumber;
  window.open(s, "_blank", "top="+top+",left="+left+",height="+height+",width="+width+",resizable=no,status=no,scrollbars=yes,toolbar=no,menubar=no,location=no");
}

/*
 * Abre a janela da receita federal que verifica o Cnpj
*/
function cnpj_cadastre(cnpjNumber)
{
  cnpjNumber  = cnpjNumber.replace( ".", "" );
  cnpjNumber  = cnpjNumber.replace( ".", "" );
  cnpjNumber  = cnpjNumber.replace( ".", "" );
  cnpjNumber  = cnpjNumber.replace( "/", "" );
  cnpjNumber  = cnpjNumber.replace( "/", "" );
  cnpjNumber  = cnpjNumber.replace( "-", "" );
  cnpjNumber  = cnpjNumber.replace( "-", "" );
  var height  = 500;
  var width   = 650;
  var top     = (screen.availHeight / 2) - (height / 2);
  var left    = (screen.availWidth / 2) - (width / 2);
  var s       = 'http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao.asp?' + cnpjNumber;
  window.open(s, "_blank", "top="+top+",left="+left+",height="+height+",width="+width+",resizable=no,status=no,scrollbars=yes,toolbar=no,menubar=no,location=no");
}

/*
 * Responsável pela abertura dos pops
 */
function pop_open(adress, width, height, windowName)
{
  // POP CENTRALIZADO //
  /*
  var topo = (screen.availHeight / 2) - (height / 2);
  var esq = (screen.availWidth / 2) - (width / 2);
  */
  // POP NO CANTO SUPERIOR DIREITO
  var topo = 0;
  var esq = (screen.availWidth - width);

  if (windowName == false)
    windowName = '';
  
  var pop_window = window.open(adress, windowName,'width='+width+',height='+height+',top='+topo+',left='+esq+',location=no,status=no,menubar=no,resizable=no,scrollbars=yes');

  pop_window.focus();

  return pop_window;

}

/*
 * Realiza as transformações necessárias para o uso de um valor em cálculos
*/
function transform_value(object)
{
  if (object.value == undefined)
    object_value = object;
  else
    object_value = object.value;

  characters       = '.,';
  size             = object_value.length;
  object_value_fmt = "";

  for (i=0; i < size; i++)
  {
    if (object_value.charAt(i) == ',')
      object_value_fmt = object_value_fmt + '.';
    else
    {
      if (object_value.charAt(i) != '.')
        object_value_fmt = object_value_fmt + object_value.charAt(i);
    }
  }

  return object_value_fmt;
}

/*
 * Permite apenas a entrada de Números no campo
*/
function format_number(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  return (is_valid_numeric(code) || is_valid_navigation(code) );
}

/*
 * Permite apenas a entrada de Números no campo
 * além de colocar os pontos e vírgulas necessários ao tamanho do campo
*/
function format_value(object, size, digits, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  total_size = size;
  if (digits > 0)
    total_size++;

  points = size - digits;
  points = parseInt(String( (points / 3) ), 10);

  if ( (size - digits) % 3 == 0)
    points--;

  total_size += points;
  total_size = total_size;

  actual_size  = object.value.length;

  object_value = "";
  
  //pega somente os números
  for (i = 0; i < actual_size; i++)
  {
    if (object.value.charAt(i) != ',' && object.value.charAt(i) != '.')
      object_value = object_value + object.value.charAt(i);
  }
  
  if ( ( is_valid_numeric(code) && ( (actual_size) < (total_size) ) ) || is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;
    else
    {
      object_value_fmt = object_value + String.fromCharCode(code);
      
      if ( (object_value_fmt.length > digits) && (digits > 0) )
        object_value_fmt = object_value_fmt.substr(0, object_value_fmt.length - digits) +
                           ',' + object_value_fmt.substr(object_value_fmt.length - digits, digits);
    }

    j = 0;
    
    str_tmp = "";
    
    use_point = false;
    
    for (i = object_value_fmt.length - 1; i >= 0 ; i--)
    {
      if (object_value_fmt.charCodeAt(i) >= 48 && object_value_fmt.charAt(i) <= 57)
        j++;

      if (object_value_fmt.charAt(i) == ',')
      {
        use_point = true;
        j = 0;
      }

      str_tmp = object_value_fmt.charAt(i) + str_tmp;
      
      if ( (j == 3 && use_point) && (i > 0) && (object_value_fmt.charAt(i - 1) != ",") )
      {
        str_tmp =  '.' + str_tmp;
        j = 0;
      }
    }

    object_value_fmt = str_tmp;
    object.value = object_value_fmt;

    return false;
  }
  else
    return false;
}

/*
 * Troca o Valor para a formatacao padrao, realiza o contrario do transforma_valor
*/
function convert_value(object, size, digits)
{
  size             = size - digits;
  object_value     = new String(object);
  actual_size      = object_value.length;
  object_value_fmt = "";
  j                = 0;

  //este for tira os pontos da variavel por exemplo 33.55 = 3355
  for (i = 0; (i < actual_size) && (j < (digits + 1) ); i++)
  {
    if (object_value.charAt(i) != '.')
    {
      object_value_fmt = object_value_fmt + object_value.charAt(i);
      if (j != '0')
       j++;
    }
    else
      j = 1;
  }

  //qdo o valor nao era quebrado acrescenta zeros para depois da virgula
  if ( (actual_size - 1 != size + digits) && (digits > 0) && (j == 0) )
  {
    for (i = 0; i < digits; i++)
      object_value_fmt = object_value_fmt + 0;
  }

  object_value     = object_value_fmt;
  actual_size      = object_value.length;
  object_value_fmt = "";



  for (i=0; i < actual_size; i++)
  {
    if (actual_size - digits == i)
      object_value_fmt = object_value_fmt + ',';
    else
    {
      if ( ( ( (actual_size - digits) - i) % 3 == 0) && i != 0)
        object_value_fmt = object_value_fmt + '.';
    }
    object_value_fmt = object_value_fmt + object_value.charAt(i);
  }

  return object_value_fmt;
}


/*
 * Formata a data, permitindo a digitacao apenas de nros e colocando
 * as barras automaticamente
 * Deve ser colocado no evento onKeyPress
 */
function format_date(object, e, useDay, useYear)
{

  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  actual_size = object.value.length;

  if ((is_valid_numeric(code) && ((actual_size) < (10))) || is_valid_navigation(code))
  {
    if (is_valid_navigation(code))
      return true;

    object_value_fmt = "";
    object.value = object.value + String.fromCharCode(code);

    for (i = 0; i < object.value.length; i++)
    {
      if (useDay == true && useYear == true)
      {
        if ((i == 2 || i == 5) && object.value.charAt(i) != '/')
          object_value_fmt = object_value_fmt + '/';
      }
      else
      {
        if (i == 2 && object.value.charAt(i) != '/')
          object_value_fmt = object_value_fmt + '/';
      }          

      object_value_fmt = object_value_fmt + object.value.charAt(i);
    }

    object.value = object_value_fmt;

    return false;
  }
  else
    return false;
}


/*
 * Formata a hora, permitindo a digitacao apenas de nros e colocando
 * os ":" automaticamente
 * Deve ser colocado no evento onKeyPress
 */
function format_time(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  actual_size = object.value.length;

  if ( ( is_valid_numeric(code) && ( (actual_size) < (8) ) ) ||
       is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;

    object_value_fmt = "";
    object.value = object.value + String.fromCharCode(code);

    for (i = 0; i < object.value.length; i++)
    {
      if ( (i == 2 || i == 5) && object.value.charAt(i) != ':')
        object_value_fmt = object_value_fmt + ':';

      object_value_fmt = object_value_fmt + object.value.charAt(i);
    }

    object.value = object_value_fmt;

    return false;
  }
  else
    return false;

}

/*
 * Formata o CEP, colocando o hifen separador automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/
function format_cep(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  actual_size = object.value.length;

  if ( ( is_valid_numeric(code) && ( (actual_size) < (9) ) ) ||
       is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;

    object_value_fmt = "";
    object.value = object.value + String.fromCharCode(code);

    for (i = 0; i < object.value.length; i++)
    {
      if ( i == 5 && object.value.charAt(i) != '-')
        object_value_fmt = object_value_fmt + '-';

      object_value_fmt = object_value_fmt + object.value.charAt(i);
    }

    object.value = object_value_fmt;

    return false;
  }
  else
    return false;

}


/*
 * Formata o CNPJ, colocando os pontos e a barra automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/
function format_cnpj(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode){
    code = e.keyCode;
  }else{
    if (e.which){
      code = e.which;
	}
  }

  actual_size = object.value.length;

  if ( ( is_valid_numeric(code) && ( (actual_size) <= (17) ) ) ||
       is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;

    object_value_fmt = "";
    object.value = object.value + String.fromCharCode(code);

    for (i = 0; i < object.value.length; i++)
    {
      if ( (i == 2 || i == 6) && object.value.charAt(i) != '.')
        object_value_fmt = object_value_fmt + '.';

      if ( i == 10 && object.value.charAt(i) != '/')
        object_value_fmt = object_value_fmt + '/';

      if ( i == 15 && object.value.charAt(i) != '-')
        object_value_fmt = object_value_fmt + '-';
	
		if(i != 18)
	      object_value_fmt = object_value_fmt + object.value.charAt(i);
		 else{
			object.value = object_value_fmt; 
			return false;
		 }
		 	
    }
    object.value = object_value_fmt;

    return false;
  }
  else
    return false;
}



/*
 * Formata o CPF OU CNPJ, colocando os pontos e a barra automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/
/*
 * Formata o CPF ou CNPJ, detecta se é CPF ou CNPJ pelo largura do campo
 	colocando os pontos e a barra automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/

function format_cpf_cnpj(object, e){
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  actual_size = object.value.length;
   
  
  
  if((actual_size) <= (13)){
	  
		  if ( ( is_valid_numeric(code) && ( (actual_size) <= (13) ) ) ||
			   is_valid_navigation(code) )
		  {
			if (is_valid_navigation(code))
			  return true;
		
			object_value_fmt = "";
			object.value = object.value + String.fromCharCode(code);
		
			for (i = 0; i < object.value.length; i++)
			{
			  if ( (i == 3 || i == 7) && object.value.charAt(i) != '.')
				object_value_fmt = object_value_fmt + '.';
		
			  if ( i == 11 && object.value.charAt(i) != '/')
				object_value_fmt = object_value_fmt + '/';
		
			  object_value_fmt = object_value_fmt + object.value.charAt(i);
			}
			object.value = object_value_fmt;
		
			return false;
		  }
		  else
			return false;
		
		
  }else{	
		 /* if((actual_size) == (14)){
			object.value = object.value.replace( "/", "" );
			object.value = object.value.replace( ",", "" );
			object.value = object.value.replace( ".", "" );		
			object.value = object.value.replace( ".", "" );				
			object.value = object.value.replace( "-", "" );
			object.value = object.value.replace( " ", "" );   
		  }else{*/
		  
  
				  if ( ( is_valid_numeric(code) && ( (actual_size) <= (17) ) ) ||
					   is_valid_navigation(code) )
				  {
					if (is_valid_navigation(code))
					  return true;
					  
					object.value = object.value.replace( "/", "" );
					object.value = object.value.replace( ",", "" );
					object.value = object.value.replace( ".", "" );		
					object.value = object.value.replace( ".", "" );				
					object.value = object.value.replace( "-", "" );
					object.value = object.value.replace( " ", "" ); 					  
				
					object_value_fmt = "";
					object.value = object.value + String.fromCharCode(code);
				
					for (i = 0; i < object.value.length; i++)
					{
					  if ( (i == 2 || i == 5) && object.value.charAt(i) != '.')
						object_value_fmt = object_value_fmt + '.';
				
					  if ( i == 8 && object.value.charAt(i) != '/')
						object_value_fmt = object_value_fmt + '/';
				
					  if ( i == 12 && object.value.charAt(i) != '-')
						object_value_fmt = object_value_fmt + '-';
				
						if(i != 14)
						  object_value_fmt = object_value_fmt + object.value.charAt(i);
						 else{
							object.value = object_value_fmt; 
							return false;
						 }
				
					 
					}
					object.value = object_value_fmt;
				
					return false;
				  }
				  else
					return false; 
			
		 
  }
}




/*
 * Formata o CPF, colocando os pontos e a barra automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/
function format_cpf(object, e)
{

  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  actual_size = object.value.length;
  

	

  if ( ( is_valid_numeric(code) && ( (actual_size) <= (13) ) ) ||
       is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;

    object_value_fmt = "";
    object.value = object.value + String.fromCharCode(code);

    for (i = 0; i < object.value.length; i++)
    {
      if ( (i == 3 || i == 7) && object.value.charAt(i) != '.')
        object_value_fmt = object_value_fmt + '.';

      if ( i == 11 && object.value.charAt(i) != '/')
        object_value_fmt = object_value_fmt + '/';

      object_value_fmt = object_value_fmt + object.value.charAt(i);
    }
    object.value = object_value_fmt;

    return false;
  }
  else
    return false;
}

/*
 * Formata email
*/
function format_email(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;
  
  if (code == 32)
    return false
  else
    return true;
  
}

/* Formata telefones, aceita os formatos:
 * - (xx)xxx-xxxx
 * - (xx)xxxx-xxxx
 * - xxxx-xxxxxx
*/
function format_fone(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  if ( is_valid_numeric(code) || is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;

    if (object.value.length > 1)
    {
      value = object.value.substring(0,1);

      if (value != 0)
      {
        if (object.value.length == 2)
        {
          value_tmp = object.value;
          object.value = "(" + value_tmp + ")";
        }

        if (object.value.length == 10 && object.value.indexOf("-") == -1)
        {
          value_tmp  = object.value.substring(0,7);
          value_tmp2 = object.value.substring(7,11);
          object.value = value_tmp + "-" + value_tmp2;

          return;
        }

        if (object.value.length == 12)
        {
          value_tmp  = object.value.substring(0,7);
          value_tmp2 = object.value.substring(8,9);

          if (value_tmp2 != "-")
          {
            value_tmp3 = object.value.substring(9,12);
            object.value = value_tmp + value_tmp2 + "-" + value_tmp3;
          }

          return;
        }
      }
      else
      {
        if (object.value.length == 4)
          object.value = object.value + "-";
      }
    }//if (object.value.length > 1)
  }//if ( is_valid_numeric(code) || is_valid_navigation(code) )
  else
    return false;

}

/*
 * Formata a inscrição estadual de acordo com a UF
*/
function format_inscricao_estadual(object, e, fieldUf, formName)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;
  
  if ( is_valid_numeric(code) || is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;
    
    //pega a uf
    cmp = eval("document." + formName + "['" + fieldUf + "']");
    uf = cmp.value;
    
    //formata de acordo com a uf
    switch (uf)
    {
      case "RS":
        if (object.value.length == 3)
          object.value = object.value + "/";    
      break;
    
      case "SC":
      break;
      
      case "PR":
        if (object.value.length == 8)
          object.value = object.value + "-";
      break;

      case "SP":
      break;
    }
  }
  else
    return false;
}

/*
 * Formata o PIS, colocando os pontos e a barra automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/
function format_pis(object, e)
{
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;

  actual_size = object.value.length;

  if ( ( is_valid_numeric(code) && ( (actual_size) <= (13) ) ) ||
       is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;

    object_value_fmt = "";
    object.value = object.value + String.fromCharCode(code);

    for (i = 0; i < object.value.length; i++)
    {
      if ( (i == 3 || i == 9) && object.value.charAt(i) != '.')
        object_value_fmt = object_value_fmt + '.';

      if ( i == 12 && object.value.charAt(i) != '-')
        object_value_fmt = object_value_fmt + '-';

      object_value_fmt = object_value_fmt + object.value.charAt(i);
    }
    object.value = object_value_fmt;

    return false;
  }
  else
    return false;
}

/*
 * Formata o Modulo11, a barra automaticamente
 * e permitindo somente a digitacao de numeros
 * Deve ser colocado no evento onKeyPress
*/
function format_modulo11(object, size, e)
{
  digits = 1;
  size = parseInt(size) + 1;
  if (!e)
    var e = window.event;
  if (e.keyCode)
    code = e.keyCode;
  else
    if (e.which)
      code = e.which;
  total_size = size;
  if (digits > 0)
    total_size++;

  actual_size  = object.value.length;

  object_value = "";
  for (i = 0; i < actual_size; i++)
    if (object.value.charAt(i) != '-')
      object_value = object_value + object.value.charAt(i);

  if ( ( is_valid_numeric(code) && ( (actual_size) < (total_size) ) ) ||
       is_valid_navigation(code) )
  {
    if (is_valid_navigation(code))
      return true;
    else
    {
      object_value_fmt = object_value + String.fromCharCode(code);
      if (object_value_fmt.length > digits)
        object_value_fmt = object_value_fmt.substr(0, object_value_fmt.length - digits) +
                           '-' +
                           object_value_fmt.substr(object_value_fmt.length - digits, digits);
    }
    object.value = object_value_fmt;

    return false;
  }
  else
    return false;
}

/*
 * Verifica se o telefone é valido
 * utilizado no onBlur e na submissão do form
*/
function validate_fone(object, error, formName)
{
  var_return = true;
  size       = 0;
  numbers    = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  
  if (object.value == undefined)
  {
    cmp = eval("document." + formName + "['" + object + "']");
    object = cmp;
  }
  else
   object = object;

  if (object.value.length > 0)
  {
    for (i = 0; i < object.value.length; i++)
    {
      character = object.value.charAt(i);
      
      for (j = 0; j < numbers.length; j++)
      {
        if (character == numbers[j])
          size++;
      }
    }
    
    min = 9;
    max = 10;

    if (object.value.charAt(0) == "0")
    {
      min = 10;
      max = 12;
    }

    if (size < min || size > max)
    {
      alert(error);
      var_return =  false;
    }
  }
  
  return var_return;
}

/* 
 * Verifica se o cep é valido, utilizado no onBlur
*/
function validate_cep(object, error, formName)
{
  var_return = true;

  if (object.value == undefined)
  {
    cmp = eval("document." + formName + "['" + object + "']");
    object_value = cmp.value;
  }
  else
    object_value = object.value;

  if (object_value.length > 0)
  {
    if (object_value.length < 9)
    {
      alert(error);
      var_return = false;
    }
  }

  return  var_return;
}

/*
 * Verifica se o email é valido
 * utilizado no onBlur e na submissão do form
*/
function validate_email(object, error, formName)
{
  var_return = true;
  
  if (object.value == undefined)
  {
    cmp = eval("document." + formName + "['" + object + "']");
    object_value = cmp.value;
  }
  else
    object_value = object.value;

  if (object_value.length > 0)
  {
    index = object_value.indexOf("@");

    if (index == -1)
    {
      alert(error);
      var_return = false;
    }
    else
    {
      index2 = object_value.indexOf(".", index);
      index3 = object_value.lastIndexOf(".");
     
      str  = object_value.substring(index2, object_value.length);
      str2 = object_value.substring(index, index2); 
      str3 = object_value.substring(index3, object_value.length);
     
      if (index2 != -1 && str.length > 1 && str2.length > 1 && str3.length > 1)
        var_return = true;
      else
      {
        alert(error);
        var_return = false;
      }
    }
  } 

  return var_return;
}

/*
 * Verifica se o formato da data digitada está correto,
 * deve ser utilizado no onBlur
*/
function validate_date(field, minYear, maxYear, errorMsg, formName, useDay, useYear)
{
	if(field.value == "" || field.value == " ") return true;
		
  alert_msg  = "";
  return_var = true;
  
  if (field.value == undefined)
  {
    cmp = eval("document." + formName + "['" + field + "']");
    field_value = cmp.value;
  }
  else
    field_value = field.value;
 
  field_value = field_value.replace("/", "");
  field_value = field_value.replace("/", "");

  if (field_value.length != 0)
  {
    var days_in_month = new Array();
    
    days_in_month[1]  = 31;
    days_in_month[2]  = 28;
    days_in_month[3]  = 31;
    days_in_month[4]  = 30;
    days_in_month[5]  = 31;
    days_in_month[6]  = 30;
    days_in_month[7]  = 31;
    days_in_month[8]  = 31;
    days_in_month[9]  = 30;
    days_in_month[10] = 31;
    days_in_month[11] = 30;
    days_in_month[12] = 31;
    
    if (useDay == true && useYear == true)
    {
      var day   = Number(field_value.substr(0, 2));
      var month = Number(field_value.substr(2, 2));
      var year  = Number(field_value.substr(4, 4));
      
      //ano bissexto
      if ((year % 4) == 0)
        days_in_month[2] = 29;

      if (day > days_in_month[month] || day <= 0)
        alert_msg = errorMsg;

      if (year > maxYear || year < minYear)
        alert_msg = errorMsg;

    }//if (useDay == true && useYear == true)
    else
    {
      if (useDay == false)
      {
        var month = Number(field_value.substr(0, 2));
        var year  = Number(field_value.substr(2, 4));

        if (year > maxYear || year < minYear)
          alert_msg = errorMsg;
      }

      if (useYear == false)
      {
        var day   = Number(field_value.substr(0, 2));
        var month = Number(field_value.substr(2, 2));

        if (day > days_in_month[month] || day <= 0)
          alert_msg = errorMsg;
      }
    }//else - if (useDay == true && useYear == true)
    
    if (month > 12 || month <= 0)
      alert_msg = errorMsg;

  }//if (field_value.length != 0)

  if (alert_msg != "")
  {
    alert(alert_msg);
	field.value = "";
	field.focus();
    return_var = false;
  }

  return return_var;
}


/*
 * Verifica se o formato da data digitada está correto,
 * deve ser utilizado no onBlur
*/
function validate_time(field, errorMsg, formName)
{
  if (field.value == undefined)
  {
    cmp = eval("document." + formName + "['" + field + "']");
    field_value = cmp.value;
    field_size  = cmp.size;
  }
  else
  {
    field_value = field.value;
    field_size  = field.size;
  }
  
  if ((field_value.length < field_size) && (field_value.length > 0))
  {
    alert(errorMsg);  
    return false;
  }
  
  hour   = field_value.substr(0, 2);
  minute = field_value.substr(3, 2);
  second = field_value.substr(6, 2);

  if (hour > 23 || minute > 59 || second > 59)
  {
    alert(errorMsg);
    return false;
  }
  else
    return true;

}


/*
 * Verifica se o formato do CPF está correto,
 * deve ser utilizado no onBlur
*/
function validate_cpf(field, error, formName)
{

  if (field.value == undefined)
  {
    cmp = eval("document." + formName + "['" + field + "']");
    field_value = cmp.value;
  }
  else
    field_value = field.value;

  field_value = field_value.replace( "/", "" );
  field_value = field_value.replace( "/", "" );
  field_value = field_value.replace( ",", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( "-", "" );
  field_value = field_value.replace( " ", "" );

  valid = true;

  if (field_value.length != 0)
  {

    // verifica o tamanho
    if (field_value.length != 11)
    {
      valid = false;
    }

    if (valid)  // valida o primeiro digito
    {
      for (i = 0; ( ( i <= (field_value.length - 1) ) && valid); i++)
      {
        val = field_value.charAt(i)
        if ( (val != "9") && (val != "0") && (val != "1") && (val != "2") &&
             (val != "3") && (val != "4") && (val != "5") && (val != "6") &&
             (val != "7") && (val != "8") )
        {
          valid = false;
        }
      }

      if (valid)
      {
        sum = 0;
        for (i = 0; i <= 8; i++)
        {
          val = eval(field_value.charAt(i));
          sum = sum + ( val * (i + 1) );
        }

        rest = sum % 11;

        if (rest > 9)
          dig = rest - 10;
        else
          dig = rest;

        if (dig != eval( field_value.charAt(9) ) )
          valid = false;
        else   // valida o segundo digito
        {
          sum = 0;
          for (i = 0;i <= 7; i++)
          {
            val = eval(field_value.charAt(i + 1) );
            sum = sum + ( val * ( i + 1 ) );
          }

          sum = sum + (dig * 9);
          rest = sum % 11;

          if (rest > 9)
            dig = rest - 10;
          else
            dig = rest;

          if (dig != eval( field_value.charAt(10) ) )
            valid = false;
        }//for (i = 0;i <= 7; i++)
      }//if (valid)
    }//if (valid)
  }

  if (!valid)
  {
    if (field.value == undefined)
      alert(error);
    else
      alert(error);
    return false;
  }
  else
    return true;
}

/*
 * Verifica se o formato do Cnpj está correto,
 * deve ser utilizado no onBlur
*/
function validate_cnpj(field, error, formName)
{

  if (field.value == undefined)
  {
    cmp = eval("document." + formName + "['" + field + "']");
    field_value = cmp.value;
  }
  else
    field_value = field.value;

  field_value = field_value.replace( "/", "" );
  field_value = field_value.replace( "/", "" );
  field_value = field_value.replace( ",", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( "-", "" );
  field_value = field_value.replace( " ", "" );

  valid = true;

  // ve se pode passar em branco
  if ( (field_value.length != 0) && (field_value != '0') )
  {
    // verifica o tamanho
    if (field_value.length != 14)
      valid = false;

    if (valid)  // verifica se e numero
    {
      for (i = 0;( (i <= (field_value.length - 1) ) && valid); i++)
      {
        val = field_value.charAt(i)

        if ( (val != "9") && (val != "0") && (val != "1") && (val != "2") &&
             (val != "3") && (val != "4") && (val != "5") && (val != "6") &&
             (val != "7") && (val != "8") )
          valid = false;
      }

      if (valid)  // se for numero continua
      {
        m2 = 2;
        sum1 = 0;
        sum2 = 0;
        for (i = 11; i >= 0; i--)
        {
          val = eval(field_value.charAt(i));
          m1 = m2;

          if (m2 < 9)
            m2 = m2 + 1;
          else
            m2 = 2;

          sum1 = sum1 + (val * m1);
          sum2 = sum2 + (val * m2);
        }  // fim do for de sum

        sum1 = sum1 % 11;
        if (sum1 < 2)
          d1 = 0;
        else
          d1 = 11 - sum1;

        sum2 = (sum2 + (2 * d1) ) % 11;

        if (sum2 < 2)
          d2 = 0;
        else
          d2 = 11 - sum2;

        if ( ( d1 != field_value.charAt(12) ) || ( d2 != field_value.charAt(13) ) )
          valid = false;
      }//if (valid)
    }//if (valid)
  }//if ( (field_value.length != 0) && (field_value != '0') )

  if (!valid)
  {
    if (field.value == undefined)
      alert(error);
    else
      alert(error);
    return false;
  }
  else
    return true;
}

// -- Contador para objeto TextArea.
/*
 * Verifica se o tamanho do textarea não ultrapassou o seu limite,
 * deve ser utilizado no onKeyPress
*/
function validate_text(field, size)
{
  var actual_size = field.value.length;
  var actual_text = field.value;
  if (actual_size >= (size - 1) )
  {
    field.value = actual_text.substring(0, (size - 1) );
  }
  return true;
}

/*
 * Verifica se o formato do PIS está correto,
 * deve ser utilizado no onBlur
*/
function validate_pis(field, error, formName)
{

  if (field.value == undefined)
  {
    cmp = eval("document." + formName + "['" + field + "']");
    field_value = cmp.value;
  }
  else
    field_value = field.value;

  field_value = field_value.replace( "-", "" );
  field_value = field_value.replace( ".", "" );
  field_value = field_value.replace( ".", "" );

  valid = true;

  // ve se pode passar em branco
  if ( (field_value.length != 0) && (field_value != '0') )
  {
    // verifica o tamanho
    if (field_value.length != 11)
      valid = false;

    if (valid)  // verifica se e numero
    {
      for (i = 0;( (i <= (field_value.length - 1) ) && valid); i++)
      {
        val = field_value.charAt(i)

        if ( (val != "9") && (val != "0") && (val != "1") && (val != "2") &&
             (val != "3") && (val != "4") && (val != "5") && (val != "6") &&
             (val != "7") && (val != "8") )
          valid = false;
      }

      if (valid)  // se for numero continua
      {
        soma = 0;
        fator = [3,2,9,8,7,6,5,4,3,2];
        for (i=0; i < 10; i++)
        {
          val = eval(field_value.charAt(i));
          soma += val * fator[i];
        }

        resultado = 11 - (soma % 11);

        if ( (resultado == 10) || (resultado == 11) )
          resultado = 0;

        if ( resultado != field_value.charAt(10) )
          valid = false;

      }//if (valid)
    }//if (valid)
  }//if ( (field_value.length != 0) && (field_value != '0') )

  if (!valid)
  {
    if (field.value == undefined)
      alert(error);
    else
      alert(error);
    return false;
  }
  else
    return true;
}

/*
 * Valida a Inscrição Estadual
 * deve ser utlizada no onBlur
*/
function validate_inscricao_estadual(field, fieldUf, formName, error)
{
  //pegua o valor do campo
  if (field.value == undefined)
  {
    cmp = eval("document." + formName + "['" + field + "']");
    field_value = cmp.value;
  }
  else
    field_value = field.value;

  //pega a uf
  cmp = eval("document." + formName + "['" + fieldUf + "']");
  uf = cmp.value;

  switch (uf)
  {
    case "RS": 
      var_return = validate_modulo11(field_value, error, formName, uf);
    break;

    case "SC":
    break;
    
    case "PR":
      value_1 = field_value;
      value_2 = field_value.substring(0, 10);
      //valida o primeiro dígito verificador
      var_1 = validate_modulo11(value_2, error, formName, uf, 8);
      //se o primeiro dígito for valido, valida o segundo
      if (var_1)
        var_2 = validate_modulo11(value_1, error, formName, uf, 8);
      //se ambos forem válidos
      if (var_1 && var_2)
        var_return = true; 
      else
        var_return = false;
    break;

    case "SP":
    break;
  }

  return var_return;
}

/*
 * Verifica se o formato do Modulo11 está correto,
 * deve ser utilizado no onBlur
*/
function validate_modulo11(field, error, formName, uf, max)
{
  if (max == undefined)
    max = 10; 
  
  if (uf == undefined)
  {
    if (field.value == undefined)
    {
      cmp = eval("document." + formName + "['" + field + "']");
      field_value = cmp.value;
    }
    else
      field_value = field.value;
  }
  else
    field_value = field;
    
  field_value = field_value.replace( "-", "");
  field_value = field_value.replace( "/", "");
  
  //alert (field_value);
  
  valid = true;

  // ve se pode passar em branco
  if ( (field_value.length != 0) && (field_value != '0') )
  {
    if (valid)  // verifica se e numero
    {
      for (i = 0;( (i < field_value.length) && valid); i++)
      {
        val = field_value.charAt(i)

        if ( (val != "9") && (val != "0") && (val != "1") && (val != "2") &&
             (val != "3") && (val != "4") && (val != "5") && (val != "6") &&
             (val != "7") && (val != "8") )
          valid = false;
      }

      val = 0;
      resultado = 0;
      if (valid)  // se for numero continua
      {
        fator = 2;
        for (i = (field_value.length - 1); i > 0; i--)
        {
          if (fator == max)
            fator = 2;

          val = eval(field_value.charAt(i-1));
          resultado += (val * fator);
          fator++;
        }
        digito = (11 - (resultado % 11) );
        if (digito == 11 || digito == 10)
          digito = 0;
        
        if ( digito != field_value.charAt(field_value.length - 1) )
          valid = false;

        //alert (digito + "!=" + field_value.charAt(field_value.length - 1) );
          
      }//if (valid)
    }//if (valid)
  }//if ( (field_value.length != 0) && (field_value != '0') )

  if (!valid)
  {
    if (field.value == undefined)
      alert(error);
    else
      alert(error);
    return false;
  }
  else
    return true;
}

//Testa se uma data eh maior, menor ou igual a outra
//ou estah em um intervalo
//campo = campo onde esta se fazendo o teste
//data1 ou data2 = valor do campo
//teste = simbolos ('<' ,'>' ,'<=' ,'>=' ,'=')
function test_date(field, date, date1, date2, test, error, formName)
{
  dt = new String(date);
  return_var = true;

  if (date != '')
  {
    dt1 = new String(date1);

    period = 'false';
    if (date2 != '')
    {
      dt2 = new String(date2);
      period = 'true';
    }

    dt_fmt = "";
    dt1_fmt = "";
    dt2_fmt = "";

    for (i=0; i < 10; i++)
    {
      if (dt.charAt(i) != '/')
        dt_fmt = dt_fmt + dt.charAt(i);

      if (dt1.charAt(i) != '/')
        dt1_fmt = dt1_fmt + dt1.charAt(i);

      if (period == 'true')
        if (dt2.charAt(i) != '/')
          dt2_fmt = dt2_fmt + dt2.charAt(i);
    }

    var d = dt_fmt.substr( 4, 4 );
    d += dt_fmt.substr( 2, 2 );
    d += dt_fmt.substr( 0, 2 );
    dt = Number(d);

    var d1 = dt1_fmt.substr( 4, 4 );
    d1 += dt1_fmt.substr( 2, 2 );
    d1 += dt1_fmt.substr( 0, 2 );
    dt1 = Number(d1);

    if (period == 'true')
    {
      var d2 = dt2_fmt.substr( 4, 4 );
      d2 += dt2_fmt.substr( 2, 2 );
      d2 += dt2_fmt.substr( 0, 2 );
      dt2 = Number(d2);
    }

    if (period == 'false')
    {

      if ( test == '>' )
        if (!( dt > dt1))
          return_var = false;

      if ( test == '<' )
        if (!( dt < dt1))
          return_var = false;

      if ( test == '<=' )
        if (!( dt <= dt1))
          return_var = false;

      if ( test == '>=' )
        if (!( dt >= dt1))
          return_var = false;

      if ( test == '=' )
        if (!( dt == dt1))
          return_var = false;
    }
    else
    {
      if (! ((dt >= dt1) && (dt <= dt2)) )
          return_var = false;
    }

    if (return_var == false)
      alert(error);

  }// if (date != '')
  return return_var;
}

//Testa se um valor eh maior, menor ou igual a outra
//ou estah em um intervalo
//campo = campo onde esta se fazendo o teste
//data1 ou data2 = valor do campo
//teste = simbolos ('<' ,'>' ,'<=' ,'>=' ,'=')
function test_value(field, value, value1, value2, test, error, formName)
{
  vlr     = parseFloat(transform_value(value));
  vlr1    = parseFloat(transform_value(value1));
  vlr2    = parseFloat(transform_value(value2));
  return_var = true;

  if (value != '')
  {

    if ( (value1 != '') && (value2 != ''))//Verificacao de Intervalo
    {
      if ( (vlr < vlr1) || (vlr > vlr2) )
        return_var = false;
    }
    else //test condicional
    {

      if (test == '=')
        if (!(vlr == vlr1))
          return_var = false;

      if (test == '>')
        if (!(vlr > vlr1))
          return_var = false;

      if (test == '>=')
        if (!(vlr >= vlr1))
          return_var = false;

      if (test == '<')
        if (!(vlr < vlr1))
          return_var = false;

      if (test == '<=')
        if (!(vlr <= vlr1))
          return_var = false;
    }

    if (return_var == false)
      alert(error);

    return return_var;
  }
}




/*
 *
 *        MD5 IMPLEMENTATION
 *
 *
 */


/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Code also contributed by Greg Holt
 * See http://pajhome.org.uk/site/legal.html for details.
 */

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF)
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
  return (msw << 16) | (lsw & 0xFFFF)
}

/*
 * Bitwise rotate a 32-bit number to the left.
 */
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt))
}

/*
 * These functions implement the four basic operations the algorithm uses.
 */
function cmn(q, a, b, x, s, t)
{
  return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
}
function ff(a, b, c, d, x, s, t)
{
  return cmn((b & c) | ((~b) & d), a, b, x, s, t)
}
function gg(a, b, c, d, x, s, t)
{
  return cmn((b & d) | (c & (~d)), a, b, x, s, t)
}
function hh(a, b, c, d, x, s, t)
{
  return cmn(b ^ c ^ d, a, b, x, s, t)
}
function ii(a, b, c, d, x, s, t)
{
  return cmn(c ^ (b | (~d)), a, b, x, s, t)
}

/*
 * Calculate the MD5 of an array of little-endian words, producing an array
 * of little-endian words.
 */
function coreMD5(x)
{
  var a =  1732584193
  var b = -271733879
  var c = -1732584194
  var d =  271733878

  for(i = 0; i < x.length; i += 16)
  {
    var olda = a
    var oldb = b
    var oldc = c
    var oldd = d

    a = ff(a, b, c, d, x[i+ 0], 7 , -680876936)
    d = ff(d, a, b, c, x[i+ 1], 12, -389564586)
    c = ff(c, d, a, b, x[i+ 2], 17,  606105819)
    b = ff(b, c, d, a, x[i+ 3], 22, -1044525330)
    a = ff(a, b, c, d, x[i+ 4], 7 , -176418897)
    d = ff(d, a, b, c, x[i+ 5], 12,  1200080426)
    c = ff(c, d, a, b, x[i+ 6], 17, -1473231341)
    b = ff(b, c, d, a, x[i+ 7], 22, -45705983)
    a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416)
    d = ff(d, a, b, c, x[i+ 9], 12, -1958414417)
    c = ff(c, d, a, b, x[i+10], 17, -42063)
    b = ff(b, c, d, a, x[i+11], 22, -1990404162)
    a = ff(a, b, c, d, x[i+12], 7 ,  1804603682)
    d = ff(d, a, b, c, x[i+13], 12, -40341101)
    c = ff(c, d, a, b, x[i+14], 17, -1502002290)
    b = ff(b, c, d, a, x[i+15], 22,  1236535329)

    a = gg(a, b, c, d, x[i+ 1], 5 , -165796510)
    d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632)
    c = gg(c, d, a, b, x[i+11], 14,  643717713)
    b = gg(b, c, d, a, x[i+ 0], 20, -373897302)
    a = gg(a, b, c, d, x[i+ 5], 5 , -701558691)
    d = gg(d, a, b, c, x[i+10], 9 ,  38016083)
    c = gg(c, d, a, b, x[i+15], 14, -660478335)
    b = gg(b, c, d, a, x[i+ 4], 20, -405537848)
    a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438)
    d = gg(d, a, b, c, x[i+14], 9 , -1019803690)
    c = gg(c, d, a, b, x[i+ 3], 14, -187363961)
    b = gg(b, c, d, a, x[i+ 8], 20,  1163531501)
    a = gg(a, b, c, d, x[i+13], 5 , -1444681467)
    d = gg(d, a, b, c, x[i+ 2], 9 , -51403784)
    c = gg(c, d, a, b, x[i+ 7], 14,  1735328473)
    b = gg(b, c, d, a, x[i+12], 20, -1926607734)

    a = hh(a, b, c, d, x[i+ 5], 4 , -378558)
    d = hh(d, a, b, c, x[i+ 8], 11, -2022574463)
    c = hh(c, d, a, b, x[i+11], 16,  1839030562)
    b = hh(b, c, d, a, x[i+14], 23, -35309556)
    a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060)
    d = hh(d, a, b, c, x[i+ 4], 11,  1272893353)
    c = hh(c, d, a, b, x[i+ 7], 16, -155497632)
    b = hh(b, c, d, a, x[i+10], 23, -1094730640)
    a = hh(a, b, c, d, x[i+13], 4 ,  681279174)
    d = hh(d, a, b, c, x[i+ 0], 11, -358537222)
    c = hh(c, d, a, b, x[i+ 3], 16, -722521979)
    b = hh(b, c, d, a, x[i+ 6], 23,  76029189)
    a = hh(a, b, c, d, x[i+ 9], 4 , -640364487)
    d = hh(d, a, b, c, x[i+12], 11, -421815835)
    c = hh(c, d, a, b, x[i+15], 16,  530742520)
    b = hh(b, c, d, a, x[i+ 2], 23, -995338651)

    a = ii(a, b, c, d, x[i+ 0], 6 , -198630844)
    d = ii(d, a, b, c, x[i+ 7], 10,  1126891415)
    c = ii(c, d, a, b, x[i+14], 15, -1416354905)
    b = ii(b, c, d, a, x[i+ 5], 21, -57434055)
    a = ii(a, b, c, d, x[i+12], 6 ,  1700485571)
    d = ii(d, a, b, c, x[i+ 3], 10, -1894986606)
    c = ii(c, d, a, b, x[i+10], 15, -1051523)
    b = ii(b, c, d, a, x[i+ 1], 21, -2054922799)
    a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359)
    d = ii(d, a, b, c, x[i+15], 10, -30611744)
    c = ii(c, d, a, b, x[i+ 6], 15, -1560198380)
    b = ii(b, c, d, a, x[i+13], 21,  1309151649)
    a = ii(a, b, c, d, x[i+ 4], 6 , -145523070)
    d = ii(d, a, b, c, x[i+11], 10, -1120210379)
    c = ii(c, d, a, b, x[i+ 2], 15,  718787259)
    b = ii(b, c, d, a, x[i+ 9], 21, -343485551)

    a = safe_add(a, olda)
    b = safe_add(b, oldb)
    c = safe_add(c, oldc)
    d = safe_add(d, oldd)
  }
  return [a, b, c, d]
}

/*
 * Convert an array of little-endian words to a hex string.
 */
function binl2hex(binarray)
{
  var hex_tab = "0123456789abcdef"
  var str = ""
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8)) & 0xF)
  }
  return str
}

/*
 * Convert an array of little-endian words to a base64 encoded string.
 */
function binl2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  var str = ""
  for(var i = 0; i < binarray.length * 32; i += 6)
  {
    str += tab.charAt(((binarray[i>>5] << (i%32)) & 0x3F) |
                      ((binarray[i>>5+1] >> (32-i%32)) & 0x3F))
  }
  return str
}

/*
 * Convert an 8-bit character string to a sequence of 16-word blocks, stored
 * as an array, and append appropriate padding for MD4/5 calculation.
 * If any of the characters are >255, the high byte is silently ignored.
 */
function str2binl(str)
{
  var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
  var blks = new Array(nblk * 16)
  for(var i = 0; i < nblk * 16; i++) blks[i] = 0
  for(var i = 0; i < str.length; i++)
    blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8)
  blks[i>>2] |= 0x80 << ((i%4) * 8)
  blks[nblk*16-2] = str.length * 8
  return blks
}

/*
 * Convert a wide-character string to a sequence of 16-word blocks, stored as
 * an array, and append appropriate padding for MD4/5 calculation.
 */
function strw2binl(str)
{
  var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks
  var blks = new Array(nblk * 16)
  for(var i = 0; i < nblk * 16; i++) blks[i] = 0
  for(var i = 0; i < str.length; i++)
    blks[i>>1] |= str.charCodeAt(i) << ((i%2) * 16)
  blks[i>>1] |= 0x80 << ((i%2) * 16)
  blks[nblk*16-2] = str.length * 16
  return blks
}

/*
 * External interface
 */
function hexMD5 (str) { return binl2hex(coreMD5( str2binl(str))) }
function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) }
function b64MD5 (str) { return binl2b64(coreMD5( str2binl(str))) }
function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) }
/* Backward compatibility */
function calcMD5(str) { return binl2hex(coreMD5( str2binl(str))) }


/* ############ FUNCÕES DO EDITOR HTML  ################### */

function storeCaret(textEl)
{
  if (textEl.createTextRange) textEl.caretPos = document.selection.createRange().duplicate();
}

//Link
function LINK(formName, fieldName)
{
  var url = window.prompt("Digite o endereco:","");

  if(url !=null)
  {
  var link = window.prompt("Digite o texto:","")

  if(link !=null)
  {
    tmp = eval("document." + formName + "['" + fieldName + "']");
    text = ("<A HREF='HTTP://" + url + "' target='_blank' class='index_link'><U>" + link + "</U></A>\n");

    if (tmp.createTextRange && tmp.caretPos)
    {
      var caretPos = tmp.caretPos;
      caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
      tmp.focus();
    }
    else
    {
      tmp.value += ("<A HREF='HTTP://" + url + "' target='_blank' class='index_link'><U>" +
                 link + "</U></A>\n");
      tmp.focus();
    }
  }
  }
}

//Negrito
function B(formName, fieldName)
{
  var B = window.prompt("Digite o texto em negrito:","")
  if(B != null)
  {
  tmp = eval("document." + formName + "['" + fieldName + "']");
  text = "<B>" + B + "</B>";

  if (tmp.createTextRange && tmp.caretPos)
  {
    var caretPos = tmp.caretPos;
    caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
    tmp.focus();
  }
  else
  {
    tmp.value += ("<B>" + B + "</B>\n");
    tmp.focus();
  }
  }
}

//Itálico
function I(formName, fieldName)
{
  var I = window.prompt("Digite o texto em itálico:","")
  if(I != null)
  {
  tmp = eval("document." + formName + "['" + fieldName + "']");
  text = "<I>" + I + "</I>";

  if (tmp.createTextRange && tmp.caretPos)
  {
    var caretPos = tmp.caretPos;
    caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
    tmp.focus();
  }
  else
  {
    tmp.value += ("<I>" + I + "</I>\n");
    tmp.focus();
  }
  }
}

//Sublinhado
function U(formName, fieldName)
{
  var U = window.prompt("Digite o texto a ser sublinhado:","")
  if(U != null)
  {
  tmp = eval("document." + formName + "['" + fieldName + "']");
  text = "<U>" + U + "</U>";

  if (tmp.createTextRange && tmp.caretPos)
  {
    var caretPos = tmp.caretPos;
    caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
    tmp.focus();
  }
  else
  {
    tmp.value += ("<U>" + U + "</U>\n");
    tmp.focus();
  }
  }
}

//BR
function BR(formName, fieldName)
{
  tmp = eval("document." + formName + "['" + fieldName + "']");
  text = "<BR>";

  if (tmp.createTextRange && tmp.caretPos)
  {
  var caretPos = tmp.caretPos;
  caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
  tmp.focus();
  }
  else
  {
  tmp.value += ("<BR>\n");
  tmp.focus();
  }
}

//Espaço
function E(formName, fieldName)
{
  tmp = eval("document." + formName + "['" + fieldName + "']");
  text = "&nbsp;";

  if (tmp.createTextRange && tmp.caretPos)
  {
  var caretPos = tmp.caretPos;
  caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
  tmp.focus();
  }
  else
  {
  tmp.value += ("&nbsp;\n");
  tmp.focus();
  }
}

//Imagem
/*
function IMG(formName, fieldSelect, fieldText)
{

  tmp  = eval("document." + formName + "['" + fieldSelect + "']");
    tmp2 = eval("document." + formName + "['" + fieldText + "']");

  text = ' <img src="images/'+tmp[tmp.selectedIndex].value+'" border="0" align="" width="" height"">';

    if (tmp2.createTextRange && tmp2.caretPos)
  {
        var caretPos = tmp2.caretPos;
    caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
    tmp2.focus();
  }
  else
  {
    tmp2.value  += text;
    tmp2.focus();
  }
}
*/
function IMG(formName, fieldText, text)
{

  field = eval("document." + formName + "['" + fieldText + "']");

  if (field.createTextRange && field.caretPos)
  {
    var caretPos = field.caretPos;
    caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
    field.focus();
  }
  else
  {
    field.value  += text;
    field.focus();
  }
}


//Alinhamento
function ALIGN(formName, fieldSelect, fieldText)
{

  tmp  = eval("document." + formName + "['" + fieldSelect + "']");
    tmp2 = eval("document." + formName + "['" + fieldText + "']");

  text = '<div align="'+tmp[tmp.selectedIndex].value+'"> </div>';

    if (tmp2.createTextRange && tmp2.caretPos)
  {
        var caretPos = tmp2.caretPos;
    caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
    tmp2.focus();
  }
  else
  {
    tmp2.value  += text;
    tmp2.focus();
  }
}

/* DUALLIST */

function compareOptionValues (a, b)
{
  var sA = parseInt(a.value, 36);
  var sB = parseInt(b.value, 36);

  return sA - sB;
}

function moveDualList (srcList, destList, moveAll, selected)
{
  if ((srcList.selectedIndex == -1) && (moveAll == false))
    return false;

  newDestList = new Array();

  var end = 0;

  for (end = 0; end < destList.options.length; end++)
  {
    if (destList.options[end] != null)
      newDestList[end] = new Option(destList.options[end].text, destList.options[end].value);
  }

  for (var i = 0; i < srcList.options.length; i++)
  {
    if (srcList.options[i] != null && (srcList.options[i].selected == true || moveAll))
    {
      newDestList[end] = new Option(srcList.options[i].text, srcList.options[i].value);
      end++;
    }
  }

  newDestList.sort(compareOptionValues);

  for (var j = 0; j < newDestList.length; j++)
  {
    if (newDestList[j] != null)
      destList.options[j] = newDestList[j];
  }

  for (var i = srcList.options.length - 1; i >= 0; i--)
  {
    if (srcList.options[i] != null && (srcList.options[i].selected == true || moveAll))
      srcList.options[i] = null;
  }
}

function SelectDualListOptions (field)
{
  for(i = 0; i < dual_list.options.length; i++)
    dual_list.options[i].selected = true;
}


//Função utilizada para formatar valores em dinheiro
function return_formatted_value(value, size, digits)
{
  total_size = size;

  if (digits > 0)
    total_size++;

  points = size - digits;
  points = parseInt(String( (points / 3) ), 10);

  if ((size - digits) % 3 == 0)
    points--;

  total_size += points;
  total_size = total_size;

  actual_size = value.length;

  new_value = "";

  for (i = 0; i < actual_size; i++)
    if (value.charAt(i) != ',' && value.charAt(i) != '.')
      new_value = new_value + value.charAt(i);
 
  if (new_value.length > digits)
    new_value = new_value.substr(0, new_value.length - digits) + ',' + 
                new_value.substr(new_value.length - digits, digits);
  j = 0;

  str_tmp = "";

  for (i = new_value.length - 1; i >= 0 ; i--)
  {
    if (new_value.charCodeAt(i) >= 48 && new_value.charAt(i) <= 57)
      j++;

    if (new_value.charAt(i) == ',')
      j = 0;

    str_tmp = new_value.charAt(i) + str_tmp;

    if (j == 3 && i > 0 && new_value.charAt(i - 1) != ",")
    {
      str_tmp =  '.' + str_tmp;
      j = 0;
    }
  }

  value = str_tmp;

  return  value;
}

function add_digits(value, digits)
{
  if (value.length <= digits)
  {
    for(i = 0; i < digits; i++)
      value += 0;
  }

  return value;
}

function format_money(value, digits)
{
  virgula   = false;
  precisao  = false;
  new_value = "";
  j         = 0;

  //retira caracteres não numéricos 
  for (i = 0; i < value.length; i++)
  {
    if (value.charAt(i) != "." && value.charAt(i) != ",")
      new_value += value.charAt(i);
    else
      precisao = true;
  }
  
  //complementa o valor com 0(s)
  if (precisao == false)
  {
    for(i = 0; i < digits; i++)
      new_value += 0;
  }
  else
  {
    if (new_value.length <= digits)
    {
      for(i = 0; i < ((digits + 1) - digits); i++)
        new_value += 0;
    }
  }
  
  value = "";
  
  //formata com . e ,
  for (i = (new_value.length - 1); i >= 0; i--)
  { 
    j++;
    
    value = new_value.charAt(i) + value;

    if (j == digits && virgula == false && i != 0)
    {
      virgula  = true;
      value    = "," + value;
      j        = 0;
    }
    else
    {
      if (j == 3 && i != 0)
      {
        value = "." + value;
        j     = 0;
      }
    }
  }//for (i = (new_value.length - 1); i >= 0; i--)
  
  return value;
}

function nova_janela(local,nomeJanela,w,h) {
    LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
	TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
    path = local;
    janela = new Object();
    janela = window.open(path,nomeJanela,'width='+w+',height='+h+',top='+TopPosition+',left='+LeftPosition+',scrollbars=yes,resizable=yes');
    janela.focus();
}

function numbersOnly( event ) { 
	if ( !event ){
		 var event = window.event; 
	}
	
	if ( event.keyCode ){
		if(event.keyCode != 46){
		
		     if ( event.keyCode <= 46 || event.keyCode > 57 ){
				   event.returnValue = false; 
			 }
		}
	
	}else{ 
	    
		if ( (event.which < 45 || event.which > 57) || (event.which == 47) ){
		        event.preventDefault();
	     }
	}
}


var isNN = (navigator.appName.indexOf("Netscape")!=-1);
var keyCode ; var filter;

function autoTab(input,len, e) {
keyCode = (isNN) ? e.which : e.keyCode; 
filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,38,39,40,46];
	if(input.value.length >= len && !containsElement(filter,keyCode)) {
		input.value = input.value.slice(0, len);
		input.form[(getIndex(input)+1) % input.form.length].focus();
	}
function containsElement(arr, ele) {
	var found = false, index = 0;
	while(!found && index < arr.length)
	if(arr[index] == ele)
		found = true;
		else
		index++;
		return found;
	}
function getIndex(input) {
	var index = -1, i = 0, found = false;
	while (i < input.form.length && index == -1)
	if (input.form[i] == input)index = i;
		else i++;
		return index;
	}
return true;
}

function enter( event,frm,campo,acao) { 
	if ( !event ) var event = window.event;
	//var oEvent = (oEvent)? oEvent : event;
	if ( event.keyCode==13 ) { 
	
	    setTimeout(acao,100);
	}
}
function strpos( haystack, needle, offset){
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Onno Marsman    
    // *     example 1: strpos('Kevin van Zonneveld', 'e', 5);
    // *     returns 1: 14
 
    var i = (haystack+'').indexOf( needle, offset ); 
    return i===-1 ? false : i;
}
