QRCode.maxBytesTable = {
	L: [152, 272, 440, 640, 864, 1088, 1248, 1552, 1856, 2192],
	M: [128, 224, 352, 512, 688, 864, 992, 1232, 1456, 1728],
	Q: [104, 176, 272, 384, 496, 608, 704, 880, 1056, 1232],
	H: [72, 128, 208, 288, 368, 480, 528, 688, 800, 976]
};

QRCode.getDataLength = function(typeNumber, dataList) {
	var buffer = new QRBitBuffer();
	for (var i = 0; i < dataList.length; i++) {
		var data = dataList[i];
		buffer.put(data.mode, 4);
		buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) );
		data.write(buffer);
	}

	return buffer.getLengthInBits();
};

QRCode.draw = function(data, parent, dotSize, qrLevel, eccLevel) {
	if(!dotSize) dotSize = 2;
	if(!qrLevel) qrLevel = 4;
	if(!eccLevel) eccLevel = 'H';
	
	var qr = new QRCode(qrLevel, QRErrorCorrectLevel[eccLevel]);
	qr.addData(data);
	qr.make();
	
	if(typeof parent === 'string') {
		parent = document.getElementById(parent);
	}
	
	if(!parent || !parent.nodeName || parent.nodeType != 1) {
		throw new Error('QR code generation requires a parent element');
	}
	
	var canvas = document.createElement('canvas');
	var moduleCount = qr.getModuleCount();
	canvas.setAttribute('width', moduleCount * dotSize);
	canvas.setAttribute('height', moduleCount * dotSize);
	parent.appendChild(canvas);
	
	if(!canvas.getContext) {
		G_vmlCanvasManager.initElement(canvas);
	}
	
	var ctx = canvas.getContext('2d');
	ctx.fillStyle = "rgb(0, 0, 0)";
	for(var row = 0; row < moduleCount; row++) {
		for(var col = 0; col < moduleCount; col++) {
			if(qr.isDark(row, col)) {
				ctx.fillRect(col * dotSize, row * dotSize, dotSize, dotSize);
			}
		}
	}
}

var QRCodeGui = {
	generate: function(e) {
		if(e.preventDefault) e.preventDefault();
		e.returnValue = false;
		
		var di = document.getElementById("dataInput"), container = document.getElementById("codeContainer"), ds = document.getElementById("dotsize"), frm = document.getElementById('dataForm');
		var children = container.childNodes;
		for(var i = 0; i < children.length; i++) { container.removeChild(children[i]); }
		
		var ql = "M", inputLength = 0, qrLevel = 0;
		for(var i = 0; i < frm.ecc.length; i++) { if(frm.ecc[i].checked == true) { ql = frm.ecc[i].value; } }
		
		for(var i = 1; i <= 10; i++) {
			inputLength = QRCode.getDataLength(i, [new QR8bitByte(di.value)]);
			if(QRCode.maxBytesTable[ql][i - 1] > inputLength) {
				qrLevel = i;
				break;
			}
		}
		
		if(qrLevel == 0) {
			return alert('Too much data, try a lower ECC level if possible.');
		}
		
		document.getElementById('gentext').className = '';
		QRCode.draw(di.value, container, parseInt(ds.value, 10), qrLevel, ql);
	},
	
	attach: function() {
		var df = document.getElementById('dataForm');
		if(df.addEventListener) {
			df.addEventListener('submit', QRCodeGui.generate, false);
		} else {
			df.attachEvent('onsubmit', QRCodeGui.generate);
		}
	}
	
};

QRCodeGui.attach();
