PageSourceSearch

https://www.mannings.com.hk/venia-static-assets/js/qrcode.js

js mannings.com.hk collected 2026-10-01 14:11:00 UTC 54,898 bytes, 2,247 lines download raw bytes

vendor: 12,770 bytes, lines 1-495
1//---------------------------------------------------------------------
2//
3// QR Code Generator for JavaScript
4//
5// Copyright (c) 2009 Kazuhiko Arase
6//
7// URL: http://www.d-project.com/
8//
9// Licensed under the MIT license:
10//  http://www.opensource.org/licenses/mit-license.php
11//
12// The word 'QR Code' is registered trademark of
13// DENSO WAVE INCORPORATED
14//  http://www.denso-wave.com/qrcode/faqpatent-e.html
15//
16//---------------------------------------------------------------------
17
18var qrcode = function() {
19
20  //---------------------------------------------------------------------
21  // qrcode
22  //---------------------------------------------------------------------
23
24  /**
25   * qrcode
26   * @param typeNumber 1 to 40
27   * @param errorCorrectionLevel 'L','M','Q','H'
28   */
29  var qrcode = function(typeNumber, errorCorrectionLevel) {
30
31    var PAD0 = 0xEC;
32    var PAD1 = 0x11;
33
34    var _typeNumber = typeNumber;
35    var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];
36    var _modules = null;
37    var _moduleCount = 0;
38    var _dataCache = null;
39    var _dataList = [];
40
41    var _this = {};
42
43    var makeImpl = function(test, maskPattern) {
44
45      _moduleCount = _typeNumber * 4 + 17;
46      _modules = function(moduleCount) {
47        var modules = new Array(moduleCount);
48        for (var row = 0; row < moduleCount; row += 1) {
49          modules[row] = new Array(moduleCount);
50          for (var col = 0; col < moduleCount; col += 1) {
51            modules[row][col] = null;
52          }
53        }
54        return modules;
55      }(_moduleCount);
56
57      setupPositionProbePattern(0, 0);
58      setupPositionProbePattern(_moduleCount - 7, 0);
59      setupPositionProbePattern(0, _moduleCount - 7);
60      setupPositionAdjustPattern();
61      setupTimingPattern();
62      setupTypeInfo(test, maskPattern);
63
64      if (_typeNumber >= 7) {
65        setupTypeNumber(test);
66      }
67
68      if (_dataCache == null) {
69        _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
70      }
71
72      mapData(_dataCache, maskPattern);
73    };
74
75    var setupPositionProbePattern = function(row, col) {
76
77      for (var r = -1; r <= 7; r += 1) {
78
79        if (row + r <= -1 || _moduleCount <= row + r) continue;
80
81        for (var c = -1; c <= 7; c += 1) {
82
83          if (col + c <= -1 || _moduleCount <= col + c) continue;
84
85          if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )
86              || (0 <= c && c <= 6 && (r == 0 || r == 6) )
87              || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {
88            _modules[row + r][col + c] = true;
89          } else {
90            _modules[row + r][col + c] = false;
91          }
92        }
93      }
94    };
95
96    var getBestMaskPattern = function() {
97
98      var minLostPoint = 0;
99      var pattern = 0;
100
101      for (var i = 0; i < 8; i += 1) {
102
103        makeImpl(true, i);
104
105        var lostPoint = QRUtil.getLostPoint(_this);
106
107        if (i == 0 || minLostPoint > lostPoint) {
108          minLostPoint = lostPoint;
109          pattern = i;
110        }
111      }
112
113      return pattern;
114    };
115
116    var setupTimingPattern = function() {
117
118      for (var r = 8; r < _moduleCount - 8; r += 1) {
119        if (_modules[r][6] != null) {
120          continue;
121        }
122        _modules[r][6] = (r % 2 == 0);
123      }
124
125      for (var c = 8; c < _moduleCount - 8; c += 1) {
126        if (_modules[6][c] != null) {
127          continue;
128        }
129        _modules[6][c] = (c % 2 == 0);
130      }
131    };
132
133    var setupPositionAdjustPattern = function() {
134
135      var pos = QRUtil.getPatternPosition(_typeNumber);
136
137      for (var i = 0; i < pos.length; i += 1) {
138
139        for (var j = 0; j < pos.length; j += 1) {
140
141          var row = pos[i];
142          var col = pos[j];
143
144          if (_modules[row][col] != null) {
145            continue;
146          }
147
148          for (var r = -2; r <= 2; r += 1) {
149
150            for (var c = -2; c <= 2; c += 1) {
151
152              if (r == -2 || r == 2 || c == -2 || c == 2
153                  || (r == 0 && c == 0) ) {
154                _modules[row + r][col + c] = true;
155              } else {
156                _modules[row + r][col + c] = false;
157              }
158            }
159          }
160        }
161      }
162    };
163
164    var setupTypeNumber = function(test) {
165
166      var bits = QRUtil.getBCHTypeNumber(_typeNumber);
167
168      for (var i = 0; i < 18; i += 1) {
169        var mod = (!test && ( (bits >> i) & 1) == 1);
170        _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
171      }
172
173      for (var i = 0; i < 18; i += 1) {
174        var mod = (!test && ( (bits >> i) & 1) == 1);
175        _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
176      }
177    };
178
179    var setupTypeInfo = function(test, maskPattern) {
180
181      var data = (_errorCorrectionLevel << 3) | maskPattern;
182      var bits = QRUtil.getBCHTypeInfo(data);
183
184      // vertical
185      for (var i = 0; i < 15; i += 1) {
186
187        var mod = (!test && ( (bits >> i) & 1) == 1);
188
189        if (i < 6) {
190          _modules[i][8] = mod;
191        } else if (i < 8) {
192          _modules[i + 1][8] = mod;
193        } else {
194          _modules[_moduleCount - 15 + i][8] = mod;
195        }
196      }
197
198      // horizontal
199      for (var i = 0; i < 15; i += 1) {
200
201        var mod = (!test && ( (bits >> i) & 1) == 1);
202
203        if (i < 8) {
204          _modules[8][_moduleCount - i - 1] = mod;
205        } else if (i < 9) {
206          _modules[8][15 - i - 1 + 1] = mod;
207        } else {
208          _modules[8][15 - i - 1] = mod;
209        }
210      }
211
212      // fixed module
213      _modules[_moduleCount - 8][8] = (!test);
214    };
215
216    var mapData = function(data, maskPattern) {
217
218      var inc = -1;
219      var row = _moduleCount - 1;
220      var bitIndex = 7;
221      var byteIndex = 0;
222      var maskFunc = QRUtil.getMaskFunction(maskPattern);
223
224      for (var col = _moduleCount - 1; col > 0; col -= 2) {
225
226        if (col == 6) col -= 1;
227
228        while (true) {
229
230          for (var c = 0; c < 2; c += 1) {
231
232            if (_modules[row][col - c] == null) {
233
234              var dark = false;
235
236              if (byteIndex < data.length) {
237                dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);
238              }
239
240              var mask = maskFunc(row, col - c);
241
242              if (mask) {
243                dark = !dark;
244              }
245
246              _modules[row][col - c] = dark;
247              bitIndex -= 1;
248
249              if (bitIndex == -1) {
250                byteIndex += 1;
251                bitIndex = 7;
252              }
253            }
254          }
255
256          row += inc;
257
258          if (row < 0 || _moduleCount <= row) {
259            row -= inc;
260            inc = -inc;
261            break;
262          }
263        }
264      }
265    };
266
267    var createBytes = function(buffer, rsBlocks) {
268
269      var offset = 0;
270
271      var maxDcCount = 0;
272      var maxEcCount = 0;
273
274      var dcdata = new Array(rsBlocks.length);
275      var ecdata = new Array(rsBlocks.length);
276
277      for (var r = 0; r < rsBlocks.length; r += 1) {
278
279        var dcCount = rsBlocks[r].dataCount;
280        var ecCount = rsBlocks[r].totalCount - dcCount;
281
282        maxDcCount = Math.max(maxDcCount, dcCount);
283        maxEcCount = Math.max(maxEcCount, ecCount);
284
285        dcdata[r] = new Array(dcCount);
286
287        for (var i = 0; i < dcdata[r].length; i += 1) {
288          dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
289        }
290        offset += dcCount;
291
292        var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
293        var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
294
295        var modPoly = rawPoly.mod(rsPoly);
296        ecdata[r] = new Array(rsPoly.getLength() - 1);
297        for (var i = 0; i < ecdata[r].length; i += 1) {
298          var modIndex = i + modPoly.getLength() - ecdata[r].length;
299          ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;
300        }
301      }
302
303      var totalCodeCount = 0;
304      for (var i = 0; i < rsBlocks.length; i += 1) {
305        totalCodeCount += rsBlocks[i].totalCount;
306      }
307
308      var data = new Array(totalCodeCount);
309      var index = 0;
310
311      for (var i = 0; i < maxDcCount; i += 1) {
312        for (var r = 0; r < rsBlocks.length; r += 1) {
313          if (i < dcdata[r].length) {
314            data[index] = dcdata[r][i];
315            index += 1;
316          }
317        }
318      }
319
320      for (var i = 0; i < maxEcCount; i += 1) {
321        for (var r = 0; r < rsBlocks.length; r += 1) {
322          if (i < ecdata[r].length) {
323            data[index] = ecdata[r][i];
324            index += 1;
325          }
326        }
327      }
328
329      return data;
330    };
331
332    var createData = function(typeNumber, errorCorrectionLevel, dataList) {
333
334      var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);
335
336      var buffer = qrBitBuffer();
337
338      for (var i = 0; i < dataList.length; i += 1) {
339        var data = dataList[i];
340        buffer.put(data.getMode(), 4);
341        buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
342        data.write(buffer);
343      }
344
345      // calc num max data.
346      var totalDataCount = 0;
347      for (var i = 0; i < rsBlocks.length; i += 1) {
348        totalDataCount += rsBlocks[i].dataCount;
349      }
350
351      if (buffer.getLengthInBits() > totalDataCount * 8) {
352        throw 'code length overflow. ('
353          + buffer.getLengthInBits()
354          + '>'
355          + totalDataCount * 8
356          + ')';
357      }
358
359      // end code
360      if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
361        buffer.put(0, 4);
362      }
363
364      // padding
365      while (buffer.getLengthInBits() % 8 != 0) {
366        buffer.putBit(false);
367      }
368
369      // padding
370      while (true) {
371
372        if (buffer.getLengthInBits() >= totalDataCount * 8) {
373          break;
374        }
375        buffer.put(PAD0, 8);
376
377        if (buffer.getLengthInBits() >= totalDataCount * 8) {
378          break;
379        }
380        buffer.put(PAD1, 8);
381      }
382
383      return createBytes(buffer, rsBlocks);
384    };
385
386    _this.addData = function(data, mode) {
387
388      mode = mode || 'Byte';
389
390      var newData = null;
391
392      switch(mode) {
393      case 'Numeric' :
394        newData = qrNumber(data);
395        break;
396      case 'Alphanumeric' :
397        newData = qrAlphaNum(data);
398        break;
399      case 'Byte' :
400        newData = qr8BitByte(data);
401        break;
402      case 'Kanji' :
403        newData = qrKanji(data);
404        break;
405      default :
406        throw 'mode:' + mode;
407      }
408
409      _dataList.push(newData);
410      _dataCache = null;
411    };
412
413    _this.isDark = function(row, col) {
414      if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
415        throw row + ',' + col;
416      }
417      return _modules[row][col];
418    };
419
420    _this.getModuleCount = function() {
421      return _moduleCount;
422    };
423
424    _this.make = function() {
425      if (_typeNumber < 1) {
426        var typeNumber = 1;
427
428        for (; typeNumber < 40; typeNumber++) {
429          var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel);
430          var buffer = qrBitBuffer();
431
432          for (var i = 0; i < _dataList.length; i++) {
433            var data = _dataList[i];
434            buffer.put(data.getMode(), 4);
435            buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
436            data.write(buffer);
437          }
438
439          var totalDataCount = 0;
440          for (var i = 0; i < rsBlocks.length; i++) {
441            totalDataCount += rsBlocks[i].dataCount;
442          }
443
444          if (buffer.getLengthInBits() <= totalDataCount * 8) {
445            break;
446          }
447        }
448
449        _typeNumber = typeNumber;
450      }
451
452      makeImpl(false, getBestMaskPattern() );
453    };
454
455    _this.createTableTag = function(cellSize, margin) {
456
457      cellSize = cellSize || 2;
458      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
459
460      var qrHtml = '';
461
462      qrHtml += '<table style="';
463      qrHtml += ' border-width: 0px; border-style: none;';
464      qrHtml += ' border-collapse: collapse;';
465      qrHtml += ' padding: 0px; margin: ' + margin + 'px;';
466      qrHtml += '">';
467      qrHtml += '<tbody>';
468
469      for (var r = 0; r < _this.getModuleCount(); r += 1) {
470
471        qrHtml += '<tr>';
472
473        for (var c = 0; c < _this.getModuleCount(); c += 1) {
474          qrHtml += '<td style="';
475          qrHtml += ' border-width: 0px; border-style: none;';
476          qrHtml += ' border-collapse: collapse;';
477          qrHtml += ' padding: 0px; margin: 0px;';
478          qrHtml += ' width: ' + cellSize + 'px;';
479          qrHtml += ' height: ' + cellSize + 'px;';
480          qrHtml += ' background-color: ';
481          qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';
482          qrHtml += ';';
483          qrHtml += '"/>';
484        }
485
486        qrHtml += '</tr>';
487      }
488
489      qrHtml += '</tbody>';
490      qrHtml += '</table>';
491
492      return qrHtml;
493    };
494
495    _this.createSvgTag = function(cellSize, margin
vendor: 5,247 bytes, lines 495-675
495) {
496
497      cellSize = cellSize || 2;
498      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
499      var size = _this.getModuleCount() * cellSize + margin * 2;
500      var c, mc, r, mr, qrSvg='', rect;
501
502      rect = 'l' + cellSize + ',0 0,' + cellSize +
503        ' -' + cellSize + ',0 0,-' + cellSize + 'z ';
504
505      qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"';
506      qrSvg += ' width="' + size + 'px"';
507      qrSvg += ' height="' + size + 'px"';
508      qrSvg += ' viewBox="0 0 ' + size + ' ' + size + '" ';
509      qrSvg += ' preserveAspectRatio="xMinYMin meet">';
510      qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>';
511      qrSvg += '<path d="';
512
513      for (r = 0; r < _this.getModuleCount(); r += 1) {
514        mr = r * cellSize + margin;
515        for (c = 0; c < _this.getModuleCount(); c += 1) {
516          if (_this.isDark(r, c) ) {
517            mc = c*cellSize+margin;
518            qrSvg += 'M' + mc + ',' + mr + rect;
519          }
520        }
521      }
522
523      qrSvg += '" stroke="transparent" fill="black"/>';
524      qrSvg += '</svg>';
525
526      return qrSvg;
527    };
528
529    _this.createDataURL = function(cellSize, margin) {
530
531      cellSize = cellSize || 2;
532      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
533
534      var size = _this.getModuleCount() * cellSize + margin * 2;
535      var min = margin;
536      var max = size - margin;
537
538      return createDataURL(size, size, function(x, y) {
539        if (min <= x && x < max && min <= y && y < max) {
540          var c = Math.floor( (x - min) / cellSize);
541          var r = Math.floor( (y - min) / cellSize);
542          return _this.isDark(r, c)? 0 : 1;
543        } else {
544          return 1;
545        }
546      } );
547    };
548
549    _this.createImgTag = function(cellSize, margin, alt) {
550
551      cellSize = cellSize || 2;
552      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
553
554      var size = _this.getModuleCount() * cellSize + margin * 2;
555
556      var img = '';
557      img += '<img';
558      img += '\u0020src="';
559      img += _this.createDataURL(cellSize, margin);
560      img += '"';
561      img += '\u0020width="';
562      img += size;
563      img += '"';
564      img += '\u0020height="';
565      img += size;
566      img += '"';
567      if (alt) {
568        img += '\u0020alt="';
569        img += alt;
570        img += '"';
571      }
572      img += '/>';
573
574      return img;
575    };
576
577    var _createHalfASCII = function(margin) {
578      var cellSize = 1;
579      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;
580
581      var size = _this.getModuleCount() * cellSize + margin * 2;
582      var min = margin;
583      var max = size - margin;
584
585      var y, x, r1, r2, p;
586
587      var blocks = {
588        '██': '█',
589        '█ ': '▀',
590        ' █': '▄',
591        '  ': ' '
592      };
593
594      var ascii = '';
595      for (y = 0; y < size; y += 2) {
596        r1 = Math.floor((y - min) / cellSize);
597        r2 = Math.floor((y + 1 - min) / cellSize);
598        for (x = 0; x < size; x += 1) {
599          p = '█';
600
601          if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {
602            p = ' ';
603          }
604
605          if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {
606            p += ' ';
607          }
608          else {
609            p += '█';
610          }
611
612          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
613          ascii += blocks[p];
614        }
615
616        ascii += '\n';
617      }
618
619      if (size % 2) {
620        return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀');
621      }
622
623      return ascii.substring(0, ascii.length-1);
624    };
625
626    _this.createASCII = function(cellSize, margin) {
627      cellSize = cellSize || 1;
628
629      if (cellSize < 2) {
630        return _createHalfASCII(margin);
631      }
632
633      cellSize -= 1;
634      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;
635
636      var size = _this.getModuleCount() * cellSize + margin * 2;
637      var min = margin;
638      var max = size - margin;
639
640      var y, x, r, p;
641
642      var white = Array(cellSize+1).join('██');
643      var black = Array(cellSize+1).join('  ');
644
645      var ascii = '';
646      var line = '';
647      for (y = 0; y < size; y += 1) {
648        r = Math.floor( (y - min) / cellSize);
649        line = '';
650        for (x = 0; x < size; x += 1) {
651          p = 1;
652
653          if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {
654            p = 0;
655          }
656
657          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
658          line += p ? white : black;
659        }
660
661        for (r = 0; r < cellSize; r += 1) {
662          ascii += line + '\n';
663        }
664      }
665
666      return ascii.substring(0, ascii.length-1);
667    };
668
669    _this.renderTo2dContext = function(context, cellSize) {
670      cellSize = cellSize || 2;
671      var length = _this.getModuleCount();
672      for (var row = 0; row < length; row++) {
673        for (var col = 0; col < length; col++) {
674          context.fillStyle = _this.isDark(row, col) ? 'black' : 'white';
675          context.fillRect(row * cellSize, col
vendor: 16,983 bytes, lines 675-1369
675 * cellSize, cellSize, cellSize);
676        }
677      }
678    }
679
680    return _this;
681  };
682
683  //---------------------------------------------------------------------
684  // qrcode.stringToBytes
685  //---------------------------------------------------------------------
686
687  qrcode.stringToBytesFuncs = {
688    'default' : function(s) {
689      var bytes = [];
690      for (var i = 0; i < s.length; i += 1) {
691        var c = s.charCodeAt(i);
692        bytes.push(c & 0xff);
693      }
694      return bytes;
695    }
696  };
697
698  qrcode.stringToBytes = qrcode.stringToBytesFuncs['default'];
699
700  //---------------------------------------------------------------------
701  // qrcode.createStringToBytes
702  //---------------------------------------------------------------------
703
704  /**
705   * @param unicodeData base64 string of byte array.
706   * [16bit Unicode],[16bit Bytes], ...
707   * @param numChars
708   */
709  qrcode.createStringToBytes = function(unicodeData, numChars) {
710
711    // create conversion map.
712
713    var unicodeMap = function() {
714
715      var bin = base64DecodeInputStream(unicodeData);
716      var read = function() {
717        var b = bin.read();
718        if (b == -1) throw 'eof';
719        return b;
720      };
721
722      var count = 0;
723      var unicodeMap = {};
724      while (true) {
725        var b0 = bin.read();
726        if (b0 == -1) break;
727        var b1 = read();
728        var b2 = read();
729        var b3 = read();
730        var k = String.fromCharCode( (b0 << 8) | b1);
731        var v = (b2 << 8) | b3;
732        unicodeMap[k] = v;
733        count += 1;
734      }
735      if (count != numChars) {
736        throw count + ' != ' + numChars;
737      }
738
739      return unicodeMap;
740    }();
741
742    var unknownChar = '?'.charCodeAt(0);
743
744    return function(s) {
745      var bytes = [];
746      for (var i = 0; i < s.length; i += 1) {
747        var c = s.charCodeAt(i);
748        if (c < 128) {
749          bytes.push(c);
750        } else {
751          var b = unicodeMap[s.charAt(i)];
752          if (typeof b == 'number') {
753            if ( (b & 0xff) == b) {
754              // 1byte
755              bytes.push(b);
756            } else {
757              // 2bytes
758              bytes.push(b >>> 8);
759              bytes.push(b & 0xff);
760            }
761          } else {
762            bytes.push(unknownChar);
763          }
764        }
765      }
766      return bytes;
767    };
768  };
769
770  //---------------------------------------------------------------------
771  // QRMode
772  //---------------------------------------------------------------------
773
774  var QRMode = {
775    MODE_NUMBER :    1 << 0,
776    MODE_ALPHA_NUM : 1 << 1,
777    MODE_8BIT_BYTE : 1 << 2,
778    MODE_KANJI :     1 << 3
779  };
780
781  //---------------------------------------------------------------------
782  // QRErrorCorrectionLevel
783  //---------------------------------------------------------------------
784
785  var QRErrorCorrectionLevel = {
786    L : 1,
787    M : 0,
788    Q : 3,
789    H : 2
790  };
791
792  //---------------------------------------------------------------------
793  // QRMaskPattern
794  //---------------------------------------------------------------------
795
796  var QRMaskPattern = {
797    PATTERN000 : 0,
798    PATTERN001 : 1,
799    PATTERN010 : 2,
800    PATTERN011 : 3,
801    PATTERN100 : 4,
802    PATTERN101 : 5,
803    PATTERN110 : 6,
804    PATTERN111 : 7
805  };
806
807  //---------------------------------------------------------------------
808  // QRUtil
809  //---------------------------------------------------------------------
810
811  var QRUtil = function() {
812
813    var PATTERN_POSITION_TABLE = [
814      [],
815      [6, 18],
816      [6, 22],
817      [6, 26],
818      [6, 30],
819      [6, 34],
820      [6, 22, 38],
821      [6, 24, 42],
822      [6, 26, 46],
823      [6, 28, 50],
824      [6, 30, 54],
825      [6, 32, 58],
826      [6, 34, 62],
827      [6, 26, 46, 66],
828      [6, 26, 48, 70],
829      [6, 26, 50, 74],
830      [6, 30, 54, 78],
831      [6, 30, 56, 82],
832      [6, 30, 58, 86],
833      [6, 34, 62, 90],
834      [6, 28, 50, 72, 94],
835      [6, 26, 50, 74, 98],
836      [6, 30, 54, 78, 102],
837      [6, 28, 54, 80, 106],
838      [6, 32, 58, 84, 110],
839      [6, 30, 58, 86, 114],
840      [6, 34, 62, 90, 118],
841      [6, 26, 50, 74, 98, 122],
842      [6, 30, 54, 78, 102, 126],
843      [6, 26, 52, 78, 104, 130],
844      [6, 30, 56, 82, 108, 134],
845      [6, 34, 60, 86, 112, 138],
846      [6, 30, 58, 86, 114, 142],
847      [6, 34, 62, 90, 118, 146],
848      [6, 30, 54, 78, 102, 126, 150],
849      [6, 24, 50, 76, 102, 128, 154],
850      [6, 28, 54, 80, 106, 132, 158],
851      [6, 32, 58, 84, 110, 136, 162],
852      [6, 26, 54, 82, 110, 138, 166],
853      [6, 30, 58, 86, 114, 142, 170]
854    ];
855    var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
856    var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
857    var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
858
859    var _this = {};
860
861    var getBCHDigit = function(data) {
862      var digit = 0;
863      while (data != 0) {
864        digit += 1;
865        data >>>= 1;
866      }
867      return digit;
868    };
869
870    _this.getBCHTypeInfo = function(data) {
871      var d = data << 10;
872      while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
873        d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );
874      }
875      return ( (data << 10) | d) ^ G15_MASK;
876    };
877
878    _this.getBCHTypeNumber = function(data) {
879      var d = data << 12;
880      while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
881        d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );
882      }
883      return (data << 12) | d;
884    };
885
886    _this.getPatternPosition = function(typeNumber) {
887      return PATTERN_POSITION_TABLE[typeNumber - 1];
888    };
889
890    _this.getMaskFunction = function(maskPattern) {
891
892      switch (maskPattern) {
893
894      case QRMaskPattern.PATTERN000 :
895        return function(i, j) { return (i + j) % 2 == 0; };
896      case QRMaskPattern.PATTERN001 :
897        return function(i, j) { return i % 2 == 0; };
898      case QRMaskPattern.PATTERN010 :
899        return function(i, j) { return j % 3 == 0; };
900      case QRMaskPattern.PATTERN011 :
901        return function(i, j) { return (i + j) % 3 == 0; };
902      case QRMaskPattern.PATTERN100 :
903        return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };
904      case QRMaskPattern.PATTERN101 :
905        return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };
906      case QRMaskPattern.PATTERN110 :
907        return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };
908      case QRMaskPattern.PATTERN111 :
909        return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };
910
911      default :
912        throw 'bad maskPattern:' + maskPattern;
913      }
914    };
915
916    _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
917      var a = qrPolynomial([1], 0);
918      for (var i = 0; i < errorCorrectLength; i += 1) {
919        a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );
920      }
921      return a;
922    };
923
924    _this.getLengthInBits = function(mode, type) {
925
926      if (1 <= type && type < 10) {
927
928        // 1 - 9
929
930        switch(mode) {
931        case QRMode.MODE_NUMBER    : return 10;
932        case QRMode.MODE_ALPHA_NUM : return 9;
933        case QRMode.MODE_8BIT_BYTE : return 8;
934        case QRMode.MODE_KANJI     : return 8;
935        default :
936          throw 'mode:' + mode;
937        }
938
939      } else if (type < 27) {
940
941        // 10 - 26
942
943        switch(mode) {
944        case QRMode.MODE_NUMBER    : return 12;
945        case QRMode.MODE_ALPHA_NUM : return 11;
946        case QRMode.MODE_8BIT_BYTE : return 16;
947        case QRMode.MODE_KANJI     : return 10;
948        default :
949          throw 'mode:' + mode;
950        }
951
952      } else if (type < 41) {
953
954        // 27 - 40
955
956        switch(mode) {
957        case QRMode.MODE_NUMBER    : return 14;
958        case QRMode.MODE_ALPHA_NUM : return 13;
959        case QRMode.MODE_8BIT_BYTE : return 16;
960        case QRMode.MODE_KANJI     : return 12;
961        default :
962          throw 'mode:' + mode;
963        }
964
965      } else {
966        throw 'type:' + type;
967      }
968    };
969
970    _this.getLostPoint = function(qrcode) {
971
972      var moduleCount = qrcode.getModuleCount();
973
974      var lostPoint = 0;
975
976      // LEVEL1
977
978      for (var row = 0; row < moduleCount; row += 1) {
979        for (var col = 0; col < moduleCount; col += 1) {
980
981          var sameCount = 0;
982          var dark = qrcode.isDark(row, col);
983
984          for (var r = -1; r <= 1; r += 1) {
985
986            if (row + r < 0 || moduleCount <= row + r) {
987              continue;
988            }
989
990            for (var c = -1; c <= 1; c += 1) {
991
992              if (col + c < 0 || moduleCount <= col + c) {
993                continue;
994              }
995
996              if (r == 0 && c == 0) {
997                continue;
998              }
999
1000              if (dark == qrcode.isDark(row + r, col + c) ) {
1001                sameCount += 1;
1002              }
1003            }
1004          }
1005
1006          if (sameCount > 5) {
1007            lostPoint += (3 + sameCount - 5);
1008          }
1009        }
1010      };
1011
1012      // LEVEL2
1013
1014      for (var row = 0; row < moduleCount - 1; row += 1) {
1015        for (var col = 0; col < moduleCount - 1; col += 1) {
1016          var count = 0;
1017          if (qrcode.isDark(row, col) ) count += 1;
1018          if (qrcode.isDark(row + 1, col) ) count += 1;
1019          if (qrcode.isDark(row, col + 1) ) count += 1;
1020          if (qrcode.isDark(row + 1, col + 1) ) count += 1;
1021          if (count == 0 || count == 4) {
1022            lostPoint += 3;
1023          }
1024        }
1025      }
1026
1027      // LEVEL3
1028
1029      for (var row = 0; row < moduleCount; row += 1) {
1030        for (var col = 0; col < moduleCount - 6; col += 1) {
1031          if (qrcode.isDark(row, col)
1032              && !qrcode.isDark(row, col + 1)
1033              &&  qrcode.isDark(row, col + 2)
1034              &&  qrcode.isDark(row, col + 3)
1035              &&  qrcode.isDark(row, col + 4)
1036              && !qrcode.isDark(row, col + 5)
1037              &&  qrcode.isDark(row, col + 6) ) {
1038            lostPoint += 40;
1039          }
1040        }
1041      }
1042
1043      for (var col = 0; col < moduleCount; col += 1) {
1044        for (var row = 0; row < moduleCount - 6; row += 1) {
1045          if (qrcode.isDark(row, col)
1046              && !qrcode.isDark(row + 1, col)
1047              &&  qrcode.isDark(row + 2, col)
1048              &&  qrcode.isDark(row + 3, col)
1049              &&  qrcode.isDark(row + 4, col)
1050              && !qrcode.isDark(row + 5, col)
1051              &&  qrcode.isDark(row + 6, col) ) {
1052            lostPoint += 40;
1053          }
1054        }
1055      }
1056
1057      // LEVEL4
1058
1059      var darkCount = 0;
1060
1061      for (var col = 0; col < moduleCount; col += 1) {
1062        for (var row = 0; row < moduleCount; row += 1) {
1063          if (qrcode.isDark(row, col) ) {
1064            darkCount += 1;
1065          }
1066        }
1067      }
1068
1069      var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
1070      lostPoint += ratio * 10;
1071
1072      return lostPoint;
1073    };
1074
1075    return _this;
1076  }();
1077
1078  //---------------------------------------------------------------------
1079  // QRMath
1080  //---------------------------------------------------------------------
1081
1082  var QRMath = function() {
1083
1084    var EXP_TABLE = new Array(256);
1085    var LOG_TABLE = new Array(256);
1086
1087    // initialize tables
1088    for (var i = 0; i < 8; i += 1) {
1089      EXP_TABLE[i] = 1 << i;
1090    }
1091    for (var i = 8; i < 256; i += 1) {
1092      EXP_TABLE[i] = EXP_TABLE[i - 4]
1093        ^ EXP_TABLE[i - 5]
1094        ^ EXP_TABLE[i - 6]
1095        ^ EXP_TABLE[i - 8];
1096    }
1097    for (var i = 0; i < 255; i += 1) {
1098      LOG_TABLE[EXP_TABLE[i] ] = i;
1099    }
1100
1101    var _this = {};
1102
1103    _this.glog = function(n) {
1104
1105      if (n < 1) {
1106        throw 'glog(' + n + ')';
1107      }
1108
1109      return LOG_TABLE[n];
1110    };
1111
1112    _this.gexp = function(n) {
1113
1114      while (n < 0) {
1115        n += 255;
1116      }
1117
1118      while (n >= 256) {
1119        n -= 255;
1120      }
1121
1122      return EXP_TABLE[n];
1123    };
1124
1125    return _this;
1126  }();
1127
1128  //---------------------------------------------------------------------
1129  // qrPolynomial
1130  //---------------------------------------------------------------------
1131
1132  function qrPolynomial(num, shift) {
1133
1134    if (typeof num.length == 'undefined') {
1135      throw num.length + '/' + shift;
1136    }
1137
1138    var _num = function() {
1139      var offset = 0;
1140      while (offset < num.length && num[offset] == 0) {
1141        offset += 1;
1142      }
1143      var _num = new Array(num.length - offset + shift);
1144      for (var i = 0; i < num.length - offset; i += 1) {
1145        _num[i] = num[i + offset];
1146      }
1147      return _num;
1148    }();
1149
1150    var _this = {};
1151
1152    _this.getAt = function(index) {
1153      return _num[index];
1154    };
1155
1156    _this.getLength = function() {
1157      return _num.length;
1158    };
1159
1160    _this.multiply = function(e) {
1161
1162      var num = new Array(_this.getLength() + e.getLength() - 1);
1163
1164      for (var i = 0; i < _this.getLength(); i += 1) {
1165        for (var j = 0; j < e.getLength(); j += 1) {
1166          num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );
1167        }
1168      }
1169
1170      return qrPolynomial(num, 0);
1171    };
1172
1173    _this.mod = function(e) {
1174
1175      if (_this.getLength() - e.getLength() < 0) {
1176        return _this;
1177      }
1178
1179      var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );
1180
1181      var num = new Array(_this.getLength() );
1182      for (var i = 0; i < _this.getLength(); i += 1) {
1183        num[i] = _this.getAt(i);
1184      }
1185
1186      for (var i = 0; i < e.getLength(); i += 1) {
1187        num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);
1188      }
1189
1190      // recursive call
1191      return qrPolynomial(num, 0).mod(e);
1192    };
1193
1194    return _this;
1195  };
1196
1197  //---------------------------------------------------------------------
1198  // QRRSBlock
1199  //---------------------------------------------------------------------
1200
1201  var QRRSBlock = function() {
1202
1203    var RS_BLOCK_TABLE = [
1204
1205      // L
1206      // M
1207      // Q
1208      // H
1209
1210      // 1
1211      [1, 26, 19],
1212      [1, 26, 16],
1213      [1, 26, 13],
1214      [1, 26, 9],
1215
1216      // 2
1217      [1, 44, 34],
1218      [1, 44, 28],
1219      [1, 44, 22],
1220      [1, 44, 16],
1221
1222      // 3
1223      [1, 70, 55],
1224      [1, 70, 44],
1225      [2, 35, 17],
1226      [2, 35, 13],
1227
1228      // 4
1229      [1, 100, 80],
1230      [2, 50, 32],
1231      [2, 50, 24],
1232      [4, 25, 9],
1233
1234      // 5
1235      [1, 134, 108],
1236      [2, 67, 43],
1237      [2, 33, 15, 2, 34, 16],
1238      [2, 33, 11, 2, 34, 12],
1239
1240      // 6
1241      [2, 86, 68],
1242      [4, 43, 27],
1243      [4, 43, 19],
1244      [4, 43, 15],
1245
1246      // 7
1247      [2, 98, 78],
1248      [4, 49, 31],
1249      [2, 32, 14, 4, 33, 15],
1250      [4, 39, 13, 1, 40, 14],
1251
1252      // 8
1253      [2, 121, 97],
1254      [2, 60, 38, 2, 61, 39],
1255      [4, 40, 18, 2, 41, 19],
1256      [4, 40, 14, 2, 41, 15],
1257
1258      // 9
1259      [2, 146, 116],
1260      [3, 58, 36, 2, 59, 37],
1261      [4, 36, 16, 4, 37, 17],
1262      [4, 36, 12, 4, 37, 13],
1263
1264      // 10
1265      [2, 86, 68, 2, 87, 69],
1266      [4, 69, 43, 1, 70, 44],
1267      [6, 43, 19, 2, 44, 20],
1268      [6, 43, 15, 2, 44, 16],
1269
1270      // 11
1271      [4, 101, 81],
1272      [1, 80, 50, 4, 81, 51],
1273      [4, 50, 22, 4, 51, 23],
1274      [3, 36, 12, 8, 37, 13],
1275
1276      // 12
1277      [2, 116, 92, 2, 117, 93],
1278      [6, 58, 36, 2, 59, 37],
1279      [4, 46, 20, 6, 47, 21],
1280      [7, 42, 14, 4, 43, 15],
1281
1282      // 13
1283      [4, 133, 107],
1284      [8, 59, 37, 1, 60, 38],
1285      [8, 44, 20, 4, 45, 21],
1286      [12, 33, 11, 4, 34, 12],
1287
1288      // 14
1289      [3, 145, 115, 1, 146, 116],
1290      [4, 64, 40, 5, 65, 41],
1291      [11, 36, 16, 5, 37, 17],
1292      [11, 36, 12, 5, 37, 13],
1293
1294      // 15
1295      [5, 109, 87, 1, 110, 88],
1296      [5, 65, 41, 5, 66, 42],
1297      [5, 54, 24, 7, 55, 25],
1298      [11, 36, 12, 7, 37, 13],
1299
1300      // 16
1301      [5, 122, 98, 1, 123, 99],
1302      [7, 73, 45, 3, 74, 46],
1303      [15, 43, 19, 2, 44, 20],
1304      [3, 45, 15, 13, 46, 16],
1305
1306      // 17
1307      [1, 135, 107, 5, 136, 108],
1308      [10, 74, 46, 1, 75, 47],
1309      [1, 50, 22, 15, 51, 23],
1310      [2, 42, 14, 17, 43, 15],
1311
1312      // 18
1313      [5, 150, 120, 1, 151, 121],
1314      [9, 69, 43, 4, 70, 44],
1315      [17, 50, 22, 1, 51, 23],
1316      [2, 42, 14, 19, 43, 15],
1317
1318      // 19
1319      [3, 141, 113, 4, 142, 114],
1320      [3, 70, 44, 11, 71, 45],
1321      [17, 47, 21, 4, 48, 22],
1322      [9, 39, 13, 16, 40, 14],
1323
1324      // 20
1325      [3, 135, 107, 5, 136, 108],
1326      [3, 67, 41, 13, 68, 42],
1327      [15, 54, 24, 5, 55, 25],
1328      [15, 43, 15, 10, 44, 16],
1329
1330      // 21
1331      [4, 144, 116, 4, 145, 117],
1332      [17, 68, 42],
1333      [17, 50, 22, 6, 51, 23],
1334      [19, 46, 16, 6, 47, 17],
1335
1336      // 22
1337      [2, 139, 111, 7, 140, 112],
1338      [17, 74, 46],
1339      [7, 54, 24, 16, 55, 25],
1340      [34, 37, 13],
1341
1342      // 23
1343      [4, 151, 121, 5, 152, 122],
1344      [4, 75, 47, 14, 76, 48],
1345      [11, 54, 24, 14, 55, 25],
1346      [16, 45, 15, 14, 46, 16],
1347
1348      // 24
1349      [6, 147, 117, 4, 148, 118],
1350      [6, 73, 45, 14, 74, 46],
1351      [11, 54, 24, 16, 55, 25],
1352      [30, 46, 16, 2, 47, 17],
1353
1354      // 25
1355      [8, 132, 106, 4, 133, 107],
1356      [8, 75, 47, 13, 76, 48],
1357      [7, 54, 24, 22, 55, 25],
1358      [22, 45, 15, 13, 46, 16],
1359
1360      // 26
1361      [10, 142, 114, 2, 143, 115],
1362      [19, 74, 46, 4, 75, 47],
1363      [28, 50, 22, 6, 51, 23],
1364      [33, 46, 16, 4, 47, 17],
1365
1366      // 27
1367      [8, 152, 122, 4, 153, 123],
1368      [22, 73, 45, 3, 74, 46],
1369      [8, 53, 23, 26, 54, 24],
vendor: 12,682 bytes, lines 1370-1934
1370      [12, 45, 15, 28, 46, 16],
1371
1372      // 28
1373      [3, 147, 117, 10, 148, 118],
1374      [3, 73, 45, 23, 74, 46],
1375      [4, 54, 24, 31, 55, 25],
1376      [11, 45, 15, 31, 46, 16],
1377
1378      // 29
1379      [7, 146, 116, 7, 147, 117],
1380      [21, 73, 45, 7, 74, 46],
1381      [1, 53, 23, 37, 54, 24],
1382      [19, 45, 15, 26, 46, 16],
1383
1384      // 30
1385      [5, 145, 115, 10, 146, 116],
1386      [19, 75, 47, 10, 76, 48],
1387      [15, 54, 24, 25, 55, 25],
1388      [23, 45, 15, 25, 46, 16],
1389
1390      // 31
1391      [13, 145, 115, 3, 146, 116],
1392      [2, 74, 46, 29, 75, 47],
1393      [42, 54, 24, 1, 55, 25],
1394      [23, 45, 15, 28, 46, 16],
1395
1396      // 32
1397      [17, 145, 115],
1398      [10, 74, 46, 23, 75, 47],
1399      [10, 54, 24, 35, 55, 25],
1400      [19, 45, 15, 35, 46, 16],
1401
1402      // 33
1403      [17, 145, 115, 1, 146, 116],
1404      [14, 74, 46, 21, 75, 47],
1405      [29, 54, 24, 19, 55, 25],
1406      [11, 45, 15, 46, 46, 16],
1407
1408      // 34
1409      [13, 145, 115, 6, 146, 116],
1410      [14, 74, 46, 23, 75, 47],
1411      [44, 54, 24, 7, 55, 25],
1412      [59, 46, 16, 1, 47, 17],
1413
1414      // 35
1415      [12, 151, 121, 7, 152, 122],
1416      [12, 75, 47, 26, 76, 48],
1417      [39, 54, 24, 14, 55, 25],
1418      [22, 45, 15, 41, 46, 16],
1419
1420      // 36
1421      [6, 151, 121, 14, 152, 122],
1422      [6, 75, 47, 34, 76, 48],
1423      [46, 54, 24, 10, 55, 25],
1424      [2, 45, 15, 64, 46, 16],
1425
1426      // 37
1427      [17, 152, 122, 4, 153, 123],
1428      [29, 74, 46, 14, 75, 47],
1429      [49, 54, 24, 10, 55, 25],
1430      [24, 45, 15, 46, 46, 16],
1431
1432      // 38
1433      [4, 152, 122, 18, 153, 123],
1434      [13, 74, 46, 32, 75, 47],
1435      [48, 54, 24, 14, 55, 25],
1436      [42, 45, 15, 32, 46, 16],
1437
1438      // 39
1439      [20, 147, 117, 4, 148, 118],
1440      [40, 75, 47, 7, 76, 48],
1441      [43, 54, 24, 22, 55, 25],
1442      [10, 45, 15, 67, 46, 16],
1443
1444      // 40
1445      [19, 148, 118, 6, 149, 119],
1446      [18, 75, 47, 31, 76, 48],
1447      [34, 54, 24, 34, 55, 25],
1448      [20, 45, 15, 61, 46, 16]
1449    ];
1450
1451    var qrRSBlock = function(totalCount, dataCount) {
1452      var _this = {};
1453      _this.totalCount = totalCount;
1454      _this.dataCount = dataCount;
1455      return _this;
1456    };
1457
1458    var _this = {};
1459
1460    var getRsBlockTable = function(typeNumber, errorCorrectionLevel) {
1461
1462      switch(errorCorrectionLevel) {
1463      case QRErrorCorrectionLevel.L :
1464        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
1465      case QRErrorCorrectionLevel.M :
1466        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
1467      case QRErrorCorrectionLevel.Q :
1468        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
1469      case QRErrorCorrectionLevel.H :
1470        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
1471      default :
1472        return undefined;
1473      }
1474    };
1475
1476    _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {
1477
1478      var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
1479
1480      if (typeof rsBlock == 'undefined') {
1481        throw 'bad rs block @ typeNumber:' + typeNumber +
1482            '/errorCorrectionLevel:' + errorCorrectionLevel;
1483      }
1484
1485      var length = rsBlock.length / 3;
1486
1487      var list = [];
1488
1489      for (var i = 0; i < length; i += 1) {
1490
1491        var count = rsBlock[i * 3 + 0];
1492        var totalCount = rsBlock[i * 3 + 1];
1493        var dataCount = rsBlock[i * 3 + 2];
1494
1495        for (var j = 0; j < count; j += 1) {
1496          list.push(qrRSBlock(totalCount, dataCount) );
1497        }
1498      }
1499
1500      return list;
1501    };
1502
1503    return _this;
1504  }();
1505
1506  //---------------------------------------------------------------------
1507  // qrBitBuffer
1508  //---------------------------------------------------------------------
1509
1510  var qrBitBuffer = function() {
1511
1512    var _buffer = [];
1513    var _length = 0;
1514
1515    var _this = {};
1516
1517    _this.getBuffer = function() {
1518      return _buffer;
1519    };
1520
1521    _this.getAt = function(index) {
1522      var bufIndex = Math.floor(index / 8);
1523      return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;
1524    };
1525
1526    _this.put = function(num, length) {
1527      for (var i = 0; i < length; i += 1) {
1528        _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);
1529      }
1530    };
1531
1532    _this.getLengthInBits = function() {
1533      return _length;
1534    };
1535
1536    _this.putBit = function(bit) {
1537
1538      var bufIndex = Math.floor(_length / 8);
1539      if (_buffer.length <= bufIndex) {
1540        _buffer.push(0);
1541      }
1542
1543      if (bit) {
1544        _buffer[bufIndex] |= (0x80 >>> (_length % 8) );
1545      }
1546
1547      _length += 1;
1548    };
1549
1550    return _this;
1551  };
1552
1553  //---------------------------------------------------------------------
1554  // qrNumber
1555  //---------------------------------------------------------------------
1556
1557  var qrNumber = function(data) {
1558
1559    var _mode = QRMode.MODE_NUMBER;
1560    var _data = data;
1561
1562    var _this = {};
1563
1564    _this.getMode = function() {
1565      return _mode;
1566    };
1567
1568    _this.getLength = function(buffer) {
1569      return _data.length;
1570    };
1571
1572    _this.write = function(buffer) {
1573
1574      var data = _data;
1575
1576      var i = 0;
1577
1578      while (i + 2 < data.length) {
1579        buffer.put(strToNum(data.substring(i, i + 3) ), 10);
1580        i += 3;
1581      }
1582
1583      if (i < data.length) {
1584        if (data.length - i == 1) {
1585          buffer.put(strToNum(data.substring(i, i + 1) ), 4);
1586        } else if (data.length - i == 2) {
1587          buffer.put(strToNum(data.substring(i, i + 2) ), 7);
1588        }
1589      }
1590    };
1591
1592    var strToNum = function(s) {
1593      var num = 0;
1594      for (var i = 0; i < s.length; i += 1) {
1595        num = num * 10 + chatToNum(s.charAt(i) );
1596      }
1597      return num;
1598    };
1599
1600    var chatToNum = function(c) {
1601      if ('0' <= c && c <= '9') {
1602        return c.charCodeAt(0) - '0'.charCodeAt(0);
1603      }
1604      throw 'illegal char :' + c;
1605    };
1606
1607    return _this;
1608  };
1609
1610  //---------------------------------------------------------------------
1611  // qrAlphaNum
1612  //---------------------------------------------------------------------
1613
1614  var qrAlphaNum = function(data) {
1615
1616    var _mode = QRMode.MODE_ALPHA_NUM;
1617    var _data = data;
1618
1619    var _this = {};
1620
1621    _this.getMode = function() {
1622      return _mode;
1623    };
1624
1625    _this.getLength = function(buffer) {
1626      return _data.length;
1627    };
1628
1629    _this.write = function(buffer) {
1630
1631      var s = _data;
1632
1633      var i = 0;
1634
1635      while (i + 1 < s.length) {
1636        buffer.put(
1637          getCode(s.charAt(i) ) * 45 +
1638          getCode(s.charAt(i + 1) ), 11);
1639        i += 2;
1640      }
1641
1642      if (i < s.length) {
1643        buffer.put(getCode(s.charAt(i) ), 6);
1644      }
1645    };
1646
1647    var getCode = function(c) {
1648
1649      if ('0' <= c && c <= '9') {
1650        return c.charCodeAt(0) - '0'.charCodeAt(0);
1651      } else if ('A' <= c && c <= 'Z') {
1652        return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
1653      } else {
1654        switch (c) {
1655        case ' ' : return 36;
1656        case '$' : return 37;
1657        case '%' : return 38;
1658        case '*' : return 39;
1659        case '+' : return 40;
1660        case '-' : return 41;
1661        case '.' : return 42;
1662        case '/' : return 43;
1663        case ':' : return 44;
1664        default :
1665          throw 'illegal char :' + c;
1666        }
1667      }
1668    };
1669
1670    return _this;
1671  };
1672
1673  //---------------------------------------------------------------------
1674  // qr8BitByte
1675  //---------------------------------------------------------------------
1676
1677  var qr8BitByte = function(data) {
1678
1679    var _mode = QRMode.MODE_8BIT_BYTE;
1680    var _data = data;
1681    var _bytes = qrcode.stringToBytes(data);
1682
1683    var _this = {};
1684
1685    _this.getMode = function() {
1686      return _mode;
1687    };
1688
1689    _this.getLength = function(buffer) {
1690      return _bytes.length;
1691    };
1692
1693    _this.write = function(buffer) {
1694      for (var i = 0; i < _bytes.length; i += 1) {
1695        buffer.put(_bytes[i], 8);
1696      }
1697    };
1698
1699    return _this;
1700  };
1701
1702  //---------------------------------------------------------------------
1703  // qrKanji
1704  //---------------------------------------------------------------------
1705
1706  var qrKanji = function(data) {
1707
1708    var _mode = QRMode.MODE_KANJI;
1709    var _data = data;
1710
1711    var stringToBytes = qrcode.stringToBytesFuncs['SJIS'];
1712    if (!stringToBytes) {
1713      throw 'sjis not supported.';
1714    }
1715    !function(c, code) {
1716      // self test for sjis support.
1717      var test = stringToBytes(c);
1718      if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {
1719        throw 'sjis not supported.';
1720      }
1721    }('\u53cb', 0x9746);
1722
1723    var _bytes = stringToBytes(data);
1724
1725    var _this = {};
1726
1727    _this.getMode = function() {
1728      return _mode;
1729    };
1730
1731    _this.getLength = function(buffer) {
1732      return ~~(_bytes.length / 2);
1733    };
1734
1735    _this.write = function(buffer) {
1736
1737      var data = _bytes;
1738
1739      var i = 0;
1740
1741      while (i + 1 < data.length) {
1742
1743        var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);
1744
1745        if (0x8140 <= c && c <= 0x9FFC) {
1746          c -= 0x8140;
1747        } else if (0xE040 <= c && c <= 0xEBBF) {
1748          c -= 0xC140;
1749        } else {
1750          throw 'illegal char at ' + (i + 1) + '/' + c;
1751        }
1752
1753        c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);
1754
1755        buffer.put(c, 13);
1756
1757        i += 2;
1758      }
1759
1760      if (i < data.length) {
1761        throw 'illegal char at ' + (i + 1);
1762      }
1763    };
1764
1765    return _this;
1766  };
1767
1768  //=====================================================================
1769  // GIF Support etc.
1770  //
1771
1772  //---------------------------------------------------------------------
1773  // byteArrayOutputStream
1774  //---------------------------------------------------------------------
1775
1776  var byteArrayOutputStream = function() {
1777
1778    var _bytes = [];
1779
1780    var _this = {};
1781
1782    _this.writeByte = function(b) {
1783      _bytes.push(b & 0xff);
1784    };
1785
1786    _this.writeShort = function(i) {
1787      _this.writeByte(i);
1788      _this.writeByte(i >>> 8);
1789    };
1790
1791    _this.writeBytes = function(b, off, len) {
1792      off = off || 0;
1793      len = len || b.length;
1794      for (var i = 0; i < len; i += 1) {
1795        _this.writeByte(b[i + off]);
1796      }
1797    };
1798
1799    _this.writeString = function(s) {
1800      for (var i = 0; i < s.length; i += 1) {
1801        _this.writeByte(s.charCodeAt(i) );
1802      }
1803    };
1804
1805    _this.toByteArray = function() {
1806      return _bytes;
1807    };
1808
1809    _this.toString = function() {
1810      var s = '';
1811      s += '[';
1812      for (var i = 0; i < _bytes.length; i += 1) {
1813        if (i > 0) {
1814          s += ',';
1815        }
1816        s += _bytes[i];
1817      }
1818      s += ']';
1819      return s;
1820    };
1821
1822    return _this;
1823  };
1824
1825  //---------------------------------------------------------------------
1826  // base64EncodeOutputStream
1827  //---------------------------------------------------------------------
1828
1829  var base64EncodeOutputStream = function() {
1830
1831    var _buffer = 0;
1832    var _buflen = 0;
1833    var _length = 0;
1834    var _base64 = '';
1835
1836    var _this = {};
1837
1838    var writeEncoded = function(b) {
1839      _base64 += String.fromCharCode(encode(b & 0x3f) );
1840    };
1841
1842    var encode = function(n) {
1843      if (n < 0) {
1844        // error.
1845      } else if (n < 26) {
1846        return 0x41 + n;
1847      } else if (n < 52) {
1848        return 0x61 + (n - 26);
1849      } else if (n < 62) {
1850        return 0x30 + (n - 52);
1851      } else if (n == 62) {
1852        return 0x2b;
1853      } else if (n == 63) {
1854        return 0x2f;
1855      }
1856      throw 'n:' + n;
1857    };
1858
1859    _this.writeByte = function(n) {
1860
1861      _buffer = (_buffer << 8) | (n & 0xff);
1862      _buflen += 8;
1863      _length += 1;
1864
1865      while (_buflen >= 6) {
1866        writeEncoded(_buffer >>> (_buflen - 6) );
1867        _buflen -= 6;
1868      }
1869    };
1870
1871    _this.flush = function() {
1872
1873      if (_buflen > 0) {
1874        writeEncoded(_buffer << (6 - _buflen) );
1875        _buffer = 0;
1876        _buflen = 0;
1877      }
1878
1879      if (_length % 3 != 0) {
1880        // padding
1881        var padlen = 3 - _length % 3;
1882        for (var i = 0; i < padlen; i += 1) {
1883          _base64 += '=';
1884        }
1885      }
1886    };
1887
1888    _this.toString = function() {
1889      return _base64;
1890    };
1891
1892    return _this;
1893  };
1894
1895  //---------------------------------------------------------------------
1896  // base64DecodeInputStream
1897  //---------------------------------------------------------------------
1898
1899  var base64DecodeInputStream = function(str) {
1900
1901    var _str = str;
1902    var _pos = 0;
1903    var _buffer = 0;
1904    var _buflen = 0;
1905
1906    var _this = {};
1907
1908    _this.read = function() {
1909
1910      while (_buflen < 8) {
1911
1912        if (_pos >= _str.length) {
1913          if (_buflen == 0) {
1914            return -1;
1915          }
1916          throw 'unexpected end of file./' + _buflen;
1917        }
1918
1919        var c = _str.charAt(_pos);
1920        _pos += 1;
1921
1922        if (c == '=') {
1923          _buflen = 0;
1924          return -1;
1925        } else if (c.match(/^\s$/) ) {
1926          // ignore if whitespace.
1927          continue;
1928        }
1929
1930        _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );
1931        _buflen += 6;
1932      }
1933
1934      var n = (_buffer >>> (_buflen - 8) ) & 0xff;
vendor: 7,216 bytes, lines 1935-2247
1935      _buflen -= 8;
1936      return n;
1937    };
1938
1939    var decode = function(c) {
1940      if (0x41 <= c && c <= 0x5a) {
1941        return c - 0x41;
1942      } else if (0x61 <= c && c <= 0x7a) {
1943        return c - 0x61 + 26;
1944      } else if (0x30 <= c && c <= 0x39) {
1945        return c - 0x30 + 52;
1946      } else if (c == 0x2b) {
1947        return 62;
1948      } else if (c == 0x2f) {
1949        return 63;
1950      } else {
1951        throw 'c:' + c;
1952      }
1953    };
1954
1955    return _this;
1956  };
1957
1958  //---------------------------------------------------------------------
1959  // gifImage (B/W)
1960  //---------------------------------------------------------------------
1961
1962  var gifImage = function(width, height) {
1963
1964    var _width = width;
1965    var _height = height;
1966    var _data = new Array(width * height);
1967
1968    var _this = {};
1969
1970    _this.setPixel = function(x, y, pixel) {
1971      _data[y * _width + x] = pixel;
1972    };
1973
1974    _this.write = function(out) {
1975
1976      //---------------------------------
1977      // GIF Signature
1978
1979      out.writeString('GIF87a');
1980
1981      //---------------------------------
1982      // Screen Descriptor
1983
1984      out.writeShort(_width);
1985      out.writeShort(_height);
1986
1987      out.writeByte(0x80); // 2bit
1988      out.writeByte(0);
1989      out.writeByte(0);
1990
1991      //---------------------------------
1992      // Global Color Map
1993
1994      // black
1995      out.writeByte(0x00);
1996      out.writeByte(0x00);
1997      out.writeByte(0x00);
1998
1999      // white
2000      out.writeByte(0xff);
2001      out.writeByte(0xff);
2002      out.writeByte(0xff);
2003
2004      //---------------------------------
2005      // Image Descriptor
2006
2007      out.writeString(',');
2008      out.writeShort(0);
2009      out.writeShort(0);
2010      out.writeShort(_width);
2011      out.writeShort(_height);
2012      out.writeByte(0);
2013
2014      //---------------------------------
2015      // Local Color Map
2016
2017      //---------------------------------
2018      // Raster Data
2019
2020      var lzwMinCodeSize = 2;
2021      var raster = getLZWRaster(lzwMinCodeSize);
2022
2023      out.writeByte(lzwMinCodeSize);
2024
2025      var offset = 0;
2026
2027      while (raster.length - offset > 255) {
2028        out.writeByte(255);
2029        out.writeBytes(raster, offset, 255);
2030        offset += 255;
2031      }
2032
2033      out.writeByte(raster.length - offset);
2034      out.writeBytes(raster, offset, raster.length - offset);
2035      out.writeByte(0x00);
2036
2037      //---------------------------------
2038      // GIF Terminator
2039      out.writeString(';');
2040    };
2041
2042    var bitOutputStream = function(out) {
2043
2044      var _out = out;
2045      var _bitLength = 0;
2046      var _bitBuffer = 0;
2047
2048      var _this = {};
2049
2050      _this.write = function(data, length) {
2051
2052        if ( (data >>> length) != 0) {
2053          throw 'length over';
2054        }
2055
2056        while (_bitLength + length >= 8) {
2057          _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );
2058          length -= (8 - _bitLength);
2059          data >>>= (8 - _bitLength);
2060          _bitBuffer = 0;
2061          _bitLength = 0;
2062        }
2063
2064        _bitBuffer = (data << _bitLength) | _bitBuffer;
2065        _bitLength = _bitLength + length;
2066      };
2067
2068      _this.flush = function() {
2069        if (_bitLength > 0) {
2070          _out.writeByte(_bitBuffer);
2071        }
2072      };
2073
2074      return _this;
2075    };
2076
2077    var getLZWRaster = function(lzwMinCodeSize) {
2078
2079      var clearCode = 1 << lzwMinCodeSize;
2080      var endCode = (1 << lzwMinCodeSize) + 1;
2081      var bitLength = lzwMinCodeSize + 1;
2082
2083      // Setup LZWTable
2084      var table = lzwTable();
2085
2086      for (var i = 0; i < clearCode; i += 1) {
2087        table.add(String.fromCharCode(i) );
2088      }
2089      table.add(String.fromCharCode(clearCode) );
2090      table.add(String.fromCharCode(endCode) );
2091
2092      var byteOut = byteArrayOutputStream();
2093      var bitOut = bitOutputStream(byteOut);
2094
2095      // clear code
2096      bitOut.write(clearCode, bitLength);
2097
2098      var dataIndex = 0;
2099
2100      var s = String.fromCharCode(_data[dataIndex]);
2101      dataIndex += 1;
2102
2103      while (dataIndex < _data.length) {
2104
2105        var c = String.fromCharCode(_data[dataIndex]);
2106        dataIndex += 1;
2107
2108        if (table.contains(s + c) ) {
2109
2110          s = s + c;
2111
2112        } else {
2113
2114          bitOut.write(table.indexOf(s), bitLength);
2115
2116          if (table.size() < 0xfff) {
2117
2118            if (table.size() == (1 << bitLength) ) {
2119              bitLength += 1;
2120            }
2121
2122            table.add(s + c);
2123          }
2124
2125          s = c;
2126        }
2127      }
2128
2129      bitOut.write(table.indexOf(s), bitLength);
2130
2131      // end code
2132      bitOut.write(endCode, bitLength);
2133
2134      bitOut.flush();
2135
2136      return byteOut.toByteArray();
2137    };
2138
2139    var lzwTable = function() {
2140
2141      var _map = {};
2142      var _size = 0;
2143
2144      var _this = {};
2145
2146      _this.add = function(key) {
2147        if (_this.contains(key) ) {
2148          throw 'dup key:' + key;
2149        }
2150        _map[key] = _size;
2151        _size += 1;
2152      };
2153
2154      _this.size = function() {
2155        return _size;
2156      };
2157
2158      _this.indexOf = function(key) {
2159        return _map[key];
2160      };
2161
2162      _this.contains = function(key) {
2163        return typeof _map[key] != 'undefined';
2164      };
2165
2166      return _this;
2167    };
2168
2169    return _this;
2170  };
2171
2172  var createDataURL = function(width, height, getPixel) {
2173    var gif = gifImage(width, height);
2174    for (var y = 0; y < height; y += 1) {
2175      for (var x = 0; x < width; x += 1) {
2176        gif.setPixel(x, y, getPixel(x, y) );
2177      }
2178    }
2179
2180    var b = byteArrayOutputStream();
2181    gif.write(b);
2182
2183    var base64 = base64EncodeOutputStream();
2184    var bytes = b.toByteArray();
2185    for (var i = 0; i < bytes.length; i += 1) {
2186      base64.writeByte(bytes[i]);
2187    }
2188    base64.flush();
2189
2190    return 'data:image/gif;base64,' + base64;
2191  };
2192
2193  //---------------------------------------------------------------------
2194  // returns qrcode function.
2195
2196  return qrcode;
2197}();
2198
2199// multibyte support
2200!function() {
2201
2202  qrcode.stringToBytesFuncs['UTF-8'] = function(s) {
2203    // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
2204    function toUTF8Array(str) {
2205      var utf8 = [];
2206      for (var i=0; i < str.length; i++) {
2207        var charcode = str.charCodeAt(i);
2208        if (charcode < 0x80) utf8.push(charcode);
2209        else if (charcode < 0x800) {
2210          utf8.push(0xc0 | (charcode >> 6),
2211              0x80 | (charcode & 0x3f));
2212        }
2213        else if (charcode < 0xd800 || charcode >= 0xe000) {
2214          utf8.push(0xe0 | (charcode >> 12),
2215              0x80 | ((charcode>>6) & 0x3f),
2216              0x80 | (charcode & 0x3f));
2217        }
2218        // surrogate pair
2219        else {
2220          i++;
2221          // UTF-16 encodes 0x10000-0x10FFFF by
2222          // subtracting 0x10000 and splitting the
2223          // 20 bits of 0x0-0xFFFFF into two halves
2224          charcode = 0x10000 + (((charcode & 0x3ff)<<10)
2225            | (str.charCodeAt(i) & 0x3ff));
2226          utf8.push(0xf0 | (charcode >>18),
2227              0x80 | ((charcode>>12) & 0x3f),
2228              0x80 | ((charcode>>6) & 0x3f),
2229              0x80 | (charcode & 0x3f));
2230        }
2231      }
2232      return utf8;
2233    }
2234    return toUTF8Array(s);
2235  };
2236
2237}();
2238
2239(function (factory) {
2240  if (typeof define === 'function' && define.amd) {
2241      define([], factory);
2242  } else if (typeof exports === 'object') {
2243      module.exports = factory();
2244  }
2245}(function () {
2246    return qrcode;
2247}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.