<?php // Licence Publique Générale GNU (GNU General Publique License), Copyright 2005-2008 Geffrotin Yann
  
  // ISO 3166-1, ISO/IEC 7812-1, ISO/IEC 7812-2, ISO 7816, ISO 8583-1
  
  if(isset($_SESSION["mailcli"])) //si les sessions sont pleines
  {
	mysql_select_db($base,$connexion) or die ("<p class='erreur'>La base est introuvable.</p>");
	
	//$CCN = "5678027641919827";
	
	$etatCCN = false;
	
	//1. Enlever les caractères indésirables : tout sauf les chiffres de 0 à 9
	
	for($n=32;$n<=47;$n++){
		$CCN = str_replace(chr($n), "", $CCN); // Supprimer tout les caractères ASCII de 32 à 47
	}
	
	for($n=58;$n<=128;$n++){
		$CCN = str_replace(chr($n), "", $CCN); // Supprimer tout les caractères ASCII de 58 à 128
	}
		
	//echo "<p class='reussi'>Le numéro de carte de crédit (CCN) est <strong>$CCN</strong>.</p>";
	  
      //2. Extraction des données (19 caractères max)
      
      $MII = substr($CCN, 0, 1); // Major Industry Identifier (MII), 1 chiffre
      $BIN = substr($CCN, 0, 6); // Bank Identification Number (BIN) ou Issuer Identification Number (IIN), 6 chiffres
      //country code,  http://en.wikipedia.org/wiki/ISO_3166-1_numeric, 3 chiffres
      $IAN = substr($CCN, 6, 9); // Individual Account Number (IAN), 9 chiffres
      $VCC = substr($CCN, strlen($CCN)-1, 1); // Validity Check Code (VCC) or Luhn algorithm, 1 chiffre
  
      //3. Vérification MII
      
      $MIICategory = array("ISO/TC 68 and other industry assignments","Airlines","Airlines and other industry assignments","Travel and entertainment","Banking and financial","Banking and financial","Merchandizing and banking","Petroleum","Telecommunications and other industry assignments","National assignment");
      
      //echo "<p class='reussi'>Son Major Industry Identifier (MII) est <strong>$MII</strong>, et correspond a <strong>$MIICategory[$MII]</strong>.</p>"; 
      
      //4. Vérification BIN (The American Bankers Association is the registration authority for IINs.)
      // Cherche d'abord les chaine de 6 char puis 5 puis 4 etc, par ordre décroissant, pour trouver le meilleur BIN en premier
      
      $etatBIN = false;
      
      if(strlen($BIN) >= 6){ //si taille totale de la chaine < à 6 alors
        $SubstrBIN = substr($BIN, 0, 6); // cas normal
      }else{
        $SubstrBIN = substr($BIN, 0, strlen($BIN)); 
      }
      
      do{
          
        $requete_cc_type = "Select * from freepay_cc_type order by ccprefix DESC;";
        $resultat_cc_type = mysql_query($requete_cc_type,$connexion); //connexion de la requete
        $ligne = mysql_fetch_assoc($resultat_cc_type); //affichage des résultats
          
        if (!empty($ligne)){
          do{
            
            $sizeofccprefix = strlen($ligne["ccprefix"]); //calcul taille du prefix de la table
            
            if($sizeofccprefix == strlen($SubstrBIN)){ // si égalité des tailles de préfixes
              //echo "prefixe : ".$ligne["ccprefix"]."<br/>";
              //echo "taille prefixe : ".$sizeofccprefix."<br/>";
              //echo "taille souschaine : ".$SubstrBIN."<br/>";
              
              if($ligne["ccprefix"] == $SubstrBIN){
                $etatBIN = true;
                $NomIssuerIN = $ligne["cctype"]; 
                //echo "<p class='reussi'>nom type carte trouve : ".$NomIssuerIN."</p>";
                $LongueurChCCN = $ligne["cclong"];
              }
              
            }
            $ligne = mysql_fetch_assoc($resultat_cc_type);
            
          }while($etatBIN != true && strlen($ligne["cclong"])==2);
        }
        
        if($etatBIN != true){ //si pas trouve, réessaye avec prefixe plus court
          $SubstrBIN = substr($SubstrBIN, 0, strlen($SubstrBIN)-1);
          //echo "<p class='info'>reduction taille du préfixe de 1 : ".$SubstrBIN."</p>";
        }
        
      }while($etatBIN != true && $SubstrBIN!="");
      
      if (true == $etatBIN){
        
        //echo "<p class='reussi'>L'Issuer Identification Number (IIN) est <strong>$BIN</strong>, et correspond à <strong>$NomIssuerIN</strong>.</p>";
        
        //5. Vérification Longueur
          if ($LongueurChCCN == strlen($CCN) ){
            //echo "<p class='reussi'>La longueur du CCN est correcte.</p>";
            
            //6. Vérification IAN (à faire)
            //echo "<p class='reussi'>L'Individual Account Number (IAN) est <strong>$IAN</strong>.</p>"; 
            
            //7. Vérification par la Formule de Luhn
          
            $somme = 0;
            
            $InverseCCN = strrev ($CCN); // Inverse
            
            for($j=0; $j<$LongueurChCCN; $j++){
            
              $chiffre = $InverseCCN[$j];
              
              if($j==1 or $j==3 or $j==5 or $j==7 or $j==9 or $j==11 or $j==13 or $j==15 or $j==17 or $j==19){ 
                $chiffre = $chiffre * 2; // Doubler les chiffres impaires
              }
              
              if( $chiffre > 9 ){ 
                $chiffre = $chiffre - 9; //(ex : 14 -> 1+4 -> 5, 18 -> 1+8 -> 9)
              }
              
              $somme = $somme + $chiffre; // Ajouter à la somme
            }
            
            if(bcmod($somme, '10') == 0){ // Si modulo 10 de la somme vaut 0 alors CCN vrai sinon faux
              $etatCCN = true; // algorithme de Luhn correct
            }else{
              //algorithme de Luhn
              if(0 == $VCC){
                $MettreVCC = 10 - bcmod($somme, '10');
              }else{
                if($VCC < bcmod($somme, '10') ){
                  $MettreVCC = 10 + $VCC - bcmod($somme, '10');
                }else{
                  $MettreVCC = $VCC - bcmod($somme, '10');
                }
              }
              
              echo "<p class='info'>Pour que le numéro de la carte <strong>$NomIssuerIN</strong> soit validé, veuiller corriger les premiers chiffres ou remplacer le dernier chiffre (<strong>$VCC</strong>) par <strong>".$MettreVCC."</strong>.</p>";
            }
        
          }else{
            echo "<p class='erreur'>La carte <strong>$NomIssuerIN</strong> a une longueur de <strong>".strlen($CCN)."</strong> alors qu'elle devrait faire <strong>".$LongueurChCCN."</strong></p>";
          }
          
      }else{
        echo "<p class='erreur'>L'Issuer Identification Number (IIN) <strong>$BIN</strong> n'est pas enregisté dans la <a href='".$AdresseFreePay."services/cb/cb_liste_prefixes.php'>liste des préfixes acceptés</a>.</p>";
      }
      
  }
  
?>
