2017-05-11 22:54:52 +07:00
2018-05-11 03:30:12 +07:00
/ *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
GLOBAL VARIABLES
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* /
2017-05-10 02:32:46 +07:00
2021-11-14 23:56:31 +01:00
var APP _VERSION = '0.4.0' ;
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var qr _version = 1 ; //Current QR version (1-9)
var qr _pixel _size = 10 ; //Current view size of QR code (pixel per module)
2022-01-02 20:44:07 +01:00
var qr _pixel _size _togglesave = 10 ; //Last toggle view size of QR code (pixel per module)
2018-05-11 03:30:12 +07:00
var qr _size = 17 + ( qr _version * 4 ) ; //Current size of QR code
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var qr _array = [ ] ; //Main array to store QR data
var qr _format _array = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ; //Store QR format information
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var active _painter = "0" ; //Current active painter tool (0,1,2)
var fill _painter = false ; //Is flood fill tool active?
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var changed _state = false ; //Is document in changed state and not saved yet?
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var show _grey = true ; //Show grey modules in Decode mode
2019-01-29 09:26:13 +07:00
var extract _info _mode = false ; //Is Extract QR Information active?
2018-05-11 03:30:12 +07:00
var brute _force _mode = false ; //Is Brute-force Format Info active?
var analysis _mode = false ; //Is Data Analysis tool active?
2022-01-03 01:01:04 +01:00
var masking _mode = false ; //Is Masking active?
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var qr _temp _array = [ ] ; //Temporary variable to handle qr_array duplicates
var qr _data _block = [ ] ; //Array to store data block in "Data Analysis tool"
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var is _data _module = [ ] ; //Store data that separate between data module and fixed module (function pattern, alignment pattern, etc)
2017-05-10 02:32:46 +07:00
2018-05-11 03:30:12 +07:00
var history _array = [ ] ; //Store history information and its qr_array data
var active _history = - 1 ; //Current active history
2022-01-02 14:21:54 +01:00
const maxSupportedSize = 177 ; // max is 177 for v40
2022-01-02 15:28:37 +01:00
const maxVersion = 40 ; // max is not 50
2021-11-14 23:56:31 +01:00
2018-05-11 03:30:12 +07:00
/ * * *
*
* generate QR table based on qr _array
*
* * * /
2017-05-18 14:03:54 +07:00
function generateTable ( version ) {
2022-01-02 14:21:54 +01:00
qr _array = JSON . parse ( JSON . stringify ( generate _qr ( version ) ) ) ;
if ( version > 9 && version <= 20 ) {
qr _pixel _size = 5 ;
} else if ( version > 20 && version <= 35 ) {
qr _pixel _size = 2 ;
} else if ( version > 35 ) {
qr _pixel _size = 1 ;
}
2017-05-10 02:32:46 +07:00
changed _state = false ;
2017-05-18 14:03:54 +07:00
var element = "" ;
2017-05-10 02:32:46 +07:00
var size = 17 + ( version * 4 ) ;
2017-05-18 14:03:54 +07:00
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
element += "<tr>" ;
for ( var j = 0 ; j < qr _array . length ; j ++ ) {
if ( qr _array [ i ] [ j ] == 0 )
element += "<td class='static' id='qr-" + i + "-" + j + "'></td>" ;
else if ( qr _array [ i ] [ j ] == 1 )
element += "<td class='static black' id='qr-" + i + "-" + j + "'></td>" ;
else
element += "<td id='qr-" + i + "-" + j + "'></td>" ;
2017-05-10 02:32:46 +07:00
}
element += "</tr>" ;
}
2017-05-18 14:03:54 +07:00
$ ( "#qr-table" ) . html ( element ) ;
2017-05-10 02:32:46 +07:00
getInformation ( size ) ;
resize ( qr _pixel _size ) ;
is _data _module = getDataModule ( qr _array ) ;
updateToolbox ( ) ;
clearHistory ( ) ;
updateHistory ( "New QR code" ) ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* get format information value
*
* * * /
2017-05-10 02:32:46 +07:00
function getInformation ( size ) {
//Information top-left beside Finder
for ( var i = 0 ; i < 9 ; i ++ ) {
if ( i == 6 )
continue ;
2017-05-18 14:03:54 +07:00
$ ( "#qr-" + i + "-8" ) . removeClass ( "static" ) . addClass ( "info" ) ;
2017-05-10 02:32:46 +07:00
qr _array [ i ] [ 8 ] = 0 ;
}
//Information top-left below Finder
for ( var i = 0 ; i < 9 ; i ++ ) {
if ( i == 6 )
continue ;
2017-05-18 14:03:54 +07:00
$ ( "#qr-8-" + i ) . removeClass ( "static" ) . addClass ( "info" ) ;
2017-05-10 02:32:46 +07:00
qr _array [ 8 ] [ i ] = 0 ;
}
//Information top-right below Finder
for ( var i = size - 8 ; i < size ; i ++ ) {
2017-05-18 14:03:54 +07:00
$ ( "#qr-8-" + i ) . removeClass ( "static" ) . addClass ( "info" ) ;
2017-05-10 02:32:46 +07:00
qr _array [ 8 ] [ i ] = 0 ;
}
//Information bottom-left beside Finder and get Dark module
for ( var i = size - 8 ; i < size ; i ++ ) {
if ( i != size - 8 ) {
2017-05-18 14:03:54 +07:00
$ ( "#qr-" + i + "-8" ) . removeClass ( "static" ) . addClass ( "info" ) ;
2017-05-10 02:32:46 +07:00
qr _array [ i ] [ 8 ] = 0 ;
}
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* generate QR table in format information overlay dialog
*
* * * /
2017-05-10 02:32:46 +07:00
function generateInfoTable ( position ) {
position = position || "TOP_LEFT" ;
$ ( "#qr-format-info" ) . html ( "" ) ;
$ ( "#select-format-info-pos" ) . val ( position ) ;
var pattern _array = function _pattern _with _format _info [ position ] ;
if ( position == "TOP_LEFT" ) {
var start _index = 0 ;
var end _index = 15 ;
} else if ( position == "TOP_RIGHT" ) {
var start _index = 0 ;
var end _index = 8 ;
} else if ( position == "BOTTOM_LEFT" ) {
var start _index = 8 ;
var end _index = 15 ;
}
for ( var i = 0 ; i < pattern _array . length ; i ++ ) {
var element = "<tr>" ;
for ( var j = 0 ; j < pattern _array [ i ] . length ; j ++ ) {
if ( pattern _array [ i ] [ j ] == 0 ) {
element += "<td class='static'></td>" ;
} else if ( pattern _array [ i ] [ j ] == 1 ) {
element += "<td class='static black'></td>" ;
} else {
element += "<td id='qr-info-" + ( pattern _array [ i ] [ j ] - 2 ) + "'></td>" ;
}
}
element += "</tr>" ;
$ ( "#qr-format-info" ) . append ( element ) ;
}
for ( var i = start _index ; i < end _index ; i ++ ) {
if ( qr _format _array [ i ] == 1 ) {
$ ( "td#qr-info-" + i ) . addClass ( "black" ) ;
} else {
$ ( "td#qr-info-" + i ) . addClass ( "white" ) ;
}
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Save format information value to qr _format _array
*
* * * /
2017-05-10 02:32:46 +07:00
function saveInfoTable ( size ) {
for ( var i = 0 ; i < 8 ; i ++ ) {
if ( i > 5 )
qr _array [ i + 1 ] [ 8 ] = parseInt ( qr _format _array [ i ] ) ;
else
qr _array [ i ] [ 8 ] = parseInt ( qr _format _array [ i ] ) ;
qr _array [ 8 ] [ size - ( i + 1 ) ] = parseInt ( qr _format _array [ i ] ) ;
}
var index = 0 ;
for ( var i = 14 ; i >= 8 ; i -- ) {
if ( index > 5 )
qr _array [ 8 ] [ index + 1 ] = parseInt ( qr _format _array [ i ] ) ;
else
qr _array [ 8 ] [ index ] = parseInt ( qr _format _array [ i ] ) ;
qr _array [ size - ( index + 1 ) ] [ 8 ] = parseInt ( qr _format _array [ i ] ) ;
index ++ ;
}
refreshTable ( ) ;
$ ( "#format-information-box" ) . hide ( ) ;
changed _state = true ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Reload QR table based on qr _array value
*
* * * /
2017-05-10 02:32:46 +07:00
function refreshTable ( ) {
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
for ( var j = 0 ; j < qr _array [ i ] . length ; j ++ ) {
if ( ! $ ( "#qr-" + i + "-" + j ) . hasClass ( "static" ) ) {
$ ( "#qr-" + i + "-" + j ) . removeClass ( "black" ) ;
$ ( "#qr-" + i + "-" + j ) . removeClass ( "white" ) ;
if ( qr _array [ i ] [ j ] == 1 ) {
$ ( "#qr-" + i + "-" + j ) . addClass ( "black" ) ;
} else if ( qr _array [ i ] [ j ] == 0 ) {
$ ( "#qr-" + i + "-" + j ) . addClass ( "white" ) ;
}
}
}
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Update qr _array from new array ( exclude fixed pattern : function pattern , alignment pattern , timing , and version information )
*
* * * /
2017-12-09 12:03:09 +07:00
function updateQRArray ( new _data ) {
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
for ( var j = 0 ; j < qr _array [ i ] . length ; j ++ ) {
if ( is _data _module [ i ] [ j ] ) {
qr _array [ i ] [ j ] = new _data [ i ] [ j ] ;
}
}
}
2018-05-11 03:30:12 +07:00
//update format information when using image upload
var size = qr _size ;
for ( var i = 0 ; i < 8 ; i ++ ) {
if ( i > 5 )
qr _array [ i + 1 ] [ 8 ] = new _data [ i + 1 ] [ 8 ] ;
else
qr _array [ i ] [ 8 ] = new _data [ i ] [ 8 ] ;
qr _array [ 8 ] [ size - ( i + 1 ) ] = new _data [ 8 ] [ size - ( i + 1 ) ] ;
}
var index = 0 ;
for ( var i = 14 ; i >= 8 ; i -- ) {
if ( index > 5 )
qr _array [ 8 ] [ index + 1 ] = new _data [ 8 ] [ index + 1 ] ;
else
qr _array [ 8 ] [ index ] = new _data [ 8 ] [ index ] ; ;
qr _array [ size - ( index + 1 ) ] [ 8 ] = new _data [ size - ( index + 1 ) ] [ 8 ] ; ;
index ++ ;
}
2017-12-09 12:03:09 +07:00
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Get format information from format information overlay dialog
*
* * * /
2017-05-10 02:32:46 +07:00
function getInfoBits ( ) {
var result = { ecc : "" , mask : - 1 } ;
$ ( "#slider-mask div.active" ) . removeClass ( "active" ) ;
$ ( "#slider-ecc div.active" ) . removeClass ( "active" ) ;
var bits = "" ;
bits = qr _format _array . join ( "" ) ;
bits = bits . split ( "" ) . reverse ( ) . join ( "" ) ;
var raw _bits = [ bits . substring ( 0 , 2 ) , bits . substring ( 2 , 5 ) ] ;
var bch _bits = bits . substring ( 5 ) ;
if ( format _information _bits _raw . ecc . indexOf ( raw _bits [ 0 ] ) > - 1 ) {
if ( format _information _bits _raw . ecc . indexOf ( raw _bits [ 0 ] ) == 0 ) result . ecc = "L" ;
else if ( format _information _bits _raw . ecc . indexOf ( raw _bits [ 0 ] ) == 1 ) result . ecc = "M" ;
else if ( format _information _bits _raw . ecc . indexOf ( raw _bits [ 0 ] ) == 2 ) result . ecc = "Q" ;
else result . ecc = "H" ;
}
if ( format _information _bits _raw . mask . indexOf ( raw _bits [ 1 ] ) > - 1 ) {
result . mask = format _information _bits _raw . mask . indexOf ( raw _bits [ 1 ] ) ;
}
if ( format _information _bits [ 0 ] . indexOf ( bits ) > - 1 ) {
result . ecc = "L" ;
result . mask = format _information _bits [ 0 ] . indexOf ( bits ) ;
} else if ( format _information _bits [ 1 ] . indexOf ( bits ) > - 1 ) {
result . ecc = "M" ;
result . mask = format _information _bits [ 1 ] . indexOf ( bits ) ;
} else if ( format _information _bits [ 2 ] . indexOf ( bits ) > - 1 ) {
result . ecc = "Q" ;
result . mask = format _information _bits [ 2 ] . indexOf ( bits ) ;
} else if ( format _information _bits [ 3 ] . indexOf ( bits ) > - 1 ) {
result . ecc = "H" ;
result . mask = format _information _bits [ 3 ] . indexOf ( bits ) ;
}
console . log ( bits ) ;
return result ;
}
2022-01-04 17:51:27 +01:00
/ * * *
*
* Load Waidotto QR text format
* https : //github.com/waidotto/strong-qr-decoder
* * * /
2022-01-04 23:08:17 +01:00
function loadTxt2Array ( lines ) {
2022-01-04 17:51:27 +01:00
let sz = lines . length ;
2022-01-04 23:08:17 +01:00
var data = [ ] ;
for ( let i = 0 ; i < sz ; i ++ ) {
data [ i ] = [ ] ;
for ( let j = 0 ; j < sz ; j ++ ) {
switch ( lines [ i ] [ j ] )
{
case 'X' :
case 'x' :
case 'O' :
case 'o' :
case '#' :
case '1' :
data [ i ] . push ( 1 ) ;
break ;
case '_' :
case ' ' :
case '0' :
data [ i ] . push ( 0 ) ;
break ;
case '?' :
data [ i ] . push ( - 1 ) ; //grey
break ;
2022-01-04 17:51:27 +01:00
2022-01-04 23:08:17 +01:00
default :
throw "Error invalid text QR caracters"
2022-01-04 17:51:27 +01:00
}
}
}
2022-01-04 23:08:17 +01:00
return data ;
2022-01-04 17:51:27 +01:00
}
2022-01-04 23:08:17 +01:00
2022-01-04 13:37:50 +01:00
/ * * *
*
* Create text format compatible with Strong Decoder based on qr _array values
* from https : //github.com/saitouena/qrazybox/commit/b64a0580be81e0d091c544abae3fff5e246dc09c
* * * /
2022-01-04 23:08:17 +01:00
function dumpQRArray ( ) {
2022-01-04 13:37:50 +01:00
let sz = qr _array . length ;
dump _qr = "" ;
for ( let i = 0 ; i < sz ; i ++ ) {
2022-01-04 15:34:18 +01:00
let line = qr _array [ i ] . map ( x => ( x === 1 ? '#' : ( x === 0 ? '_' : ( show _grey ? '?' : '_' ) ) ) ) . join ( '' ) ;
2022-01-04 13:37:50 +01:00
console . log ( line ) ;
dump _qr += line + "\n"
}
return dump _qr ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* generate QR code made from canvas based on qr _array values
*
* * * /
2017-05-10 02:32:46 +07:00
function generateResult ( ) {
2022-01-04 13:37:50 +01:00
var c = document . getElementById ( "qr-result-canvas" ) ;
2022-01-02 16:34:14 +01:00
var size = 17 + ( qr _version * 4 ) ;
var ctx = c . getContext ( "2d" ) ;
c . width = qr _pixel _size * size ;
2017-05-10 02:32:46 +07:00
c . height = qr _pixel _size * size ;
2022-01-02 16:34:14 +01:00
// add quiet zone border and white fill
c . width += ( qr _pixel _size * 4 ) * 2 ;
c . height += ( qr _pixel _size * 4 ) * 2 ;
ctx . fillStyle = "#fff" ;
ctx . fillRect ( 0 , 0 , c . width , c . height ) ;
ctx . fillStyle = "#000" ;
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
for ( var j = 0 ; j < qr _array [ i ] . length ; j ++ ) {
var x = qr _pixel _size * j ;
var y = qr _pixel _size * i ;
//shift due to quiet zone
x += qr _pixel _size * 4 ;
y += qr _pixel _size * 4 ;
2017-05-10 02:32:46 +07:00
if ( qr _array [ i ] [ j ] == 1 ) {
ctx . fillStyle = "#000" ;
ctx . fillRect ( x , y , qr _pixel _size , qr _pixel _size ) ;
} else if ( qr _array [ i ] [ j ] == 0 ) {
ctx . fillStyle = "#fff" ;
ctx . fillRect ( x , y , qr _pixel _size , qr _pixel _size ) ;
} else {
if ( show _grey ) {
ctx . fillStyle = "#bdbdbd" ;
ctx . fillRect ( x , y , qr _pixel _size , qr _pixel _size ) ;
}
else {
ctx . fillStyle = "#fff" ;
ctx . fillRect ( x , y , qr _pixel _size , qr _pixel _size ) ;
}
}
}
}
2022-01-04 13:37:50 +01:00
$ ( "#qr-result-dump" ) . attr ( 'rows' , qr _version * 4 + 17 ) ;
$ ( "#qr-result-dump" ) . attr ( 'cols' , qr _version * 4 + 17 ) ;
$ ( "#qr-result-dump" ) . css ( 'font-family' , 'Courier New' ) ;
$ ( "#qr-result-dump" ) . css ( "font-size" , "7px" ) ;
2022-01-04 23:08:17 +01:00
$ ( "#qr-result-dump" ) . val ( dumpQRArray ( ) ) ;
2022-01-04 13:37:50 +01:00
2017-05-10 02:32:46 +07:00
$ ( "#qr-result" ) . show ( ) ;
$ ( "#qr-table" ) . hide ( ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . hide ( ) ;
2017-05-10 02:32:46 +07:00
$ ( "body" ) . css ( "background-color" , "#FFFFFF" ) ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Update toolbox values
*
* * * /
2017-05-10 02:32:46 +07:00
function updateToolbox ( ) {
$ ( "#qr-version" ) . val ( qr _size + "x" + qr _size + " (ver. " + qr _version + ")" ) ;
$ ( "#qr-size" ) . val ( qr _pixel _size + "px" ) ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Resize QR size
*
* * * /
2017-05-10 02:32:46 +07:00
function resize ( size ) {
$ ( "td" ) . each ( function ( ) {
$ ( this ) . css ( { "min-width" : size + "px" , "min-height" : size + "px" , "width" : size + "px" , "height" : size + "px" } ) ;
} )
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Toggle between Editor and Decode mode
*
* * * /
2017-05-10 02:32:46 +07:00
function toggleResult ( ) {
if ( ! $ ( "#btn-switch-mode" ) . hasClass ( "active" ) ) {
$ ( ".mode-indicator button" ) . removeClass ( "active" ) ;
$ ( "#mobile-decode-mode" ) . addClass ( "active" ) ;
2022-01-02 20:44:07 +01:00
//resize for decode ( minimum 2px module width needed for standard device decoding )
qr _pixel _size _togglesave = qr _pixel _size ;
if ( qr _pixel _size == 1 ) {
$ ( "#btn-size-plus" ) . trigger ( "click" ) ;
}
2017-05-10 02:32:46 +07:00
generateResult ( ) ;
$ ( "#btn-switch-mode" ) . addClass ( "active" ) ;
$ ( "#div-tool-work, #box-history" ) . hide ( ) ;
$ ( "#div-tool-result" ) . show ( ) ;
$ ( "#btn-switch-mode" ) . text ( "Decode Mode" ) ;
$ ( "#box-tools-masking" ) . hide ( ) ;
if ( brute _force _mode )
$ ( "#h6-brute-force-msg" ) . show ( ) ;
else
$ ( "#h6-brute-force-msg" ) . hide ( ) ;
2017-12-27 03:02:43 +07:00
if ( analysis _mode ) {
$ ( "#box-work" ) . show ( ) ;
$ ( "#box-tools-analysis" ) . hide ( ) ;
}
2017-05-10 02:32:46 +07:00
} else {
$ ( ".mode-indicator button" ) . removeClass ( "active" ) ;
$ ( "#mobile-editor-mode" ) . addClass ( "active" ) ;
2022-01-02 20:44:07 +01:00
//restore to previous encode mode pixel size
if ( qr _pixel _size - qr _pixel _size _togglesave >= 0 ) {
for ( i = qr _pixel _size - qr _pixel _size _togglesave ; i > 0 ; i -- ) {
$ ( "#btn-size-min" ) . trigger ( "click" ) ;
}
}
else {
for ( i = qr _pixel _size _togglesave - qr _pixel _size ; i > 0 ; i -- ) {
$ ( "#btn-size-plus" ) . trigger ( "click" ) ;
}
}
2017-05-10 02:32:46 +07:00
$ ( "#qr-result" ) . hide ( ) ;
$ ( ".qr-tab" ) . show ( ) ;
$ ( "#btn-switch-mode" ) . removeClass ( "active" ) ;
$ ( "body" ) . css ( "background-color" , "#eceff1" ) ;
$ ( "#div-tool-result" ) . hide ( ) ;
$ ( "#div-tool-work, #box-history" ) . show ( ) ;
$ ( "#btn-switch-mode" ) . text ( "Editor Mode" ) ;
2017-12-27 03:02:43 +07:00
if ( analysis _mode ) {
$ ( "#box-work" ) . hide ( ) ;
$ ( "#box-tools-analysis" ) . show ( ) ;
}
2017-05-10 02:32:46 +07:00
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Load image from file and put to { target }
*
* * * /
2017-05-10 02:32:46 +07:00
function loadImage ( input , target ) {
if ( input . files && input . files [ 0 ] ) {
var reader = new FileReader ( ) ;
reader . onload = function ( e ) {
$ ( target ) . attr ( "src" , e . target . result ) ;
}
reader . readAsDataURL ( input . files [ 0 ] ) ;
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Save project to LocalStorage
*
* * * /
2017-05-10 02:32:46 +07:00
function saveProject ( projectName ) {
if ( projectName == "" ) {
alert ( "Please, enter name of your Project!" ) ;
return ;
}
var saveData = [ qr _array , qr _version , qr _format _array ] ;
var dataList = JSON . parse ( localStorage . getItem ( "dataList" ) ) ;
var timeNow = new Date ( ) ;
var timeData = timeNow . toDateString ( ) ;
var projectNameList = [ ] ;
if ( dataList == undefined ) {
dataList = [ ] ;
}
for ( var i = 0 ; i < dataList . length ; i ++ ) {
projectNameList [ i ] = dataList [ i ] [ 0 ] ;
}
if ( ! projectNameList . includes ( projectName ) ) {
dataList . push ( [ projectName , timeData ] ) ;
} else {
var index = projectNameList . indexOf ( projectName ) ;
dataList [ index ] [ 1 ] = timeData ;
}
localStorage . setItem ( "saveData_" + projectName , JSON . stringify ( saveData ) ) ;
localStorage . setItem ( "dataList" , JSON . stringify ( dataList ) ) ;
$ ( "#div-save" ) . hide ( ) ;
changed _state = false ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Load project from LocalStorage
*
* * * /
2017-05-10 02:32:46 +07:00
function loadProject ( name ) {
if ( changed _state ) {
if ( ! confirm ( "Are you sure want to proceed?\nYour unsaved progress will be lost!" ) )
return ;
}
var loadedData = JSON . parse ( localStorage . getItem ( "saveData_" + name ) ) ;
qr _version = loadedData [ 1 ] ;
qr _size = 17 + ( qr _version * 4 ) ;
generateTable ( qr _version ) ;
qr _array = loadedData [ 0 ] ;
qr _format _array = loadedData [ 2 ] ;
brute _force _mode = false ;
$ ( "#tools-brute-force, #tools-unmasking" ) . removeClass ( "active" ) ;
refreshTable ( ) ;
$ ( "#qr-version" ) . val ( qr _size + "x" + qr _size + " (ver. " + qr _version + ")" ) ;
$ ( "#div-load" ) . hide ( ) ;
if ( $ ( "#btn-switch-mode" ) . hasClass ( "active" ) ) {
toggleResult ( ) ;
}
if ( $ ( "#div-extract" ) . css ( "display" ) != "none" ) {
$ ( "#btn-tools-extract" ) . trigger ( "click" ) ;
}
2017-12-27 03:02:43 +07:00
if ( analysis _mode ) {
$ ( "#tools-data-analysis" ) . trigger ( "click" ) ;
}
2017-05-10 02:32:46 +07:00
$ ( "#box-tools-masking" ) . hide ( ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . html ( "" ) ;
2017-05-10 02:32:46 +07:00
clearHistory ( ) ;
updateHistory ( "Load project" ) ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Remove project from LocalStorage
*
* * * /
2017-05-10 02:32:46 +07:00
function removeProject ( name , origin ) {
if ( confirm ( "Are you sure want to permanently delete this project?" ) ) {
var dataList = JSON . parse ( localStorage . getItem ( "dataList" ) ) ;
var projectNameList = [ ] ;
for ( var i = 0 ; i < dataList . length ; i ++ ) {
projectNameList [ i ] = dataList [ i ] [ 0 ] ;
}
var index = projectNameList . indexOf ( name ) ;
if ( index >= 0 ) {
dataList . remove ( index ) ;
localStorage . removeItem ( "saveData_" + name ) ;
localStorage . setItem ( "dataList" , JSON . stringify ( dataList ) ) ;
refreshLoadList ( origin ) ;
}
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Refresh list of project in LocalStorage
*
* * * /
2017-05-10 02:32:46 +07:00
function refreshLoadList ( origin ) {
var dataList = JSON . parse ( localStorage . getItem ( "dataList" ) ) ;
if ( dataList == undefined ) {
$ ( "#list-" + origin ) . html ( "<h5>There's no saved project in Local Storage.</h5>" ) ;
} else {
var element = "" ;
for ( var i = 0 ; i < dataList . length ; i ++ ) {
element += "<div><h5>" + dataList [ i ] [ 0 ] + "</h5><h6>" + dataList [ i ] [ 1 ] + "</h6><span>✖<span></div>" ;
}
$ ( "#list-" + origin ) . html ( element ) ;
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Decode Base64 to image
*
* * * /
2017-05-10 02:32:46 +07:00
function decodeFromBase64 ( img , callback ) {
qrcode . callback = callback ;
qrcode . decode ( img , callback ) ;
}
function importFromImage ( src , cb ) {
var img = new Image ( ) ;
img . crossOrigin = "Anonymous" ;
console . log ( src ) ;
img . onload = function ( ) {
var canvas _qr = document . createElement ( "canvas" ) ;
var context = canvas _qr . getContext ( '2d' ) ;
var nheight = img . height ;
var nwidth = img . width ;
if ( img . width * img . height > qrcode . maxImgSize ) {
var ir = img . width / img . height ;
nheight = Math . sqrt ( qrcode . maxImgSize / ir ) ;
nwidth = ir * nheight ;
}
canvas _qr . width = nwidth ;
canvas _qr . height = nheight ;
context . drawImage ( img , 0 , 0 , canvas _qr . width , canvas _qr . height ) ;
qrcode . width = canvas _qr . width ;
qrcode . height = canvas _qr . height ;
try {
qrcode . imagedata = context . getImageData ( 0 , 0 , canvas _qr . width , canvas _qr . height ) ;
} catch ( e ) {
cb ( e ) ;
return ;
}
var image = qrcode . grayScaleToBitmap ( qrcode . grayscale ( ) ) ;
var detector = new Detector ( image ) ;
try {
var qRCodeMatrix = detector . detect ( ) ;
} catch ( error ) {
console . log ( error ) ;
cb ( error ) ;
return ;
}
var qrArray = qRCodeMatrix . bits . bits ;
var size = qRCodeMatrix . bits . width ;
2021-11-14 23:56:31 +01:00
if ( size > maxSupportedSize ) {
2017-05-10 02:32:46 +07:00
alert ( "QR version is unsupported" ) ;
return ;
}
qr _size = size ;
qr _version = ( size - 17 ) / 4 ;
updateToolbox ( ) ;
var result = [ ] ;
for ( var x = 0 ; x < size ; x ++ ) {
result [ x ] = [ ] ;
for ( var y = 0 ; y < size ; y ++ ) {
result [ x ] [ y ] = qRCodeMatrix . bits . get _Renamed ( y , x ) ? 1 : 0 ;
}
}
cb ( result ) ;
}
img . src = src ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Flood fill algorithm to perform paint - like bucket tool
*
* Reference : https : //jsfiddle.net/eWxNE/2/
*
* * * /
2017-05-10 02:32:46 +07:00
function floodFill ( x , y , oldVal , newVal ) {
x = parseInt ( x ) ;
y = parseInt ( y ) ;
if ( oldVal == null ) {
oldVal = parseInt ( qr _array [ x ] [ y ] ) ;
}
if ( qr _array [ x ] [ y ] !== oldVal ) {
return ;
}
if ( is _data _module [ x ] [ y ] )
qr _array [ x ] [ y ] = parseInt ( newVal ) ;
else
return ;
if ( x > 0 ) {
floodFill ( x - 1 , y , oldVal , newVal ) ;
}
if ( y > 0 ) {
floodFill ( x , y - 1 , oldVal , newVal ) ;
}
if ( x < qr _size - 1 ) {
floodFill ( x + 1 , y , oldVal , newVal ) ;
}
if ( y < qr _size - 1 ) {
floodFill ( x , y + 1 , oldVal , newVal ) ;
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Update history
*
* * * /
2017-05-10 02:32:46 +07:00
function updateHistory ( msg ) {
if ( active _history < 10 ) active _history ++ ;
history _array = history _array . slice ( 0 , active _history ) ;
if ( history _array . length == 10 ) {
history _array . shift ( ) ;
}
history _array . push ( [ msg , JSON . stringify ( qr _array ) ] ) ;
var html = "" ;
for ( var i = history _array . length - 1 ; i >= 0 ; i -- ) {
if ( i == history _array . length - 1 ) {
html += "<div class='active' id='history-" + i + "'><h6>" + history _array [ i ] [ 0 ] + "</h6></div>" ;
} else {
html += "<div id='history-" + i + "'><h6>" + history _array [ i ] [ 0 ] + "</h6></div>" ;
}
}
$ ( ".history" ) . html ( html ) ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Get history value and refresh QR table
*
* * * /
2017-05-10 02:32:46 +07:00
function getHistory ( index ) {
qr _array = JSON . parse ( history _array [ index ] [ 1 ] ) ;
if ( qr _array . length != qr _size ) {
qr _size = qr _array . length ;
qr _version = ( qr _size - 17 ) / 4 ;
updateToolbox ( ) ;
}
refreshTable ( ) ;
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Clear all history value
*
* * * /
2017-05-10 02:32:46 +07:00
function clearHistory ( ) {
history _array = [ ] ;
active _history = - 1 ;
$ ( ".history" ) . html ( "" ) ;
}
2019-01-29 09:26:13 +07:00
/ * * *
*
* Display information text result in Extract QR Information tool and
* load it to # div - extract
*
* * * /
2017-05-10 02:32:46 +07:00
function extractInfo ( ) {
var data _array = JSON . stringify ( qr _array ) ;
var result = QRDecode ( JSON . parse ( data _array ) ) ;
var size = 17 + ( qr _version * 4 ) ;
console . log ( result ) ;
var html = "<h5>QR version : <span>" + qr _version + " (" + size + "x" + size + " ) < / s p a n > < / h 5 > \
< h5 > Error correction level : < span > "+result.ecc+" < / s p a n > < / h 5 > \
< h5 > Mask pattern : < span > "+result.mask_pattern+" < / s p a n > < / h 5 > \
< div class = \ "space\" > < / d i v > \
< h5 > Number of missing bytes ( erasures ) : < span > "+result.erasure_count+" bytes ( "+(result.erasure_count/result.data_module_count * 100).toFixed(2)+" % ) < / s p a n > < / h 5 > \
< div class = \ "space\" > < / d i v > \
< h5 > Data blocks : < / h 5 > \
< h5 > < span > "+result.data_blocks+" < / s p a n > < / h 5 > \
< div class = \ "space\"></div>" ;
if ( $ ( "#btn-extract-show-rs" ) . hasClass ( "active" ) ) {
for ( var i = 0 ; i < result . rs _block . length ; i ++ ) {
html += "<h5>----------------Block " + ( i + 1 ) + " -- -- -- -- -- -- -- -- < / h 5 > \
< h5 > Reed - Solomon Block : < span > "+result.rs_block[i]+" < / s p a n > < / h 5 > " ;
if ( result . syndrome [ i ] != undefined && result . error _count [ i ] != undefined ) {
console . log ( result . syndrome [ i ] , result . error _count ) ;
html += "<h5>Syndrome : <span>" + result . syndrome [ i ] + " < / s p a n > < / h 5 > \
< h5 > Number of Errors : < span > "+result.error_count[i]+" < / s p a n > < / h 5 > \
< h5 > Coefficient of the error location polynomial : < span > "+result.coeff_error[i]+" < / s p a n > < / h 5 > \
< h5 > Error Position : < span > "+result.error_position[i]+" < / s p a n > < / h 5 > \
< h5 > Error Magnitude : < span > "+result.error_magnitude[i]+" < / s p a n > < / h 5 > \
< div class = 'space' > < / d i v > " ;
} else {
html += "<div class='space'></div>" ;
}
}
}
html += " < h5 > Final data bits : < / h 5 > \
< h5 > < span > "+result.data_bits+" < / s p a n > < / h 5 > \
< div class = \ "space\"></div>" ;
for ( var i = 0 ; i < result . data _bits _count ; i ++ ) {
html += "<h5><span>" + result . data _bits _block [ i ] + " < / s p a n > < / h 5 > \
< h5 > Mode Indicator : < span > "+result.mode[i]+" < / s p a n > < / h 5 > \
< h5 > Character Count Indicator : < span > "+result.count[i]+" < / s p a n > < / h 5 > \
< h5 > Decoded data : < span > "+result.decoded[i]+" < / s p a n > < / h 5 > \
< div class = \ "space\"></div>" ;
}
html += "<h5>Final Decoded string : <span>" + result . message + "</span></h5>" ;
if ( $ ( "#btn-extract-show-error" ) . hasClass ( "active" ) && result . error . length > 0 ) {
html += "<div class='space'></div><h5>Error : </h5>" ;
for ( var i = 0 ; i < result . error . length ; i ++ ) {
html += "<h5><span> - " + result . error [ i ] + "</span></h5>" ;
}
}
$ ( "#div-extract" ) . html ( html ) ;
}
var brute _result = [ ] ;
var brute _result _index = [ ] ;
var current _brute _result = 0 ;
function callbackBruteForce ( ) {
console . log ( brute _result ) ;
if ( brute _result . length != 32 )
return ;
for ( var i = 0 ; i < brute _result . length ; i ++ ) {
if ( brute _result [ i ] != "error decoding QR Code" ) {
brute _result _index . push ( i ) ;
}
}
var true _count = brute _result _index . length ;
current _brute _result = 0 ;
if ( true _count > 0 ) {
var ecc = Math . floor ( brute _result _index [ 0 ] / 8 ) ;
var mask = brute _result _index [ 0 ] % 8 ;
qr _format _array = format _information _bits [ ecc ] [ mask ] . split ( "" ) . reverse ( ) ;
if ( ecc == 0 )
ecc = "L" ;
else if ( ecc == 1 )
ecc = "M" ;
else if ( ecc == 2 )
ecc = "Q" ;
else if ( ecc == 3 )
ecc = "H" ;
$ ( "#brute-force-msg-wait" ) . hide ( ) ;
$ ( "#brute-force-msg-fail" ) . hide ( ) ;
$ ( "#brute-force-content" ) . show ( ) ;
$ ( "#btn-brute-force-apply-pattern" ) . show ( ) ;
$ ( "#brute-force-decoded-data" ) . val ( brute _result [ brute _result _index [ current _brute _result ] ] ) ;
$ ( "#brute-force-ecc span" ) . text ( ecc ) ;
$ ( "#brute-force-mask span" ) . text ( mask ) ;
$ ( "#brute-force-result-counter" ) . text ( "1 of " + true _count + " result" ) ;
saveInfoTable ( qr _size ) ;
generateResult ( ) ;
$ ( "#tools-brute-force" ) . trigger ( "click" ) ;
} else {
$ ( "#brute-force-msg-wait" ) . hide ( ) ;
$ ( "#brute-force-msg-fail" ) . show ( ) ;
$ ( "#btn-brute-force-apply-pattern" ) . show ( ) ;
qr _format _array = [ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ] ;
saveInfoTable ( qr _size ) ;
generateResult ( ) ;
updateHistory ( "Update format info pattern" ) ;
}
}
function bruteForceFormatInfo ( ) {
brute _result = [ ] ;
brute _result _index = [ ] ;
var possible _ecc = [ "L" , "M" , "Q" , "H" ] ;
var possible _mask = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
for ( var i = 0 ; i < possible _ecc . length ; i ++ ) {
for ( var j = 0 ; j < possible _mask . length ; j ++ ) {
qr _format _array = format _information _bits [ i ] [ j ] . split ( "" ) . reverse ( ) ;
saveInfoTable ( qr _size ) ;
generateResult ( ) ;
2022-01-04 13:37:50 +01:00
var image = document . getElementById ( "qr-result-canvas" ) . toDataURL ( ) ;
2017-05-10 02:32:46 +07:00
if ( i == 3 && j == 7 ) {
decodeFromBase64 ( image , function ( data ) {
brute _result . push ( data ) ;
callbackBruteForce ( ) ;
} )
} else {
decodeFromBase64 ( image , function ( data ) {
brute _result . push ( data ) ;
} )
}
}
}
}
2018-05-11 03:30:12 +07:00
/ * * *
*
* Mask qr _array with mask _pattern and refresh QR table
*
* * * /
2017-05-10 02:32:46 +07:00
function maskDataBits ( ) {
var mask _pattern = getFormatInfo ( qr _array ) . mask ;
qr _array = maskData ( qr _array , mask _pattern ) ;
refreshTable ( ) ;
updateHistory ( "Data masking" ) ;
}
function showMaskPatternArea ( ) {
var qr _mask _array = [ ] ;
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
qr _mask _array [ i ] = [ ] ;
for ( var j = 0 ; j < qr _array [ i ] . length ; j ++ ) {
qr _mask _array [ i ] [ j ] = 0 ;
}
}
var mask _pattern = getFormatInfo ( qr _array ) . mask ;
qr _mask _array = maskData ( qr _mask _array , mask _pattern ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . html ( "" ) ;
2017-05-10 02:32:46 +07:00
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
var html = "<tr>" ;
for ( var j = 0 ; j < qr _array [ i ] . length ; j ++ ) {
if ( $ ( "#qr-" + i + "-" + j ) . hasClass ( "info" ) || $ ( "#qr-" + i + "-" + j ) . hasClass ( "static" ) ) {
html += "<td class='invisible'></td>" ;
} else {
if ( qr _mask _array [ i ] [ j ] == 0 )
html += "<td class='invisible'></td>" ;
else
html += "<td></td>" ;
}
}
html += "</tr>" ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . append ( html ) ;
2017-05-10 02:32:46 +07:00
}
resize ( qr _pixel _size ) ;
}
2022-01-06 02:00:24 +01:00
function patchingRecovery ( result ) {
var warning = 0 ;
2017-05-10 02:32:46 +07:00
$ ( "#qr-dummy" ) . html ( "" ) ;
2022-01-06 02:00:24 +01:00
$ ( "#div-patch-rec-warning, #div-patch-rec-error" ) . hide ( ) ;
$ ( "#div-patch-rec-data, #btn-patch-rec-apply" ) . show ( )
2017-05-10 02:32:46 +07:00
if ( typeof result == "string" ) {
2022-01-06 02:00:24 +01:00
$ ( "#div-patch-rec-error" ) . show ( ) ;
$ ( "#div-patch-rec-error textarea" ) . val ( result ) ;
$ ( "#div-patch-rec-warning, #div-patch-rec-data, #btn-patch-rec-apply" ) . hide ( ) ;
2017-05-10 02:32:46 +07:00
return ;
}
for ( var i = 0 ; i < result . result _array . length ; i ++ ) {
var elem = "<tr>" ;
for ( var j = 0 ; j < result . result _array [ i ] . length ; j ++ ) {
if ( qr _array [ i ] [ j ] != result . result _array [ i ] [ j ] ) {
if ( result . result _array [ i ] [ j ] == 0 )
elem += "<td class='green white'></td>" ;
else if ( result . result _array [ i ] [ j ] == 1 )
elem += "<td class='green black'></td>" ;
else
elem += "<td></td>" ;
} else {
if ( result . result _array [ i ] [ j ] == 0 )
elem += "<td class='white'></td>" ;
else if ( result . result _array [ i ] [ j ] == 1 )
elem += "<td class='black'></td>" ;
else
elem += "<td></td>" ;
}
}
elem += "</tr>" ;
$ ( "#qr-dummy" ) . append ( elem ) ;
2022-01-02 14:21:54 +01:00
resize ( qr _pixel _size ) ;
2017-05-10 02:32:46 +07:00
}
for ( var i = 0 ; i < result . after . length ; i ++ ) {
if ( result . before . charAt ( i ) != "?" ) {
if ( result . after . charAt ( i ) != result . before . charAt ( i ) ) {
2022-01-06 02:00:24 +01:00
warning ++ ;
2017-05-10 02:32:46 +07:00
}
}
}
if ( warning ) {
2022-01-06 02:00:24 +01:00
$ ( "#div-patch-rec-warning" ) . show ( ) ;
$ ( "#div-patch-rec-warning textarea" ) . val ( "There's are " + warning + " modules conflict with the already known module of original QR code. Correction may fail." )
2017-05-10 02:32:46 +07:00
}
2022-01-06 02:00:24 +01:00
$ ( "#patch-rec-before" ) . val ( result . before ) ;
$ ( "#patch-rec-after" ) . val ( result . after ) ;
2017-05-10 02:32:46 +07:00
qr _temp _array = Array . prototype . slice . call ( result . result _array ) ;
}
2022-01-06 02:00:24 +01:00
2018-05-11 03:30:12 +07:00
/ * * *
*
* Perform Reed - Solomon decode
*
* * * /
2017-05-10 02:32:46 +07:00
function reedSolomonDecode ( data , nysm ) {
var result = [ ] ;
2018-05-11 03:30:12 +07:00
//console.log('nysm: '+nysm, 'data: '+data);
2017-05-10 02:32:46 +07:00
for ( var i = 0 ; i < data . length ; i ++ ) {
var err _pos = [ ] ;
for ( var j = 0 ; j < data [ i ] . length ; j ++ ) {
if ( data [ i ] [ j ] == 0 )
err _pos . push ( j ) ;
}
var decoded = RS . decode ( data [ i ] , nysm , err _pos ) ;
if ( typeof decoded == "string" ) {
$ ( "#rs-decoder-error" ) . text ( "ERROR: " + decoded ) . removeClass ( "invisible" ) ;
$ ( "#rs-decoder-output, #rs-decoder-final-msg" ) . val ( "" ) ;
return ;
}
result = result . concat ( decoded ) ;
}
$ ( "#rs-decoder-output" ) . val ( result . join ( "," ) ) ;
var data _bits = "" ;
for ( var i = 0 ; i < result . length ; i ++ ) {
var pad = "00000000" ;
var text = parseInt ( result [ i ] ) . toString ( 2 ) ;
var remain = ( pad + text ) . length - 8 ;
text = ( pad + text ) . slice ( remain ) ;
data _bits += text ;
}
var readed _data = readDataBits ( data _bits ) ;
if ( readed _data != '' )
$ ( "#rs-decoder-final-msg" ) . val ( readed _data ) ;
else {
$ ( "#rs-decoder-error" ) . text ( "ERROR: Data can't be readed" ) . removeClass ( "invisible" ) ;
$ ( "#rs-decoder-final-msg" ) . val ( "" ) ;
}
}
2017-12-27 03:02:43 +07:00
function showQRTableOverlay ( ) {
$ ( "#qr-overlay" ) . html ( "" ) ;
for ( var i = 0 ; i < qr _array . length ; i ++ ) {
var html = "<tr>" ;
for ( var j = 0 ; j < qr _array [ i ] . length ; j ++ ) {
if ( $ ( "#qr-" + i + "-" + j ) . hasClass ( "info" ) || $ ( "#qr-" + i + "-" + j ) . hasClass ( "static" ) ) {
html += "<td class='invisible'></td>" ;
} else {
html += "<td index='" + i + "-" + j + "' style='opacity:0;'></td>" ;
}
}
html += "</tr>" ;
$ ( "#qr-overlay" ) . append ( html ) ;
}
resize ( qr _pixel _size ) ;
}
function activateAnalysisMode ( status ) {
status = status || "true" ;
if ( status === "true" ) {
$ ( "#qr-table tr td" ) . css ( { "pointer-events" : "none" , "border-color" : "transparent" } ) ;
$ ( "#qr-table tr td.static, #qr-table tr td.info" ) . css ( "opacity" , "0.2" ) ;
generateDataBlocks ( ) ;
} else if ( status === "false" ) {
$ ( "#qr-table tr td" ) . css ( { "opacity" : "1" , "pointer-events" : "auto" , "border-color" : "#434A54" } ) ;
$ ( "#qr-table tr td.static, #qr-table tr td.info" ) . css ( "opacity" , "1" ) ;
$ ( "#qr-overlay" ) . html ( "" ) ;
}
}
var module _order = [ ] ;
function pushBlock ( type , value , decoded ) {
var modules = [ ] ;
for ( var k = 0 ; k < value . length ; k ++ ) {
modules . push ( module _order . shift ( ) ) ;
}
var obj = { value : value , type : type , decoded : decoded , modules : modules } ;
qr _data _block . push ( obj ) ;
}
function generateDataBlocks ( ) {
qr _data _block = [ ] ;
var format _info = getFormatInfo ( qr _array ) ;
var mask _pattern = format _info . mask ;
var ecc _level = format _info . ecc ;
if ( RS _block _num _table [ qr _version - 1 ] [ ecc _level ] > 1 ) {
alert ( 'Interleaved blocks is not supported yet!' ) ;
return ;
}
var unmasked _data _array = maskData ( qr _array , mask _pattern ) ;
var decoded _data = readDataBlock ( qr _array ) ;
var data _block = decoded _data . blocks ;
module _order = decoded _data . module _order ;
while ( data _block . length != 1 ) {
if ( data _block . substring ( 0 , 4 ) == "0001" ) {
var enc _mode = "Numeric mode" ;
} else if ( data _block . substring ( 0 , 4 ) == "0010" ) {
var enc _mode = "Alphanumeric mode" ;
} else if ( data _block . substring ( 0 , 4 ) == "0100" ) {
var enc _mode = "Binary mode" ;
} else if ( data _block . substring ( 0 , 4 ) == "0000" ) {
var enc _mode = "Terminator" ;
} else {
break ;
}
pushBlock (
"Mode indicator" ,
data _block . substring ( 0 , 4 ) ,
enc _mode
) ;
data _block = data _block . substring ( 4 ) ;
if ( enc _mode == "Numeric mode" ) {
var data _length = parseInt ( data _block . substring ( 0 , 10 ) , 2 ) ;
pushBlock (
"Char. count indicator" ,
data _block . substring ( 0 , 10 ) ,
data _length
) ;
data _block = data _block . substring ( 10 ) ;
for ( var k = 0 ; k < Math . floor ( ( data _length + 2 ) / 3 ) ; k ++ ) {
var temp _value = "" ;
var temp _decoded = "" ;
if ( k == Math . floor ( ( data _length + 2 ) / 3 ) - 1 ) {
if ( data _length % 3 == 0 ) {
temp _value = data _block . substring ( 0 , 10 ) ;
temp _decoded = parseInt ( data _block . substring ( 0 , 10 ) , 2 ) ;
data _block = data _block . substring ( 10 ) ;
} else if ( data _length % 3 == 1 ) {
temp _value = data _block . substring ( 0 , 4 ) ;
temp _decoded = parseInt ( data _block . substring ( 0 , 4 ) , 2 ) ;
data _block = data _block . substring ( 4 ) ;
} else {
temp _value = data _block . substring ( 0 , 7 ) ;
temp _decoded = parseInt ( data _block . substring ( 0 , 7 ) , 2 ) ;
data _block = data _block . substring ( 7 ) ;
}
} else {
temp _value = data _block . substring ( 0 , 10 ) ;
temp _decoded = parseInt ( data _block . substring ( 0 , 10 ) , 2 ) ;
data _block = data _block . substring ( 10 ) ;
}
pushBlock (
"Message data" ,
temp _value ,
temp _decoded
) ;
}
} else if ( enc _mode == "Alphanumeric mode" ) {
var data _length = parseInt ( data _block . substring ( 0 , 9 ) , 2 ) ;
pushBlock (
"Char. count indicator" ,
data _block . substring ( 0 , 9 ) ,
data _length
) ;
data _block = data _block . substring ( 9 ) ;
for ( var i = 0 ; i < Math . floor ( ( data _length + 1 ) / 2 ) ; i ++ ) {
if ( i == Math . floor ( ( data _length + 1 ) / 2 ) - 1 ) {
if ( data _length % 2 == 0 ) {
var num = parseInt ( data _block . substring ( 0 , 11 ) , 2 ) ;
temp _value = data _block . substring ( 0 , 11 ) ;
temp _decoded = alphanumeric _table [ Math . floor ( num / 45 ) ] + alphanumeric _table [ num % 45 ] ;
data _block = data _block . substring ( 11 ) ;
} else {
var num = parseInt ( data _block . substring ( 0 , 6 ) , 2 ) ;
temp _value = data _block . substring ( 0 , 6 ) ;
temp _decoded = alphanumeric _table [ num ] ;
data _block = data _block . substring ( 6 ) ;
}
} else {
var num = parseInt ( data _block . substring ( 0 , 11 ) , 2 ) ;
temp _value = data _block . substring ( 0 , 11 ) ;
temp _decoded = alphanumeric _table [ Math . floor ( num / 45 ) ] + alphanumeric _table [ num % 45 ]
data _block = data _block . substring ( 11 ) ;
}
pushBlock (
"Message data" ,
temp _value ,
temp _decoded
) ;
}
} else if ( enc _mode == "Binary mode" ) {
var data _length = parseInt ( data _block . substring ( 0 , 8 ) , 2 ) ;
pushBlock (
"Char. count indicator" ,
data _block . substring ( 0 , 8 ) ,
data _length
) ;
data _block = data _block . substring ( 8 ) ;
for ( var i = 0 ; i < data _length ; i ++ ) {
temp _value = data _block . substring ( 0 , 8 ) ;
temp _decoded = String . fromCharCode ( parseInt ( data _block . substring ( 0 , 8 ) , 2 ) ) ;
data _block = data _block . substring ( 8 ) ;
pushBlock (
"Message data" ,
temp _value ,
temp _decoded
) ;
}
} else if ( enc _mode == "Terminator" ) {
} else {
break ;
}
}
//console.log(data_block);
var error _correction _level = getFormatInfo ( qr _array ) . ecc ;
var offset = data _block . length - error _correction _code _table [ qr _version - 1 ] [ error _correction _level ] * 8 ;
pushBlock (
"Padding bits" ,
data _block . substring ( 0 , offset ) ,
""
) ;
data _block = data _block . substring ( offset ) ;
while ( data _block . length >= 8 ) {
pushBlock (
"Error correction" ,
data _block . substring ( 0 , 8 ) ,
parseInt ( data _block . substring ( 0 , 8 ) , 2 )
) ;
data _block = data _block . substring ( 8 ) ;
}
console . log ( qr _data _block ) ;
showQRTableOverlay ( ) ;
//Generate QR Overlay
for ( var i = 0 ; i < qr _data _block . length ; i ++ ) {
for ( var j = 0 ; j < qr _data _block [ i ] . modules . length ; j ++ ) {
var module = qr _data _block [ i ] . modules [ j ] ;
$ ( "#qr-overlay td[index=" + module + "]" ) . addClass ( "hoverable data-block-" + i ) ;
}
for ( var j = 0 ; j < qr _data _block [ i ] . modules . length ; j ++ ) {
var module = qr _data _block [ i ] . modules [ j ] . split ( '-' ) ;
generateSeparator ( module [ 0 ] , module [ 1 ] , "data-block-" + i ) ;
}
}
}
//Generate separator border between blocks
function generateSeparator ( i , j , cls ) {
i = parseInt ( i ) ;
j = parseInt ( j ) ;
var up = $ ( "#qr-overlay td[index=" + ( i - 1 ) + "-" + j + "]" ) ;
var down = $ ( "#qr-overlay td[index=" + ( i + 1 ) + "-" + j + "]" ) ;
var left = $ ( "#qr-overlay td[index=" + i + "-" + ( j - 1 ) + "]" ) ;
var right = $ ( "#qr-overlay td[index=" + i + "-" + ( j + 1 ) + "]" ) ;
if ( ! left . hasClass ( cls ) ) {
$ ( "#qr-" + i + "-" + j ) . css ( "border-left" , "solid 1px #f44336" ) ;
}
if ( ! right . hasClass ( cls ) ) {
$ ( "#qr-" + i + "-" + j ) . css ( "border-right" , "solid 1px #f44336" ) ;
}
if ( ! up . hasClass ( cls ) ) {
$ ( "#qr-" + i + "-" + j ) . css ( "border-top" , "solid 1px #f44336" ) ;
}
if ( ! down . hasClass ( cls ) ) {
$ ( "#qr-" + i + "-" + j ) . css ( "border-bottom" , "solid 1px #f44336" ) ;
}
}
function selectBlock ( cls ) {
var index = cls . substring ( 11 ) ;
$ ( "#data-analysis-value" ) . val ( qr _data _block [ index ] . value ) ;
$ ( "#data-analysis-type" ) . val ( qr _data _block [ index ] . type ) ;
$ ( "#data-analysis-decoded" ) . val ( qr _data _block [ index ] . decoded ) ;
}
function updateBlock ( value , cls ) {
var index = cls [ cls . length - 2 ] . substring ( 11 ) ;
if ( value == qr _data _block [ index ] . value ) {
//return;
}
if ( value . length != qr _data _block [ index ] . value . length || ! /^[01\?]+$/g . test ( value ) ) {
alert ( 'Invalid value!' ) ;
$ ( "#data-analysis-value" ) . val ( qr _data _block [ index ] . value ) . focus ( ) ;
return ;
}
qr _data _block [ index ] . value = value ;
var mask _pattern = getFormatInfo ( qr _array ) . mask ;
for ( var i = 0 ; i < qr _data _block [ index ] . modules . length ; i ++ ) {
var cord = qr _data _block [ index ] . modules [ i ] . split ( '-' ) ;
var new _val = value . substring ( i , i + 1 ) ;
console . log ( new _val , qr _array [ cord [ 0 ] ] [ cord [ 1 ] ] ) ;
if ( new _val == '?' )
new _val = - 1 ;
else
new _val = parseInt ( new _val ) ;
/ * i f ( m a s k ( m a s k _ p a t t e r n , c o r d [ 0 ] , c o r d [ 1 ] ) ) {
if ( new _val == 1 )
new _val = 0 ;
else if ( new _val == 0 )
new _val = 1 ;
} * /
qr _array [ cord [ 0 ] ] [ cord [ 1 ] ] = new _val ;
}
refreshTable ( ) ;
activateAnalysisMode ( ) ;
updateHistory ( "Modules edited" ) ;
$ ( "#data-analysis-value" ) . val ( "" ) ;
$ ( "#data-analysis-type" ) . val ( "" ) ;
$ ( "#data-analysis-decoded" ) . val ( "" ) ;
}
2018-05-11 03:30:12 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* EVENT LISTENER USING JQUERY
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
$ ( document ) . ready ( function ( ) {
$ ( "#home-new" ) . click ( function ( ) {
$ ( "#home-box" ) . hide ( ) ;
$ ( "#div-new" ) . show ( ) ;
} )
$ ( "#home-load" ) . click ( function ( ) {
$ ( "#home-box" ) . hide ( ) ;
$ ( "#div-load" ) . show ( ) ;
var dataList = JSON . parse ( localStorage . getItem ( "dataList" ) ) ;
if ( dataList == undefined ) {
$ ( "#list-load" ) . html ( "<h5>There's no saved project in Local Storage.</h5>" ) ;
} else {
var element = "" ;
for ( var i = 0 ; i < dataList . length ; i ++ ) {
element += "<div><h5>" + dataList [ i ] [ 0 ] + "</h5><h6>" + dataList [ i ] [ 1 ] + "</h6><span>✖<span></div>" ;
}
$ ( "#list-load" ) . html ( element ) ;
}
} )
$ ( "#new-btn-new" ) . click ( function ( ) {
generateTable ( qr _version ) ;
qr _format _array = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
if ( $ ( "#btn-switch-mode" ) . hasClass ( "active" ) ) {
toggleResult ( ) ;
}
if ( $ ( "#div-extract" ) . css ( "display" ) != "none" ) {
$ ( "#btn-tools-extract" ) . trigger ( "click" ) ;
}
brute _force _mode = false ;
2019-01-29 09:26:13 +07:00
extract _info _mode = false ;
2017-12-27 03:02:43 +07:00
if ( analysis _mode ) {
$ ( "#tools-data-analysis" ) . trigger ( "click" ) ;
}
2017-05-10 02:32:46 +07:00
$ ( "#tools-brute-force, #tools-unmasking" ) . removeClass ( "active" ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . html ( "" ) ;
2017-05-10 02:32:46 +07:00
$ ( "#box-tools-masking" ) . hide ( ) ;
$ ( "#div-new" ) . hide ( ) ;
} )
$ ( "#new-btn-import-img" ) . click ( function ( ) {
$ ( "#import-img" ) . click ( ) ;
return false ;
} )
$ ( "#import-img" ) . change ( function ( ) {
if ( this . files && this . files [ 0 ] ) {
var reader = new FileReader ( ) ;
reader . onload = function ( e ) {
$ ( "#hidden-img" ) . attr ( "src" , e . target . result ) ;
importFromImage ( $ ( "#hidden-img" ) . attr ( "src" ) , function ( data ) {
if ( Array . isArray ( data ) ) {
$ ( "#div-new" ) . hide ( ) ;
generateTable ( qr _version ) ;
2017-12-09 12:03:09 +07:00
updateQRArray ( data ) ;
2017-05-10 02:32:46 +07:00
clearHistory ( ) ;
updateHistory ( "Load from image" ) ;
refreshTable ( ) ;
changed _state = true ;
} else {
alert ( data ) ;
}
} )
}
reader . readAsDataURL ( this . files [ 0 ] ) ;
}
} )
2022-01-04 17:51:27 +01:00
$ ( "#new-btn-import-txt" ) . click ( function ( ) {
$ ( "#import-txt" ) . click ( ) ;
return false ;
} )
$ ( "#import-txt" ) . change ( function ( ) {
if ( this . files && this . files [ 0 ] ) {
var reader = new FileReader ( ) ;
reader . onload = function ( e ) {
const file = e . target . result ;
const lines = file . split ( /\r\n|\n/ ) ;
$ ( "#hidden-txt" ) . val ( lines . join ( '\n' ) ) ;
$ ( "#div-new" ) . hide ( ) ;
2022-01-04 23:08:17 +01:00
qr _size = lines [ 0 ] . length ;
qr _version = ( qr _size - 17 ) / 4 ;
generateTable ( qr _version ) ;
data = loadTxt2Array ( lines ) ;
updateQRArray ( data ) ;
2022-01-04 17:51:27 +01:00
clearHistory ( ) ;
updateHistory ( "Load from image" ) ;
refreshTable ( ) ;
changed _state = true ;
} ;
reader . readAsText ( this . files [ 0 ] ) ;
}
} )
2017-05-10 02:32:46 +07:00
$ ( "#menu-new" ) . click ( function ( ) {
if ( changed _state ) {
if ( ! confirm ( "Are you sure want to proceed?\nYour unsaved progress will be lost!" ) )
return ;
}
$ ( "#home-box" ) . hide ( ) ;
$ ( "#div-new" ) . show ( ) ;
} )
$ ( "#menu-save" ) . click ( function ( ) {
$ ( "#div-save" ) . show ( ) ;
var dataList = JSON . parse ( localStorage . getItem ( "dataList" ) ) ;
if ( dataList == undefined ) {
$ ( "#div-save-ext" ) . hide ( ) ;
} else {
var element = "" ;
for ( var i = 0 ; i < dataList . length ; i ++ ) {
element += "<div><h5>" + dataList [ i ] [ 0 ] + "</h5><h6>" + dataList [ i ] [ 1 ] + "</h6><span>✖<span></div>" ;
}
$ ( "#list-save" ) . html ( element ) ;
$ ( "#div-save-ext" ) . show ( ) ;
}
} )
$ ( "#menu-load" ) . click ( function ( ) {
$ ( "#div-load" ) . show ( ) ;
var dataList = JSON . parse ( localStorage . getItem ( "dataList" ) ) ;
if ( dataList == undefined ) {
$ ( "#list-load" ) . html ( "<h5>There's no saved project in Local Storage.</h5>" ) ;
} else {
var element = "" ;
for ( var i = 0 ; i < dataList . length ; i ++ ) {
element += "<div><h5>" + dataList [ i ] [ 0 ] + "</h5><h6>" + dataList [ i ] [ 1 ] + "</h6><span>✖<span></div>" ;
}
$ ( "#list-load" ) . html ( element ) ;
}
} )
$ ( "#menu-tools" ) . click ( function ( ) {
$ ( "#div-tools" ) . show ( ) ;
} )
$ ( document ) . on ( "click" , "#list-load div" , function ( e ) {
var projectName = $ ( this ) . find ( "h5" ) . text ( ) ;
if ( e . target . nodeName != "SPAN" ) {
loadProject ( projectName ) ;
} else {
removeProject ( projectName , "load" ) ;
}
} )
$ ( document ) . on ( "click" , "#list-save div" , function ( e ) {
var projectName = $ ( this ) . find ( "h5" ) . text ( ) ;
if ( e . target . nodeName != "SPAN" ) {
saveProject ( projectName ) ;
} else {
removeProject ( projectName , "save" ) ;
}
} )
$ ( "#painter-box div" ) . click ( function ( ) {
$ ( "#painter-box div.active" ) . removeClass ( "active" )
$ ( this ) . addClass ( "active" ) ;
active _painter = $ ( this ) . attr ( "index" ) ;
} )
$ ( "#painter-fill" ) . click ( function ( ) {
if ( fill _painter ) {
$ ( this ) . removeClass ( "active" ) ;
fill _painter = false ;
} else {
$ ( this ) . addClass ( "active" ) ;
fill _painter = true ;
}
} )
$ ( "#btn-version-plus" ) . click ( function ( ) {
if ( changed _state ) {
if ( confirm ( "Are you sure want to proceed?\nYour unsaved progress will be lost!" ) ) {
2021-11-14 23:56:31 +01:00
if ( qr _version != maxVersion ) {
2017-05-10 02:32:46 +07:00
qr _version += 1 ;
qr _size = 17 + ( qr _version * 4 ) ;
$ ( "#qr-version" ) . val ( qr _size + "x" + qr _size + " (ver. " + qr _version + ")" ) ;
generateTable ( qr _version ) ;
}
}
} else {
2021-11-14 23:56:31 +01:00
if ( qr _version != maxVersion ) {
2017-05-10 02:32:46 +07:00
qr _version += 1 ;
qr _size = 17 + ( qr _version * 4 ) ;
$ ( "#qr-version" ) . val ( qr _size + "x" + qr _size + " (ver. " + qr _version + ")" ) ;
generateTable ( qr _version ) ;
}
}
} )
$ ( "#btn-version-min" ) . click ( function ( ) {
if ( changed _state ) {
if ( confirm ( "Are you sure want to proceed?\nYour unsaved progress will be lost!" ) ) {
if ( qr _version != 1 ) {
qr _version -= 1 ;
qr _size = 17 + ( qr _version * 4 ) ;
$ ( "#qr-version" ) . val ( qr _size + "x" + qr _size + " (ver. " + qr _version + ")" ) ;
generateTable ( qr _version ) ;
}
}
} else {
if ( qr _version != 1 ) {
qr _version -= 1 ;
qr _size = 17 + ( qr _version * 4 ) ;
$ ( "#qr-version" ) . val ( qr _size + "x" + qr _size + " (ver. " + qr _version + ")" ) ;
generateTable ( qr _version ) ;
}
}
} )
$ ( "#btn-size-plus" ) . click ( function ( ) {
2019-01-29 09:26:13 +07:00
if ( qr _pixel _size != 50 && qr _pixel _size >= 10 ) {
2017-05-10 02:32:46 +07:00
qr _pixel _size += 5 ;
2019-01-29 09:26:13 +07:00
} else if ( qr _pixel _size < 10 ) {
qr _pixel _size += 1 ;
2017-05-10 02:32:46 +07:00
}
$ ( "#qr-size" ) . val ( qr _pixel _size + "px" ) ;
resize ( qr _pixel _size ) ;
if ( $ ( "#btn-switch-mode" ) . hasClass ( "active" ) ) {
generateResult ( ) ;
}
} )
$ ( "#btn-size-min" ) . click ( function ( ) {
2019-01-29 09:26:13 +07:00
if ( qr _pixel _size > 10 ) {
2017-05-10 02:32:46 +07:00
qr _pixel _size -= 5 ;
2019-01-29 09:26:13 +07:00
} else if ( qr _pixel _size != 1 ) {
qr _pixel _size -= 1 ;
2017-05-10 02:32:46 +07:00
}
$ ( "#qr-size" ) . val ( qr _pixel _size + "px" ) ;
resize ( qr _pixel _size ) ;
if ( $ ( "#btn-switch-mode" ) . hasClass ( "active" ) ) {
generateResult ( ) ;
}
} )
$ ( "#btn-show-grey-pixel" ) . click ( function ( ) {
if ( $ ( this ) . hasClass ( "active" ) ) {
$ ( this ) . removeClass ( "active" ) ;
show _grey = false ;
} else {
$ ( this ) . addClass ( "active" ) ;
show _grey = true ;
}
generateResult ( ) ;
} )
$ ( "#btn-qr-decode" ) . click ( function ( ) {
if ( brute _force _mode ) {
$ ( "#btn-brute-force-apply-pattern" ) . hide ( ) ;
$ ( "#brute-force-msg-wait" ) . show ( ) ;
$ ( "#brute-force-msg-fail" ) . hide ( ) ;
$ ( "#brute-force-content" ) . hide ( ) ;
$ ( "#div-brute-force-loader" ) . show ( ) ;
bruteForceFormatInfo ( ) ;
} else {
2022-01-04 13:37:50 +01:00
var image = document . getElementById ( "qr-result-canvas" ) . toDataURL ( ) ;
2017-05-10 02:32:46 +07:00
$ ( "#decode-message" ) . val ( "" ) ;
$ ( "#div-decode" ) . show ( ) ;
decodeFromBase64 ( image , function ( decodedData ) {
if ( decodedData != "error decoding QR Code" ) {
$ ( "#decode-message" ) . val ( decodedData ) ;
2022-01-02 21:01:28 +01:00
//resize for text based on QR version
$ ( "#decode-message" ) . css ( "height" , ( 17 + 4 * qr _version ) * 3 + "px" ) ;
2017-05-10 02:32:46 +07:00
}
} ) ;
}
} )
$ ( "#btn-switch-mode" ) . click ( function ( ) {
toggleResult ( ) ;
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Extract QR Information
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
$ ( "#tools-extract" ) . click ( function ( ) {
$ ( "#div-tools" ) . hide ( ) ;
if ( $ ( this ) . hasClass ( "active" ) ) {
$ ( "#btn-tools-extract" ) . trigger ( "click" ) ;
return ;
}
$ ( ".side-box" ) . each ( function ( ) {
$ ( this ) . hide ( ) ;
} ) ;
$ ( ".right-box" ) . hide ( ) ;
$ ( "#box-tools-extract" ) . show ( ) ;
$ ( "#qr-table" ) . hide ( ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-result, #qr-overlay" ) . hide ( ) ;
2017-05-10 02:32:46 +07:00
$ ( "#div-extract" ) . show ( ) ;
$ ( ".footer .mode-indicator" ) . hide ( ) ;
$ ( "body" ) . css ( "background-color" , "#fff" ) ;
$ ( this ) . addClass ( "active" ) ;
extractInfo ( ) ;
2019-01-29 09:26:13 +07:00
extract _info _mode = true ;
2017-05-10 02:32:46 +07:00
} )
$ ( "#btn-extract-show-rs, #btn-extract-show-error" ) . click ( function ( ) {
if ( $ ( this ) . hasClass ( "active" ) ) {
$ ( this ) . removeClass ( "active" ) ;
} else {
$ ( this ) . addClass ( "active" ) ;
}
extractInfo ( ) ;
} )
$ ( "#btn-tools-extract" ) . click ( function ( ) {
$ ( "#div-tools" ) . hide ( ) ;
$ ( "#tools-extract" ) . removeClass ( "active" ) ;
$ ( ".side-box" ) . show ( ) ;
2017-05-10 22:35:38 +07:00
$ ( ".right-box" ) . show ( ) ;
2017-05-10 02:32:46 +07:00
$ ( "#box-tools-extract" ) . hide ( ) ;
$ ( "#qr-table" ) . show ( ) ;
2017-12-27 03:02:43 +07:00
if ( analysis _mode ) {
$ ( "#qr-overlay" ) . show ( ) ;
2017-05-10 02:32:46 +07:00
}
$ ( "#btn-switch-mode" ) . removeClass ( "active" ) ;
$ ( "#div-tool-result" ) . hide ( ) ;
$ ( "#div-tool-work" ) . show ( ) ;
$ ( "#btn-switch-mode" ) . text ( "Editor Mode" ) ;
$ ( "#div-extract" ) . hide ( ) ;
$ ( ".footer .mode-indicator" ) . show ( ) ;
$ ( "body" ) . css ( "background-color" , "#eceff1" ) ;
2017-12-27 03:02:43 +07:00
if ( analysis _mode ) {
$ ( "#box-work" ) . hide ( ) ;
} else {
$ ( "#box-tools-analysis" ) . hide ( ) ;
}
2019-01-29 09:26:13 +07:00
extract _info _mode = false ;
2017-05-10 02:32:46 +07:00
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Brute - force Format info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
$ ( "#tools-brute-force" ) . click ( function ( ) {
if ( $ ( this ) . hasClass ( "active" ) ) {
$ ( this ) . removeClass ( "active" ) ;
//qr_format_array = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
brute _force _mode = false ;
updateHistory ( "Update format info pattern" ) ;
} else {
$ ( this ) . addClass ( "active" ) ;
brute _force _mode = true ;
qr _format _array = [ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ] ;
}
saveInfoTable ( qr _size ) ;
} )
$ ( "#btn-brute-force-counter-prev" ) . click ( function ( ) {
if ( current _brute _result > 0 )
current _brute _result -= 1 ;
var ecc = Math . floor ( brute _result _index [ current _brute _result ] / 8 ) ;
var mask = brute _result _index [ current _brute _result ] % 8 ;
qr _format _array = format _information _bits [ ecc ] [ mask ] . split ( "" ) . reverse ( ) ;
if ( ecc == 0 )
ecc = "L" ;
else if ( ecc == 1 )
ecc = "M" ;
else if ( ecc == 2 )
ecc = "Q"
else if ( ecc == 3 )
ecc = "H"
$ ( "#brute-force-decoded-data" ) . val ( brute _result [ brute _result _index [ current _brute _result ] ] ) ;
$ ( "#brute-force-ecc span" ) . text ( ecc ) ;
$ ( "#brute-force-mask span" ) . text ( mask ) ;
$ ( "#brute-force-result-counter" ) . text ( ( current _brute _result + 1 ) + " of " + brute _result _index . length + " result" ) ;
saveInfoTable ( qr _size ) ;
generateResult ( ) ;
} )
$ ( "#btn-brute-force-counter-next" ) . click ( function ( ) {
if ( current _brute _result < brute _result _index . length - 1 )
current _brute _result += 1 ;
var ecc = Math . floor ( brute _result _index [ current _brute _result ] / 8 ) ;
var mask = brute _result _index [ current _brute _result ] % 8 ;
qr _format _array = format _information _bits [ ecc ] [ mask ] . split ( "" ) . reverse ( ) ;
if ( ecc == 0 )
ecc = "L" ;
else if ( ecc == 1 )
ecc = "M" ;
else if ( ecc == 2 )
ecc = "Q"
else if ( ecc == 3 )
ecc = "H"
$ ( "#brute-force-decoded-data" ) . val ( brute _result [ brute _result _index [ current _brute _result ] ] ) ;
$ ( "#brute-force-ecc span" ) . text ( ecc ) ;
$ ( "#brute-force-mask span" ) . text ( mask ) ;
$ ( "#brute-force-result-counter" ) . text ( ( current _brute _result + 1 ) + " of " + brute _result _index . length + " result" ) ;
saveInfoTable ( qr _size ) ;
generateResult ( ) ;
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Data Masking
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
$ ( "#tools-masking" ) . click ( function ( ) {
2017-05-10 02:32:46 +07:00
var current _mask = getFormatInfo ( qr _array ) . mask ;
2017-12-11 00:34:56 +07:00
$ ( "#data-masking-slider div.active" ) . removeClass ( "active" ) ;
2017-12-09 12:03:09 +07:00
$ ( "#data-masking-slider div[data=" + current _mask + "]" ) . addClass ( "active" ) ;
2017-05-10 02:32:46 +07:00
2017-12-09 12:03:09 +07:00
$ ( "#div-data-masking" ) . show ( ) ;
$ ( "#div-tools" ) . hide ( ) ;
2017-05-10 02:32:46 +07:00
} )
2017-12-09 12:03:09 +07:00
$ ( "#data-masking-slider div" ) . click ( function ( ) {
$ ( "#data-masking-slider div.active" ) . removeClass ( "active" ) ;
$ ( this ) . addClass ( "active" ) ;
} )
2017-05-10 02:32:46 +07:00
2017-12-09 12:03:09 +07:00
$ ( "#btn-data-masking-apply" ) . click ( function ( ) {
var mask = $ ( "#data-masking-slider div.active" ) . attr ( "data" ) ;
2017-05-10 02:32:46 +07:00
var ecc = getFormatInfo ( qr _array ) . ecc ;
if ( ecc == 0 )
ecc = 1 ;
else if ( ecc == 1 )
ecc = 0 ;
else if ( ecc == 2 )
ecc = 3 ;
else if ( ecc == 3 )
ecc = 2 ;
2017-12-09 12:03:09 +07:00
qr _format _array = format _information _bits [ ecc ] [ mask ] . split ( "" ) . reverse ( ) ;
2017-05-10 02:32:46 +07:00
saveInfoTable ( qr _size ) ;
2017-12-09 12:03:09 +07:00
maskDataBits ( ) ;
$ ( "#div-data-masking" ) . hide ( ) ;
2022-01-20 22:58:21 +01:00
//masking toogle visual
if ( $ ( "#tools-masking" ) . hasClass ( "active" ) ) {
masking _mode = false ;
$ ( "#tools-masking" ) . removeClass ( "active" ) ;
} else {
masking _mode = true ;
$ ( "#tools-masking" ) . addClass ( "active" ) ;
}
2017-05-10 02:32:46 +07:00
} )
$ ( "#btn-mask-show-pattern-area" ) . click ( function ( ) {
if ( $ ( this ) . hasClass ( "active" ) ) {
$ ( this ) . removeClass ( "active" ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . html ( "" ) ;
2017-05-10 02:32:46 +07:00
} else {
$ ( this ) . addClass ( "active" ) ;
showMaskPatternArea ( ) ;
2017-12-27 03:02:43 +07:00
$ ( "#qr-overlay" ) . show ( ) ;
2017-05-10 02:32:46 +07:00
}
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Padding Bits Recovery
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
$ ( "#tools-pad-recovery" ) . click ( function ( ) {
2022-01-06 02:00:24 +01:00
patchingRecovery ( recoverPaddingBits ( JSON . parse ( JSON . stringify ( qr _array ) ) ) ) ;
2022-01-07 13:55:54 +01:00
$ ( "#div-patching-recovery-title" ) . text ( "Padding Bits Recovery" ) ;
2022-01-06 02:00:24 +01:00
$ ( "#div-patching-recovery" ) . show ( ) ;
2017-05-10 02:32:46 +07:00
$ ( "#div-tools" ) . hide ( ) ;
} )
2022-01-07 16:44:27 +01:00
$ ( "#btn-patch-rec-apply" ) . click ( function ( ) {
2017-05-10 02:32:46 +07:00
qr _array = JSON . parse ( JSON . stringify ( qr _temp _array ) ) ;
refreshTable ( ) ;
2022-01-07 17:10:00 +01:00
updateHistory ( $ ( "#div-patching-recovery-title" ) . text ( ) ) ;
2022-01-06 02:00:24 +01:00
$ ( "#div-patching-recovery" ) . hide ( ) ;
2017-05-10 02:32:46 +07:00
changed _state = true ;
} )
2022-01-07 16:44:27 +01:00
$ ( "#btn-patch-rec-cancel" ) . click ( function ( ) {
2022-01-06 02:00:24 +01:00
$ ( "#div-patching-recovery" ) . hide ( ) ;
2017-05-10 02:32:46 +07:00
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Reed - Solomon Decoder
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
var current _rs _decoder _page = 1 ;
$ ( "#tools-rs-decoder" ) . click ( function ( ) {
current _rs _decoder _page = 1 ;
$ ( "#div-rs-decoder" ) . show ( ) ;
$ ( "#div-tools" ) . hide ( ) ;
$ ( "#btn-rs-decoder-prev, #btn-rs-decoder-apply" ) . hide ( ) ;
$ ( "#rs-decoder-page-1, #btn-rs-decoder-next" ) . show ( ) ;
$ ( "#rs-decoder-page-2" ) . hide ( ) ;
var ecc = getFormatInfo ( qr _array ) . ecc ;
var nblocks = RS _block _num _table [ qr _version - 1 ] [ ecc ] ;
var html = "" ;
var data _array = JSON . stringify ( qr _array ) ;
var rs _block = QRDecode ( JSON . parse ( data _array ) ) . rs _block ;
for ( var i = 1 ; i <= nblocks ; i ++ ) {
html += "<h5>Encoded Reed-Solomon blocks [" + i + " ] : < / h 5 > \
< input type = 'text' class = 'rs-decoder-input' id = 'rs-decoder-input-"+i+"' value = '"+rs_block[i-1].replace(/[^0-9,]/g, "")+"' > \
< div class = 'clear' > < / d i v > " ;
}
$ ( "#rs-decoder-page-1 div" ) . html ( html ) ;
} )
$ ( "#btn-rs-decoder-next" ) . click ( function ( ) {
$ ( "#rs-decoder-page-1" ) . hide ( ) ;
$ ( "#rs-decoder-page-2" ) . show ( ) ;
$ ( "#rs-decoder-error" ) . addClass ( "invisible" ) ;
$ ( "#btn-rs-decoder-prev, #btn-rs-decoder-apply" ) . show ( ) ;
var rs _blocks = [ ] ;
var ecc = getFormatInfo ( qr _array ) . ecc ;
var nysm = error _correction _code _table [ qr _version - 1 ] [ ecc ] ;
$ ( this ) . hide ( ) ;
$ ( ".rs-decoder-input" ) . each ( function ( ) {
rs _blocks . push ( $ ( this ) . val ( ) . replace ( /[^0-9,]+/g , "" ) . split ( "," ) ) ;
} )
reedSolomonDecode ( rs _blocks , nysm ) ;
} )
$ ( "#btn-rs-decoder-prev" ) . click ( function ( ) {
$ ( "#btn-rs-decoder-prev, #btn-rs-decoder-apply" ) . hide ( ) ;
$ ( "#rs-decoder-page-1, #btn-rs-decoder-next" ) . show ( ) ;
$ ( "#rs-decoder-page-2" ) . hide ( ) ;
} )
$ ( "#btn-rs-decoder-apply" ) . click ( function ( ) {
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Data Sequence Analysis
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
$ ( "#tools-data-analysis" ) . click ( function ( ) {
if ( $ ( this ) . hasClass ( "active" ) ) {
analysis _mode = false ;
$ ( this ) . removeClass ( "active" ) ;
$ ( "#box-work" ) . show ( ) ;
$ ( "#box-tools-analysis" ) . hide ( ) ;
activateAnalysisMode ( "false" ) ;
} else {
analysis _mode = true ;
$ ( "#data-analysis-value" ) . val ( "" ) ;
$ ( "#data-analysis-type" ) . val ( "" ) ;
$ ( "#data-analysis-decoded" ) . val ( "" ) ;
$ ( this ) . addClass ( "active" ) ;
$ ( "#box-work" ) . hide ( ) ;
$ ( "#box-tools-analysis" ) . show ( ) ;
activateAnalysisMode ( ) ;
}
$ ( "#div-tools" ) . hide ( ) ;
} )
$ ( "#data-analysis-value" ) . blur ( function ( ) {
if ( $ ( "#qr-overlay td.active" ) . length ) {
updateBlock ( $ ( this ) . val ( ) , $ ( "#qr-overlay td.active" ) . attr ( "class" ) . split ( " " ) ) ;
}
} ) . on ( "keydown" , function ( e ) {
if ( e . keyCode == "13" ) {
updateBlock ( $ ( this ) . val ( ) , $ ( "#qr-overlay td.active" ) . attr ( "class" ) . split ( " " ) ) ;
}
} )
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Load Sample
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
$ ( "#sample-file" ) . change ( function ( ) {
loadImage ( this , "#img-sample" ) ;
$ ( "#img-sample" ) . show ( ) ;
} )
2017-12-27 03:02:43 +07:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Painter stuff
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2017-05-10 02:32:46 +07:00
$ ( document ) . on ( "click" , "td.info" , function ( ) {
$ ( "#format-information-box" ) . show ( ) ;
if ( brute _force _mode ) {
$ ( "#format-info-content" ) . hide ( ) ;
$ ( "#btn-save-info" ) . hide ( ) ;
$ ( "#format-info-msg" ) . show ( ) ;
} else {
for ( var i = 0 ; i < 8 ; i ++ ) {
if ( i > 5 )
qr _format _array [ i ] = qr _array [ i + 1 ] [ 8 ] ;
else
qr _format _array [ i ] = qr _array [ i ] [ 8 ] ;
qr _format _array [ i ] = qr _array [ 8 ] [ qr _size - ( i + 1 ) ] ;
}
var index = 0 ;
for ( var i = 14 ; i >= 8 ; i -- ) {
if ( index > 5 )
qr _format _array [ i ] = qr _array [ 8 ] [ index + 1 ] ;
else
qr _format _array [ i ] = qr _array [ 8 ] [ index ] ;
qr _format _array [ i ] = qr _array [ qr _size - ( index + 1 ) ] [ 8 ] ;
index ++ ;
}
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
if ( i <= 8 && j <= 8 ) position = "TOP_LEFT" ;
else if ( j == 8 && i > 8 ) position = "BOTTOM_LEFT" ;
else position = "TOP_RIGHT" ;
$ ( "#slider-ecc div.active" ) . removeClass ( "active" ) ;
$ ( "#slider-mask div.active" ) . removeClass ( "active" ) ;
generateInfoTable ( position ) ;
var desc = getInfoBits ( position ) ;
if ( desc . ecc != "" ) {
$ ( "#slider-ecc #ecc-" + desc . ecc . toLowerCase ( ) ) . addClass ( "active" ) ;
}
if ( desc . mask != - 1 ) {
$ ( "#slider-mask #mask-" + desc . mask ) . addClass ( "active" ) ;
}
$ ( "#format-info-content" ) . show ( ) ;
$ ( "#btn-save-info" ) . show ( ) ;
$ ( "#format-info-msg" ) . hide ( ) ;
}
} )
$ ( document ) . on ( "mouseover" , ".info" , function ( ) {
$ ( ".info:not(.black)" ) . each ( function ( ) {
$ ( this ) . css ( "opacity" , "0.8" ) ;
} )
} )
$ ( document ) . on ( "mouseleave" , ".info" , function ( ) {
$ ( ".info:not(.black)" ) . each ( function ( ) {
$ ( this ) . css ( "opacity" , "1" ) ;
} )
} )
2017-12-27 03:02:43 +07:00
$ ( document ) . on ( "mouseover" , ".hoverable:not(.active)" , function ( ) {
var cls = $ ( this ) . attr ( "class" ) . split ( " " ) . pop ( ) ;
$ ( "#qr-overlay td." + cls ) . each ( function ( ) {
$ ( this ) . css ( "opacity" , "0.5" ) ;
} )
if ( ! $ ( "#qr-overlay td.active:not(." + cls + ")" ) . length ) {
//selectBlock(cls);
}
2017-05-10 02:32:46 +07:00
} )
2017-12-27 03:02:43 +07:00
$ ( document ) . on ( "mouseleave" , ".hoverable:not(.active)" , function ( ) {
var cls = $ ( this ) . attr ( "class" ) . split ( " " ) . pop ( ) ;
$ ( "#qr-overlay td." + cls ) . each ( function ( ) {
$ ( this ) . css ( "opacity" , "0" ) ;
} )
} )
$ ( document ) . on ( "click" , ".hoverable" , function ( ) {
$ ( "#qr-overlay td.active" ) . css ( "opacity" , "0" ) . removeClass ( "active" ) ;
var cls = $ ( this ) . attr ( "class" ) . split ( " " ) . pop ( ) ;
$ ( "#qr-overlay td." + cls ) . each ( function ( ) {
$ ( this ) . css ( "opacity" , "0.75" ) . addClass ( "active" ) ;
} )
selectBlock ( cls ) ;
2017-05-10 02:32:46 +07:00
} )
$ ( document ) . on ( "mousedown" , "#qr-table td" , function ( ) {
if ( ! $ ( this ) . hasClass ( "static" ) && ! $ ( this ) . hasClass ( "info" ) ) {
if ( active _painter == "0" ) {
if ( $ ( this ) . hasClass ( "black" ) ) {
$ ( this ) . removeClass ( "black" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
qr _array [ i ] [ j ] = - 1 ;
changed _state = true ;
updateHistory ( "Painter" ) ;
} else {
if ( ! fill _painter ) {
$ ( document ) . on ( "mousemove" , startDragging ) ;
$ ( document ) . on ( "mouseup" , stopDragging ) ;
$ ( this ) . removeClass ( "white" ) ;
$ ( this ) . addClass ( "black" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
qr _array [ i ] [ j ] = 1 ;
} else {
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
var original _color = qr _array [ i ] [ j ] ;
floodFill ( i , j , original _color , 1 ) ;
refreshTable ( ) ;
updateHistory ( "Flood fill" ) ;
}
changed _state = true ;
}
} else if ( active _painter == "1" ) {
if ( $ ( this ) . hasClass ( "white" ) ) {
$ ( this ) . removeClass ( "white" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
qr _array [ i ] [ j ] = - 1 ;
changed _state = true ;
updateHistory ( "Painter" ) ;
} else {
if ( ! fill _painter ) {
$ ( document ) . on ( "mousemove" , startDragging ) ;
$ ( document ) . on ( "mouseup" , stopDragging ) ;
$ ( this ) . removeClass ( "black" ) ;
$ ( this ) . addClass ( "white" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
qr _array [ i ] [ j ] = 0 ;
} else {
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
var original _color = qr _array [ i ] [ j ] ;
floodFill ( i , j , original _color , 0 ) ;
refreshTable ( ) ;
updateHistory ( "Flood fill" ) ;
}
changed _state = true ;
}
} else if ( active _painter == "2" ) {
if ( ! fill _painter ) {
$ ( document ) . on ( "mousemove" , startDragging ) ;
$ ( document ) . on ( "mouseup" , stopDragging ) ;
$ ( this ) . removeClass ( "black" ) ;
$ ( this ) . removeClass ( "white" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
qr _array [ i ] [ j ] = - 1 ;
} else {
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
var original _color = qr _array [ i ] [ j ] ;
floodFill ( i , j , original _color , - 1 ) ;
refreshTable ( ) ;
updateHistory ( "Flood fill" ) ;
}
changed _state = true ;
}
}
} )
var startDragging = function ( e ) {
var x = e . clientX ;
var y = e . clientY ;
var elem = document . elementFromPoint ( x , y ) ;
var id = elem . id ;
if ( elem . tagName == "TD" && elem . className . search ( "static" ) == - 1 && elem . className . search ( "info" ) == - 1 ) {
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
var j = /\d{1,2}$/ . exec ( id ) [ 0 ] ;
if ( active _painter == "0" ) {
elem . className = "black" ;
qr _array [ i ] [ j ] = 1 ;
}
else if ( active _painter == "1" ) {
elem . className = "white" ;
qr _array [ i ] [ j ] = 0 ;
}
else if ( active _painter == "2" ) {
elem . className = "" ;
qr _array [ i ] [ j ] = - 1 ;
}
}
}
var stopDragging = function ( ) {
$ ( document ) . off ( "mousemove" ) ;
$ ( document ) . off ( "mouseup" ) ;
updateHistory ( "Painter" ) ;
}
$ ( document ) . on ( "click" , "#qr-format-info td" , function ( ) {
if ( ! $ ( this ) . hasClass ( "static" ) ) {
if ( $ ( this ) . hasClass ( "black" ) ) {
$ ( this ) . removeClass ( "black" ) ;
$ ( this ) . addClass ( "white" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
qr _format _array [ i ] = 0 ;
} else {
$ ( this ) . removeClass ( "white" ) ;
$ ( this ) . addClass ( "black" ) ;
var id = $ ( this ) [ 0 ] . id ;
var i = /\d{1,2}/ . exec ( id ) [ 0 ] ;
qr _format _array [ i ] = 1 ;
}
}
var desc = getInfoBits ( ) ;
if ( desc . ecc != "" ) {
$ ( "#slider-ecc #ecc-" + desc . ecc . toLowerCase ( ) ) . addClass ( "active" ) ;
} else {
$ ( "#slider-ecc div.active" ) . removeClass ( "active" ) ;
}
if ( desc . mask != - 1 ) {
$ ( "#slider-mask #mask-" + desc . mask ) . addClass ( "active" ) ;
} else {
$ ( "#slider-mask div.active" ) . removeClass ( "active" ) ;
}
} )
$ ( "#select-format-info-pos" ) . change ( function ( ) {
var position = $ ( this ) . val ( ) ;
generateInfoTable ( position ) ;
} )
$ ( "#slider-ecc div" ) . click ( function ( ) {
var position = $ ( "#select-format-info-pos" ) . val ( ) ;
$ ( "#slider-ecc div.active" ) . removeClass ( "active" ) ;
$ ( this ) . addClass ( "active" ) ;
var i = /\w$/ . exec ( $ ( this ) [ 0 ] . id ) [ 0 ] ;
if ( i == "l" )
i = 0 ;
else if ( i == "m" )
i = 1 ;
else if ( i == "q" )
i = 2 ;
else if ( i == "h" )
i = 3 ;
if ( $ ( "#slider-mask div.active" ) . length ) {
var j = /\d$/ . exec ( $ ( "#slider-mask div.active" ) [ 0 ] . id ) [ 0 ] ;
qr _format _array = format _information _bits [ i ] [ j ] . split ( "" ) . reverse ( ) ;
} else {
qr _format _array = ( format _information _bits _raw . ecc [ i ] + "0000000000000" ) . split ( "" ) . reverse ( ) ;
}
generateInfoTable ( position ) ;
} )
$ ( "#slider-mask div" ) . click ( function ( ) {
var position = $ ( "#select-format-info-pos" ) . val ( ) ;
$ ( "#slider-mask div.active" ) . removeClass ( "active" ) ;
$ ( this ) . addClass ( "active" ) ;
var j = /\d$/ . exec ( $ ( this ) [ 0 ] . id ) [ 0 ] ;
if ( $ ( "#slider-ecc div.active" ) . length ) {
var i = /\w$/ . exec ( $ ( "#slider-ecc div.active" ) [ 0 ] . id ) [ 0 ] ;
if ( i == "l" )
i = 0 ;
else if ( i == "m" )
i = 1 ;
else if ( i == "q" )
i = 2 ;
else if ( i == "h" )
i = 3 ;
qr _format _array = format _information _bits [ i ] [ j ] . split ( "" ) . reverse ( ) ;
} else {
qr _format _array = ( "00" + format _information _bits _raw . mask [ j ] + "0000000000" ) . split ( "" ) . reverse ( ) ;
}
generateInfoTable ( position ) ;
} )
$ ( "#btn-save-info" ) . click ( function ( ) {
var size = 17 + ( qr _version * 4 ) ;
saveInfoTable ( size ) ;
updateHistory ( "Update format info pattern" ) ;
} )
//Undo/Redo in History
$ ( document ) . on ( "click" , ".history div" , function ( ) {
var index = $ ( this ) [ 0 ] . id . substring ( 8 ) ;
$ ( ".history div.active" ) . removeClass ( "active" ) ;
$ ( this ) . addClass ( "active" ) ;
getHistory ( index ) ;
active _history = parseInt ( index ) ;
} )
$ ( ".menu-bar" ) . click ( function ( ) {
if ( ! $ ( this ) . hasClass ( "active" ) ) {
$ ( ".header div.right" ) . show ( ) ;
$ ( this ) . addClass ( "active" ) ;
} else {
$ ( ".header div.right" ) . hide ( ) ;
$ ( this ) . removeClass ( "active" ) ;
}
} )
$ ( document ) . click ( function ( e ) {
if ( ! $ ( e . target ) . closest ( ".menu-bar" ) . length && $ ( ".menu-bar" ) . css ( "display" ) == "block" ) {
$ ( ".header div.right" ) . hide ( ) ;
$ ( ".menu-bar" ) . removeClass ( "active" ) ;
}
} )
$ ( ".float-nav.left" ) . click ( function ( ) {
if ( ! $ ( this ) . hasClass ( "active" ) ) {
$ ( ".left-box" ) . show ( ) . animate ( { left : '0' } , 350 ) ;
$ ( this ) . addClass ( "active" ) ;
} else {
$ ( ".left-box" ) . animate ( { left : '-280px' } , 350 , function ( ) { $ ( this ) . hide ( ) } ) ;
$ ( this ) . removeClass ( "active" ) ;
}
} )
$ ( ".float-nav.right" ) . click ( function ( ) {
if ( ! $ ( this ) . hasClass ( "active" ) ) {
$ ( ".right-box" ) . show ( ) . animate ( { right : '0' } , 350 ) ;
$ ( this ) . addClass ( "active" ) ;
} else {
$ ( ".right-box" ) . animate ( { right : '-340px' } , 350 , function ( ) { $ ( this ) . hide ( ) } ) ;
$ ( this ) . removeClass ( "active" ) ;
}
} )
2018-05-11 03:30:12 +07:00
$ ( "#txt-version" ) . text ( 'QRazyBox v' + APP _VERSION ) ;
2017-05-11 22:54:52 +07:00
2017-05-10 02:32:46 +07:00
$ ( "#mobile-editor-mode, #mobile-decode-mode" ) . click ( function ( ) {
toggleResult ( ) ;
} )
$ ( window ) . resize ( function ( ) {
if ( document . body . clientWidth > 900 ) {
$ ( "#header-menu" ) . css ( { "display" : "" } ) ;
$ ( ".left-box" ) . css ( { "left" : "" , "display" : "" } ) ;
2019-01-29 09:26:13 +07:00
if ( ! extract _info _mode ) {
$ ( ".right-box" ) . css ( { "right" : "" , "display" : "" } ) ;
}
2017-05-10 02:32:46 +07:00
$ ( ".float-nav, .menu-bar" ) . removeClass ( "active" ) ;
}
} )
2017-05-14 02:51:29 +07:00
$ ( document ) . keydown ( function ( e ) {
if ( ! $ ( "input[type=text], textarea" ) . is ( ":focus" ) && ! $ ( "#tools-extract" ) . hasClass ( "active" ) ) {
//Shortcut key : Tab
if ( e . keyCode == 9 ) {
e . preventDefault ( ) ;
$ ( "#btn-switch-mode" ) . trigger ( "click" ) ;
}
//Shortcut key : -
2017-05-18 03:18:29 +07:00
else if ( e . keyCode == 173 || e . keyCode == 109 || e . keyCode == 189 ) {
e . preventDefault ( ) ;
2017-05-14 02:51:29 +07:00
$ ( "#btn-size-min" ) . trigger ( "click" ) ;
}
//Shortcut key : =
2017-05-18 03:18:29 +07:00
else if ( e . keyCode == 61 || e . keyCode == 187 ) {
e . preventDefault ( ) ;
2017-05-14 02:51:29 +07:00
$ ( "#btn-size-plus" ) . trigger ( "click" ) ;
}
//Shortcut key : Q
else if ( e . keyCode == 81 ) {
$ ( "#painter-black" ) . trigger ( "click" ) ;
}
//Shortcut key : W
else if ( e . keyCode == 87 ) {
$ ( "#painter-white" ) . trigger ( "click" ) ;
}
//Shortcut key : E
else if ( e . keyCode == 69 ) {
$ ( "#painter-eraser" ) . trigger ( "click" ) ;
}
//Shortcut key : G
else if ( e . keyCode == 71 ) {
$ ( "#painter-fill" ) . trigger ( "click" ) ;
}
//Shortcut key : Z
else if ( e . keyCode == 90 ) {
$ ( ".history div.active" ) . next ( ) . trigger ( "click" ) ;
}
//Shortcut key : X
else if ( e . keyCode == 88 ) {
$ ( ".history div.active" ) . prev ( ) . trigger ( "click" ) ;
}
}
} )
2017-05-10 02:32:46 +07:00
//Prevent page from closing
window . onbeforeunload = function ( ) {
if ( changed _state )
return "Do you really want to close? Your unsaved progress will be lost!" ;
} ;
2022-01-02 14:21:54 +01:00
} )