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