icn3d 3.24.6 → 3.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/icn3d.js CHANGED
@@ -2302,7 +2302,7 @@ THREE.TrackballControls = function ( object, domElement, icn3d ) {
2302
2302
  this.screen.width = window.innerWidth;
2303
2303
  this.screen.height = window.innerHeight;
2304
2304
 
2305
- } else {
2305
+ } else if(this.domElement) {
2306
2306
 
2307
2307
  var box = this.domElement.getBoundingClientRect();
2308
2308
  // adjustments come from similar code in the jquery offset() function
@@ -2872,7 +2872,7 @@ THREE.TrackballControls = function ( object, domElement, icn3d ) {
2872
2872
 
2873
2873
  }
2874
2874
 
2875
- if(Object.keys(window).length >= 2) {
2875
+ if(Object.keys(window).length >= 2 && this.domElement) {
2876
2876
  this.domElement.addEventListener( 'contextmn', function ( event ) {
2877
2877
  //event.preventDefault();
2878
2878
  }, false );
@@ -2998,7 +2998,7 @@ THREE.OrthographicTrackballControls = function ( object, domElement, icn3d ) { v
2998
2998
  this.screen.width = window.innerWidth;
2999
2999
  this.screen.height = window.innerHeight;
3000
3000
 
3001
- } else {
3001
+ } else if(this.domElement) {
3002
3002
 
3003
3003
  var box = this.domElement.getBoundingClientRect();
3004
3004
  // adjustments come from similar code in the jquery offset() function
@@ -3548,7 +3548,7 @@ THREE.OrthographicTrackballControls = function ( object, domElement, icn3d ) { v
3548
3548
 
3549
3549
  }
3550
3550
 
3551
- if(Object.keys(window).length >= 2) {
3551
+ if(Object.keys(window).length >= 2 && this.domElement) {
3552
3552
  this.domElement.addEventListener( 'contextmn', function ( event ) {
3553
3553
  //event.preventDefault();
3554
3554
  }, false );
@@ -9396,8 +9396,8 @@ class SetMenu {
9396
9396
  //}
9397
9397
 
9398
9398
  //!!!
9399
- //html += this.getRadio('mn4_clr', 'mn4_clrIgstrand', 'Ig Strand', undefined, undefined, 2);
9400
- //html += this.getRadio('mn4_clr', 'mn4_clrIgproto', 'Ig Protodomain', undefined, undefined, 2);
9399
+ // html += this.getRadio('mn4_clr', 'mn4_clrIgstrand', 'Ig Strand', undefined, undefined, 2);
9400
+ // html += this.getRadio('mn4_clr', 'mn4_clrIgproto', 'Ig Protodomain', undefined, undefined, 2);
9401
9401
  }
9402
9402
  else {
9403
9403
  //if(!me.cfg.hidelicense) html += this.getRadio('mn4_clr', 'mn1_delphi2', 'DelPhi<br><span style="padding-left:1.5em;">Potential ' + me.htmlCls.licenseStr + '</span>');
@@ -38547,7 +38547,7 @@ class Domain3d {
38547
38547
 
38548
38548
  //substruct: array of secondary structures, each of which has the keys: From (1-based), To (1-based), Sheet (0 or 1), also add these paras: x1, y1, z1, x2, y2, z2
38549
38549
  let substruct = [];
38550
- // determine residue ranges for each subdomain
38550
+ // determine residue position ranges for each subdomain
38551
38551
  let subdomains = [];
38552
38552
 
38553
38553
  // sheets: array of sheets, each of which has the key: sheet_num (beta sandwich has two sheets, e.g., 0 and 1), adj_strand1 (not used), adj_strand2
@@ -50156,10 +50156,15 @@ class RealignParser {
50156
50156
  //let chainTo = chainidArray[0];
50157
50157
  //let chainFrom = chainidArray[index + 1];
50158
50158
 
50159
- let bChainAlign = true;
50159
+ let bChainAlign = true, result;
50160
50160
 
50161
-
50162
- let result = ic.ParserUtilsCls.alignCoords(coordsFrom, coordsTo, fromStruct, undefined, chainTo, chainFrom, index + 1, bChainAlign);
50161
+ if(ic.bAfMem) { // align to the query (membrane)
50162
+ result = ic.ParserUtilsCls.alignCoords(coordsFrom, coordsTo, toStruct, undefined, chainTo, chainFrom, index + 1, bChainAlign);
50163
+ }
50164
+ else {
50165
+ result = ic.ParserUtilsCls.alignCoords(coordsFrom, coordsTo, fromStruct, undefined, chainTo, chainFrom, index + 1, bChainAlign);
50166
+ }
50167
+
50163
50168
  hAtoms = me.hashUtilsCls.unionHash(hAtoms, result.hAtoms);
50164
50169
 
50165
50170
  // ic.opts['color'] = 'identity';
@@ -50247,13 +50252,13 @@ class RealignParser {
50247
50252
  }
50248
50253
 
50249
50254
  // use the model from Membranome as template
50250
- if(ic.bAfMem && chainidArray.length == 2) {
50251
- if(chainidArray[1].split('_')[0] == pdbidTemplate) {
50252
- let tmp = chainidArray[0];
50253
- chainidArray[0] = chainidArray[1];
50254
- chainidArray[1] = tmp;
50255
- }
50256
- }
50255
+ // if(ic.bAfMem && chainidArray.length == 2) {
50256
+ // if(chainidArray[1].split('_')[0] == pdbidTemplate) {
50257
+ // let tmp = chainidArray[0];
50258
+ // chainidArray[0] = chainidArray[1];
50259
+ // chainidArray[1] = tmp;
50260
+ // }
50261
+ // }
50257
50262
 
50258
50263
  let bRealign = true;
50259
50264
  ic.qt_start_end = []; // reset the alignment
@@ -51732,7 +51737,12 @@ class ParserUtils {
51732
51737
 
51733
51738
  if(n < 4) var aaa = 1; //alert("Please select at least four residues in each structure...");
51734
51739
  if(n >= 4) {
51735
- ic.rmsd_suprTmp = me.rmsdSuprCls.getRmsdSuprCls(coordsFrom, coordsTo, n);
51740
+ if(ic.bAfMem) { // align to the query (membrane)
51741
+ ic.rmsd_suprTmp = me.rmsdSuprCls.getRmsdSuprCls(coordsTo, coordsFrom, n);
51742
+ }
51743
+ else {
51744
+ ic.rmsd_suprTmp = me.rmsdSuprCls.getRmsdSuprCls(coordsFrom, coordsTo, n);
51745
+ }
51736
51746
 
51737
51747
  // apply matrix for each atom
51738
51748
  if(ic.rmsd_suprTmp.rot !== undefined) {
@@ -52371,7 +52381,7 @@ class ParserUtils {
52371
52381
  await ic.showAnnoCls.showAnnotations();
52372
52382
  }
52373
52383
 
52374
- if(me.cfg.closepopup) {
52384
+ if(me.cfg.closepopup || me.cfg.imageonly) {
52375
52385
  ic.resizeCanvasCls.closeDialogs();
52376
52386
  }
52377
52387
  }
@@ -52380,6 +52390,8 @@ class ParserUtils {
52380
52390
  }
52381
52391
  if($("#" + ic.pre + "atomsCustom").length > 0) $("#" + ic.pre + "atomsCustom")[0].blur();
52382
52392
  ic.bInitial = false;
52393
+
52394
+ if(me.cfg.imageonly) ic.saveFileCls.saveFile(undefined, 'png', undefined, true);
52383
52395
  }, 0);
52384
52396
  }
52385
52397
 
@@ -59109,9 +59121,10 @@ class LoadScript {
59109
59121
 
59110
59122
  // load pdb, mmcif, mmdb, cid
59111
59123
  let id = loadStr.substr(loadStr.lastIndexOf(' ') + 1);
59124
+ if(id.length == 4) id = id.toUpperCase();
59112
59125
 
59113
59126
  // skip loading the structure if it was loaded before
59114
- if(ic.structures.hasOwnProperty(id)) return;
59127
+ if(ic.structures && ic.structures.hasOwnProperty(id)) return;
59115
59128
 
59116
59129
  ic.inputid = id;
59117
59130
  if(command.indexOf('load mmtf') !== -1) {
@@ -59462,7 +59475,7 @@ class LoadScript {
59462
59475
  ic.drawCls.draw();
59463
59476
  }
59464
59477
 
59465
- if(me.cfg.closepopup) {
59478
+ if(me.cfg.closepopup || me.cfg.imageonly) {
59466
59479
  setTimeout(function(){
59467
59480
  ic.resizeCanvasCls.closeDialogs();
59468
59481
  }, 100);
@@ -59473,6 +59486,8 @@ class LoadScript {
59473
59486
  // an extra render to remove artifacts in transparent surface
59474
59487
  if(ic.bTransparentSurface && ic.bRender) ic.drawCls.render();
59475
59488
 
59489
+ if(me.cfg.imageonly) ic.saveFileCls.saveFile(undefined, 'png', undefined, true);
59490
+
59476
59491
  /// if(ic.deferred !== undefined) ic.deferred.resolve(); /// if(ic.deferred2 !== undefined) ic.deferred2.resolve();
59477
59492
  /// if(ic.deferredMmdbaf !== undefined) ic.deferredMmdbaf.resolve();
59478
59493
  }
@@ -60367,7 +60382,7 @@ class Selection {
60367
60382
 
60368
60383
  ic.reinitAfterLoad();
60369
60384
 
60370
- ic.loadScriptCls.renderFinalStep(1);
60385
+ //ic.loadScriptCls.renderFinalStep(1);
60371
60386
  ic.definedSetsCls.setMode('all');
60372
60387
 
60373
60388
  ic.selectionCls.selectAll();
@@ -60378,6 +60393,8 @@ class Selection {
60378
60393
  ic.hlUpdateCls.removeSeqResidueBkgd();
60379
60394
  ic.hlUpdateCls.removeHl2D();
60380
60395
  ic.hlUpdateCls.removeHlMenus();
60396
+
60397
+ ic.loadScriptCls.renderFinalStep(1);
60381
60398
  }
60382
60399
 
60383
60400
  async loadSelection(dataStr) { let ic = this.icn3d, me = ic.icn3dui;
@@ -61942,14 +61959,17 @@ class Dssp {
61942
61959
  async showIgRefNum() { let ic = this.icn3d, me = ic.icn3dui;
61943
61960
  let thisClass = this;
61944
61961
 
61945
- if(ic.resid2refnum && Object.keys(ic.resid2refnum).length > 0) {
61946
- ic.bShowRefnum = true;
61962
+ // if(ic.resid2refnum && Object.keys(ic.resid2refnum).length > 0) {
61963
+ // ic.bShowRefnum = true;
61947
61964
 
61948
- // open sequence view
61949
- ic.hAtomsRefnum = {};
61950
- ic.bResetAnno = true;
61951
- await ic.showAnnoCls.showAnnotations();
61952
- ic.annotationCls.setAnnoViewAndDisplay('detailed view');
61965
+ // // open sequence view
61966
+ // ic.hAtomsRefnum = {};
61967
+ // ic.bResetAnno = true;
61968
+ // await ic.showAnnoCls.showAnnotations();
61969
+ // ic.annotationCls.setAnnoViewAndDisplay('detailed view');
61970
+ // }
61971
+ if(ic.pdbDataArray) {
61972
+ await thisClass.parseRefPdbData(ic.pdbDataArray);
61953
61973
  }
61954
61974
  else {
61955
61975
  //ic.refpdbArray = ['1bqu_fn3', '1cd8_igv', '1t6v_vnar', '1wio_c2', '1wio_igv', '2atp_a', '2atp_b', '2dm3_iset', '5esv_vh', '5esv_vl', '6al5_cd19', '7bz5_cl1', '7bz5_vh', '7bz5_vl'];
@@ -62012,6 +62032,7 @@ class Dssp {
62012
62032
 
62013
62033
  let urltmalign = me.htmlCls.baseUrl + "tmalign/tmalign.cgi";
62014
62034
 
62035
+ // if(!ic.resid2domainid) ic.resid2domainid = {};
62015
62036
  ic.resid2domainid = {};
62016
62037
 
62017
62038
  for(let i = 0, il = struArray.length; i < il; ++i) {
@@ -62025,20 +62046,33 @@ class Dssp {
62025
62046
  && !ic.proteins.hasOwnProperty(ic.firstAtomObjCls.getMiddleAtomObj(ic.chains[chainid]).serial)) continue;
62026
62047
  if(ic.chainsSeq[chainid].length < 50) continue; // peptide
62027
62048
 
62049
+ let currAtoms = me.hashUtilsCls.intHash(ic.chains[chainid], ic.hAtoms);
62050
+ if(Object.keys(currAtoms).length == 0) continue;
62051
+
62028
62052
  // align each 3D domain with reference structure
62029
- let result = ic.domain3dCls.c2b_NewSplitChain(ic.chains[chainid]);
62053
+ //let result = ic.domain3dCls.c2b_NewSplitChain(ic.chains[chainid]);
62054
+ // assign ref numbers to selected residues
62055
+ let result = ic.domain3dCls.c2b_NewSplitChain(currAtoms);
62030
62056
  let subdomains = result.subdomains;
62057
+ let pos2resi = result.pos2resi;
62031
62058
 
62032
62059
  let domainAtomsArray = [];
62033
62060
  if(subdomains.length <= 1) {
62034
- domainAtomsArray.push(ic.chains[chainid]);
62061
+ //domainAtomsArray.push(ic.chains[chainid]);
62062
+ domainAtomsArray.push(currAtoms);
62035
62063
 
62036
- for(let n = 0, nl = ic.chainsSeq[chainid].length; n < nl; ++n) {
62037
- let resid = chainid + '_' + ic.chainsSeq[chainid][n].resi;
62064
+ // for(let n = 0, nl = ic.chainsSeq[chainid].length; n < nl; ++n) {
62065
+ // let resid = chainid + '_' + ic.chainsSeq[chainid][n].resi;
62066
+ // ic.resid2domainid[resid] = chainid + '-0';
62067
+ // }
62068
+
62069
+ let residueArray = ic.resid2specCls.atoms2residues(Object.keys(currAtoms));
62070
+ for(let n = 0, nl = residueArray.length; n < nl; ++n) {
62071
+ let resid = residueArray[n];
62038
62072
  ic.resid2domainid[resid] = chainid + '-0';
62039
- }
62073
+ }
62040
62074
  }
62041
- else {
62075
+ else {
62042
62076
  for(let k = 0, kl = subdomains.length; k < kl; ++k) {
62043
62077
  let domainAtoms = {};
62044
62078
  let segArray = subdomains[k];
@@ -62047,8 +62081,9 @@ class Dssp {
62047
62081
  let startResi = segArray[m];
62048
62082
  let endResi = segArray[m+1];
62049
62083
  for(let n = parseInt(startResi); n <= parseInt(endResi); ++n) {
62050
- let residNCBI = chainid + '_' + n;
62051
- let resid = ic.ncbi2resid[residNCBI];
62084
+ //let residNCBI = chainid + '_' + n;
62085
+ //let resid = ic.ncbi2resid[residNCBI];
62086
+ let resid = chainid + '_' + pos2resi[n];
62052
62087
  domainAtoms = me.hashUtilsCls.unionHash(domainAtoms, ic.residues[resid]);
62053
62088
  ic.resid2domainid[resid] = chainid + '-' + k;
62054
62089
  }
@@ -62114,6 +62149,12 @@ class Dssp {
62114
62149
 
62115
62150
  // find the best alignment for each chain
62116
62151
  let domainid2score = {}, domainid2segs = {}, chainid2segs = {};
62152
+
62153
+ // if(!ic.chainid2index) ic.chainid2index = {};
62154
+ // if(!ic.domainid2index) ic.domainid2index = {};
62155
+ // if(!ic.domainid2ig2kabat) ic.domainid2ig2kabat = {};
62156
+ // if(!ic.domainid2ig2imgt) ic.domainid2ig2imgt = {};
62157
+
62117
62158
  ic.chainid2index = {};
62118
62159
  ic.domainid2index = {};
62119
62160
  ic.domainid2ig2kabat = {};
@@ -66223,7 +66264,9 @@ class SaveFile {
66223
66264
  //The type "png" is used to save the current canvas image. The type "html" is used to save html file with the
66224
66265
  //"data". This can be used to save any text. The type "text" is used to save an array of text, where "data" is
66225
66266
  //actually an array. The type "binary" is used to save an array of binary, where "data" is actually an array.
66226
- saveFile(filename, type, text) { let ic = this.icn3d, me = ic.icn3dui;
66267
+ saveFile(filename, type, text, bBlob) { let ic = this.icn3d, me = ic.icn3dui;
66268
+ let thisClass = this;
66269
+
66227
66270
  //Save file
66228
66271
  let blob;
66229
66272
 
@@ -66264,7 +66307,7 @@ class SaveFile {
66264
66307
  if(me.utilsCls.isIE()) {
66265
66308
  blob = ic.renderer.domElement.msToBlob();
66266
66309
 
66267
- if(bAddURL) {
66310
+ if(bAddURL && typeof(blob) == 'Blob') {
66268
66311
  let reader = new FileReader();
66269
66312
  reader.onload = function(e) {
66270
66313
  let arrayBuffer = e.target.result; // or = reader.result;
@@ -66274,23 +66317,23 @@ class SaveFile {
66274
66317
  blob = me.convertTypeCls.getBlobFromBufferAndText(arrayBuffer, text);
66275
66318
 
66276
66319
  //if(window.navigator.msSaveBlob) navigator.msSaveBlob(blob, filename);
66277
- saveAs(blob, filename);
66320
+ thisClass.saveBlob(blob, filename, bBlob, width, height);
66278
66321
 
66279
- return;
66322
+ return blob;
66280
66323
  };
66281
66324
 
66282
66325
  reader.readAsArrayBuffer(blob);
66283
66326
  }
66284
66327
  else {
66285
66328
  //ic.createLinkForBlob(blob, filename);
66286
- saveAs(blob, filename);
66329
+ thisClass.saveBlob(blob, filename, bBlob, width, height);
66287
66330
 
66288
- return;
66331
+ return blob;
66289
66332
  }
66290
66333
  }
66291
66334
  else {
66292
66335
  ic.renderer.domElement.toBlob(function(data) {
66293
- if(bAddURL) {
66336
+ if(bAddURL && typeof(blob) == 'data') {
66294
66337
  let reader = new FileReader();
66295
66338
  reader.onload = function(e) {
66296
66339
  let arrayBuffer = e.target.result; // or = reader.result;
@@ -66300,9 +66343,9 @@ class SaveFile {
66300
66343
  blob = me.convertTypeCls.getBlobFromBufferAndText(arrayBuffer, text);
66301
66344
 
66302
66345
  //ic.createLinkForBlob(blob, filename);
66303
- saveAs(blob, filename);
66346
+ thisClass.saveBlob(blob, filename, bBlob, width, height);
66304
66347
 
66305
- return;
66348
+ return blob;
66306
66349
  };
66307
66350
 
66308
66351
  reader.readAsArrayBuffer(data);
@@ -66311,9 +66354,9 @@ class SaveFile {
66311
66354
  blob = data;
66312
66355
 
66313
66356
  //ic.createLinkForBlob(blob, filename);
66314
- saveAs(blob, filename);
66357
+ thisClass.saveBlob(blob, filename, bBlob, width, height);
66315
66358
 
66316
- return;
66359
+ return blob;
66317
66360
  }
66318
66361
  });
66319
66362
  }
@@ -66351,6 +66394,44 @@ class SaveFile {
66351
66394
  //https://github.com/eligrey/FileSaver.js/
66352
66395
  saveAs(blob, filename);
66353
66396
  }
66397
+
66398
+ return blob;
66399
+ }
66400
+
66401
+ saveBlob(blob, filename, bBlob, width, height) { let ic = this.icn3d; ic.icn3dui;
66402
+ if(bBlob) {
66403
+ let urlCreator = window.URL || window.webkitURL;
66404
+ let imageUrl = urlCreator.createObjectURL(blob);
66405
+
66406
+ let url = ic.shareLinkCls.shareLinkUrl();
66407
+
66408
+ url = url.replace(/imageonly=1/g, '');
66409
+
66410
+ let bTooLong =(url.length > 4000 || url.indexOf('http') !== 0) ? true : false;
66411
+
66412
+ if(bTooLong || (ic.bInputfile && !ic.bInputUrlfile)) {
66413
+ // $("#" + ic.pre + "viewer").html("<img src='" + imageUrl + "'/>");
66414
+ $("#" + ic.pre + "mnlist").html("<img src='" + imageUrl + "'/>");
66415
+ }
66416
+ else {
66417
+ // $("#" + ic.pre + "viewer").html("<a href='" + url + "' target='_blank'><img src='" + imageUrl + "'/></a>");
66418
+ $("#" + ic.pre + "mnlist").html("<a href='" + url + "' target='_blank'><img src='" + imageUrl + "'/></a>");
66419
+ }
66420
+
66421
+ $("#" + ic.pre + "viewer").height(height);
66422
+ $("#" + ic.pre + "cmdlog").hide();
66423
+ $("#" + ic.pre + "title").hide();
66424
+ //$("#" + ic.pre + "mnlist").hide();
66425
+ $("#" + ic.pre + "canvas").hide(); // "load mmdbid ..." may cause problems if canvas was removed
66426
+
66427
+ if($("#" + ic.pre + "fullscreen").length > 0) $("#" + ic.pre + "fullscreen").hide();
66428
+
66429
+ // clear memory
66430
+ ic = {};
66431
+ }
66432
+ else {
66433
+ saveAs(blob, filename);
66434
+ }
66354
66435
  }
66355
66436
 
66356
66437
  saveSvg(id, filename, bContactmap) { let ic = this.icn3d, me = ic.icn3dui;
@@ -66975,7 +67056,9 @@ class SaveFile {
66975
67056
  $("#" + ic.pre + "title").html(title);
66976
67057
  }
66977
67058
  else if(structureArray.length == 1) {
66978
- let url = this.getLinkToStructureSummary();
67059
+ //let url = this.getLinkToStructureSummary();
67060
+ let url = (isNaN(ic.inputid) && ic.inputid.length > 5) ? 'https://alphafold.ebi.ac.uk/entry/' + ic.inputid : 'https://www.ncbi.nlm.nih.gov/structure/?term=' + ic.inputid;
67061
+
66979
67062
  this.setStructureTitle(url, title, titlelinkColor);
66980
67063
  }
66981
67064
  }
@@ -67290,6 +67373,10 @@ class ShareLink {
67290
67373
  if(key_value.length == 2) paraHash[key_value[0]] = key_value[1];
67291
67374
  }
67292
67375
 
67376
+ if(me.cfg.notebook && me.cfg.idname && !paraHash[me.cfg.idname]) { // somehow it is not included
67377
+ url += me.cfg.idname + '=' + me.cfg.idvalue + '&';
67378
+ }
67379
+
67293
67380
  for(let key in paraHash) {
67294
67381
  if(key === 'v') continue;
67295
67382
 
@@ -67329,7 +67416,7 @@ class ShareLink {
67329
67416
  transformation.quaternion = ic.quaternion;
67330
67417
 
67331
67418
  let statefile = "";
67332
- let prevCommandStr = undefined;
67419
+ let prevCommandStr = "";
67333
67420
 
67334
67421
  let toggleStr = 'toggle highlight';
67335
67422
  let cntToggle = 0;
@@ -67403,6 +67490,7 @@ class ShareLink {
67403
67490
  if(ic.structures !== undefined && Object.keys(ic.structures).length == 1 && ic.inputid !== undefined) {
67404
67491
  id = Object.keys(ic.structures)[0];
67405
67492
  url = url.replace(new RegExp(id + '_','g'), '!');
67493
+ outputCmd = outputCmd.replace(new RegExp(id + '_','g'), '!');
67406
67494
  }
67407
67495
 
67408
67496
  if(me.cfg.blast_rep_id !== undefined) {
@@ -70268,7 +70356,7 @@ class iCn3DUI {
70268
70356
  //even when multiple iCn3D viewers are shown together.
70269
70357
  this.pre = this.cfg.divid + "_";
70270
70358
 
70271
- this.REVISION = '3.24.2';
70359
+ this.REVISION = '3.25.0';
70272
70360
 
70273
70361
  // In nodejs, iCn3D defines "window = {navigator: {}}"
70274
70362
  this.bNode = (Object.keys(window).length < 2) ? true : false;
@@ -70282,6 +70370,7 @@ class iCn3DUI {
70282
70370
  if(this.cfg.showcommand === undefined) this.cfg.showcommand = true;
70283
70371
  //if(this.cfg.simplemenu === undefined) this.cfg.simplemenu = false;
70284
70372
  if(this.cfg.mobilemenu === undefined) this.cfg.mobilemenu = false;
70373
+ if(this.cfg.imageonly === undefined) this.cfg.imageonly = false;
70285
70374
  if(this.cfg.closepopup === undefined) this.cfg.closepopup = false;
70286
70375
  if(this.cfg.showanno === undefined) this.cfg.showanno = false;
70287
70376
  if(this.cfg.showseq === undefined) this.cfg.showseq = false;