Rev 2876 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2989 | bpr | 1 | /* Jmol 11.9 script library Jmol.js 6:56 AM 1/20/2010 Bob Hanson |
1365 | bpr | 2 | |
3 | checkbox heirarchy -- see http://chemapps.stolaf.edu/jmol/docs/examples-11/check.htm |
||
4 | |||
5 | based on: |
||
6 | * |
||
7 | * Copyright (C) 2004-2005 Miguel, Jmol Development, www.jmol.org |
||
8 | * |
||
9 | * Contact: hansonr@stolaf.edu |
||
10 | * |
||
11 | * This library is free software; you can redistribute it and/or |
||
12 | * modify it under the terms of the GNU Lesser General Public |
||
13 | * License as published by the Free Software Foundation; either |
||
14 | * version 2.1 of the License, or (at your option) any later version. |
||
15 | * |
||
16 | * This library is distributed in the hope that it will be useful, |
||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
19 | * Lesser General Public License for more details. |
||
20 | * |
||
21 | * You should have received a copy of the GNU Lesser General Public |
||
22 | * License along with this library; if not, write to the Free Software |
||
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
||
24 | * 02111-1307 USA. |
||
25 | */ |
||
26 | |||
27 | // for documentation see www.jmol.org/jslibrary |
||
28 | |||
29 | try{if(typeof(_jmol)!="undefined")exit() |
||
30 | |||
31 | // place "?NOAPPLET" on your command line to check applet control action with a textarea |
||
32 | // place "?JMOLJAR=xxxxx" to use a specific jar file |
||
33 | |||
34 | // bob hanson -- jmolResize(w,h) -- resizes absolutely or by percent (w or h 0.5 means 50%) |
||
2876 | bpr | 35 | // angel herraez -- update of jmolResize(w,h,targetSuffix) so it is not tied to first applet |
1365 | bpr | 36 | // bob hanson -- jmolEvaluate -- evaluates molecular math 8:37 AM 2/23/2007 |
37 | // bob hanson -- jmolScriptMessage -- returns all "scriptStatus" messages 8:37 AM 2/23/2007 |
||
38 | // bob hanson -- jmolScriptEcho -- returns all "scriptEcho" messages 8:37 AM 2/23/2007 |
||
39 | // bob hanson -- jmolScriptWait -- 11:31 AM 5/2/2006 |
||
40 | // bob hanson -- remove trailing separatorHTML in radio groups -- 12:18 PM 5/6/2006 |
||
41 | // bob hanson -- adds support for dynamic DOM script nodes 7:04 AM 5/19/2006 |
||
42 | // bob hanson -- adds try/catch for wiki - multiple code passes 7:05 AM 5/19/2006 |
||
43 | // bob hanson -- auto-initiates to defaultdir/defaultjar -- change as desired. |
||
44 | // bob hanson -- adding save/restore orientation w/ and w/o delay 11:49 AM 5/25/2006 |
||
45 | // bob hanson -- adding AjaxJS service 11:16 AM 6/3/2006 |
||
46 | // bob hanson -- fix for iframes not available for finding applet |
||
47 | // bob hanson -- added applet fake ?NOAPPLET URL flag |
||
48 | // bob hanson -- added jmolSetCallback(calbackName, funcName) 3:32 PM 6/13/2006 |
||
49 | // used PRIOR to jmolApplet() or jmolAppletInline() |
||
50 | // added 4th array element in jmolRadioGroup -- title |
||
51 | // added <span> and id around link, checkbox, radio, menu |
||
52 | // fixing AJAX loads for MSIE/Opera-Mozilla incompatibility |
||
53 | // -- renamed Jmol-11.js from Jmol-new.js; JmolApplet.jar from JmolAppletProto.jar |
||
54 | // renamed Jmol.js for Jmol 11 distribution |
||
55 | // -- modified jmolRestoreOrientation() to be immediate, no 1-second delay |
||
56 | // bob hanson -- jmolScriptWait always returns a string -- 11:23 AM 9/16/2006 |
||
57 | // bh -- jmolCommandInput() |
||
58 | // bh -- jmolSetTranslation(TF) -- forces translation even if there might be message callback issues |
||
59 | // bh -- minor fixes suggested by Angel |
||
60 | // bh -- adds jmolSetSyncId() and jmolGetSyncId() |
||
61 | // bh 3/2008 -- adds jmolAppendInlineScript() and jmolAppendInlineArray() |
||
62 | // bh 3/2008 -- fixes IE7 bug in relation to jmolLoadInlineArray() |
||
63 | // bh 6/2008 -- adds jmolSetAppletWindow() |
||
64 | // Angel H. 6/2008 -- added html <label> tags to checkboxes and radio buttons [in jmolCheckbox() and _jmolRadio() functions] |
||
65 | // bh 7/2008 -- code fix "for(i..." not "for(var i..." |
||
66 | // bh 12/2008 -- jmolLoadInline, jmolLoadInlineArray, jmolLoadInlineScript, jmolAppendInlineScript, jmolAppendInlineArray all return error message or null (Jmol 11.7.16) |
||
67 | // bh 12/2008 -- jmolScriptWaitOutput() -- waits for script to complete and delivers output normally sent to console |
||
68 | |||
2876 | bpr | 69 | // bh 5/2009 -- Support for XHTML using jmolSetXHTML(id) |
70 | // ah & bh 6/2009 -- New jmolResizeApplet() more flexible, similar to jmolApplet() size syntax |
||
2989 | bpr | 71 | // bh 11/2009 -- care in accessing top.document |
72 | // bh 12/2009 -- added jmolSetParameter(name, value) |
||
73 | // bh 12/2009 -- added PARAMS=name:value;name:value;name:value... for command line |
||
74 | // bh 12/2009 -- overhaul of target checking |
||
75 | // bh 1/2010 -- all _xxxx() methods ALWAYS have complete argument list |
||
76 | // bh 1/2010 -- adds option to run a JavaScript function from any Jmol control. |
||
77 | // This is accomplished by passing an array rather than a script: |
||
78 | // jmolHref([myfunc,"my param 1", "my param 2"], "testing") |
||
79 | // function myfunc(jmolControlObject, [myfunc,"my param 1", "my param 2"], target){...} |
||
80 | // and allows much more flexibility with responding to controls |
||
2876 | bpr | 81 | |
1365 | bpr | 82 | var defaultdir = "." |
83 | var defaultjar = "JmolApplet.jar" |
||
84 | |||
85 | |||
86 | // Note added 12:41 PM 9/21/2008 by Bob Hanson, hansonr@stolaf.edu: |
||
87 | |||
88 | // JMOLJAR=xxxxx.jar on the URL for this page will override |
||
89 | // the JAR file specified in the jmolInitialize() call. |
||
90 | |||
91 | // The idea is that it can be very useful to test a web page with different JAR files |
||
92 | // Or for an expert user to substitute a signed applet for an unsigned one |
||
93 | // so as to use a broader range of models or to create JPEG files, for example. |
||
94 | |||
95 | // If the JAR file is not in the current directory (has any sort of "/" in its name) |
||
96 | // then the user is presented with a warning and asked whether it is OK to change Jar files. |
||
97 | // The default action, if the user just presses "OK" is to NOT allow the change. |
||
98 | // The user must type the word "yes" in the prompt box for the change to be approved. |
||
99 | |||
100 | // If you don't want people to be able to switch in their own JAR file on your page, |
||
101 | // simply set this next line to read "var allowJMOLJAR = false". |
||
102 | |||
103 | |||
104 | var undefined; // for IE 5 ... wherein undefined is undefined |
||
105 | |||
106 | //////////////////////////////////////////////////////////////// |
||
107 | // Basic Scripting infrastruture |
||
108 | //////////////////////////////////////////////////////////////// |
||
109 | |||
110 | function jmolInitialize(codebaseDirectory, fileNameOrUseSignedApplet) { |
||
111 | if (_jmol.initialized) |
||
112 | return; |
||
113 | _jmol.initialized = true; |
||
2989 | bpr | 114 | if(_jmol.jmoljar) { |
115 | var f = _jmol.jmoljar; |
||
1365 | bpr | 116 | if (f.indexOf("/") >= 0) { |
117 | alert ("This web page URL is requesting that the applet used be " + f + ". This is a possible security risk, particularly if the applet is signed, because signed applets can read and write files on your local machine or network.") |
||
118 | var ok = prompt("Do you want to use applet " + f + "? ","yes or no") |
||
119 | if (ok == "yes") { |
||
120 | codebaseDirectory = f.substring(0, f.lastIndexOf("/")); |
||
121 | fileNameOrUseSignedApplet = f.substring(f.lastIndexOf("/") + 1); |
||
122 | } else { |
||
123 | _jmolGetJarFilename(fileNameOrUseSignedApplet); |
||
124 | alert("The web page URL was ignored. Continuing using " + _jmol.archivePath + ' in directory "' + codebaseDirectory + '"'); |
||
125 | } |
||
126 | } else { |
||
127 | fileNameOrUseSignedApplet = f; |
||
128 | } |
||
129 | } |
||
130 | _jmolSetCodebase(codebaseDirectory); |
||
131 | _jmolGetJarFilename(fileNameOrUseSignedApplet); |
||
132 | _jmolOnloadResetForms(); |
||
133 | } |
||
134 | |||
135 | function jmolSetTranslation(TF) { |
||
136 | _jmol.params.doTranslate = ''+TF; |
||
137 | } |
||
138 | |||
139 | function _jmolGetJarFilename(fileNameOrFlag) { |
||
140 | _jmol.archivePath = |
||
141 | (typeof(fileNameOrFlag) == "string" ? fileNameOrFlag : (fileNameOrFlag ? "JmolAppletSigned" : "JmolApplet") + "0.jar"); |
||
142 | } |
||
143 | |||
144 | function jmolSetDocument(doc) { |
||
145 | _jmol.currentDocument = doc; |
||
146 | } |
||
147 | |||
148 | function jmolSetAppletColor(boxbgcolor, boxfgcolor, progresscolor) { |
||
149 | _jmolInitCheck(); |
||
150 | _jmol.params.boxbgcolor = boxbgcolor; |
||
151 | if (boxfgcolor) |
||
152 | _jmol.params.boxfgcolor = boxfgcolor |
||
153 | else if (boxbgcolor == "white" || boxbgcolor == "#FFFFFF") |
||
154 | _jmol.params.boxfgcolor = "black"; |
||
155 | else |
||
156 | _jmol.params.boxfgcolor = "white"; |
||
157 | if (progresscolor) |
||
158 | _jmol.params.progresscolor = progresscolor; |
||
159 | if (_jmol.debugAlert) |
||
160 | alert(" boxbgcolor=" + _jmol.params.boxbgcolor + |
||
161 | " boxfgcolor=" + _jmol.params.boxfgcolor + |
||
162 | " progresscolor=" + _jmol.params.progresscolor); |
||
163 | } |
||
164 | |||
165 | function jmolSetAppletWindow(w) { |
||
166 | _jmol.appletWindow = w; |
||
167 | } |
||
168 | |||
169 | function jmolApplet(size, script, nameSuffix) { |
||
170 | _jmolInitCheck(); |
||
171 | return _jmolApplet(size, null, script, nameSuffix); |
||
172 | } |
||
173 | |||
174 | //////////////////////////////////////////////////////////////// |
||
175 | // Basic controls |
||
176 | //////////////////////////////////////////////////////////////// |
||
177 | |||
2989 | bpr | 178 | // undefined means it wasn't there; null means it was explicitly listed as null (so as to skip it) |
179 | |||
1365 | bpr | 180 | function jmolButton(script, label, id, title) { |
181 | _jmolInitCheck(); |
||
2989 | bpr | 182 | id != undefined && id != null || (id = "jmolButton" + _jmol.buttonCount); |
183 | label != undefined && label != null || (label = script.substring(0, 32)); |
||
1365 | bpr | 184 | ++_jmol.buttonCount; |
185 | var scriptIndex = _jmolAddScript(script); |
||
2876 | bpr | 186 | var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='button' name='" + id + "' id='" + id + |
1365 | bpr | 187 | "' value='" + label + |
2989 | bpr | 188 | "' onclick='_jmolClick(this," + scriptIndex + _jmol.targetText + |
2876 | bpr | 189 | ")' onmouseover='_jmolMouseOver(" + scriptIndex + |
190 | ");return true' onmouseout='_jmolMouseOut()' " + |
||
191 | _jmol.buttonCssText + " /></span>"; |
||
1365 | bpr | 192 | if (_jmol.debugAlert) |
193 | alert(t); |
||
194 | return _jmolDocumentWrite(t); |
||
195 | } |
||
196 | |||
197 | function jmolCheckbox(scriptWhenChecked, scriptWhenUnchecked, |
||
198 | labelHtml, isChecked, id, title) { |
||
199 | _jmolInitCheck(); |
||
2989 | bpr | 200 | id != undefined && id != null || (id = "jmolCheckbox" + _jmol.checkboxCount); |
1365 | bpr | 201 | ++_jmol.checkboxCount; |
202 | if (scriptWhenChecked == undefined || scriptWhenChecked == null || |
||
203 | scriptWhenUnchecked == undefined || scriptWhenUnchecked == null) { |
||
204 | alert("jmolCheckbox requires two scripts"); |
||
205 | return; |
||
206 | } |
||
207 | if (labelHtml == undefined || labelHtml == null) { |
||
208 | alert("jmolCheckbox requires a label"); |
||
209 | return; |
||
210 | } |
||
211 | var indexChecked = _jmolAddScript(scriptWhenChecked); |
||
212 | var indexUnchecked = _jmolAddScript(scriptWhenUnchecked); |
||
213 | var eospan = "</span>" |
||
2876 | bpr | 214 | var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='checkbox' name='" + id + "' id='" + id + |
215 | "' onclick='_jmolCbClick(this," + |
||
1365 | bpr | 216 | indexChecked + "," + indexUnchecked + _jmol.targetText + |
2876 | bpr | 217 | ")' onmouseover='_jmolCbOver(this," + indexChecked + "," + |
1365 | bpr | 218 | indexUnchecked + |
2876 | bpr | 219 | ");return true' onmouseout='_jmolMouseOut()' " + |
220 | (isChecked ? "checked='true' " : "")+ _jmol.checkboxCssText + " />" |
||
1365 | bpr | 221 | if (labelHtml.toLowerCase().indexOf("<td>")>=0) { |
222 | t += eospan |
||
223 | eospan = ""; |
||
224 | } |
||
225 | t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan; |
||
226 | if (_jmol.debugAlert) |
||
227 | alert(t); |
||
228 | return _jmolDocumentWrite(t); |
||
229 | } |
||
230 | |||
231 | function jmolStartNewRadioGroup() { |
||
232 | ++_jmol.radioGroupCount; |
||
233 | } |
||
234 | |||
235 | function jmolRadioGroup(arrayOfRadioButtons, separatorHtml, groupName, id, title) { |
||
236 | /* |
||
237 | |||
238 | array: [radio1,radio2,radio3...] |
||
239 | where radioN = ["script","label",isSelected,"id","title"] |
||
240 | |||
241 | */ |
||
242 | |||
243 | _jmolInitCheck(); |
||
244 | var type = typeof arrayOfRadioButtons; |
||
245 | if (type != "object" || type == null || ! arrayOfRadioButtons.length) { |
||
246 | alert("invalid arrayOfRadioButtons"); |
||
247 | return; |
||
248 | } |
||
2989 | bpr | 249 | separatorHtml != undefined && separatorHtml != null || (separatorHtml = " "); |
1365 | bpr | 250 | var len = arrayOfRadioButtons.length; |
251 | jmolStartNewRadioGroup(); |
||
2989 | bpr | 252 | groupName || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1)); |
1365 | bpr | 253 | var t = "<span id='"+(id ? id : groupName)+"'>"; |
254 | for (var i = 0; i < len; ++i) { |
||
255 | if (i == len - 1) |
||
256 | separatorHtml = ""; |
||
257 | var radio = arrayOfRadioButtons[i]; |
||
258 | type = typeof radio; |
||
259 | if (type == "object") { |
||
260 | t += _jmolRadio(radio[0], radio[1], radio[2], separatorHtml, groupName, (radio.length > 3 ? radio[3]: (id ? id : groupName)+"_"+i), (radio.length > 4 ? radio[4] : 0), title); |
||
261 | } else { |
||
262 | t += _jmolRadio(radio, null, null, separatorHtml, groupName, (id ? id : groupName)+"_"+i, title); |
||
263 | } |
||
264 | } |
||
265 | t+="</span>" |
||
266 | if (_jmol.debugAlert) |
||
267 | alert(t); |
||
268 | return _jmolDocumentWrite(t); |
||
269 | } |
||
270 | |||
271 | |||
272 | function jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) { |
||
273 | _jmolInitCheck(); |
||
274 | if (_jmol.radioGroupCount == 0) |
||
275 | ++_jmol.radioGroupCount; |
||
276 | var t = _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, (id ? id : groupName + "_" + _jmol.radioCount), title ? title : 0); |
||
277 | if (_jmol.debugAlert) |
||
278 | alert(t); |
||
279 | return _jmolDocumentWrite(t); |
||
280 | } |
||
281 | |||
282 | function jmolLink(script, label, id, title) { |
||
283 | _jmolInitCheck(); |
||
2989 | bpr | 284 | id != undefined && id != null || (id = "jmolLink" + _jmol.linkCount); |
285 | label != undefined && label != null || (label = script.substring(0, 32)); |
||
1365 | bpr | 286 | ++_jmol.linkCount; |
287 | var scriptIndex = _jmolAddScript(script); |
||
2876 | bpr | 288 | var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><a name='" + id + "' id='" + id + |
2989 | bpr | 289 | "' href='javascript:_jmolClick(this," + scriptIndex + _jmol.targetText + ");' onmouseover='_jmolMouseOver(" + scriptIndex + |
2876 | bpr | 290 | ");return true;' onmouseout='_jmolMouseOut()' " + |
1365 | bpr | 291 | _jmol.linkCssText + ">" + label + "</a></span>"; |
292 | if (_jmol.debugAlert) |
||
293 | alert(t); |
||
294 | return _jmolDocumentWrite(t); |
||
295 | } |
||
296 | |||
297 | function jmolCommandInput(label, size, id, title) { |
||
298 | _jmolInitCheck(); |
||
2989 | bpr | 299 | id != undefined && id != null || (id = "jmolCmd" + _jmol.cmdCount); |
300 | label != undefined && label != null || (label = "Execute"); |
||
301 | size != undefined && !isNaN(size) || (size = 60); |
||
1365 | bpr | 302 | ++_jmol.cmdCount; |
2876 | bpr | 303 | var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" + id + "' id='" + id + |
304 | "' size='"+size+"' onkeypress='_jmolCommandKeyPress(event,\""+id+"\"" + _jmol.targetText + ")'><input type=button value = '"+label+"' onclick='jmolScript(document.getElementById(\""+id+"\").value" + _jmol.targetText + ")' /></span>"; |
||
1365 | bpr | 305 | if (_jmol.debugAlert) |
306 | alert(t); |
||
307 | return _jmolDocumentWrite(t); |
||
308 | } |
||
309 | |||
2876 | bpr | 310 | function _jmolCommandKeyPress(e, id, target) { |
311 | var keycode = (window.event ? window.event.keyCode : e ? e.which : 0); |
||
312 | if (keycode == 13) { |
||
2989 | bpr | 313 | var inputBox = document.getElementById(id) |
314 | _jmolScriptExecute(inputBox, inputBox.value, target) |
||
2876 | bpr | 315 | } |
316 | } |
||
317 | |||
2989 | bpr | 318 | function _jmolScriptExecute(element,script,target) { |
319 | if (typeof(script) == "object") |
||
320 | script[0](element, script, target) |
||
321 | else |
||
322 | jmolScript(script, target) |
||
323 | } |
||
2876 | bpr | 324 | |
1365 | bpr | 325 | function jmolMenu(arrayOfMenuItems, size, id, title) { |
326 | _jmolInitCheck(); |
||
2989 | bpr | 327 | id != undefined && id != null || (id = "jmolMenu" + _jmol.menuCount); |
1365 | bpr | 328 | ++_jmol.menuCount; |
329 | var type = typeof arrayOfMenuItems; |
||
330 | if (type != null && type == "object" && arrayOfMenuItems.length) { |
||
331 | var len = arrayOfMenuItems.length; |
||
332 | if (typeof size != "number" || size == 1) |
||
333 | size = null; |
||
334 | else if (size < 0) |
||
335 | size = len; |
||
336 | var sizeText = size ? " size='" + size + "' " : ""; |
||
2876 | bpr | 337 | var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><select name='" + id + "' id='" + id + |
1365 | bpr | 338 | "' onChange='_jmolMenuSelected(this" + _jmol.targetText + ")'" + |
339 | sizeText + _jmol.menuCssText + ">"; |
||
340 | for (var i = 0; i < len; ++i) { |
||
341 | var menuItem = arrayOfMenuItems[i]; |
||
342 | type = typeof menuItem; |
||
343 | var script, text; |
||
344 | var isSelected = undefined; |
||
345 | if (type == "object" && menuItem != null) { |
||
346 | script = menuItem[0]; |
||
347 | text = menuItem[1]; |
||
348 | isSelected = menuItem[2]; |
||
349 | } else { |
||
350 | script = text = menuItem; |
||
351 | } |
||
2989 | bpr | 352 | text != undefined && text != null || (text = script); |
353 | if (script=="#optgroup") { |
||
1365 | bpr | 354 | t += "<optgroup label='" + text + "'>"; |
355 | } else if (script=="#optgroupEnd") { |
||
356 | t += "</optgroup>"; |
||
357 | } else { |
||
358 | var scriptIndex = _jmolAddScript(script); |
||
2876 | bpr | 359 | var selectedText = isSelected ? "' selected='true'>" : "'>"; |
1365 | bpr | 360 | t += "<option value='" + scriptIndex + selectedText + text + "</option>"; |
2989 | bpr | 361 | } |
1365 | bpr | 362 | } |
363 | t += "</select></span>"; |
||
364 | if (_jmol.debugAlert) |
||
365 | alert(t); |
||
366 | return _jmolDocumentWrite(t); |
||
367 | } |
||
368 | } |
||
369 | |||
370 | function jmolHtml(html) { |
||
371 | return _jmolDocumentWrite(html); |
||
372 | } |
||
373 | |||
374 | function jmolBr() { |
||
375 | return _jmolDocumentWrite("<br />"); |
||
376 | } |
||
377 | |||
378 | //////////////////////////////////////////////////////////////// |
||
379 | // advanced scripting functions |
||
380 | //////////////////////////////////////////////////////////////// |
||
381 | |||
382 | function jmolDebugAlert(enableAlerts) { |
||
383 | _jmol.debugAlert = (enableAlerts == undefined || enableAlerts) |
||
384 | } |
||
385 | |||
386 | function jmolAppletInline(size, inlineModel, script, nameSuffix) { |
||
387 | _jmolInitCheck(); |
||
388 | return _jmolApplet(size, _jmolSterilizeInline(inlineModel), |
||
389 | script, nameSuffix); |
||
390 | } |
||
391 | |||
392 | function jmolSetTarget(targetSuffix) { |
||
393 | _jmol.targetSuffix = targetSuffix; |
||
2989 | bpr | 394 | _jmol.targetText = targetSuffix ? ",\"" + targetSuffix + "\"" : ",0"; |
1365 | bpr | 395 | } |
396 | |||
397 | function jmolScript(script, targetSuffix) { |
||
398 | if (script) { |
||
399 | _jmolCheckBrowser(); |
||
400 | if (targetSuffix == "all") { |
||
401 | with (_jmol) { |
||
402 | for (var i = 0; i < appletSuffixes.length; ++i) { |
||
403 | var applet = _jmolGetApplet(appletSuffixes[i]); |
||
404 | if (applet) applet.script(script); |
||
405 | } |
||
406 | } |
||
407 | } else { |
||
408 | var applet=_jmolGetApplet(targetSuffix); |
||
409 | if (applet) applet.script(script); |
||
410 | } |
||
411 | } |
||
412 | } |
||
413 | |||
414 | function jmolLoadInline(model, targetSuffix) { |
||
415 | if (!model)return "ERROR: NO MODEL" |
||
416 | var applet=_jmolGetApplet(targetSuffix); |
||
417 | if (!applet)return "ERROR: NO APPLET" |
||
418 | if (typeof(model) == "string") |
||
419 | return applet.loadInlineString(model, "", false); |
||
420 | else |
||
421 | return applet.loadInlineArray(model, "", false); |
||
422 | } |
||
423 | |||
424 | |||
425 | function jmolLoadInlineScript(model, script, targetSuffix) { |
||
426 | if (!model)return "ERROR: NO MODEL" |
||
427 | var applet=_jmolGetApplet(targetSuffix); |
||
428 | if (!applet)return "ERROR: NO APPLET" |
||
429 | return applet.loadInlineString(model, script, false); |
||
430 | } |
||
431 | |||
432 | |||
433 | function jmolLoadInlineArray(ModelArray, script, targetSuffix) { |
||
434 | if (!model)return "ERROR: NO MODEL" |
||
2989 | bpr | 435 | script || (script="") |
1365 | bpr | 436 | var applet=_jmolGetApplet(targetSuffix); |
437 | if (!applet)return "ERROR: NO APPLET" |
||
438 | try { |
||
439 | return applet.loadInlineArray(ModelArray, script, false); |
||
440 | } catch (err) { |
||
441 | //IE 7 bug |
||
442 | return applet.loadInlineString(ModelArray.join("\n"), script, false); |
||
443 | } |
||
444 | } |
||
445 | |||
446 | function jmolAppendInlineArray(ModelArray, script, targetSuffix) { |
||
447 | if (!model)return "ERROR: NO MODEL" |
||
2989 | bpr | 448 | script || (script="") |
1365 | bpr | 449 | var applet=_jmolGetApplet(targetSuffix); |
450 | if (!applet)return "ERROR: NO APPLET" |
||
451 | try { |
||
452 | return applet.loadInlineArray(ModelArray, script, true); |
||
453 | } catch (err) { |
||
454 | //IE 7 bug |
||
455 | return applet.loadInlineString(ModelArray.join("\n"), script, true); |
||
456 | } |
||
457 | } |
||
458 | |||
459 | function jmolAppendInlineScript(model, script, targetSuffix) { |
||
460 | if (!model)return "ERROR: NO MODEL" |
||
461 | var applet=_jmolGetApplet(targetSuffix); |
||
462 | if (!applet)return "ERROR: NO APPLET" |
||
463 | return applet.loadInlineString(model, script, true); |
||
464 | } |
||
465 | |||
466 | function jmolCheckBrowser(action, urlOrMessage, nowOrLater) { |
||
467 | if (typeof action == "string") { |
||
468 | action = action.toLowerCase(); |
||
2989 | bpr | 469 | action == "alert" || action == "redirect" || action == "popup" || (action = null); |
1365 | bpr | 470 | } |
471 | if (typeof action != "string") |
||
472 | alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" + |
||
473 | "action must be 'alert', 'redirect', or 'popup'"); |
||
474 | else { |
||
475 | if (typeof urlOrMessage != "string") |
||
476 | alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" + |
||
477 | "urlOrMessage must be a string"); |
||
478 | else { |
||
479 | _jmol.checkBrowserAction = action; |
||
480 | _jmol.checkBrowserUrlOrMessage = urlOrMessage; |
||
481 | } |
||
482 | } |
||
483 | if (typeof nowOrLater == "string" && nowOrLater.toLowerCase() == "now") |
||
484 | _jmolCheckBrowser(); |
||
485 | } |
||
486 | |||
487 | //////////////////////////////////////////////////////////////// |
||
488 | // Cascading Style Sheet Class support |
||
489 | //////////////////////////////////////////////////////////////// |
||
490 | |||
491 | function jmolSetAppletCssClass(appletCssClass) { |
||
492 | if (_jmol.hasGetElementById) { |
||
493 | _jmol.appletCssClass = appletCssClass; |
||
494 | _jmol.appletCssText = appletCssClass ? "class='" + appletCssClass + "' " : ""; |
||
495 | } |
||
496 | } |
||
497 | |||
498 | function jmolSetButtonCssClass(buttonCssClass) { |
||
499 | if (_jmol.hasGetElementById) { |
||
500 | _jmol.buttonCssClass = buttonCssClass; |
||
501 | _jmol.buttonCssText = buttonCssClass ? "class='" + buttonCssClass + "' " : ""; |
||
502 | } |
||
503 | } |
||
504 | |||
505 | function jmolSetCheckboxCssClass(checkboxCssClass) { |
||
506 | if (_jmol.hasGetElementById) { |
||
507 | _jmol.checkboxCssClass = checkboxCssClass; |
||
508 | _jmol.checkboxCssText = checkboxCssClass ? "class='" + checkboxCssClass + "' " : ""; |
||
509 | } |
||
510 | } |
||
511 | |||
512 | function jmolSetRadioCssClass(radioCssClass) { |
||
513 | if (_jmol.hasGetElementById) { |
||
514 | _jmol.radioCssClass = radioCssClass; |
||
515 | _jmol.radioCssText = radioCssClass ? "class='" + radioCssClass + "' " : ""; |
||
516 | } |
||
517 | } |
||
518 | |||
519 | function jmolSetLinkCssClass(linkCssClass) { |
||
520 | if (_jmol.hasGetElementById) { |
||
521 | _jmol.linkCssClass = linkCssClass; |
||
522 | _jmol.linkCssText = linkCssClass ? "class='" + linkCssClass + "' " : ""; |
||
523 | } |
||
524 | } |
||
525 | |||
526 | function jmolSetMenuCssClass(menuCssClass) { |
||
527 | if (_jmol.hasGetElementById) { |
||
528 | _jmol.menuCssClass = menuCssClass; |
||
529 | _jmol.menuCssText = menuCssClass ? "class='" + menuCssClass + "' " : ""; |
||
530 | } |
||
531 | } |
||
532 | |||
533 | //////////////////////////////////////////////////////////////// |
||
534 | // functions for INTERNAL USE ONLY which are subject to change |
||
535 | // use at your own risk ... you have been WARNED! |
||
536 | //////////////////////////////////////////////////////////////// |
||
537 | var _jmol = { |
||
538 | currentDocument: document, |
||
539 | |||
540 | debugAlert: false, |
||
541 | |||
542 | codebase: "", |
||
543 | modelbase: ".", |
||
544 | |||
545 | appletCount: 0, |
||
546 | appletSuffixes: [], |
||
547 | appletWindow: null, |
||
2876 | bpr | 548 | allowedJmolSize: [25, 2048, 300], // min, max, default (pixels) |
549 | /* By setting the _jmol.allowedJmolSize[] variable in the webpage |
||
550 | before calling jmolApplet(), limits for applet size can be overriden. |
||
551 | 2048 standard for GeoWall (http://geowall.geo.lsa.umich.edu/home.html) |
||
552 | */ |
||
1365 | bpr | 553 | buttonCount: 0, |
554 | checkboxCount: 0, |
||
555 | linkCount: 0, |
||
556 | cmdCount: 0, |
||
557 | menuCount: 0, |
||
558 | radioCount: 0, |
||
559 | radioGroupCount: 0, |
||
560 | |||
561 | appletCssClass: null, |
||
562 | appletCssText: "", |
||
563 | buttonCssClass: null, |
||
564 | buttonCssText: "", |
||
565 | checkboxCssClass: null, |
||
566 | checkboxCssText: "", |
||
567 | radioCssClass: null, |
||
568 | radioCssText: "", |
||
569 | linkCssClass: null, |
||
570 | linkCssText: "", |
||
571 | menuCssClass: null, |
||
572 | menuCssText: "", |
||
573 | |||
574 | targetSuffix: 0, |
||
2989 | bpr | 575 | targetText: ",0", |
1365 | bpr | 576 | scripts: [""], |
577 | params: { |
||
578 | syncId: ("" + Math.random()).substring(3), |
||
579 | progressbar: "true", |
||
580 | progresscolor: "blue", |
||
581 | boxbgcolor: "black", |
||
582 | boxfgcolor: "white", |
||
583 | boxmessage: "Downloading JmolApplet ..." |
||
584 | }, |
||
585 | ua: navigator.userAgent.toLowerCase(), |
||
586 | uaVersion: parseFloat(navigator.appVersion), |
||
587 | |||
588 | os: "unknown", |
||
589 | browser: "unknown", |
||
590 | browserVersion: 0, |
||
591 | hasGetElementById: !!document.getElementById, |
||
592 | isJavaEnabled: navigator.javaEnabled(), |
||
593 | isNetscape47Win: false, |
||
594 | isIEWin: false, |
||
595 | useIEObject: false, |
||
596 | useHtml4Object: false, |
||
597 | |||
598 | windowsClassId: "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93", |
||
599 | windowsCabUrl: |
||
600 | "http://java.sun.com/update/1.5.0/jinstall-1_5_0_05-windows-i586.cab", |
||
601 | |||
602 | isBrowserCompliant: false, |
||
603 | isJavaCompliant: false, |
||
604 | isFullyCompliant: false, |
||
605 | |||
606 | initialized: false, |
||
607 | initChecked: false, |
||
608 | |||
609 | browserChecked: false, |
||
610 | checkBrowserAction: "alert", |
||
611 | checkBrowserUrlOrMessage: null, |
||
612 | |||
613 | archivePath: null, // JmolApplet0.jar OR JmolAppletSigned0.jar |
||
614 | |||
615 | previousOnloadHandler: null, |
||
2989 | bpr | 616 | |
617 | jmoljar: null, |
||
618 | useNoApplet: false, |
||
619 | |||
1365 | bpr | 620 | ready: {} |
621 | } |
||
622 | |||
623 | with (_jmol) { |
||
624 | function _jmolTestUA(candidate) { |
||
625 | var ua = _jmol.ua; |
||
626 | var index = ua.indexOf(candidate); |
||
627 | if (index < 0) |
||
628 | return false; |
||
629 | _jmol.browser = candidate; |
||
630 | _jmol.browserVersion = parseFloat(ua.substring(index+candidate.length+1)); |
||
631 | return true; |
||
632 | } |
||
633 | |||
634 | function _jmolTestOS(candidate) { |
||
635 | if (_jmol.ua.indexOf(candidate) < 0) |
||
636 | return false; |
||
637 | _jmol.os = candidate; |
||
638 | return true; |
||
639 | } |
||
640 | |||
641 | _jmolTestUA("konqueror") || |
||
642 | _jmolTestUA("safari") || |
||
643 | _jmolTestUA("omniweb") || |
||
644 | _jmolTestUA("opera") || |
||
645 | _jmolTestUA("webtv") || |
||
646 | _jmolTestUA("icab") || |
||
647 | _jmolTestUA("msie") || |
||
648 | (_jmol.ua.indexOf("compatible") < 0 && _jmolTestUA("mozilla")); |
||
649 | |||
650 | _jmolTestOS("linux") || |
||
651 | _jmolTestOS("unix") || |
||
652 | _jmolTestOS("mac") || |
||
653 | _jmolTestOS("win"); |
||
654 | |||
655 | isNetscape47Win = (os == "win" && browser == "mozilla" && |
||
656 | browserVersion >= 4.78 && browserVersion <= 4.8); |
||
657 | |||
658 | if (os == "win") { |
||
659 | isBrowserCompliant = hasGetElementById; |
||
660 | } else if (os == "mac") { // mac is the problem child :-( |
||
661 | if (browser == "mozilla" && browserVersion >= 5) { |
||
662 | // miguel 2004 11 17 |
||
663 | // checking the plugins array does not work because |
||
664 | // Netscape 7.2 OS X still has Java 1.3.1 listed even though |
||
665 | // javaplugin.sf.net is installed to upgrade to 1.4.2 |
||
666 | eval("try {var v = java.lang.System.getProperty('java.version');" + |
||
667 | " _jmol.isBrowserCompliant = v >= '1.4.2';" + |
||
668 | " } catch (e) { }"); |
||
669 | } else if (browser == "opera" && browserVersion <= 7.54) { |
||
670 | isBrowserCompliant = false; |
||
671 | } else { |
||
672 | isBrowserCompliant = hasGetElementById && |
||
673 | !((browser == "msie") || |
||
674 | (browser == "safari" && browserVersion < 125.12)); |
||
675 | } |
||
676 | } else if (os == "linux" || os == "unix") { |
||
677 | if (browser == "konqueror" && browserVersion <= 3.3) |
||
678 | isBrowserCompliant = false; |
||
679 | else |
||
680 | isBrowserCompliant = hasGetElementById; |
||
681 | } else { // other OS |
||
682 | isBrowserCompliant = hasGetElementById; |
||
683 | } |
||
684 | |||
685 | // possibly more checks in the future for this |
||
686 | isJavaCompliant = isJavaEnabled; |
||
687 | |||
688 | isFullyCompliant = isBrowserCompliant && isJavaCompliant; |
||
689 | |||
690 | // IE5.5 works just fine ... but let's push them to Sun Java |
||
691 | isIEWin = (os == "win" && browser == "msie" && browserVersion >= 5.5); |
||
692 | useIEObject = isIEWin; |
||
693 | useHtml4Object = |
||
694 | (os != "mac" && browser == "mozilla" && browserVersion >= 5) || |
||
695 | (os == "win" && browser == "opera" && browserVersion >= 8) || |
||
696 | (os == "mac" && browser == "safari" && browserVersion >= 412.2); |
||
2989 | bpr | 697 | try { |
698 | if (top.location.search.indexOf("JMOLJAR=")>=0) |
||
699 | jmoljar = top.location.search.split("JMOLJAR=")[1].split("&")[0]; |
||
700 | } catch(e) { |
||
701 | // can't access top.location |
||
702 | } |
||
703 | try { |
||
704 | useNoApplet = (top.location.search.indexOf("NOAPPLET")>=0); |
||
705 | } catch(e) { |
||
706 | // can't access top.document |
||
707 | } |
||
708 | } |
||
1365 | bpr | 709 | |
2989 | bpr | 710 | function jmolSetParameter(name,value) { |
711 | _jmol.params[name] = value |
||
1365 | bpr | 712 | } |
713 | |||
714 | function jmolSetCallback(callbackName,funcName) { |
||
715 | _jmol.params[callbackName] = funcName |
||
716 | } |
||
717 | |||
2989 | bpr | 718 | try { |
719 | // note this is done FIRST, so it cannot override a setting done by the developer |
||
720 | if (top.location.search.indexOf("PARAMS=")>=0) { |
||
721 | var pars = unescape(top.location.search.split("PARAMS=")[1].split("&")[0]).split(";"); |
||
722 | for (var i = 0; i < pars.length; i++) { |
||
723 | var p = pars[i].split(":"); |
||
724 | jmolSetParameter(p[0],p[1]); |
||
725 | } |
||
726 | } |
||
727 | } catch(e) { |
||
728 | // can't access top.location |
||
729 | } |
||
730 | |||
1365 | bpr | 731 | function jmolSetSyncId(n) { |
732 | return _jmol.params["syncId"] = n |
||
733 | } |
||
734 | |||
735 | function jmolGetSyncId() { |
||
736 | return _jmol.params["syncId"] |
||
737 | } |
||
738 | |||
739 | function jmolSetLogLevel(n) { |
||
740 | _jmol.params.logLevel = ''+n; |
||
741 | } |
||
742 | |||
743 | /* AngelH, mar2007: |
||
744 | By (re)setting these variables in the webpage before calling jmolApplet(), |
||
745 | a custom message can be provided (e.g. localized for user's language) when no Java is installed. |
||
746 | */ |
||
747 | if (noJavaMsg==undefined) var noJavaMsg = |
||
748 | "You do not have Java applets enabled in your web browser, or your browser is blocking this applet.<br />\n" + |
||
749 | "Check the warning message from your browser and/or enable Java applets in<br />\n" + |
||
750 | "your web browser preferences, or install the Java Runtime Environment from <a href='http://www.java.com'>www.java.com</a><br />"; |
||
751 | if (noJavaMsg2==undefined) var noJavaMsg2 = |
||
752 | "You do not have the<br />\n" + |
||
753 | "Java Runtime Environment<br />\n" + |
||
754 | "installed for applet support.<br />\n" + |
||
755 | "Visit <a href='http://www.java.com'>www.java.com</a>"; |
||
756 | function _jmolApplet(size, inlineModel, script, nameSuffix) { |
||
757 | /* AngelH, mar2007 |
||
758 | Fixed percent / pixel business, to avoid browser errors: |
||
2989 | bpr | 759 | put "px" where needed, avoid where not. |
760 | |||
761 | Bob Hanson, 1/2010 |
||
762 | Fixed inline escape changing returns to | |
||
1365 | bpr | 763 | */ |
764 | with (_jmol) { |
||
2989 | bpr | 765 | nameSuffix == undefined && (nameSuffix = appletCount); |
1365 | bpr | 766 | appletSuffixes.push(nameSuffix); |
767 | ++appletCount; |
||
2989 | bpr | 768 | script || (script = "select *"); |
1365 | bpr | 769 | var sz = _jmolGetAppletSize(size); |
770 | var widthAndHeight = " width='" + sz[0] + "' height='" + sz[1] + "' "; |
||
771 | var tHeader, tFooter; |
||
2989 | bpr | 772 | codebase || jmolInitialize("."); |
1365 | bpr | 773 | if (useIEObject || useHtml4Object) { |
774 | params.name = 'jmolApplet' + nameSuffix; |
||
775 | params.archive = archivePath; |
||
776 | params.mayscript = 'true'; |
||
777 | params.codebase = codebase; |
||
778 | } |
||
779 | if (useIEObject) { // use MSFT IE6 object tag with .cab file reference |
||
780 | winCodebase = (windowsCabUrl ? " codebase='" + windowsCabUrl + "'\n" : ""); |
||
781 | params.code = 'JmolApplet'; |
||
782 | tHeader = |
||
783 | "<object name='jmolApplet" + nameSuffix + |
||
784 | "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" + |
||
785 | " classid='" + windowsClassId + "'\n" + winCodebase + widthAndHeight + ">\n"; |
||
786 | tFooter = "</object>"; |
||
787 | } else if (useHtml4Object) { // use HTML4 object tag |
||
788 | tHeader = |
||
789 | "<object name='jmolApplet" + nameSuffix + |
||
790 | "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" + |
||
791 | " classid='java:JmolApplet'\n" + |
||
792 | " type='application/x-java-applet'\n" + |
||
793 | widthAndHeight + ">\n"; |
||
794 | tFooter = "</object>"; |
||
795 | } else { // use applet tag |
||
796 | tHeader = |
||
797 | "<applet name='jmolApplet" + nameSuffix + |
||
798 | "' id='jmolApplet" + nameSuffix + |
||
799 | "' " + appletCssText + |
||
800 | " code='JmolApplet'" + |
||
801 | " archive='" + archivePath + "' codebase='" + codebase + "'\n" + |
||
802 | widthAndHeight + |
||
803 | " mayscript='true'>\n"; |
||
804 | tFooter = "</applet>"; |
||
805 | } |
||
806 | var visitJava; |
||
807 | if (isIEWin || useHtml4Object) { |
||
808 | var szX = "width:" + sz[0] |
||
809 | if ( szX.indexOf("%")==-1 ) szX+="px" |
||
810 | var szY = "height:" + sz[1] |
||
811 | if ( szY.indexOf("%")==-1 ) szY+="px" |
||
812 | visitJava = |
||
813 | "<p style='background-color:yellow; color:black; " + |
||
814 | szX + ";" + szY + ";" + |
||
815 | // why doesn't this vertical-align work? |
||
816 | "text-align:center;vertical-align:middle;'>\n" + |
||
817 | noJavaMsg + |
||
818 | "</p>"; |
||
819 | } else { |
||
820 | visitJava = |
||
821 | "<table bgcolor='yellow'><tr>" + |
||
822 | "<td align='center' valign='middle' " + widthAndHeight + "><font color='black'>\n" + |
||
823 | noJavaMsg2 + |
||
824 | "</font></td></tr></table>"; |
||
825 | } |
||
826 | params.loadInline = (inlineModel ? inlineModel : ""); |
||
827 | params.script = (script ? _jmolSterilizeScript(script) : ""); |
||
828 | var t = tHeader + _jmolParams() + visitJava + tFooter; |
||
829 | jmolSetTarget(nameSuffix); |
||
830 | ready["jmolApplet" + nameSuffix] = false; |
||
831 | if (_jmol.debugAlert) |
||
832 | alert(t); |
||
833 | return _jmolDocumentWrite(t); |
||
834 | } |
||
835 | } |
||
836 | |||
837 | function _jmolParams() { |
||
838 | var t = ""; |
||
2876 | bpr | 839 | for (var i in _jmol.params) |
1365 | bpr | 840 | if(_jmol.params[i]!="") |
841 | t+=" <param name='"+i+"' value='"+_jmol.params[i]+"' />\n"; |
||
842 | return t |
||
843 | } |
||
844 | |||
845 | function _jmolInitCheck() { |
||
846 | if (_jmol.initChecked) |
||
847 | return; |
||
848 | _jmol.initChecked = true; |
||
849 | jmolInitialize(defaultdir, defaultjar) |
||
850 | } |
||
851 | |||
852 | function _jmolCheckBrowser() { |
||
853 | with (_jmol) { |
||
854 | if (browserChecked) |
||
855 | return; |
||
856 | browserChecked = true; |
||
857 | |||
858 | if (isFullyCompliant) |
||
859 | return true; |
||
860 | |||
861 | if (checkBrowserAction == "redirect") |
||
862 | location.href = checkBrowserUrlOrMessage; |
||
863 | else if (checkBrowserAction == "popup") |
||
864 | _jmolPopup(checkBrowserUrlOrMessage); |
||
865 | else { |
||
866 | var msg = checkBrowserUrlOrMessage; |
||
867 | if (msg == null) |
||
868 | msg = "Your web browser is not fully compatible with Jmol\n\n" + |
||
869 | "browser: " + browser + |
||
870 | " version: " + browserVersion + |
||
871 | " os: " + os + |
||
2876 | bpr | 872 | " isBrowserCompliant: " + isBrowserCompliant + |
873 | " isJavaCompliant: " + isJavaCompliant + |
||
1365 | bpr | 874 | "\n\n" + ua; |
875 | alert(msg); |
||
876 | } |
||
877 | } |
||
878 | return false; |
||
879 | } |
||
880 | |||
2876 | bpr | 881 | function jmolSetXHTML(id) { |
882 | _jmol.isXHTML = true |
||
883 | _jmol.XhtmlElement = null |
||
884 | _jmol.XhtmlAppendChild = false |
||
885 | if (id){ |
||
886 | _jmol.XhtmlElement = document.getElementById(id) |
||
887 | _jmol.XhtmlAppendChild = true |
||
888 | } |
||
889 | } |
||
890 | |||
1365 | bpr | 891 | function _jmolDocumentWrite(text) { |
2876 | bpr | 892 | if (_jmol.currentDocument) { |
893 | if (_jmol.isXHTML && !_jmol.XhtmlElement) { |
||
894 | var s = document.getElementsByTagName("script") |
||
895 | _jmol.XhtmlElement = s.item(s.length - 1) |
||
896 | _jmol.XhtmlAppendChild = false |
||
897 | } |
||
898 | if (_jmol.XhtmlElement) { |
||
899 | _jmolDomDocumentWrite(text) |
||
900 | } else { |
||
901 | _jmol.currentDocument.write(text); |
||
902 | } |
||
903 | } |
||
904 | return text; |
||
1365 | bpr | 905 | } |
906 | |||
2876 | bpr | 907 | function _jmolDomDocumentWrite(data) { |
908 | var pt = 0 |
||
909 | var Ptr = [] |
||
910 | Ptr[0] = 0 |
||
911 | while (Ptr[0] < data.length) { |
||
912 | var child = _jmolGetDomElement(data, Ptr) |
||
913 | if (!child)break |
||
914 | if (_jmol.XhtmlAppendChild) |
||
915 | _jmol.XhtmlElement.appendChild(child) |
||
916 | else |
||
917 | _jmol.XhtmlElement.parentNode.insertBefore(child, _jmol.XhtmlElement); |
||
918 | } |
||
919 | } |
||
920 | function _jmolGetDomElement(data, Ptr, closetag, lvel) { |
||
921 | var e = document.createElement("span") |
||
922 | e.innerHTML = data |
||
923 | Ptr[0] = data.length |
||
924 | return e |
||
925 | |||
926 | //unnecessary? |
||
927 | |||
2989 | bpr | 928 | closetag || (closetag = "") |
929 | lvel || (lvel = 0) |
||
2876 | bpr | 930 | var pt0 = Ptr[0] |
931 | var pt = pt0 |
||
932 | while (pt < data.length && data.charAt(pt) != "<") pt++ |
||
933 | if (pt != pt0) { |
||
934 | var text = data.substring(pt0, pt) |
||
935 | Ptr[0] = pt |
||
936 | return document.createTextNode(text) |
||
937 | } |
||
938 | pt0 = ++pt |
||
939 | var ch |
||
940 | while (pt < data.length && "\n\r\t >".indexOf(ch = data.charAt(pt)) < 0) pt++ |
||
941 | var tagname = data.substring(pt0, pt) |
||
942 | var e = (tagname == closetag || tagname == "/" ? "" |
||
943 | : document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', tagname) |
||
944 | : document.createElement(tagname)); |
||
945 | if (ch == ">") { |
||
946 | Ptr[0] = ++pt |
||
947 | return e |
||
948 | } |
||
949 | while (pt < data.length && (ch = data.charAt(pt)) != ">") { |
||
950 | while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++ |
||
951 | pt0 = pt |
||
952 | while (pt < data.length && "\n\r\t =/>".indexOf(ch = data.charAt(pt)) < 0) pt++ |
||
953 | var attrname = data.substring(pt0, pt).toLowerCase() |
||
954 | if (attrname && ch != "=") |
||
955 | e.setAttribute(attrname, "true") |
||
956 | while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++ |
||
957 | if (ch == "/") { |
||
958 | Ptr[0] = pt + 2 |
||
959 | return e |
||
960 | } else if (ch == "=") { |
||
961 | var quote = data.charAt(++pt) |
||
962 | pt0 = ++pt |
||
963 | while (pt < data.length && (ch = data.charAt(pt)) != quote) pt++ |
||
964 | var attrvalue = data.substring(pt0, pt) |
||
965 | e.setAttribute(attrname, attrvalue) |
||
966 | pt++ |
||
967 | } |
||
968 | } |
||
969 | Ptr[0] = ++pt |
||
970 | while (Ptr[0] < data.length) { |
||
971 | var child = _jmolGetDomElement(data, Ptr, "/" + tagname, lvel+1) |
||
972 | if (!child)break |
||
973 | e.appendChild(child) |
||
974 | } |
||
975 | return e |
||
976 | } |
||
977 | |||
1365 | bpr | 978 | function _jmolPopup(url) { |
979 | var popup = window.open(url, "JmolPopup", |
||
980 | "left=150,top=150,height=400,width=600," + |
||
981 | "directories=yes,location=yes,menubar=yes," + |
||
982 | "toolbar=yes," + |
||
983 | "resizable=yes,scrollbars=yes,status=yes"); |
||
984 | if (popup.focus) |
||
985 | poup.focus(); |
||
986 | } |
||
987 | |||
988 | function _jmolReadyCallback(name) { |
||
989 | if (_jmol.debugAlert) |
||
990 | alert(name + " is ready"); |
||
991 | _jmol.ready["" + name] = true; |
||
992 | } |
||
993 | |||
994 | function _jmolSterilizeScript(script) { |
||
2989 | bpr | 995 | script = script.replace(/'/g, "'"); |
1365 | bpr | 996 | if (_jmol.debugAlert) |
2989 | bpr | 997 | alert("script:\n" + script); |
998 | return script; |
||
1365 | bpr | 999 | } |
1000 | |||
1001 | function _jmolSterilizeInline(model) { |
||
2989 | bpr | 1002 | model = model.replace(/\r|\n|\r\n/g, (model.indexOf("|") >= 0 ? "\\/n" : "|")).replace(/'/g, "'"); |
1365 | bpr | 1003 | if (_jmol.debugAlert) |
2989 | bpr | 1004 | alert("inline model:\n" + model); |
1005 | return model; |
||
1365 | bpr | 1006 | } |
1007 | |||
1008 | function _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) { |
||
1009 | ++_jmol.radioCount; |
||
2989 | bpr | 1010 | groupName != undefined && groupName != null || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1)); |
1365 | bpr | 1011 | if (!script) |
1012 | return ""; |
||
2989 | bpr | 1013 | labelHtml != undefined && labelHtml != null || (labelHtml = script.substring(0, 32)); |
1014 | separatorHtml || (separatorHtml = "") |
||
1365 | bpr | 1015 | var scriptIndex = _jmolAddScript(script); |
1016 | var eospan = "</span>" |
||
2876 | bpr | 1017 | var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" |
2989 | bpr | 1018 | + groupName + "' id='"+id+"' type='radio' onclick='_jmolClick(this," + |
2876 | bpr | 1019 | scriptIndex + _jmol.targetText + ");return true;' onmouseover='_jmolMouseOver(" + |
1020 | scriptIndex + ");return true;' onmouseout='_jmolMouseOut()' " + |
||
1021 | (isChecked ? "checked='true' " : "") + _jmol.radioCssText + " />" |
||
1365 | bpr | 1022 | if (labelHtml.toLowerCase().indexOf("<td>")>=0) { |
1023 | t += eospan |
||
1024 | eospan = ""; |
||
1025 | } |
||
1026 | t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan + separatorHtml; |
||
1027 | |||
1028 | return t; |
||
1029 | } |
||
1030 | |||
1031 | function _jmolFindApplet(target) { |
||
1032 | // first look for the target in the current window |
||
1033 | var applet = _jmolFindAppletInWindow(_jmol.appletWindow != null ? _jmol.appletWindow : window, target); |
||
1034 | // THEN look for the target in child frames |
||
1035 | if (applet == undefined) |
||
1036 | applet = _jmolSearchFrames(window, target); |
||
1037 | // FINALLY look for the target in sibling frames |
||
1038 | if (applet == undefined) |
||
1039 | applet = _jmolSearchFrames(top, target); // look starting in top frame |
||
1040 | return applet; |
||
1041 | } |
||
1042 | |||
1043 | function _jmolGetApplet(targetSuffix){ |
||
1044 | var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0"); |
||
1045 | var applet = _jmolFindApplet(target); |
||
1046 | if (applet) return applet |
||
2989 | bpr | 1047 | _jmol.alerted || alert("could not find applet " + target); |
1365 | bpr | 1048 | _jmol.alerted = true; |
1049 | return null |
||
1050 | } |
||
1051 | |||
1052 | function _jmolSearchFrames(win, target) { |
||
1053 | var applet; |
||
1054 | var frames = win.frames; |
||
1055 | if (frames && frames.length) { // look in all the frames below this window |
||
1056 | try{ |
||
1057 | for (var i = 0; i < frames.length; ++i) { |
||
1058 | applet = _jmolSearchFrames(frames[i], target); |
||
1059 | if (applet) |
||
1060 | return applet; |
||
1061 | } |
||
1062 | }catch(e) { |
||
1063 | if (_jmol.debugAlert) |
||
1064 | alert("Jmol.js _jmolSearchFrames cannot access " + win.name + ".frame[" + i + "] consider using jmolSetAppletWindow()") |
||
1065 | } |
||
1066 | } |
||
1067 | return applet = _jmolFindAppletInWindow(win, target) |
||
1068 | } |
||
1069 | |||
1070 | function _jmolFindAppletInWindow(win, target) { |
||
1071 | var doc = win.document; |
||
1072 | // getElementById fails on MacOSX Safari & Mozilla |
||
1073 | if (_jmol.useHtml4Object || _jmol.useIEObject) |
||
1074 | return doc.getElementById(target); |
||
1075 | else if (doc.applets) |
||
1076 | return doc.applets[target]; |
||
1077 | else |
||
1078 | return doc[target]; |
||
1079 | } |
||
1080 | |||
1081 | function _jmolAddScript(script) { |
||
2989 | bpr | 1082 | if (!script) |
1365 | bpr | 1083 | return 0; |
1084 | var index = _jmol.scripts.length; |
||
1085 | _jmol.scripts[index] = script; |
||
1086 | return index; |
||
1087 | } |
||
1088 | |||
2989 | bpr | 1089 | function _jmolClick(elementClicked, scriptIndex, targetSuffix) { |
1365 | bpr | 1090 | _jmol.element = elementClicked; |
2989 | bpr | 1091 | _jmolScriptExecute(elementClicked, _jmol.scripts[scriptIndex], targetSuffix); |
1365 | bpr | 1092 | } |
1093 | |||
1094 | function _jmolMenuSelected(menuObject, targetSuffix) { |
||
1095 | var scriptIndex = menuObject.value; |
||
1096 | if (scriptIndex != undefined) { |
||
2989 | bpr | 1097 | _jmolScriptExecute(menuObject, _jmol.scripts[scriptIndex], targetSuffix); |
1365 | bpr | 1098 | return; |
1099 | } |
||
1100 | var len = menuObject.length; |
||
1101 | if (typeof len == "number") { |
||
1102 | for (var i = 0; i < len; ++i) { |
||
1103 | if (menuObject[i].selected) { |
||
2989 | bpr | 1104 | _jmolClick(menuObject[i], menuObject[i].value, targetSuffix); |
1365 | bpr | 1105 | return; |
1106 | } |
||
1107 | } |
||
1108 | } |
||
1109 | alert("?Que? menu selected bug #8734"); |
||
1110 | } |
||
1111 | |||
1112 | |||
1113 | _jmol.checkboxMasters = {}; |
||
1114 | _jmol.checkboxItems = {}; |
||
1115 | |||
1116 | function jmolSetCheckboxGroup(chkMaster,chkBox) { |
||
1117 | var id = chkMaster; |
||
1118 | if(typeof(id)=="number")id = "jmolCheckbox" + id; |
||
1119 | chkMaster = document.getElementById(id); |
||
1120 | if (!chkMaster)alert("jmolSetCheckboxGroup: master checkbox not found: " + id); |
||
1121 | var m = _jmol.checkboxMasters[id] = {}; |
||
1122 | m.chkMaster = chkMaster; |
||
1123 | m.chkGroup = {}; |
||
1124 | for (var i = 1; i < arguments.length; i++){ |
||
1125 | var id = arguments[i]; |
||
1126 | if(typeof(id)=="number")id = "jmolCheckbox" + id; |
||
1127 | checkboxItem = document.getElementById(id); |
||
1128 | if (!checkboxItem)alert("jmolSetCheckboxGroup: group checkbox not found: " + id); |
||
1129 | m.chkGroup[id] = checkboxItem; |
||
1130 | _jmol.checkboxItems[id] = m; |
||
1131 | } |
||
1132 | } |
||
1133 | |||
1134 | function _jmolNotifyMaster(m){ |
||
1135 | //called when a group item is checked |
||
1136 | var allOn = true; |
||
1137 | var allOff = true; |
||
1138 | for (var chkBox in m.chkGroup){ |
||
1139 | if(m.chkGroup[chkBox].checked) |
||
1140 | allOff = false; |
||
1141 | else |
||
1142 | allOn = false; |
||
1143 | } |
||
1144 | if (allOn)m.chkMaster.checked = true; |
||
1145 | if (allOff)m.chkMaster.checked = false; |
||
1146 | if ((allOn || allOff) && _jmol.checkboxItems[m.chkMaster.id]) |
||
1147 | _jmolNotifyMaster(_jmol.checkboxItems[m.chkMaster.id]) |
||
1148 | } |
||
1149 | |||
1150 | function _jmolNotifyGroup(m, isOn){ |
||
1151 | //called when a master item is checked |
||
1152 | for (var chkBox in m.chkGroup){ |
||
1153 | var item = m.chkGroup[chkBox] |
||
1154 | item.checked = isOn; |
||
1155 | if (_jmol.checkboxMasters[item.id]) |
||
1156 | _jmolNotifyGroup(_jmol.checkboxMasters[item.id], isOn) |
||
1157 | } |
||
1158 | } |
||
1159 | |||
1160 | function _jmolCbClick(ckbox, whenChecked, whenUnchecked, targetSuffix) { |
||
1161 | _jmol.control = ckbox |
||
2989 | bpr | 1162 | _jmolClick(ckbox, ckbox.checked ? whenChecked : whenUnchecked, targetSuffix); |
1365 | bpr | 1163 | if(_jmol.checkboxMasters[ckbox.id]) |
1164 | _jmolNotifyGroup(_jmol.checkboxMasters[ckbox.id], ckbox.checked) |
||
1165 | if(_jmol.checkboxItems[ckbox.id]) |
||
1166 | _jmolNotifyMaster(_jmol.checkboxItems[ckbox.id]) |
||
1167 | } |
||
1168 | |||
1169 | function _jmolCbOver(ckbox, whenChecked, whenUnchecked) { |
||
1170 | window.status = _jmol.scripts[ckbox.checked ? whenUnchecked : whenChecked]; |
||
1171 | } |
||
1172 | |||
1173 | function _jmolMouseOver(scriptIndex) { |
||
1174 | window.status = _jmol.scripts[scriptIndex]; |
||
1175 | } |
||
1176 | |||
1177 | function _jmolMouseOut() { |
||
1178 | window.status = " "; |
||
1179 | return true; |
||
1180 | } |
||
1181 | |||
1182 | function _jmolSetCodebase(codebase) { |
||
1183 | _jmol.codebase = codebase ? codebase : "."; |
||
1184 | if (_jmol.debugAlert) |
||
1185 | alert("jmolCodebase=" + _jmol.codebase); |
||
1186 | } |
||
1187 | |||
1188 | function _jmolOnloadResetForms() { |
||
1189 | // must be evaluated ONLY once |
||
1190 | _jmol.previousOnloadHandler = window.onload; |
||
1191 | window.onload = |
||
1192 | function() { |
||
1193 | with (_jmol) { |
||
1194 | if (buttonCount+checkboxCount+menuCount+radioCount+radioGroupCount > 0) { |
||
1195 | var forms = document.forms; |
||
1196 | for (var i = forms.length; --i >= 0; ) |
||
1197 | forms[i].reset(); |
||
1198 | } |
||
1199 | if (previousOnloadHandler) |
||
1200 | previousOnloadHandler(); |
||
1201 | } |
||
1202 | } |
||
1203 | } |
||
1204 | |||
1205 | //////////////////////////////////// |
||
1206 | /////extensions for getProperty///// |
||
1207 | //////////////////////////////////// |
||
1208 | |||
1209 | |||
1210 | function _jmolEvalJSON(s,key){ |
||
1211 | s=s+"" |
||
1212 | if(!s)return [] |
||
1213 | if(s.charAt(0)!="{"){ |
||
1214 | if(s.indexOf(" | ")>=0)s=s.replace(/\ \|\ /g, "\n") |
||
1215 | return s |
||
1216 | } |
||
1217 | var A = eval("("+s+")") |
||
1218 | if(!A)return |
||
1219 | if(key && A[key])A=A[key] |
||
1220 | return A |
||
1221 | } |
||
1222 | |||
1223 | function _jmolEnumerateObject(A,key){ |
||
1224 | var sout="" |
||
1225 | if(typeof(A) == "string" && A!="null"){ |
||
1226 | sout+="\n"+key+"=\""+A+"\"" |
||
1227 | }else if(!isNaN(A)||A==null){ |
||
1228 | sout+="\n"+key+"="+(A+""==""?"null":A) |
||
1229 | }else if(A.length){ |
||
1230 | sout+=key+"=[]" |
||
1231 | for(var i=0;i<A.length;i++){ |
||
1232 | sout+="\n" |
||
1233 | if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){ |
||
1234 | sout+=_jmolEnumerateObject(A[i],key+"["+i+"]") |
||
1235 | }else{ |
||
1236 | sout+=key+"["+i+"]="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i]) |
||
1237 | } |
||
1238 | } |
||
1239 | }else{ |
||
1240 | if(key != ""){ |
||
1241 | sout+=key+"={}" |
||
1242 | key+="." |
||
1243 | } |
||
1244 | |||
1245 | for(var i in A){ |
||
1246 | sout+="\n" |
||
1247 | if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){ |
||
1248 | sout+=_jmolEnumerateObject(A[i],key+i) |
||
1249 | }else{ |
||
1250 | sout+=key+i+"="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i]) |
||
1251 | } |
||
1252 | } |
||
1253 | } |
||
1254 | return sout |
||
1255 | } |
||
1256 | |||
1257 | |||
1258 | function _jmolSortKey0(a,b){ |
||
1259 | return (a[0]<b[0]?1:a[0]>b[0]?-1:0) |
||
1260 | } |
||
1261 | |||
1262 | function _jmolSortMessages(A){ |
||
1263 | if(!A || typeof(A)!="object")return [] |
||
1264 | var B = [] |
||
1265 | for(var i=A.length-1;i>=0;i--)for(var j=0;j<A[i].length;j++)B[B.length]=A[i][j] |
||
1266 | if(B.length == 0) return |
||
1267 | B=B.sort(_jmolSortKey0) |
||
1268 | return B |
||
1269 | } |
||
1270 | |||
1271 | /////////additional extensions ////////// |
||
1272 | |||
1273 | |||
1274 | function _jmolDomScriptLoad(URL){ |
||
1275 | //open(URL) //to debug |
||
1276 | _jmol.servercall=URL |
||
1277 | var node = document.getElementById("_jmolScriptNode") |
||
1278 | if (node && _jmol.browser!="msie"){ |
||
1279 | document.getElementsByTagName("HEAD")[0].removeChild(node) |
||
1280 | node=null |
||
1281 | } |
||
1282 | if (node) { |
||
1283 | node.setAttribute("src",URL) |
||
1284 | } else { |
||
1285 | node=document.createElement("script") |
||
1286 | node.setAttribute("id","_jmolScriptNode") |
||
1287 | node.setAttribute("type","text/javascript") |
||
1288 | node.setAttribute("src",URL) |
||
1289 | document.getElementsByTagName("HEAD")[0].appendChild(node) |
||
1290 | } |
||
1291 | } |
||
1292 | |||
1293 | |||
1294 | function _jmolExtractPostData(url){ |
||
1295 | S=url.split("&POST:") |
||
1296 | var s="" |
||
1297 | for(var i=1;i<S.length;i++){ |
||
1298 | KV=S[i].split("=") |
||
1299 | s+="&POSTKEY"+i+"="+KV[0] |
||
1300 | s+="&POSTVALUE"+i+"="+KV[1] |
||
1301 | } |
||
1302 | return "&url="+escape(S[0])+s |
||
1303 | } |
||
1304 | |||
1305 | function _jmolLoadModel(targetSuffix,remoteURL,array,isError,errorMessage){ |
||
1306 | //called by server, but in client |
||
1307 | //overload this function to customize return |
||
1308 | _jmol.remoteURL=remoteURL |
||
2989 | bpr | 1309 | isError && alert(errorMessage) |
1365 | bpr | 1310 | jmolLoadInlineScript(array.join("\n"),_jmol.optionalscript,targetSuffix) |
1311 | } |
||
1312 | |||
1313 | //////////user property/status functions///////// |
||
1314 | |||
1315 | function jmolGetStatus(strStatus,targetSuffix){ |
||
1316 | return _jmolSortMessages(jmolGetPropertyAsArray("jmolStatus",strStatus,targetSuffix)) |
||
1317 | } |
||
1318 | |||
1319 | function jmolGetPropertyAsArray(sKey,sValue,targetSuffix) { |
||
1320 | return _jmolEvalJSON(jmolGetPropertyAsJSON(sKey,sValue,targetSuffix),sKey) |
||
1321 | } |
||
1322 | |||
1323 | function jmolGetPropertyAsString(sKey,sValue,targetSuffix) { |
||
1324 | var applet = _jmolGetApplet(targetSuffix); |
||
2989 | bpr | 1325 | sValue == undefined && (sValue=""); |
1365 | bpr | 1326 | return (applet ? applet.getPropertyAsString(sKey,sValue) + "" : "") |
1327 | } |
||
1328 | |||
1329 | function jmolGetPropertyAsJSON(sKey,sValue,targetSuffix) { |
||
2989 | bpr | 1330 | sValue == undefined && (sValue = "") |
1365 | bpr | 1331 | var applet = _jmolGetApplet(targetSuffix); |
1332 | try { |
||
1333 | return (applet ? applet.getPropertyAsJSON(sKey,sValue) + "" : "") |
||
1334 | } catch(e) { |
||
1335 | return "" |
||
1336 | } |
||
1337 | } |
||
1338 | |||
1339 | function jmolGetPropertyAsJavaObject(sKey,sValue,targetSuffix) { |
||
2989 | bpr | 1340 | sValue == undefined && (sValue = "") |
1365 | bpr | 1341 | var applet = _jmolGetApplet(targetSuffix); |
1342 | return (applet ? applet.getProperty(sKey,sValue) : null) |
||
1343 | } |
||
1344 | |||
1345 | |||
1346 | function jmolDecodeJSON(s) { |
||
1347 | return _jmolEnumerateObject(_jmolEvalJSON(s),"") |
||
1348 | } |
||
1349 | |||
1350 | |||
1351 | ///////// synchronous scripting //////// |
||
1352 | |||
1353 | function jmolScriptWait(script, targetSuffix) { |
||
2989 | bpr | 1354 | targetSuffix == undefined && (targetSuffix="0") |
1365 | bpr | 1355 | var Ret=jmolScriptWaitAsArray(script, targetSuffix) |
1356 | var s = "" |
||
1357 | for(var i=Ret.length;--i>=0;) |
||
1358 | for(var j=0;j< Ret[i].length;j++) |
||
1359 | s+=Ret[i][j]+"\n" |
||
1360 | return s |
||
1361 | } |
||
1362 | |||
1363 | function jmolScriptWaitOutput(script, targetSuffix) { |
||
2989 | bpr | 1364 | targetSuffix == undefined && (targetSuffix="0") |
1365 | bpr | 1365 | var ret = "" |
1366 | try{ |
||
1367 | if (script) { |
||
1368 | _jmolCheckBrowser(); |
||
1369 | var applet=_jmolGetApplet(targetSuffix); |
||
1370 | if (applet) ret += applet.scriptWaitOutput(script); |
||
1371 | } |
||
1372 | }catch(e){ |
||
1373 | } |
||
1374 | return ret; |
||
1375 | } |
||
1376 | |||
1377 | function jmolEvaluate(molecularMath, targetSuffix) { |
||
1378 | |||
1379 | //carries out molecular math on a model |
||
1380 | |||
2989 | bpr | 1381 | targetSuffix == undefined && (targetSuffix="0") |
1365 | bpr | 1382 | var result = "" + jmolGetPropertyAsJavaObject("evaluate", molecularMath, targetSuffix); |
1383 | var s = result.replace(/\-*\d+/,"") |
||
1384 | if (s == "" && !isNaN(parseInt(result)))return parseInt(result); |
||
1385 | var s = result.replace(/\-*\d*\.\d*/,"") |
||
1386 | if (s == "" && !isNaN(parseFloat(result)))return parseFloat(result); |
||
1387 | return result; |
||
1388 | } |
||
1389 | |||
1390 | function jmolScriptEcho(script, targetSuffix) { |
||
1391 | // returns a newline-separated list of all echos from a script |
||
2989 | bpr | 1392 | targetSuffix == undefined && (targetSuffix="0") |
1365 | bpr | 1393 | var Ret=jmolScriptWaitAsArray(script, targetSuffix) |
1394 | var s = "" |
||
1395 | for(var i=Ret.length;--i>=0;) |
||
1396 | for(var j=Ret[i].length;--j>=0;) |
||
1397 | if (Ret[i][j][1] == "scriptEcho")s+=Ret[i][j][3]+"\n" |
||
1398 | return s.replace(/ \| /g, "\n") |
||
1399 | } |
||
1400 | |||
1401 | |||
1402 | function jmolScriptMessage(script, targetSuffix) { |
||
1403 | // returns a newline-separated list of all messages from a script, ending with "script completed\n" |
||
2989 | bpr | 1404 | targetSuffix == undefined && (targetSuffix="0") |
1365 | bpr | 1405 | var Ret=jmolScriptWaitAsArray(script, targetSuffix) |
1406 | var s = "" |
||
1407 | for(var i=Ret.length;--i>=0;) |
||
1408 | for(var j=Ret[i].length;--j>=0;) |
||
1409 | if (Ret[i][j][1] == "scriptStatus")s+=Ret[i][j][3]+"\n" |
||
1410 | return s.replace(/ \| /g, "\n") |
||
1411 | } |
||
1412 | |||
1413 | |||
1414 | function jmolScriptWaitAsArray(script, targetSuffix) { |
||
1415 | var ret = "" |
||
1416 | try{ |
||
1417 | jmolGetStatus("scriptEcho,scriptMessage,scriptStatus,scriptError",targetSuffix) |
||
1418 | if (script) { |
||
1419 | _jmolCheckBrowser(); |
||
1420 | var applet=_jmolGetApplet(targetSuffix); |
||
1421 | if (applet) ret += applet.scriptWait(script); |
||
1422 | ret = _jmolEvalJSON(ret,"jmolStatus") |
||
1423 | if(typeof ret == "object") |
||
1424 | return ret |
||
1425 | } |
||
1426 | }catch(e){ |
||
1427 | } |
||
1428 | return [[ret]] |
||
1429 | } |
||
1430 | |||
1431 | |||
1432 | |||
1433 | //////////// save/restore orientation ///////////// |
||
1434 | |||
1435 | function jmolSaveOrientation(id, targetSuffix) { |
||
2989 | bpr | 1436 | targetSuffix == undefined && (targetSuffix="0") |
1437 | return _jmol["savedOrientation"+id] = jmolGetPropertyAsArray("orientationInfo","info",targetSuffix).moveTo |
||
1365 | bpr | 1438 | } |
1439 | |||
1440 | function jmolRestoreOrientation(id, targetSuffix) { |
||
2989 | bpr | 1441 | targetSuffix == undefined && (targetSuffix="0") |
1365 | bpr | 1442 | var s=_jmol["savedOrientation"+id] |
1443 | if (!s || s == "")return |
||
1444 | s=s.replace(/1\.0/,"0") |
||
1445 | return jmolScriptWait(s,targetSuffix) |
||
1446 | } |
||
1447 | |||
1448 | function jmolRestoreOrientationDelayed(id, delay, targetSuffix) { |
||
2989 | bpr | 1449 | arguments.length < 2 && (delay=1) |
1450 | targetSuffix == undefined && (targetSuffix="0") |
||
1365 | bpr | 1451 | var s=_jmol["savedOrientation"+id] |
1452 | if (!s || s == "")return |
||
1453 | s=s.replace(/1\.0/,delay) |
||
1454 | return jmolScriptWait(s,targetSuffix) |
||
1455 | } |
||
1456 | |||
1457 | //////////// add parameter ///////////// |
||
1458 | /* |
||
1459 | * for adding callbacks or other parameters. Use: |
||
1460 | |||
1461 | jmolSetDocument(0) |
||
1462 | var s= jmolApplet(....) |
||
1463 | s = jmolAppletAddParam(s,"messageCallback", "myFunctionName") |
||
1464 | document.write(s) |
||
1465 | jmolSetDocument(document) // if you want to then write buttons and such normally |
||
1466 | |||
1467 | */ |
||
1468 | |||
1469 | function jmolAppletAddParam(appletCode,name,value){ |
||
2989 | bpr | 1470 | return (value == "" ? appletCode : appletCode.replace(/\<param/,"\n<param name='"+name+"' value='"+value+"' />\n<param")) |
1365 | bpr | 1471 | } |
1472 | |||
1473 | ///////////////auto load Research Consortium for Structural Biology (RCSB) data /////////// |
||
1474 | |||
1475 | function jmolLoadAjax_STOLAF_RCSB(fileformat,pdbid,optionalscript,targetSuffix){ |
||
1476 | |||
2989 | bpr | 1477 | _jmol.thismodel || (_jmol.thismodel = "1crn") |
1478 | _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm") |
||
1479 | _jmol.RCSBserver || (_jmol.RCSBserver="http://www.rcsb.org") |
||
1480 | _jmol.defaultURL_RCSB || (_jmol.defaultURL_RCSB=_jmol.RCSBserver+"/pdb/files/1CRN.CIF") |
||
1481 | fileformat || (fileformat="PDB") |
||
1482 | pdbid || (pdbid=prompt("Enter a 4-digit PDB ID:",_jmol.thismodel)) |
||
1365 | bpr | 1483 | if(!pdbid || pdbid.length != 4)return "" |
2989 | bpr | 1484 | targetSuffix || (targetSuffix="0") |
1485 | optionalscript || (optionalscript="") |
||
1365 | bpr | 1486 | var url=_jmol.defaultURL_RCSB.replace(/1CRN/g,pdbid.toUpperCase()) |
2989 | bpr | 1487 | fileformat=="CIF" || (url=url.replace(/CIF/,fileformat)) |
1365 | bpr | 1488 | _jmol.optionalscript=optionalscript |
1489 | _jmol.thismodel=pdbid |
||
1490 | _jmol.thistargetsuffix=targetSuffix |
||
1491 | _jmol.thisurl=url |
||
1492 | _jmol.modelArray = [] |
||
1493 | url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url) |
||
1494 | _jmolDomScriptLoad(url) |
||
1495 | return url |
||
1496 | } |
||
1497 | |||
1498 | /////////////// St. Olaf College AJAX server -- ANY URL /////////// |
||
1499 | |||
1500 | function jmolLoadAjax_STOLAF_ANY(url, userid, optionalscript,targetSuffix){ |
||
1501 | _jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm" |
||
2989 | bpr | 1502 | _jmol.thisurlANY || (_jmol.thisurlANY = "http://www.stolaf.edu/depts/chemistry/mo/struc/data/ycp3-1.mol") |
1503 | url || (url=prompt("Enter any (uncompressed file) URL:", _jmol.thisurlANY)) |
||
1504 | userid || (userid="0") |
||
1505 | targetSuffix || (targetSuffix="0") |
||
1506 | optionalscript || (optionalscript="") |
||
1365 | bpr | 1507 | _jmol.optionalscript=optionalscript |
1508 | _jmol.thistargetsuffix=targetSuffix |
||
1509 | _jmol.modelArray = [] |
||
1510 | _jmol.thisurl = url |
||
1511 | url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url) |
||
1512 | _jmolDomScriptLoad(url) |
||
1513 | } |
||
1514 | |||
1515 | |||
1516 | /////////////// Mineralogical Society of America (MSA) data ///////// |
||
1517 | |||
1518 | function jmolLoadAjax_MSA(key,value,optionalscript,targetSuffix){ |
||
1519 | |||
2989 | bpr | 1520 | _jmol.thiskeyMSA || (_jmol.thiskeyMSA = "mineral") |
1521 | _jmol.thismodelMSA || (_jmol.thismodelMSA = "quartz") |
||
1522 | _jmol.ajaxURL_MSA || (_jmol.ajaxURL_MSA="http://rruff.geo.arizona.edu/AMS/result.php?mineral=quartz&viewing=ajaxjs") |
||
1523 | key || (key=prompt("Enter a field:", _jmol.thiskeyMSA)) |
||
1365 | bpr | 1524 | if(!key)return "" |
2989 | bpr | 1525 | value || (value=prompt("Enter a "+key+":", _jmol.thismodelMSA)) |
1365 | bpr | 1526 | if(!value)return "" |
2989 | bpr | 1527 | targetSuffix || (targetSuffix="0") |
1528 | optionalscript || (optionalscript="") |
||
1529 | optionalscript == 1 && (optionalscript='load "" {1 1 1}') |
||
1365 | bpr | 1530 | var url=_jmol.ajaxURL_MSA.replace(/mineral/g,key).replace(/quartz/g,value) |
1531 | _jmol.optionalscript=optionalscript |
||
1532 | _jmol.thiskeyMSA=key |
||
1533 | _jmol.thismodelMSA=value |
||
1534 | _jmol.thistargetsuffix=targetSuffix |
||
1535 | _jmol.thisurl=url |
||
1536 | _jmol.modelArray = [] |
||
1537 | loadModel=_jmolLoadModel |
||
1538 | _jmolDomScriptLoad(url) |
||
1539 | return url |
||
1540 | } |
||
1541 | |||
1542 | |||
1543 | |||
1544 | function jmolLoadAjaxJS(url, userid, optionalscript,targetSuffix){ |
||
2989 | bpr | 1545 | userid || (userid="0") |
1546 | targetSuffix || (targetSuffix="0") |
||
1547 | optionalscript || (optionalscript="") |
||
1365 | bpr | 1548 | _jmol.optionalscript=optionalscript |
1549 | _jmol.thismodel=userid |
||
1550 | _jmol.thistargetsuffix=targetSuffix |
||
1551 | _jmol.modelArray = [] |
||
1552 | _jmol.thisurl = url |
||
1553 | url+="&returnFunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix |
||
1554 | _jmolDomScriptLoad(url) |
||
1555 | } |
||
1556 | |||
1557 | |||
1558 | //// in case Jmol library has already been loaded: |
||
1559 | |||
1560 | }catch(e){} |
||
1561 | |||
1562 | ///////////////moving atoms ////////////// |
||
1563 | |||
1564 | // HIGHLY experimental!! |
||
1565 | |||
1566 | function jmolSetAtomCoord(i,x,y,z,targetSuffix){ |
||
1567 | _jmolCheckBrowser(); |
||
1568 | var applet=_jmolGetApplet(targetSuffix); |
||
1569 | if (applet) applet.getProperty('jmolViewer').setAtomCoord(i,x,y,z) |
||
1570 | } |
||
1571 | |||
1572 | function jmolSetAtomCoordRelative(i,x,y,z,targetSuffix){ |
||
1573 | _jmolCheckBrowser(); |
||
1574 | var applet=_jmolGetApplet(targetSuffix); |
||
1575 | if (applet) applet.getProperty('jmolViewer').setAtomCoordRelative(i,x,y,z) |
||
1576 | } |
||
1577 | |||
1578 | |||
1579 | ///////////////applet fake for testing buttons///////////// |
||
1580 | |||
1581 | |||
2989 | bpr | 1582 | if(_jmol.useNoApplet){ |
1365 | bpr | 1583 | jmolApplet = function(w){ |
1584 | var s="<table style='background-color:black' width="+w+"><tr height="+w+">" |
||
1585 | +"<td align=center valign=center style='background-color:white'>" |
||
1586 | +"Applet would be here" |
||
1587 | +"<p><textarea id=fakeApplet rows=5 cols=50></textarea>" |
||
1588 | +"</td></tr></table>" |
||
1589 | return _jmolDocumentWrite(s) |
||
1590 | } |
||
1591 | |||
1592 | _jmolFindApplet = function(){return jmolApplet0} |
||
1593 | |||
1594 | jmolApplet0 = { |
||
1595 | script: function(script){document.getElementById("fakeApplet").value="\njmolScript:\n"+script} |
||
1596 | ,scriptWait: function(script){document.getElementById("fakeApplet").value="\njmolScriptWait:\n"+script} |
||
1597 | ,loadInline: function(data,script){document.getElementById("fakeApplet").value="\njmolLoadInline data:\n"+data+"\n\nscript:\n"+script} |
||
1598 | } |
||
1599 | } |
||
1600 | |||
1601 | |||
1602 | /////////////////////////////////////////// |
||
1603 | |||
2876 | bpr | 1604 | // This should no longer be needed, jmolResizeApplet() is better; kept for backwards compatibility |
1605 | /* |
||
1606 | Resizes absolutely (pixels) or by percent of window (w or h 0.5 means 50%). |
||
1607 | targetSuffix is optional and defaults to zero (first applet in page). |
||
1608 | Both w and h are optional, but needed if you want to use targetSuffix. |
||
1609 | h defaults to w |
||
1610 | w defaults to 100% of window |
||
1611 | If either w or h is between 0 and 1, then it is taken as percent/100. |
||
1612 | If either w or h is greater than 1, then it is taken as a size (pixels). |
||
1613 | */ |
||
1614 | function jmolResize(w,h,targetSuffix) { |
||
1365 | bpr | 1615 | _jmol.alerted = true; |
2876 | bpr | 1616 | var percentW = (!w ? 100 : w <= 1 && w > 0 ? w * 100 : 0); |
1617 | var percentH = (!h ? percentW : h <= 1 && h > 0 ? h * 100 : 0); |
||
1365 | bpr | 1618 | if (_jmol.browser=="msie") { |
1619 | var width=document.body.clientWidth; |
||
1620 | var height=document.body.clientHeight; |
||
1621 | } else { |
||
1622 | var netscapeScrollWidth=15; |
||
1623 | var width=window.innerWidth - netscapeScrollWidth; |
||
1624 | var height=window.innerHeight-netscapeScrollWidth; |
||
1625 | } |
||
2876 | bpr | 1626 | var applet = _jmolGetApplet(targetSuffix); |
1365 | bpr | 1627 | if(!applet)return; |
2876 | bpr | 1628 | applet.style.width = (percentW ? width * percentW/100 : w)+"px"; |
1629 | applet.style.height = (percentH ? height * percentH/100 : (h ? h : w))+"px"; |
||
1630 | //title=width + " " + height + " " + (new Date()); |
||
1365 | bpr | 1631 | } |
1632 | |||
2876 | bpr | 1633 | // 13 Jun 09 -- makes jmolResize() obsolete (kept for backwards compatibility) |
1634 | function jmolResizeApplet(size,targetSuffix) { |
||
1635 | // See _jmolGetAppletSize() for the formats accepted as size [same used by jmolApplet()] |
||
1636 | // Special case: an empty value for width or height is accepted, meaning no change in that dimension. |
||
1637 | _jmol.alerted = true; |
||
1638 | var applet = _jmolGetApplet(targetSuffix); |
||
1639 | if(!applet)return; |
||
1640 | var sz = _jmolGetAppletSize(size, "px"); |
||
1641 | sz[0] && (applet.style.width = sz[0]); |
||
1642 | sz[1] && (applet.style.height = sz[1]); |
||
1643 | } |
||
1644 | |||
1645 | function _jmolGetAppletSize(size, units) { |
||
1646 | /* Accepts single number or 2-value array, each one can be one of: |
||
1647 | percent (text string ending %), decimal 0 to 1 (percent/100), number, or text string (interpreted as nr.) |
||
1648 | [width, height] array of strings is returned, with units added if specified. |
||
1649 | Percent is relative to container div or element (which should have explicitly set size). |
||
1650 | */ |
||
1651 | var width, height; |
||
1652 | if ( (typeof size) == "object" && size != null ) { |
||
1653 | width = size[0]; height = size[1]; |
||
1654 | } else { |
||
1655 | width = height = size; |
||
1656 | } |
||
1657 | return [_jmolFixDim(width, units), _jmolFixDim(height, units)]; |
||
1658 | } |
||
1659 | |||
1660 | function _jmolFixDim(x, units) { |
||
1661 | var sx = "" + x; |
||
1662 | return (sx.length == 0 ? (units ? "" : _jmol.allowedJmolSize[2]) |
||
1663 | : sx.indexOf("%") == sx.length-1 ? sx |
||
1664 | : (x = parseFloat(x)) <= 1 && x > 0 ? x * 100 + "%" |
||
1665 | : (isNaN(x = Math.floor(x)) ? _jmol.allowedJmolSize[2] |
||
1666 | : x < _jmol.allowedJmolSize[0] ? _jmol.allowedJmolSize[0] |
||
1667 | : x > _jmol.allowedJmolSize[1] ? _jmol.allowedJmolSize[1] |
||
1668 | : x) + (units ? units : "")); |
||
1669 | } |
||
1670 | |||
1671 | |||
1672 | |||
1673 |