-/* Jmol 12.0 script library Jmol.js 9:48 PM 1/31/2011 Bob Hanson\r
-\r
- checkbox heirarchy -- see http://chemapps.stolaf.edu/jmol/docs/examples-11/check.htm\r
-\r
- based on:\r
- *\r
- * Copyright (C) 2004-2005 Miguel, Jmol Development, www.jmol.org\r
- *\r
- * Contact: hansonr@stolaf.edu\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Lesser General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2.1 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * Lesser General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Lesser General Public\r
- * License along with this library; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\r
- * 02111-1307 USA.\r
- */\r
-\r
-// for documentation see www.jmol.org/jslibrary\r
-\r
-try{if(typeof(_jmol)!="undefined")exit()\r
-\r
-// place "?NOAPPLET" on your command line to check applet control action with a textarea\r
-// place "?JMOLJAR=xxxxx" to use a specific jar file\r
-\r
-// bob hanson -- jmolResize(w,h) -- resizes absolutely or by percent (w or h 0.5 means 50%)\r
-// angel herraez -- update of jmolResize(w,h,targetSuffix) so it is not tied to first applet\r
-// bob hanson -- jmolEvaluate -- evaluates molecular math 8:37 AM 2/23/2007\r
-// bob hanson -- jmolScriptMessage -- returns all "scriptStatus" messages 8:37 AM 2/23/2007\r
-// bob hanson -- jmolScriptEcho -- returns all "scriptEcho" messages 8:37 AM 2/23/2007\r
-// bob hanson -- jmolScriptWait -- 11:31 AM 5/2/2006\r
-// bob hanson -- remove trailing separatorHTML in radio groups -- 12:18 PM 5/6/2006\r
-// bob hanson -- adds support for dynamic DOM script nodes 7:04 AM 5/19/2006\r
-// bob hanson -- adds try/catch for wiki - multiple code passes 7:05 AM 5/19/2006\r
-// bob hanson -- auto-initiates to defaultdir/defaultjar -- change as desired.\r
-// bob hanson -- adding save/restore orientation w/ and w/o delay 11:49 AM 5/25/2006\r
-// bob hanson -- adding AjaxJS service 11:16 AM 6/3/2006\r
-// bob hanson -- fix for iframes not available for finding applet\r
-// bob hanson -- added applet fake ?NOAPPLET URL flag\r
-// bob hanson -- added jmolSetCallback(calbackName, funcName) 3:32 PM 6/13/2006\r
-// used PRIOR to jmolApplet() or jmolAppletInline()\r
-// added 4th array element in jmolRadioGroup -- title\r
-// added <span> and id around link, checkbox, radio, menu\r
-// fixing AJAX loads for MSIE/Opera-Mozilla incompatibility\r
-// -- renamed Jmol-11.js from Jmol-new.js; JmolApplet.jar from JmolAppletProto.jar\r
-// renamed Jmol.js for Jmol 11 distribution\r
-// -- modified jmolRestoreOrientation() to be immediate, no 1-second delay\r
-// bob hanson -- jmolScriptWait always returns a string -- 11:23 AM 9/16/2006\r
-// bh -- jmolCommandInput()\r
-// bh -- jmolSetTranslation(TF) -- forces translation even if there might be message callback issues\r
-// bh -- minor fixes suggested by Angel\r
-// bh -- adds jmolSetSyncId() and jmolGetSyncId()\r
-// bh 3/2008 -- adds jmolAppendInlineScript() and jmolAppendInlineArray()\r
-// bh 3/2008 -- fixes IE7 bug in relation to jmolLoadInlineArray()\r
-// bh 6/2008 -- adds jmolSetAppletWindow()\r
-// Angel H. 6/2008 -- added html <label> tags to checkboxes and radio buttons [in jmolCheckbox() and _jmolRadio() functions]\r
-// bh 7/2008 -- code fix "for(i..." not "for(var i..."\r
-// bh 12/2008 -- jmolLoadInline, jmolLoadInlineArray, jmolLoadInlineScript, jmolAppendInlineScript, jmolAppendInlineArray all return error message or null (Jmol 11.7.16)\r
-// bh 12/2008 -- jmolScriptWaitOutput() -- waits for script to complete and delivers output normally sent to console\r
-\r
-// bh 5/2009 -- Support for XHTML using jmolSetXHTML(id)\r
-// ah & bh 6/2009 -- New jmolResizeApplet() more flexible, similar to jmolApplet() size syntax\r
-// bh 11/2009 -- care in accessing top.document\r
-// bh 12/2009 -- added jmolSetParameter(name, value)\r
-// bh 12/2009 -- added PARAMS=name:value;name:value;name:value... for command line\r
-// bh 12/2009 -- overhaul of target checking\r
-// bh 1/2010 -- all _xxxx() methods ALWAYS have complete argument list\r
-// bh 1/2010 -- adds option to run a JavaScript function from any Jmol control. \r
-// This is accomplished by passing an array rather than a script:\r
-// jmolHref([myfunc,"my param 1", "my param 2"], "testing")\r
-// function myfunc(jmolControlObject, [myfunc,"my param 1", "my param 2"], target){...}\r
-// and allows much more flexibility with responding to controls\r
-// bh 4/2010 -- added jmolSetMemoryMb(nMb)\r
-// ah 1/2011 -- wider detection of browsers; more browsers now use the object tag instead of the applet tag; \r
-// fix of object tag (removed classid) accounts for change of behavior in Chrome\r
-// bh 3/2011 -- added jmolLoadAjax_STOLAF_NIH\r
-\r
-var defaultdir = "."\r
-var defaultjar = "JmolApplet.jar"\r
-\r
-\r
-// Note added 12:41 PM 9/21/2008 by Bob Hanson, hansonr@stolaf.edu:\r
-\r
-// JMOLJAR=xxxxx.jar on the URL for this page will override\r
-// the JAR file specified in the jmolInitialize() call.\r
-\r
-// The idea is that it can be very useful to test a web page with different JAR files\r
-// Or for an expert user to substitute a signed applet for an unsigned one\r
-// so as to use a broader range of models or to create JPEG files, for example.\r
-\r
-// If the JAR file is not in the current directory (has any sort of "/" in its name)\r
-// then the user is presented with a warning and asked whether it is OK to change Jar files.\r
-// The default action, if the user just presses "OK" is to NOT allow the change. \r
-// The user must type the word "yes" in the prompt box for the change to be approved.\r
-\r
-// If you don't want people to be able to switch in their own JAR file on your page,\r
-// simply set this next line to read "var allowJMOLJAR = false".\r
-\r
-\r
-var undefined; // for IE 5 ... wherein undefined is undefined\r
-\r
-////////////////////////////////////////////////////////////////\r
-// Basic Scripting infrastruture\r
-////////////////////////////////////////////////////////////////\r
-\r
-function jmolInitialize(codebaseDirectory, fileNameOrUseSignedApplet) {\r
- if (_jmol.initialized)\r
- return;\r
- _jmol.initialized = true;\r
- if(_jmol.jmoljar) {\r
- var f = _jmol.jmoljar;\r
- if (f.indexOf("/") >= 0) {\r
- 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.")\r
- var ok = prompt("Do you want to use applet " + f + "? ","yes or no")\r
- if (ok == "yes") {\r
- codebaseDirectory = f.substring(0, f.lastIndexOf("/"));\r
- fileNameOrUseSignedApplet = f.substring(f.lastIndexOf("/") + 1);\r
- } else {\r
- _jmolGetJarFilename(fileNameOrUseSignedApplet);\r
- alert("The web page URL was ignored. Continuing using " + _jmol.archivePath + ' in directory "' + codebaseDirectory + '"');\r
- }\r
- } else {\r
- fileNameOrUseSignedApplet = f;\r
- }\r
- }\r
- _jmolSetCodebase(codebaseDirectory);\r
- _jmolGetJarFilename(fileNameOrUseSignedApplet);\r
- _jmolOnloadResetForms();\r
-}\r
-\r
-function jmolSetTranslation(TF) {\r
- _jmol.params.doTranslate = ''+TF;\r
-}\r
-\r
-function _jmolGetJarFilename(fileNameOrFlag) {\r
- _jmol.archivePath =\r
- (typeof(fileNameOrFlag) == "string" ? fileNameOrFlag : (fileNameOrFlag ? "JmolAppletSigned" : "JmolApplet") + "0.jar");\r
-}\r
-\r
-function jmolSetDocument(doc) {\r
- _jmol.currentDocument = doc;\r
-}\r
-\r
-function jmolSetAppletColor(boxbgcolor, boxfgcolor, progresscolor) {\r
- _jmolInitCheck();\r
- _jmol.params.boxbgcolor = boxbgcolor;\r
- if (boxfgcolor)\r
- _jmol.params.boxfgcolor = boxfgcolor\r
- else if (boxbgcolor == "white" || boxbgcolor == "#FFFFFF")\r
- _jmol.params.boxfgcolor = "black";\r
- else\r
- _jmol.params.boxfgcolor = "white";\r
- if (progresscolor)\r
- _jmol.params.progresscolor = progresscolor;\r
- if (_jmol.debugAlert)\r
- alert(" boxbgcolor=" + _jmol.params.boxbgcolor +\r
- " boxfgcolor=" + _jmol.params.boxfgcolor +\r
- " progresscolor=" + _jmol.params.progresscolor);\r
-}\r
-\r
-function jmolSetAppletWindow(w) {\r
- _jmol.appletWindow = w;\r
-}\r
-\r
-function jmolApplet(size, script, nameSuffix) {\r
- _jmolInitCheck();\r
- return _jmolApplet(size, null, script, nameSuffix);\r
-}\r
-\r
-////////////////////////////////////////////////////////////////\r
-// Basic controls\r
-////////////////////////////////////////////////////////////////\r
-\r
-// undefined means it wasn't there; null means it was explicitly listed as null (so as to skip it)\r
-\r
-function jmolButton(script, label, id, title) {\r
- _jmolInitCheck();\r
- id != undefined && id != null || (id = "jmolButton" + _jmol.buttonCount);\r
- label != undefined && label != null || (label = script.substring(0, 32));\r
- ++_jmol.buttonCount;\r
- var scriptIndex = _jmolAddScript(script);\r
- var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='button' name='" + id + "' id='" + id +\r
- "' value='" + label +\r
- "' onclick='_jmolClick(this," + scriptIndex + _jmol.targetText +\r
- ")' onmouseover='_jmolMouseOver(" + scriptIndex +\r
- ");return true' onmouseout='_jmolMouseOut()' " +\r
- _jmol.buttonCssText + " /></span>";\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
-}\r
-\r
-function jmolCheckbox(scriptWhenChecked, scriptWhenUnchecked,\r
- labelHtml, isChecked, id, title) {\r
- _jmolInitCheck();\r
- id != undefined && id != null || (id = "jmolCheckbox" + _jmol.checkboxCount);\r
- ++_jmol.checkboxCount;\r
- if (scriptWhenChecked == undefined || scriptWhenChecked == null ||\r
- scriptWhenUnchecked == undefined || scriptWhenUnchecked == null) {\r
- alert("jmolCheckbox requires two scripts");\r
- return;\r
- }\r
- if (labelHtml == undefined || labelHtml == null) {\r
- alert("jmolCheckbox requires a label");\r
- return;\r
- }\r
- var indexChecked = _jmolAddScript(scriptWhenChecked);\r
- var indexUnchecked = _jmolAddScript(scriptWhenUnchecked);\r
- var eospan = "</span>"\r
- var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='checkbox' name='" + id + "' id='" + id +\r
- "' onclick='_jmolCbClick(this," +\r
- indexChecked + "," + indexUnchecked + _jmol.targetText +\r
- ")' onmouseover='_jmolCbOver(this," + indexChecked + "," +\r
- indexUnchecked +\r
- ");return true' onmouseout='_jmolMouseOut()' " +\r
- (isChecked ? "checked='true' " : "")+ _jmol.checkboxCssText + " />" \r
- if (labelHtml.toLowerCase().indexOf("<td>")>=0) {\r
- t += eospan\r
- eospan = "";\r
- }\r
- t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan;\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
-}\r
-\r
-function jmolStartNewRadioGroup() {\r
- ++_jmol.radioGroupCount;\r
-}\r
-\r
-function jmolRadioGroup(arrayOfRadioButtons, separatorHtml, groupName, id, title) {\r
- /*\r
-\r
- array: [radio1,radio2,radio3...]\r
- where radioN = ["script","label",isSelected,"id","title"]\r
-\r
- */\r
-\r
- _jmolInitCheck();\r
- var type = typeof arrayOfRadioButtons;\r
- if (type != "object" || type == null || ! arrayOfRadioButtons.length) {\r
- alert("invalid arrayOfRadioButtons");\r
- return;\r
- }\r
- separatorHtml != undefined && separatorHtml != null || (separatorHtml = " ");\r
- var len = arrayOfRadioButtons.length;\r
- jmolStartNewRadioGroup();\r
- groupName || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1));\r
- var t = "<span id='"+(id ? id : groupName)+"'>";\r
- for (var i = 0; i < len; ++i) {\r
- if (i == len - 1)\r
- separatorHtml = "";\r
- var radio = arrayOfRadioButtons[i];\r
- type = typeof radio;\r
- if (type == "object") {\r
- 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);\r
- } else {\r
- t += _jmolRadio(radio, null, null, separatorHtml, groupName, (id ? id : groupName)+"_"+i, title);\r
- }\r
- }\r
- t+="</span>"\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
-}\r
-\r
-\r
-function jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) {\r
- _jmolInitCheck();\r
- if (_jmol.radioGroupCount == 0)\r
- ++_jmol.radioGroupCount;\r
- var t = _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, (id ? id : groupName + "_" + _jmol.radioCount), title ? title : 0);\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
-}\r
-\r
-function jmolLink(script, label, id, title) {\r
- _jmolInitCheck();\r
- id != undefined && id != null || (id = "jmolLink" + _jmol.linkCount);\r
- label != undefined && label != null || (label = script.substring(0, 32));\r
- ++_jmol.linkCount;\r
- var scriptIndex = _jmolAddScript(script);\r
- var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><a name='" + id + "' id='" + id + \r
- "' href='javascript:_jmolClick(this," + scriptIndex + _jmol.targetText + ");' onmouseover='_jmolMouseOver(" + scriptIndex +\r
- ");return true;' onmouseout='_jmolMouseOut()' " +\r
- _jmol.linkCssText + ">" + label + "</a></span>";\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
-}\r
-\r
-function jmolCommandInput(label, size, id, title) {\r
- _jmolInitCheck();\r
- id != undefined && id != null || (id = "jmolCmd" + _jmol.cmdCount);\r
- label != undefined && label != null || (label = "Execute");\r
- size != undefined && !isNaN(size) || (size = 60);\r
- ++_jmol.cmdCount;\r
- var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" + id + "' id='" + id + \r
- "' size='"+size+"' onkeypress='_jmolCommandKeyPress(event,\""+id+"\"" + _jmol.targetText + ")'><input type=button value = '"+label+"' onclick='jmolScript(document.getElementById(\""+id+"\").value" + _jmol.targetText + ")' /></span>";\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
-}\r
-\r
-function _jmolCommandKeyPress(e, id, target) {\r
- var keycode = (window.event ? window.event.keyCode : e ? e.which : 0);\r
- if (keycode == 13) {\r
- var inputBox = document.getElementById(id)\r
- _jmolScriptExecute(inputBox, inputBox.value, target)\r
- }\r
-}\r
-\r
-function _jmolScriptExecute(element,script,target) {\r
- if (typeof(script) == "object")\r
- script[0](element, script, target)\r
- else\r
- jmolScript(script, target) \r
-}\r
-\r
-function jmolMenu(arrayOfMenuItems, size, id, title) {\r
- _jmolInitCheck();\r
- id != undefined && id != null || (id = "jmolMenu" + _jmol.menuCount);\r
- ++_jmol.menuCount;\r
- var type = typeof arrayOfMenuItems;\r
- if (type != null && type == "object" && arrayOfMenuItems.length) {\r
- var len = arrayOfMenuItems.length;\r
- if (typeof size != "number" || size == 1)\r
- size = null;\r
- else if (size < 0)\r
- size = len;\r
- var sizeText = size ? " size='" + size + "' " : "";\r
- var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><select name='" + id + "' id='" + id +\r
- "' onChange='_jmolMenuSelected(this" + _jmol.targetText + ")'" +\r
- sizeText + _jmol.menuCssText + ">";\r
- for (var i = 0; i < len; ++i) {\r
- var menuItem = arrayOfMenuItems[i];\r
- type = typeof menuItem;\r
- var script, text;\r
- var isSelected = undefined;\r
- if (type == "object" && menuItem != null) {\r
- script = menuItem[0];\r
- text = menuItem[1];\r
- isSelected = menuItem[2];\r
- } else {\r
- script = text = menuItem;\r
- }\r
- text != undefined && text != null || (text = script); \r
- if (script=="#optgroup") {\r
- t += "<optgroup label='" + text + "'>"; \r
- } else if (script=="#optgroupEnd") {\r
- t += "</optgroup>"; \r
- } else { \r
- var scriptIndex = _jmolAddScript(script);\r
- var selectedText = isSelected ? "' selected='true'>" : "'>";\r
- t += "<option value='" + scriptIndex + selectedText + text + "</option>";\r
- }\r
- }\r
- t += "</select></span>";\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
- }\r
-}\r
-\r
-function jmolHtml(html) {\r
- return _jmolDocumentWrite(html);\r
-}\r
-\r
-function jmolBr() {\r
- return _jmolDocumentWrite("<br />");\r
-}\r
-\r
-////////////////////////////////////////////////////////////////\r
-// advanced scripting functions\r
-////////////////////////////////////////////////////////////////\r
-\r
-function jmolDebugAlert(enableAlerts) {\r
- _jmol.debugAlert = (enableAlerts == undefined || enableAlerts)\r
-}\r
-\r
-function jmolAppletInline(size, inlineModel, script, nameSuffix) {\r
- _jmolInitCheck();\r
- return _jmolApplet(size, _jmolSterilizeInline(inlineModel),\r
- script, nameSuffix);\r
-}\r
-\r
-function jmolSetTarget(targetSuffix) {\r
- _jmol.targetSuffix = targetSuffix;\r
- _jmol.targetText = targetSuffix ? ",\"" + targetSuffix + "\"" : ",0";\r
-}\r
-\r
-function jmolScript(script, targetSuffix) {\r
- if (script) {\r
- _jmolCheckBrowser();\r
- if (targetSuffix == "all") {\r
- with (_jmol) {\r
- for (var i = 0; i < appletSuffixes.length; ++i) {\r
- var applet = _jmolGetApplet(appletSuffixes[i]);\r
- if (applet) applet.script(script);\r
- }\r
- }\r
- } else {\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (applet) applet.script(script);\r
- }\r
- }\r
-}\r
-\r
-function jmolLoadInline(model, targetSuffix) {\r
- if (!model)return "ERROR: NO MODEL"\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (!applet)return "ERROR: NO APPLET"\r
- if (typeof(model) == "string")\r
- return applet.loadInlineString(model, "", false);\r
- else\r
- return applet.loadInlineArray(model, "", false);\r
-}\r
-\r
-\r
-function jmolLoadInlineScript(model, script, targetSuffix) {\r
- if (!model)return "ERROR: NO MODEL"\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (!applet)return "ERROR: NO APPLET"\r
- return applet.loadInlineString(model, script, false);\r
-}\r
-\r
-\r
-function jmolLoadInlineArray(ModelArray, script, targetSuffix) {\r
- if (!model)return "ERROR: NO MODEL"\r
- script || (script="")\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (!applet)return "ERROR: NO APPLET"\r
- try {\r
- return applet.loadInlineArray(ModelArray, script, false);\r
- } catch (err) {\r
- //IE 7 bug\r
- return applet.loadInlineString(ModelArray.join("\n"), script, false);\r
- }\r
-}\r
-\r
-function jmolAppendInlineArray(ModelArray, script, targetSuffix) {\r
- if (!model)return "ERROR: NO MODEL"\r
- script || (script="")\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (!applet)return "ERROR: NO APPLET"\r
- try {\r
- return applet.loadInlineArray(ModelArray, script, true);\r
- } catch (err) {\r
- //IE 7 bug\r
- return applet.loadInlineString(ModelArray.join("\n"), script, true);\r
- }\r
-}\r
-\r
-function jmolAppendInlineScript(model, script, targetSuffix) {\r
- if (!model)return "ERROR: NO MODEL"\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (!applet)return "ERROR: NO APPLET"\r
- return applet.loadInlineString(model, script, true);\r
-}\r
-\r
-function jmolCheckBrowser(action, urlOrMessage, nowOrLater) {\r
- if (typeof action == "string") {\r
- action = action.toLowerCase();\r
- action == "alert" || action == "redirect" || action == "popup" || (action = null);\r
- }\r
- if (typeof action != "string")\r
- alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +\r
- "action must be 'alert', 'redirect', or 'popup'");\r
- else {\r
- if (typeof urlOrMessage != "string")\r
- alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +\r
- "urlOrMessage must be a string");\r
- else {\r
- _jmol.checkBrowserAction = action;\r
- _jmol.checkBrowserUrlOrMessage = urlOrMessage;\r
- }\r
- }\r
- if (typeof nowOrLater == "string" && nowOrLater.toLowerCase() == "now")\r
- _jmolCheckBrowser();\r
-}\r
-\r
-////////////////////////////////////////////////////////////////\r
-// Cascading Style Sheet Class support\r
-////////////////////////////////////////////////////////////////\r
-\r
-function jmolSetAppletCssClass(appletCssClass) {\r
- if (_jmol.hasGetElementById) {\r
- _jmol.appletCssClass = appletCssClass;\r
- _jmol.appletCssText = appletCssClass ? "class='" + appletCssClass + "' " : "";\r
- }\r
-}\r
-\r
-function jmolSetButtonCssClass(buttonCssClass) {\r
- if (_jmol.hasGetElementById) {\r
- _jmol.buttonCssClass = buttonCssClass;\r
- _jmol.buttonCssText = buttonCssClass ? "class='" + buttonCssClass + "' " : "";\r
- }\r
-}\r
-\r
-function jmolSetCheckboxCssClass(checkboxCssClass) {\r
- if (_jmol.hasGetElementById) {\r
- _jmol.checkboxCssClass = checkboxCssClass;\r
- _jmol.checkboxCssText = checkboxCssClass ? "class='" + checkboxCssClass + "' " : "";\r
- }\r
-}\r
-\r
-function jmolSetRadioCssClass(radioCssClass) {\r
- if (_jmol.hasGetElementById) {\r
- _jmol.radioCssClass = radioCssClass;\r
- _jmol.radioCssText = radioCssClass ? "class='" + radioCssClass + "' " : "";\r
- }\r
-}\r
-\r
-function jmolSetLinkCssClass(linkCssClass) {\r
- if (_jmol.hasGetElementById) {\r
- _jmol.linkCssClass = linkCssClass;\r
- _jmol.linkCssText = linkCssClass ? "class='" + linkCssClass + "' " : "";\r
- }\r
-}\r
-\r
-function jmolSetMenuCssClass(menuCssClass) {\r
- if (_jmol.hasGetElementById) {\r
- _jmol.menuCssClass = menuCssClass;\r
- _jmol.menuCssText = menuCssClass ? "class='" + menuCssClass + "' " : "";\r
- }\r
-}\r
-\r
-////////////////////////////////////////////////////////////////\r
-// functions for INTERNAL USE ONLY which are subject to change\r
-// use at your own risk ... you have been WARNED!\r
-////////////////////////////////////////////////////////////////\r
-var _jmol = {\r
- currentDocument: document,\r
-\r
- debugAlert: false,\r
- \r
- codebase: "",\r
- modelbase: ".",\r
- \r
- appletCount: 0,\r
- appletSuffixes: [],\r
- appletWindow: null,\r
- allowedJmolSize: [25, 2048, 300], // min, max, default (pixels)\r
- /* By setting the _jmol.allowedJmolSize[] variable in the webpage \r
- before calling jmolApplet(), limits for applet size can be overriden.\r
- 2048 standard for GeoWall (http://geowall.geo.lsa.umich.edu/home.html)\r
- */ \r
- buttonCount: 0,\r
- checkboxCount: 0,\r
- linkCount: 0,\r
- cmdCount: 0,\r
- menuCount: 0,\r
- radioCount: 0,\r
- radioGroupCount: 0,\r
- \r
- appletCssClass: null,\r
- appletCssText: "",\r
- buttonCssClass: null,\r
- buttonCssText: "",\r
- checkboxCssClass: null,\r
- checkboxCssText: "",\r
- java_arguments: "-Xmx512m",\r
- radioCssClass: null,\r
- radioCssText: "",\r
- linkCssClass: null,\r
- linkCssText: "",\r
- menuCssClass: null,\r
- menuCssText: "",\r
- \r
- targetSuffix: 0,\r
- targetText: ",0",\r
- scripts: [""],\r
- params: {\r
- syncId: ("" + Math.random()).substring(3),\r
- progressbar: "true",\r
- progresscolor: "blue",\r
- boxbgcolor: "black",\r
- boxfgcolor: "white",\r
- boxmessage: "Downloading JmolApplet ..."\r
- },\r
- ua: navigator.userAgent.toLowerCase(),\r
- // uaVersion: parseFloat(navigator.appVersion), // not used\r
- \r
- os: "unknown",\r
- browser: "unknown",\r
- browserVersion: 0,\r
- hasGetElementById: !!document.getElementById,\r
- isJavaEnabled: navigator.javaEnabled(),\r
- // isNetscape47Win: false, // not used, N4.7 is no longer supported even for detection\r
- useIEObject: false,\r
- useHtml4Object: false,\r
- \r
- windowsClassId: "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93",\r
- windowsCabUrl:\r
- "http://java.sun.com/update/1.6.0/jinstall-6u22-windows-i586.cab",\r
-\r
- isBrowserCompliant: false,\r
- isJavaCompliant: false,\r
- isFullyCompliant: false,\r
-\r
- initialized: false,\r
- initChecked: false,\r
- \r
- browserChecked: false,\r
- checkBrowserAction: "alert",\r
- checkBrowserUrlOrMessage: null,\r
-\r
- archivePath: null, // JmolApplet0.jar OR JmolAppletSigned0.jar\r
-\r
- previousOnloadHandler: null,\r
-\r
- jmoljar: null, \r
- useNoApplet: false,\r
-\r
- ready: {}\r
-}\r
-\r
-with (_jmol) {\r
- function _jmolTestUA(candidate) {\r
- var ua = _jmol.ua;\r
- var index = ua.indexOf(candidate);\r
- if (index < 0)\r
- return false;\r
- _jmol.browser = candidate;\r
- _jmol.browserVersion = parseFloat(ua.substring(index+candidate.length+1));\r
- return true;\r
- }\r
- \r
- function _jmolTestOS(candidate) {\r
- if (_jmol.ua.indexOf(candidate) < 0)\r
- return false;\r
- _jmol.os = candidate;\r
- return true;\r
- }\r
- \r
- _jmolTestUA("konqueror") ||\r
- _jmolTestUA("webkit") ||\r
- _jmolTestUA("omniweb") ||\r
- _jmolTestUA("opera") ||\r
- _jmolTestUA("webtv") ||\r
- _jmolTestUA("icab") ||\r
- _jmolTestUA("msie") ||\r
- (_jmol.ua.indexOf("compatible") < 0 && _jmolTestUA("mozilla")); //Netscape, Mozilla, Seamonkey, Firefox and anything assimilated\r
- \r
- _jmolTestOS("linux") ||\r
- _jmolTestOS("unix") ||\r
- _jmolTestOS("mac") ||\r
- _jmolTestOS("win");\r
-\r
- /* not used:\r
- isNetscape47Win = (os == "win" && browser == "mozilla" &&\r
- browserVersion >= 4.78 && browserVersion <= 4.8);\r
- */\r
-\r
- if (os == "win") {\r
- isBrowserCompliant = hasGetElementById;\r
- } else if (os == "mac") { // mac is the problem child :-(\r
- if (browser == "mozilla" && browserVersion >= 5) {\r
- // miguel 2004 11 17\r
- // checking the plugins array does not work because\r
- // Netscape 7.2 OS X still has Java 1.3.1 listed even though\r
- // javaplugin.sf.net is installed to upgrade to 1.4.2\r
- eval("try {var v = java.lang.System.getProperty('java.version');" +\r
- " _jmol.isBrowserCompliant = v >= '1.4.2';" +\r
- " } catch (e) { }");\r
- } else if (browser == "opera" && browserVersion <= 7.54) {\r
- isBrowserCompliant = false;\r
- } else {\r
- isBrowserCompliant = hasGetElementById &&\r
- !((browser == "msie") ||\r
- (browser == "webkit" && browserVersion < 125.12));\r
- }\r
- } else if (os == "linux" || os == "unix") {\r
- if (browser == "konqueror" && browserVersion <= 3.3)\r
- isBrowserCompliant = false;\r
- else\r
- isBrowserCompliant = hasGetElementById;\r
- } else { // other OS\r
- isBrowserCompliant = hasGetElementById;\r
- }\r
-\r
- // possibly more checks in the future for this\r
- isJavaCompliant = isJavaEnabled;\r
-\r
- isFullyCompliant = isBrowserCompliant && isJavaCompliant;\r
-\r
- useIEObject = (os == "win" && browser == "msie" && browserVersion >= 5.5);\r
- useHtml4Object =\r
- (browser == "mozilla" && browserVersion >= 5) ||\r
- (browser == "opera" && browserVersion >= 8) ||\r
- (browser == "webkit" && browserVersion >= 412.2);\r
- try {\r
- if (top.location.search.indexOf("JMOLJAR=")>=0)\r
- jmoljar = top.location.search.split("JMOLJAR=")[1].split("&")[0];\r
- } catch(e) {\r
- // can't access top.location\r
- }\r
- try {\r
- useNoApplet = (top.location.search.indexOf("NOAPPLET")>=0);\r
- } catch(e) {\r
- // can't access top.document\r
- }\r
-}\r
-\r
-function jmolSetMemoryMb(nMb) {\r
- _jmol.java_arguments = "-Xmx" + Math.round(nMb) + "m"\r
-}\r
-\r
-function jmolSetParameter(name,value) {\r
- _jmol.params[name] = value\r
-}\r
-\r
-function jmolSetCallback(callbackName,funcName) {\r
- _jmol.params[callbackName] = funcName\r
-}\r
-\r
- try {\r
-// note this is done FIRST, so it cannot override a setting done by the developer\r
- if (top.location.search.indexOf("PARAMS=")>=0) {\r
- var pars = unescape(top.location.search.split("PARAMS=")[1].split("&")[0]).split(";");\r
- for (var i = 0; i < pars.length; i++) {\r
- var p = pars[i].split(":");\r
- jmolSetParameter(p[0],p[1]);\r
- }\r
- }\r
- } catch(e) {\r
- // can't access top.location\r
- }\r
-\r
-function jmolSetSyncId(n) {\r
- return _jmol.params["syncId"] = n\r
-}\r
-\r
-function jmolGetSyncId() {\r
- return _jmol.params["syncId"]\r
-}\r
-\r
-function jmolSetLogLevel(n) {\r
- _jmol.params.logLevel = ''+n;\r
-}\r
-\r
- /* AngelH, mar2007:\r
- By (re)setting these variables in the webpage before calling jmolApplet(), \r
- a custom message can be provided (e.g. localized for user's language) when no Java is installed.\r
- */\r
-if (noJavaMsg==undefined) var noJavaMsg = \r
- "You do not have Java applets enabled in your web browser, or your browser is blocking this applet.<br />\n" +\r
- "Check the warning message from your browser and/or enable Java applets in<br />\n" +\r
- "your web browser preferences, or install the Java Runtime Environment from <a href='http://www.java.com'>www.java.com</a><br />";\r
-if (noJavaMsg2==undefined) var noJavaMsg2 = \r
- "You do not have the<br />\n" +\r
- "Java Runtime Environment<br />\n" +\r
- "installed for applet support.<br />\n" +\r
- "Visit <a href='http://www.java.com'>www.java.com</a>";\r
-function _jmolApplet(size, inlineModel, script, nameSuffix) {\r
- /* AngelH, mar2007\r
- Fixed percent / pixel business, to avoid browser errors:\r
- put "px" where needed, avoid where not.\r
-\r
- Bob Hanson, 1/2010\r
- Fixed inline escape changing returns to | \r
- */\r
- with (_jmol) {\r
- nameSuffix == undefined && (nameSuffix = appletCount);\r
- appletSuffixes.push(nameSuffix);\r
- ++appletCount;\r
- script || (script = "select *");\r
- var sz = _jmolGetAppletSize(size);\r
- var widthAndHeight = " width='" + sz[0] + "' height='" + sz[1] + "' ";\r
- var tHeader, tFooter;\r
- codebase || jmolInitialize(".");\r
- if (useIEObject || useHtml4Object) {\r
- params.archive = archivePath;\r
- params.mayscript = 'true';\r
- params.codebase = codebase;\r
- params.code = 'JmolApplet';\r
- tHeader = \r
- "<object name='jmolApplet" + nameSuffix +\r
- "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" +\r
- widthAndHeight + "\n";\r
- tFooter = "</object>";\r
- }\r
- if (java_arguments)\r
- params.java_arguments = java_arguments;\r
- if (useIEObject) { // use MSFT IE6 object tag with .cab file reference\r
- tHeader += " classid='" + windowsClassId + "'\n" +\r
- (windowsCabUrl ? " codebase='" + windowsCabUrl + "'\n" : "") + ">\n";\r
- } else if (useHtml4Object) { // use HTML4 object tag\r
- tHeader += " type='application/x-java-applet'\n>\n";\r
- /* " classid='java:JmolApplet'\n" + AH removed this\r
- Chromium Issue 62076: Java Applets using an <object> with a classid paramater don't load.\r
- http://code.google.com/p/chromium/issues/detail?id=62076\r
- They say this is the correct behavior according to the spec, and there's no indication at this point \r
- that WebKit will be changing the handling, so eventually Safari will acquire this behavior too.\r
- Removing the classid parameter seems to be well tolerated by all browsers (even IE!).\r
- */\r
- } else { // use applet tag\r
- tHeader = \r
- "<applet name='jmolApplet" + nameSuffix +\r
- "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" +\r
- widthAndHeight + "\n" +\r
- " code='JmolApplet'" +\r
- " archive='" + archivePath + "' codebase='" + codebase + "'\n" +\r
- " mayscript='true'>\n";\r
- tFooter = "</applet>";\r
- }\r
- var visitJava;\r
- if (useIEObject || useHtml4Object) {\r
- var szX = "width:" + sz[0]\r
- if ( szX.indexOf("%")==-1 ) szX+="px" \r
- var szY = "height:" + sz[1]\r
- if ( szY.indexOf("%")==-1 ) szY+="px" \r
- visitJava =\r
- "<p style='background-color:yellow; color:black; " +\r
- szX + ";" + szY + ";" +\r
- // why doesn't this vertical-align work?\r
- "text-align:center;vertical-align:middle;'>\n" +\r
- noJavaMsg +\r
- "</p>";\r
- } else {\r
- visitJava =\r
- "<table bgcolor='yellow'><tr>" +\r
- "<td align='center' valign='middle' " + widthAndHeight + "><font color='black'>\n" +\r
- noJavaMsg2 +\r
- "</font></td></tr></table>";\r
- }\r
- params.loadInline = (inlineModel ? inlineModel : "");\r
- params.script = (script ? _jmolSterilizeScript(script) : "");\r
- var t = tHeader + _jmolParams() + visitJava + tFooter;\r
- jmolSetTarget(nameSuffix);\r
- ready["jmolApplet" + nameSuffix] = false;\r
- if (_jmol.debugAlert)\r
- alert(t);\r
- return _jmolDocumentWrite(t);\r
- }\r
-}\r
-\r
-function _jmolParams() {\r
- var t = "";\r
- for (var i in _jmol.params)\r
- if(_jmol.params[i]!="")\r
- t+=" <param name='"+i+"' value='"+_jmol.params[i]+"' />\n";\r
- return t\r
-}\r
-\r
-function _jmolInitCheck() {\r
- if (_jmol.initChecked)\r
- return;\r
- _jmol.initChecked = true;\r
- jmolInitialize(defaultdir, defaultjar)\r
-}\r
-\r
-function _jmolCheckBrowser() {\r
- with (_jmol) {\r
- if (browserChecked)\r
- return;\r
- browserChecked = true;\r
- \r
- if (isFullyCompliant)\r
- return true;\r
-\r
- if (checkBrowserAction == "redirect")\r
- location.href = checkBrowserUrlOrMessage;\r
- else if (checkBrowserAction == "popup")\r
- _jmolPopup(checkBrowserUrlOrMessage);\r
- else {\r
- var msg = checkBrowserUrlOrMessage;\r
- if (msg == null)\r
- msg = "Your web browser is not fully compatible with Jmol\n\n" +\r
- "browser: " + browser +\r
- " version: " + browserVersion +\r
- " os: " + os +\r
- " isBrowserCompliant: " + isBrowserCompliant +\r
- " isJavaCompliant: " + isJavaCompliant +\r
- "\n\n" + ua;\r
- alert(msg);\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-function jmolSetXHTML(id) {\r
- _jmol.isXHTML = true\r
- _jmol.XhtmlElement = null\r
- _jmol.XhtmlAppendChild = false\r
- if (id){\r
- _jmol.XhtmlElement = document.getElementById(id)\r
- _jmol.XhtmlAppendChild = true\r
- }\r
-}\r
-\r
-function _jmolDocumentWrite(text) {\r
- if (_jmol.currentDocument) {\r
- if (_jmol.isXHTML && !_jmol.XhtmlElement) {\r
- var s = document.getElementsByTagName("script")\r
- _jmol.XhtmlElement = s.item(s.length - 1)\r
- _jmol.XhtmlAppendChild = false\r
- }\r
- if (_jmol.XhtmlElement) {\r
- _jmolDomDocumentWrite(text)\r
- } else {\r
- _jmol.currentDocument.write(text);\r
- }\r
- }\r
- return text;\r
-}\r
-\r
-function _jmolDomDocumentWrite(data) {\r
- var pt = 0\r
- var Ptr = []\r
- Ptr[0] = 0\r
- while (Ptr[0] < data.length) {\r
- var child = _jmolGetDomElement(data, Ptr)\r
- if (!child)break\r
- if (_jmol.XhtmlAppendChild)\r
- _jmol.XhtmlElement.appendChild(child)\r
- else\r
- _jmol.XhtmlElement.parentNode.insertBefore(child, _jmol.XhtmlElement); \r
- }\r
-}\r
-function _jmolGetDomElement(data, Ptr, closetag, lvel) {\r
- var e = document.createElement("span")\r
- e.innerHTML = data\r
- Ptr[0] = data.length\r
- return e\r
-\r
-//unnecessary?\r
-\r
- closetag || (closetag = "")\r
- lvel || (lvel = 0)\r
- var pt0 = Ptr[0]\r
- var pt = pt0\r
- while (pt < data.length && data.charAt(pt) != "<") pt++\r
- if (pt != pt0) {\r
- var text = data.substring(pt0, pt)\r
- Ptr[0] = pt\r
- return document.createTextNode(text)\r
- } \r
- pt0 = ++pt\r
- var ch\r
- while (pt < data.length && "\n\r\t >".indexOf(ch = data.charAt(pt)) < 0) pt++\r
- var tagname = data.substring(pt0, pt)\r
- var e = (tagname == closetag || tagname == "/" ? "" \r
- : document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', tagname)\r
- : document.createElement(tagname));\r
- if (ch == ">") {\r
- Ptr[0] = ++pt\r
- return e\r
- }\r
- while (pt < data.length && (ch = data.charAt(pt)) != ">") {\r
- while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++\r
- pt0 = pt\r
- while (pt < data.length && "\n\r\t =/>".indexOf(ch = data.charAt(pt)) < 0) pt++\r
- var attrname = data.substring(pt0, pt).toLowerCase()\r
- if (attrname && ch != "=") \r
- e.setAttribute(attrname, "true")\r
- while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++\r
- if (ch == "/") {\r
- Ptr[0] = pt + 2\r
- return e\r
- } else if (ch == "=") {\r
- var quote = data.charAt(++pt)\r
- pt0 = ++pt\r
- while (pt < data.length && (ch = data.charAt(pt)) != quote) pt++\r
- var attrvalue = data.substring(pt0, pt)\r
- e.setAttribute(attrname, attrvalue)\r
- pt++\r
- }\r
- }\r
- Ptr[0] = ++pt\r
- while (Ptr[0] < data.length) {\r
- var child = _jmolGetDomElement(data, Ptr, "/" + tagname, lvel+1)\r
- if (!child)break\r
- e.appendChild(child)\r
- }\r
- return e\r
-}\r
-\r
-function _jmolPopup(url) {\r
- var popup = window.open(url, "JmolPopup",\r
- "left=150,top=150,height=400,width=600," +\r
- "directories=yes,location=yes,menubar=yes," +\r
- "toolbar=yes," +\r
- "resizable=yes,scrollbars=yes,status=yes");\r
- if (popup.focus)\r
- poup.focus();\r
-}\r
-\r
-function _jmolReadyCallback(name) {\r
- if (_jmol.debugAlert)\r
- alert(name + " is ready");\r
- _jmol.ready["" + name] = true;\r
-}\r
-\r
-function _jmolSterilizeScript(script) {\r
- script = script.replace(/'/g, "'");\r
- if (_jmol.debugAlert)\r
- alert("script:\n" + script);\r
- return script;\r
-}\r
-\r
-function _jmolSterilizeInline(model) {\r
- model = model.replace(/\r|\n|\r\n/g, (model.indexOf("|") >= 0 ? "\\/n" : "|")).replace(/'/g, "'");\r
- if (_jmol.debugAlert)\r
- alert("inline model:\n" + model);\r
- return model;\r
-}\r
-\r
-function _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) {\r
- ++_jmol.radioCount;\r
- groupName != undefined && groupName != null || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1));\r
- if (!script)\r
- return "";\r
- labelHtml != undefined && labelHtml != null || (labelHtml = script.substring(0, 32));\r
- separatorHtml || (separatorHtml = "")\r
- var scriptIndex = _jmolAddScript(script);\r
- var eospan = "</span>"\r
- var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" \r
- + groupName + "' id='"+id+"' type='radio' onclick='_jmolClick(this," +\r
- scriptIndex + _jmol.targetText + ");return true;' onmouseover='_jmolMouseOver(" +\r
- scriptIndex + ");return true;' onmouseout='_jmolMouseOut()' " +\r
- (isChecked ? "checked='true' " : "") + _jmol.radioCssText + " />"\r
- if (labelHtml.toLowerCase().indexOf("<td>")>=0) {\r
- t += eospan\r
- eospan = "";\r
- }\r
- t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan + separatorHtml;\r
-\r
- return t;\r
-}\r
-\r
-function _jmolFindApplet(target) {\r
- // first look for the target in the current window\r
- var applet = _jmolFindAppletInWindow(_jmol.appletWindow != null ? _jmol.appletWindow : window, target);\r
- // THEN look for the target in child frames\r
- if (applet == undefined)\r
- applet = _jmolSearchFrames(window, target);\r
- // FINALLY look for the target in sibling frames\r
- if (applet == undefined)\r
- applet = _jmolSearchFrames(top, target); // look starting in top frame\r
- return applet;\r
-}\r
-\r
-function _jmolGetApplet(targetSuffix){\r
- var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0");\r
- var applet = _jmolFindApplet(target);\r
- if (applet) return applet\r
- _jmol.alerted || alert("could not find applet " + target);\r
- _jmol.alerted = true;\r
- return null\r
-}\r
-\r
-function _jmolSearchFrames(win, target) {\r
- var applet;\r
- var frames = win.frames;\r
- if (frames && frames.length) { // look in all the frames below this window\r
- try{\r
- for (var i = 0; i < frames.length; ++i) {\r
- applet = _jmolSearchFrames(frames[i], target);\r
- if (applet)\r
- return applet;\r
- }\r
- }catch(e) {\r
- if (_jmol.debugAlert)\r
- alert("Jmol.js _jmolSearchFrames cannot access " + win.name + ".frame[" + i + "] consider using jmolSetAppletWindow()") \r
- }\r
- }\r
- return applet = _jmolFindAppletInWindow(win, target)\r
-}\r
-\r
-function _jmolFindAppletInWindow(win, target) {\r
- var doc = win.document;\r
- if (doc.getElementById(target))\r
- return doc.getElementById(target);\r
- else if (doc.applets)\r
- return doc.applets[target];\r
- else\r
- return doc[target]; \r
-}\r
-\r
-function _jmolAddScript(script) {\r
- if (!script)\r
- return 0;\r
- var index = _jmol.scripts.length;\r
- _jmol.scripts[index] = script;\r
- return index;\r
-}\r
-\r
-function _jmolClick(elementClicked, scriptIndex, targetSuffix) {\r
- _jmol.element = elementClicked;\r
- _jmolScriptExecute(elementClicked, _jmol.scripts[scriptIndex], targetSuffix);\r
-}\r
-\r
-function _jmolMenuSelected(menuObject, targetSuffix) {\r
- var scriptIndex = menuObject.value;\r
- if (scriptIndex != undefined) {\r
- _jmolScriptExecute(menuObject, _jmol.scripts[scriptIndex], targetSuffix);\r
- return;\r
- }\r
- var len = menuObject.length;\r
- if (typeof len == "number") {\r
- for (var i = 0; i < len; ++i) {\r
- if (menuObject[i].selected) {\r
- _jmolClick(menuObject[i], menuObject[i].value, targetSuffix);\r
- return;\r
- }\r
- }\r
- }\r
- alert("?Que? menu selected bug #8734");\r
-}\r
-\r
-\r
-_jmol.checkboxMasters = {};\r
-_jmol.checkboxItems = {};\r
-\r
-function jmolSetCheckboxGroup(chkMaster,chkBox) {\r
- var id = chkMaster;\r
- if(typeof(id)=="number")id = "jmolCheckbox" + id;\r
- chkMaster = document.getElementById(id);\r
- if (!chkMaster)alert("jmolSetCheckboxGroup: master checkbox not found: " + id);\r
- var m = _jmol.checkboxMasters[id] = {};\r
- m.chkMaster = chkMaster;\r
- m.chkGroup = {};\r
- for (var i = 1; i < arguments.length; i++){\r
- var id = arguments[i];\r
- if(typeof(id)=="number")id = "jmolCheckbox" + id;\r
- checkboxItem = document.getElementById(id);\r
- if (!checkboxItem)alert("jmolSetCheckboxGroup: group checkbox not found: " + id);\r
- m.chkGroup[id] = checkboxItem;\r
- _jmol.checkboxItems[id] = m;\r
- }\r
-}\r
-\r
-function _jmolNotifyMaster(m){\r
- //called when a group item is checked\r
- var allOn = true;\r
- var allOff = true;\r
- for (var chkBox in m.chkGroup){\r
- if(m.chkGroup[chkBox].checked)\r
- allOff = false;\r
- else\r
- allOn = false;\r
- }\r
- if (allOn)m.chkMaster.checked = true; \r
- if (allOff)m.chkMaster.checked = false;\r
- if ((allOn || allOff) && _jmol.checkboxItems[m.chkMaster.id])\r
- _jmolNotifyMaster(_jmol.checkboxItems[m.chkMaster.id])\r
-}\r
-\r
-function _jmolNotifyGroup(m, isOn){\r
- //called when a master item is checked\r
- for (var chkBox in m.chkGroup){\r
- var item = m.chkGroup[chkBox]\r
- item.checked = isOn;\r
- if (_jmol.checkboxMasters[item.id])\r
- _jmolNotifyGroup(_jmol.checkboxMasters[item.id], isOn)\r
- }\r
-}\r
-\r
-function _jmolCbClick(ckbox, whenChecked, whenUnchecked, targetSuffix) {\r
- _jmol.control = ckbox\r
- _jmolClick(ckbox, ckbox.checked ? whenChecked : whenUnchecked, targetSuffix);\r
- if(_jmol.checkboxMasters[ckbox.id])\r
- _jmolNotifyGroup(_jmol.checkboxMasters[ckbox.id], ckbox.checked)\r
- if(_jmol.checkboxItems[ckbox.id])\r
- _jmolNotifyMaster(_jmol.checkboxItems[ckbox.id])\r
-}\r
-\r
-function _jmolCbOver(ckbox, whenChecked, whenUnchecked) {\r
- window.status = _jmol.scripts[ckbox.checked ? whenUnchecked : whenChecked];\r
-}\r
-\r
-function _jmolMouseOver(scriptIndex) {\r
- window.status = _jmol.scripts[scriptIndex];\r
-}\r
-\r
-function _jmolMouseOut() {\r
- window.status = " ";\r
- return true;\r
-}\r
-\r
-function _jmolSetCodebase(codebase) {\r
- _jmol.codebase = codebase ? codebase : ".";\r
- if (_jmol.debugAlert)\r
- alert("jmolCodebase=" + _jmol.codebase);\r
-}\r
-\r
-function _jmolOnloadResetForms() {\r
- // must be evaluated ONLY once\r
- _jmol.previousOnloadHandler = window.onload;\r
- window.onload =\r
- function() {\r
- with (_jmol) {\r
- if (buttonCount+checkboxCount+menuCount+radioCount+radioGroupCount > 0) {\r
- var forms = document.forms;\r
- for (var i = forms.length; --i >= 0; )\r
- forms[i].reset();\r
- }\r
- if (previousOnloadHandler)\r
- previousOnloadHandler();\r
- }\r
- }\r
-}\r
-\r
-////////////////////////////////////\r
-/////extensions for getProperty/////\r
-////////////////////////////////////\r
-\r
-\r
-function _jmolEvalJSON(s,key){\r
- s=s+""\r
- if(!s)return []\r
- if(s.charAt(0)!="{"){\r
- if(s.indexOf(" | ")>=0)s=s.replace(/\ \|\ /g, "\n")\r
- return s\r
- }\r
- var A = eval("("+s+")")\r
- if(!A)return\r
- if(key && A[key])A=A[key]\r
- return A\r
-}\r
-\r
-function _jmolEnumerateObject(A,key){\r
- var sout=""\r
- if(typeof(A) == "string" && A!="null"){\r
- sout+="\n"+key+"=\""+A+"\""\r
- }else if(!isNaN(A)||A==null){\r
- sout+="\n"+key+"="+(A+""==""?"null":A)\r
- }else if(A.length){\r
- sout+=key+"=[]"\r
- for(var i=0;i<A.length;i++){\r
- sout+="\n"\r
- if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){\r
- sout+=_jmolEnumerateObject(A[i],key+"["+i+"]")\r
- }else{\r
- sout+=key+"["+i+"]="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i])\r
- }\r
- }\r
- }else{\r
- if(key != ""){\r
- sout+=key+"={}"\r
- key+="."\r
- }\r
- \r
- for(var i in A){\r
- sout+="\n"\r
- if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){\r
- sout+=_jmolEnumerateObject(A[i],key+i)\r
- }else{\r
- sout+=key+i+"="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i])\r
- }\r
- }\r
- } \r
- return sout\r
-}\r
-\r
-\r
-function _jmolSortKey0(a,b){\r
- return (a[0]<b[0]?1:a[0]>b[0]?-1:0)\r
-}\r
-\r
-function _jmolSortMessages(A){\r
- if(!A || typeof(A)!="object")return []\r
- var B = []\r
- for(var i=A.length-1;i>=0;i--)for(var j=0;j<A[i].length;j++)B[B.length]=A[i][j]\r
- if(B.length == 0) return\r
- B=B.sort(_jmolSortKey0)\r
- return B\r
-}\r
-\r
-/////////additional extensions //////////\r
-\r
-\r
-function _jmolDomScriptLoad(URL){\r
- //open(URL) //to debug\r
- _jmol.servercall=URL\r
- var node = document.getElementById("_jmolScriptNode")\r
- if (node && _jmol.browser!="msie"){\r
- document.getElementsByTagName("HEAD")[0].removeChild(node)\r
- node=null\r
- }\r
- if (node) {\r
- node.setAttribute("src",URL)\r
- } else {\r
- node=document.createElement("script")\r
- node.setAttribute("id","_jmolScriptNode")\r
- node.setAttribute("type","text/javascript")\r
- node.setAttribute("src",URL)\r
- document.getElementsByTagName("HEAD")[0].appendChild(node)\r
- }\r
-}\r
-\r
-\r
-function _jmolExtractPostData(url){\r
- S=url.split("&POST:")\r
- var s=""\r
- for(var i=1;i<S.length;i++){\r
- KV=S[i].split("=")\r
- s+="&POSTKEY"+i+"="+KV[0]\r
- s+="&POSTVALUE"+i+"="+KV[1]\r
- }\r
- return "&url="+escape(S[0])+s\r
-}\r
-\r
-function _jmolLoadModel(targetSuffix,remoteURL,array,isError,errorMessage){\r
- //called by server, but in client\r
- //overload this function to customize return\r
- _jmol.remoteURL=remoteURL\r
- isError && alert(errorMessage)\r
- jmolLoadInlineScript(array.join("\n"),_jmol.optionalscript,targetSuffix)\r
-}\r
-\r
-//////////user property/status functions/////////\r
-\r
-function jmolGetStatus(strStatus,targetSuffix){\r
- return _jmolSortMessages(jmolGetPropertyAsArray("jmolStatus",strStatus,targetSuffix))\r
-}\r
-\r
-function jmolGetPropertyAsArray(sKey,sValue,targetSuffix) {\r
- return _jmolEvalJSON(jmolGetPropertyAsJSON(sKey,sValue,targetSuffix),sKey)\r
-}\r
-\r
-function jmolGetPropertyAsString(sKey,sValue,targetSuffix) {\r
- var applet = _jmolGetApplet(targetSuffix);\r
- sValue == undefined && (sValue="");\r
- return (applet ? applet.getPropertyAsString(sKey,sValue) + "" : "")\r
-}\r
-\r
-function jmolGetPropertyAsJSON(sKey,sValue,targetSuffix) {\r
- sValue == undefined && (sValue = "")\r
- var applet = _jmolGetApplet(targetSuffix);\r
- try {\r
- return (applet ? applet.getPropertyAsJSON(sKey,sValue) + "" : "")\r
- } catch(e) {\r
- return ""\r
- }\r
-}\r
-\r
-function jmolGetPropertyAsJavaObject(sKey,sValue,targetSuffix) {\r
- sValue == undefined && (sValue = "")\r
- var applet = _jmolGetApplet(targetSuffix);\r
- return (applet ? applet.getProperty(sKey,sValue) : null)\r
-}\r
-\r
-\r
-function jmolDecodeJSON(s) {\r
- return _jmolEnumerateObject(_jmolEvalJSON(s),"")\r
-}\r
-\r
-\r
-///////// synchronous scripting ////////\r
-\r
-function jmolScriptWait(script, targetSuffix) {\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var Ret=jmolScriptWaitAsArray(script, targetSuffix)\r
- var s = ""\r
- for(var i=Ret.length;--i>=0;)\r
- for(var j=0;j< Ret[i].length;j++)\r
- s+=Ret[i][j]+"\n"\r
- return s\r
-}\r
-\r
-function jmolScriptWaitOutput(script, targetSuffix) {\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var ret = ""\r
- try{\r
- if (script) {\r
- _jmolCheckBrowser();\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (applet) ret += applet.scriptWaitOutput(script);\r
- }\r
- }catch(e){\r
- }\r
- return ret;\r
-}\r
-\r
-function jmolEvaluate(molecularMath, targetSuffix) {\r
-\r
- //carries out molecular math on a model\r
-\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var result = "" + jmolGetPropertyAsJavaObject("evaluate", molecularMath, targetSuffix);\r
- var s = result.replace(/\-*\d+/,"")\r
- if (s == "" && !isNaN(parseInt(result)))return parseInt(result);\r
- var s = result.replace(/\-*\d*\.\d*/,"")\r
- if (s == "" && !isNaN(parseFloat(result)))return parseFloat(result);\r
- return result;\r
-}\r
-\r
-function jmolScriptEcho(script, targetSuffix) {\r
- // returns a newline-separated list of all echos from a script\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var Ret=jmolScriptWaitAsArray(script, targetSuffix)\r
- var s = ""\r
- for(var i=Ret.length;--i>=0;)\r
- for(var j=Ret[i].length;--j>=0;)\r
- if (Ret[i][j][1] == "scriptEcho")s+=Ret[i][j][3]+"\n"\r
- return s.replace(/ \| /g, "\n")\r
-}\r
-\r
-\r
-function jmolScriptMessage(script, targetSuffix) {\r
- // returns a newline-separated list of all messages from a script, ending with "script completed\n"\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var Ret=jmolScriptWaitAsArray(script, targetSuffix)\r
- var s = ""\r
- for(var i=Ret.length;--i>=0;)\r
- for(var j=Ret[i].length;--j>=0;)\r
- if (Ret[i][j][1] == "scriptStatus")s+=Ret[i][j][3]+"\n"\r
- return s.replace(/ \| /g, "\n")\r
-}\r
-\r
-\r
-function jmolScriptWaitAsArray(script, targetSuffix) {\r
- var ret = ""\r
- try{\r
- jmolGetStatus("scriptEcho,scriptMessage,scriptStatus,scriptError",targetSuffix)\r
- if (script) {\r
- _jmolCheckBrowser();\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (applet) ret += applet.scriptWait(script);\r
- ret = _jmolEvalJSON(ret,"jmolStatus")\r
- if(typeof ret == "object")\r
- return ret\r
- }\r
- }catch(e){\r
- }\r
- return [[ret]]\r
-}\r
-\r
-\r
-\r
-//////////// save/restore orientation /////////////\r
-\r
-function jmolSaveOrientation(id, targetSuffix) { \r
- targetSuffix == undefined && (targetSuffix="0")\r
- return _jmol["savedOrientation"+id] = jmolGetPropertyAsArray("orientationInfo","info",targetSuffix).moveTo\r
-}\r
-\r
-function jmolRestoreOrientation(id, targetSuffix) {\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var s=_jmol["savedOrientation"+id]\r
- if (!s || s == "")return\r
- s=s.replace(/1\.0/,"0")\r
- return jmolScriptWait(s,targetSuffix)\r
-}\r
-\r
-function jmolRestoreOrientationDelayed(id, delay, targetSuffix) {\r
- arguments.length < 2 && (delay=1)\r
- targetSuffix == undefined && (targetSuffix="0")\r
- var s=_jmol["savedOrientation"+id]\r
- if (!s || s == "")return\r
- s=s.replace(/1\.0/,delay)\r
- return jmolScriptWait(s,targetSuffix)\r
-}\r
-\r
-//////////// add parameter /////////////\r
-/*\r
- * for adding callbacks or other parameters. Use:\r
-\r
- jmolSetDocument(0)\r
- var s= jmolApplet(....)\r
- s = jmolAppletAddParam(s,"messageCallback", "myFunctionName")\r
- document.write(s)\r
- jmolSetDocument(document) // if you want to then write buttons and such normally\r
- \r
- */\r
-\r
-function jmolAppletAddParam(appletCode,name,value){\r
- return (value == "" ? appletCode : appletCode.replace(/\<param/,"\n<param name='"+name+"' value='"+value+"' />\n<param"))\r
-}\r
-\r
-///////////////auto load Research Consortium for Structural Biology (RCSB) data ///////////\r
-\r
-function jmolLoadAjax_STOLAF_RCSB(fileformat,pdbid,optionalscript,targetSuffix){\r
-\r
- _jmol.thismodel || (_jmol.thismodel = "1crn")\r
- _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm")\r
- _jmol.RCSBserver || (_jmol.RCSBserver="http://www.rcsb.org")\r
- _jmol.defaultURL_RCSB || (_jmol.defaultURL_RCSB=_jmol.RCSBserver+"/pdb/files/1CRN.CIF")\r
- fileformat || (fileformat="PDB")\r
- pdbid || (pdbid=prompt("Enter a 4-digit PDB ID:",_jmol.thismodel))\r
- if(!pdbid || pdbid.length != 4)return ""\r
- targetSuffix || (targetSuffix="0")\r
- optionalscript || (optionalscript="")\r
- var url=_jmol.defaultURL_RCSB.replace(/1CRN/g,pdbid.toUpperCase())\r
- fileformat=="CIF" || (url=url.replace(/CIF/,fileformat))\r
- _jmol.optionalscript=optionalscript\r
- _jmol.thismodel=pdbid\r
- _jmol.thistargetsuffix=targetSuffix\r
- _jmol.thisurl=url\r
- _jmol.modelArray = []\r
- url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)\r
- _jmolDomScriptLoad(url)\r
- return url\r
-}\r
-\r
-\r
-///////////////auto load NIH CACTVS data -- compound name or SMILES ///////////\r
-\r
-function jmolLoadAjax_STOLAF_NIH(compoundid,optionalscript,targetSuffix){\r
- _jmol.thismodel || (_jmol.thismodel = "aspirin")\r
- _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm")\r
- _jmol.defaultURL_NIH || (_jmol.defaultURL_NIH="http://cactus.nci.nih.gov/chemical/structure/FILE/file?format=sdf&get3d=True")\r
- compoundid || (compoundid=prompt("Enter a compound name or a SMILES string:",_jmol.thismodel))\r
- if(!compoundid)return ""\r
- targetSuffix || (targetSuffix="0")\r
- optionalscript || (optionalscript="")\r
- var url=_jmol.defaultURL_NIH.replace(/FILE/g,compoundid)\r
- _jmol.optionalscript=optionalscript\r
- _jmol.thismodel=compoundid\r
- _jmol.thistargetsuffix=targetSuffix\r
- _jmol.thisurl=url\r
- _jmol.modelArray = []\r
- url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)\r
- _jmolDomScriptLoad(url)\r
- return url\r
-}\r
-\r
-\r
-/////////////// St. Olaf College AJAX server -- ANY URL ///////////\r
-\r
-function jmolLoadAjax_STOLAF_ANY(url, userid, optionalscript,targetSuffix){\r
- _jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm"\r
- _jmol.thisurlANY || (_jmol.thisurlANY = "http://www.stolaf.edu/depts/chemistry/mo/struc/data/ycp3-1.mol")\r
- url || (url=prompt("Enter any (uncompressed file) URL:", _jmol.thisurlANY))\r
- userid || (userid="0")\r
- targetSuffix || (targetSuffix="0")\r
- optionalscript || (optionalscript="")\r
- _jmol.optionalscript=optionalscript\r
- _jmol.thistargetsuffix=targetSuffix\r
- _jmol.modelArray = []\r
- _jmol.thisurl = url\r
- url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)\r
- _jmolDomScriptLoad(url)\r
-}\r
-\r
-\r
-/////////////// Mineralogical Society of America (MSA) data /////////\r
-\r
-function jmolLoadAjax_MSA(key,value,optionalscript,targetSuffix){\r
-\r
- _jmol.thiskeyMSA || (_jmol.thiskeyMSA = "mineral")\r
- _jmol.thismodelMSA || (_jmol.thismodelMSA = "quartz")\r
- _jmol.ajaxURL_MSA || (_jmol.ajaxURL_MSA="http://rruff.geo.arizona.edu/AMS/result.php?mineral=quartz&viewing=ajaxjs")\r
- key || (key=prompt("Enter a field:", _jmol.thiskeyMSA))\r
- if(!key)return ""\r
- value || (value=prompt("Enter a "+key+":", _jmol.thismodelMSA))\r
- if(!value)return ""\r
- targetSuffix || (targetSuffix="0")\r
- optionalscript || (optionalscript="")\r
- optionalscript == 1 && (optionalscript='load "" {1 1 1}')\r
- var url=_jmol.ajaxURL_MSA.replace(/mineral/g,key).replace(/quartz/g,value)\r
- _jmol.optionalscript=optionalscript\r
- _jmol.thiskeyMSA=key\r
- _jmol.thismodelMSA=value\r
- _jmol.thistargetsuffix=targetSuffix\r
- _jmol.thisurl=url\r
- _jmol.modelArray = []\r
- loadModel=_jmolLoadModel\r
- _jmolDomScriptLoad(url)\r
- return url\r
-}\r
-\r
-\r
-\r
-function jmolLoadAjaxJS(url, userid, optionalscript,targetSuffix){\r
- userid || (userid="0")\r
- targetSuffix || (targetSuffix="0")\r
- optionalscript || (optionalscript="")\r
- _jmol.optionalscript=optionalscript\r
- _jmol.thismodel=userid\r
- _jmol.thistargetsuffix=targetSuffix\r
- _jmol.modelArray = []\r
- _jmol.thisurl = url\r
- url+="&returnFunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix\r
- _jmolDomScriptLoad(url)\r
-}\r
-\r
-\r
-//// in case Jmol library has already been loaded:\r
-\r
-}catch(e){}\r
-\r
-///////////////moving atoms //////////////\r
-\r
-// HIGHLY experimental!!\r
-\r
-function jmolSetAtomCoord(i,x,y,z,targetSuffix){\r
- _jmolCheckBrowser();\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (applet) applet.getProperty('jmolViewer').setAtomCoord(i,x,y,z)\r
-}\r
-\r
-function jmolSetAtomCoordRelative(i,x,y,z,targetSuffix){\r
- _jmolCheckBrowser();\r
- var applet=_jmolGetApplet(targetSuffix);\r
- if (applet) applet.getProperty('jmolViewer').setAtomCoordRelative(i,x,y,z)\r
-}\r
-\r
-\r
-///////////////applet fake for testing buttons/////////////\r
-\r
-\r
-if(_jmol.useNoApplet){\r
- jmolApplet = function(w){\r
- var s="<table style='background-color:black' width="+w+"><tr height="+w+">"\r
- +"<td align=center valign=center style='background-color:white'>"\r
- +"Applet would be here"\r
- +"<p><textarea id=fakeApplet rows=5 cols=50></textarea>"\r
- +"</td></tr></table>"\r
- return _jmolDocumentWrite(s)\r
- }\r
-\r
- _jmolFindApplet = function(){return jmolApplet0}\r
-\r
- jmolApplet0 = {\r
- script: function(script){document.getElementById("fakeApplet").value="\njmolScript:\n"+script}\r
- ,scriptWait: function(script){document.getElementById("fakeApplet").value="\njmolScriptWait:\n"+script} \r
- ,loadInline: function(data,script){document.getElementById("fakeApplet").value="\njmolLoadInline data:\n"+data+"\n\nscript:\n"+script}\r
- }\r
-}\r
-\r
-\r
-///////////////////////////////////////////\r
-\r
- // This should no longer be needed, jmolResizeApplet() is better; kept for backwards compatibility\r
- /*\r
- Resizes absolutely (pixels) or by percent of window (w or h 0.5 means 50%).\r
- targetSuffix is optional and defaults to zero (first applet in page).\r
- Both w and h are optional, but needed if you want to use targetSuffix.\r
- h defaults to w\r
- w defaults to 100% of window\r
- If either w or h is between 0 and 1, then it is taken as percent/100.\r
- If either w or h is greater than 1, then it is taken as a size (pixels). \r
- */\r
-function jmolResize(w,h,targetSuffix) {\r
- _jmol.alerted = true;\r
- var percentW = (!w ? 100 : w <= 1 && w > 0 ? w * 100 : 0);\r
- var percentH = (!h ? percentW : h <= 1 && h > 0 ? h * 100 : 0);\r
- if (_jmol.browser=="msie") {\r
- var width=document.body.clientWidth;\r
- var height=document.body.clientHeight;\r
- } else {\r
- var netscapeScrollWidth=15;\r
- var width=window.innerWidth - netscapeScrollWidth;\r
- var height=window.innerHeight-netscapeScrollWidth;\r
- }\r
- var applet = _jmolGetApplet(targetSuffix);\r
- if(!applet)return;\r
- applet.style.width = (percentW ? width * percentW/100 : w)+"px";\r
- applet.style.height = (percentH ? height * percentH/100 : (h ? h : w))+"px";\r
- //title=width + " " + height + " " + (new Date());\r
-}\r
-\r
-// 13 Jun 09 -- makes jmolResize() obsolete (kept for backwards compatibility)\r
-function jmolResizeApplet(size,targetSuffix) {\r
- // See _jmolGetAppletSize() for the formats accepted as size [same used by jmolApplet()]\r
- // Special case: an empty value for width or height is accepted, meaning no change in that dimension.\r
- _jmol.alerted = true;\r
- var applet = _jmolGetApplet(targetSuffix);\r
- if(!applet)return;\r
- var sz = _jmolGetAppletSize(size, "px");\r
- sz[0] && (applet.style.width = sz[0]);\r
- sz[1] && (applet.style.height = sz[1]);\r
-}\r
-\r
-function _jmolGetAppletSize(size, units) {\r
- /* Accepts single number or 2-value array, each one can be one of:\r
- percent (text string ending %), decimal 0 to 1 (percent/100), number, or text string (interpreted as nr.)\r
- [width, height] array of strings is returned, with units added if specified.\r
- Percent is relative to container div or element (which should have explicitly set size).\r
- */\r
- var width, height;\r
- if ( (typeof size) == "object" && size != null ) {\r
- width = size[0]; height = size[1];\r
- } else {\r
- width = height = size;\r
- }\r
- return [_jmolFixDim(width, units), _jmolFixDim(height, units)];\r
-}\r
-\r
-function _jmolFixDim(x, units) {\r
- var sx = "" + x;\r
- return (sx.length == 0 ? (units ? "" : _jmol.allowedJmolSize[2])\r
- : sx.indexOf("%") == sx.length-1 ? sx \r
- : (x = parseFloat(x)) <= 1 && x > 0 ? x * 100 + "%"\r
- : (isNaN(x = Math.floor(x)) ? _jmol.allowedJmolSize[2]\r
- : x < _jmol.allowedJmolSize[0] ? _jmol.allowedJmolSize[0]\r
- : x > _jmol.allowedJmolSize[1] ? _jmol.allowedJmolSize[1] \r
- : x) + (units ? units : ""));\r
-}\r
-\r
-\r
-\r
-\r
+/* Jmol 12.0 script library Jmol.js 9:48 PM 1/31/2011 Bob Hanson
+
+ checkbox heirarchy -- see http://chemapps.stolaf.edu/jmol/docs/examples-11/check.htm
+
+ based on:
+ *
+ * Copyright (C) 2004-2005 Miguel, Jmol Development, www.jmol.org
+ *
+ * Contact: hansonr@stolaf.edu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ */
+
+// for documentation see www.jmol.org/jslibrary
+
+try{if(typeof(_jmol)!="undefined")exit()
+
+// place "?NOAPPLET" on your command line to check applet control action with a textarea
+// place "?JMOLJAR=xxxxx" to use a specific jar file
+
+// bob hanson -- jmolResize(w,h) -- resizes absolutely or by percent (w or h 0.5 means 50%)
+// angel herraez -- update of jmolResize(w,h,targetSuffix) so it is not tied to first applet
+// bob hanson -- jmolEvaluate -- evaluates molecular math 8:37 AM 2/23/2007
+// bob hanson -- jmolScriptMessage -- returns all "scriptStatus" messages 8:37 AM 2/23/2007
+// bob hanson -- jmolScriptEcho -- returns all "scriptEcho" messages 8:37 AM 2/23/2007
+// bob hanson -- jmolScriptWait -- 11:31 AM 5/2/2006
+// bob hanson -- remove trailing separatorHTML in radio groups -- 12:18 PM 5/6/2006
+// bob hanson -- adds support for dynamic DOM script nodes 7:04 AM 5/19/2006
+// bob hanson -- adds try/catch for wiki - multiple code passes 7:05 AM 5/19/2006
+// bob hanson -- auto-initiates to defaultdir/defaultjar -- change as desired.
+// bob hanson -- adding save/restore orientation w/ and w/o delay 11:49 AM 5/25/2006
+// bob hanson -- adding AjaxJS service 11:16 AM 6/3/2006
+// bob hanson -- fix for iframes not available for finding applet
+// bob hanson -- added applet fake ?NOAPPLET URL flag
+// bob hanson -- added jmolSetCallback(calbackName, funcName) 3:32 PM 6/13/2006
+// used PRIOR to jmolApplet() or jmolAppletInline()
+// added 4th array element in jmolRadioGroup -- title
+// added <span> and id around link, checkbox, radio, menu
+// fixing AJAX loads for MSIE/Opera-Mozilla incompatibility
+// -- renamed Jmol-11.js from Jmol-new.js; JmolApplet.jar from JmolAppletProto.jar
+// renamed Jmol.js for Jmol 11 distribution
+// -- modified jmolRestoreOrientation() to be immediate, no 1-second delay
+// bob hanson -- jmolScriptWait always returns a string -- 11:23 AM 9/16/2006
+// bh -- jmolCommandInput()
+// bh -- jmolSetTranslation(TF) -- forces translation even if there might be message callback issues
+// bh -- minor fixes suggested by Angel
+// bh -- adds jmolSetSyncId() and jmolGetSyncId()
+// bh 3/2008 -- adds jmolAppendInlineScript() and jmolAppendInlineArray()
+// bh 3/2008 -- fixes IE7 bug in relation to jmolLoadInlineArray()
+// bh 6/2008 -- adds jmolSetAppletWindow()
+// Angel H. 6/2008 -- added html <label> tags to checkboxes and radio buttons [in jmolCheckbox() and _jmolRadio() functions]
+// bh 7/2008 -- code fix "for(i..." not "for(var i..."
+// bh 12/2008 -- jmolLoadInline, jmolLoadInlineArray, jmolLoadInlineScript, jmolAppendInlineScript, jmolAppendInlineArray all return error message or null (Jmol 11.7.16)
+// bh 12/2008 -- jmolScriptWaitOutput() -- waits for script to complete and delivers output normally sent to console
+
+// bh 5/2009 -- Support for XHTML using jmolSetXHTML(id)
+// ah & bh 6/2009 -- New jmolResizeApplet() more flexible, similar to jmolApplet() size syntax
+// bh 11/2009 -- care in accessing top.document
+// bh 12/2009 -- added jmolSetParameter(name, value)
+// bh 12/2009 -- added PARAMS=name:value;name:value;name:value... for command line
+// bh 12/2009 -- overhaul of target checking
+// bh 1/2010 -- all _xxxx() methods ALWAYS have complete argument list
+// bh 1/2010 -- adds option to run a JavaScript function from any Jmol control.
+// This is accomplished by passing an array rather than a script:
+// jmolHref([myfunc,"my param 1", "my param 2"], "testing")
+// function myfunc(jmolControlObject, [myfunc,"my param 1", "my param 2"], target){...}
+// and allows much more flexibility with responding to controls
+// bh 4/2010 -- added jmolSetMemoryMb(nMb)
+// ah 1/2011 -- wider detection of browsers; more browsers now use the object tag instead of the applet tag;
+// fix of object tag (removed classid) accounts for change of behavior in Chrome
+// bh 3/2011 -- added jmolLoadAjax_STOLAF_NIH
+
+var defaultdir = "."
+var defaultjar = "JmolApplet.jar"
+
+
+// Note added 12:41 PM 9/21/2008 by Bob Hanson, hansonr@stolaf.edu:
+
+// JMOLJAR=xxxxx.jar on the URL for this page will override
+// the JAR file specified in the jmolInitialize() call.
+
+// The idea is that it can be very useful to test a web page with different JAR files
+// Or for an expert user to substitute a signed applet for an unsigned one
+// so as to use a broader range of models or to create JPEG files, for example.
+
+// If the JAR file is not in the current directory (has any sort of "/" in its name)
+// then the user is presented with a warning and asked whether it is OK to change Jar files.
+// The default action, if the user just presses "OK" is to NOT allow the change.
+// The user must type the word "yes" in the prompt box for the change to be approved.
+
+// If you don't want people to be able to switch in their own JAR file on your page,
+// simply set this next line to read "var allowJMOLJAR = false".
+
+
+var undefined; // for IE 5 ... wherein undefined is undefined
+
+////////////////////////////////////////////////////////////////
+// Basic Scripting infrastruture
+////////////////////////////////////////////////////////////////
+
+function jmolInitialize(codebaseDirectory, fileNameOrUseSignedApplet) {
+ if (_jmol.initialized)
+ return;
+ _jmol.initialized = true;
+ if(_jmol.jmoljar) {
+ var f = _jmol.jmoljar;
+ if (f.indexOf("/") >= 0) {
+ 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.")
+ var ok = prompt("Do you want to use applet " + f + "? ","yes or no")
+ if (ok == "yes") {
+ codebaseDirectory = f.substring(0, f.lastIndexOf("/"));
+ fileNameOrUseSignedApplet = f.substring(f.lastIndexOf("/") + 1);
+ } else {
+ _jmolGetJarFilename(fileNameOrUseSignedApplet);
+ alert("The web page URL was ignored. Continuing using " + _jmol.archivePath + ' in directory "' + codebaseDirectory + '"');
+ }
+ } else {
+ fileNameOrUseSignedApplet = f;
+ }
+ }
+ _jmolSetCodebase(codebaseDirectory);
+ _jmolGetJarFilename(fileNameOrUseSignedApplet);
+ _jmolOnloadResetForms();
+}
+
+function jmolSetTranslation(TF) {
+ _jmol.params.doTranslate = ''+TF;
+}
+
+function _jmolGetJarFilename(fileNameOrFlag) {
+ _jmol.archivePath =
+ (typeof(fileNameOrFlag) == "string" ? fileNameOrFlag : (fileNameOrFlag ? "JmolAppletSigned" : "JmolApplet") + "0.jar");
+}
+
+function jmolSetDocument(doc) {
+ _jmol.currentDocument = doc;
+}
+
+function jmolSetAppletColor(boxbgcolor, boxfgcolor, progresscolor) {
+ _jmolInitCheck();
+ _jmol.params.boxbgcolor = boxbgcolor;
+ if (boxfgcolor)
+ _jmol.params.boxfgcolor = boxfgcolor
+ else if (boxbgcolor == "white" || boxbgcolor == "#FFFFFF")
+ _jmol.params.boxfgcolor = "black";
+ else
+ _jmol.params.boxfgcolor = "white";
+ if (progresscolor)
+ _jmol.params.progresscolor = progresscolor;
+ if (_jmol.debugAlert)
+ alert(" boxbgcolor=" + _jmol.params.boxbgcolor +
+ " boxfgcolor=" + _jmol.params.boxfgcolor +
+ " progresscolor=" + _jmol.params.progresscolor);
+}
+
+function jmolSetAppletWindow(w) {
+ _jmol.appletWindow = w;
+}
+
+function jmolApplet(size, script, nameSuffix) {
+ _jmolInitCheck();
+ return _jmolApplet(size, null, script, nameSuffix);
+}
+
+////////////////////////////////////////////////////////////////
+// Basic controls
+////////////////////////////////////////////////////////////////
+
+// undefined means it wasn't there; null means it was explicitly listed as null (so as to skip it)
+
+function jmolButton(script, label, id, title) {
+ _jmolInitCheck();
+ id != undefined && id != null || (id = "jmolButton" + _jmol.buttonCount);
+ label != undefined && label != null || (label = script.substring(0, 32));
+ ++_jmol.buttonCount;
+ var scriptIndex = _jmolAddScript(script);
+ var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='button' name='" + id + "' id='" + id +
+ "' value='" + label +
+ "' onclick='_jmolClick(this," + scriptIndex + _jmol.targetText +
+ ")' onmouseover='_jmolMouseOver(" + scriptIndex +
+ ");return true' onmouseout='_jmolMouseOut()' " +
+ _jmol.buttonCssText + " /></span>";
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+}
+
+function jmolCheckbox(scriptWhenChecked, scriptWhenUnchecked,
+ labelHtml, isChecked, id, title) {
+ _jmolInitCheck();
+ id != undefined && id != null || (id = "jmolCheckbox" + _jmol.checkboxCount);
+ ++_jmol.checkboxCount;
+ if (scriptWhenChecked == undefined || scriptWhenChecked == null ||
+ scriptWhenUnchecked == undefined || scriptWhenUnchecked == null) {
+ alert("jmolCheckbox requires two scripts");
+ return;
+ }
+ if (labelHtml == undefined || labelHtml == null) {
+ alert("jmolCheckbox requires a label");
+ return;
+ }
+ var indexChecked = _jmolAddScript(scriptWhenChecked);
+ var indexUnchecked = _jmolAddScript(scriptWhenUnchecked);
+ var eospan = "</span>"
+ var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='checkbox' name='" + id + "' id='" + id +
+ "' onclick='_jmolCbClick(this," +
+ indexChecked + "," + indexUnchecked + _jmol.targetText +
+ ")' onmouseover='_jmolCbOver(this," + indexChecked + "," +
+ indexUnchecked +
+ ");return true' onmouseout='_jmolMouseOut()' " +
+ (isChecked ? "checked='true' " : "")+ _jmol.checkboxCssText + " />"
+ if (labelHtml.toLowerCase().indexOf("<td>")>=0) {
+ t += eospan
+ eospan = "";
+ }
+ t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan;
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+}
+
+function jmolStartNewRadioGroup() {
+ ++_jmol.radioGroupCount;
+}
+
+function jmolRadioGroup(arrayOfRadioButtons, separatorHtml, groupName, id, title) {
+ /*
+
+ array: [radio1,radio2,radio3...]
+ where radioN = ["script","label",isSelected,"id","title"]
+
+ */
+
+ _jmolInitCheck();
+ var type = typeof arrayOfRadioButtons;
+ if (type != "object" || type == null || ! arrayOfRadioButtons.length) {
+ alert("invalid arrayOfRadioButtons");
+ return;
+ }
+ separatorHtml != undefined && separatorHtml != null || (separatorHtml = " ");
+ var len = arrayOfRadioButtons.length;
+ jmolStartNewRadioGroup();
+ groupName || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1));
+ var t = "<span id='"+(id ? id : groupName)+"'>";
+ for (var i = 0; i < len; ++i) {
+ if (i == len - 1)
+ separatorHtml = "";
+ var radio = arrayOfRadioButtons[i];
+ type = typeof radio;
+ if (type == "object") {
+ 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);
+ } else {
+ t += _jmolRadio(radio, null, null, separatorHtml, groupName, (id ? id : groupName)+"_"+i, title);
+ }
+ }
+ t+="</span>"
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+}
+
+
+function jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) {
+ _jmolInitCheck();
+ if (_jmol.radioGroupCount == 0)
+ ++_jmol.radioGroupCount;
+ var t = _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, (id ? id : groupName + "_" + _jmol.radioCount), title ? title : 0);
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+}
+
+function jmolLink(script, label, id, title) {
+ _jmolInitCheck();
+ id != undefined && id != null || (id = "jmolLink" + _jmol.linkCount);
+ label != undefined && label != null || (label = script.substring(0, 32));
+ ++_jmol.linkCount;
+ var scriptIndex = _jmolAddScript(script);
+ var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><a name='" + id + "' id='" + id +
+ "' href='javascript:_jmolClick(this," + scriptIndex + _jmol.targetText + ");' onmouseover='_jmolMouseOver(" + scriptIndex +
+ ");return true;' onmouseout='_jmolMouseOut()' " +
+ _jmol.linkCssText + ">" + label + "</a></span>";
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+}
+
+function jmolCommandInput(label, size, id, title) {
+ _jmolInitCheck();
+ id != undefined && id != null || (id = "jmolCmd" + _jmol.cmdCount);
+ label != undefined && label != null || (label = "Execute");
+ size != undefined && !isNaN(size) || (size = 60);
+ ++_jmol.cmdCount;
+ var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" + id + "' id='" + id +
+ "' size='"+size+"' onkeypress='_jmolCommandKeyPress(event,\""+id+"\"" + _jmol.targetText + ")'><input type=button value = '"+label+"' onclick='jmolScript(document.getElementById(\""+id+"\").value" + _jmol.targetText + ")' /></span>";
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+}
+
+function _jmolCommandKeyPress(e, id, target) {
+ var keycode = (window.event ? window.event.keyCode : e ? e.which : 0);
+ if (keycode == 13) {
+ var inputBox = document.getElementById(id)
+ _jmolScriptExecute(inputBox, inputBox.value, target)
+ }
+}
+
+function _jmolScriptExecute(element,script,target) {
+ if (typeof(script) == "object")
+ script[0](element, script, target)
+ else
+ jmolScript(script, target)
+}
+
+function jmolMenu(arrayOfMenuItems, size, id, title) {
+ _jmolInitCheck();
+ id != undefined && id != null || (id = "jmolMenu" + _jmol.menuCount);
+ ++_jmol.menuCount;
+ var type = typeof arrayOfMenuItems;
+ if (type != null && type == "object" && arrayOfMenuItems.length) {
+ var len = arrayOfMenuItems.length;
+ if (typeof size != "number" || size == 1)
+ size = null;
+ else if (size < 0)
+ size = len;
+ var sizeText = size ? " size='" + size + "' " : "";
+ var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><select name='" + id + "' id='" + id +
+ "' onChange='_jmolMenuSelected(this" + _jmol.targetText + ")'" +
+ sizeText + _jmol.menuCssText + ">";
+ for (var i = 0; i < len; ++i) {
+ var menuItem = arrayOfMenuItems[i];
+ type = typeof menuItem;
+ var script, text;
+ var isSelected = undefined;
+ if (type == "object" && menuItem != null) {
+ script = menuItem[0];
+ text = menuItem[1];
+ isSelected = menuItem[2];
+ } else {
+ script = text = menuItem;
+ }
+ text != undefined && text != null || (text = script);
+ if (script=="#optgroup") {
+ t += "<optgroup label='" + text + "'>";
+ } else if (script=="#optgroupEnd") {
+ t += "</optgroup>";
+ } else {
+ var scriptIndex = _jmolAddScript(script);
+ var selectedText = isSelected ? "' selected='true'>" : "'>";
+ t += "<option value='" + scriptIndex + selectedText + text + "</option>";
+ }
+ }
+ t += "</select></span>";
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+ }
+}
+
+function jmolHtml(html) {
+ return _jmolDocumentWrite(html);
+}
+
+function jmolBr() {
+ return _jmolDocumentWrite("<br />");
+}
+
+////////////////////////////////////////////////////////////////
+// advanced scripting functions
+////////////////////////////////////////////////////////////////
+
+function jmolDebugAlert(enableAlerts) {
+ _jmol.debugAlert = (enableAlerts == undefined || enableAlerts)
+}
+
+function jmolAppletInline(size, inlineModel, script, nameSuffix) {
+ _jmolInitCheck();
+ return _jmolApplet(size, _jmolSterilizeInline(inlineModel),
+ script, nameSuffix);
+}
+
+function jmolSetTarget(targetSuffix) {
+ _jmol.targetSuffix = targetSuffix;
+ _jmol.targetText = targetSuffix ? ",\"" + targetSuffix + "\"" : ",0";
+}
+
+function jmolScript(script, targetSuffix) {
+ if (script) {
+ _jmolCheckBrowser();
+ if (targetSuffix == "all") {
+ with (_jmol) {
+ for (var i = 0; i < appletSuffixes.length; ++i) {
+ var applet = _jmolGetApplet(appletSuffixes[i]);
+ if (applet) applet.script(script);
+ }
+ }
+ } else {
+ var applet=_jmolGetApplet(targetSuffix);
+ if (applet) applet.script(script);
+ }
+ }
+}
+
+function jmolLoadInline(model, targetSuffix) {
+ if (!model)return "ERROR: NO MODEL"
+ var applet=_jmolGetApplet(targetSuffix);
+ if (!applet)return "ERROR: NO APPLET"
+ if (typeof(model) == "string")
+ return applet.loadInlineString(model, "", false);
+ else
+ return applet.loadInlineArray(model, "", false);
+}
+
+
+function jmolLoadInlineScript(model, script, targetSuffix) {
+ if (!model)return "ERROR: NO MODEL"
+ var applet=_jmolGetApplet(targetSuffix);
+ if (!applet)return "ERROR: NO APPLET"
+ return applet.loadInlineString(model, script, false);
+}
+
+
+function jmolLoadInlineArray(ModelArray, script, targetSuffix) {
+ if (!model)return "ERROR: NO MODEL"
+ script || (script="")
+ var applet=_jmolGetApplet(targetSuffix);
+ if (!applet)return "ERROR: NO APPLET"
+ try {
+ return applet.loadInlineArray(ModelArray, script, false);
+ } catch (err) {
+ //IE 7 bug
+ return applet.loadInlineString(ModelArray.join("\n"), script, false);
+ }
+}
+
+function jmolAppendInlineArray(ModelArray, script, targetSuffix) {
+ if (!model)return "ERROR: NO MODEL"
+ script || (script="")
+ var applet=_jmolGetApplet(targetSuffix);
+ if (!applet)return "ERROR: NO APPLET"
+ try {
+ return applet.loadInlineArray(ModelArray, script, true);
+ } catch (err) {
+ //IE 7 bug
+ return applet.loadInlineString(ModelArray.join("\n"), script, true);
+ }
+}
+
+function jmolAppendInlineScript(model, script, targetSuffix) {
+ if (!model)return "ERROR: NO MODEL"
+ var applet=_jmolGetApplet(targetSuffix);
+ if (!applet)return "ERROR: NO APPLET"
+ return applet.loadInlineString(model, script, true);
+}
+
+function jmolCheckBrowser(action, urlOrMessage, nowOrLater) {
+ if (typeof action == "string") {
+ action = action.toLowerCase();
+ action == "alert" || action == "redirect" || action == "popup" || (action = null);
+ }
+ if (typeof action != "string")
+ alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +
+ "action must be 'alert', 'redirect', or 'popup'");
+ else {
+ if (typeof urlOrMessage != "string")
+ alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +
+ "urlOrMessage must be a string");
+ else {
+ _jmol.checkBrowserAction = action;
+ _jmol.checkBrowserUrlOrMessage = urlOrMessage;
+ }
+ }
+ if (typeof nowOrLater == "string" && nowOrLater.toLowerCase() == "now")
+ _jmolCheckBrowser();
+}
+
+////////////////////////////////////////////////////////////////
+// Cascading Style Sheet Class support
+////////////////////////////////////////////////////////////////
+
+function jmolSetAppletCssClass(appletCssClass) {
+ if (_jmol.hasGetElementById) {
+ _jmol.appletCssClass = appletCssClass;
+ _jmol.appletCssText = appletCssClass ? "class='" + appletCssClass + "' " : "";
+ }
+}
+
+function jmolSetButtonCssClass(buttonCssClass) {
+ if (_jmol.hasGetElementById) {
+ _jmol.buttonCssClass = buttonCssClass;
+ _jmol.buttonCssText = buttonCssClass ? "class='" + buttonCssClass + "' " : "";
+ }
+}
+
+function jmolSetCheckboxCssClass(checkboxCssClass) {
+ if (_jmol.hasGetElementById) {
+ _jmol.checkboxCssClass = checkboxCssClass;
+ _jmol.checkboxCssText = checkboxCssClass ? "class='" + checkboxCssClass + "' " : "";
+ }
+}
+
+function jmolSetRadioCssClass(radioCssClass) {
+ if (_jmol.hasGetElementById) {
+ _jmol.radioCssClass = radioCssClass;
+ _jmol.radioCssText = radioCssClass ? "class='" + radioCssClass + "' " : "";
+ }
+}
+
+function jmolSetLinkCssClass(linkCssClass) {
+ if (_jmol.hasGetElementById) {
+ _jmol.linkCssClass = linkCssClass;
+ _jmol.linkCssText = linkCssClass ? "class='" + linkCssClass + "' " : "";
+ }
+}
+
+function jmolSetMenuCssClass(menuCssClass) {
+ if (_jmol.hasGetElementById) {
+ _jmol.menuCssClass = menuCssClass;
+ _jmol.menuCssText = menuCssClass ? "class='" + menuCssClass + "' " : "";
+ }
+}
+
+////////////////////////////////////////////////////////////////
+// functions for INTERNAL USE ONLY which are subject to change
+// use at your own risk ... you have been WARNED!
+////////////////////////////////////////////////////////////////
+var _jmol = {
+ currentDocument: document,
+
+ debugAlert: false,
+
+ codebase: "",
+ modelbase: ".",
+
+ appletCount: 0,
+ appletSuffixes: [],
+ appletWindow: null,
+ allowedJmolSize: [25, 2048, 300], // min, max, default (pixels)
+ /* By setting the _jmol.allowedJmolSize[] variable in the webpage
+ before calling jmolApplet(), limits for applet size can be overriden.
+ 2048 standard for GeoWall (http://geowall.geo.lsa.umich.edu/home.html)
+ */
+ buttonCount: 0,
+ checkboxCount: 0,
+ linkCount: 0,
+ cmdCount: 0,
+ menuCount: 0,
+ radioCount: 0,
+ radioGroupCount: 0,
+
+ appletCssClass: null,
+ appletCssText: "",
+ buttonCssClass: null,
+ buttonCssText: "",
+ checkboxCssClass: null,
+ checkboxCssText: "",
+ java_arguments: "-Xmx512m",
+ radioCssClass: null,
+ radioCssText: "",
+ linkCssClass: null,
+ linkCssText: "",
+ menuCssClass: null,
+ menuCssText: "",
+
+ targetSuffix: 0,
+ targetText: ",0",
+ scripts: [""],
+ params: {
+ syncId: ("" + Math.random()).substring(3),
+ progressbar: "true",
+ progresscolor: "blue",
+ boxbgcolor: "black",
+ boxfgcolor: "white",
+ boxmessage: "Downloading JmolApplet ..."
+ },
+ ua: navigator.userAgent.toLowerCase(),
+ // uaVersion: parseFloat(navigator.appVersion), // not used
+
+ os: "unknown",
+ browser: "unknown",
+ browserVersion: 0,
+ hasGetElementById: !!document.getElementById,
+ isJavaEnabled: navigator.javaEnabled(),
+ // isNetscape47Win: false, // not used, N4.7 is no longer supported even for detection
+ useIEObject: false,
+ useHtml4Object: false,
+
+ windowsClassId: "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93",
+ windowsCabUrl:
+ "http://java.sun.com/update/1.6.0/jinstall-6u22-windows-i586.cab",
+
+ isBrowserCompliant: false,
+ isJavaCompliant: false,
+ isFullyCompliant: false,
+
+ initialized: false,
+ initChecked: false,
+
+ browserChecked: false,
+ checkBrowserAction: "alert",
+ checkBrowserUrlOrMessage: null,
+
+ archivePath: null, // JmolApplet0.jar OR JmolAppletSigned0.jar
+
+ previousOnloadHandler: null,
+
+ jmoljar: null,
+ useNoApplet: false,
+
+ ready: {}
+}
+
+with (_jmol) {
+ function _jmolTestUA(candidate) {
+ var ua = _jmol.ua;
+ var index = ua.indexOf(candidate);
+ if (index < 0)
+ return false;
+ _jmol.browser = candidate;
+ _jmol.browserVersion = parseFloat(ua.substring(index+candidate.length+1));
+ return true;
+ }
+
+ function _jmolTestOS(candidate) {
+ if (_jmol.ua.indexOf(candidate) < 0)
+ return false;
+ _jmol.os = candidate;
+ return true;
+ }
+
+ _jmolTestUA("konqueror") ||
+ _jmolTestUA("webkit") ||
+ _jmolTestUA("omniweb") ||
+ _jmolTestUA("opera") ||
+ _jmolTestUA("webtv") ||
+ _jmolTestUA("icab") ||
+ _jmolTestUA("msie") ||
+ (_jmol.ua.indexOf("compatible") < 0 && _jmolTestUA("mozilla")); //Netscape, Mozilla, Seamonkey, Firefox and anything assimilated
+
+ _jmolTestOS("linux") ||
+ _jmolTestOS("unix") ||
+ _jmolTestOS("mac") ||
+ _jmolTestOS("win");
+
+ /* not used:
+ isNetscape47Win = (os == "win" && browser == "mozilla" &&
+ browserVersion >= 4.78 && browserVersion <= 4.8);
+ */
+
+ if (os == "win") {
+ isBrowserCompliant = hasGetElementById;
+ } else if (os == "mac") { // mac is the problem child :-(
+ if (browser == "mozilla" && browserVersion >= 5) {
+ // miguel 2004 11 17
+ // checking the plugins array does not work because
+ // Netscape 7.2 OS X still has Java 1.3.1 listed even though
+ // javaplugin.sf.net is installed to upgrade to 1.4.2
+ eval("try {var v = java.lang.System.getProperty('java.version');" +
+ " _jmol.isBrowserCompliant = v >= '1.4.2';" +
+ " } catch (e) { }");
+ } else if (browser == "opera" && browserVersion <= 7.54) {
+ isBrowserCompliant = false;
+ } else {
+ isBrowserCompliant = hasGetElementById &&
+ !((browser == "msie") ||
+ (browser == "webkit" && browserVersion < 125.12));
+ }
+ } else if (os == "linux" || os == "unix") {
+ if (browser == "konqueror" && browserVersion <= 3.3)
+ isBrowserCompliant = false;
+ else
+ isBrowserCompliant = hasGetElementById;
+ } else { // other OS
+ isBrowserCompliant = hasGetElementById;
+ }
+
+ // possibly more checks in the future for this
+ isJavaCompliant = isJavaEnabled;
+
+ isFullyCompliant = isBrowserCompliant && isJavaCompliant;
+
+ useIEObject = (os == "win" && browser == "msie" && browserVersion >= 5.5);
+ useHtml4Object =
+ (browser == "mozilla" && browserVersion >= 5) ||
+ (browser == "opera" && browserVersion >= 8) ||
+ (browser == "webkit" && browserVersion >= 412.2);
+ try {
+ if (top.location.search.indexOf("JMOLJAR=")>=0)
+ jmoljar = top.location.search.split("JMOLJAR=")[1].split("&")[0];
+ } catch(e) {
+ // can't access top.location
+ }
+ try {
+ useNoApplet = (top.location.search.indexOf("NOAPPLET")>=0);
+ } catch(e) {
+ // can't access top.document
+ }
+}
+
+function jmolSetMemoryMb(nMb) {
+ _jmol.java_arguments = "-Xmx" + Math.round(nMb) + "m"
+}
+
+function jmolSetParameter(name,value) {
+ _jmol.params[name] = value
+}
+
+function jmolSetCallback(callbackName,funcName) {
+ _jmol.params[callbackName] = funcName
+}
+
+ try {
+// note this is done FIRST, so it cannot override a setting done by the developer
+ if (top.location.search.indexOf("PARAMS=")>=0) {
+ var pars = unescape(top.location.search.split("PARAMS=")[1].split("&")[0]).split(";");
+ for (var i = 0; i < pars.length; i++) {
+ var p = pars[i].split(":");
+ jmolSetParameter(p[0],p[1]);
+ }
+ }
+ } catch(e) {
+ // can't access top.location
+ }
+
+function jmolSetSyncId(n) {
+ return _jmol.params["syncId"] = n
+}
+
+function jmolGetSyncId() {
+ return _jmol.params["syncId"]
+}
+
+function jmolSetLogLevel(n) {
+ _jmol.params.logLevel = ''+n;
+}
+
+ /* AngelH, mar2007:
+ By (re)setting these variables in the webpage before calling jmolApplet(),
+ a custom message can be provided (e.g. localized for user's language) when no Java is installed.
+ */
+if (noJavaMsg==undefined) var noJavaMsg =
+ "You do not have Java applets enabled in your web browser, or your browser is blocking this applet.<br />\n" +
+ "Check the warning message from your browser and/or enable Java applets in<br />\n" +
+ "your web browser preferences, or install the Java Runtime Environment from <a href='http://www.java.com'>www.java.com</a><br />";
+if (noJavaMsg2==undefined) var noJavaMsg2 =
+ "You do not have the<br />\n" +
+ "Java Runtime Environment<br />\n" +
+ "installed for applet support.<br />\n" +
+ "Visit <a href='http://www.java.com'>www.java.com</a>";
+function _jmolApplet(size, inlineModel, script, nameSuffix) {
+ /* AngelH, mar2007
+ Fixed percent / pixel business, to avoid browser errors:
+ put "px" where needed, avoid where not.
+
+ Bob Hanson, 1/2010
+ Fixed inline escape changing returns to |
+ */
+ with (_jmol) {
+ nameSuffix == undefined && (nameSuffix = appletCount);
+ appletSuffixes.push(nameSuffix);
+ ++appletCount;
+ script || (script = "select *");
+ var sz = _jmolGetAppletSize(size);
+ var widthAndHeight = " width='" + sz[0] + "' height='" + sz[1] + "' ";
+ var tHeader, tFooter;
+ codebase || jmolInitialize(".");
+ if (useIEObject || useHtml4Object) {
+ params.archive = archivePath;
+ params.mayscript = 'true';
+ params.codebase = codebase;
+ params.code = 'JmolApplet';
+ tHeader =
+ "<object name='jmolApplet" + nameSuffix +
+ "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" +
+ widthAndHeight + "\n";
+ tFooter = "</object>";
+ }
+ if (java_arguments)
+ params.java_arguments = java_arguments;
+ if (useIEObject) { // use MSFT IE6 object tag with .cab file reference
+ tHeader += " classid='" + windowsClassId + "'\n" +
+ (windowsCabUrl ? " codebase='" + windowsCabUrl + "'\n" : "") + ">\n";
+ } else if (useHtml4Object) { // use HTML4 object tag
+ tHeader += " type='application/x-java-applet'\n>\n";
+ /* " classid='java:JmolApplet'\n" + AH removed this
+ Chromium Issue 62076: Java Applets using an <object> with a classid paramater don't load.
+ http://code.google.com/p/chromium/issues/detail?id=62076
+ They say this is the correct behavior according to the spec, and there's no indication at this point
+ that WebKit will be changing the handling, so eventually Safari will acquire this behavior too.
+ Removing the classid parameter seems to be well tolerated by all browsers (even IE!).
+ */
+ } else { // use applet tag
+ tHeader =
+ "<applet name='jmolApplet" + nameSuffix +
+ "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" +
+ widthAndHeight + "\n" +
+ " code='JmolApplet'" +
+ " archive='" + archivePath + "' codebase='" + codebase + "'\n" +
+ " mayscript='true'>\n";
+ tFooter = "</applet>";
+ }
+ var visitJava;
+ if (useIEObject || useHtml4Object) {
+ var szX = "width:" + sz[0]
+ if ( szX.indexOf("%")==-1 ) szX+="px"
+ var szY = "height:" + sz[1]
+ if ( szY.indexOf("%")==-1 ) szY+="px"
+ visitJava =
+ "<p style='background-color:yellow; color:black; " +
+ szX + ";" + szY + ";" +
+ // why doesn't this vertical-align work?
+ "text-align:center;vertical-align:middle;'>\n" +
+ noJavaMsg +
+ "</p>";
+ } else {
+ visitJava =
+ "<table bgcolor='yellow'><tr>" +
+ "<td align='center' valign='middle' " + widthAndHeight + "><font color='black'>\n" +
+ noJavaMsg2 +
+ "</font></td></tr></table>";
+ }
+ params.loadInline = (inlineModel ? inlineModel : "");
+ params.script = (script ? _jmolSterilizeScript(script) : "");
+ var t = tHeader + _jmolParams() + visitJava + tFooter;
+ jmolSetTarget(nameSuffix);
+ ready["jmolApplet" + nameSuffix] = false;
+ if (_jmol.debugAlert)
+ alert(t);
+ return _jmolDocumentWrite(t);
+ }
+}
+
+function _jmolParams() {
+ var t = "";
+ for (var i in _jmol.params)
+ if(_jmol.params[i]!="")
+ t+=" <param name='"+i+"' value='"+_jmol.params[i]+"' />\n";
+ return t
+}
+
+function _jmolInitCheck() {
+ if (_jmol.initChecked)
+ return;
+ _jmol.initChecked = true;
+ jmolInitialize(defaultdir, defaultjar)
+}
+
+function _jmolCheckBrowser() {
+ with (_jmol) {
+ if (browserChecked)
+ return;
+ browserChecked = true;
+
+ if (isFullyCompliant)
+ return true;
+
+ if (checkBrowserAction == "redirect")
+ location.href = checkBrowserUrlOrMessage;
+ else if (checkBrowserAction == "popup")
+ _jmolPopup(checkBrowserUrlOrMessage);
+ else {
+ var msg = checkBrowserUrlOrMessage;
+ if (msg == null)
+ msg = "Your web browser is not fully compatible with Jmol\n\n" +
+ "browser: " + browser +
+ " version: " + browserVersion +
+ " os: " + os +
+ " isBrowserCompliant: " + isBrowserCompliant +
+ " isJavaCompliant: " + isJavaCompliant +
+ "\n\n" + ua;
+ alert(msg);
+ }
+ }
+ return false;
+}
+
+function jmolSetXHTML(id) {
+ _jmol.isXHTML = true
+ _jmol.XhtmlElement = null
+ _jmol.XhtmlAppendChild = false
+ if (id){
+ _jmol.XhtmlElement = document.getElementById(id)
+ _jmol.XhtmlAppendChild = true
+ }
+}
+
+function _jmolDocumentWrite(text) {
+ if (_jmol.currentDocument) {
+ if (_jmol.isXHTML && !_jmol.XhtmlElement) {
+ var s = document.getElementsByTagName("script")
+ _jmol.XhtmlElement = s.item(s.length - 1)
+ _jmol.XhtmlAppendChild = false
+ }
+ if (_jmol.XhtmlElement) {
+ _jmolDomDocumentWrite(text)
+ } else {
+ _jmol.currentDocument.write(text);
+ }
+ }
+ return text;
+}
+
+function _jmolDomDocumentWrite(data) {
+ var pt = 0
+ var Ptr = []
+ Ptr[0] = 0
+ while (Ptr[0] < data.length) {
+ var child = _jmolGetDomElement(data, Ptr)
+ if (!child)break
+ if (_jmol.XhtmlAppendChild)
+ _jmol.XhtmlElement.appendChild(child)
+ else
+ _jmol.XhtmlElement.parentNode.insertBefore(child, _jmol.XhtmlElement);
+ }
+}
+function _jmolGetDomElement(data, Ptr, closetag, lvel) {
+ var e = document.createElement("span")
+ e.innerHTML = data
+ Ptr[0] = data.length
+ return e
+
+//unnecessary?
+
+ closetag || (closetag = "")
+ lvel || (lvel = 0)
+ var pt0 = Ptr[0]
+ var pt = pt0
+ while (pt < data.length && data.charAt(pt) != "<") pt++
+ if (pt != pt0) {
+ var text = data.substring(pt0, pt)
+ Ptr[0] = pt
+ return document.createTextNode(text)
+ }
+ pt0 = ++pt
+ var ch
+ while (pt < data.length && "\n\r\t >".indexOf(ch = data.charAt(pt)) < 0) pt++
+ var tagname = data.substring(pt0, pt)
+ var e = (tagname == closetag || tagname == "/" ? ""
+ : document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', tagname)
+ : document.createElement(tagname));
+ if (ch == ">") {
+ Ptr[0] = ++pt
+ return e
+ }
+ while (pt < data.length && (ch = data.charAt(pt)) != ">") {
+ while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++
+ pt0 = pt
+ while (pt < data.length && "\n\r\t =/>".indexOf(ch = data.charAt(pt)) < 0) pt++
+ var attrname = data.substring(pt0, pt).toLowerCase()
+ if (attrname && ch != "=")
+ e.setAttribute(attrname, "true")
+ while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++
+ if (ch == "/") {
+ Ptr[0] = pt + 2
+ return e
+ } else if (ch == "=") {
+ var quote = data.charAt(++pt)
+ pt0 = ++pt
+ while (pt < data.length && (ch = data.charAt(pt)) != quote) pt++
+ var attrvalue = data.substring(pt0, pt)
+ e.setAttribute(attrname, attrvalue)
+ pt++
+ }
+ }
+ Ptr[0] = ++pt
+ while (Ptr[0] < data.length) {
+ var child = _jmolGetDomElement(data, Ptr, "/" + tagname, lvel+1)
+ if (!child)break
+ e.appendChild(child)
+ }
+ return e
+}
+
+function _jmolPopup(url) {
+ var popup = window.open(url, "JmolPopup",
+ "left=150,top=150,height=400,width=600," +
+ "directories=yes,location=yes,menubar=yes," +
+ "toolbar=yes," +
+ "resizable=yes,scrollbars=yes,status=yes");
+ if (popup.focus)
+ poup.focus();
+}
+
+function _jmolReadyCallback(name) {
+ if (_jmol.debugAlert)
+ alert(name + " is ready");
+ _jmol.ready["" + name] = true;
+}
+
+function _jmolSterilizeScript(script) {
+ script = script.replace(/'/g, "'");
+ if (_jmol.debugAlert)
+ alert("script:\n" + script);
+ return script;
+}
+
+function _jmolSterilizeInline(model) {
+ model = model.replace(/\r|\n|\r\n/g, (model.indexOf("|") >= 0 ? "\\/n" : "|")).replace(/'/g, "'");
+ if (_jmol.debugAlert)
+ alert("inline model:\n" + model);
+ return model;
+}
+
+function _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) {
+ ++_jmol.radioCount;
+ groupName != undefined && groupName != null || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1));
+ if (!script)
+ return "";
+ labelHtml != undefined && labelHtml != null || (labelHtml = script.substring(0, 32));
+ separatorHtml || (separatorHtml = "")
+ var scriptIndex = _jmolAddScript(script);
+ var eospan = "</span>"
+ var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='"
+ + groupName + "' id='"+id+"' type='radio' onclick='_jmolClick(this," +
+ scriptIndex + _jmol.targetText + ");return true;' onmouseover='_jmolMouseOver(" +
+ scriptIndex + ");return true;' onmouseout='_jmolMouseOut()' " +
+ (isChecked ? "checked='true' " : "") + _jmol.radioCssText + " />"
+ if (labelHtml.toLowerCase().indexOf("<td>")>=0) {
+ t += eospan
+ eospan = "";
+ }
+ t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan + separatorHtml;
+
+ return t;
+}
+
+function _jmolFindApplet(target) {
+ // first look for the target in the current window
+ var applet = _jmolFindAppletInWindow(_jmol.appletWindow != null ? _jmol.appletWindow : window, target);
+ // THEN look for the target in child frames
+ if (applet == undefined)
+ applet = _jmolSearchFrames(window, target);
+ // FINALLY look for the target in sibling frames
+ if (applet == undefined)
+ applet = _jmolSearchFrames(top, target); // look starting in top frame
+ return applet;
+}
+
+function _jmolGetApplet(targetSuffix){
+ var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0");
+ var applet = _jmolFindApplet(target);
+ if (applet) return applet
+ _jmol.alerted || alert("could not find applet " + target);
+ _jmol.alerted = true;
+ return null
+}
+
+function _jmolSearchFrames(win, target) {
+ var applet;
+ var frames = win.frames;
+ if (frames && frames.length) { // look in all the frames below this window
+ try{
+ for (var i = 0; i < frames.length; ++i) {
+ applet = _jmolSearchFrames(frames[i], target);
+ if (applet)
+ return applet;
+ }
+ }catch(e) {
+ if (_jmol.debugAlert)
+ alert("Jmol.js _jmolSearchFrames cannot access " + win.name + ".frame[" + i + "] consider using jmolSetAppletWindow()")
+ }
+ }
+ return applet = _jmolFindAppletInWindow(win, target)
+}
+
+function _jmolFindAppletInWindow(win, target) {
+ var doc = win.document;
+ if (doc.getElementById(target))
+ return doc.getElementById(target);
+ else if (doc.applets)
+ return doc.applets[target];
+ else
+ return doc[target];
+}
+
+function _jmolAddScript(script) {
+ if (!script)
+ return 0;
+ var index = _jmol.scripts.length;
+ _jmol.scripts[index] = script;
+ return index;
+}
+
+function _jmolClick(elementClicked, scriptIndex, targetSuffix) {
+ _jmol.element = elementClicked;
+ _jmolScriptExecute(elementClicked, _jmol.scripts[scriptIndex], targetSuffix);
+}
+
+function _jmolMenuSelected(menuObject, targetSuffix) {
+ var scriptIndex = menuObject.value;
+ if (scriptIndex != undefined) {
+ _jmolScriptExecute(menuObject, _jmol.scripts[scriptIndex], targetSuffix);
+ return;
+ }
+ var len = menuObject.length;
+ if (typeof len == "number") {
+ for (var i = 0; i < len; ++i) {
+ if (menuObject[i].selected) {
+ _jmolClick(menuObject[i], menuObject[i].value, targetSuffix);
+ return;
+ }
+ }
+ }
+ alert("?Que? menu selected bug #8734");
+}
+
+
+_jmol.checkboxMasters = {};
+_jmol.checkboxItems = {};
+
+function jmolSetCheckboxGroup(chkMaster,chkBox) {
+ var id = chkMaster;
+ if(typeof(id)=="number")id = "jmolCheckbox" + id;
+ chkMaster = document.getElementById(id);
+ if (!chkMaster)alert("jmolSetCheckboxGroup: master checkbox not found: " + id);
+ var m = _jmol.checkboxMasters[id] = {};
+ m.chkMaster = chkMaster;
+ m.chkGroup = {};
+ for (var i = 1; i < arguments.length; i++){
+ var id = arguments[i];
+ if(typeof(id)=="number")id = "jmolCheckbox" + id;
+ checkboxItem = document.getElementById(id);
+ if (!checkboxItem)alert("jmolSetCheckboxGroup: group checkbox not found: " + id);
+ m.chkGroup[id] = checkboxItem;
+ _jmol.checkboxItems[id] = m;
+ }
+}
+
+function _jmolNotifyMaster(m){
+ //called when a group item is checked
+ var allOn = true;
+ var allOff = true;
+ for (var chkBox in m.chkGroup){
+ if(m.chkGroup[chkBox].checked)
+ allOff = false;
+ else
+ allOn = false;
+ }
+ if (allOn)m.chkMaster.checked = true;
+ if (allOff)m.chkMaster.checked = false;
+ if ((allOn || allOff) && _jmol.checkboxItems[m.chkMaster.id])
+ _jmolNotifyMaster(_jmol.checkboxItems[m.chkMaster.id])
+}
+
+function _jmolNotifyGroup(m, isOn){
+ //called when a master item is checked
+ for (var chkBox in m.chkGroup){
+ var item = m.chkGroup[chkBox]
+ item.checked = isOn;
+ if (_jmol.checkboxMasters[item.id])
+ _jmolNotifyGroup(_jmol.checkboxMasters[item.id], isOn)
+ }
+}
+
+function _jmolCbClick(ckbox, whenChecked, whenUnchecked, targetSuffix) {
+ _jmol.control = ckbox
+ _jmolClick(ckbox, ckbox.checked ? whenChecked : whenUnchecked, targetSuffix);
+ if(_jmol.checkboxMasters[ckbox.id])
+ _jmolNotifyGroup(_jmol.checkboxMasters[ckbox.id], ckbox.checked)
+ if(_jmol.checkboxItems[ckbox.id])
+ _jmolNotifyMaster(_jmol.checkboxItems[ckbox.id])
+}
+
+function _jmolCbOver(ckbox, whenChecked, whenUnchecked) {
+ window.status = _jmol.scripts[ckbox.checked ? whenUnchecked : whenChecked];
+}
+
+function _jmolMouseOver(scriptIndex) {
+ window.status = _jmol.scripts[scriptIndex];
+}
+
+function _jmolMouseOut() {
+ window.status = " ";
+ return true;
+}
+
+function _jmolSetCodebase(codebase) {
+ _jmol.codebase = codebase ? codebase : ".";
+ if (_jmol.debugAlert)
+ alert("jmolCodebase=" + _jmol.codebase);
+}
+
+function _jmolOnloadResetForms() {
+ // must be evaluated ONLY once
+ _jmol.previousOnloadHandler = window.onload;
+ window.onload =
+ function() {
+ with (_jmol) {
+ if (buttonCount+checkboxCount+menuCount+radioCount+radioGroupCount > 0) {
+ var forms = document.forms;
+ for (var i = forms.length; --i >= 0; )
+ forms[i].reset();
+ }
+ if (previousOnloadHandler)
+ previousOnloadHandler();
+ }
+ }
+}
+
+////////////////////////////////////
+/////extensions for getProperty/////
+////////////////////////////////////
+
+
+function _jmolEvalJSON(s,key){
+ s=s+""
+ if(!s)return []
+ if(s.charAt(0)!="{"){
+ if(s.indexOf(" | ")>=0)s=s.replace(/\ \|\ /g, "\n")
+ return s
+ }
+ var A = eval("("+s+")")
+ if(!A)return
+ if(key && A[key])A=A[key]
+ return A
+}
+
+function _jmolEnumerateObject(A,key){
+ var sout=""
+ if(typeof(A) == "string" && A!="null"){
+ sout+="\n"+key+"=\""+A+"\""
+ }else if(!isNaN(A)||A==null){
+ sout+="\n"+key+"="+(A+""==""?"null":A)
+ }else if(A.length){
+ sout+=key+"=[]"
+ for(var i=0;i<A.length;i++){
+ sout+="\n"
+ if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){
+ sout+=_jmolEnumerateObject(A[i],key+"["+i+"]")
+ }else{
+ sout+=key+"["+i+"]="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i])
+ }
+ }
+ }else{
+ if(key != ""){
+ sout+=key+"={}"
+ key+="."
+ }
+
+ for(var i in A){
+ sout+="\n"
+ if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){
+ sout+=_jmolEnumerateObject(A[i],key+i)
+ }else{
+ sout+=key+i+"="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i])
+ }
+ }
+ }
+ return sout
+}
+
+
+function _jmolSortKey0(a,b){
+ return (a[0]<b[0]?1:a[0]>b[0]?-1:0)
+}
+
+function _jmolSortMessages(A){
+ if(!A || typeof(A)!="object")return []
+ var B = []
+ for(var i=A.length-1;i>=0;i--)for(var j=0;j<A[i].length;j++)B[B.length]=A[i][j]
+ if(B.length == 0) return
+ B=B.sort(_jmolSortKey0)
+ return B
+}
+
+/////////additional extensions //////////
+
+
+function _jmolDomScriptLoad(URL){
+ //open(URL) //to debug
+ _jmol.servercall=URL
+ var node = document.getElementById("_jmolScriptNode")
+ if (node && _jmol.browser!="msie"){
+ document.getElementsByTagName("HEAD")[0].removeChild(node)
+ node=null
+ }
+ if (node) {
+ node.setAttribute("src",URL)
+ } else {
+ node=document.createElement("script")
+ node.setAttribute("id","_jmolScriptNode")
+ node.setAttribute("type","text/javascript")
+ node.setAttribute("src",URL)
+ document.getElementsByTagName("HEAD")[0].appendChild(node)
+ }
+}
+
+
+function _jmolExtractPostData(url){
+ S=url.split("&POST:")
+ var s=""
+ for(var i=1;i<S.length;i++){
+ KV=S[i].split("=")
+ s+="&POSTKEY"+i+"="+KV[0]
+ s+="&POSTVALUE"+i+"="+KV[1]
+ }
+ return "&url="+escape(S[0])+s
+}
+
+function _jmolLoadModel(targetSuffix,remoteURL,array,isError,errorMessage){
+ //called by server, but in client
+ //overload this function to customize return
+ _jmol.remoteURL=remoteURL
+ isError && alert(errorMessage)
+ jmolLoadInlineScript(array.join("\n"),_jmol.optionalscript,targetSuffix)
+}
+
+//////////user property/status functions/////////
+
+function jmolGetStatus(strStatus,targetSuffix){
+ return _jmolSortMessages(jmolGetPropertyAsArray("jmolStatus",strStatus,targetSuffix))
+}
+
+function jmolGetPropertyAsArray(sKey,sValue,targetSuffix) {
+ return _jmolEvalJSON(jmolGetPropertyAsJSON(sKey,sValue,targetSuffix),sKey)
+}
+
+function jmolGetPropertyAsString(sKey,sValue,targetSuffix) {
+ var applet = _jmolGetApplet(targetSuffix);
+ sValue == undefined && (sValue="");
+ return (applet ? applet.getPropertyAsString(sKey,sValue) + "" : "")
+}
+
+function jmolGetPropertyAsJSON(sKey,sValue,targetSuffix) {
+ sValue == undefined && (sValue = "")
+ var applet = _jmolGetApplet(targetSuffix);
+ try {
+ return (applet ? applet.getPropertyAsJSON(sKey,sValue) + "" : "")
+ } catch(e) {
+ return ""
+ }
+}
+
+function jmolGetPropertyAsJavaObject(sKey,sValue,targetSuffix) {
+ sValue == undefined && (sValue = "")
+ var applet = _jmolGetApplet(targetSuffix);
+ return (applet ? applet.getProperty(sKey,sValue) : null)
+}
+
+
+function jmolDecodeJSON(s) {
+ return _jmolEnumerateObject(_jmolEvalJSON(s),"")
+}
+
+
+///////// synchronous scripting ////////
+
+function jmolScriptWait(script, targetSuffix) {
+ targetSuffix == undefined && (targetSuffix="0")
+ var Ret=jmolScriptWaitAsArray(script, targetSuffix)
+ var s = ""
+ for(var i=Ret.length;--i>=0;)
+ for(var j=0;j< Ret[i].length;j++)
+ s+=Ret[i][j]+"\n"
+ return s
+}
+
+function jmolScriptWaitOutput(script, targetSuffix) {
+ targetSuffix == undefined && (targetSuffix="0")
+ var ret = ""
+ try{
+ if (script) {
+ _jmolCheckBrowser();
+ var applet=_jmolGetApplet(targetSuffix);
+ if (applet) ret += applet.scriptWaitOutput(script);
+ }
+ }catch(e){
+ }
+ return ret;
+}
+
+function jmolEvaluate(molecularMath, targetSuffix) {
+
+ //carries out molecular math on a model
+
+ targetSuffix == undefined && (targetSuffix="0")
+ var result = "" + jmolGetPropertyAsJavaObject("evaluate", molecularMath, targetSuffix);
+ var s = result.replace(/\-*\d+/,"")
+ if (s == "" && !isNaN(parseInt(result)))return parseInt(result);
+ var s = result.replace(/\-*\d*\.\d*/,"")
+ if (s == "" && !isNaN(parseFloat(result)))return parseFloat(result);
+ return result;
+}
+
+function jmolScriptEcho(script, targetSuffix) {
+ // returns a newline-separated list of all echos from a script
+ targetSuffix == undefined && (targetSuffix="0")
+ var Ret=jmolScriptWaitAsArray(script, targetSuffix)
+ var s = ""
+ for(var i=Ret.length;--i>=0;)
+ for(var j=Ret[i].length;--j>=0;)
+ if (Ret[i][j][1] == "scriptEcho")s+=Ret[i][j][3]+"\n"
+ return s.replace(/ \| /g, "\n")
+}
+
+
+function jmolScriptMessage(script, targetSuffix) {
+ // returns a newline-separated list of all messages from a script, ending with "script completed\n"
+ targetSuffix == undefined && (targetSuffix="0")
+ var Ret=jmolScriptWaitAsArray(script, targetSuffix)
+ var s = ""
+ for(var i=Ret.length;--i>=0;)
+ for(var j=Ret[i].length;--j>=0;)
+ if (Ret[i][j][1] == "scriptStatus")s+=Ret[i][j][3]+"\n"
+ return s.replace(/ \| /g, "\n")
+}
+
+
+function jmolScriptWaitAsArray(script, targetSuffix) {
+ var ret = ""
+ try{
+ jmolGetStatus("scriptEcho,scriptMessage,scriptStatus,scriptError",targetSuffix)
+ if (script) {
+ _jmolCheckBrowser();
+ var applet=_jmolGetApplet(targetSuffix);
+ if (applet) ret += applet.scriptWait(script);
+ ret = _jmolEvalJSON(ret,"jmolStatus")
+ if(typeof ret == "object")
+ return ret
+ }
+ }catch(e){
+ }
+ return [[ret]]
+}
+
+
+
+//////////// save/restore orientation /////////////
+
+function jmolSaveOrientation(id, targetSuffix) {
+ targetSuffix == undefined && (targetSuffix="0")
+ return _jmol["savedOrientation"+id] = jmolGetPropertyAsArray("orientationInfo","info",targetSuffix).moveTo
+}
+
+function jmolRestoreOrientation(id, targetSuffix) {
+ targetSuffix == undefined && (targetSuffix="0")
+ var s=_jmol["savedOrientation"+id]
+ if (!s || s == "")return
+ s=s.replace(/1\.0/,"0")
+ return jmolScriptWait(s,targetSuffix)
+}
+
+function jmolRestoreOrientationDelayed(id, delay, targetSuffix) {
+ arguments.length < 2 && (delay=1)
+ targetSuffix == undefined && (targetSuffix="0")
+ var s=_jmol["savedOrientation"+id]
+ if (!s || s == "")return
+ s=s.replace(/1\.0/,delay)
+ return jmolScriptWait(s,targetSuffix)
+}
+
+//////////// add parameter /////////////
+/*
+ * for adding callbacks or other parameters. Use:
+
+ jmolSetDocument(0)
+ var s= jmolApplet(....)
+ s = jmolAppletAddParam(s,"messageCallback", "myFunctionName")
+ document.write(s)
+ jmolSetDocument(document) // if you want to then write buttons and such normally
+
+ */
+
+function jmolAppletAddParam(appletCode,name,value){
+ return (value == "" ? appletCode : appletCode.replace(/\<param/,"\n<param name='"+name+"' value='"+value+"' />\n<param"))
+}
+
+///////////////auto load Research Consortium for Structural Biology (RCSB) data ///////////
+
+function jmolLoadAjax_STOLAF_RCSB(fileformat,pdbid,optionalscript,targetSuffix){
+
+ _jmol.thismodel || (_jmol.thismodel = "1crn")
+ _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm")
+ _jmol.RCSBserver || (_jmol.RCSBserver="http://www.rcsb.org")
+ _jmol.defaultURL_RCSB || (_jmol.defaultURL_RCSB=_jmol.RCSBserver+"/pdb/files/1CRN.CIF")
+ fileformat || (fileformat="PDB")
+ pdbid || (pdbid=prompt("Enter a 4-digit PDB ID:",_jmol.thismodel))
+ if(!pdbid || pdbid.length != 4)return ""
+ targetSuffix || (targetSuffix="0")
+ optionalscript || (optionalscript="")
+ var url=_jmol.defaultURL_RCSB.replace(/1CRN/g,pdbid.toUpperCase())
+ fileformat=="CIF" || (url=url.replace(/CIF/,fileformat))
+ _jmol.optionalscript=optionalscript
+ _jmol.thismodel=pdbid
+ _jmol.thistargetsuffix=targetSuffix
+ _jmol.thisurl=url
+ _jmol.modelArray = []
+ url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)
+ _jmolDomScriptLoad(url)
+ return url
+}
+
+
+///////////////auto load NIH CACTVS data -- compound name or SMILES ///////////
+
+function jmolLoadAjax_STOLAF_NIH(compoundid,optionalscript,targetSuffix){
+ _jmol.thismodel || (_jmol.thismodel = "aspirin")
+ _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm")
+ _jmol.defaultURL_NIH || (_jmol.defaultURL_NIH="http://cactus.nci.nih.gov/chemical/structure/FILE/file?format=sdf&get3d=True")
+ compoundid || (compoundid=prompt("Enter a compound name or a SMILES string:",_jmol.thismodel))
+ if(!compoundid)return ""
+ targetSuffix || (targetSuffix="0")
+ optionalscript || (optionalscript="")
+ var url=_jmol.defaultURL_NIH.replace(/FILE/g,compoundid)
+ _jmol.optionalscript=optionalscript
+ _jmol.thismodel=compoundid
+ _jmol.thistargetsuffix=targetSuffix
+ _jmol.thisurl=url
+ _jmol.modelArray = []
+ url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)
+ _jmolDomScriptLoad(url)
+ return url
+}
+
+
+/////////////// St. Olaf College AJAX server -- ANY URL ///////////
+
+function jmolLoadAjax_STOLAF_ANY(url, userid, optionalscript,targetSuffix){
+ _jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm"
+ _jmol.thisurlANY || (_jmol.thisurlANY = "http://www.stolaf.edu/depts/chemistry/mo/struc/data/ycp3-1.mol")
+ url || (url=prompt("Enter any (uncompressed file) URL:", _jmol.thisurlANY))
+ userid || (userid="0")
+ targetSuffix || (targetSuffix="0")
+ optionalscript || (optionalscript="")
+ _jmol.optionalscript=optionalscript
+ _jmol.thistargetsuffix=targetSuffix
+ _jmol.modelArray = []
+ _jmol.thisurl = url
+ url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)
+ _jmolDomScriptLoad(url)
+}
+
+
+/////////////// Mineralogical Society of America (MSA) data /////////
+
+function jmolLoadAjax_MSA(key,value,optionalscript,targetSuffix){
+
+ _jmol.thiskeyMSA || (_jmol.thiskeyMSA = "mineral")
+ _jmol.thismodelMSA || (_jmol.thismodelMSA = "quartz")
+ _jmol.ajaxURL_MSA || (_jmol.ajaxURL_MSA="http://rruff.geo.arizona.edu/AMS/result.php?mineral=quartz&viewing=ajaxjs")
+ key || (key=prompt("Enter a field:", _jmol.thiskeyMSA))
+ if(!key)return ""
+ value || (value=prompt("Enter a "+key+":", _jmol.thismodelMSA))
+ if(!value)return ""
+ targetSuffix || (targetSuffix="0")
+ optionalscript || (optionalscript="")
+ optionalscript == 1 && (optionalscript='load "" {1 1 1}')
+ var url=_jmol.ajaxURL_MSA.replace(/mineral/g,key).replace(/quartz/g,value)
+ _jmol.optionalscript=optionalscript
+ _jmol.thiskeyMSA=key
+ _jmol.thismodelMSA=value
+ _jmol.thistargetsuffix=targetSuffix
+ _jmol.thisurl=url
+ _jmol.modelArray = []
+ loadModel=_jmolLoadModel
+ _jmolDomScriptLoad(url)
+ return url
+}
+
+
+
+function jmolLoadAjaxJS(url, userid, optionalscript,targetSuffix){
+ userid || (userid="0")
+ targetSuffix || (targetSuffix="0")
+ optionalscript || (optionalscript="")
+ _jmol.optionalscript=optionalscript
+ _jmol.thismodel=userid
+ _jmol.thistargetsuffix=targetSuffix
+ _jmol.modelArray = []
+ _jmol.thisurl = url
+ url+="&returnFunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix
+ _jmolDomScriptLoad(url)
+}
+
+
+//// in case Jmol library has already been loaded:
+
+}catch(e){}
+
+///////////////moving atoms //////////////
+
+// HIGHLY experimental!!
+
+function jmolSetAtomCoord(i,x,y,z,targetSuffix){
+ _jmolCheckBrowser();
+ var applet=_jmolGetApplet(targetSuffix);
+ if (applet) applet.getProperty('jmolViewer').setAtomCoord(i,x,y,z)
+}
+
+function jmolSetAtomCoordRelative(i,x,y,z,targetSuffix){
+ _jmolCheckBrowser();
+ var applet=_jmolGetApplet(targetSuffix);
+ if (applet) applet.getProperty('jmolViewer').setAtomCoordRelative(i,x,y,z)
+}
+
+
+///////////////applet fake for testing buttons/////////////
+
+
+if(_jmol.useNoApplet){
+ jmolApplet = function(w){
+ var s="<table style='background-color:black' width="+w+"><tr height="+w+">"
+ +"<td align=center valign=center style='background-color:white'>"
+ +"Applet would be here"
+ +"<p><textarea id=fakeApplet rows=5 cols=50></textarea>"
+ +"</td></tr></table>"
+ return _jmolDocumentWrite(s)
+ }
+
+ _jmolFindApplet = function(){return jmolApplet0}
+
+ jmolApplet0 = {
+ script: function(script){document.getElementById("fakeApplet").value="\njmolScript:\n"+script}
+ ,scriptWait: function(script){document.getElementById("fakeApplet").value="\njmolScriptWait:\n"+script}
+ ,loadInline: function(data,script){document.getElementById("fakeApplet").value="\njmolLoadInline data:\n"+data+"\n\nscript:\n"+script}
+ }
+}
+
+
+///////////////////////////////////////////
+
+ // This should no longer be needed, jmolResizeApplet() is better; kept for backwards compatibility
+ /*
+ Resizes absolutely (pixels) or by percent of window (w or h 0.5 means 50%).
+ targetSuffix is optional and defaults to zero (first applet in page).
+ Both w and h are optional, but needed if you want to use targetSuffix.
+ h defaults to w
+ w defaults to 100% of window
+ If either w or h is between 0 and 1, then it is taken as percent/100.
+ If either w or h is greater than 1, then it is taken as a size (pixels).
+ */
+function jmolResize(w,h,targetSuffix) {
+ _jmol.alerted = true;
+ var percentW = (!w ? 100 : w <= 1 && w > 0 ? w * 100 : 0);
+ var percentH = (!h ? percentW : h <= 1 && h > 0 ? h * 100 : 0);
+ if (_jmol.browser=="msie") {
+ var width=document.body.clientWidth;
+ var height=document.body.clientHeight;
+ } else {
+ var netscapeScrollWidth=15;
+ var width=window.innerWidth - netscapeScrollWidth;
+ var height=window.innerHeight-netscapeScrollWidth;
+ }
+ var applet = _jmolGetApplet(targetSuffix);
+ if(!applet)return;
+ applet.style.width = (percentW ? width * percentW/100 : w)+"px";
+ applet.style.height = (percentH ? height * percentH/100 : (h ? h : w))+"px";
+ //title=width + " " + height + " " + (new Date());
+}
+
+// 13 Jun 09 -- makes jmolResize() obsolete (kept for backwards compatibility)
+function jmolResizeApplet(size,targetSuffix) {
+ // See _jmolGetAppletSize() for the formats accepted as size [same used by jmolApplet()]
+ // Special case: an empty value for width or height is accepted, meaning no change in that dimension.
+ _jmol.alerted = true;
+ var applet = _jmolGetApplet(targetSuffix);
+ if(!applet)return;
+ var sz = _jmolGetAppletSize(size, "px");
+ sz[0] && (applet.style.width = sz[0]);
+ sz[1] && (applet.style.height = sz[1]);
+}
+
+function _jmolGetAppletSize(size, units) {
+ /* Accepts single number or 2-value array, each one can be one of:
+ percent (text string ending %), decimal 0 to 1 (percent/100), number, or text string (interpreted as nr.)
+ [width, height] array of strings is returned, with units added if specified.
+ Percent is relative to container div or element (which should have explicitly set size).
+ */
+ var width, height;
+ if ( (typeof size) == "object" && size != null ) {
+ width = size[0]; height = size[1];
+ } else {
+ width = height = size;
+ }
+ return [_jmolFixDim(width, units), _jmolFixDim(height, units)];
+}
+
+function _jmolFixDim(x, units) {
+ var sx = "" + x;
+ return (sx.length == 0 ? (units ? "" : _jmol.allowedJmolSize[2])
+ : sx.indexOf("%") == sx.length-1 ? sx
+ : (x = parseFloat(x)) <= 1 && x > 0 ? x * 100 + "%"
+ : (isNaN(x = Math.floor(x)) ? _jmol.allowedJmolSize[2]
+ : x < _jmol.allowedJmolSize[0] ? _jmol.allowedJmolSize[0]
+ : x > _jmol.allowedJmolSize[1] ? _jmol.allowedJmolSize[1]
+ : x) + (units ? units : ""));
+}
+
+
+
+