comparison lib/Jmol/Jmol.js @ 0:4816e4a8ae95 draft default tip

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