<?php // Licence Publique Générale GNU (GNU General Publique License), Copyright 2005-2008 Geffrotin Yann

  // Génération du code ISIN
  
  /* ISO 6166, ISIN : International Securities Identification Number
   (http://en.wikipedia.org/wiki/International_Securities_Identifying_Number) */
   
  include("NSIN_gen.php"); //Calcul du NSIN (National Securities Identifying Number)
  //echo "NSIN ".$NSIN."</br>";
    
  
  include("ISO_3166_1_alpha_2.php"); //ISO 3166-1 alpha-2
  $CodeDuPays =  $_SESSION["payscli"]; //aléatoire : $ISO_3166_1_alpha_2["".rand(0, 243).""];
  //echo "Pays ".$CodeDuPays."</br>";
    
    
  //Calcul de l'ISIN (International Securities Identification Number)
  
  
  $SansCléISIN = $CodeDuPays.$NSIN;
  $CléISIN = "10";
 
  do{
    
    if($CléISIN != 0){
      $CléISIN = $CléISIN - 1;
    }else{
      include("NSIN_gen.php"); //Calcul du NSIN (National Securities Identifying Number)
      $SansCléISIN = $CodeDuPays.$NSIN; // nouveau NSIN aléatoire
      $CléISIN = "9";
    }
    
    $ISIN = $SansCléISIN.$CléISIN; //9 caractères (lettres et/ou chiffres)
    
    
  //Etape 1 : Convertir toutes les lettres en nombres via une table de conversion (A=10, B=11, C=12 etc)
    
    $taille = strlen($ISIN); //extraction de la taille de la chaine
    
      $Chaine = $ISIN;
      for($j='0';$j<=$taille-1;$j++)
      {
        if (ereg ("[A-Z]", $Chaine[$j])){ // Trouve si lettre existe et réassemble le tout
          $Chaine = substr($Chaine, 0, $j).base_convert($Chaine[$j], 36, 10).substr($Chaine, $j+1, $taille); 
          $taille = $taille + 1 ; // La lettre est codé sur 2 chiffres
          $j = $j + 1 ;
        }
      }
  
  //Etape 2 : Doubler les valeurs des chiffres paires
    
    $Tpaire = $Timpaire = "" ;
    for($k=0;$k<=$taille-1;$k++){
      if(bcmod($k, '2') == 0){
        $Tpaire = $Tpaire.($Chaine[$k]*2);
      }else{
        $Timpaire = $Timpaire.$Chaine[$k];
      }
    }
  
  //Etape 3 : Somme des chiffres Paires et Impaires pris séparement
    
    $ListeChaine = $Tpaire.$Timpaire;
    $TailleListeChaine = strlen($ListeChaine);
    
    $SomChaine = 0 ;
    for($l=0;$l<=$TailleListeChaine-1;$l++){
      $SomChaine = $SomChaine + $ListeChaine[$l];
    }
    
  // Etape 4 : Modulo 10 de la somme de l'ISIN 
  
    if(0 == substr($SomChaine, 1, 1)){
      $CléChaineCalc = 0 ;
    }else{
      $CléChaineCalc = 10 - bcmod($SomChaine, '10');
    }
  
  }while($CléISIN != $CléChaineCalc);
  
  $ISIN = $SansCléISIN.$CléISIN; // 2 + 9 + 1 char
  
  //echo "ISIN ".$ISIN."</br>";

  
?>
