<?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, $now, 0, $now, 40, $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($i, 255, 255, 255);
$b = imagecolorallocate($i, 0, 0, 0);

print_code($kod, $i);

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