/* *******************************************************************
Função calculadv(peso,valor,acao,AnoProc) 
        

OBSERVAÇÃO - 
Inclusão do parâmetro AnoProc para a avaliação das duas regras
 de calculo de Dv para numero de processo. 22/11/2000
 O parâmetro AnoProc NÃO precisa ser declarado na função.
 O parametro é passado automaticamente pela rotina processo.js
 A declaração da fç continua seguindo as regras abaixo !! 

1-PESO  => valor adotado na regra específica do Dv.
                     
           Para o SIAPA      -> peso = "SIAPA"
           Para o SPIU       -> peso = "SPIU"
           Para o NºProcesso -> peso = "PROC"
           Para o CPF        -> peso = "CPF"
           Para o CGC        -> peso = "CGC"
		
		   Obs= O peso pode ser um número ou a sigla em maiúscula.
		        Caso seja a sigla , deve estar entre aspas duplas.	 	

2-VALOR => campo a ser verificado. Deve ser numérico
          

3-AÇÃO  => PARÂMETRO :
           
           Para Testar o Dv informado -> ação = 'T' ou 't'
           Para Gerar  o Dv			  -> ação = 'G' ou 'g'
          
           Obs= deve estar entre aspas duplas.
           
 RETORNO DA FUNÇÃO
      
      Formato Caso OK -> 0+(valor com Dv) 
		EX.: se o RIP SPIU = 138902891000,sem o Dv.
			 retorno = "01389028910008" 
                            
      Formato Caso NOK -> 1
        EX.: se o Dv informado para o mesmo RIP SPIU = 7
             Retorno = "1"   
           
EXEMPLO  
Gerar  o Dv de um RIP SPIU    
           calculadv(SPIU,138902891000,'g')
           retorno = "01389028910008" 
           
Testar o Dv de um RIP SPIU    
           
           SE O RETORNO OK :
           
           calculadv(SPIU,1389028910008,'g')
           retorno = "01389028910008" 
           
           SE O RETORNO NOK :
           
           calculadv(SPIU,1389028910007,'g')
           retorno = "1" 
           
           
           
********************************************************************** */


function calculadv1(peso,valor,acao,AnoProc)

{
  
 switch (peso)
 { 
  case "SPIU":
    
  break 
  case "SIAPA":
    peso = 9
  break 
  case "CGC" :
    peso = 9
  break 
  case "CPF" :
    peso = 11 
  break 
  case "PROC" :
    peso = 99 
  }
 
 
 tamanho   = valor.length;   //Tamanho do Campo(nº de algarismos)
 Somatoria = 0;              //Criada pela regra do DV(inicializada com zero)
 indice    = 2;              //Indice (Ver Regra de Dv) 
 t = 0;T=0;
 g = 0;G=0;
 
 /*
 Chama a fç que calcula o Dv. A fç é chamada duas vezes :
 A primeira para calcular o primeiro Dv e assim por diante
 (na maioria dos casos apenas dois EX:23034948-23 
 */
 var dvdado;
 if ((acao== "T" )||(acao== "t")) //Testa Dv Informado
 
 
 {
  
  if (peso == "SPIU") 
     n = 1; 
  else
     n = 2;
  
  dvdado = valor.substring(valor.length - n,valor.length);
  valor  = valor.substring(0,valor.length - n);
  tamanho   = valor.length;
 }
 
 if ((acao=="G")||(acao=="g"))   //Gera Dv
   dvdado = "";
 
 if (peso!= "SPIU") 
 //este if pode ser retirado posteriormente
 {
  var Ano84 = "0";
  calcula1(valor,tamanho,indice,peso,AnoProc,Ano84);
  Dv1 = Dv;
  
  Somatoria = 0;
  calcula1( valor + Dv1 ,tamanho + 1,indice,peso,AnoProc,Ano84);
  
  Dv2 = Dv;
  Dvs = ""+Dv1 + Dv2+"" ;
 
}
  else 
 {
  peso = 9;
  calcula1(valor,tamanho,indice,peso); 
  Dvs = Dv ;
  
 } 

 DvCalculado = valor + Dvs;  

if (dvdado!= "")
  {
   if(dvdado == Dvs)
      return("0" + DvCalculado);
     else
       {
          if (AnoProc == "1984")
           
            {
            
            var Ano84 = "84";
            calcula1(valor,tamanho,indice,peso,AnoProc,Ano84); 
			Dv1 = Dv;
			Somatoria = 0;
			calcula1(valor + Dv1,tamanho+1,indice,peso,AnoProc,Ano84);
			Dv2 = Dv;
			Dvs = ""+Dv1 + Dv2+"" ;
              if(dvdado == Dvs)
               return("0" + DvCalculado);
              else
              alert ("else 1") 
               return("1");
           }
      return("0" + DvCalculado);
       
       }
   } 
else 
   
   return("0" + DvCalculado);
   
}


function calcula1(valor,tamanho,indice,peso,AnoProc,Ano84)
 {
 while (tamanho != 0) 
  {
   Somatoria = (valor.substring(tamanho-1,tamanho)* indice) + Somatoria ;
   tamanho = tamanho - 1; 
   indice = indice + 1;
     if (indice > peso)
    {indice = 2; }
   }
 k = (Math.floor(Somatoria/11)) * 11;
 
 Modval = Somatoria-k ;
 Dvcomp = 11 - Modval;
 Dv = Dvcomp; 




 if (((AnoProc) && (Dv == 10))||((AnoProc) && (Dv == 11)))
   {
     
     
     if (Dvcomp == 10 ) Dv = 0;
     if (Dvcomp == 11 ) Dv = 1;
    
   
   if (AnoProc < 1984) //Serpro  // 
	{
	
	if (Dvcomp == 10 || Dvcomp == 11)
	{Dv = 0;}
    }
   if (AnoProc > 1984) //Fazenda
    {
    if (Dvcomp == 10 ) Dv = 0;
    if (Dvcomp == 11 ) Dv = 1;
    
    } 
   }
 else 	
  {
  if (AnoProc) 
    {
    if (Dvcomp == 10 ) Dv = 0;
    if (Dvcomp == 11 ) Dv = 1;
    }
   else
    {
    if (Dvcomp == 10 ) Dv = 0;
    if (Dvcomp == 11 ) Dv = 0;
    }
  }
   
  
  if ((Ano84)&&(Ano84 == "84"))
     {
	
	
	if ((Dvcomp == 10) ||(Dvcomp == 11))
	{Dv = 0;}
    }
 
 
 return(Dv);
 }


