/********************************************************************
			Tables and references used for QR code
*********************************************************************/

//Pattern (bitmatrix) template for Function pattern and Format info
var function_pattern_with_format_info = {
	/*
		0		: white
		1		: black
		2-16	: Format info
	*/
	TOP_LEFT: [
		[1,1,1,1,1,1,1,0,2],
		[1,0,0,0,0,0,1,0,3],
		[1,0,1,1,1,0,1,0,4],
		[1,0,1,1,1,0,1,0,5],
		[1,0,1,1,1,0,1,0,6],
		[1,0,0,0,0,0,1,0,7],
		[1,1,1,1,1,1,1,0,1],
		[0,0,0,0,0,0,0,0,8],
		[16,15,14,13,12,11,1,10,9]
	],

	TOP_RIGHT: [
		[0,1,1,1,1,1,1,1],
		[0,1,0,0,0,0,0,1],
		[0,1,0,1,1,1,0,1],
		[0,1,0,1,1,1,0,1],
		[0,1,0,1,1,1,0,1],
		[0,1,0,0,0,0,0,1],
		[0,1,1,1,1,1,1,1],
		[0,0,0,0,0,0,0,0],
		[9,8,7,6,5,4,3,2]
	],

	BOTTOM_LEFT: [
		[0,0,0,0,0,0,0,0,1],
		[1,1,1,1,1,1,1,0,10],
		[1,0,0,0,0,0,1,0,11],
		[1,0,1,1,1,0,1,0,12],
		[1,0,1,1,1,0,1,0,13],
		[1,0,1,1,1,0,1,0,14],
		[1,0,0,0,0,0,1,0,15],
		[1,1,1,1,1,1,1,0,16],
	]
};


var alignment_pattern_array = [
	[],
	[6, 18],
	[6, 22],
	[6, 26],
	[6, 30],
	[6, 34]
];

var format_information_bits_raw = {
	ecc: [
		"11",	//L
		"10",	//M
		"01",	//Q
		"00"	//H
	],
	mask: [
		"101",
		"001",
		"111",
		"110",
		"001",
		"000",
		"011",
		"010"
	]
}

var format_information_bits_partial = {
	BOTTOM_LEFT: [
	"1110111",
	"1110010",
	"1111101",
	"1111000",
	"1100110",
	"1100011",
	"1101100",
	"1101001",
	//ECC M
	"1010100",
	"1010001",
	"1011110",
	"1011011",
	"1000101",
	"1000000",
	"1001111",
	"1001010",
	//ECC Q
	"0110101",
	"0110000",
	"0111111",
	"0111010",
	"0100100",
	"0100001",
	"0101110",
	"0101011",
	//ECC H
	"0010110",
	"0010011",
	"0011100",
	"0011001",
	"0000111",
	"0000010",
	"0001101",
	"0001000"
	],
	TOP_RIGHT: [
	"11000100",
	"11110011",
	"10101010",
	"10011101",
	"00101111",
	"00011000",
	"01000001",
	"01110110",
	//ECC M
	"00010010",
	"00100101",
	"01111100",
	"01001011",
	"11111001",
	"11001110",
	"10010111",
	"10100000",
	//ECC Q
	"01011111",
	"01101000",
	"00110001",
	"00000110",
	"10110100",
	"10000011",
	"11011010",
	"11101101",
	//ECC H
	"10001001",
	"10111110",
	"11100111",
	"11010000",
	"01100010",
	"01010101",
	"00001100",
	"00111011"
	]
}

var format_information_bits = [
	//ECC L
	["111011111000100",
	"111001011110011",
	"111110110101010",
	"111100010011101",
	"110011000101111",
	"110001100011000",
	"110110001000001",
	"110100101110110"],
	//ECC M
	["101010000010010",
	"101000100100101",
	"101111001111100",
	"101101101001011",
	"100010111111001",
	"100000011001110",
	"100111110010111",
	"100101010100000"],
	//ECC Q
	["011010101011111",
	"011000001101000",
	"011111100110001",
	"011101000000110",
	"010010010110100",
	"010000110000011",
	"010111011011010",
	"010101111101101"],
	//ECC H
	["001011010001001",
	"001001110111110",
	"001110011100111",
	"001100111010000",
	"000011101100010",
	"000001001010101",
	"000110100001100",
	"000100000111011"]
];

var format_information_unmask = [
'000000000000000',
'000010100110111',
'000101001101110',
'000111101011001',
'001000111101011',
'001010011011100',
'001101110000101',
'001111010110010',
'010001111010110',
'010011011100001',
'010100110111000',
'010110010001111',
'011001000111101',
'011011100001010',
'011100001010011',
'011110101100100',
'100001010011011',
'100011110101100',
'100100011110101',
'100110111000010',
'101001101110000',
'101011001000111',
'101100100011110',
'101110000101001',
'110000101001101',
'110010001111010',
'110101100100011',
'110111000010100',
'111000010100110',
'111010110010001',
'111101011001000',
'111111111111111'
];

var data_code_num_table = [
	[  16,   19,    9,   13],
	[  28,   34,   16,   22],
	[  44,   55,   26,   34],
	[  64,   80,   36,   48],
	[  86,  108,   46,   62],
	[ 108,  136,   60,   76]
];

var RS_block_num_table = [
	[1, 1, 1, 1],
	[1, 1, 1, 1],
	[1, 1, 2, 2],
	[2, 1, 4, 2],
	[2, 1, 4, 4],
	[4, 2, 4, 4]
];

var alphanumeric_table = [
	"0", "1", "2", "3", "4", "5",
	"6", "7", "8", "9", "A", "B",
	"C", "D", "E", "F", "G", "H",
	"I", "J", "K", "L", "M", "N",
	"O", "P", "Q", "R", "S", "T",
	"U", "V", "W", "X", "Y", "Z",
	" ", "$", "%", "*", "+", "-",
	".", "/", ":"
];

var error_correction_code_table = [
	[10,7,17,13],
	[16,10,28,22],
	[26,15,22,18],
	[18,20,16,26],
	[24,26,22,18],
	[16,18,28,24]
];

var remainder_bits_table = [0,7,7,7,7,7];