UNPKG

@progress/kendo-ui

Version:

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

969 lines (837 loc) 59.7 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(1104); /***/ }), /***/ 3: /***/ (function(module, exports) { module.exports = function() { throw new Error("define cannot be used indirect"); }; /***/ }), /***/ 1002: /***/ (function(module, exports) { module.exports = require("./kendo.drawing"); /***/ }), /***/ 1062: /***/ (function(module, exports) { module.exports = require("./kendo.dataviz.core"); /***/ }), /***/ 1104: /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1062), __webpack_require__(1002) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); })(function(){ var __meta__ = { // jshint ignore:line id: "dataviz.qrcode", name: "QRCode", category: "dataviz", description: "QRCode widget.", depends: [ "dataviz.core", "drawing" ] }; (function ($, undefined) { var kendo = window.kendo, extend = $.extend, draw = kendo.drawing, dataviz = kendo.dataviz, Widget = kendo.ui.Widget, Box2D = dataviz.Box2D, 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; 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){ 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){ 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){ 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); 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){ 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),