1//https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 2if (!Object.assign) { 3 Object.defineProperty(Object, "assign", { 4 enumerable: false, 5 configurable: true, 6 writable: true, 7 value: function(target, firstSource) { 8 "use strict"; 9 if (target === undefined || target === null) 10 throw new TypeError("Cannot convert first argument to object"); 11 var to = Object(target); 12 for (var i = 1; i < arguments.length; i++) { 13 var nextSource = arguments[i]; 14 if (nextSource === undefined || nextSource === null) continue; 15 var keysArray = Object.keys(Object(nextSource)); 16 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { 17 var nextKey = keysArray[nextIndex]; 18 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 19 if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey]; 20 } 21 } 22 return to; 23 } 24 }); 25} 26function gettype(obj){ 27 return Object.prototype.toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase(); 28} 29function str_pad (input, padLength, padString, padType) { // eslint-disable-line camelcase 30 // discuss at: http://locutus.io/php/str_pad/ 31 // original by: Kevin van Zonneveld (http://kvz.io) 32 // improved by: Michael White (http://getsprink.com) 33 // input by: Marco van Oort 34 // bugfixed by: Brett Zamir (http://brett-zamir.me) 35 // example 1: str_pad('Kevin van Zonneveld', 30, '-=', 'STR_PAD_LEFT') 36 // returns 1: '-=-=-=-=-=-Kevin van Zonneveld' 37 // example 2: str_pad('Kevin van Zonneveld', 30, '-', 'STR_PAD_BOTH') 38 // returns 2: '------Kevin van Zonneveld-----' 39 40 var half = '' 41 var padToGo 42 43 var _strPadRepeater = function (s, len) { 44 var collect = '' 45 46 while (collect.length < len) { 47 collect += s 48 } 49 collect = collect.substr(0, len) 50 51 return collect 52 } 53 54 input += '' 55 padString = padString !== undefined ? padString : ' ' 56 57 if (padType !== 'STR_PAD_LEFT' && padType !== 'STR_PAD_RIGHT' && padType !== 'STR_PAD_BOTH') { 58 padType = 'STR_PAD_RIGHT' 59 } 60 if ((padToGo = padLength - input.length) > 0) { 61 if (padType === 'STR_PAD_LEFT') { 62 input = _strPadRepeater(padString, padToGo) + input 63 } else if (padType === 'STR_PAD_RIGHT') { 64 input = input + _strPadRepeater(padString, padToGo) 65 } else if (padType === 'STR_PAD_BOTH') { 66 half = _strPadRepeater(padString, Math.ceil(padToGo / 2)) 67 input = half + input + half 68 input = input.substr(0, padLength) 69 } 70 } 71 72 return input 73} 74 75function ucfirst(str){ 76 str+=''; 77 var f = str.charAt(0).toUpperCase(); 78 return f + str.substr(1); 79} 80var pfx = (function () { 81 var style = document.createElement('dummy').style, 82 prefixes = 'Webkit Moz O ms Khtml'.split(' '), 83 memory = {}; 84 return function ( prop ) { 85 if ( typeof memory[ prop ] === "undefined" ) { 86 //å®ç°ä¸ä¸ªucfirst 87 var ucProp = ucfirst(prop), 88 //æ¿å°åç¼åç屿§å 89 props = (prop + ' ' + prefixes.join(ucProp + ' ') + ucProp).split(' '); 90 91 memory[ prop ] = null; 92 for ( var i in props ) { 93 if ( style[ props[i] ] !== undefined ) { 94 memory[ prop ] = props[i]; 95 break; 96 } 97 } 98 } 99 100 return memory[ prop ]; 101 }; 102})(); 103function whichTransitionEvent(){ 104 var t; 105 var el = document.createElement('p'); 106 var transitions = { 107 'transition':'transitionend', 108 'OTransition':'oTransitionEnd', 109 'MozTransition':'mozTransitionEnd', 110 'WebkitTransition':'webkitTransitionEnd', 111 'MsTransition':'msTransitionEnd' 112 } 113 for(t in transitions){ 114 if( el.style[t] !== undefined ){ 115 return transitions[t]; 116 } 117 } 118} 119(function(window){ 120 var instance = null; 121 var status = null; 122 var defaults = { 123 selector:"#jumbotron", 124 openFunc:'linear', 125 openDuration:800, 126 closeFunc:'linear', 127 closeDuration:500, 128 doSthBeforeOpen:function(){ 129 130 }, 131 doSthAfterOpen:function(){ 132 133 }, 134 doSthBeforeClose:function(){ 135 136 }, 137 doSthAfterClose:function(){ 138 139 }, 140 } 141 function Jumbotron(option){ 142 if(!(this instanceof Jumbotron)){ 143 return new Jumbotron(option); 144 } 145 if(!(instance instanceof Jumbotron)){ 146 // åå§å设置 147 this.option = Object.assign({},defaults,option); 148 this.init(); 149 instance = this; 150 } 151 return instance; 152 } 153 Jumbotron.prototype = { 154 constructor:Jumbotron, 155 init:function(){ 156 this.ele = document.querySelector(this.option.selector); 157 if(!this.ele){ 158 console.error('missing parameter'); 159 return; 160 } 161 this.oriDisplay = window.getComputedStyle(this.ele)['display']; 162 this.ele.style.display = "none"; 163 status = 0; 164 var _this = this; 165 this.ele.addEventListener(whichTransitionEvent(),function(){ 166 if(status==1){ 167 status = 2; 168 _this.ele.style.height = "auto"; 169 gettype(_this.option.doSthAfterOpen)==='function' && _this.option.doSthAfterOpen(); 170 }else if(status==3){ 171 status = 4; 172 _this.ele.style.display = "none"; 173 gettype(_this.option.doSthAfterClose)==='function' && _this.option.doSthAfterClose(); 174 } 175 }); 176 }, 177 open:function(){ 178 if(status!==0){ 179 return; 180 } 181 gettype(this.option.doSthBeforeOpen)==='function' && this.option.doSthBeforeOpen(); 182 this.ele.style[pfx('transition')] = "height " + this.option.openDuration + "ms "+ this.option.openFunc; 183 this.ele.style.cssText += "display:"+ this.oriDisplay + ";height:0;overflow:hidden;" 184 this.ele.style.height = this.ele.scrollHeight + 'px'; 185 status = 1; 186 }, 187 close:function(){ 188 if(status!=2){ 189 return; 190 } 191 gettype(this.option.doSthBeforeClose)==='function' && this.option.doSthBeforeClose(); 192 this.ele.style.height = getComputedStyle(this.ele)['height']; 193 this.ele.style[pfx('transition')] = "height " + this.option.closeDuration + "ms "+ this.option.closeFunc; 194 status = 3; 195 getComputedStyle(this.ele)['height']; 196 this.ele.style.height = 0; 197 } 198 } 199 window.jumbotron = Jumbotron; 200 window.Jumbotron = Jumbotron; 201})(window); 202 203 204(function(window){ 205 var transitionend = whichTransitionEvent(); 206 207 var defaults = { 208 selector:'.horizontalMove', 209 initialMove:0, 210 transition:'ease 600ms', 211 } 212 213 var winW = parseInt(getComputedStyle(document.documentElement).width); 214 215 function HorizontalMove(opt){ 216 if(!(this instanceof HorizontalMove)){ 217 return new HorizontalMove(opt); 218 } 219 this.options = Object.assign({},defaults,opt||{}); 220 this.ele = document.querySelector(this.options.selector); 221 if(!this.ele){ 222 console.error('selector is wrong'); 223 return; 224 } 225 this.dx = 0; 226 var elemW = parseInt(getComputedStyle(this.ele).width); 227 var offsetLeft = this.ele.getBoundingClientRect().left + document.body.scrollLeft; 228 console.log(offsetLeft,elemW) 229 var minX = winW - offsetLeft - elemW; 230 console.log(minX) 231 this.options.minX = minX; 232 this.options.transition = "transform "+ this.options.transition; 233 var initialMove = this.options.initialMove; 234 if(initialMove<0 && initialMove>minX){ 235 this.dx = initialMove; 236 this._setMove(initialMove); 237 } 238 239 this._bindEvent(); 240 } 241 242 HorizontalMove.prototype = { 243 constructor:HorizontalMove, 244 _bindEvent:function(){ 245 var _this = this; 246 touch.on(this.ele,'drag',function(event){ 247 var offx = _this.dx + event.x; 248 console.log(offx) 249 _this._setMove(offx); 250 }); 251 touch.on(this.ele,"dragend",function(event){ 252 _this.dx += event.x; 253 console.log(_this.dx) 254 if(_this.dx>0){ 255 _this._setTransition(_this.options.transition); 256 _this._setMove(0); 257 }else if(_this.dx<0&&_this.dx<_this.options.minX){ 258 _this._setTransition(_this.options.transition); 259 _this._setMove(_this.options.minX); 260 } 261 }); 262 this.ele.addEventListener(transitionend,function(event){ 263 _this._setTransition(''); 264 if(_this.dx>0){ 265 _this.dx = 0; 266 }else{ 267 _this.dx = _this.options.minX; 268 } 269 },false); 270 }, 271 _setMove:function(x){ 272 this.ele.style[pfx('transform')] = 'translate3d(' + x + 'px,0,0)'; 273 }, 274 _setTransition:function(str){ 275 this.ele.style[pfx('transition')] = str; 276 } 277 278 } 279 window.HorizontalMove = HorizontalMove; 280 window.horizontalMove = HorizontalMove; 281})(window); 282 283 284//info_load æ§å¶tabæ ç¾åæ¢ 285function info_load(module,menu){ 286 jQuery("#nav-"+module+" li").removeClass("active"); 287 jQuery("#nav-"+module+"-"+menu).addClass("active"); 288 jQuery(".info-"+module).addClass("d-none"); 289 jQuery("#info-"+module+"-"+menu).removeClass("d-none"); 290} 291if (!String.prototype.str_supplant) { 292 String.prototype.str_supplant = function (o) { 293 return this.replace(/{([^{}]*)}/g, 294 function (a, b) { 295 var r = o[b]; 296 return typeof r === 'string' || typeof r === 'number' ? r : a; 297 } 298 ); 299 }; 300}
301var cookieUtil = { 302 get: function (name){ 303 var cookieName = encodeURIComponent(name) + "=", 304 cookieStart = document.cookie.indexOf(cookieName), 305 cookieValue = null, 306 cookieEnd; 307 if (cookieStart > -1){ 308 cookieEnd = document.cookie.indexOf(";", cookieStart); 309 if (cookieEnd == -1){ 310 cookieEnd = document.cookie.length; 311 } 312 cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); 313 } 314 return cookieValue; 315 }, 316 set: function (name, value, expires, path, domain, secure) { 317 var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); 318 if (expires instanceof Date) { 319 cookieText += "; expires=" + expires.toGMTString(); 320 } 321 if (path) { 322 cookieText += "; path=" + path; 323 } 324 if (domain) { 325 cookieText += "; domain=" + domain; 326 } 327 if (secure) { 328 cookieText += "; secure"; 329 } 330 document.cookie = cookieText; 331 }, 332 unset: function (name, path, domain, secure){ 333 this.set(name, "", new Date(0), path, domain, secure); 334 } 335}; 336 337function get_more(action,id){ 338 get_mores({action:action,id:id}); 339} 340 341var get_more_counter = {}; 342function get_mores(opts){ 343 var dft_opt = { 344 action: 'index', 345 id:'#id', 346 isIndex:0, 347 page:'' 348 }; 349 opts = jQuery.extend({},dft_opt,opts); 350 var id = opts.id; 351 if (gettype(get_more_counter[id])=='undefined' || get_more_counter[id]==='NaN'){ 352 get_more_counter[id] = 0; 353 } 354 get_more_counter[id]++; 355 opts.get_more_counter = get_more_counter[id]; 356 console.log(opts); 357 debugger; 358 if ((opts.isIndex==1 && opts.get_more_counter==3 && opts.page!='')) { 359 window.location.href = opts.page; 360 return; 361 } 362 jQuery.post( 363 ajaxurl, 364 opts, 365 function(response){ 366 jQuery(opts.id).append(response); 367 checkScroll(); 368 } 369 ); 370} 371function get_more_categary(action,id,category,page){ 372 get_mores({action:action,id:id,category:category,isIndex:1,page:page}); 373} 374function get_more_index(action,id,page){ 375 get_mores({action:action,id:id,isIndex:1,page:page}); 376} 377function get_more_normal(action,id){ 378 get_mores({action:action,id:id,isIndex:0}); 379} 380function get_ajax_load(opts){ 381 var dft_opt = { 382 action: 'index', 383 id:'#id', 384 isIndex:0, 385 page:'' 386 }; 387 opts = jQuery.extend({},dft_opt,opts); 388 var id = opts.id; 389 390 jQuery.post( 391 ajaxurl, 392 opts, 393 function(response){ 394 jQuery(opts.id).html(response); 395 } 396 ); 397} 398 399/*! 400 * author:jieyou 401 * contacts:ç¾åº¦hi->youyo1122 402 * see https://github.com/jieyou/sinaWeiboShare 403 */ 404;(function(window){ 405 var sinaUrlPrefix = 'http://service.weibo.com/share/'+(/android|webos|ip(hone|ad|od)|opera (mini|mobi|tablet)|iemobile|windows.+(phone|touch)|mobile|fennec|kindle (Fire)|Silk|maemo|blackberry|playbook|bb10\; (touch|kbd)|Symbian(OS)|Ubuntu Touch/i.test(navigator.userAgent)?'mobile':'share')+'.php?' // see https://github.com/pinceladasdaweb/isMobile/blob/master/ismobile.js 406 407 // options 408 // titleætext [ç±»åString] å享å å®¹ï¼æ éencodeURI 409 // url [ç±»åString] åäº«é¾æ¥ï¼æ éencodeURI 410 // pic [ç±»åString] å享å¾ççurlï¼æ éencodeURIãæ°æµªçæ¥å£å¤å¼ å¾çå°æªå®å ¨å¼æ¾ï¼ææ¶åªè½å享ä¸å¼ 411 // ralateUid [ç±»åString æ Number] ç¸å ³å¾®åUidï¼å¦æææ¤é¡¹ï¼å享å 容ä¼èªå¨ @ç¸å ³å¾®å 412 // appkey [ç±»åString æ Number] åäº«æ¥æºçappkeyï¼å¦æææ¤é¡¹ï¼ä¼å¨å¾®åæ£æå°ä¸ï¼æ¾ç¤ºâæ¥èªXXXâ 413 function getUrl(options){ 414 var key,urlArray = [] 415 // æä»¬è°èµ·å®¢æ·ç«¯åäº«çæ¥å£ç¨text代表å享çå 容ï¼èsinaå¾®åçwebå享æ¥å£ç¨title表示å享çå 容ã为äºå ¼å®¹ååå°å·¥ä½éï¼å¯ä»¥ç¨text代表titleåæ° 416 if(options.text){ 417 options.title = options.text 418 delete options.text 419 } 420 if(options){ 421 for(key in options){ 422 if(options.hasOwnProperty(key)){ 423 switch(key){ 424 case 'url': 425 case 'pic': 426 case 'title': 427 urlArray.push(key+'='+encodeURIComponent(options[key])) 428 break; 429 case 'ralateUid': 430 case 'appkey': 431 urlArray.push(key+'='+options[key]) 432 break; 433 } 434 } 435 } 436 } 437 return sinaUrlPrefix+urlArray.join('&') 438 439 } 440 441 function action(optionsOrUrl){ 442 if(typeof(optionsOrUrl) != 'string'){ 443 optionsOrUrl = getUrl(optionsOrUrl) 444 } 445 try{ 446 window.open(optionsOrUrl) 447 }catch(e){} 448 } 449 450 window.sinaWeiboShare = { 451 action:action, 452 getUrl:getUrl 453 } 454 455})(window) 456 457 458// QRCODE
vendor: 33,168 bytes, lines 459-1072
459/** 460 * @fileoverview 461 * - Using the 'QRCode for Javascript library' 462 * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. 463 * - this library has no dependencies. 464 * 465 * @author davidshimjs 466 * @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a> 467 * @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a> 468 */ 469var QRCode; 470 471(function () { 472 //--------------------------------------------------------------------- 473 // QRCode for JavaScript 474 // 475 // Copyright (c) 2009 Kazuhiko Arase 476 // 477 // URL: http://www.d-project.com/ 478 // 479 // Licensed under the MIT license: 480 // http://www.opensource.org/licenses/mit-license.php 481 // 482 // The word "QR Code" is registered trademark of 483 // DENSO WAVE INCORPORATED 484 // http://www.denso-wave.com/qrcode/faqpatent-e.html 485 // 486 //--------------------------------------------------------------------- 487 function QR8bitByte(data) { 488 this.mode = QRMode.MODE_8BIT_BYTE; 489 this.data = data; 490 this.parsedData = []; 491 492 // Added to support UTF-8 Characters 493 for (var i = 0, l = this.data.length; i < l; i++) { 494 var byteArray = []; 495 var code = this.data.charCodeAt(i); 496 497 if (code > 0x10000) { 498 byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); 499 byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); 500 byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); 501 byteArray[3] = 0x80 | (code & 0x3F); 502 } else if (code > 0x800) { 503 byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); 504 byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); 505 byteArray[2] = 0x80 | (code & 0x3F); 506 } else if (code > 0x80) { 507 byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); 508 byteArray[1] = 0x80 | (code & 0x3F); 509 } else { 510 byteArray[0] = code; 511 } 512 513 this.parsedData.push(byteArray); 514 } 515 516 this.parsedData = Array.prototype.concat.apply([], this.parsedData); 517 518 if (this.parsedData.length != this.data.length) { 519 this.parsedData.unshift(191); 520 this.parsedData.unshift(187); 521 this.parsedData.unshift(239); 522 } 523 } 524 525 QR8bitByte.prototype = { 526 getLength: function (buffer) { 527 return this.parsedData.length; 528 }, 529 write: function (buffer) { 530 for (var i = 0, l = this.parsedData.length; i < l; i++) { 531 buffer.put(this.parsedData[i], 8); 532 } 533 } 534 }; 535 536 function QRCodeModel(typeNumber, errorCorrectLevel) { 537 this.typeNumber = typeNumber; 538 this.errorCorrectLevel = errorCorrectLevel; 539 this.modules = null; 540 this.moduleCount = 0; 541 this.dataCache = null; 542 this.dataList = []; 543 } 544 545 QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} 546 return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}} 547 this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);} 548 if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} 549 this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((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]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} 550 return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(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();}}} 551 return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;} 552 this.modules[r][6]=(r%2==0);} 553 for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;} 554 this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;} 555 for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} 556 for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} 557 for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} 558 this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);} 559 var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} 560 this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} 561 row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);} 562 var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;} 563 if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. (" 564 +buffer.getLengthInBits() 565 +">" 566 +totalDataCount*8 567 +")");} 568 if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} 569 while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} 570 while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} 571 buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} 572 buffer.put(QRCodeModel.PAD1,8);} 573 return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];} 574 offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}} 575 var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;} 576 var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}} 577 for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}} 578 return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={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]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} 579 return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} 580 return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} 581 return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));} 582 return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;} 583 for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;} 584 if(r==0&&c==0){continue;} 585 if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}} 586 if(sameCount>5){lostPoint+=(3+sameCount-5);}}} 587 for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}} 588 for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(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;}}} 589 for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(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;}}} 590 var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}} 591 var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");} 592 return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;} 593 while(n>=256){n-=255;} 594 return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;} 595 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];} 596 for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;} 597 function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);} 598 var offset=0;while(offset<num.length&&num[offset]==0){offset++;} 599 this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}} 600 QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);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)));}} 601 return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;} 602 var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);} 603 for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);} 604 return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;} 605 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){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);} 606 var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}} 607 return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;} 608 QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} 609 if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} 610 this.length++;}};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]]; 611 612 function _isSupportCanvas() { 613 return typeof CanvasRenderingContext2D != "undefined"; 614 } 615 616 // android 2.x doesn't support Data-URI spec 617 function _getAndroid() { 618 var android = false; 619 var sAgent = navigator.userAgent; 620 621 if (/android/i.test(sAgent)) { // android 622 android = true; 623 var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); 624 625 if (aMat && aMat[1]) { 626 android = parseFloat(aMat[1]); 627 } 628 } 629 630 return android; 631 } 632 633 var svgDrawer = (function() { 634 635 var Drawing = function (el, htOption) { 636 this._el = el; 637 this._htOption = htOption; 638 }; 639 640 Drawing.prototype.draw = function (oQRCode) { 641 var _htOption = this._htOption; 642 var _el = this._el; 643 var nCount = oQRCode.getModuleCount(); 644 var nWidth = Math.floor(_htOption.width / nCount); 645 var nHeight = Math.floor(_htOption.height / nCount); 646 647 this.clear(); 648 649 function makeSVG(tag, attrs) { 650 var el = document.createElementNS('http://www.w3.org/2000/svg', tag); 651 for (var k in attrs) 652 if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); 653 return el; 654 } 655 656 var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); 657 svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); 658 _el.appendChild(svg); 659 660 svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); 661 svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); 662 663 for (var row = 0; row < nCount; row++) { 664 for (var col = 0; col < nCount; col++) { 665 if (oQRCode.isDark(row, col)) { 666 var child = makeSVG("use", {"x": String(col), "y": String(row)}); 667 child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") 668 svg.appendChild(child); 669 } 670 } 671 } 672 }; 673 Drawing.prototype.clear = function () { 674 while (this._el.hasChildNodes()) 675 this._el.removeChild(this._el.lastChild); 676 }; 677 return Drawing; 678 })(); 679 680 var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; 681 682 // Drawing in DOM by using Table tag 683 var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { 684 var Drawing = function (el, htOption) { 685 this._el = el; 686 this._htOption = htOption; 687 }; 688 689 /** 690 * Draw the QRCode 691 * 692 * @param {QRCode} oQRCode 693 */ 694 Drawing.prototype.draw = function (oQRCode) { 695 var _htOption = this._htOption; 696 var _el = this._el; 697 var nCount = oQRCode.getModuleCount(); 698 var nWidth = Math.floor(_htOption.width / nCount); 699 var nHeight = Math.floor(_htOption.height / nCount); 700 var aHTML = ['<table style="border:0;border-collapse:collapse;">']; 701 702 for (var row = 0; row < nCount; row++) { 703 aHTML.push('<tr>'); 704 705 for (var col = 0; col < nCount; col++) { 706 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>'); 707 } 708 709 aHTML.push('</tr>'); 710 } 711 712 aHTML.push('</table>'); 713 _el.innerHTML = aHTML.join(''); 714 715 // Fix the margin values as real size. 716 var elTable = _el.childNodes[0]; 717 var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; 718 var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; 719 720 if (nLeftMarginTable > 0 && nTopMarginTable > 0) { 721 elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; 722 } 723 }; 724 725 /** 726 * Clear the QRCode 727 */ 728 Drawing.prototype.clear = function () { 729 this._el.innerHTML = ''; 730 }; 731 732 return Drawing; 733 })() : (function () { // Drawing in Canvas 734 function _onMakeImage() { 735 this._elImage.src = this._elCanvas.toDataURL("image/png"); 736 this._elImage.style.display = "block"; 737 this._elCanvas.style.display = "none"; 738 } 739 740 // Android 2.1 bug workaround 741 // http://code.google.com/p/android/issues/detail?id=5141 742 if (this._android && this._android <= 2.1) { 743 var factor = 1 / window.devicePixelRatio; 744 var drawImage = CanvasRenderingContext2D.prototype.drawImage; 745 CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { 746 if (("nodeName" in image) && /img/i.test(image.nodeName)) { 747 for (var i = arguments.length - 1; i >= 1; i--) { 748 arguments[i] = arguments[i] * factor; 749 } 750 } else if (typeof dw == "undefined") { 751 arguments[1] *= factor; 752 arguments[2] *= factor; 753 arguments[3] *= factor; 754 arguments[4] *= factor; 755 } 756 757 drawImage.apply(this, arguments); 758 }; 759 } 760 761 /** 762 * Check whether the user's browser supports Data URI or not 763 * 764 * @private 765 * @param {Function} fSuccess Occurs if it supports Data URI 766 * @param {Function} fFail Occurs if it doesn't support Data URI 767 */ 768 function _safeSetDataURI(fSuccess, fFail) { 769 var self = this; 770 self._fFail = fFail; 771 self._fSuccess = fSuccess; 772 773 // Check it just once 774 if (self._bSupportDataURI === null) { 775 var el = document.createElement("img"); 776 var fOnError = function() { 777 self._bSupportDataURI = false; 778 779 if (self._fFail) { 780 self._fFail.call(self); 781 } 782 }; 783 var fOnSuccess = function() { 784 self._bSupportDataURI = true; 785 786 if (self._fSuccess) { 787 self._fSuccess.call(self); 788 } 789 }; 790 791 el.onabort = fOnError; 792 el.onerror = fOnError; 793 el.onload = fOnSuccess; 794 el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. 795 return; 796 } else if (self._bSupportDataURI === true && self._fSuccess) { 797 self._fSuccess.call(self); 798 } else if (self._bSupportDataURI === false && self._fFail) { 799 self._fFail.call(self); 800 } 801 }; 802 803 /** 804 * Drawing QRCode by using canvas 805 * 806 * @constructor 807 * @param {HTMLElement} el 808 * @param {Object} htOption QRCode Options 809 */ 810 var Drawing = function (el, htOption) { 811 this._bIsPainted = false; 812 this._android = _getAndroid(); 813 814 this._htOption = htOption; 815 this._elCanvas = document.createElement("canvas"); 816 this._elCanvas.width = htOption.width; 817 this._elCanvas.height = htOption.height; 818 el.appendChild(this._elCanvas); 819 this._el = el; 820 this._oContext = this._elCanvas.getContext("2d"); 821 this._bIsPainted = false; 822 this._elImage = document.createElement("img"); 823 this._elImage.alt = "Scan me!"; 824 this._elImage.style.display = "none"; 825 this._el.appendChild(this._elImage); 826 this._bSupportDataURI = null; 827 }; 828 829 /** 830 * Draw the QRCode 831 * 832 * @param {QRCode} oQRCode 833 */ 834 Drawing.prototype.draw = function (oQRCode) { 835 var _elImage = this._elImage; 836 var _oContext = this._oContext; 837 var _htOption = this._htOption; 838 839 var nCount = oQRCode.getModuleCount(); 840 var nWidth = _htOption.width / nCount; 841 var nHeight = _htOption.height / nCount; 842 var nRoundedWidth = Math.round(nWidth); 843 var nRoundedHeight = Math.round(nHeight); 844 845 _elImage.style.display = "none"; 846 this.clear(); 847 848 for (var row = 0; row < nCount; row++) { 849 for (var col = 0; col < nCount; col++) { 850 var bIsDark = oQRCode.isDark(row, col); 851 var nLeft = col * nWidth; 852 var nTop = row * nHeight; 853 _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; 854 _oContext.lineWidth = 1; 855 _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; 856 _oContext.fillRect(nLeft, nTop, nWidth, nHeight); 857 858 // ìí° ì¨ë¦¬ì´ì± ë°©ì§ ì²ë¦¬ 859 _oContext.strokeRect( 860 Math.floor(nLeft) + 0.5, 861 Math.floor(nTop) + 0.5, 862 nRoundedWidth, 863 nRoundedHeight 864 ); 865 866 _oContext.strokeRect( 867 Math.ceil(nLeft) - 0.5, 868 Math.ceil(nTop) - 0.5, 869 nRoundedWidth, 870 nRoundedHeight 871 ); 872 } 873 } 874 875 this._bIsPainted = true; 876 }; 877 878 /** 879 * Make the image from Canvas if the browser supports Data URI. 880 */ 881 Drawing.prototype.makeImage = function () { 882 if (this._bIsPainted) { 883 _safeSetDataURI.call(this, _onMakeImage); 884 } 885 }; 886 887 /** 888 * Return whether the QRCode is painted or not 889 * 890 * @return {Boolean} 891 */ 892 Drawing.prototype.isPainted = function () { 893 return this._bIsPainted; 894 }; 895 896 /** 897 * Clear the QRCode 898 */ 899 Drawing.prototype.clear = function () { 900 this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); 901 this._bIsPainted = false; 902 }; 903 904 /** 905 * @private 906 * @param {Number} nNumber 907 */ 908 Drawing.prototype.round = function (nNumber) { 909 if (!nNumber) { 910 return nNumber; 911 } 912 913 return Math.floor(nNumber * 1000) / 1000; 914 }; 915 916 return Drawing; 917 })(); 918 919 /** 920 * Get the type by string length 921 * 922 * @private 923 * @param {String} sText 924 * @param {Number} nCorrectLevel 925 * @return {Number} type 926 */ 927 function _getTypeNumber(sText, nCorrectLevel) { 928 var nType = 1; 929 var length = _getUTF8Length(sText); 930 931 for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { 932 var nLimit = 0; 933 934 switch (nCorrectLevel) { 935 case QRErrorCorrectLevel.L : 936 nLimit = QRCodeLimitLength[i][0]; 937 break; 938 case QRErrorCorrectLevel.M : 939 nLimit = QRCodeLimitLength[i][1]; 940 break; 941 case QRErrorCorrectLevel.Q : 942 nLimit = QRCodeLimitLength[i][2]; 943 break; 944 case QRErrorCorrectLevel.H : 945 nLimit = QRCodeLimitLength[i][3]; 946 break; 947 } 948 949 if (length <= nLimit) { 950 break; 951 } else { 952 nType++; 953 } 954 } 955 956 if (nType > QRCodeLimitLength.length) { 957 throw new Error("Too long data"); 958 } 959 960 return nType; 961 } 962 963 function _getUTF8Length(sText) { 964 var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); 965 return replacedText.length + (replacedText.length != sText ? 3 : 0); 966 } 967 968 /** 969 * @class QRCode 970 * @constructor 971 * @example 972 * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); 973 * 974 * @example 975 * var oQRCode = new QRCode("test", { 976 * text : "http://naver.com", 977 * width : 128, 978 * height : 128 979 * }); 980 * 981 * oQRCode.clear(); // Clear the QRCode. 982 * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. 983 * 984 * @param {HTMLElement|String} el target element or 'id' attribute of element. 985 * @param {Object|String} vOption 986 * @param {String} vOption.text QRCode link data 987 * @param {Number} [vOption.width=256] 988 * @param {Number} [vOption.height=256] 989 * @param {String} [vOption.colorDark="#000000"] 990 * @param {String} [vOption.colorLight="#ffffff"] 991 * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] 992 */ 993 QRCode = function (el, vOption) { 994 this._htOption = { 995 width : 256, 996 height : 256, 997 typeNumber : 4, 998 colorDark : "#000000", 999 colorLight : "#ffffff", 1000 correctLevel : QRErrorCorrectLevel.H 1001 }; 1002 1003 if (typeof vOption === 'string') { 1004 vOption = { 1005 text : vOption 1006 }; 1007 } 1008 1009 // Overwrites options 1010 if (vOption) { 1011 for (var i in vOption) { 1012 this._htOption[i] = vOption[i]; 1013 } 1014 } 1015 1016 if (typeof el == "string") { 1017 el = document.getElementById(el); 1018 } 1019 1020 if (this._htOption.useSVG) { 1021 Drawing = svgDrawer; 1022 } 1023 1024 this._android = _getAndroid(); 1025 this._el = el; 1026 this._oQRCode = null; 1027 this._oDrawing = new Drawing(this._el, this._htOption); 1028 1029 if (this._htOption.text) { 1030 this.makeCode(this._htOption.text); 1031 } 1032 }; 1033 1034 /** 1035 * Make the QRCode 1036 * 1037 * @param {String} sText link data 1038 */ 1039 QRCode.prototype.makeCode = function (sText) { 1040 this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); 1041 this._oQRCode.addData(sText); 1042 this._oQRCode.make(); 1043 this._el.title = sText; 1044 this._oDrawing.draw(this._oQRCode); 1045 this.makeImage(); 1046 }; 1047 1048 /** 1049 * Make the Image from Canvas element 1050 * - It occurs automatically 1051 * - Android below 3 doesn't support Data-URI spec. 1052 * 1053 * @private 1054 */ 1055 QRCode.prototype.makeImage = function () { 1056 if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { 1057 this._oDrawing.makeImage(); 1058 } 1059 }; 1060 1061 /** 1062 * Clear the QRCode 1063 */ 1064 QRCode.prototype.clear = function () { 1065 this._oDrawing.clear(); 1066 }; 1067 1068 /** 1069 * @name QRCode.CorrectLevel 1070 */ 1071 QRCode.CorrectLevel = QRErrorCorrectLevel; 1072})();
1073// QRCODE END
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.