<?
  define
"ODD"FALSE);
  
define"EVEN"TRUE);

  
$l_odd = array (
      array(
FALSEFALSE,  TRUE,  TRUEFALSE),
      array(
FALSE,  TRUE,  TRUEFALSEFALSE),
      array(
FALSE,  TRUEFALSEFALSE,  TRUE),
      array( 
TRUE,  TRUE,  TRUE,  TRUEFALSE),
      array( 
TRUEFALSEFALSEFALSE,  TRUE),
      array( 
TRUE,  TRUEFALSEFALSEFALSE),
      array( 
TRUEFALSE,  TRUE,  TRUE,  TRUE),
      array( 
TRUE,  TRUE,  TRUEFALSE,  TRUE),
      array( 
TRUE,  TRUEFALSE,  TRUE,  TRUE),
      array(
FALSEFALSE,  TRUEFALSE,  TRUE));
  
$l_even = array (
      array( 
TRUEFALSEFALSE,  TRUE,  TRUE),
      array( 
TRUE,  TRUEFALSEFALSE,  TRUE),
      array(
FALSE,  TRUE,  TRUEFALSE,  TRUE),
      array( 
TRUEFALSEFALSEFALSEFALSE),
      array(
FALSE,  TRUE,  TRUE,  TRUEFALSE),
      array( 
TRUE,  TRUE,  TRUEFALSEFALSE),
      array(
FALSEFALSEFALSE,  TRUEFALSE),
      array(
FALSE,  TRUEFALSEFALSEFALSE),
      array(
FALSEFALSE,  TRUEFALSEFALSE),
      array(
FALSE,  TRUEFALSE,  TRUE,  TRUE));
  
$r = array (
      array( 
TRUE,  TRUEFALSEFALSE,  TRUE),
      array( 
TRUEFALSEFALSE,  TRUE,  TRUE),
      array( 
TRUEFALSE,  TRUE,  TRUEFALSE),
      array(
FALSEFALSEFALSEFALSE,  TRUE),
      array(
FALSE,  TRUE,  TRUE,  TRUEFALSE),
      array(
FALSEFALSE,  TRUE,  TRUE,  TRUE),
      array(
FALSE,  TRUEFALSEFALSEFALSE),
      array(
FALSEFALSEFALSE,  TRUEFALSE),
      array(
FALSEFALSE,  TRUEFALSEFALSE),
      array( 
TRUE,  TRUEFALSE,  TRUEFALSE));
  
$par = array (
      array( 
ODDODDODDODDODDODD),
      array( 
ODDODD,EVENODD,EVEN,EVEN),
      array( 
ODDODD,EVEN,EVENODD,EVEN),
      array( 
ODDODD,EVEN,EVEN,EVENODD),
      array( 
ODD,EVENODDODD,EVEN,EVEN),
      array( 
ODD,EVEN,EVENODDODD,EVEN),
      array( 
ODD,EVEN,EVEN,EVENODDODD),
      array( 
ODD,EVENODD,EVENODD,EVEN),
      array( 
ODD,EVENODD,EVEN,EVENODD),
      array( 
ODD,EVEN,EVENODD,EVENODD));

  function 
barcode_check($type$code) {
    switch (
$type) {
      case(
"ISBN")  : 
        if (
strlen($code) != 13) return false;
        
$code str_replace("-","",$code); 
        if (
strlen($code) != 10) return false;
        break;
      case(
"EAN-2") :
        if (
strlen($code) != 2) return false;
        break;
      case(
"EAN-8") :
        if (
strlen($code) != 8) return false;
        break;
      case(
"EAN-13") :
        if (
strlen($code) != 13) return false;
        break;
      case(
"UPC-A") :
        if (
strlen($code) != 12) return false;
        break;
      default: return;
    }
    if (!
is_numeric($code)) return false;
    return 
true;
  }

  function 
barcode_check_checksum ($type$code) {
    switch(
$type) {
      case(
"EAN-2")  : return true// No checksum for EAN2 via numbers
      
case("ISBN")   : $code isbn_to_ean_13($code); break;
      case(
"EAN-8")  :
      case(
"UPC-A")  : $code '0' $code;
      case(
"EAN-13") : break;
      default: return;
    }
    return (
substr($code, -11) == barcode_checksum("EAN-13",substr($code0, -1))); break;
  }

  function 
barcode_checksum($type$code) {
    switch(
$type) {
      case(
"EAN-2")  : return 0// EAN-2 has no checksum number
      
case("ISBN")   : $code isbn_to_ean_13($code); break;
      case(
"EAN-8")  :
      case(
"UPC-A")  : $code '0' $code;
      case(
"EAN-13") : break;
      default: return;
    }
    for (
$count 1$count strlen($code); $count+=2$total += $code[$count];
    
$total *= 3;
    for (
$count 0$count strlen($code); $count+=2$total += $code[$count];

    return (
10 $total 10) % 10;
  }

  function 
isbn_to_EAN_13 ($isbn) {
    for (
$i=0;$i<strlen($isbn);$i++)
    {
      
$ascii_code=ord($isbn[$i]);
      if (
$ascii_code >=48 && $asci_code <=57) continue;
      
$isbn cutchar($isbn,$i);
      
$i--;
    }
    
$isbn "978" substr($isbn,0,9);
    return 
$isbn barcode_checksum("EAN-13"$isbn);
  }

  function 
cutchar($string$number) {
    return (
substr($string,0,$number) . substr($string,$number+1));
  }

  function 
barcode_binbar($type$code) {
    global 
$l_odd$l_even$r$par;
    switch(
$type) {
      case(
"ISBN")   : $code isbn_to_ean_13($code); break;
      case(
"EAN-8")  :
      case(
"UPC-A")  : $code '0' $code;
      case(
"EAN-2")  : 
      case(
"EAN-13") : break;
      default: return;
    }

    if (
$type!="EAN-2") {
      
$first substr($code,0,1);
      
$code substr($code,1);
    }

    
//make binairy array
    
$binbar = array( TRUEFALSETRUE );

    if (
$type=="EAN-2") {
      
$binbar = array ( FALSETRUEFALSETRUETRUE );
      
$ean2par $code 4;
      
$code .= '00'// padding to fix counting difference
    
}

    for (
$count 0$count strlen($code) / 2$count++) {
      
$binbar[] = FALSE;
      if (
$type=="EAN-2") {
        if (
$ean2par & ($count+1)) {
          
$binbar array_merge$binbar$l_odd[$code[$count]] );
        } else {
          
$binbar array_merge$binbar$l_even[$code[$count]] );
        }
      } else {
        if (
$par[$first][$count] == ODD) {
          
$binbar array_merge$binbar$l_odd[$code[$count]] );
        } else {
          
$binbar array_merge$binbar$l_even[$code[$count]] );
        }
      }
      
$binbar[] = TRUE;
      if (
$type=="EAN-2" && $count==0) { // Separator
        
$binbar[] = FALSE;
        
$binbar[] = TRUE;
      }
    }
    if (
$type!="EAN-2") {
      
$binbar array_merge$binbar, array ( FALSETRUEFALSETRUEFALSE ) );
      for (
$count 0$count strlen($code) / 2$count++) {
        
$binbar[] = TRUE;
        
$binbar array_merge$binbar$r[$code[$count strlen($code)/2]] );
        
$binbar[] = FALSE;
      }
      
$binbar array_merge$binbar, array ( TRUEFALSETRUE ) );
    }
    return 
$binbar;
  }

  function 
binbartoimage($binbar$widthperline$height) {
    
$image imagecreatetruecolor(count($binbar) * $widthperline$height);
    
$white imagecolorallocate($image255255255);
    
$black imagecolorallocate($image000);
    foreach (
$binbar as $num => $sign) {
      
imagefilledrectangle($image$num*$widthperline,0,($num+1)*$widthperline,$height,($sign=="TRUE"?$black:$white));
    }
    return 
$image;
  }
?>