UNPKG

@progress/kendo-ui

Version:

This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.

937 lines (826 loc) 61.9 kB
import './kendo.dataviz.core.js'; import './html-DIrOxn6k.js'; import { Box } from '@progress/kendo-charts'; import { Path, MultiPath, Group, Image, Surface } from '@progress/kendo-drawing'; import '@progress/kendo-charts/dist/es/core-export.js'; import './kendo.popup.js'; import './kendo.core.js'; import './kendo.licensing.js'; import '@progress/kendo-licensing'; import './kendo.icons.js'; import './kendo.html.icon.js'; import './kendo.html.base.js'; import '@progress/kendo-svg-icons'; import './kendo.color.js'; const __meta__ = { id: "dataviz.qrcode", name: "QRCode", category: "dataviz", description: "QRCode widget.", depends: [ "dataviz.core", "drawing" ] }; (function($, undefined$1) { var kendo = window.kendo, extend = $.extend, dataviz = kendo.dataviz, Widget = kendo.ui.Widget, terminator = "0000", NUMERIC = "numeric", ALPHA_NUMERIC = "alphanumeric", BYTE = "byte", powersOfTwo = { "1": 0 }, powersOfTwoResult = { "0": 1 }, generatorPolynomials = [[1,0],[1,25,0]], irregularAlignmentPatternsStartDistance = { 15: 20,16: 20,18: 24,19: 24,22: 20,24: 22,26: 24,28: 20,30: 20,31: 24,32: 28,33: 24,36: 18,37: 22,39: 20,40: 24 }, versionsCodewordsInformation = [{ L: { groups: [[1,19]],totalDataCodewords: 19,errorCodewordsPerBlock: 7 },M: { groups: [[1,16]],totalDataCodewords: 16,errorCodewordsPerBlock: 10 },Q: { groups: [[1,13]],totalDataCodewords: 13,errorCodewordsPerBlock: 13 },H: { groups: [[1,9]],totalDataCodewords: 9,errorCodewordsPerBlock: 17 } },{ L: { groups: [[1,34]],totalDataCodewords: 34,errorCodewordsPerBlock: 10 },M: { groups: [[1,28]],totalDataCodewords: 28,errorCodewordsPerBlock: 16 },Q: { groups: [[1,22]],totalDataCodewords: 22,errorCodewordsPerBlock: 22 },H: { groups: [[1,16]],totalDataCodewords: 16,errorCodewordsPerBlock: 28 } },{ L: { groups: [[1,55]],totalDataCodewords: 55,errorCodewordsPerBlock: 15 },M: { groups: [[1,44]],totalDataCodewords: 44,errorCodewordsPerBlock: 26 },Q: { groups: [[2,17]],totalDataCodewords: 34,errorCodewordsPerBlock: 18 },H: { groups: [[2,13]],totalDataCodewords: 26,errorCodewordsPerBlock: 22 } },{ L: { groups: [[1,80]],totalDataCodewords: 80,errorCodewordsPerBlock: 20 },M: { groups: [[2,32]],totalDataCodewords: 64,errorCodewordsPerBlock: 18 },Q: { groups: [[2,24]],totalDataCodewords: 48,errorCodewordsPerBlock: 26 },H: { groups: [[4,9]],totalDataCodewords: 36,errorCodewordsPerBlock: 16 } },{ L: { groups: [[1,108]],totalDataCodewords: 108,errorCodewordsPerBlock: 26 },M: { groups: [[2,43]],totalDataCodewords: 86,errorCodewordsPerBlock: 24 },Q: { groups: [[2,15],[2,16]],totalDataCodewords: 62,errorCodewordsPerBlock: 18 },H: { groups: [[2,11],[2,12]],totalDataCodewords: 46,errorCodewordsPerBlock: 22 } },{ L: { groups: [[2,68]],totalDataCodewords: 136,errorCodewordsPerBlock: 18 },M: { groups: [[4,27]],totalDataCodewords: 108,errorCodewordsPerBlock: 16 },Q: { groups: [[4,19]],totalDataCodewords: 76,errorCodewordsPerBlock: 24 },H: { groups: [[4,15]],totalDataCodewords: 60,errorCodewordsPerBlock: 28 } },{ L: { groups: [[2,78]],totalDataCodewords: 156,errorCodewordsPerBlock: 20 },M: { groups: [[4,31]],totalDataCodewords: 124,errorCodewordsPerBlock: 18 },Q: { groups: [[2,14],[4,15]],totalDataCodewords: 88,errorCodewordsPerBlock: 18 },H: { groups: [[4,13],[1,14]],totalDataCodewords: 66,errorCodewordsPerBlock: 26 } },{ L: { groups: [[2,97]],totalDataCodewords: 194,errorCodewordsPerBlock: 24 },M: { groups: [[2,38],[2,39]],totalDataCodewords: 154,errorCodewordsPerBlock: 22 },Q: { groups: [[4,18],[2,19]],totalDataCodewords: 110,errorCodewordsPerBlock: 22 },H: { groups: [[4,14],[2,15]],totalDataCodewords: 86,errorCodewordsPerBlock: 26 } },{ L: { groups: [[2,116]],totalDataCodewords: 232,errorCodewordsPerBlock: 30 },M: { groups: [[3,36],[2,37]],totalDataCodewords: 182,errorCodewordsPerBlock: 22 },Q: { groups: [[4,16],[4,17]],totalDataCodewords: 132,errorCodewordsPerBlock: 20 },H: { groups: [[4,12],[4,13]],totalDataCodewords: 100,errorCodewordsPerBlock: 24 } },{ L: { groups: [[2,68],[2,69]],totalDataCodewords: 274,errorCodewordsPerBlock: 18 },M: { groups: [[4,43],[1,44]],totalDataCodewords: 216,errorCodewordsPerBlock: 26 },Q: { groups: [[6,19],[2,20]],totalDataCodewords: 154,errorCodewordsPerBlock: 24 },H: { groups: [[6,15],[2,16]],totalDataCodewords: 122,errorCodewordsPerBlock: 28 } },{ L: { groups: [[4,81]],totalDataCodewords: 324,errorCodewordsPerBlock: 20 },M: { groups: [[1,50],[4,51]],totalDataCodewords: 254,errorCodewordsPerBlock: 30 },Q: { groups: [[4,22],[4,23]],totalDataCodewords: 180,errorCodewordsPerBlock: 28 },H: { groups: [[3,12],[8,13]],totalDataCodewords: 140,errorCodewordsPerBlock: 24 } },{ L: { groups: [[2,92],[2,93]],totalDataCodewords: 370,errorCodewordsPerBlock: 24 },M: { groups: [[6,36],[2,37]],totalDataCodewords: 290,errorCodewordsPerBlock: 22 },Q: { groups: [[4,20],[6,21]],totalDataCodewords: 206,errorCodewordsPerBlock: 26 },H: { groups: [[7,14],[4,15]],totalDataCodewords: 158,errorCodewordsPerBlock: 28 } },{ L: { groups: [[4,107]],totalDataCodewords: 428,errorCodewordsPerBlock: 26 },M: { groups: [[8,37],[1,38]],totalDataCodewords: 334,errorCodewordsPerBlock: 22 },Q: { groups: [[8,20],[4,21]],totalDataCodewords: 244,errorCodewordsPerBlock: 24 },H: { groups: [[12,11],[4,12]],totalDataCodewords: 180,errorCodewordsPerBlock: 22 } },{ L: { groups: [[3,115],[1,116]],totalDataCodewords: 461,errorCodewordsPerBlock: 30 },M: { groups: [[4,40],[5,41]],totalDataCodewords: 365,errorCodewordsPerBlock: 24 },Q: { groups: [[11,16],[5,17]],totalDataCodewords: 261,errorCodewordsPerBlock: 20 },H: { groups: [[11,12],[5,13]],totalDataCodewords: 197,errorCodewordsPerBlock: 24 } },{ L: { groups: [[5,87],[1,88]],totalDataCodewords: 523,errorCodewordsPerBlock: 22 },M: { groups: [[5,41],[5,42]],totalDataCodewords: 415,errorCodewordsPerBlock: 24 },Q: { groups: [[5,24],[7,25]],totalDataCodewords: 295,errorCodewordsPerBlock: 30 },H: { groups: [[11,12],[7,13]],totalDataCodewords: 223,errorCodewordsPerBlock: 24 } },{ L: { groups: [[5,98],[1,99]],totalDataCodewords: 589,errorCodewordsPerBlock: 24 },M: { groups: [[7,45],[3,46]],totalDataCodewords: 453,errorCodewordsPerBlock: 28 },Q: { groups: [[15,19],[2,20]],totalDataCodewords: 325,errorCodewordsPerBlock: 24 },H: { groups: [[3,15],[13,16]],totalDataCodewords: 253,errorCodewordsPerBlock: 30 } },{ L: { groups: [[1,107],[5,108]],totalDataCodewords: 647,errorCodewordsPerBlock: 28 },M: { groups: [[10,46],[1,47]],totalDataCodewords: 507,errorCodewordsPerBlock: 28 },Q: { groups: [[1,22],[15,23]],totalDataCodewords: 367,errorCodewordsPerBlock: 28 },H: { groups: [[2,14],[17,15]],totalDataCodewords: 283,errorCodewordsPerBlock: 28 } },{ L: { groups: [[5,120],[1,121]],totalDataCodewords: 721,errorCodewordsPerBlock: 30 },M: { groups: [[9,43],[4,44]],totalDataCodewords: 563,errorCodewordsPerBlock: 26 },Q: { groups: [[17,22],[1,23]],totalDataCodewords: 397,errorCodewordsPerBlock: 28 },H: { groups: [[2,14],[19,15]],totalDataCodewords: 313,errorCodewordsPerBlock: 28 } },{ L: { groups: [[3,113],[4,114]],totalDataCodewords: 795,errorCodewordsPerBlock: 28 },M: { groups: [[3,44],[11,45]],totalDataCodewords: 627,errorCodewordsPerBlock: 26 },Q: { groups: [[17,21],[4,22]],totalDataCodewords: 445,errorCodewordsPerBlock: 26 },H: { groups: [[9,13],[16,14]],totalDataCodewords: 341,errorCodewordsPerBlock: 26 } },{ L: { groups: [[3,107],[5,108]],totalDataCodewords: 861,errorCodewordsPerBlock: 28 },M: { groups: [[3,41],[13,42]],totalDataCodewords: 669,errorCodewordsPerBlock: 26 },Q: { groups: [[15,24],[5,25]],totalDataCodewords: 485,errorCodewordsPerBlock: 30 },H: { groups: [[15,15],[10,16]],totalDataCodewords: 385,errorCodewordsPerBlock: 28 } },{ L: { groups: [[4,116],[4,117]],totalDataCodewords: 932,errorCodewordsPerBlock: 28 },M: { groups: [[17,42]],totalDataCodewords: 714,errorCodewordsPerBlock: 26 },Q: { groups: [[17,22],[6,23]],totalDataCodewords: 512,errorCodewordsPerBlock: 28 },H: { groups: [[19,16],[6,17]],totalDataCodewords: 406,errorCodewordsPerBlock: 30 } },{ L: { groups: [[2,111],[7,112]],totalDataCodewords: 1006,errorCodewordsPerBlock: 28 },M: { groups: [[17,46]],totalDataCodewords: 782,errorCodewordsPerBlock: 28 },Q: { groups: [[7,24],[16,25]],totalDataCodewords: 568,errorCodewordsPerBlock: 30 },H: { groups: [[34,13]],totalDataCodewords: 442,errorCodewordsPerBlock: 24 } },{ L: { groups: [[4,121],[5,122]],totalDataCodewords: 1094,errorCodewordsPerBlock: 30 },M: { groups: [[4,47],[14,48]],totalDataCodewords: 860,errorCodewordsPerBlock: 28 },Q: { groups: [[11,24],[14,25]],totalDataCodewords: 614,errorCodewordsPerBlock: 30 },H: { groups: [[16,15],[14,16]],totalDataCodewords: 464,errorCodewordsPerBlock: 30 } },{ L: { groups: [[6,117],[4,118]],totalDataCodewords: 1174,errorCodewordsPerBlock: 30 },M: { groups: [[6,45],[14,46]],totalDataCodewords: 914,errorCodewordsPerBlock: 28 },Q: { groups: [[11,24],[16,25]],totalDataCodewords: 664,errorCodewordsPerBlock: 30 },H: { groups: [[30,16],[2,17]],totalDataCodewords: 514,errorCodewordsPerBlock: 30 } },{ L: { groups: [[8,106],[4,107]],totalDataCodewords: 1276,errorCodewordsPerBlock: 26 },M: { groups: [[8,47],[13,48]],totalDataCodewords: 1000,errorCodewordsPerBlock: 28 },Q: { groups: [[7,24],[22,25]],totalDataCodewords: 718,errorCodewordsPerBlock: 30 },H: { groups: [[22,15],[13,16]],totalDataCodewords: 538,errorCodewordsPerBlock: 30 } },{ L: { groups: [[10,114],[2,115]],totalDataCodewords: 1370,errorCodewordsPerBlock: 28 },M: { groups: [[19,46],[4,47]],totalDataCodewords: 1062,errorCodewordsPerBlock: 28 },Q: { groups: [[28,22],[6,23]],totalDataCodewords: 754,errorCodewordsPerBlock: 28 },H: { groups: [[33,16],[4,17]],totalDataCodewords: 596,errorCodewordsPerBlock: 30 } },{ L: { groups: [[8,122],[4,123]],totalDataCodewords: 1468,errorCodewordsPerBlock: 30 },M: { groups: [[22,45],[3,46]],totalDataCodewords: 1128,errorCodewordsPerBlock: 28 },Q: { groups: [[8,23],[26,24]],totalDataCodewords: 808,errorCodewordsPerBlock: 30 },H: { groups: [[12,15],[28,16]],totalDataCodewords: 628,errorCodewordsPerBlock: 30 } },{ L: { groups: [[3,117],[10,118]],totalDataCodewords: 1531,errorCodewordsPerBlock: 30 },M: { groups: [[3,45],[23,46]],totalDataCodewords: 1193,errorCodewordsPerBlock: 28 },Q: { groups: [[4,24],[31,25]],totalDataCodewords: 871,errorCodewordsPerBlock: 30 },H: { groups: [[11,15],[31,16]],totalDataCodewords: 661,errorCodewordsPerBlock: 30 } },{ L: { groups: [[7,116],[7,117]],totalDataCodewords: 1631,errorCodewordsPerBlock: 30 },M: { groups: [[21,45],[7,46]],totalDataCodewords: 1267,errorCodewordsPerBlock: 28 },Q: { groups: [[1,23],[37,24]],totalDataCodewords: 911,errorCodewordsPerBlock: 30 },H: { groups: [[19,15],[26,16]],totalDataCodewords: 701,errorCodewordsPerBlock: 30 } },{ L: { groups: [[5,115],[10,116]],totalDataCodewords: 1735,errorCodewordsPerBlock: 30 },M: { groups: [[19,47],[10,48]],totalDataCodewords: 1373,errorCodewordsPerBlock: 28 },Q: { groups: [[15,24],[25,25]],totalDataCodewords: 985,errorCodewordsPerBlock: 30 },H: { groups: [[23,15],[25,16]],totalDataCodewords: 745,errorCodewordsPerBlock: 30 } },{ L: { groups: [[13,115],[3,116]],totalDataCodewords: 1843,errorCodewordsPerBlock: 30 },M: { groups: [[2,46],[29,47]],totalDataCodewords: 1455,errorCodewordsPerBlock: 28 },Q: { groups: [[42,24],[1,25]],totalDataCodewords: 1033,errorCodewordsPerBlock: 30 },H: { groups: [[23,15],[28,16]],totalDataCodewords: 793,errorCodewordsPerBlock: 30 } },{ L: { groups: [[17,115]],totalDataCodewords: 1955,errorCodewordsPerBlock: 30 },M: { groups: [[10,46],[23,47]],totalDataCodewords: 1541,errorCodewordsPerBlock: 28 },Q: { groups: [[10,24],[35,25]],totalDataCodewords: 1115,errorCodewordsPerBlock: 30 },H: { groups: [[19,15],[35,16]],totalDataCodewords: 845,errorCodewordsPerBlock: 30 } },{ L: { groups: [[17,115],[1,116]],totalDataCodewords: 2071,errorCodewordsPerBlock: 30 },M: { groups: [[14,46],[21,47]],totalDataCodewords: 1631,errorCodewordsPerBlock: 28 },Q: { groups: [[29,24],[19,25]],totalDataCodewords: 1171,errorCodewordsPerBlock: 30 },H: { groups: [[11,15],[46,16]],totalDataCodewords: 901,errorCodewordsPerBlock: 30 } },{ L: { groups: [[13,115],[6,116]],totalDataCodewords: 2191,errorCodewordsPerBlock: 30 },M: { groups: [[14,46],[23,47]],totalDataCodewords: 1725,errorCodewordsPerBlock: 28 },Q: { groups: [[44,24],[7,25]],totalDataCodewords: 1231,errorCodewordsPerBlock: 30 },H: { groups: [[59,16],[1,17]],totalDataCodewords: 961,errorCodewordsPerBlock: 30 } },{ L: { groups: [[12,121],[7,122]],totalDataCodewords: 2306,errorCodewordsPerBlock: 30 },M: { groups: [[12,47],[26,48]],totalDataCodewords: 1812,errorCodewordsPerBlock: 28 },Q: { groups: [[39,24],[14,25]],totalDataCodewords: 1286,errorCodewordsPerBlock: 30 },H: { groups: [[22,15],[41,16]],totalDataCodewords: 986,errorCodewordsPerBlock: 30 } },{ L: { groups: [[6,121],[14,122]],totalDataCodewords: 2434,errorCodewordsPerBlock: 30 },M: { groups: [[6,47],[34,48]],totalDataCodewords: 1914,errorCodewordsPerBlock: 28 },Q: { groups: [[46,24],[10,25]],totalDataCodewords: 1354,errorCodewordsPerBlock: 30 },H: { groups: [[2,15],[64,16]],totalDataCodewords: 1054,errorCodewordsPerBlock: 30 } },{ L: { groups: [[17,122],[4,123]],totalDataCodewords: 2566,errorCodewordsPerBlock: 30 },M: { groups: [[29,46],[14,47]],totalDataCodewords: 1992,errorCodewordsPerBlock: 28 },Q: { groups: [[49,24],[10,25]],totalDataCodewords: 1426,errorCodewordsPerBlock: 30 },H: { groups: [[24,15],[46,16]],totalDataCodewords: 1096,errorCodewordsPerBlock: 30 } },{ L: { groups: [[4,122],[18,123]],totalDataCodewords: 2702,errorCodewordsPerBlock: 30 },M: { groups: [[13,46],[32,47]],totalDataCodewords: 2102,errorCodewordsPerBlock: 28 },Q: { groups: [[48,24],[14,25]],totalDataCodewords: 1502,errorCodewordsPerBlock: 30 },H: { groups: [[42,15],[32,16]],totalDataCodewords: 1142,errorCodewordsPerBlock: 30 } },{ L: { groups: [[20,117],[4,118]],totalDataCodewords: 2812,errorCodewordsPerBlock: 30 },M: { groups: [[40,47],[7,48]],totalDataCodewords: 2216,errorCodewordsPerBlock: 28 },Q: { groups: [[43,24],[22,25]],totalDataCodewords: 1582,errorCodewordsPerBlock: 30 },H: { groups: [[10,15],[67,16]],totalDataCodewords: 1222,errorCodewordsPerBlock: 30 } },{ L: { groups: [[19,118],[6,119]],totalDataCodewords: 2956,errorCodewordsPerBlock: 30 },M: { groups: [[18,47],[31,48]],totalDataCodewords: 2334,errorCodewordsPerBlock: 28 },Q: { groups: [[34,24],[34,25]],totalDataCodewords: 1666,errorCodewordsPerBlock: 30 },H: { groups: [[20,15],[61,16]],totalDataCodewords: 1276,errorCodewordsPerBlock: 30 } }], finderPattern = [1,0,1,1,1], alignmentPattern = [1,0,1], errorCorrectionPatterns = { L: "01", M: "00", Q: "11", H: "10" }, formatMaskPattern = "101010000010010", formatGeneratorPolynomial = "10100110111", versionGeneratorPolynomial = "1111100100101", paddingCodewords = ["11101100", "00010001"], finderPatternValue = 93, maskPatternConditions = [ function(row,column) {return (row + column) % 2 === 0;}, function(row) {return row % 2 === 0;}, function(row,column) {return column % 3 === 0;}, function(row,column) {return (row + column) % 3 === 0;}, function(row,column) {return (Math.floor(row / 2) + Math.floor(column / 3)) % 2 === 0;}, function(row,column) {return ((row * column) % 2) + ((row * column) % 3) === 0;}, function(row,column) {return (((row * column) % 2) + ((row * column) % 3)) % 2 === 0;}, function(row,column) {return (((row + column) % 2) + ((row * column) % 3)) % 2 === 0;} ], numberRegex = /^\d+/, alphaPattern = "A-Z0-9 $%*+./:-", alphaExclusiveSet = "A-Z $%*+./:-", alphaRegex = new RegExp("^[" + alphaExclusiveSet + "]+"), alphaNumericRegex = new RegExp("^[" + alphaPattern + "]+"), byteRegex = new RegExp("^[^" + alphaPattern + "]+"), initMinNumericBeforeAlpha = 8, initMinNumericBeforeByte = 5, initMinAlphaBeforeByte = 8, minNumericBeforeAlpha = 17, minNumericBeforeByte = 9, minAlphaBeforeByte = 16, round = Math.round, IMAGE = "image", SWISS_QR = "swiss", crossPattern = [[0,1],[1,1],[1,2],[2,2],[2,1],[3,1],[3,0],[2,0],[2,-1],[1,-1],[1,0]], squarePattern = [[0,1],[1,1],[1,0]], DEFAULT_LOGO_SIZE = 7; function toDecimal(value) { return parseInt(value, 2); } function toBitsString(value, length) { var result = Number(value).toString(2); if (result.length < length) { result = new Array(length - result.length + 1).join(0) + result; } return result; } function splitInto(str, n) { var result = [], idx = 0; while (idx < str.length) { result.push(str.substring(idx, idx + n)); idx += n; } return result; } var QRDataMode = kendo.Class.extend({ getVersionIndex: function(version) { if (version < 10) { return 0; } else if (version > 26) { return 2; } return 1; }, getBitsCharacterCount: function(version) { var mode = this; return mode.bitsInCharacterCount[mode.getVersionIndex(version || 40)]; }, getModeCountString: function(length, version) { var mode = this; return mode.modeIndicator + toBitsString(length, mode.getBitsCharacterCount(version)); }, encode: function() {}, getStringBitsLength: function() {}, getValue: function() {}, modeIndicator: "", bitsInCharacterCount: [] }); var modes = {}; modes[NUMERIC] = QRDataMode.extend({ bitsInCharacterCount: [10, 12, 14], modeIndicator: "0001", getValue: function(character) { return parseInt(character, 10); }, encode: function(str, version) { var mode = this, parts = splitInto(str, 3), result = mode.getModeCountString(str.length, version); for (var i = 0; i < parts.length - 1; i++) { result += toBitsString(parts[i], 10); } return result + toBitsString(parts[i], 1 + 3 * parts[i].length); }, getStringBitsLength: function(inputLength, version) { var mod3 = inputLength % 3; return 4 + this.getBitsCharacterCount(version) + 10 * Math.floor(inputLength / 3) + 3 * mod3 + (mod3 === 0 ? 0 : 1); } }); modes[ALPHA_NUMERIC] = QRDataMode.extend({ characters: { "0": 0,"1": 1,"2": 2,"3": 3,"4": 4,"5": 5,"6": 6,"7": 7,"8": 8,"9": 9,"A": 10,"B": 11,"C": 12,"D": 13,"E": 14,"F": 15,"G": 16,"H": 17,"I": 18,"J": 19,"K": 20,"L": 21,"M": 22,"N": 23,"O": 24,"P": 25,"Q": 26,"R": 27,"S": 28,"T": 29,"U": 30,"V": 31,"W": 32,"X": 33,"Y": 34,"Z": 35," ": 36,"$": 37,"%": 38,"*": 39,"+": 40,"-": 41,".": 42,"/": 43,":": 44 }, bitsInCharacterCount: [9,11,13], modeIndicator: "0010", getValue: function(character) { return this.characters[character]; }, encode: function(str, version) { var mode = this, parts = splitInto(str, 2), result = mode.getModeCountString(str.length, version), value; for (var i = 0; i < parts.length - 1; i++) { value = 45 * mode.getValue(parts[i].charAt(0)) + mode.getValue(parts[i].charAt(1)); result += toBitsString(value, 11); } value = parts[i].length == 2 ? 45 * mode.getValue(parts[i].charAt(0)) + mode.getValue(parts[i].charAt(1)) : mode.getValue(parts[i].charAt(0)); return result + toBitsString(value, 1 + 5 * parts[i].length); }, getStringBitsLength: function(inputLength, version) { return 4 + this.getBitsCharacterCount(version) + 11 * Math.floor(inputLength / 2) + 6 * (inputLength % 2); } }); modes[BYTE] = QRDataMode.extend({ bitsInCharacterCount: [8,16,16], modeIndicator: "0100", getValue: function(character) { var code = character.charCodeAt(0); if (code <= 127 || (160 <= code && code <= 255)) { return code; } else { throw new Error("Unsupported character: " + character); } }, encode: function(str, version) { var mode = this, result = mode.getModeCountString(str.length, version); for (var i = 0; i < str.length; i++) { result += toBitsString(mode.getValue(str.charAt(i)), 8); } return result; }, getStringBitsLength: function(inputLength, version) { return 4 + this.getBitsCharacterCount(version) + 8 * inputLength; } }); var modeInstances = {}; for (var mode in modes) { modeInstances[mode] = new modes[mode](); } var FreeCellVisitor = function(matrix) { var that = this, row = matrix.length - 1, column = matrix.length - 1, startColumn = column, dir = -1, c = 0; that.move = function() { row += dir * c; c ^= 1; column = startColumn - c; }; that.getNextCell = function() { while (matrix[row][column] !== undefined$1) { that.move(); if (row < 0 || row >= matrix.length) { dir = -dir; startColumn -= startColumn != 8 ? 2 : 3; column = startColumn; row = dir < 0 ? matrix.length - 1 : 0; } } return { row: row, column: column }; }; that.getNextRemainderCell = function() { that.move(); if (matrix[row][column] === undefined$1) { return { row: row, column: column }; } }; }; function fillFunctionCell(matrices, bit, x, y) { for (var i = 0; i < matrices.length; i++) { matrices[i][x][y] = bit; } } function fillDataCell(matrices, bit, x, y) { for (var i = 0; i < maskPatternConditions.length; i++) { matrices[i][x][y] = maskPatternConditions[i](x,y) ? bit ^ 1 : parseInt(bit, 10); } } var fillData = function(matrices, blocks) { var cellVisitor = new FreeCellVisitor(matrices[0]), block, codewordIdx, cell; for (var blockIdx = 0; blockIdx < blocks.length; blockIdx++) { block = blocks[blockIdx]; codewordIdx = 0; while (block.length > 0) { for (var i = 0; i < block.length; i++) { for (var j = 0; j < 8; j++) { cell = cellVisitor.getNextCell(); fillDataCell(matrices, block[i][codewordIdx].charAt(j), cell.row, cell.column); } } codewordIdx++; while (block[0] && codewordIdx == block[0].length) { block.splice(0,1); } } } while ((cell = cellVisitor.getNextRemainderCell())) { fillDataCell(matrices, 0, cell.row, cell.column); } }; var padDataString = function(dataString, totalDataCodewords) { var dataBitsCount = totalDataCodewords * 8, terminatorIndex = 0, paddingCodewordIndex = 0; while (dataString.length < dataBitsCount && terminatorIndex < terminator.length) { dataString += terminator.charAt(terminatorIndex++); } if (dataString.length % 8 !== 0) { dataString += new Array(9 - dataString.length % 8).join("0"); } while (dataString.length < dataBitsCount) { dataString += paddingCodewords[paddingCodewordIndex]; paddingCodewordIndex ^= 1; } return dataString; }; function generatePowersOfTwo() { var result; for (var power = 1; power < 255; power++) { result = powersOfTwoResult[power - 1] * 2; if (result > 255) { result = result ^ 285; } powersOfTwoResult[power] = result; powersOfTwo[result] = power; } result = (powersOfTwoResult[power - 1] * 2) ^ 285; powersOfTwoResult[power] = result; powersOfTwoResult[-1] = 0; } var xorPolynomials = function(x,y) { var result = [], idx = x.length - 2; for (var i = idx; i >= 0; i--) { result[i] = x[i] ^ y[i]; } return result; }; var multiplyPolynomials = function(x, y) { var result = []; for (var i = 0; i < x.length; i++) { for (var j = 0; j < y.length; j++) { if (result[i + j] === undefined$1) { result[i + j] = (x[i] + (y[j] >= 0 ? y[j] : 0)) % 255; } else { result[i + j] = powersOfTwo[powersOfTwoResult[result[i + j]] ^ powersOfTwoResult[(x[i] + y[j]) % 255]]; } } } return result; }; function generateGeneratorPolynomials() { var maxErrorCorrectionCodeWordsCount = 68; for (var idx = 2; idx <= maxErrorCorrectionCodeWordsCount; idx++) { var firstPolynomial = generatorPolynomials[idx - 1], secondPolynomial = [idx, 0]; generatorPolynomials[idx] = multiplyPolynomials(firstPolynomial, secondPolynomial); } } //possibly generate on demand generatePowersOfTwo(); generateGeneratorPolynomials(); function multiplyByConstant(polynomial, power) { var result = [], idx = polynomial.length - 1; do { result[idx] = powersOfTwoResult[(polynomial[idx] + power) % 255]; idx--; } while (polynomial[idx] !== undefined$1); return result; } var generateErrorCodewords = function(data, errorCodewordsCount) { var generator = generatorPolynomials[errorCodewordsCount - 1], result = new Array(errorCodewordsCount).concat(data), generatorPolynomial = new Array(result.length - generator.length).concat(generator), steps = data.length, errorCodewords = [], divisor, idx; for (idx = 0; idx < steps; idx++) { divisor = multiplyByConstant(generatorPolynomial, powersOfTwo[result[result.length - 1]]); generatorPolynomial.splice(0,1); result = xorPolynomials(divisor, result); } for (idx = result.length - 1; idx >= 0; idx--) { errorCodewords[errorCodewordsCount - 1 - idx] = toBitsString(result[idx], 8); } return errorCodewords; }; var getBlocks = function(dataStream, versionCodewordsInformation) { var codewordStart = 0, dataBlocks = [], errorBlocks = [], dataBlock, versionGroups = versionCodewordsInformation.groups, blockCodewordsCount, groupBlocksCount, messagePolynomial, codeword; for (var groupIdx = 0; groupIdx < versionGroups.length; groupIdx++) { groupBlocksCount = versionGroups[groupIdx][0]; for (var blockIdx = 0; blockIdx < groupBlocksCount; blockIdx++) { blockCodewordsCount = versionGroups[groupIdx][1]; dataBlock = []; messagePolynomial = []; for (var codewordIdx = 1; codewordIdx <= blockCodewordsCount; codewordIdx++) { codeword = dataStream.substring(codewordStart, codewordStart + 8); dataBlock.push(codeword); messagePolynomial[blockCodewordsCount - codewordIdx] = toDecimal(codeword); codewordStart += 8; } dataBlocks.push(dataBlock); errorBlocks.push(generateErrorCodewords(messagePolynomial, versionCodewordsInformation.errorCodewordsPerBlock)); } } return [dataBlocks, errorBlocks]; }; var chooseMode = function(str, minNumericBeforeAlpha, minNumericBeforeByte, minAlphaBeforeByte, previousMode) { var numeric = numberRegex.exec(str), numericMatch = numeric ? numeric[0] : "", alpha = alphaRegex.exec(str), alphaMatch = alpha ? alpha[0] : "", alphaNumeric = alphaNumericRegex.exec(str), alphaNumericMatch = alphaNumeric ? alphaNumeric[0] : "", mode, modeString; if (numericMatch && (numericMatch.length >= minNumericBeforeAlpha || str.length == numericMatch.length || (numericMatch.length >= minNumericBeforeByte && !alphaNumericRegex.test(str.charAt(numericMatch.length))))) { mode = NUMERIC; modeString = numericMatch; } else if (alphaNumericMatch && (str.length == alphaNumericMatch.length || alphaNumericMatch.length >= minAlphaBeforeByte || previousMode == ALPHA_NUMERIC)) { mode = ALPHA_NUMERIC; modeString = numericMatch || alphaMatch; } else { mode = BYTE; if (alphaNumericMatch) { modeString = alphaNumericMatch + byteRegex.exec(str.substring(alphaNumericMatch.length))[0]; } else { modeString = byteRegex.exec(str)[0]; } } return { mode: mode, modeString: modeString }; }; var getModes = function(str) { var modes = [], previousMode, idx = 0; modes.push(chooseMode(str, initMinNumericBeforeAlpha, initMinNumericBeforeByte, initMinAlphaBeforeByte, previousMode)); previousMode = modes[0].mode; str = str.substr(modes[0].modeString.length); while (str.length > 0) { var nextMode = chooseMode(str, minNumericBeforeAlpha, minNumericBeforeByte, minAlphaBeforeByte, previousMode); if (nextMode.mode != previousMode) { previousMode = nextMode.mode; modes.push(nextMode); idx++; } else { modes[idx].modeString += nextMode.modeString; } str = str.substr(nextMode.modeString.length); } return modes; }; var getDataCodewordsCount = function(modes) { var length = 0, mode; for (var i = 0; i < modes.length; i++) { mode = modeInstances[modes[i].mode]; length += mode.getStringBitsLength(modes[i].modeString.length); } return Math.ceil(length / 8); }; var getVersion = function(dataCodewordsCount, errorCorrectionLevel) { var x = 0, y = versionsCodewordsInformation.length - 1, version = Math.floor(versionsCodewordsInformation.length / 2); do { if (dataCodewordsCount < versionsCodewordsInformation[version][errorCorrectionLevel].totalDataCodewords) { y = version; } else { x = version; } version = x + Math.floor((y - x) / 2); } while (y - x > 1); if (dataCodewordsCount <= versionsCodewordsInformation[x][errorCorrectionLevel].totalDataCodewords) { return version + 1; } return y + 1; }; var getDataString = function(modes, version) { var dataString = "", mode; for (var i = 0; i < modes.length; i++) { mode = modeInstances[modes[i].mode]; dataString += mode.encode(modes[i].modeString, version); } return dataString; }; //fix case all zeros var encodeFormatInformation = function(format) { var formatNumber = toDecimal(format), encodedString, result = ""; if (formatNumber === 0) { return "101010000010010"; } else { encodedString = encodeBCH(toDecimal(format), formatGeneratorPolynomial, 15); } for (var i = 0; i < encodedString.length; i++) { result += encodedString.charAt(i) ^ formatMaskPattern.charAt(i); } return result; }; var encodeBCH = function(value, generatorPolynomial, codeLength) { var generatorNumber = toDecimal(generatorPolynomial), polynomialLength = generatorPolynomial.length - 1, valueNumber = value << polynomialLength, length = codeLength - polynomialLength, valueString = toBitsString(value, length), result = dividePolynomials(valueNumber, generatorNumber); result = valueString + toBitsString(result, polynomialLength); return result; }; var dividePolynomials = function(numberX,numberY) { var yLength = numberY.toString(2).length, xLength = numberX.toString(2).length; do { numberX ^= numberY << xLength - yLength; xLength = numberX.toString(2).length; } while (xLength >= yLength); return numberX; }; function getNumberAt(str, idx) { return parseInt(str.charAt(idx), 10); } var initMatrices = function(version) { var matrices = [], modules = 17 + 4 * version; for (var i = 0; i < maskPatternConditions.length; i++) { matrices[i] = new Array(modules); for (var j = 0; j < modules; j++) { matrices[i][j] = new Array(modules); } } return matrices; }; var addFormatInformation = function(matrices, formatString) { var matrix = matrices[0], x, y, idx = 0, length = formatString.length; for (x = 0, y = 8; x <= 8; x++) { if (x !== 6) { fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y); } } for (x = 8, y = 7; y >= 0; y--) { if (y !== 6) { fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y); } } idx = 0; for (y = matrix.length - 1, x = 8; y >= matrix.length - 8; y--) { fillFunctionCell(matrices,getNumberAt(formatString, length - 1 - idx++), x, y); } fillFunctionCell(matrices, 1, matrix.length - 8, 8); for (x = matrix.length - 7, y = 8; x < matrix.length; x++) { fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y); } }; var encodeVersionInformation = function(version) { return encodeBCH(version, versionGeneratorPolynomial, 18); }; var addVersionInformation = function(matrices, dataString) { var matrix = matrices[0], modules = matrix.length, x1 = 0, y1 = modules - 11, x2 = modules - 11, y2 = 0, quotient, mod, value; for (var idx = 0; idx < dataString.length; idx++) { quotient = Math.floor(idx / 3); mod = idx % 3; value = getNumberAt(dataString, dataString.length - idx - 1); fillFunctionCell(matrices, value, x1 + quotient, y1 + mod); fillFunctionCell(matrices, value, x2 + mod, y2 + quotient); } }; var addCentricPattern = function(matrices, pattern, x, y) { var size = pattern.length + 2, length = pattern.length + 1, value; for (var i = 0; i < pattern.length; i++) { for (var j = i; j < size - i; j++) { value = pattern[i]; fillFunctionCell(matrices, value, x + j, y + i); fillFunctionCell(matrices, value, x + i, y + j); fillFunctionCell(matrices, value, x + length - j, y + length - i); fillFunctionCell(matrices, value, x + length - i, y + length - j); } } }; var addFinderSeparator = function(matrices, direction, x, y) { var nextX = x, nextY = y, matrix = matrices[0]; do { fillFunctionCell(matrices, 0, nextX, y); fillFunctionCell(matrices, 0, x, nextY); nextX += direction[0]; nextY += direction[1]; } while (nextX >= 0 && nextX < matrix.length); }; var addFinderPatterns = function(matrices) { var modules = matrices[0].length; addCentricPattern(matrices, finderPattern, 0, 0); addFinderSeparator(matrices, [-1,-1], 7,7); addCentricPattern(matrices, finderPattern, modules - 7, 0); addFinderSeparator(matrices, [1,-1], modules - 8, 7); addCentricPattern(matrices, finderPattern, 0 , modules - 7); addFinderSeparator(matrices, [-1,1],7, modules - 8); }; var addAlignmentPatterns = function(matrices, version) { if (version < 2) { return; } var matrix = matrices[0], modules = matrix.length, pointsCount = Math.floor(version / 7), points = [6], startDistance, distance, idx = 0; if ((startDistance = irregularAlignmentPatternsStartDistance[version])) { distance = (modules - 13 - startDistance) / pointsCount; } else { startDistance = distance = (modules - 13) / (pointsCount + 1); } points.push(points[idx++] + startDistance); while ((points[idx] + distance) < modules) { points.push(points[idx++] + distance); } for (var i = 0; i < points.length; i++) { for (var j = 0; j < points.length; j++) { if (matrix[points[i]][points[j]] === undefined$1) { addCentricPattern(matrices, alignmentPattern, points[i] - 2, points[j] - 2); } } } }; var addTimingFunctions = function(matrices) { var row = 6, column = 6, value = 1, modules = matrices[0].length; for (var i = 8; i < modules - 8; i++) { fillFunctionCell(matrices, value, row, i); fillFunctionCell(matrices, value, i, column); value ^= 1; } }; var scoreMaskMatrixes = function(matrices) { var scores = [], previousBits = [], darkModules = [], patterns = [], adjacentSameBits = [], matrix, i, row = 0, column = 1, modules = matrices[0].length; for (i = 0; i < matrices.length; i++) { scores[i] = 0; darkModules[i] = 0; adjacentSameBits[i] = [0,0]; patterns[i] = [0, 0]; previousBits[i] = []; } for (i = 0; i < modules; i++) { for (var j = 0; j < modules; j++) { for (var k = 0; k < matrices.length; k++) { matrix = matrices[k]; darkModules[k] += parseInt(matrix[i][j], 10); if (previousBits[k][row] === matrix[i][j] && i + 1 < modules && j - 1 >= 0 && matrix[i + 1][j] == previousBits[k][row] && matrix[i + 1][j - 1] == previousBits[k][row]) { scores[k] += 3; } scoreFinderPatternOccurance(k, patterns, scores, row, matrix[i][j]); scoreFinderPatternOccurance(k, patterns, scores, column, matrix[j][i]); scoreAdjacentSameBits(k,scores,previousBits,matrix[i][j],adjacentSameBits,row); scoreAdjacentSameBits(k,scores,previousBits,matrix[j][i],adjacentSameBits,column); } } } var total = modules * modules, minIdx, min = Number.MAX_VALUE; for (i = 0; i < scores.length; i++) { scores[i] += calculateDarkModulesRatioScore(darkModules[i], total); if (scores[i] < min) { min = scores[i]; minIdx = i; } } return minIdx; }; function scoreFinderPatternOccurance(idx, patterns, scores, rowColumn, bit) { patterns[idx][rowColumn] = ((patterns[idx][rowColumn] << 1) ^ bit) % 128; if (patterns[idx][rowColumn] == finderPatternValue) { scores[idx] += 40; } } function scoreAdjacentSameBits(idx, scores, previousBits, bit, adjacentBits, rowColumn) { if (previousBits[idx][rowColumn] == bit) { adjacentBits[idx][rowColumn]++; } else { previousBits[idx][rowColumn] = bit; if (adjacentBits[idx][rowColumn] >= 5) { scores[idx] += 3 + adjacentBits[idx][rowColumn] - 5; } adjacentBits[idx][rowColumn] = 1; } } function calculateDarkModulesRatioScore(darkModules, total) { var percent = Math.floor((darkModules / total) * 100), mod5 = percent % 5, previous = Math.abs(percent - mod5 - 50), next = Math.abs(percent + 5 - mod5 - 50), score = 10 * Math.min(previous / 5, next / 5); return score; } var EncodingResult = function(dataString, version) { this.dataString = dataString; this.version = version; }; var IsoEncoder = function() { this.getEncodingResult = function(inputString, errorCorrectionLevel) { var modes = getModes(inputString), dataCodewordsCount = getDataCodewordsCount(modes), version = getVersion(dataCodewordsCount, errorCorrectionLevel), dataString = getDataString(modes, version); return new EncodingResult(dataString, version); }; }; var UTF8Encoder = function() { this.mode = modeInstances[this.encodingMode]; }; UTF8Encoder.fn = UTF8Encoder.prototype = { encodingMode: BYTE, utfBOM: "111011111011101110111111", initialModeCountStringLength: 20, getEncodingResult: function(inputString, errorCorrectionLevel) { var that = this, data = that.encode(inputString), dataCodewordsCount = that.getDataCodewordsCount(data), version = getVersion(dataCodewordsCount, errorCorrectionLevel), dataString = that.mode.getModeCountString(data.length / 8, version) + data; return new EncodingResult(dataString, version); }, getDataCodewordsCount: function(data) { var that = this, dataLength = data.length, dataCodewordsCount = Math.ceil(( that.initialModeCountStringLength + dataLength) / 8); return dataCodewordsCount; }, encode: function(str) { var that = this, result = that.utfBOM; for (var i = 0; i < str.length; i++) { result += that.encodeCharacter(str.charCodeAt(i)); } return result; }, encodeCharacter: function(code) { var bytesCount = this.getBytesCount(code), bc = bytesCount - 1, result = ""; if (bytesCount == 1) { result = toBitsString(code, 8); } else { var significantOnes = 8 - bytesCount; for (var i = 0; i < bc; i++) { result = toBitsString(code >> (i * 6) & 63 | 128, 8) + result; } result = ((code >> bc * 6) | ((255 >> significantOnes) << significantOnes)).toString(2) + result; } return result; }, getBytesCount: function(code) { var ranges = this.ranges; for (var i = 0; i < ranges.length; i++) { if (code < ranges[i]) { return i + 1; } } }, ranges: [128,2048,65536,2097152,67108864] }; var QRCodeDataEncoder = function(encoding) { if (encoding && encoding.toLowerCase().indexOf("utf_8") >= 0) { return new UTF8Encoder(); } else { return new IsoEncoder(); } }; var encodeData = function(inputString, errorCorrectionLevel, encoding) { var encoder = new QRCodeDataEncoder(encoding), encodingResult = encoder.getEncodingResult(inputString, errorCorrectionLevel), version = encodingResult.version, versionInformation = versionsCodewordsInformation[version - 1][errorCorrectionLevel], dataString = padDataString(encodingResult.dataString, versionInformation.totalDataCodewords), blocks = getBlocks(dataString, versionInformation), matrices = initMatrices(version); addFinderPatterns(matrices); addAlignmentPatterns(matrices, version); addTimingFunctions(matrices); if (version >= 7) { addVersionInformation(matrices, toBitsString(0, 18)); } addFormatInformation(matrices, toBitsString(0, 15)); fillData(matrices, blocks); var minIdx = scoreMaskMatrixes(matrices), optimalMatrix = matrices[minIdx]; if (version >= 7) { addVersionInformation([optimalMatrix], encodeVersionInformation(version)); } var formatString = errorCorrectionPatterns[errorCorrectionLevel] + toBitsString(minIdx, 3); addFormatInformation([optimalMatrix], encodeFormatInformation(formatString)); return optimalMatrix; }; var QRCodeDefaults = { DEFAULT_SIZE: 200, QUIET_ZONE_LENGTH: 4, DEFAULT_ERROR_CORRECTION_LEVEL: "L", DEFAULT_BACKGROUND: "#fff", DEFAULT_DARK_MODULE_COLOR: "#000", MIN_BASE_UNIT_SIZE: 1 }; var QRCode = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); that.element = $(element); that.wrapper = that.element; that.element.addClass("k-qrcode"); that.surfaceWrap = $("<div />").css("position", "relative").appendTo(this.element); that.surface = Surface.create(that.surfaceWrap[0], { type: th