--- /dev/null
+// 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