<?php
/***************************************************
 *             Kody kreskowe - Code 128            *
 ***************************************************
 * Ostatnia modyfikacja: 01.11.2012                *
 * Autor: Jacek Kowalski (http://jacekk.info)      *
 *                                                 *
 * Strona WWW: http://jacekk.info/scripts/barcodes *
 *                                                 *
 * Utwór rozprowadzany na licencji                 *
 * http://creativecommons.org/licenses/by-nc/2.5/  *
 ***************************************************/

/* Kodowanie znaków UTF-8 */

$id_to_sign = array(
    
'0' => array(' ''00''11011001100'),
    
'1' => array('!''01''11001101100'),
    
'2' => array('"''02''11001100110'),
    
'3' => array('#''03''10010011000'),
    
'4' => array('$''04''10010001100'),
    
'5' => array('%''05''10001001100'),
    
'6' => array('&''06''10011001000'),
    
'7' => array('\'''07''10011000100'),
    
'8' => array('(''08''10001100100'),
    
'9' => array(')''09''11001001000'),
    
'10' => array('*''10''11001000100'),
    
'11' => array('+''11''11000100100'),
    
'12' => array(',''12''10110011100'),
    
'13' => array('-''13''10011011100'),
    
'14' => array('.''14''10011001110'),
    
'15' => array('/''15''10111001100'),
    
'16' => array('0''16''10011101100'),
    
'17' => array('1''17''10011100110'),
    
'18' => array('2''18''11001110010'),
    
'19' => array('3''19''11001011100'),
    
'20' => array('4''20''11001001110'),
    
'21' => array('5''21''11011100100'),
    
'22' => array('6''22''11001110100'),
    
'23' => array('7''23''11101101110'),
    
'24' => array('8''24''11101001100'),
    
'25' => array('9''25''11100101100'),
    
'26' => array(':''26''11100100110'),
    
'27' => array(';''27''11101100100'),
    
'28' => array('<''28''11100110100'),
    
'29' => array('=''29''11100110010'),
    
'30' => array('>''30''11011011000'),
    
'31' => array('?''31''11011000110'),
    
'32' => array('@''32''11000110110'),
    
'33' => array('A''33''10100011000'),
    
'34' => array('B''34''10001011000'),
    
'35' => array('C''35''10001000110'),
    
'36' => array('D''36''10110001000'),
    
'37' => array('E''37''10001101000'),
    
'38' => array('F''38''10001100010'),
    
'39' => array('G''39''11010001000'),
    
'40' => array('H''40''11000101000'),
    
'41' => array('I''41''11000100010'),
    
'42' => array('J''42''10110111000'),
    
'43' => array('K''43''10110001110'),
    
'44' => array('L''44''10001101110'),
    
'45' => array('M''45''10111011000'),
    
'46' => array('N''46''10111000110'),
    
'47' => array('O''47''10001110110'),
    
'48' => array('P''48''11101110110'),
    
'49' => array('Q''49''11010001110'),
    
'50' => array('R''50''11000101110'),
    
'51' => array('S''51''11011101000'),
    
'52' => array('T''52''11011100010'),
    
'53' => array('U''53''11011101110'),
    
'54' => array('V''54''11101011000'),
    
'55' => array('W''55''11101000110'),
    
'56' => array('X''56''11100010110'),
    
'57' => array('Y''57''11101101000'),
    
'58' => array('Z''58''11101100010'),
    
'59' => array('[''59''11100011010'),
    
'60' => array('\\''60''11101111010'),
    
'61' => array(']''61''11001000010'),
    
'62' => array('^''62''11110001010'),
    
'63' => array('_''63''10100110000'),
    
'64' => array('`''64''10100001100'),
    
'65' => array('a''65''10010110000'),
    
'66' => array('b''66''10010000110'),
    
'67' => array('c''67''10000101100'),
    
'68' => array('d''68''10000100110'),
    
'69' => array('e''69''10110010000'),
    
'70' => array('f''70''10110000100'),
    
'71' => array('g''71''10011010000'),
    
'72' => array('h''72''10011000010'),
    
'73' => array('i''73''10000110100'),
    
'74' => array('j''74''10000110010'),
    
'75' => array('k''75''11000010010'),
    
'76' => array('l''76''11001010000'),
    
'77' => array('m''77''11110111010'),
    
'78' => array('n''78''11000010100'),
    
'79' => array('o''79''10001111010'),
    
'80' => array('p''80''10100111100'),
    
'81' => array('q''81''10010111100'),
    
'82' => array('r''82''10010011110'),
    
'83' => array('s''83''10111100100'),
    
'84' => array('t''84''10011110100'),
    
'85' => array('u''85''10011110010'),
    
'86' => array('v''86''11110100100'),
    
'87' => array('w''87''11110010100'),
    
'88' => array('x''88''11110010010'),
    
'89' => array('y''89''11011011110'),
    
'90' => array('z''90''11011110110'),
    
'91' => array('{''91''11110110110'),
    
'92' => array('|''92''10101111000'),
    
'93' => array('}''93''10100011110'),
    
'94' => array('~''94''10001011110'),
    
'95' => array('del''95''10111101000'),
    
'96' => array('Fnc 3''96''10111100010'),
    
'97' => array('Fnc 2''97''11110101000'),
    
'98' => array('Shift''98''11110100010'),
    
'99' => array('Code C''99''10111011110'),
    
'100' => array('Fnc 4''Code B''10111101110'),
    
'101' => array('Code A''Code A''11101011110'),
    
'102' => array('Fnc 1''Fnc 1''11110101110'),
    
'103' => array('Start A''Start A''11010000100'),
    
'104' => array('Start B''Start B''11010010000'),
    
'105' => array('Start C''Start C''11010011100'),
    
'106' => array('Stop''Stop''1100011101011')
);

$sign_to_id = array(
    
' ' => array('B' => '0'),
    
'!' => array('B' => '1'),
    
'"' => array('B' => '2'),
    
'#' => array('B' => '3'),
    
'$' => array('B' => '4'),
    
'%' => array('B' => '5'),
    
'&' => array('B' => '6'),
    
'\'' => array('B' => '60'),
    
'(' => array('B' => '8'),
    
')' => array('B' => '9'),
    
'*' => array('B' => '10'),
    
'+' => array('B' => '11'),
    
',' => array('B' => '12'),
    
'-' => array('B' => '13'),
    
'.' => array('B' => '14'),
    
'/' => array('B' => '15'),
    
'00' => array('C' => '0'),
    
'01' => array('C' => '1'),
    
'02' => array('C' => '2'),
    
'03' => array('C' => '3'),
    
'04' => array('C' => '4'),
    
'05' => array('C' => '5'),
    
'06' => array('C' => '6'),
    
'07' => array('C' => '7'),
    
'08' => array('C' => '8'),
    
'09' => array('C' => '9'),
    
':' => array('B' => '26'),
    
';' => array('B' => '27'),
    
'<' => array('B' => '28'),
    
'=' => array('B' => '29'),
    
'>' => array('B' => '30'),
    
'?' => array('B' => '31'),
    
'@' => array('B' => '32'),
    
'A' => array('B' => '33'),
    
'B' => array('B' => '34'),
    
'C' => array('B' => '35'),
    
'Code A' => array('B' => '101''C' => '101'),
    
'Code B' => array('C' => '100'),
    
'Code C' => array('B' => '99'),
    
'D' => array('B' => '36'),
    
'E' => array('B' => '37'),
    
'F' => array('B' => '38'),
    
'Fnc 1' => array('B' => '102''C' => '102'),
    
'Fnc 2' => array('B' => '97'),
    
'Fnc 3' => array('B' => '96'),
    
'Fnc 4' => array('B' => '100'),
    
'G' => array('B' => '39'),
    
'H' => array('B' => '40'),
    
'I' => array('B' => '41'),
    
'J' => array('B' => '42'),
    
'K' => array('B' => '43'),
    
'L' => array('B' => '44'),
    
'M' => array('B' => '45'),
    
'N' => array('B' => '46'),
    
'O' => array('B' => '47'),
    
'P' => array('B' => '48'),
    
'Q' => array('B' => '49'),
    
'R' => array('B' => '50'),
    
'S' => array('B' => '51'),
    
'Shift' => array('B' => '98'),
    
'Start A' => array('B' => '103''C' => '103'),
    
'Start B' => array('B' => '104''C' => '104'),
    
'Start C' => array('B' => '105''C' => '105'),
    
'0' => array('B' => '16'),
    
'Stop' => array('B' => '106''C' => '106'),
    
'T' => array('B' => '52'),
    
'U' => array('B' => '53'),
    
'V' => array('B' => '54'),
    
'W' => array('B' => '55'),
    
'X' => array('B' => '56'),
    
'Y' => array('B' => '57'),
    
'Z' => array('B' => '58'),
    
'[' => array('B' => '59'),
    
']' => array('B' => '61'),
    
'^' => array('B' => '62'),
    
'_' => array('B' => '63'),
    
'`' => array('B' => '64'),
    
'a' => array('B' => '65'),
    
'b' => array('B' => '66'),
    
'c' => array('B' => '67'),
    
'd' => array('B' => '68'),
    
'e' => array('B' => '69'),
    
'f' => array('B' => '70'),
    
'g' => array('B' => '71'),
    
'h' => array('B' => '72'),
    
'i' => array('B' => '73'),
    
'j' => array('B' => '74'),
    
'k' => array('B' => '75'),
    
'l' => array('B' => '76'),
    
'm' => array('B' => '77'),
    
'n' => array('B' => '78'),
    
'o' => array('B' => '79'),
    
'p' => array('B' => '80'),
    
'q' => array('B' => '81'),
    
'r' => array('B' => '82'),
    
's' => array('B' => '83'),
    
't' => array('B' => '84'),
    
'u' => array('B' => '85'),
    
'v' => array('B' => '86'),
    
'w' => array('B' => '87'),
    
'x' => array('B' => '88'),
    
'y' => array('B' => '89'),
    
'z' => array('B' => '90'),
    
'{' => array('B' => '91'),
    
'|' => array('B' => '92'),
    
'}' => array('B' => '93'),
    
'~' => array('B' => '94'),
    
'1' => array('B' => '17'),
    
'2' => array('B' => '18'),
    
'3' => array('B' => '19'),
    
'4' => array('B' => '20'),
    
'5' => array('B' => '21'),
    
'6' => array('B' => '22'),
    
'7' => array('B' => '23'),
    
'8' => array('B' => '24'),
    
'9' => array('B' => '25'),
    
'10' => array('C' => '10'),
    
'11' => array('C' => '11'),
    
'12' => array('C' => '12'),
    
'13' => array('C' => '13'),
    
'14' => array('C' => '14'),
    
'15' => array('C' => '15'),
    
'16' => array('C' => '16'),
    
'17' => array('C' => '17'),
    
'18' => array('C' => '18'),
    
'19' => array('C' => '19'),
    
'20' => array('C' => '20'),
    
'21' => array('C' => '21'),
    
'22' => array('C' => '22'),
    
'23' => array('C' => '23'),
    
'24' => array('C' => '24'),
    
'25' => array('C' => '25'),
    
'26' => array('C' => '26'),
    
'27' => array('C' => '27'),
    
'28' => array('C' => '28'),
    
'29' => array('C' => '29'),
    
'30' => array('C' => '30'),
    
'31' => array('C' => '31'),
    
'32' => array('C' => '32'),
    
'33' => array('C' => '33'),
    
'34' => array('C' => '34'),
    
'35' => array('C' => '35'),
    
'36' => array('C' => '36'),
    
'37' => array('C' => '37'),
    
'38' => array('C' => '38'),
    
'39' => array('C' => '39'),
    
'40' => array('C' => '40'),
    
'41' => array('C' => '41'),
    
'42' => array('C' => '42'),
    
'43' => array('C' => '43'),
    
'44' => array('C' => '44'),
    
'45' => array('C' => '45'),
    
'46' => array('C' => '46'),
    
'47' => array('C' => '47'),
    
'48' => array('C' => '48'),
    
'49' => array('C' => '49'),
    
'50' => array('C' => '50'),
    
'51' => array('C' => '51'),
    
'52' => array('C' => '52'),
    
'53' => array('C' => '53'),
    
'54' => array('C' => '54'),
    
'55' => array('C' => '55'),
    
'56' => array('C' => '56'),
    
'57' => array('C' => '57'),
    
'58' => array('C' => '58'),
    
'59' => array('C' => '59'),
    
'60' => array('C' => '60'),
    
'61' => array('C' => '61'),
    
'62' => array('C' => '62'),
    
'63' => array('C' => '63'),
    
'64' => array('C' => '64'),
    
'65' => array('C' => '65'),
    
'66' => array('C' => '66'),
    
'67' => array('C' => '67'),
    
'68' => array('C' => '68'),
    
'69' => array('C' => '69'),
    
'70' => array('C' => '70'),
    
'71' => array('C' => '71'),
    
'72' => array('C' => '72'),
    
'73' => array('C' => '73'),
    
'74' => array('C' => '74'),
    
'75' => array('C' => '75'),
    
'76' => array('C' => '76'),
    
'77' => array('C' => '77'),
    
'78' => array('C' => '78'),
    
'79' => array('C' => '79'),
    
'80' => array('C' => '80'),
    
'81' => array('C' => '81'),
    
'82' => array('C' => '82'),
    
'83' => array('C' => '83'),
    
'84' => array('C' => '84'),
    
'85' => array('C' => '85'),
    
'86' => array('C' => '86'),
    
'87' => array('C' => '87'),
    
'88' => array('C' => '88'),
    
'89' => array('C' => '89'),
    
'90' => array('C' => '90'),
    
'91' => array('C' => '91'),
    
'92' => array('C' => '92'),
    
'93' => array('C' => '93'),
    
'94' => array('C' => '94'),
    
'95' => array('C' => '95'),
    
'96' => array('C' => '96'),
    
'97' => array('C' => '97'),
    
'98' => array('C' => '98'),
    
'99' => array('C' => '99')
);

function 
print_code($kod$img) {
    global 
$b;
    
    
$now 0;
    
$kod str_split($kod);
    foreach(
$kod as $val) {
        if(
$val==1) {
            
imageline($img$now0$now40$b);
        }
        
$now++;
    }
}

function 
gen_binary($kod) {
    global 
$id_to_sign$sign_to_id;
    
    
$csm $sign_to_id['Start B']['B'];
    
$ret $id_to_sign[$sign_to_id['Start B']['B']][2];
    
$now 1;
    
$typ 'B';

    
$kod str_split($kod);
    foreach(
$kod as $key => $val) {
        if(
is_numeric($val) AND is_numeric($kod[$key+1]) AND !isset($num)) {
            if(
$now==1) {
                
$csm $sign_to_id['Start C']['B'];
                
$ret $id_to_sign[$sign_to_id['Start C']['B']][2];
                
$typ 'C';
            }
            
$num $val;
            continue;
        }
        elseif(
is_numeric($val) AND isset($num)) {
            if(
$typ!='C') {
                
$ret .= $id_to_sign[$sign_to_id['Code C']['B']][2];
                
$csm += $sign_to_id['Code C']['B']*$now;
                
$typ 'C';
                
$now++;
            }
            
$ret .= $id_to_sign[$sign_to_id[$num.$val]['C']][2];
            
$csm += $sign_to_id[$num.$val]['C']*$now;
            unset(
$num);
        }
        else
        {
            if(
$typ!='B') {
                
$ret .= $id_to_sign[$sign_to_id['Code B']['C']][2];
                
$csm += $sign_to_id['Code B']['C']*$now;
                
$typ 'B';
                
$now++;
            }
            
$ret .= $id_to_sign[$sign_to_id[$val]['B']][2];
            
$csm += $sign_to_id[$val]['B']*$now;
        }
        
$now++;
    }
    return 
$ret $id_to_sign[$csm%103][2] . $id_to_sign[$sign_to_id['Stop'][$typ]][2];
}

$kod gen_binary($_GET['kod']);
$i imagecreate(strlen($kod), 40);
$w imagecolorallocate($i255255255);
$b imagecolorallocate($i000);

print_code($kod$i);

header('Content-type: image/gif');
imagegif($i);
?>