client/servlet/www/Jmol.js

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