new and restructured javascript examples and documentation (JAL-816,
[jalview.git] / examples / javascript / jalview.js
diff --git a/examples/javascript/jalview.js b/examples/javascript/jalview.js
new file mode 100644 (file)
index 0000000..4cc613e
--- /dev/null
@@ -0,0 +1,305 @@
+// default console to report messages\r
+var _console = document.getElementById("stdout");\r
+var _jvapps = new Array();\r
+// jvjmols is a list associating a jmol id to { modelstofiles }\r
+var _jvjmols = new Hashtable();\r
+// array of model names used to lookup index in Jmol\r
+var _modeltofiles = new Array();\r
+// counter for jmol structures\r
+var mnum = 1;\r
+\r
+function setConsole(console) {\r
+       _console = console;\r
+}\r
+\r
+function getDestinationFrms(source, frames) {\r
+       var frms = new Array();\r
+       var frid = "";\r
+       for (frm in frames) {\r
+               try {\r
+                       frid = (("" + source.getDatasetId()) == ("" + frames[frm]\r
+                                       .getDatasetId()));\r
+               } catch (q) {\r
+               }\r
+               ;\r
+               if (!frames[frm].equals(source) && !frid\r
+                               && !frames[frm].currentAlignFrame.equals(source)) {\r
+                       frms[frms.length] = frames[frm];\r
+               }\r
+       }\r
+       return frms;\r
+}\r
+\r
+function mouseover(list1, list2, list3, list4) {\r
+       // list1 = new Object(list1);\r
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
+       var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : "\r
+                       + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n";\r
+\r
+       var flist = getDestinationFrms(list1, _jvapps);\r
+       if (_console) {\r
+               _console.value = msg + "\n";\r
+       }\r
+\r
+       for (follower in flist) {\r
+               if (_console) {\r
+                       _console.value += "Sending to " + flist[follower] + "\n";\r
+               }\r
+               flist[follower].highlight(list[1], list[2], "true");\r
+       }\r
+       return true;\r
+}\r
+\r
+function sellist(list1, list2, list3, list4) {\r
+       // list1 = new Object(list1);\r
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
+       var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : "\r
+                       + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n";\r
+       var flist = getDestinationFrms(list1, _jvapps);\r
+       if (_console) {\r
+               _console.value = msg + "\n";\r
+       }\r
+       \r
+       for (follower in flist) {\r
+               if (_console) {\r
+                       _console.value += "Sending to " + flist[follower] + "\n";\r
+               }\r
+               flist[follower].selectIn(flist[follower].getDefaultTargetFrame(),\r
+                               list[2], list[3])\r
+       }\r
+       return true;\r
+}\r
+\r
+function viewlist(list1, list2, list3, list4) {\r
+       // list1 = new Object(list1);\r
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
+       var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0]\r
+                       + " id : " + list[1] + "\nRow from " + list[2] + " and to "\r
+                       + list[3] + "\nVisible columns: " + list[4] + "\n";\r
+       var flist = getDestinationFrms(list1, _jvapps);\r
+       if (_console) {\r
+               _console.value = msg + "\n";\r
+       }\r
+\r
+       for (follower in flist) {\r
+               if (_console) {\r
+                       _console.value += "Sending to " + flist[follower] + "\n";\r
+               }\r
+               flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(),\r
+                               list[2], "-1");\r
+       }\r
+       return true;\r
+}\r
+\r
+// register a jalview applet and add some handlers to it\r
+// jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array\r
+function linkJvJmol(applet, jmolView, modeltofiles) {\r
+       var i = _jvapps.length;\r
+       while (i--) {\r
+               if (_jvapps[i].equals(applet)) {\r
+                       throw ("Ignoring additional linkJvJmol call for "\r
+                                       + applet.getName() + ".");\r
+               }\r
+       }\r
+       _jvapps[_jvapps.length] = applet;\r
+       applet.setMouseoverListener("mouseover");\r
+       applet.setSelectionListener("sellist");\r
+       // viewListener not fully implemented in 2.7\r
+       // try { applet.setViewListener("viewlist"); } catch (err) {};\r
+       if (jmolView)\r
+       {\r
+               var oldjm=jmolView;\r
+               // recover full id of Jmol applet\r
+               jmolView=_jmolGetApplet(jmolView).id;\r
+               var jmbinding=_jvjmols.get(jmolView);\r
+               if (!jmbinding)\r
+               {       \r
+                       jmbinding=new Object();\r
+                       jmbinding._modelstofiles=new Array();\r
+                       jmbinding._fullmpath=new Array();\r
+                       jmbinding._filetonum=new Hashtable();\r
+                       jmbinding._jmol=jmolView;\r
+                       jmbinding._jmhandle=oldjm;\r
+                       _jvjmols.put(jmolView,jmbinding);\r
+               }\r
+               \r
+               jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles);\r
+               jmbinding._jmol=jmolView;\r
+               // now update structureListener list\r
+               mtf="";\r
+               var dbase = document.baseURI.substring(0,document.baseURI.lastIndexOf("/")+1);\r
+               for (m in jmbinding._modelstofiles)\r
+               { mtf+=jmbinding._modelstofiles[m];\r
+               if (jmbinding._modelstofiles[m].indexOf("//")==-1)\r
+                       { jmbinding._fullmpath[m] = dbase+jmbinding._modelstofiles[m]; }\r
+                 jmbinding._filetonum.put(jmbinding._modelstofiles[m], m);\r
+                 jmbinding._filetonum.put(jmbinding._fullmpath[m], m);\r
+                 \r
+                 if (m>0) { mtf+=sep; }}\r
+               jvfollower.setStructureListener("_structure", mtf);\r
+       }\r
+}\r
+\r
+/*function _addJmolModel(jmolid, modelname) {\r
+       modelname=""+modelname;\r
+       var jminf = _jvjmols[jmolid];\r
+       if (!jminf) {\r
+               jminf = new Object();\r
+               jminf._modelstofiles = new Array(); //new Hashtable();\r
+               jminf._jmol = jmolid;\r
+               jminf._modellist=new Array();\r
+               _jvjmols[jmolid] = jminf;\r
+       }\r
+       var obj = new Object();\r
+       jminf._modeltofiles[modelname] = obj; // .put(modelname, obj);\r
+       obj.id = modelname;\r
+       obj.mnum = jminf._modeltofiles.length;\r
+       jminf._modellist+=modelname;\r
+}*/\r
+\r
+\r
+\r
+// jmol Jalview Methods\r
+\r
+function _structure(list1, list2, list3, list4) {\r
+       var follower;\r
+       // if (_console) { if (!_console.value) { _console.value="";} }\r
+       if (list1 == "mouseover") {\r
+               var list = new Array(("" + list1), ("" + list2), ("" + list3),\r
+                               ("" + list4));\r
+               // 1 is pdb file, 2 is residue number, 3 is chain\r
+               // list1 = new Object(list1);\r
+               var base = list[1].indexOf(document.baseURI\r
+                               .substring(0, document.baseURI.lastIndexOf('/'))\r
+                               ); // .indexOf(_path);\r
+               if (base==0) { base = document.baseURI.lastIndexOf('/'); }\r
+               var sid = list[1]; // .substring(base);\r
+               base = list[1].substring(0, base);\r
+               if (_console) {\r
+                       _console.value += "Model is " + list[1] + ", Structure id is : "\r
+                                       + sid + "\n";\r
+               }\r
+               ;\r
+               var siddat;\r
+               for ( var jmolappi in _jvjmols.values()) {\r
+                       var jmolapp=_jvjmols.values()[jmolappi];\r
+                       var msg = "";\r
+                       if (siddat = jmolapp._filetonum.get(sid)) {\r
+                               // we don't putin chain number because there isn't one ?\r
+                               // skip select 0 bit\r
+                               var ch = ""+list[3];\r
+                               if ((""+list[2]).trim().length==1)\r
+                                       {\r
+                                       ch+=":"+list[2];\r
+                                       }\r
+                               msg = "select (" + ch + " /" + siddat + ") ;";\r
+                       }\r
+                       if (msg) {\r
+                               if (_console) {\r
+                                       _console.value += "Sending '" + msg + "' to jmol." + "\n";\r
+                               }\r
+                       }\r
+                       jmolScriptWait(msg, "" + jmolapp._jmhandle);\r
+                       // only do highlight for one jmol ?\r
+                       // return 1;\r
+               }\r
+       }\r
+       if (list1 == "colourstruct") {\r
+               if (_console) {\r
+                       _console.value += 'colourStruct("' + list1 + '","' + list2\r
+                       + '") [' + list4 + ']' + "\n";\r
+               }\r
+               setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1);\r
+               return 1;\r
+       }\r
+       return 1;\r
+}\r
+// last colour message\r
+var _lastMsg = "";\r
+// indicator - if _colourStruct==0 then no colouring is going on\r
+var _colourStruct = 0;\r
+\r
+function colourStruct(involves, msg, handle) {\r
+       if (_colourStruct == 0) {\r
+               _colourStruct = 1;\r
+               for (ap in _jvapps) {\r
+                       var _msg = "";\r
+                       do {\r
+                               if (_msg.match(/\S/)) {\r
+                                       _lastMsg += _msg;\r
+                               }\r
+                               _msg = "" + _jvapps[ap].getJsMessage(msg, handle);\r
+                       } while (_msg.match(/\S/));\r
+               }\r
+               // locate the jmol that should get the message\r
+               for (var jmol in _jvjmols.values())\r
+                       {\r
+                       var jml=_jvjmols.values()[jmol];\r
+                       if (jml._filetonum.get(involves))\r
+                               {\r
+                                       colourStructs(jml._jmhandle);\r
+                               }\r
+                       }\r
+               _colourStruct = 0;\r
+       } else {\r
+               // setTimeout('colourStruct("'+msg+'","'+handle+'")',3);\r
+       }\r
+}\r
+\r
+function colourStructs(jmolapp) {\r
+       dbg(0, "Colouring the structures\n");\r
+       jmolScriptWait("set selectionhalos false;" + _lastMsg\r
+                       + "; select 0; set selectionhalos true;", jmolapp);\r
+       _lastMsg = "";\r
+}\r
+var _jmolhovermsg="";\r
+function _jmolhover(jmid, atomlabel, atomidx) {\r
+       var msg=""+jmid+" "+atomlabel+" "+atomidx;\r
+       if (_jmolhovermsg==msg)\r
+               {\r
+               return;\r
+               }\r
+       _jmolhovermsg=msg;\r
+       modeltofiles = _jvjmols.get(jmid)._modelstofiles;\r
+       // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/);\r
+       // relaxed third parameter - may be null or a model number for multi model\r
+       // views\r
+       atomlabel = ("" + atomlabel)\r
+                       .match(/\[(.+)\](\d+):(.)\.(\S+)\s*(\/\d+\.|).+/);\r
+       atomidx = "" + atomidx;\r
+       if (atomlabel[5]) {\r
+               atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1];\r
+       } else {\r
+               // default - first model\r
+               atomlabel[5] = 0;\r
+       }\r
+       // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews\r
+       for (ap in _jvapps) {\r
+               _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3],\r
+                               document.baseURI\r
+                                               .substring(0, document.baseURI.lastIndexOf('/'))\r
+                                               + "/" + modeltofiles[atomlabel[5]]);\r
+               msg = _jmolhovermsg;\r
+       }\r
+}\r
+function _jmolpick(jmid, atomlabel, atomidx) {\r
+       atomlabel = "" + atomlabel;\r
+       atomidx = "" + atomidx;\r
+       // label is atom id, atom number, and xyz coordinates in the form:\r
+       // C6 #6 -0.30683374 -1.6836332 -0.716934\r
+       // atom index, starting with 0.\r
+\r
+}\r
+function _jmolMessagecallback(jmid, statmess) {\r
+       // if (statmess.indexOf("Script Terminated")==0)\r
+       {\r
+               var thisTime = new Date();\r
+               if (_console) {\r
+                       _console.value += "Last script execution took : "\r
+                                       + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0\r
+                                       + " seconds.";\r
+               }\r
+               _lastTime = thisTime;\r
+\r
+       }\r
+}\r