66c5a3ee9b87df2741d0cb7ab4f4ce4cc56d970a
[jalview.git] / examples / javascript / jalview.js
1 // default console to report messages\r
2 var _console = document.getElementById("stdout");\r
3 var _jvapps = new Array();\r
4 // jvjmols is a list associating a jmol id to { modelstofiles }\r
5 var _jvjmols = new Hashtable();\r
6 // array of model names used to lookup index in Jmol\r
7 var _modeltofiles = new Array();\r
8 // counter for jmol structures\r
9 var mnum = 1;\r
10 \r
11 function setConsole(console) {\r
12         _console = console;\r
13 }\r
14 \r
15 function getDestinationFrms(source, frames) {\r
16         var frms = new Array();\r
17         var frid = "";\r
18         for (frm in frames) {\r
19                 try {\r
20                         frid = (source!=null) && (("" + source.getSequenceSetId()) == ("" + frames[frm].currentAlignFrame\r
21                                         .getSequenceSetId()));\r
22                 } catch (q) {\r
23                 };\r
24                 \r
25                 if (!frames[frm].equals(source) && !frid\r
26                                 && !frames[frm].currentAlignFrame.equals(source)) {\r
27                         frms[frms.length] = frames[frm];\r
28                 }\r
29         }\r
30         return frms;\r
31 }\r
32 \r
33 function mouseover(list1, list2, list3, list4) {\r
34         // list1 = new Object(list1);\r
35         var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
36         var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : "\r
37                         + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n";\r
38 \r
39         var flist = getDestinationFrms(list1, _jvapps);\r
40         if (_console) {\r
41                 _console.value = msg + "\n";\r
42         }\r
43 \r
44         for (follower in flist) {\r
45                 if (_console) {\r
46                         _console.value += "Sending to " + flist[follower] + "\n";\r
47                 }\r
48                 flist[follower].highlight(list[1], list[2], "true");\r
49         }\r
50         return true;\r
51 }\r
52 \r
53 function sellist(list1, list2, list3, list4) {\r
54         // list1 = new Object(list1);\r
55         var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
56         var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : "\r
57                         + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n";\r
58         var flist = getDestinationFrms(list1, _jvapps);\r
59         if (_console) {\r
60                 _console.value = msg + "\n";\r
61         }\r
62         \r
63         for (follower in flist) {\r
64                 if (_console) {\r
65                         _console.value += "Sending to " + flist[follower] + "\n";\r
66                 }\r
67                 flist[follower].selectIn(flist[follower].getDefaultTargetFrame(),\r
68                                 list[2], list[3])\r
69         }\r
70         return true;\r
71 }\r
72 \r
73 function viewlist(list1, list2, list3, list4) {\r
74         // list1 = new Object(list1);\r
75         var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
76         var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0]\r
77                         + " id : " + list[1] + "\nRow from " + list[2] + " and to "\r
78                         + list[3] + "\nVisible columns: " + list[4] + "\n";\r
79         var flist = getDestinationFrms(list1, _jvapps);\r
80         if (_console) {\r
81                 _console.value = msg + "\n";\r
82         }\r
83 \r
84         for (follower in flist) {\r
85                 if (_console) {\r
86                         _console.value += "Sending to " + flist[follower] + "\n";\r
87                 }\r
88                 flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(),\r
89                                 list[2], "-1");\r
90         }\r
91         return true;\r
92 }\r
93 \r
94 // register a jalview applet and add some handlers to it\r
95 // jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array\r
96 function linkJvJmol(applet, jmolView, modeltofiles) {\r
97         var i = _jvapps.length;\r
98         while (i--) {\r
99                 if (_jvapps[i].equals(applet)) {\r
100                         throw ("Ignoring additional linkJvJmol call for "\r
101                                         + applet.getName() + ".");\r
102                 }\r
103         }\r
104         _jvapps[_jvapps.length] = applet;\r
105         applet.setMouseoverListener("mouseover");\r
106         applet.setSelectionListener("sellist");\r
107         // viewListener not fully implemented in 2.7\r
108         // try { applet.setViewListener("viewlist"); } catch (err) {};\r
109         if (jmolView)\r
110         {\r
111                 var sep = applet.getSeparator();\r
112                 var oldjm=jmolView;\r
113                 // recover full id of Jmol applet\r
114                 jmolView=_jmolGetApplet(jmolView).id;\r
115                 var jmbinding=_jvjmols.get(jmolView);\r
116                 if (!jmbinding)\r
117                 {       \r
118                         jmbinding=new Object();\r
119                         jmbinding._modelstofiles=new Array();\r
120                         jmbinding._fullmpath=new Array();\r
121                         jmbinding._filetonum=new Hashtable();\r
122                         jmbinding._jmol=jmolView;\r
123                         jmbinding._jmhandle=oldjm;\r
124                         _jvjmols.put(jmolView,jmbinding);\r
125                 }\r
126                 \r
127                 jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles);\r
128                 jmbinding._jmol=jmolView;\r
129                 // now update structureListener list\r
130                 mtf="";\r
131                 var dbase = document.baseURI.substring(0,document.baseURI.lastIndexOf("/")+1);\r
132                 for (m in jmbinding._modelstofiles)\r
133                 { if (m>0) { mtf+=sep; }\r
134                 mtf+=jmbinding._modelstofiles[m];\r
135                 if (jmbinding._modelstofiles[m].indexOf("//")==-1)\r
136                         { jmbinding._fullmpath[m] = dbase+((jmbinding._modelstofiles[m].indexOf("/")==0) ? jmbinding._modelstofiles[m].substring(1) : jmbinding._modelstofiles[m]); }\r
137                   jmbinding._filetonum.put(jmbinding._modelstofiles[m], m+1); \r
138                   jmbinding._filetonum.put(jmbinding._fullmpath[m], m+1);\r
139                   \r
140                   }\r
141                 applet.setStructureListener("_structure", mtf);\r
142         }\r
143 }\r
144 \r
145 /*function _addJmolModel(jmolid, modelname) {\r
146         modelname=""+modelname;\r
147         var jminf = _jvjmols[jmolid];\r
148         if (!jminf) {\r
149                 jminf = new Object();\r
150                 jminf._modelstofiles = new Array(); //new Hashtable();\r
151                 jminf._jmol = jmolid;\r
152                 jminf._modellist=new Array();\r
153                 _jvjmols[jmolid] = jminf;\r
154         }\r
155         var obj = new Object();\r
156         jminf._modeltofiles[modelname] = obj; // .put(modelname, obj);\r
157         obj.id = modelname;\r
158         obj.mnum = jminf._modeltofiles.length;\r
159         jminf._modellist+=modelname;\r
160 }*/\r
161 \r
162 \r
163 \r
164 // jmol Jalview Methods\r
165 \r
166 function _structure(list1, list2, list3, list4) {\r
167         var follower;\r
168         // if (_console) { if (!_console.value) { _console.value="";} }\r
169         if (list1 == "mouseover") {\r
170                 var list = new Array(("" + list1), ("" + list2), ("" + list3),\r
171                                 ("" + list4));\r
172                 // 1 is pdb file, 2 is residue number, 3 is chain\r
173                 // list1 = new Object(list1);\r
174                 var base = list[1].indexOf(document.baseURI\r
175                                 .substring(0, document.baseURI.lastIndexOf('/'))\r
176                                 ); // .indexOf(_path);\r
177                 if (base==0) { base = document.baseURI.lastIndexOf('/'); }\r
178                 var sid = list[1]; // .substring(base);\r
179                 base = list[1].substring(0, base);\r
180                 if (_console) {\r
181                         _console.value += "Model is " + list[1] + ", Structure id is : "\r
182                                         + sid + "\n";\r
183                 }\r
184                 ;\r
185                 var siddat;\r
186                 for ( var jmolappi in _jvjmols.values()) {\r
187                         var jmolapp=_jvjmols.values()[jmolappi];\r
188                         var msg = "";\r
189                         if (siddat = jmolapp._filetonum.get(sid)) {\r
190                                 // we don't putin chain number because there isn't one ?\r
191                                 // skip select 0 bit\r
192                                 var ch = ""+list[3];\r
193                                 if ((""+list[2]).trim().length==1)\r
194                                         {\r
195                                         ch+=":"+list[2];\r
196                                         }\r
197                                 msg = "select (" + ch + " /" + siddat + ") ;";\r
198                         }\r
199                         if (msg) {\r
200                                 if (_console) {\r
201                                         _console.value += "Sending '" + msg + "' to jmol." + "\n";\r
202                                 }\r
203                         }\r
204                         jmolScriptWait(msg, "" + jmolapp._jmhandle);\r
205                         // only do highlight for one jmol ?\r
206                         // return 1;\r
207                 }\r
208         }\r
209         if (list1 == "colourstruct") {\r
210                 if (_console) {\r
211                         _console.value += 'colourStruct("' + list1 + '","' + list2\r
212                         + '") [' + list4 + ']' + "\n";\r
213                 }\r
214                 setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1);\r
215                 return 1;\r
216         }\r
217         return 1;\r
218 }\r
219 // last colour message\r
220 var _lastMsg = "";\r
221 // indicator - if _colourStruct==0 then no colouring is going on\r
222 var _colourStruct = 0;\r
223 \r
224 function colourStruct(involves, msg, handle) {\r
225         if (_colourStruct == 0) {\r
226                 _colourStruct = 1;\r
227                 for (ap in _jvapps) {\r
228                         var _msg = "";\r
229                         do {\r
230                                 if (_msg.match(/\S/)) {\r
231                                         _lastMsg += _msg;\r
232                                 }\r
233                                 _msg = "" + _jvapps[ap].getJsMessage(msg, handle);\r
234                         } while (_msg.match(/\S/));\r
235                 }\r
236                 // locate the jmol that should get the message\r
237                 for (var jmol in _jvjmols.values())\r
238                         {\r
239                         var jml=_jvjmols.values()[jmol];\r
240                         if (jml._filetonum.get(involves))\r
241                                 {\r
242                                         colourStructs(jml._jmhandle);\r
243                                 }\r
244                         }\r
245                 _colourStruct = 0;\r
246         } else {\r
247                 // setTimeout('colourStruct("'+msg+'","'+handle+'")',3);\r
248         }\r
249 }\r
250 \r
251 function colourStructs(jmolapp) {\r
252         dbg(0, "Colouring the structures\n");\r
253         jmolScriptWait("set selectionhalos false;" + _lastMsg\r
254                         + "; select 0; set selectionhalos true;", jmolapp);\r
255         _lastMsg = "";\r
256 }\r
257 var _jmolhovermsg="";\r
258 function _jmolhover(jmid, atomlabel, atomidx) {\r
259         var msg=""+jmid+" "+atomlabel+" "+atomidx;\r
260         if (_jmolhovermsg==msg)\r
261                 {\r
262                 return;\r
263                 }\r
264         _jmolhovermsg=msg;\r
265         modeltofiles = _jvjmols.get(jmid)._modelstofiles;\r
266         // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/);\r
267         // relaxed third parameter - may be null or a model number for multi model\r
268         // views\r
269         atomlabel = ("" + atomlabel)\r
270                         .match(/\[(.+)\](\d+):(.)\.([^\/]+)(\/\d+\.|).+/);\r
271         atomidx = "" + atomidx;\r
272         if (atomlabel[5]) {\r
273                 atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1];\r
274                 atomlabel[5] = parseInt(atomlabel[5])-1;\r
275         } else {\r
276                 // default - first model\r
277                 atomlabel[5] = 0;\r
278         }\r
279         // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews\r
280         for (ap in _jvapps) {\r
281                 _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3],\r
282                                 document.baseURI\r
283                                                 .substring(0, document.baseURI.lastIndexOf('/'))\r
284                                                 + "/" + \r
285                                                 modeltofiles[atomlabel[5]]);\r
286                 msg = _jmolhovermsg;\r
287         }\r
288 }\r
289 function _jmolpick(jmid, atomlabel, atomidx) {\r
290         atomlabel = "" + atomlabel;\r
291         atomidx = "" + atomidx;\r
292         // label is atom id, atom number, and xyz coordinates in the form:\r
293         // C6 #6 -0.30683374 -1.6836332 -0.716934\r
294         // atom index, starting with 0.\r
295 \r
296 }\r
297 function _jmolMessagecallback(jmid, statmess) {\r
298         // if (statmess.indexOf("Script Terminated")==0)\r
299         {\r
300                 var thisTime = new Date();\r
301                 if (_console) {\r
302                         _console.value += "Last script execution took : "\r
303                                         + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0\r
304                                         + " seconds.";\r
305                 }\r
306                 _lastTime = thisTime;\r
307 \r
308         }\r
309 }\r