JAVASCRIPT   96

qrcode.js

Guest on 31st July 2021 07:18:17 AM

  1. /*from tccdn minify ,file嚗�/cn/c/c/qrcode.js*/j/**
  2.  * @fileoverview
  3.  * - Using the 'QRCode for Javascript library'
  4.  * - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
  5.  * - this library has no dependencies.
  6.  *
  7.  * @author davidshimjs
  8.  * @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
  9.  * @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
  10.  */
  11.  */
  12. var QRCode;
  13.  
  14. (function ()//---------------------------------------------------------------------
  15. -// QRCode for JavaScript
  16. i//
  17.         // Copyright (c)  Kazuhiko Arase
  18. a//
  19.         // URL: http://www.d-project.com/
  20. o//
  21.         // Licensed under the MIT license:
  22. s//   http://www.opensource.org/licenses/mit-license.php
  23. p//
  24.         // The word "QR Code" is registered trademark of
  25. o// DENSO WAVE INCORPORATED
  26. T//   http://www.denso-wave.com/qrcode/faqpatent-e.html
  27. t//
  28.         //---------------------------------------------------------------------
  29. ---
  30.         function QR8bitByte(data) {
  31.                 this.mode = QRMode.MODE_8BIT_BYTE;
  32.                 this.data = data;
  33.                 this.parsedData = [];// Added to support UTF-8 Characters
  34. ers
  35.                 for (var i = 0, l = this.data.length; i < l; i++) {
  36.                         var byteArray = [];
  37.                         var code = this.data.charCodeAt(i);
  38.  
  39.                         if (code > 0x10000) {
  40.                                 byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
  41.                                 byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
  42.                                 byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
  43.                                 byteArray[3] = 0x80 | (code & 0x3F);
  44.                         } else if (code > 0x800) {
  45.                                 byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
  46.                                 byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
  47.                                 byteArray[2] = 0x80 | (code & 0x3F);
  48.                         } else if (code > 0x80) {
  49.                                 byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
  50.                                 byteArray[1] = 0x80 | (code & 0x3F);
  51.                         } else {
  52.                                 byteArray[0] = code;
  53.                         }
  54.  
  55.                         this.parsedData.push(byteArray);
  56.                 }
  57.  
  58.                 this.parsedData = Array.prototype.concat.apply([], this.parsedData);
  59.  
  60.                 if (this.parsedData.length != this.data.length) {
  61.                         this.parsedData.unshift(191);
  62.                         this.parsedData.unshift(187);
  63.                         this.parsedData.unshift(239);
  64.                 }
  65.         }
  66.  
  67.         QR8bitByte.prototype = {
  68.                 getLength: function (buffer) {
  69.                         return this.parsedData.length;
  70.                 },
  71.                 write: function (buffer) {
  72.                         for (var i = 0, l = this.parsedData.length; i < l; i++) {
  73.                                 buffer.put(this.parsedData[i], 8);
  74.                         }
  75.                 }
  76.         };
  77.  
  78.         function QRCodeModel(typeNumber, errorCorrectLevel) {
  79.                 this.typeNumber = typeNumber;
  80.                 this.errorCorrectLevel = errorCorrectLevel;
  81.                 this.modules = null;
  82.                 this.moduleCount = 0;
  83.                 this.dataCache = null;
  84.                 this.dataList = [];
  85.         }
  86.  
  87. function QRPolynomial(num, shift) {
  88.     if (num.length == undefined) throw new Error(num.length + "/" + shift);
  89.     var offset = 0;
  90.     while (offset < num.length && num[offset] == 0) offset++;
  91.     this.num = new Array(num.length - offset + shift);
  92.     for (var i = 0; i < num.length - offset; i++) this.num[i] = num[i + offset];
  93. }
  94.  
  95. function QRRSBlock(totalCount, dataCount) {
  96.     this.totalCount = totalCount, this.dataCount = dataCount;
  97. }
  98.  
  99. function QRBitBuffer() {
  100.     this.buffer = [], this.length = 0;
  101. }
  102.  
  103.         QRCodeModel.prototype = {
  104.             "addData": function(data) {
  105.                 var newData = new QR8bitByte(data);
  106.                 this.dataList.push(newData), this.dataCache = null;
  107.             },
  108.             "isDark": function(row, col) {
  109.                 if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) throw new Error(row + "," + col);
  110.                 return this.modules[row][col];
  111.             },
  112.             "getModuleCount": function() {
  113.                 return this.moduleCount;
  114.             },
  115.             "make": function() {
  116.                 this.makeImpl(!1, this.getBestMaskPattern());
  117.             },
  118.             "makeImpl": function(test, maskPattern) {
  119.                 this.moduleCount = this.typeNumber * 4 + 17, this.modules = new Array(this.moduleCount);
  120.                 for (var row = 0; row < this.moduleCount; row++) {
  121.                     this.modules[row] = new Array(this.moduleCount);
  122.                     for (var col = 0; col < this.moduleCount; col++) this.modules[row][col] = null;
  123.                 }
  124.                 this.setupPositionProbePattern(0, 0),
  125.                 this.setupPositionProbePattern(this.moduleCount - 7, 0),
  126.                 this.setupPositionProbePattern(0, this.moduleCount - 7),
  127.                 this.setupPositionAdjustPattern(), this.setupTimingPattern(),
  128.                 this.setupTypeInfo(test, maskPattern),
  129.                 this.typeNumber >= 7 && this.setupTypeNumber(test),
  130.                 this.dataCache == null && (this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)), this.mapData(this.dataCache, maskPattern);
  131.             },
  132.             "setupPositionProbePattern": function(row, col) {
  133.                 for (var r = -1; r <= 7; r++) {
  134.                     if (row + r <= -1 || this.moduleCount <= row + r) continue;
  135.                     for (var c = -1; c <= 7; c++) {
  136.                         if (col + c <= -1 || this.moduleCount <= col + c) continue;
  137.                         0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4 ? this.modules[row + r][col + c] = !0 : this.modules[row + r][col + c] = !1;
  138.                     }
  139.                 }
  140.             },
  141.             "getBestMaskPattern": function() {
  142.                 var minLostPoint = 0, pattern = 0;
  143.                 for (var i = 0; i < 8; i++) {
  144.                     this.makeImpl(!0, i);
  145.                     var lostPoint = QRUtil.getLostPoint(this);
  146.                     if (i == 0 || minLostPoint > lostPoint) minLostPoint = lostPoint, pattern = i;
  147.                 }
  148.                 return pattern;
  149.             },
  150.             "createMovieClip": function(target_mc, instance_name, depth) {
  151.                 var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth), cs = 1;
  152.                 this.make();
  153.                 for (var row = 0; row < this.modules.length; row++) {
  154.                     var y = row * cs;
  155.                     for (var col = 0; col < this.modules[row].length; col++) {
  156.                         var x = col * cs, dark = this.modules[row][col];
  157.                         dark && (qr_mc.beginFill(0, 100), qr_mc.moveTo(x, y), qr_mc.lineTo(x + cs, y), qr_mc.lineTo(x + cs, y + cs), qr_mc.lineTo(x, y + cs), qr_mc.endFill());
  158.                     }
  159.                 }
  160.                 return qr_mc;
  161.             },
  162.             "setupTimingPattern": function() {
  163.                 for (var r = 8; r < this.moduleCount - 8; r++) {
  164.                     if (this.modules[r][6] != null) continue;
  165.                     this.modules[r][6] = r % 2 == 0;
  166.                 }
  167.                 for (var c = 8; c < this.moduleCount - 8; c++) {
  168.                     if (this.modules[6][c] != null) continue;
  169.                     this.modules[6][c] = c % 2 == 0;
  170.                 }
  171.             },
  172.             "setupPositionAdjustPattern": function() {
  173.                 var pos = QRUtil.getPatternPosition(this.typeNumber);
  174.                 for (var i = 0; i < pos.length; i++) for (var j = 0; j < pos.length; j++) {
  175.                     var row = pos[i], col = pos[j];
  176.                     if (this.modules[row][col] != null) continue;
  177.                     for (var r = -2; r <= 2; r++) for (var c = -2; c <= 2; c++) r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0 ? this.modules[row + r][col + c] = !0 : this.modules[row + r][col + c] = !1;
  178.                 }
  179.             },
  180.             "setupTypeNumber": function(test) {
  181.                 var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
  182.                 for (var i = 0; i < 18; i++) {
  183.                     var mod = !test && (bits >> i & 1) == 1;
  184.                     this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
  185.                 }
  186.                 for (var i = 0; i < 18; i++) {
  187.                     var mod = !test && (bits >> i & 1) == 1;
  188.                     this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
  189.                 }
  190.             },
  191.             "setupTypeInfo": function(test, maskPattern) {
  192.                 var data = this.errorCorrectLevel << 3 | maskPattern, bits = QRUtil.getBCHTypeInfo(data);
  193.                 for (var i = 0; i < 15; i++) {
  194.                     var mod = !test && (bits >> i & 1) == 1;
  195.                     i < 6 ? this.modules[i][8] = mod : i < 8 ? this.modules[i + 1][8] = mod : this.modules[this.moduleCount - 15 + i][8] = mod;
  196.                 }
  197.                 for (var i = 0; i < 15; i++) {
  198.                     var mod = !test && (bits >> i & 1) == 1;
  199.                     i < 8 ? this.modules[8][this.moduleCount - i - 1] = mod : i < 9 ? this.modules[8][15 - i - 1 + 1] = mod : this.modules[8][15 - i - 1] = mod;
  200.                 }
  201.                 this.modules[this.moduleCount - 8][8] = !test;
  202.             },
  203.             "mapData": function(data, maskPattern) {
  204.                 var inc = -1, row = this.moduleCount - 1, bitIndex = 7, byteIndex = 0;
  205.                 for (var col = this.moduleCount - 1; col > 0; col -= 2) {
  206.                     col == 6 && col--;
  207.                     for (;;) {
  208.                         for (var c = 0; c < 2; c++) if (this.modules[row][col - c] == null) {
  209.                             var dark = !1;
  210.                             byteIndex < data.length && (dark = (data[byteIndex] >>> bitIndex & 1) == 1);
  211.                             var mask = QRUtil.getMask(maskPattern, row, col - c);
  212.                             mask && (dark = !dark), this.modules[row][col - c] = dark, bitIndex--, bitIndex == -1 && (byteIndex++, bitIndex = 7);
  213.                         }
  214.                         row += inc;
  215.                         if (row < 0 || this.moduleCount <= row) {
  216.                             row -= inc, inc = -inc;
  217.                             break;
  218.                         }
  219.                     }
  220.                 }
  221.             }
  222.         }, QRCodeModel.PAD0 = 236, QRCodeModel.PAD1 = 17, QRCodeModel.createData = function(typeNumber, errorCorrectLevel, dataList) {
  223.             var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel), buffer = new QRBitBuffer;
  224.             for (var i = 0; i < dataList.length; i++) {
  225.                 var data = dataList[i];
  226.                 buffer.put(data.mode, 4), buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)), data.write(buffer);
  227.             }
  228.             var totalDataCount = 0;
  229.             for (var i = 0; i < rsBlocks.length; i++) totalDataCount += rsBlocks[i].dataCount;
  230.             if (buffer.getLengthInBits() > totalDataCount * 8) throw new Error("code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")");
  231.             buffer.getLengthInBits() + 4 <= totalDataCount * 8 && buffer.put(0, 4);
  232.             while (buffer.getLengthInBits() % 8 != 0) buffer.putBit(!1);
  233.             for (;;) {
  234.                 if (buffer.getLengthInBits() >= totalDataCount * 8) break;
  235.                 buffer.put(QRCodeModel.PAD0, 8);
  236.                 if (buffer.getLengthInBits() >= totalDataCount * 8) break;
  237.                 buffer.put(QRCodeModel.PAD1, 8);
  238.             }
  239.             return QRCodeModel.createBytes(buffer, rsBlocks);
  240.         }, QRCodeModel.createBytes = function(buffer, rsBlocks) {
  241.             var offset = 0, maxDcCount = 0, maxEcCount = 0, dcdata = new Array(rsBlocks.length), ecdata = new Array(rsBlocks.length);
  242.             for (var r = 0; r < rsBlocks.length; r++) {
  243.                 var dcCount = rsBlocks[r].dataCount, ecCount = rsBlocks[r].totalCount - dcCount;
  244.                 maxDcCount = Math.max(maxDcCount, dcCount), maxEcCount = Math.max(maxEcCount, ecCount), dcdata[r] = new Array(dcCount);
  245.                 for (var i = 0; i < dcdata[r].length; i++) dcdata[r][i] = 255 & buffer.buffer[i + offset];
  246.                 offset += dcCount;
  247.                 var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount), rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1), modPoly = rawPoly.mod(rsPoly);
  248.                 ecdata[r] = new Array(rsPoly.getLength() - 1);
  249.                 for (var i = 0; i < ecdata[r].length; i++) {
  250.                     var modIndex = i + modPoly.getLength() - ecdata[r].length;
  251.                     ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
  252.                 }
  253.             }
  254.             var totalCodeCount = 0;
  255.             for (var i = 0; i < rsBlocks.length; i++) totalCodeCount += rsBlocks[i].totalCount;
  256.             var data = new Array(totalCodeCount), index = 0;
  257.             for (var i = 0; i < maxDcCount; i++) for (var r = 0; r < rsBlocks.length; r++) i < dcdata[r].length && (data[index++] = dcdata[r][i]);
  258.             for (var i = 0; i < maxEcCount; i++) for (var r = 0; r < rsBlocks.length; r++) i < ecdata[r].length && (data[index++] = ecdata[r][i]);
  259.             return data;
  260.         };
  261.  
  262.         var QRMode = {
  263.             "MODE_NUMBER": 1,
  264.             "MODE_ALPHA_NUM": 2,
  265.             "MODE_8BIT_BYTE": 4,
  266.             "MODE_KANJI": 8
  267.         }, QRErrorCorrectLevel = {
  268.             "L": 1,
  269.             "M": 0,
  270.             "Q": 3,
  271.             "H": 2
  272.         }, QRMaskPattern = {
  273.             "PATTERN000": 0,
  274.             "PATTERN001": 1,
  275.             "PATTERN010": 2,
  276.             "PATTERN011": 3,
  277.             "PATTERN100": 4,
  278.             "PATTERN101": 5,
  279.             "PATTERN110": 6,
  280.             "PATTERN111": 7
  281.         }, QRUtil = {
  282.             "PATTERN_POSITION_TABLE": [ [], [ 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 ] ],
  283.             ": 1335,
  284.             "   ": 7973,
  285.             "   "G15_MASK": 21522,
  286.             "getBCHTypeInfo": function(data) {
  287.                 var d = data << 10;
  288.                 while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15);
  289.                 return (data << 10 | d) ^ QRUtil.G15_MASK;
  290.             },
  291.             "getBCHTypeNumber": function(data) {
  292.                 var d = data << 12;
  293.                 while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18);
  294.                 return data << 12 | d;
  295.             },
  296.             "getBCHDigit": function(data) {
  297.                 var digit = 0;
  298.                 while (data != 0) digit++, data >>>= 1;
  299.                 return digit;
  300.             },
  301.             "getPatternPosition": function(typeNumber) {
  302.                 return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
  303.             },
  304.             "getMask": function(maskPattern, i, j) {
  305.                 switch (maskPattern) {
  306.                   case QRMaskPattern.PATTERN000:
  307.                     return (i + j) % 2 == 0;
  308.                   case QRMaskPattern.PATTERN001:
  309.                     return i % 2 == 0;
  310.                   case QRMaskPattern.PATTERN010:
  311.                     return j % 3 == 0;
  312.                   case QRMaskPattern.PATTERN011:
  313.                     return (i + j) % 3 == 0;
  314.                   case QRMaskPattern.PATTERN100:
  315.                     return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
  316.                   case QRMaskPattern.PATTERN101:
  317.                     return i * j % 2 + i * j % 3 == 0;
  318.                   case QRMaskPattern.PATTERN110:
  319.                     return (i * j % 2 + i * j % 3) % 2 == 0;
  320.                   case QRMaskPattern.PATTERN111:
  321.                     return (i * j % 3 + (i + j) % 2) % 2 == 0;
  322.                   default:
  323.                     throw new Error("bad maskPattern:" + maskPattern);
  324.                 }
  325.             },
  326.             "getErrorCorrectPolynomial": function(errorCorrectLength) {
  327.                 var a = new QRPolynomial([ 1 ], 0);
  328.                 for (var i = 0; i < errorCorrectLength; i++) a = a.multiply(new QRPolynomial([ 1, QRMath.gexp(i) ], 0));
  329.                 return a;
  330.             },
  331.             "getLengthInBits": function(mode, type) {
  332.                 if (1 <= type && type < 10) switch (mode) {
  333.                   case QRMode.MODE_NUMBER:
  334.                     return 10;
  335.                   case QRMode.MODE_ALPHA_NUM:
  336.                     return 9;
  337.                   case QRMode.MODE_8BIT_BYTE:
  338.                     return 8;
  339.                   case QRMode.MODE_KANJI:
  340.                     return 8;
  341.                   default:
  342.                     throw new Error("mode:" + mode);
  343.                 } else if (type < 27) switch (mode) {
  344.                   case QRMode.MODE_NUMBER:
  345.                     return 12;
  346.                   case QRMode.MODE_ALPHA_NUM:
  347.                     return 11;
  348.                   case QRMode.MODE_8BIT_BYTE:
  349.                     return 16;
  350.                   case QRMode.MODE_KANJI:
  351.                     return 10;
  352.                   default:
  353.                     throw new Error("mode:" + mode);
  354.                 } else {
  355.                     if (!(type < 41)) throw new Error("type:" + type);
  356.                     switch (mode) {
  357.                       case QRMode.MODE_NUMBER:
  358.                         return 14;
  359.                       case QRMode.MODE_ALPHA_NUM:
  360.                         return 13;
  361.                       case QRMode.MODE_8BIT_BYTE:
  362.                         return 16;
  363.                       case QRMode.MODE_KANJI:
  364.                         return 12;
  365.                       default:
  366.                         throw new Error("mode:" + mode);
  367.                     }
  368.                 }
  369.             },
  370.             "getLostPoint": function(qrCode) {
  371.                 var moduleCount = qrCode.getModuleCount(), lostPoint = 0;
  372.                 for (var row = 0; row < moduleCount; row++) for (var col = 0; col < moduleCount; col++) {
  373.                     var sameCount = 0, dark = qrCode.isDark(row, col);
  374.                     for (var r = -1; r <= 1; r++) {
  375.                         if (row + r < 0 || moduleCount <= row + r) continue;
  376.                         for (var c = -1; c <= 1; c++) {
  377.                             if (col + c < 0 || moduleCount <= col + c) continue;
  378.                             if (r == 0 && c == 0) continue;
  379.                             dark == qrCode.isDark(row + r, col + c) && sameCount++;
  380.                         }
  381.                     }
  382.                     sameCount > 5 && (lostPoint += 3 + sameCount - 5);
  383.                 }
  384.                 for (var row = 0; row < moduleCount - 1; row++) for (var col = 0; col < moduleCount - 1; col++) {
  385.                     var count = 0;
  386.                     qrCode.isDark(row, col) && count++, qrCode.isDark(row + 1, col) && count++, qrCode.isDark(row, col + 1) && count++, qrCode.isDark(row + 1, col + 1) && count++;
  387.                     if (count == 0 || count == 4) lostPoint += 3;
  388.                 }
  389.                 for (var row = 0; row < moduleCount; row++) for (var col = 0; col < moduleCount - 6; col++) qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6) && (lostPoint += 40);
  390.                 for (var col = 0; col < moduleCount; col++) for (var row = 0; row < moduleCount - 6; row++) qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col) && (lostPoint += 40);
  391.                 var darkCount = 0;
  392.                 for (var col = 0; col < moduleCount; col++) for (var row = 0; row < moduleCount; row++) qrCode.isDark(row, col) && darkCount++;
  393.                 var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
  394.                 return lostPoint += ratio * 10, lostPoint;
  395.             }
  396.         }, QRMath = {
  397.             "glog": function(n) {
  398.                 if (n < 1) throw new Error("glog(" + n + ")");
  399.                 return QRMath.LOG_TABLE[n];
  400.             },
  401.             "gexp": function(n) {
  402.                 while (n < 0) n += 255;
  403.                 while (n >= 256) n -= 255;
  404.                 return QRMath.EXP_TABLE[n];
  405.             },
  406.             "EXP_TABLE": new Array(256),
  407.             "LOG_TABLE": new Array(256)
  408.         };
  409.  
  410.         for (var i = 0; i < 8; i++) QRMath.EXP_TABLE[i] = 1 << i;
  411.  
  412.         for (var i = 8; i < 256; i++) QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
  413.  
  414.         for (var i = 0; i < 255; i++) QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
  415.  
  416.         QRPolynomial.prototype = {
  417.             ": function(index) {
  418.                 return this.num[index];
  419.             },
  420.             "   "getLength": function() {
  421.                 return this.num.length;
  422.             },
  423.             "multiply": function(e) {
  424.                 var num = new Array(this.getLength() + e.getLength() - 1);
  425.                 for (var i = 0; i < this.getLength(); i++) for (var j = 0; j < e.getLength(); j++) num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
  426.                 return new QRPolynomial(num, 0);
  427.             },
  428.             ": function(e) {
  429.                 if (this.getLength() - e.getLength() < 0) return this;
  430.                 var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)), num = new Array(this.getLength());
  431.                 for (var i = 0; i < this.getLength(); i++) num[i] = this.get(i);
  432.                 for (var i = 0; i < e.getLength(); i++) num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
  433.                 return (new QRPolynomial(num, 0)).mod(e);
  434.             }
  435.         }, QRRSBlock.RS_BLOCK_TABLE = [ [ 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 ] ], QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {
  436.             var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
  437.             if (rsBlock == undefined) throw new Error("or("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
  438.             var length = rsBlock.length / 3, list = [];
  439.             for (var i = 0; i < length; i++) {
  440.                 var count = rsBlock[i * 3 + 0], totalCount = rsBlock[i * 3 + 1], dataCount = rsBlock[i * 3 + 2];
  441.                 for (var j = 0; j < count; j++) list.push(new QRRSBlock(totalCount, dataCount));
  442.             }
  443.             return list;
  444.         }, QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {
  445.             switch (errorCorrectLevel) {
  446.               case QRErrorCorrectLevel.L:
  447.                 return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
  448.               case QRErrorCorrectLevel.M:
  449.                 return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
  450.               case QRErrorCorrectLevel.Q:
  451.                 return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
  452.               case QRErrorCorrectLevel.H:
  453.                 return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
  454.               default:
  455.                 return undefined;
  456.             }
  457.         }, QRBitBuffer.prototype = {
  458.             ": function(index) {
  459.                 var bufIndex = Math.floor(index / 8);
  460.                 return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) == 1;
  461.             },
  462.             "   ": function(num, length) {
  463.                 for (var i = 0; i < length; i++) this.putBit((num >>> length - i - 1 & 1) == 1);
  464.             },
  465.             "   "getLengthInBits": function() {
  466.                 return this.length;
  467.             },
  468.             "putBit": function(bit) {
  469.                 var bufIndex = Math.floor(this.length / 8);
  470.                 this.buffer.length <= bufIndex && this.buffer.push(0), bit && (this.buffer[bufIndex] |= 128 >>> this.length % 8), this.length++;
  471.             }
  472.         };
  473.         var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
  474.        
  475.         function _isSupportCanvas() {
  476.                 return typeof CanvasRenderingContext2D != "undefined";
  477.         }// android 2.x doesn't support Data-URI spec
  478. pec
  479.         function _getAndroid() {
  480.                 var android = false;
  481.                 var sAgent = navigator.userAgent;
  482.                
  483.                 if (roid/i.tes.test(sAgent)// android
  484. oid
  485.                         android = true;
  486.                         aMat = sAgent.toString().match(roid ([0-9]\.[0-9])/i);
  487.         );
  488.                        
  489.                         if (aMat && aMat[1]) {
  490.                                 android = parseFloat(aMat[1]);
  491.                         }
  492.                 }
  493.                
  494.                 return android;
  495.         }
  496.        
  497.         var svgDrawer = (function() {
  498.  
  499.                 var Drawing = function (el, htOption) {
  500.                         this._el = el;
  501.                         this._htOption = htOption;
  502.                 };
  503.  
  504.                 Drawing.prototype.draw = function (oQRCode) {
  505.                         var _htOption = this._htOption;
  506.                         var _el = this._el;
  507.                         var nCount = oQRCode.getModuleCount();
  508.                         var nWidth = Math.floor(_htOption.width / nCount);
  509.                         var nHeight = Math.floor(_htOption.height / nCount);
  510.  
  511.                         this.clear();
  512.  
  513.                         function makeSVG(tag, attrs) {
  514.                                 var el = document.createElementNS('h//www.w3.org/2000/svg', tag);
  515. g);
  516.                                 for (var k in attrs)
  517.                                         if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
  518.                                 return el;
  519.                         }
  520.  
  521.                         var svg = makeSVG(" , {'viewBox': '0 0 ' + String(nCount) + " + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
  522.                         svg.setAttributeNS("h//www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
  523. ");
  524.                         _el.appendChild(svg);
  525.  
  526.                         svg.appendChild(makeSVG("rect"fill"ill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
  527.  
  528.                         for (var row = 0; row < nCount; row++) {
  529.                                 for (var col = 0; col < nCount; col++) {
  530.                                         if (oQRCode.isDark(row, col)) {
  531.                                                 var child = makeSVG(", {", {"x": String(row), "y": String(col)});
  532.                                                 child.setAttributeNS("h//www.w3.org/1999/xlink", "href", "#template")
  533. e")
  534.                                                 svg.appendChild(child);
  535.                                         }
  536.                                 }
  537.                         }
  538.                 };
  539.                 Drawing.prototype.clear = function () {
  540.                         while (this._el.hasChildNodes())
  541.                                 this._el.removeChild(this._el.lastChild);
  542.                 };
  543.                 return Drawing;
  544.         })();
  545.  
  546.         var useSVG = document.documentElement.tagName.toLowerCase() === ";
  547.  
  548.         // Drawing in DOM by using Table tag
  549.         var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
  550.                 var Drawing = function (el, htOption) {
  551.                         this._el = el;
  552.                         this._htOption = htOption;
  553.                 };
  554.                        
  555.                 /**
  556.                  * Draw the QRCode
  557.                  *
  558.                  * @param {QRCode} oQRCode
  559.                  */
  560.                 Drawing.prototype.draw = function (oQRCode) {
  561.            var _htOption = this._htOption;
  562.            var _el = this._el;
  563.                         var nCount = oQRCode.getModuleCount();
  564.                         var nWidth = Math.floor(_htOption.width / nCount);
  565.                         var nHeight = Math.floor(_htOption.height / nCount);
  566.                         var aHTML = ['<table style="le="border:0;border-collapse:collapse;">'];
  567.                        
  568.                         for (var row = 0; row < nCount; row++) {
  569.                                 aHTML.push('<tr>');
  570.                                
  571.                                 for (var col = 0; col < nCount; col++) {
  572.                                         aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
  573.                                 }
  574.                                
  575.                                 aHTML.push('</tr>');
  576.                         }
  577.                        
  578.                         aHTML.push('</table>');
  579.                         _el.innerHTML = aHTML.join('');
  580.                         // Fix the margin values as real size.
  581. ze.
  582.                         var elTable = _el.childNodes[0];
  583.                         var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
  584.                         var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
  585.                         if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
  586.                                 elTable.style.margin = nTopMarginTable + " + nLeftMarginTable + " + "px";      
  587.                         }
  588.                 };
  589.         /**
  590.                  * Clear the QRCode
  591.                  */      */
  592.                 Drawing.prototype.clear = function () {
  593.                         this._el.innerHTML = '';
  594.                 };
  595.                
  596.                 return Drawing;
  597.         })() : (function (// Drawing in Canvas
  598. vas
  599.                 function _onMakeImage() {
  600.                         this._elImage.src = this._elCanvas.toDataURL("image/png");
  601.                         this._elImage.style.display = "block";
  602.                         this._elCanvas.style.display = "none";                 
  603.                 }
  604.         // Android 2.1 bug workaround
  605. un// http://code.google.com/p/android/issues/detail?id=5141
  606. 141
  607.                 if (this._android && this._android <= 2.1) {
  608.                 var factor = 1 / window.devicePixelRatio;
  609.                 var drawImage = CanvasRenderingContext2D.prototype.drawImage;
  610.                 CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
  611.                         if (("nodeName" in image) && /i.tes.test(image.nodeName)) {
  612.                                 for (var i = arguments.length - 1; i >= 1; i--) {
  613.                                 arguments[i] = arguments[i] * factor;
  614.                                 }
  615.                         } else if (typeof dw == "undefined") {
  616.                                 arguments[1] *= factor;
  617.                                 arguments[2] *= factor;
  618.                                 arguments[3] *= factor;
  619.                                 arguments[4] *= factor;
  620.                         }
  621.                        
  622.                         drawImage.apply(this, arguments);
  623.                 };
  624.                 }
  625.         /**
  626.                  * Check whether the user's browser supports Data URI or not
  627.                  *
  628.                  * @private
  629.                  * @param {Function} fSuccess Occurs if it supports Data URI
  630.                  * @param {Function} fFail Occurs if it doesn't support Data URI
  631.                  */      */
  632.                 function _safeSetDataURI(fSuccess, fFail) {
  633.             var self = this;
  634.             self._fFail = fFail;
  635.             self._fSuccess = fSuccess;
  636.  
  637.         // Check it just once
  638. nce
  639.             if (self._bSupportDataURI === null) {
  640.                 var el = document.createElement(");
  641.                var fOnError = function() {
  642.                    self._bSupportDataURI = false;
  643.  
  644.                    if (self._fFail) {
  645.                        _fFail.call(self);
  646.                    }
  647.                };
  648.                var fOnSuccess = function() {
  649.                    self._bSupportDataURI = true;
  650.  
  651.                    if (self._fSuccess) {
  652.                        self._fSuccess.call(self);
  653.                    }
  654.                };
  655.  
  656.                el.onabort = fOnError;
  657.                el.onerror = fOnError;
  658.                el.onload = fOnSuccess;
  659.                el.src = " = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
  660. ta.
  661.                 return;
  662.             } else if (self._bSupportDataURI === true && self._fSuccess) {
  663.                 self._fSuccess.call(self);
  664.             } else if (self._bSupportDataURI === false && self._fFail) {
  665.                 self._fFail.call(self);
  666.             }
  667.                 };
  668.         /**
  669.                  * Drawing QRCode by using canvas
  670.                  *
  671.                  * @constructor
  672.                  * @param {HTMLElement} el
  673.                  * @param {Object} htOption QRCode Options
  674.                  */      */
  675.                 var Drawing = function (el, htOption) {
  676.                 this._bIsPainted = false;
  677.                 this._android = _getAndroid();
  678.                
  679.                         this._htOption = htOption;
  680.                         this._elCanvas = document.createElement("canvas");
  681.                         this._elCanvas.width = htOption.width;
  682.                         this._elCanvas.height = htOption.height;
  683.                         el.appendChild(this._elCanvas);
  684.                         this._el = el;
  685.                         this._oContext = this._elCanvas.getContext("2d");
  686.                         this._bIsPainted = false;
  687.                         this._elImage = document.createElement(");
  688.                         this._elImage.alt = " = "Scan me!";
  689.                         this._elImage.style.display = "none";
  690.                         this._el.appendChild(this._elImage);
  691.                         this._bSupportDataURI = null;
  692.                 };
  693.                 /**
  694.                  * Draw the QRCode
  695.                  *
  696.                  * @param {QRCode} oQRCode
  697.                  */      */
  698.                 Drawing.prototype.draw = function (oQRCode) {
  699.             var _elImage = this._elImage;
  700.             var _oContext = this._oContext;
  701.             var _htOption = this._htOption;
  702.            
  703.                         var nCount = oQRCode.getModuleCount();
  704.                         var nWidth = _htOption.width / nCount;
  705.                         var nHeight = _htOption.height / nCount;
  706.                         var nRoundedWidth = Math.round(nWidth);
  707.                         var nRoundedHeight = Math.round(nHeight);
  708.  
  709.                         _elImage.style.display = "none";
  710.                         this.clear();
  711.                        
  712.                         for (var row = 0; row < nCount; row++) {
  713.                                 for (var col = 0; col < nCount; col++) {
  714.                                         var bIsDark = oQRCode.isDark(row, col);
  715.                                         var nLeft = col * nWidth;
  716.                                         var nTop = row * nHeight;
  717.                                         _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
  718.                                         _oContext.lineWidth = 1;
  719.                                         _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;                                    
  720.                                         _oContext.fillRect(nLeft, nTop, nWidth, nHeight);
  721.                                        
  722.         // ���剨 �𥚃謔科𩸭�㘚 諻拖� 麮䁪收
  723. 謔科𩸭�㘚 諻拖� 麮䁪收
  724.                                         _oContext.strokeRect(
  725.                                                 Math.floor(nLeft) + 0.5,
  726.                                                 Math.floor(nTop) + 0.5,
  727.                                                 nRoundedWidth,
  728.                                                 nRoundedHeight
  729.                                         );
  730.                                        
  731.                                         _oContext.strokeRect(
  732.                                                 Math.ceil(nLeft) - 0.5,
  733.                                                 Math.ceil(nTop) - 0.5,
  734.                                                 nRoundedWidth,
  735.                                                 nRoundedHeight
  736.                                         );
  737.                                 }
  738.                         }
  739.                         /**
  740.                  * Make the image from Canvas if the browser supports Data URI.
  741.                  */ if the browser supports Data URI.
  742.                  */
  743.                 Drawing.prototype.makeImage = function () {
  744.                         if (this._bIsPainted) {
  745.                                 _safeSetDataURI.ca/**
  746.                  * Return whether the QRCode is painted or not
  747.                  *
  748.                  * @return {Boolean}
  749.                  */r not
  750.                  *
  751.                  * @return {Boolean}
  752.                  */
  753.                 Drawing.prototype.isPainted = function () /**
  754.                  * Clear the QRCode
  755.                  */     };
  756.                
  757.                 /**
  758.                  * Clear the QRCode
  759.                  */
  760.                 Drawing.prototype.clear = function () {
  761.                         this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);/**
  762.                  * @private
  763.                  * @param {Number} nNumber
  764.                  */ivate
  765.                  * @param {Number} nNumber
  766.                  */
  767.                 Drawing.prototype.round = function (nNumber) {
  768.                         if (!nNumber) {
  769.                                 return nNumber;
  770.                         }
  771.                        
  772.                         return Math.floor(nNumber * 1000) / 10/**
  773.          * Get the type by string length
  774.          *
  775.          * @private
  776.          * @param {String} sText
  777.          * @param {Number} nCorrectLevel
  778.          * @return {Number} type
  779.          */rectLevel
  780.          * @return {Number} type
  781.          */
  782.         function _getTypeNumber(sText, nCorrectLevel) {                
  783.                 var nType = 1;
  784.                 var length = _getUTF8Length(sText);
  785.                
  786.                 for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
  787.                         var nLimit = 0;
  788.                        
  789.                         switch (nCorrectLevel) {
  790.                                 case QRErrorCorrectLevel.L :
  791.                                         nLimit = QRCodeLimitLength[i][0];
  792.                                         break;
  793.                                 case QRErrorCorrectLevel.M :
  794.                                         nLimit = QRCodeLimitLength[i][1];
  795.                                         break;
  796.                                 case QRErrorCorrectLevel.Q :
  797.                                         nLimit = QRCodeLimitLength[i][2];
  798.                                         break;
  799.                                 case QRErrorCorrectLevel.H :
  800.                                         nLimit = QRCodeLimitLength[i][3];
  801.                                         break;
  802.                         }
  803.                        
  804.                         if (length <= nLimit) {
  805.                                 break;
  806.                         } else {
  807.                                 nType++;
  808.                         }
  809.                 }
  810.                
  811.                 if (nType > QRCodeLimitLength.length) {
  812.                         throw new Error("Too long data");
  813.                 }
  814.                
  815.                 return nType;
  816.         }
  817.  
  818.         function _getUTF8Length(sText) {
  819.                 var replacedText = encodeURI(sText).toString().replace(acedText.length + (, 'a');
  820.                 return replacedText.length + (repla/**
  821.          * @class QRCode
  822.          * @constructor
  823.          * @example
  824.          * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
  825.          *
  826.          * @example
  827.          * var oQRCode = new QRCode("test", {
  828.          *    text : "http://naver.com",
  829.          *    width : 128,
  830.          *    height : 128
  831.          * });
  832.          *
  833.          * oQRCode.clear(); // Clear the QRCode.
  834.          * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
  835.          *
  836.          * @param {HTMLElement|String} el target element or 'id' attribute of element.
  837.          * @param {Object|String} vOption
  838.          * @param {String} vOption.text QRCode link data
  839.          * @param {Number} [vOption.width=256]
  840.          * @param {Number} [vOption.height=256]
  841.          * @param {String} [vOption.colorDark="#000000"]
  842.          * @param {String} [vOption.colorLight="#ffffff"]
  843.          * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
  844.          */l=QRCode.CorrectLevel.H] [L|M|Q|H]
  845.          */
  846.         QRCode = function (el, vOption) {
  847.                 this._htOption = {
  848.                         width : 256,
  849.                         height : 256,
  850.                         typeNumber : 4,
  851.                         colorDark : "#000000",
  852.                         colorLight : "#ffffff",
  853.                         correctLevel : QRErrorCorrectLevel.H
  854.                 };
  855.                
  856.                 if (typeof vOption === 'string') {
  857.                         vOptio// Overwrites options
  858. on
  859.                         };
  860.                 }
  861.                
  862.                 // Overwrites options
  863.                 if (vOption) {
  864.                         for (var i in vOption) {
  865.                                 this._htOption[i] = vOption[i];
  866.                         }
  867.                 }
  868.                
  869.                 if (typeof el == "string") {
  870.                         el = document.getElementById(el);
  871.                 }
  872.                
  873.                 this._android = _getAndroid();
  874.                 this._el = el;
  875.                 this._oQRCode = null;
  876.                 this._oDrawing = new Drawing(this._el, this._htOption);
  877.                
  878.                 if (this._htOption.text) {
  879.                         this.mak/**
  880.          * Make the QRCode
  881.          *
  882.          * @param {String} sText link data
  883.          */      * @param {String} sText link data
  884.          */
  885.         QRCode.prototype.makeCode = function (sText) {
  886.                 this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
  887.                 this._oQRCode.addData(sText);
  888.                 this._oQRCode.make();
  889.                 this._el.title = sText;
  890.                 this._oDrawing.draw(this._/**
  891.          * Make the Image from Canvas element
  892.          * - It occurs automatically
  893.          * - Android below 3 doesn't support Data-URI spec.
  894.          *
  895.          * @private
  896.          */rt Data-URI spec.
  897.          *
  898.          * @private
  899.          */
  900.         QRCode.prototype.makeImage = function () {
  901.                 if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
  902.                 /**
  903.          * Clear the QRCode
  904.          */             }
  905.         };
  906.        
  907.         /**
  908.          * Clear the QRCode
  909.          */
  910.         QRCode.prototype.clear = functio/**
  911.          * @name QRCode.CorrectLevel
  912.          */
  913.         /**
  914.          * @name QRCode.CorrectLevel
  915.          */
  916.         QRCode.CorrectLevel = QREr//暺䁅恕�𠶖��
  917. Level;
  918. })();
  919.  
  920.  
  921.  $(function(){
  922. //暺䁅恕�𠶖��
  923.  
  924. if($(window).width()>768)
  925. {
  926.  
  927. if ($(window).scrollTop()>0) {
  928.       $(".navbar").addClass("add");
  929.    //皛𡁜𢆡���𧒄��
  930. {
  931.                  $(".navbar").removeClass("add");
  932. }
  933.        
  934. //皛𡁜𢆡���𧒄��
  935. $(window).scroll(function(){
  936.      if ($(window).scrollTop()>0) {
  937.       $(".navbar").addClass("add");
  938.         } else {
  939.                  $(".navbar").removeClass("add").addClass(" });
  940.  
  941. } else{
  942.  if ($(window).scrollTop()>0) {
  943.       $(".navbar").addClass("add");
  944.         } else {
  945.                  $(".navbar").addClass("add");
  946. }
  947.  
  948.  $(window).scroll(function(){
  949.      if ($(window).scrollTop()>0) {
  950.       $(".navbar").addClass("add"//蝒堒藁�㺿��睃之撠�
  951. lse {
  952.                  $(".navbar").addClass("add");
  953.     }
  954.  
  955.  });   
  956.  
  957. }
  958.  
  959.  
  960. //蝒堒藁�㺿��睃之撠�
  961.  
  962. $(window).on('resize',function(){
  963.  
  964.  if($(window).width()>768)
  965. {
  966.  
  967. if ($(window).scrollTop()>0)//皛𡁜𢆡���𧒄��
  968. .navbar").addClass("add");
  969.         } else {
  970.                  $(".navbar").removeClass(".navbar"}
  971.        
  972. //皛𡁜𢆡���𧒄��
  973. $(window).scroll(function(){
  974.      if ($(window).scrollTop()>0) {
  975.       $(".navbar").addClass("add");
  976.         } else {
  977.                  $(");
  978.        } else {
  979.                  $(");
  980.     }
  981.  
  982.  });   
  983.  
  984. } else{
  985.  if ($(window).scrollTop()>0) {
  986.       $(".navbar").addClass("add");
  987.         } else {
  988.                  $(".navbar").addClass("add");
  989. }
  990.  
  991.  $(window).scroll(function(){
  992.      if ($(window).scrollTop()>0) {
  993.       $

Raw Paste


Login or Register to edit or fork this paste. It's free.