diff --git a/.editorconfig b/.editorconfig index 77b9348..ee71cd7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -17,6 +17,11 @@ indent_style = space indent_size = 2 +[bower.json] +indent_style = space +indent_size = 2 + + [.travis.yml] indent_style = space indent_size = 2 diff --git a/bower.json b/bower.json index 32c9647..24d9575 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery-qrcode", - "version": "0.10.1", + "version": "0.11.0", "description": "generate QR codes dynamically", "homepage": "http://larsjung.de/jquery-qrcode/", "authors": [ @@ -13,14 +13,8 @@ "url": "https://github.com/lrsjng/jquery-qrcode.git" }, "ignore": [ - "**/.*", - "bower_components", - "build", - "local", - "mkrfile.js", - "node_modules", - "src", - "test", - "tests" + "*", + "!dist/*", + "!*.md" ] } diff --git a/dist/jquery.qrcode.js b/dist/jquery.qrcode.js index dcb277c..5bf5e11 100644 --- a/dist/jquery.qrcode.js +++ b/dist/jquery.qrcode.js @@ -1,399 +1,400 @@ -/* jQuery.qrcode 0.10.1 - http://larsjung.de/jquery-qrcode/ - uses //github.com/kazuhikoarase/qrcode-generator (MIT) */ +/* jQuery.qrcode 0.11.0 - http://larsjung.de/jquery-qrcode/ - uses //github.com/kazuhikoarase/qrcode-generator (MIT) */ (function () { 'use strict'; var $ = jQuery; - // Wrapper for the original QR code generator. -var QRCode = function (text, level, version, quiet) { +// Wrapper for the original QR code generator. +function QRCode(text, level, version, quiet) { - // `qrcode` is the single public function that will be defined by the `QR Code Generator` - // at the end of the file. - var qr = qrcode(version, level); - qr.addData(text); - qr.make(); + // `qrcode` is the single public function that will be defined by the `QR Code Generator` + // at the end of the file. + var qr = qrcode(version, level); + qr.addData(text); + qr.make(); - quiet = quiet || 0; + quiet = quiet || 0; - var qrModuleCount = qr.getModuleCount(), - quietModuleCount = qr.getModuleCount() + 2*quiet, - isDark = function (row, col) { + var qrModuleCount = qr.getModuleCount(); + var quietModuleCount = qr.getModuleCount() + 2*quiet; - row -= quiet; - col -= quiet; + function isDark(row, col) { - if (row < 0 || row >= qrModuleCount || col < 0 || col >= qrModuleCount) { - return false; - } - - return qr.isDark(row, col); - }, - addBlank = function (l, t, r, b) { - - var prevIsDark = this.isDark, - moduleSize = 1 / quietModuleCount; - - this.isDark = function (row, col) { - - var ml = col * moduleSize, - mt = row * moduleSize, - mr = ml + moduleSize, - mb = mt + moduleSize; - - return prevIsDark(row, col) && (l > mr || ml > r || t > mb || mt > b); - }; - }; - - this.text = text; - this.level = level; - this.version = version; - this.moduleCount = quietModuleCount; - this.isDark = isDark; - this.addBlank = addBlank; - }, - - // Check if canvas is available in the browser (as Modernizr does) - canvasAvailable = (function () { - - var elem = document.createElement('canvas'); - return !!(elem.getContext && elem.getContext('2d')); - }()), - - arcToAvailable = Object.prototype.toString.call(window.opera) !== '[object Opera]', - - // Returns a minimal QR code for the given text starting with version `minVersion`. - // Returns `null` if `text` is too long to be encoded in `maxVersion`. - createQRCode = function (text, level, minVersion, maxVersion, quiet) { - - minVersion = Math.max(1, minVersion || 1); - maxVersion = Math.min(40, maxVersion || 40); - for (var version = minVersion; version <= maxVersion; version += 1) { - try { - return new QRCode(text, level, version, quiet); - } catch (err) {} - } - }, - - drawBackgroundLabel = function (qr, context, settings) { - - var size = settings.size, - font = "bold " + (settings.mSize * size) + "px " + settings.fontname, - ctx = $('')[0].getContext("2d"); - - ctx.font = font; - - var w = ctx.measureText(settings.label).width, - sh = settings.mSize, - sw = w / size, - sl = (1 - sw) * settings.mPosX, - st = (1 - sh) * settings.mPosY, - sr = sl + sw, - sb = st + sh, - pad = 0.01; - - if (settings.mode === 1) { - // Strip - qr.addBlank(0, st - pad, size, sb + pad); - } else { - // Box - qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); - } - - context.fillStyle = settings.fontcolor; - context.font = font; - context.fillText(settings.label, sl*size, st*size + 0.75 * settings.mSize * size); - }, - - drawBackgroundImage = function (qr, context, settings) { - - var size = settings.size, - w = settings.image.naturalWidth || 1, - h = settings.image.naturalHeight || 1, - sh = settings.mSize, - sw = sh * w / h, - sl = (1 - sw) * settings.mPosX, - st = (1 - sh) * settings.mPosY, - sr = sl + sw, - sb = st + sh, - pad = 0.01; - - if (settings.mode === 3) { - // Strip - qr.addBlank(0, st - pad, size, sb + pad); - } else { - // Box - qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); - } - - context.drawImage(settings.image, sl*size, st*size, sw*size, sh*size); - }, - - drawBackground = function (qr, context, settings) { - - if ($(settings.background).is('img')) { - context.drawImage(settings.background, 0, 0, settings.size, settings.size); - } else if (settings.background) { - context.fillStyle = settings.background; - context.fillRect(settings.left, settings.top, settings.size, settings.size); - } - - var mode = settings.mode; - if (mode === 1 || mode === 2) { - drawBackgroundLabel(qr, context, settings); - } else if (mode === 3 || mode === 4) { - drawBackgroundImage(qr, context, settings); - } - }, - - drawModuleDefault = function (qr, context, settings, left, top, width, row, col) { - - if (qr.isDark(row, col)) { - context.rect(left, top, width, width); - } - }, - - drawModuleRoundedDark = function (ctx, l, t, r, b, rad, nw, ne, se, sw) { - - if (nw) { - ctx.moveTo(l + rad, t); - } else { - ctx.moveTo(l, t); - } - - if (ne) { - ctx.lineTo(r - rad, t); - ctx.arcTo(r, t, r, b, rad); - } else { - ctx.lineTo(r, t); - } + row -= quiet; + col -= quiet; - if (se) { - ctx.lineTo(r, b - rad); - ctx.arcTo(r, b, l, b, rad); - } else { - ctx.lineTo(r, b); + if (row < 0 || row >= qrModuleCount || col < 0 || col >= qrModuleCount) { + return false; } - if (sw) { - ctx.lineTo(l + rad, b); - ctx.arcTo(l, b, l, t, rad); - } else { - ctx.lineTo(l, b); - } + return qr.isDark(row, col); + } - if (nw) { - ctx.lineTo(l, t + rad); - ctx.arcTo(l, t, r, t, rad); - } else { - ctx.lineTo(l, t); - } - }, + var addBlank = function (l, t, r, b) { - drawModuleRoundendLight = function (ctx, l, t, r, b, rad, nw, ne, se, sw) { + var prevIsDark = this.isDark; + var moduleSize = 1 / quietModuleCount; - if (nw) { - ctx.moveTo(l + rad, t); - ctx.lineTo(l, t); - ctx.lineTo(l, t + rad); - ctx.arcTo(l, t, l + rad, t, rad); - } + this.isDark = function (row, col) { - if (ne) { - ctx.moveTo(r - rad, t); - ctx.lineTo(r, t); - ctx.lineTo(r, t + rad); - ctx.arcTo(r, t, r - rad, t, rad); - } + var ml = col * moduleSize; + var mt = row * moduleSize; + var mr = ml + moduleSize; + var mb = mt + moduleSize; - if (se) { - ctx.moveTo(r - rad, b); - ctx.lineTo(r, b); - ctx.lineTo(r, b - rad); - ctx.arcTo(r, b, r - rad, b, rad); - } - - if (sw) { - ctx.moveTo(l + rad, b); - ctx.lineTo(l, b); - ctx.lineTo(l, b - rad); - ctx.arcTo(l, b, l + rad, b, rad); - } - }, - - drawModuleRounded = function (qr, context, settings, left, top, width, row, col) { - - var isDark = qr.isDark, - right = left + width, - bottom = top + width, - radius = settings.radius * width, - rowT = row - 1, - rowB = row + 1, - colL = col - 1, - colR = col + 1, - center = isDark(row, col), - northwest = isDark(rowT, colL), - north = isDark(rowT, col), - northeast = isDark(rowT, colR), - east = isDark(row, colR), - southeast = isDark(rowB, colR), - south = isDark(rowB, col), - southwest = isDark(rowB, colL), - west = isDark(row, colL); - - if (center) { - drawModuleRoundedDark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west); - } else { - drawModuleRoundendLight(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest); - } - }, - - drawModules = function (qr, context, settings) { - - var moduleCount = qr.moduleCount, - moduleSize = settings.size / moduleCount, - fn = drawModuleDefault, - row, col; - - if (arcToAvailable && settings.radius > 0 && settings.radius <= 0.5) { - fn = drawModuleRounded; - } + return prevIsDark(row, col) && (l > mr || ml > r || t > mb || mt > b); + }; + }; - context.beginPath(); - for (row = 0; row < moduleCount; row += 1) { - for (col = 0; col < moduleCount; col += 1) { + this.text = text; + this.level = level; + this.version = version; + this.moduleCount = quietModuleCount; + this.isDark = isDark; + this.addBlank = addBlank; +} - var l = settings.left + col * moduleSize, - t = settings.top + row * moduleSize, - w = moduleSize; +// Check if canvas is available in the browser (as Modernizr does) +var hasCanvas = (function () { - fn(qr, context, settings, l, t, w, row, col); - } - } - if ($(settings.fill).is('img')) { - context.strokeStyle = 'rgba(0,0,0,0.5)'; - context.lineWidth = 2; - context.stroke(); - var prev = context.globalCompositeOperation; - context.globalCompositeOperation = "destination-out"; - context.fill(); - context.globalCompositeOperation = prev; - - context.clip(); - context.drawImage(settings.fill, 0, 0, settings.size, settings.size); - context.restore(); - } else { - context.fillStyle = settings.fill; - context.fill(); - } - }, - - // Draws QR code to the given `canvas` and returns it. - drawOnCanvas = function (canvas, settings) { - - var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); - if (!qr) { - return null; + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }()); +var hasArcTo = Object.prototype.toString.call(window.opera) !== '[object Opera]'; + +// Returns a minimal QR code for the given text starting with version `minVersion`. +// Returns `undefined` if `text` is too long to be encoded in `maxVersion`. +function createQRCode(text, level, minVersion, maxVersion, quiet) { + + minVersion = Math.max(1, minVersion || 1); + maxVersion = Math.min(40, maxVersion || 40); + for (var version = minVersion; version <= maxVersion; version += 1) { + try { + return new QRCode(text, level, version, quiet); + } catch (err) {} + } +} + +function drawBackgroundLabel(qr, context, settings) { + + var size = settings.size; + var font = "bold " + (settings.mSize * size) + "px " + settings.fontname; + var ctx = $('')[0].getContext("2d"); + + ctx.font = font; + + var w = ctx.measureText(settings.label).width; + var sh = settings.mSize; + var sw = w / size; + var sl = (1 - sw) * settings.mPosX; + var st = (1 - sh) * settings.mPosY; + var sr = sl + sw; + var sb = st + sh; + var pad = 0.01; + + if (settings.mode === 1) { + // Strip + qr.addBlank(0, st - pad, size, sb + pad); + } else { + // Box + qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); + } + + context.fillStyle = settings.fontcolor; + context.font = font; + context.fillText(settings.label, sl*size, st*size + 0.75 * settings.mSize * size); +} + +function drawBackgroundImage(qr, context, settings) { + + var size = settings.size; + var w = settings.image.naturalWidth || 1; + var h = settings.image.naturalHeight || 1; + var sh = settings.mSize; + var sw = sh * w / h; + var sl = (1 - sw) * settings.mPosX; + var st = (1 - sh) * settings.mPosY; + var sr = sl + sw; + var sb = st + sh; + var pad = 0.01; + + if (settings.mode === 3) { + // Strip + qr.addBlank(0, st - pad, size, sb + pad); + } else { + // Box + qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); + } + + context.drawImage(settings.image, sl*size, st*size, sw*size, sh*size); +} + +function drawBackground(qr, context, settings) { + + if ($(settings.background).is('img')) { + context.drawImage(settings.background, 0, 0, settings.size, settings.size); + } else if (settings.background) { + context.fillStyle = settings.background; + context.fillRect(settings.left, settings.top, settings.size, settings.size); + } + + var mode = settings.mode; + if (mode === 1 || mode === 2) { + drawBackgroundLabel(qr, context, settings); + } else if (mode === 3 || mode === 4) { + drawBackgroundImage(qr, context, settings); + } +} + +function drawModuleDefault(qr, context, settings, left, top, width, row, col) { + + if (qr.isDark(row, col)) { + context.rect(left, top, width, width); + } +} + +function drawModuleRoundedDark(ctx, l, t, r, b, rad, nw, ne, se, sw) { + + if (nw) { + ctx.moveTo(l + rad, t); + } else { + ctx.moveTo(l, t); + } + + if (ne) { + ctx.lineTo(r - rad, t); + ctx.arcTo(r, t, r, b, rad); + } else { + ctx.lineTo(r, t); + } + + if (se) { + ctx.lineTo(r, b - rad); + ctx.arcTo(r, b, l, b, rad); + } else { + ctx.lineTo(r, b); + } + + if (sw) { + ctx.lineTo(l + rad, b); + ctx.arcTo(l, b, l, t, rad); + } else { + ctx.lineTo(l, b); + } + + if (nw) { + ctx.lineTo(l, t + rad); + ctx.arcTo(l, t, r, t, rad); + } else { + ctx.lineTo(l, t); + } +} + +function drawModuleRoundendLight(ctx, l, t, r, b, rad, nw, ne, se, sw) { + + if (nw) { + ctx.moveTo(l + rad, t); + ctx.lineTo(l, t); + ctx.lineTo(l, t + rad); + ctx.arcTo(l, t, l + rad, t, rad); + } + + if (ne) { + ctx.moveTo(r - rad, t); + ctx.lineTo(r, t); + ctx.lineTo(r, t + rad); + ctx.arcTo(r, t, r - rad, t, rad); + } + + if (se) { + ctx.moveTo(r - rad, b); + ctx.lineTo(r, b); + ctx.lineTo(r, b - rad); + ctx.arcTo(r, b, r - rad, b, rad); + } + + if (sw) { + ctx.moveTo(l + rad, b); + ctx.lineTo(l, b); + ctx.lineTo(l, b - rad); + ctx.arcTo(l, b, l + rad, b, rad); + } +} + +function drawModuleRounded(qr, context, settings, left, top, width, row, col) { + + var isDark = qr.isDark; + var right = left + width; + var bottom = top + width; + var radius = settings.radius * width; + var rowT = row - 1; + var rowB = row + 1; + var colL = col - 1; + var colR = col + 1; + var center = isDark(row, col); + var northwest = isDark(rowT, colL); + var north = isDark(rowT, col); + var northeast = isDark(rowT, colR); + var east = isDark(row, colR); + var southeast = isDark(rowB, colR); + var south = isDark(rowB, col); + var southwest = isDark(rowB, colL); + var west = isDark(row, colL); + + if (center) { + drawModuleRoundedDark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west); + } else { + drawModuleRoundendLight(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest); + } +} + +function drawModules(qr, context, settings) { + + var moduleCount = qr.moduleCount; + var moduleSize = settings.size / moduleCount; + var fn = drawModuleDefault; + var row, col; + + if (hasArcTo && settings.radius > 0 && settings.radius <= 0.5) { + fn = drawModuleRounded; + } + + context.beginPath(); + for (row = 0; row < moduleCount; row += 1) { + for (col = 0; col < moduleCount; col += 1) { + + var l = settings.left + col * moduleSize, + t = settings.top + row * moduleSize, + w = moduleSize; + + fn(qr, context, settings, l, t, w, row, col); } + } + if ($(settings.fill).is('img')) { + context.strokeStyle = 'rgba(0,0,0,0.5)'; + context.lineWidth = 2; + context.stroke(); + var prev = context.globalCompositeOperation; + context.globalCompositeOperation = "destination-out"; + context.fill(); + context.globalCompositeOperation = prev; + + context.clip(); + context.drawImage(settings.fill, 0, 0, settings.size, settings.size); + context.restore(); + } else { + context.fillStyle = settings.fill; + context.fill(); + } +} + +// Draws QR code to the given `canvas` and returns it. +function drawOnCanvas(canvas, settings) { + + var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); + if (!qr) { + return null; + } + + var $canvas = $(canvas).data('qrcode', qr); + var context = $canvas[0].getContext('2d'); + + drawBackground(qr, context, settings); + drawModules(qr, context, settings); + + return $canvas; +} + +// Returns a `canvas` element representing the QR code for the given settings. +function createCanvas(settings) { + + var $canvas = $('').attr('width', settings.size).attr('height', settings.size); + return drawOnCanvas($canvas, settings); +} + +// Returns an `image` element representing the QR code for the given settings. +function createImage(settings) { + + return $('').attr('src', createCanvas(settings)[0].toDataURL('image/png')); +} + +// Returns a `div` element representing the QR code for the given settings. +function createDiv(settings) { + + var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); + if (!qr) { + return null; + } + + // some shortcuts to improve compression + var settings_size = settings.size; + var settings_bgColor = settings.background; + var math_floor = Math.floor; + + var moduleCount = qr.moduleCount; + var moduleSize = math_floor(settings_size / moduleCount); + var offset = math_floor(0.5 * (settings_size - moduleSize * moduleCount)); + + var row, col; + + var containerCSS = { + position: 'relative', + left: 0, + top: 0, + padding: 0, + margin: 0, + width: settings_size, + height: settings_size + }; + var darkCSS = { + position: 'absolute', + padding: 0, + margin: 0, + width: moduleSize, + height: moduleSize, + 'background-color': settings.fill + }; - var $canvas = $(canvas).data('qrcode', qr), - context = $canvas[0].getContext('2d'); - - drawBackground(qr, context, settings); - drawModules(qr, context, settings); - - return $canvas; - }, - - // Returns a `canvas` element representing the QR code for the given settings. - createCanvas = function (settings) { - - var $canvas = $('').attr('width', settings.size).attr('height', settings.size); - return drawOnCanvas($canvas, settings); - }, - - // Returns an `image` element representing the QR code for the given settings. - createImage = function (settings) { - - return $('').attr('src', createCanvas(settings)[0].toDataURL('image/png')); - }, - - // Returns a `div` element representing the QR code for the given settings. - createDiv = function (settings) { - - var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); - if (!qr) { - return null; - } + var $div = $('
').data('qrcode', qr).css(containerCSS); - // some shortcuts to improve compression - var settings_size = settings.size, - settings_bgColor = settings.background, - math_floor = Math.floor, - - moduleCount = qr.moduleCount, - moduleSize = math_floor(settings_size / moduleCount), - offset = math_floor(0.5 * (settings_size - moduleSize * moduleCount)), - - row, col, - - containerCSS = { - position: 'relative', - left: 0, - top: 0, - padding: 0, - margin: 0, - width: settings_size, - height: settings_size - }, - darkCSS = { - position: 'absolute', - padding: 0, - margin: 0, - width: moduleSize, - height: moduleSize, - 'background-color': settings.fill - }, - - $div = $('
').data('qrcode', qr).css(containerCSS); - - if (settings_bgColor) { - $div.css('background-color', settings_bgColor); - } + if (settings_bgColor) { + $div.css('background-color', settings_bgColor); + } - for (row = 0; row < moduleCount; row += 1) { - for (col = 0; col < moduleCount; col += 1) { - if (qr.isDark(row, col)) { - $('
') - .css(darkCSS) - .css({ - left: offset + col * moduleSize, - top: offset + row * moduleSize - }) - .appendTo($div); - } + for (row = 0; row < moduleCount; row += 1) { + for (col = 0; col < moduleCount; col += 1) { + if (qr.isDark(row, col)) { + $('
') + .css(darkCSS) + .css({ + left: offset + col * moduleSize, + top: offset + row * moduleSize + }) + .appendTo($div); } } + } - return $div; - }, + return $div; +} - createHTML = function (settings) { +function createHTML(settings) { - if (canvasAvailable && settings.render === 'canvas') { - return createCanvas(settings); - } else if (canvasAvailable && settings.render === 'image') { - return createImage(settings); - } + if (hasCanvas && settings.render === 'canvas') { + return createCanvas(settings); + } else if (hasCanvas && settings.render === 'image') { + return createImage(settings); + } - return createDiv(settings); - }, + return createDiv(settings); +} - // Plugin - // ====== +// Plugin +// ====== - // Default settings - // ---------------- - defaults = { +// Default settings +// ---------------- +var defaults = { // render method: `'canvas'`, `'image'` or `'div'` render: 'canvas', diff --git a/dist/jquery.qrcode.min.js b/dist/jquery.qrcode.min.js index a1f1803..6e2dbcd 100644 --- a/dist/jquery.qrcode.min.js +++ b/dist/jquery.qrcode.min.js @@ -1,2 +1,2 @@ -/* jQuery.qrcode 0.10.1 - http://larsjung.de/jquery-qrcode/ - uses //github.com/kazuhikoarase/qrcode-generator (MIT) */ -!function(){"use strict";var r=jQuery,t=function(r,t,e,n){var o=y(e,t);o.addData(r),o.make(),n=n||0;var i=o.getModuleCount(),a=o.getModuleCount()+2*n,u=function(r,t){return r-=n,t-=n,0>r||r>=i||0>t||t>=i?!1:o.isDark(r,t)},f=function(r,t,e,n){var o=this.isDark,i=1/a;this.isDark=function(a,u){var f=u*i,l=a*i,c=f+i,g=l+i;return o(a,u)&&(r>c||f>e||t>g||l>n)}};this.text=r,this.level=t,this.version=e,this.moduleCount=a,this.isDark=u,this.addBlank=f},e=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),n="[object Opera]"!==Object.prototype.toString.call(window.opera),o=function(r,e,n,o,i){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var a=n;o>=a;a+=1)try{return new t(r,e,a,i)}catch(u){}},i=function(t,e,n){var o=n.size,i="bold "+n.mSize*o+"px "+n.fontname,a=r("")[0].getContext("2d");a.font=i;var u=a.measureText(n.label).width,f=n.mSize,l=u/o,c=(1-l)*n.mPosX,g=(1-f)*n.mPosY,s=c+l,h=g+f,v=.01;1===n.mode?t.addBlank(0,g-v,o,h+v):t.addBlank(c-v,g-v,s+v,h+v),e.fillStyle=n.fontcolor,e.font=i,e.fillText(n.label,c*o,g*o+.75*n.mSize*o)},a=function(r,t,e){var n=e.size,o=e.image.naturalWidth||1,i=e.image.naturalHeight||1,a=e.mSize,u=a*o/i,f=(1-u)*e.mPosX,l=(1-a)*e.mPosY,c=f+u,g=l+a,s=.01;3===e.mode?r.addBlank(0,l-s,n,g+s):r.addBlank(f-s,l-s,c+s,g+s),t.drawImage(e.image,f*n,l*n,u*n,a*n)},u=function(t,e,n){r(n.background).is("img")?e.drawImage(n.background,0,0,n.size,n.size):n.background&&(e.fillStyle=n.background,e.fillRect(n.left,n.top,n.size,n.size));var o=n.mode;1===o||2===o?i(t,e,n):(3===o||4===o)&&a(t,e,n)},f=function(r,t,e,n,o,i,a,u){r.isDark(a,u)&&t.rect(n,o,i,i)},l=function(r,t,e,n,o,i,a,u,f,l){a?r.moveTo(t+i,e):r.moveTo(t,e),u?(r.lineTo(n-i,e),r.arcTo(n,e,n,o,i)):r.lineTo(n,e),f?(r.lineTo(n,o-i),r.arcTo(n,o,t,o,i)):r.lineTo(n,o),l?(r.lineTo(t+i,o),r.arcTo(t,o,t,e,i)):r.lineTo(t,o),a?(r.lineTo(t,e+i),r.arcTo(t,e,n,e,i)):r.lineTo(t,e)},c=function(r,t,e,n,o,i,a,u,f,l){a&&(r.moveTo(t+i,e),r.lineTo(t,e),r.lineTo(t,e+i),r.arcTo(t,e,t+i,e,i)),u&&(r.moveTo(n-i,e),r.lineTo(n,e),r.lineTo(n,e+i),r.arcTo(n,e,n-i,e,i)),f&&(r.moveTo(n-i,o),r.lineTo(n,o),r.lineTo(n,o-i),r.arcTo(n,o,n-i,o,i)),l&&(r.moveTo(t+i,o),r.lineTo(t,o),r.lineTo(t,o-i),r.arcTo(t,o,t+i,o,i))},g=function(r,t,e,n,o,i,a,u){var f=r.isDark,g=n+i,s=o+i,h=e.radius*i,v=a-1,d=a+1,w=u-1,m=u+1,T=f(a,u),y=f(v,w),p=f(v,u),B=f(v,m),E=f(a,m),k=f(d,m),A=f(d,u),M=f(d,w),D=f(a,w);T?l(t,n,o,g,s,h,!p&&!D,!p&&!E,!A&&!E,!A&&!D):c(t,n,o,g,s,h,p&&D&&y,p&&E&&B,A&&E&&k,A&&D&&M)},s=function(t,e,o){var i,a,u=t.moduleCount,l=o.size/u,c=f;for(n&&o.radius>0&&o.radius<=.5&&(c=g),e.beginPath(),i=0;u>i;i+=1)for(a=0;u>a;a+=1){var s=o.left+a*l,h=o.top+i*l,v=l;c(t,e,o,s,h,v,i,a)}if(r(o.fill).is("img")){e.strokeStyle="rgba(0,0,0,0.5)",e.lineWidth=2,e.stroke();var d=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",e.fill(),e.globalCompositeOperation=d,e.clip(),e.drawImage(o.fill,0,0,o.size,o.size),e.restore()}else e.fillStyle=o.fill,e.fill()},h=function(t,e){var n=o(e.text,e.ecLevel,e.minVersion,e.maxVersion,e.quiet);if(!n)return null;var i=r(t).data("qrcode",n),a=i[0].getContext("2d");return u(n,a,e),s(n,a,e),i},v=function(t){var e=r("").attr("width",t.size).attr("height",t.size);return h(e,t)},d=function(t){return r("").attr("src",v(t)[0].toDataURL("image/png"))},w=function(t){var e=o(t.text,t.ecLevel,t.minVersion,t.maxVersion,t.quiet);if(!e)return null;var n,i,a=t.size,u=t.background,f=Math.floor,l=e.moduleCount,c=f(a/l),g=f(.5*(a-c*l)),s={position:"relative",left:0,top:0,padding:0,margin:0,width:a,height:a},h={position:"absolute",padding:0,margin:0,width:c,height:c,"background-color":t.fill},v=r("
").data("qrcode",e).css(s);for(u&&v.css("background-color",u),n=0;l>n;n+=1)for(i=0;l>i;i+=1)e.isDark(n,i)&&r("
").css(h).css({left:g+i*c,top:g+n*c}).appendTo(v);return v},m=function(r){return e&&"canvas"===r.render?v(r):e&&"image"===r.render?d(r):w(r)},T={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};r.fn.qrcode=function(t){var e=r.extend({},T,t);return this.each(function(){"canvas"===this.nodeName.toLowerCase()?h(this,e):r(this).append(m(e))})};var y=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;re;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(h),y(0,0),y(h-7,0),y(0,h-7),E(),B(),A(r,t),c>=7&&k(r),null==d&&(d=C(c,g,w)),M(d,t)},y=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=h))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=h||(s[r+e][t+n]=e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?!0:!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){T(!0,e);var n=i.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;h-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;h-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},E=function(){for(var r=i.getPatternPosition(c),t=0;t=a;a+=1)for(var u=-2;2>=u;u+=1)s[n+a][o+u]=-2==a||2==a||-2==u||2==u||0==a&&0==u?!0:!1}},k=function(r){for(var t=i.getBCHTypeNumber(c),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+h-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+h-8-3][Math.floor(e/3)]=n}},A=function(r,t){for(var e=g<<3|t,n=i.getBCHTypeInfo(e),o=0;15>o;o+=1){var a=!r&&1==(n>>o&1);6>o?s[o][8]=a:8>o?s[o+1][8]=a:s[h-15+o][8]=a}for(var o=0;15>o;o+=1){var a=!r&&1==(n>>o&1);8>o?s[8][h-o-1]=a:9>o?s[8][15-o-1+1]=a:s[8][15-o-1]=a}s[h-8][8]=!r},M=function(r,t){for(var e=-1,n=h-1,o=7,a=0,u=i.getMaskFunction(t),f=h-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var l=0;2>l;l+=1)if(null==s[n][f-l]){var c=!1;a>>o&1));var g=u(n,f-l);g&&(c=!c),s[n][f-l]=c,o-=1,-1==o&&(a+=1,o=7)}if(n+=e,0>n||n>=h){n-=e,e=-e;break}}},D=function(t,e){for(var n=0,o=0,a=0,u=new Array(e.length),f=new Array(e.length),l=0;l=0?d.get(w):0}}for(var m=0,s=0;ss;s+=1)for(var l=0;ls;s+=1)for(var l=0;l8*s)throw new Error("code length overflow. ("+l.getLengthInBits()+">"+8*s+")");for(l.getLengthInBits()+4<=8*s&&l.put(0,4);l.getLengthInBits()%8!=0;)l.putBit(!1);for(;;){if(l.getLengthInBits()>=8*s)break;if(l.put(o,8),l.getLengthInBits()>=8*s)break;l.put(a,8)}return D(l,n)};return m.addData=function(r){var t=l(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=h||0>t||t>=h)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return h},m.make=function(){T(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='";for(var o=0;o';e+=""}return e+="",e+="
"},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return v(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var i=Math.floor((t-n)/r),a=Math.floor((e-n)/r);return m.isDark(a,i)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;ei)t.push(i);else{var a=e[r.charAt(o)];"number"==typeof a?(255&a)==a?t.push(a):(t.push(a>>>8),t.push(255&a)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},i=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,i=7973,u=21522,f={},l=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;l(t)-l(n)>=0;)t^=n<=0;)t^=i<n;n+=1)e=e.multiply(r([1,a.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var i=0,a=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&a==r.isDark(n+u,o+f)&&(i+=1);i>5&&(e+=3+i-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var l=0;r.isDark(n,o)&&(l+=1),r.isDark(n+1,o)&&(l+=1),r.isDark(n,o+1)&&(l+=1),r.isDark(n+1,o+1)&&(l+=1),(0==l||4==l)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var c=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(c+=1);var g=Math.abs(100*c/t/t-50)/5;return e+=10*g},f}(),a=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return void 0}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var i=n.length/3,a=new Array,u=0;i>u;u+=1)for(var f=n[3*u+0],l=n[3*u+1],c=n[3*u+2],g=0;f>g;g+=1)a.push(t(l,c));return a},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.get=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},l=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),i={};return i.getMode=function(){return n},i.getLength=function(){return o.length},i.write=function(r){for(var t=0;t>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},i=function(r){n+=String.fromCharCode(a(63&r))},a=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)i(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(i(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,a=0;o>a;a+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,i={};i.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|a(r.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i};var a=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return i},h=function(r,t){var e=r,n=t,o=new Array(r*t),i={};i.setPixel=function(r,t,n){o[t*e+r]=n},i.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var i=0;o.length-i>255;)r.writeByte(255),r.writeBytes(o,i,255),i+=255;r.writeByte(o.length-i),r.writeBytes(o,i,o.length-i),r.writeByte(0),r.writeString(";")};var a=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<>>=8-e,n=0,e=0;n=r<0&&t.writeByte(n)},o},u=function(r){for(var t=1<u;u+=1)i.add(String.fromCharCode(u));i.add(String.fromCharCode(t)),i.add(String.fromCharCode(e));var l=c(),g=a(l);g.write(t,n);var s=0,h=String.fromCharCode(o[s]);for(s+=1;si;i+=1)for(var a=0;r>a;a+=1)o.setPixel(a,i,e(a,i));var u=c();o.write(u);for(var f=g(),l=u.toByteArray(),s=0;sr||r>=a||0>t||t>=a?!1:i.isDark(r,t)}var i=y(e,t);i.addData(r),i.make(),n=n||0;var a=i.getModuleCount(),u=i.getModuleCount()+2*n,f=function(r,t,e,n){var o=this.isDark,i=1/u;this.isDark=function(a,u){var f=u*i,l=a*i,c=f+i,g=l+i;return o(a,u)&&(r>c||f>e||t>g||l>n)}};this.text=r,this.level=t,this.version=e,this.moduleCount=u,this.isDark=o,this.addBlank=f}function t(t,e,n,o,i){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var a=n;o>=a;a+=1)try{return new r(t,e,a,i)}catch(u){}}function e(r,t,e){var n=e.size,o="bold "+e.mSize*n+"px "+e.fontname,i=d("")[0].getContext("2d");i.font=o;var a=i.measureText(e.label).width,u=e.mSize,f=a/n,l=(1-f)*e.mPosX,c=(1-u)*e.mPosY,g=l+f,s=c+u,h=.01;1===e.mode?r.addBlank(0,c-h,n,s+h):r.addBlank(l-h,c-h,g+h,s+h),t.fillStyle=e.fontcolor,t.font=o,t.fillText(e.label,l*n,c*n+.75*e.mSize*n)}function n(r,t,e){var n=e.size,o=e.image.naturalWidth||1,i=e.image.naturalHeight||1,a=e.mSize,u=a*o/i,f=(1-u)*e.mPosX,l=(1-a)*e.mPosY,c=f+u,g=l+a,s=.01;3===e.mode?r.addBlank(0,l-s,n,g+s):r.addBlank(f-s,l-s,c+s,g+s),t.drawImage(e.image,f*n,l*n,u*n,a*n)}function o(r,t,o){d(o.background).is("img")?t.drawImage(o.background,0,0,o.size,o.size):o.background&&(t.fillStyle=o.background,t.fillRect(o.left,o.top,o.size,o.size));var i=o.mode;1===i||2===i?e(r,t,o):(3===i||4===i)&&n(r,t,o)}function i(r,t,e,n,o,i,a,u){r.isDark(a,u)&&t.rect(n,o,i,i)}function a(r,t,e,n,o,i,a,u,f,l){a?r.moveTo(t+i,e):r.moveTo(t,e),u?(r.lineTo(n-i,e),r.arcTo(n,e,n,o,i)):r.lineTo(n,e),f?(r.lineTo(n,o-i),r.arcTo(n,o,t,o,i)):r.lineTo(n,o),l?(r.lineTo(t+i,o),r.arcTo(t,o,t,e,i)):r.lineTo(t,o),a?(r.lineTo(t,e+i),r.arcTo(t,e,n,e,i)):r.lineTo(t,e)}function u(r,t,e,n,o,i,a,u,f,l){a&&(r.moveTo(t+i,e),r.lineTo(t,e),r.lineTo(t,e+i),r.arcTo(t,e,t+i,e,i)),u&&(r.moveTo(n-i,e),r.lineTo(n,e),r.lineTo(n,e+i),r.arcTo(n,e,n-i,e,i)),f&&(r.moveTo(n-i,o),r.lineTo(n,o),r.lineTo(n,o-i),r.arcTo(n,o,n-i,o,i)),l&&(r.moveTo(t+i,o),r.lineTo(t,o),r.lineTo(t,o-i),r.arcTo(t,o,t+i,o,i))}function f(r,t,e,n,o,i,f,l){var c=r.isDark,g=n+i,s=o+i,h=e.radius*i,v=f-1,d=f+1,w=l-1,m=l+1,T=c(f,l),y=c(v,w),p=c(v,l),B=c(v,m),E=c(f,m),k=c(d,m),A=c(d,l),M=c(d,w),D=c(f,w);T?a(t,n,o,g,s,h,!p&&!D,!p&&!E,!A&&!E,!A&&!D):u(t,n,o,g,s,h,p&&D&&y,p&&E&&B,A&&E&&k,A&&D&&M)}function l(r,t,e){var n,o,a=r.moduleCount,u=e.size/a,l=i;for(m&&e.radius>0&&e.radius<=.5&&(l=f),t.beginPath(),n=0;a>n;n+=1)for(o=0;a>o;o+=1){var c=e.left+o*u,g=e.top+n*u,s=u;l(r,t,e,c,g,s,n,o)}if(d(e.fill).is("img")){t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=2,t.stroke();var h=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",t.fill(),t.globalCompositeOperation=h,t.clip(),t.drawImage(e.fill,0,0,e.size,e.size),t.restore()}else t.fillStyle=e.fill,t.fill()}function c(r,e){var n=t(e.text,e.ecLevel,e.minVersion,e.maxVersion,e.quiet);if(!n)return null;var i=d(r).data("qrcode",n),a=i[0].getContext("2d");return o(n,a,e),l(n,a,e),i}function g(r){var t=d("").attr("width",r.size).attr("height",r.size);return c(t,r)}function s(r){return d("").attr("src",g(r)[0].toDataURL("image/png"))}function h(r){var e=t(r.text,r.ecLevel,r.minVersion,r.maxVersion,r.quiet);if(!e)return null;var n,o,i=r.size,a=r.background,u=Math.floor,f=e.moduleCount,l=u(i/f),c=u(.5*(i-l*f)),g={position:"relative",left:0,top:0,padding:0,margin:0,width:i,height:i},s={position:"absolute",padding:0,margin:0,width:l,height:l,"background-color":r.fill},h=d("
").data("qrcode",e).css(g);for(a&&h.css("background-color",a),n=0;f>n;n+=1)for(o=0;f>o;o+=1)e.isDark(n,o)&&d("
").css(s).css({left:c+o*l,top:c+n*l}).appendTo(h);return h}function v(r){return w&&"canvas"===r.render?g(r):w&&"image"===r.render?s(r):h(r)}var d=jQuery,w=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),m="[object Opera]"!==Object.prototype.toString.call(window.opera),T={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};d.fn.qrcode=function(r){var t=d.extend({},T,r);return this.each(function(){"canvas"===this.nodeName.toLowerCase()?c(this,t):d(this).append(v(t))})};var y=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;re;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(h),y(0,0),y(h-7,0),y(0,h-7),E(),B(),A(r,t),c>=7&&k(r),null==d&&(d=C(c,g,w)),M(d,t)},y=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=h))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=h||(s[r+e][t+n]=e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?!0:!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){T(!0,e);var n=i.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;h-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;h-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},E=function(){for(var r=i.getPatternPosition(c),t=0;t=a;a+=1)for(var u=-2;2>=u;u+=1)s[n+a][o+u]=-2==a||2==a||-2==u||2==u||0==a&&0==u?!0:!1}},k=function(r){for(var t=i.getBCHTypeNumber(c),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+h-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+h-8-3][Math.floor(e/3)]=n}},A=function(r,t){for(var e=g<<3|t,n=i.getBCHTypeInfo(e),o=0;15>o;o+=1){var a=!r&&1==(n>>o&1);6>o?s[o][8]=a:8>o?s[o+1][8]=a:s[h-15+o][8]=a}for(var o=0;15>o;o+=1){var a=!r&&1==(n>>o&1);8>o?s[8][h-o-1]=a:9>o?s[8][15-o-1+1]=a:s[8][15-o-1]=a}s[h-8][8]=!r},M=function(r,t){for(var e=-1,n=h-1,o=7,a=0,u=i.getMaskFunction(t),f=h-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var l=0;2>l;l+=1)if(null==s[n][f-l]){var c=!1;a>>o&1));var g=u(n,f-l);g&&(c=!c),s[n][f-l]=c,o-=1,-1==o&&(a+=1,o=7)}if(n+=e,0>n||n>=h){n-=e,e=-e;break}}},D=function(t,e){for(var n=0,o=0,a=0,u=new Array(e.length),f=new Array(e.length),l=0;l=0?d.get(w):0}}for(var m=0,s=0;ss;s+=1)for(var l=0;ls;s+=1)for(var l=0;l8*s)throw new Error("code length overflow. ("+l.getLengthInBits()+">"+8*s+")");for(l.getLengthInBits()+4<=8*s&&l.put(0,4);l.getLengthInBits()%8!=0;)l.putBit(!1);for(;;){if(l.getLengthInBits()>=8*s)break;if(l.put(o,8),l.getLengthInBits()>=8*s)break;l.put(a,8)}return D(l,n)};return m.addData=function(r){var t=l(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=h||0>t||t>=h)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return h},m.make=function(){T(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='";for(var o=0;o';e+=""}return e+="",e+="
"},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return v(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var i=Math.floor((t-n)/r),a=Math.floor((e-n)/r);return m.isDark(a,i)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;ei)t.push(i);else{var a=e[r.charAt(o)];"number"==typeof a?(255&a)==a?t.push(a):(t.push(a>>>8),t.push(255&a)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},i=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,i=7973,u=21522,f={},l=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;l(t)-l(n)>=0;)t^=n<=0;)t^=i<n;n+=1)e=e.multiply(r([1,a.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var i=0,a=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&a==r.isDark(n+u,o+f)&&(i+=1);i>5&&(e+=3+i-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var l=0;r.isDark(n,o)&&(l+=1),r.isDark(n+1,o)&&(l+=1),r.isDark(n,o+1)&&(l+=1),r.isDark(n+1,o+1)&&(l+=1),(0==l||4==l)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var c=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(c+=1);var g=Math.abs(100*c/t/t-50)/5;return e+=10*g},f}(),a=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return void 0}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var i=n.length/3,a=new Array,u=0;i>u;u+=1)for(var f=n[3*u+0],l=n[3*u+1],c=n[3*u+2],g=0;f>g;g+=1)a.push(t(l,c));return a},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.get=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},l=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),i={};return i.getMode=function(){return n},i.getLength=function(){return o.length},i.write=function(r){for(var t=0;t>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},i=function(r){n+=String.fromCharCode(a(63&r))},a=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)i(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(i(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,a=0;o>a;a+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,i={};i.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|a(r.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i};var a=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return i},h=function(r,t){var e=r,n=t,o=new Array(r*t),i={};i.setPixel=function(r,t,n){o[t*e+r]=n},i.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var i=0;o.length-i>255;)r.writeByte(255),r.writeBytes(o,i,255),i+=255;r.writeByte(o.length-i),r.writeBytes(o,i,o.length-i),r.writeByte(0),r.writeString(";")};var a=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<>>=8-e,n=0,e=0;n=r<0&&t.writeByte(n)},o},u=function(r){for(var t=1<u;u+=1)i.add(String.fromCharCode(u));i.add(String.fromCharCode(t)),i.add(String.fromCharCode(e));var l=c(),g=a(l);g.write(t,n);var s=0,h=String.fromCharCode(o[s]);for(s+=1;si;i+=1)for(var a=0;r>a;a+=1)o.setPixel(a,i,e(a,i));var u=c();o.write(u);for(var f=g(),l=u.toByteArray(),s=0;s= qrModuleCount || col < 0 || col >= qrModuleCount) { - return false; - } + row -= quiet; + col -= quiet; - return qr.isDark(row, col); - }, - addBlank = function (l, t, r, b) { - - var prevIsDark = this.isDark, - moduleSize = 1 / quietModuleCount; - - this.isDark = function (row, col) { - - var ml = col * moduleSize, - mt = row * moduleSize, - mr = ml + moduleSize, - mb = mt + moduleSize; - - return prevIsDark(row, col) && (l > mr || ml > r || t > mb || mt > b); - }; - }; - - this.text = text; - this.level = level; - this.version = version; - this.moduleCount = quietModuleCount; - this.isDark = isDark; - this.addBlank = addBlank; - }, - - // Check if canvas is available in the browser (as Modernizr does) - canvasAvailable = (function () { - - var elem = document.createElement('canvas'); - return !!(elem.getContext && elem.getContext('2d')); - }()), - - arcToAvailable = Object.prototype.toString.call(window.opera) !== '[object Opera]', - - // Returns a minimal QR code for the given text starting with version `minVersion`. - // Returns `null` if `text` is too long to be encoded in `maxVersion`. - createQRCode = function (text, level, minVersion, maxVersion, quiet) { - - minVersion = Math.max(1, minVersion || 1); - maxVersion = Math.min(40, maxVersion || 40); - for (var version = minVersion; version <= maxVersion; version += 1) { - try { - return new QRCode(text, level, version, quiet); - } catch (err) {} - } - }, - - drawBackgroundLabel = function (qr, context, settings) { - - var size = settings.size, - font = "bold " + (settings.mSize * size) + "px " + settings.fontname, - ctx = $('')[0].getContext("2d"); - - ctx.font = font; - - var w = ctx.measureText(settings.label).width, - sh = settings.mSize, - sw = w / size, - sl = (1 - sw) * settings.mPosX, - st = (1 - sh) * settings.mPosY, - sr = sl + sw, - sb = st + sh, - pad = 0.01; - - if (settings.mode === 1) { - // Strip - qr.addBlank(0, st - pad, size, sb + pad); - } else { - // Box - qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); - } - - context.fillStyle = settings.fontcolor; - context.font = font; - context.fillText(settings.label, sl*size, st*size + 0.75 * settings.mSize * size); - }, - - drawBackgroundImage = function (qr, context, settings) { - - var size = settings.size, - w = settings.image.naturalWidth || 1, - h = settings.image.naturalHeight || 1, - sh = settings.mSize, - sw = sh * w / h, - sl = (1 - sw) * settings.mPosX, - st = (1 - sh) * settings.mPosY, - sr = sl + sw, - sb = st + sh, - pad = 0.01; - - if (settings.mode === 3) { - // Strip - qr.addBlank(0, st - pad, size, sb + pad); - } else { - // Box - qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); - } - - context.drawImage(settings.image, sl*size, st*size, sw*size, sh*size); - }, - - drawBackground = function (qr, context, settings) { - - if ($(settings.background).is('img')) { - context.drawImage(settings.background, 0, 0, settings.size, settings.size); - } else if (settings.background) { - context.fillStyle = settings.background; - context.fillRect(settings.left, settings.top, settings.size, settings.size); - } - - var mode = settings.mode; - if (mode === 1 || mode === 2) { - drawBackgroundLabel(qr, context, settings); - } else if (mode === 3 || mode === 4) { - drawBackgroundImage(qr, context, settings); - } - }, - - drawModuleDefault = function (qr, context, settings, left, top, width, row, col) { - - if (qr.isDark(row, col)) { - context.rect(left, top, width, width); + if (row < 0 || row >= qrModuleCount || col < 0 || col >= qrModuleCount) { + return false; } - }, - drawModuleRoundedDark = function (ctx, l, t, r, b, rad, nw, ne, se, sw) { + return qr.isDark(row, col); + } - if (nw) { - ctx.moveTo(l + rad, t); - } else { - ctx.moveTo(l, t); - } + var addBlank = function (l, t, r, b) { - if (ne) { - ctx.lineTo(r - rad, t); - ctx.arcTo(r, t, r, b, rad); - } else { - ctx.lineTo(r, t); - } + var prevIsDark = this.isDark; + var moduleSize = 1 / quietModuleCount; - if (se) { - ctx.lineTo(r, b - rad); - ctx.arcTo(r, b, l, b, rad); - } else { - ctx.lineTo(r, b); - } + this.isDark = function (row, col) { - if (sw) { - ctx.lineTo(l + rad, b); - ctx.arcTo(l, b, l, t, rad); - } else { - ctx.lineTo(l, b); - } + var ml = col * moduleSize; + var mt = row * moduleSize; + var mr = ml + moduleSize; + var mb = mt + moduleSize; - if (nw) { - ctx.lineTo(l, t + rad); - ctx.arcTo(l, t, r, t, rad); - } else { - ctx.lineTo(l, t); - } - }, - - drawModuleRoundendLight = function (ctx, l, t, r, b, rad, nw, ne, se, sw) { - - if (nw) { - ctx.moveTo(l + rad, t); - ctx.lineTo(l, t); - ctx.lineTo(l, t + rad); - ctx.arcTo(l, t, l + rad, t, rad); - } - - if (ne) { - ctx.moveTo(r - rad, t); - ctx.lineTo(r, t); - ctx.lineTo(r, t + rad); - ctx.arcTo(r, t, r - rad, t, rad); - } - - if (se) { - ctx.moveTo(r - rad, b); - ctx.lineTo(r, b); - ctx.lineTo(r, b - rad); - ctx.arcTo(r, b, r - rad, b, rad); - } - - if (sw) { - ctx.moveTo(l + rad, b); - ctx.lineTo(l, b); - ctx.lineTo(l, b - rad); - ctx.arcTo(l, b, l + rad, b, rad); - } - }, - - drawModuleRounded = function (qr, context, settings, left, top, width, row, col) { - - var isDark = qr.isDark, - right = left + width, - bottom = top + width, - radius = settings.radius * width, - rowT = row - 1, - rowB = row + 1, - colL = col - 1, - colR = col + 1, - center = isDark(row, col), - northwest = isDark(rowT, colL), - north = isDark(rowT, col), - northeast = isDark(rowT, colR), - east = isDark(row, colR), - southeast = isDark(rowB, colR), - south = isDark(rowB, col), - southwest = isDark(rowB, colL), - west = isDark(row, colL); - - if (center) { - drawModuleRoundedDark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west); - } else { - drawModuleRoundendLight(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest); - } - }, - - drawModules = function (qr, context, settings) { - - var moduleCount = qr.moduleCount, - moduleSize = settings.size / moduleCount, - fn = drawModuleDefault, - row, col; - - if (arcToAvailable && settings.radius > 0 && settings.radius <= 0.5) { - fn = drawModuleRounded; - } - - context.beginPath(); - for (row = 0; row < moduleCount; row += 1) { - for (col = 0; col < moduleCount; col += 1) { - - var l = settings.left + col * moduleSize, - t = settings.top + row * moduleSize, - w = moduleSize; - - fn(qr, context, settings, l, t, w, row, col); - } - } - if ($(settings.fill).is('img')) { - context.strokeStyle = 'rgba(0,0,0,0.5)'; - context.lineWidth = 2; - context.stroke(); - var prev = context.globalCompositeOperation; - context.globalCompositeOperation = "destination-out"; - context.fill(); - context.globalCompositeOperation = prev; - - context.clip(); - context.drawImage(settings.fill, 0, 0, settings.size, settings.size); - context.restore(); - } else { - context.fillStyle = settings.fill; - context.fill(); - } - }, - - // Draws QR code to the given `canvas` and returns it. - drawOnCanvas = function (canvas, settings) { - - var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); - if (!qr) { - return null; - } - - var $canvas = $(canvas).data('qrcode', qr), - context = $canvas[0].getContext('2d'); - - drawBackground(qr, context, settings); - drawModules(qr, context, settings); - - return $canvas; - }, - - // Returns a `canvas` element representing the QR code for the given settings. - createCanvas = function (settings) { - - var $canvas = $('').attr('width', settings.size).attr('height', settings.size); - return drawOnCanvas($canvas, settings); - }, - - // Returns an `image` element representing the QR code for the given settings. - createImage = function (settings) { - - return $('').attr('src', createCanvas(settings)[0].toDataURL('image/png')); - }, + return prevIsDark(row, col) && (l > mr || ml > r || t > mb || mt > b); + }; + }; - // Returns a `div` element representing the QR code for the given settings. - createDiv = function (settings) { + this.text = text; + this.level = level; + this.version = version; + this.moduleCount = quietModuleCount; + this.isDark = isDark; + this.addBlank = addBlank; +} - var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); - if (!qr) { - return null; - } +// Check if canvas is available in the browser (as Modernizr does) +var hasCanvas = (function () { - // some shortcuts to improve compression - var settings_size = settings.size, - settings_bgColor = settings.background, - math_floor = Math.floor, - - moduleCount = qr.moduleCount, - moduleSize = math_floor(settings_size / moduleCount), - offset = math_floor(0.5 * (settings_size - moduleSize * moduleCount)), - - row, col, - - containerCSS = { - position: 'relative', - left: 0, - top: 0, - padding: 0, - margin: 0, - width: settings_size, - height: settings_size - }, - darkCSS = { - position: 'absolute', - padding: 0, - margin: 0, - width: moduleSize, - height: moduleSize, - 'background-color': settings.fill - }, - - $div = $('
').data('qrcode', qr).css(containerCSS); - - if (settings_bgColor) { - $div.css('background-color', settings_bgColor); + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }()); +var hasArcTo = Object.prototype.toString.call(window.opera) !== '[object Opera]'; + +// Returns a minimal QR code for the given text starting with version `minVersion`. +// Returns `undefined` if `text` is too long to be encoded in `maxVersion`. +function createQRCode(text, level, minVersion, maxVersion, quiet) { + + minVersion = Math.max(1, minVersion || 1); + maxVersion = Math.min(40, maxVersion || 40); + for (var version = minVersion; version <= maxVersion; version += 1) { + try { + return new QRCode(text, level, version, quiet); + } catch (err) {} + } +} + +function drawBackgroundLabel(qr, context, settings) { + + var size = settings.size; + var font = "bold " + (settings.mSize * size) + "px " + settings.fontname; + var ctx = $('')[0].getContext("2d"); + + ctx.font = font; + + var w = ctx.measureText(settings.label).width; + var sh = settings.mSize; + var sw = w / size; + var sl = (1 - sw) * settings.mPosX; + var st = (1 - sh) * settings.mPosY; + var sr = sl + sw; + var sb = st + sh; + var pad = 0.01; + + if (settings.mode === 1) { + // Strip + qr.addBlank(0, st - pad, size, sb + pad); + } else { + // Box + qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); + } + + context.fillStyle = settings.fontcolor; + context.font = font; + context.fillText(settings.label, sl*size, st*size + 0.75 * settings.mSize * size); +} + +function drawBackgroundImage(qr, context, settings) { + + var size = settings.size; + var w = settings.image.naturalWidth || 1; + var h = settings.image.naturalHeight || 1; + var sh = settings.mSize; + var sw = sh * w / h; + var sl = (1 - sw) * settings.mPosX; + var st = (1 - sh) * settings.mPosY; + var sr = sl + sw; + var sb = st + sh; + var pad = 0.01; + + if (settings.mode === 3) { + // Strip + qr.addBlank(0, st - pad, size, sb + pad); + } else { + // Box + qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); + } + + context.drawImage(settings.image, sl*size, st*size, sw*size, sh*size); +} + +function drawBackground(qr, context, settings) { + + if ($(settings.background).is('img')) { + context.drawImage(settings.background, 0, 0, settings.size, settings.size); + } else if (settings.background) { + context.fillStyle = settings.background; + context.fillRect(settings.left, settings.top, settings.size, settings.size); + } + + var mode = settings.mode; + if (mode === 1 || mode === 2) { + drawBackgroundLabel(qr, context, settings); + } else if (mode === 3 || mode === 4) { + drawBackgroundImage(qr, context, settings); + } +} + +function drawModuleDefault(qr, context, settings, left, top, width, row, col) { + + if (qr.isDark(row, col)) { + context.rect(left, top, width, width); + } +} + +function drawModuleRoundedDark(ctx, l, t, r, b, rad, nw, ne, se, sw) { + + if (nw) { + ctx.moveTo(l + rad, t); + } else { + ctx.moveTo(l, t); + } + + if (ne) { + ctx.lineTo(r - rad, t); + ctx.arcTo(r, t, r, b, rad); + } else { + ctx.lineTo(r, t); + } + + if (se) { + ctx.lineTo(r, b - rad); + ctx.arcTo(r, b, l, b, rad); + } else { + ctx.lineTo(r, b); + } + + if (sw) { + ctx.lineTo(l + rad, b); + ctx.arcTo(l, b, l, t, rad); + } else { + ctx.lineTo(l, b); + } + + if (nw) { + ctx.lineTo(l, t + rad); + ctx.arcTo(l, t, r, t, rad); + } else { + ctx.lineTo(l, t); + } +} + +function drawModuleRoundendLight(ctx, l, t, r, b, rad, nw, ne, se, sw) { + + if (nw) { + ctx.moveTo(l + rad, t); + ctx.lineTo(l, t); + ctx.lineTo(l, t + rad); + ctx.arcTo(l, t, l + rad, t, rad); + } + + if (ne) { + ctx.moveTo(r - rad, t); + ctx.lineTo(r, t); + ctx.lineTo(r, t + rad); + ctx.arcTo(r, t, r - rad, t, rad); + } + + if (se) { + ctx.moveTo(r - rad, b); + ctx.lineTo(r, b); + ctx.lineTo(r, b - rad); + ctx.arcTo(r, b, r - rad, b, rad); + } + + if (sw) { + ctx.moveTo(l + rad, b); + ctx.lineTo(l, b); + ctx.lineTo(l, b - rad); + ctx.arcTo(l, b, l + rad, b, rad); + } +} + +function drawModuleRounded(qr, context, settings, left, top, width, row, col) { + + var isDark = qr.isDark; + var right = left + width; + var bottom = top + width; + var radius = settings.radius * width; + var rowT = row - 1; + var rowB = row + 1; + var colL = col - 1; + var colR = col + 1; + var center = isDark(row, col); + var northwest = isDark(rowT, colL); + var north = isDark(rowT, col); + var northeast = isDark(rowT, colR); + var east = isDark(row, colR); + var southeast = isDark(rowB, colR); + var south = isDark(rowB, col); + var southwest = isDark(rowB, colL); + var west = isDark(row, colL); + + if (center) { + drawModuleRoundedDark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west); + } else { + drawModuleRoundendLight(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest); + } +} + +function drawModules(qr, context, settings) { + + var moduleCount = qr.moduleCount; + var moduleSize = settings.size / moduleCount; + var fn = drawModuleDefault; + var row, col; + + if (hasArcTo && settings.radius > 0 && settings.radius <= 0.5) { + fn = drawModuleRounded; + } + + context.beginPath(); + for (row = 0; row < moduleCount; row += 1) { + for (col = 0; col < moduleCount; col += 1) { + + var l = settings.left + col * moduleSize, + t = settings.top + row * moduleSize, + w = moduleSize; + + fn(qr, context, settings, l, t, w, row, col); } - - for (row = 0; row < moduleCount; row += 1) { - for (col = 0; col < moduleCount; col += 1) { - if (qr.isDark(row, col)) { - $('
') - .css(darkCSS) - .css({ - left: offset + col * moduleSize, - top: offset + row * moduleSize - }) - .appendTo($div); - } + } + if ($(settings.fill).is('img')) { + context.strokeStyle = 'rgba(0,0,0,0.5)'; + context.lineWidth = 2; + context.stroke(); + var prev = context.globalCompositeOperation; + context.globalCompositeOperation = "destination-out"; + context.fill(); + context.globalCompositeOperation = prev; + + context.clip(); + context.drawImage(settings.fill, 0, 0, settings.size, settings.size); + context.restore(); + } else { + context.fillStyle = settings.fill; + context.fill(); + } +} + +// Draws QR code to the given `canvas` and returns it. +function drawOnCanvas(canvas, settings) { + + var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); + if (!qr) { + return null; + } + + var $canvas = $(canvas).data('qrcode', qr); + var context = $canvas[0].getContext('2d'); + + drawBackground(qr, context, settings); + drawModules(qr, context, settings); + + return $canvas; +} + +// Returns a `canvas` element representing the QR code for the given settings. +function createCanvas(settings) { + + var $canvas = $('').attr('width', settings.size).attr('height', settings.size); + return drawOnCanvas($canvas, settings); +} + +// Returns an `image` element representing the QR code for the given settings. +function createImage(settings) { + + return $('').attr('src', createCanvas(settings)[0].toDataURL('image/png')); +} + +// Returns a `div` element representing the QR code for the given settings. +function createDiv(settings) { + + var qr = createQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); + if (!qr) { + return null; + } + + // some shortcuts to improve compression + var settings_size = settings.size; + var settings_bgColor = settings.background; + var math_floor = Math.floor; + + var moduleCount = qr.moduleCount; + var moduleSize = math_floor(settings_size / moduleCount); + var offset = math_floor(0.5 * (settings_size - moduleSize * moduleCount)); + + var row, col; + + var containerCSS = { + position: 'relative', + left: 0, + top: 0, + padding: 0, + margin: 0, + width: settings_size, + height: settings_size + }; + var darkCSS = { + position: 'absolute', + padding: 0, + margin: 0, + width: moduleSize, + height: moduleSize, + 'background-color': settings.fill + }; + + var $div = $('
').data('qrcode', qr).css(containerCSS); + + if (settings_bgColor) { + $div.css('background-color', settings_bgColor); + } + + for (row = 0; row < moduleCount; row += 1) { + for (col = 0; col < moduleCount; col += 1) { + if (qr.isDark(row, col)) { + $('
') + .css(darkCSS) + .css({ + left: offset + col * moduleSize, + top: offset + row * moduleSize + }) + .appendTo($div); } } + } - return $div; - }, + return $div; +} - createHTML = function (settings) { +function createHTML(settings) { - if (canvasAvailable && settings.render === 'canvas') { - return createCanvas(settings); - } else if (canvasAvailable && settings.render === 'image') { - return createImage(settings); - } + if (hasCanvas && settings.render === 'canvas') { + return createCanvas(settings); + } else if (hasCanvas && settings.render === 'image') { + return createImage(settings); + } - return createDiv(settings); - }, + return createDiv(settings); +} - // Plugin - // ====== +// Plugin +// ====== - // Default settings - // ---------------- - defaults = { +// Default settings +// ---------------- +var defaults = { // render method: `'canvas'`, `'image'` or `'div'` render: 'canvas',