Annotation of loncom/html/adm/jmol/Jmol.js, revision 1.2

1.1       albertel    1: /* $RCSfile: Jmol.js,v $
1.2     ! albertel    2:  * $Author: albertel $
        !             3:  * $Date: 2005/07/01 20:23:42 $
        !             4:  * $Revision: 1.1 $
1.1       albertel    5:  *
                      6:  * Copyright (C) 2004  The Jmol Development Team
                      7:  *
                      8:  * Contact: jmol-developers@lists.sf.net
                      9:  *
                     10:  *  This library is free software; you can redistribute it and/or
                     11:  *  modify it under the terms of the GNU Lesser General Public
                     12:  *  License as published by the Free Software Foundation; either
                     13:  *  version 2.1 of the License, or (at your option) any later version.
                     14:  *
                     15:  *  This library is distributed in the hope that it will be useful,
                     16:  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17:  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     18:  *  Lesser General Public License for more details.
                     19:  *
                     20:  *  You should have received a copy of the GNU Lesser General Public
                     21:  *  License along with this library; if not, write to the Free Software
                     22:  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
                     23:  *  02111-1307  USA.
                     24:  */
                     25: 
                     26: // for documentation see www.jmol.org/jslibrary
                     27: 
                     28: var undefined; // for IE 5 ... wherein undefined is undefined
                     29: 
                     30: ////////////////////////////////////////////////////////////////
                     31: // Basic Scripting infrastruture
                     32: ////////////////////////////////////////////////////////////////
                     33: 
                     34: function jmolInitialize(codebaseDirectory) {
                     35:   if (_jmol.initialized) {
                     36:     alert("jmolInitialize() should only be called *ONCE* within a page");
                     37:     return;
                     38:   }
                     39:   if (! codebaseDirectory) {
                     40:     alert("codebaseDirectory is a required parameter to jmolInitialize");
                     41:     codebaseDirectory = ".";
                     42:   }
                     43:   if (codebaseDirectory.indexOf("http://") == 0 ||
                     44:       codebaseDirectory.indexOf("https://") == 0)
                     45:     alert("codebaseDirectory should be directory relative,\n" +
                     46: 	  "not be an absolute URL : " + codebaseDirectory);
1.2     ! albertel   47: //  else if (codebaseDirectory.charAt(0) == '/')
        !            48: //    alert("codebaseDirectory should be directory relative,\n" +
        !            49: //	  "not relative to the root of the web server : " + codebaseDirectory);
1.1       albertel   50:   _jmolSetCodebase(codebaseDirectory);
                     51:   _jmolOnloadResetForms();
                     52:   _jmol.initialized = true;
                     53: }
                     54: 
                     55: function jmolSetAppletColor(boxbgcolor, boxfgcolor, progresscolor) {
                     56:   _jmolInitCheck();
                     57:   _jmol.boxbgcolor = boxbgcolor;
                     58:   if (boxfgcolor)
                     59:     _jmol.boxfgcolor = boxfgcolor
                     60:   else if (boxbgcolor == "white" || boxbgcolor == "#FFFFFF")
                     61:     _jmol.boxfgcolor = "black";
                     62:   else
                     63:     _jmol.boxfgcolor = "white";
                     64:   if (progresscolor)
                     65:     _jmol.progresscolor = progresscolor;
                     66:   if (_jmol.debugAlert)
                     67:     alert(" boxbgcolor=" + _jmol.boxbgcolor +
                     68:           " boxfgcolor=" + _jmol.boxfgcolor +
                     69:           " progresscolor=" + _jmol.progresscolor);
                     70: }
                     71: 
                     72: function jmolApplet(size, script, nameSuffix) {
                     73:   _jmolInitCheck();
                     74:   _jmolApplet(size, null, script, nameSuffix);
                     75: }
                     76: 
                     77: ////////////////////////////////////////////////////////////////
                     78: // Basic controls
                     79: ////////////////////////////////////////////////////////////////
                     80: 
                     81: function jmolButton(script, label, id) {
                     82:   _jmolInitCheck();
                     83:   var scriptIndex = _jmolAddScript(script);
                     84:   if (label == undefined || label == null)
                     85:     label = script.substring(0, 32);
                     86:   if (id == undefined || id == null)
                     87:     id = "jmolButton" + _jmol.buttonCount;
                     88:   ++_jmol.buttonCount;
                     89:   var t = "<input type='button' name='" + id + "' id='" + id +
                     90:           "' value='" + label +
                     91:           "' onClick='_jmolClick(" + scriptIndex + _jmol.targetText +
                     92:           ")' onMouseover='_jmolMouseOver(" + scriptIndex +
                     93:           ");return true' onMouseout='_jmolMouseOut()' " +
                     94:           _jmol.buttonCssText + "/>";
                     95:   if (_jmol.debugAlert)
                     96:     alert(t);
                     97:   document.write(t);
                     98: }
                     99: 
                    100: function jmolCheckbox(scriptWhenChecked, scriptWhenUnchecked,
                    101:                       labelHtml, isChecked, id) {
                    102:   _jmolInitCheck();
                    103:   if (id == undefined || id == null)
                    104:     id = "jmolCheckbox" + _jmol.checkboxCount;
                    105:   ++_jmol.checkboxCount;
                    106:   if (scriptWhenChecked == undefined || scriptWhenChecked == null ||
                    107:       scriptWhenUnchecked == undefined || scriptWhenUnchecked == null) {
                    108:     alert("jmolCheckbox requires two scripts");
                    109:     return;
                    110:   }
                    111:   if (labelHtml == undefined || labelHtml == null) {
                    112:     alert("jmolCheckbox requires a label");
                    113:     return;
                    114:   }
                    115:   var indexChecked = _jmolAddScript(scriptWhenChecked);
                    116:   var indexUnchecked = _jmolAddScript(scriptWhenUnchecked);
                    117:   var t = "<input type='checkbox' name='" + id + "' id='" + id +
                    118:           "' onClick='_jmolCbClick(this," +
                    119:           indexChecked + "," + indexUnchecked + _jmol.targetText +
                    120:           ")' onMouseover='_jmolCbOver(this," + indexChecked + "," +
                    121:           indexUnchecked +
                    122:           ");return true' onMouseout='_jmolMouseOut()' " +
                    123: 	  (isChecked ? "checked " : "") + _jmol.checkboxCssText + "/>" +
                    124:           labelHtml;
                    125:   if (_jmol.debugAlert)
                    126:     alert(t);
                    127:   document.write(t);
                    128: }
                    129: 
                    130: function jmolRadioGroup(arrayOfRadioButtons, separatorHtml, groupName) {
                    131:   _jmolInitCheck();
                    132:   var type = typeof arrayOfRadioButtons;
                    133:   if (type != "object" || type == null || ! arrayOfRadioButtons.length) {
                    134:     alert("invalid arrayOfRadioButtons");
                    135:     return;
                    136:   }
                    137:   if (separatorHtml == undefined || separatorHtml == null)
                    138:     separatorHtml = "&nbsp; ";
                    139:   var length = arrayOfRadioButtons.length;
                    140:   var t = "";
                    141:   jmolStartNewRadioGroup();
                    142:   for (var i = 0; i < length; ++i) {
                    143:     var radio = arrayOfRadioButtons[i];
                    144:     type = typeof radio;
                    145:     if (type == "object") {
                    146:       t += _jmolRadio(radio[0], radio[1], radio[2], separatorHtml, groupName);
                    147:     } else {
                    148:       t += _jmolRadio(radio, null, null, separatorHtml, groupName);
                    149:     }
                    150:   }
                    151:   if (_jmol.debugAlert)
                    152:     alert(t);
                    153:   document.write(t);
                    154: }
                    155: 
                    156: function jmolLink(script, text, id) {
                    157:   _jmolInitCheck();
                    158:   if (id == undefined || id == null)
                    159:     id = "jmolLink" + _jmol.linkCount;
                    160:   ++_jmol.linkCount;
                    161:   var scriptIndex = _jmolAddScript(script);
                    162:   var t = "<a name='" + id + "' id='" + id + 
                    163:           "' href='javascript:_jmolClick(" + scriptIndex +
                    164:           _jmol.targetText +
                    165:           ");' onMouseover='_jmolMouseOver(" + scriptIndex +
                    166:           ");return true;' onMouseout='_jmolMouseOut()' " +
                    167:           _jmol.linkCssText + ">" + text + "</a>";
                    168:   if (_jmol.debugAlert)
                    169:     alert(t);
                    170:   document.write(t);
                    171: }
                    172: 
                    173: function jmolMenu(arrayOfMenuItems, size, id) {
                    174:   _jmolInitCheck();
                    175:   if (id == undefined || id == null)
                    176:     id = "jmolMenu" + _jmol.menuCount;
                    177:   ++_jmol.menuCount;
                    178:   var type = typeof arrayOfMenuItems;
                    179:   if (type != null && type == "object" && arrayOfMenuItems.length) {
                    180:     var length = arrayOfMenuItems.length;
                    181:     if (typeof size != "number" || size == 1)
                    182:       size = null;
                    183:     else if (size < 0)
                    184:       size = length;
                    185:     var sizeText = size ? " size='" + size + "' " : "";
                    186:     var t = "<select name='" + id + "' id='" + id +
                    187:             "' onChange='_jmolMenuSelected(this" +
                    188:             _jmol.targetText + ")'" +
                    189:             sizeText + _jmol.menuCssText + ">";
                    190:     for (var i = 0; i < length; ++i) {
                    191:       var menuItem = arrayOfMenuItems[i];
                    192:       type = typeof menuItem;
                    193:       var script, text;
                    194:       var isSelected = undefined;
                    195:       if (type == "object" && menuItem != null) {
                    196:         script = menuItem[0];
                    197:         text = menuItem[1];
                    198:         isSelected = menuItem[2];
                    199:       } else {
                    200:         script = text = menuItem;
                    201:       }
                    202:       if (text == undefined || text == null)
                    203:         text = script;
                    204:       var scriptIndex = _jmolAddScript(script);
                    205:       var selectedText = isSelected ? "' selected>" : "'>";
                    206:       t += "<option value='" + scriptIndex + selectedText + text + "</option>";
                    207:     }
                    208:     t += "</select>";
                    209:     if (_jmol.debugAlert)
                    210:       alert(t);
                    211:     document.write(t);
                    212:   }
                    213: }
                    214: 
                    215: function jmolHtml(html) {
                    216:   document.write(html);
                    217: }
                    218: 
                    219: function jmolBr() {
                    220:   document.write("<br />");
                    221: }
                    222: 
                    223: ////////////////////////////////////////////////////////////////
                    224: // advanced scripting functions
                    225: ////////////////////////////////////////////////////////////////
                    226: 
                    227: function jmolDebugAlert(enableAlerts) {
                    228:   _jmol.debugAlert = (enableAlerts == undefined || enableAlerts)
                    229: }
                    230: 
                    231: function jmolAppletInline(size, inlineModel, script, nameSuffix) {
                    232:   _jmolApplet(size, _jmolConvertInline(inlineModel), script, nameSuffix);
                    233: }
                    234: 
                    235: function jmolSetTarget(targetSuffix) {
                    236:   _jmol.targetSuffix = targetSuffix;
                    237:   _jmol.targetText = targetSuffix ? ",\"" + targetSuffix + "\"" : "";
                    238: }
                    239: 
                    240: function jmolScript(script, targetSuffix) {
                    241:   if (script) {
                    242:     _jmolCheckBrowser();
                    243:     var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0");
                    244:     var applet = _jmolFindApplet(target);
                    245:     if (applet)
                    246:       return applet.script(script);
                    247:     else
                    248:       alert("could not find applet " + target);
                    249:   }
                    250: }
                    251: 
                    252: function jmolLoadInline(model, targetSuffix) {
                    253:   if (model) {
                    254:     var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0");
                    255: //    while (! _jmol.ready[target])
                    256: //      alert("The Jmol applet " + target + " is not loaded yet");
                    257: //    if (! _jmol.ready[target])
                    258: //      alert("The Jmol applet " + target + " is not loaded yet");
                    259: //    if (document.applets[target] && ! document.applets[target].isActive())
                    260: //       alert("The Jmol applet " + target + " is not yet active");
                    261: //    else {
                    262:       var applet = _jmolFindApplet(target);
                    263:       if (applet)
                    264:         return applet.loadInline(model);
                    265:       else
                    266:         alert("could not find applet " + target);
                    267: //    }
                    268:   }
                    269: }
                    270: 
                    271: function jmolStartNewRadioGroup() {
                    272:   ++_jmol.radioGroupCount;
                    273: }
                    274: 
                    275: function jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName) {
                    276:   _jmolInitCheck();
                    277:   if (_jmol.radioGroupCount == 0)
                    278:     ++_jmol.radioGroupCount;
                    279:   var t = _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName);
                    280:   if (_jmol.debugAlert)
                    281:     alert(t);
                    282:   document.write(t);
                    283: }
                    284: 
                    285: function jmolCheckBrowser(action, urlOrMessage, nowOrLater) {
                    286:   if (typeof action == "string") {
                    287:     action = action.toLowerCase();
                    288:     if (action != "alert" && action != "redirect" && action != "popup")
                    289:       action = null;
                    290:   }
                    291:   if (typeof action != "string")
                    292:     alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +
                    293:           "action must be 'alert', 'redirect', or 'popup'");
                    294:   else {
                    295:     if (typeof urlOrMessage != "string")
                    296:       alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +
                    297:             "urlOrMessage must be a string");
                    298:     else {
                    299:       _jmol.checkBrowserAction = action;
                    300:       _jmol.checkBrowserUrlOrMessage = urlOrMessage;
                    301:     }
                    302:   }
                    303:   if (typeof nowOrLater == "string" && nowOrLater.toLowerCase() == "now")
                    304:     _jmolCheckBrowser();
                    305: }
                    306: 
                    307: ////////////////////////////////////////////////////////////////
                    308: // Cascading Style Sheet Class support
                    309: ////////////////////////////////////////////////////////////////
                    310: 
                    311: function jmolSetAppletCssClass(appletCssClass) {
                    312:   if (_jmol.hasGetElementById) {
                    313:     _jmol.appletCssClass = appletCssClass;
                    314:     _jmol.appletCssText = appletCssClass ? "class='" + appletCssClass + "' " : "";
                    315:   }
                    316: }
                    317: 
                    318: function jmolSetButtonCssClass(buttonCssClass) {
                    319:   if (_jmol.hasGetElementById) {
                    320:     _jmol.buttonCssClass = buttonCssClass;
                    321:     _jmol.buttonCssText = buttonCssClass ? "class='" + buttonCssClass + "' " : "";
                    322:   }
                    323: }
                    324: 
                    325: function jmolSetCheckboxCssClass(checkboxCssClass) {
                    326:   if (_jmol.hasGetElementById) {
                    327:     _jmol.checkboxCssClass = checkboxCssClass;
                    328:     _jmol.checkboxCssText = checkboxCssClass ? "class='" + checkboxCssClass + "' " : "";
                    329:   }
                    330: }
                    331: 
                    332: function jmolSetRadioCssClass(radioCssClass) {
                    333:   if (_jmol.hasGetElementById) {
                    334:     _jmol.radioCssClass = radioCssClass;
                    335:     _jmol.radioCssText = radioCssClass ? "class='" + radioCssClass + "' " : "";
                    336:   }
                    337: }
                    338: 
                    339: function jmolSetLinkCssClass(linkCssClass) {
                    340:   if (_jmol.hasGetElementById) {
                    341:     _jmol.linkCssClass = linkCssClass;
                    342:     _jmol.linkCssText = linkCssClass ? "class='" + linkCssClass + "' " : "";
                    343:   }
                    344: }
                    345: 
                    346: function jmolSetMenuCssClass(menuCssClass) {
                    347:   if (_jmol.hasGetElementById) {
                    348:     _jmol.menuCssClass = menuCssClass;
                    349:     _jmol.menuCssText = menuCssClass ? "class='" + menuCssClass + "' " : "";
                    350:   }
                    351: }
                    352: 
                    353: ////////////////////////////////////////////////////////////////
                    354: // functions for INTERNAL USE ONLY which are subject to change
                    355: // use at your own risk ... you have been WARNED!
                    356: ////////////////////////////////////////////////////////////////
                    357: 
                    358: var _jmol = {
                    359: 
                    360: debugAlert: false,
                    361: bgcolor: "black",
                    362: progresscolor: "blue",
                    363: boxbgcolor: "black",
                    364: boxfgcolor: "white",
                    365: boxmessage: "Downloading JmolApplet ...",
                    366: 
                    367: codebase: ".",
                    368: modelbase: ".",
                    369: 
                    370: appletCount: 0,
                    371: 
                    372: buttonCount: 0,
                    373: checkboxCount: 0,
                    374: linkCount: 0,
                    375: menuCount: 0,
                    376: radioCount: 0,
                    377: radioGroupCount: 0,
                    378: 
                    379: appletCssClass: null,
                    380: appletCssText: "",
                    381: buttonCssClass: null,
                    382: buttonCssText: "",
                    383: checkboxCssClass: null,
                    384: checkboxCssText: "",
                    385: radioCssClass: null,
                    386: radioCssText: "",
                    387: linkCssClass: null,
                    388: linkCssText: "",
                    389: menuCssClass: null,
                    390: menuCssText: "",
                    391: 
                    392: targetSuffix: 0,
                    393: targetText: "",
                    394: scripts: [""],
                    395: 
                    396: ua: navigator.userAgent.toLowerCase(),
                    397: uaVersion: parseFloat(navigator.appVersion),
                    398: 
                    399: os: "unknown",
                    400: browser: "unknown",
                    401: browserVersion: 0,
                    402: hasGetElementById: !!document.getElementById,
                    403: isJavaEnabled: navigator.javaEnabled(),
                    404: isNetscape47Win: false,
                    405: 
                    406: isBrowserCompliant: false,
                    407: isJavaCompliant: false,
                    408: isFullyCompliant: false,
                    409: 
                    410: initialized: false,
                    411: initChecked: false,
                    412: 
                    413: browserChecked: false,
                    414: checkBrowserAction: "alert",
                    415: checkBrowserUrlOrMessage: null,
                    416: 
                    417: previousOnloadHandler: null,
                    418: ready: {}
                    419: }
                    420: 
                    421: with (_jmol) {
                    422:   function _jmolTestUA(candidate) {
                    423:     var ua = _jmol.ua;
                    424:     var index = ua.indexOf(candidate);
                    425:     if (index < 0)
                    426:       return false;
                    427:     _jmol.browser = candidate;
                    428:     _jmol.browserVersion = parseFloat(ua.substring(index + candidate.length+1));
                    429:     return true;
                    430:   }
                    431:   
                    432:   function _jmolTestOS(candidate) {
                    433:     if (_jmol.ua.indexOf(candidate) < 0)
                    434:       return false;
                    435:     _jmol.os = candidate;
                    436:     return true;
                    437:   }
                    438:   
                    439:   _jmolTestUA("konqueror") ||
                    440:   _jmolTestUA("safari") ||
                    441:   _jmolTestUA("omniweb") ||
                    442:   _jmolTestUA("opera") ||
                    443:   _jmolTestUA("webtv") ||
                    444:   _jmolTestUA("icab") ||
                    445:   _jmolTestUA("msie") ||
                    446:   (_jmol.ua.indexOf("compatible") < 0 && _jmolTestUA("mozilla"));
                    447:   
                    448:   _jmolTestOS("linux") ||
                    449:   _jmolTestOS("unix") ||
                    450:   _jmolTestOS("mac") ||
                    451:   _jmolTestOS("win");
                    452: 
                    453:   isNetscape47Win = (os == "win" && browser == "mozilla" &&
                    454:                      browserVersion >= 4.78 && browserVersion <= 4.8);
                    455: 
                    456:   if (os == "win") {
                    457:     isBrowserCompliant = hasGetElementById || isNetscape47Win;
                    458:   } else if (os == "mac") { // mac is the problem child :-(
                    459:     if (browser == "mozilla" && browserVersion >= 5) {
                    460:       // miguel 2004 11 17
                    461:       // checking the plugins array does not work because
                    462:       // Netscape 7.2 OS X still has Java 1.3.1 listed even though
                    463:       // javaplugin.sf.net is installed to upgrade to 1.4.2
                    464:       eval("try {var v = java.lang.System.getProperty('java.version');" +
                    465:            " _jmol.isBrowserCompliant = v >= '1.4.2';" +
                    466:            " } catch (e) { }");
                    467:     } else if (browser == "opera" && browserVersion <= 7.54) {
                    468:       isBrowserCompliant = false;
                    469:     } else {
                    470:       isBrowserCompliant = hasGetElementById &&
                    471:         !((browser == "msie") ||
                    472:           (browser == "safari" && browserVersion < 125.1));
                    473:     }
                    474:   } else if (os == "linux" || os == "unix") {
                    475:     if (browser == "konqueror" && browserVersion <= 3.3)
                    476:       isBrowserCompliant = false;
                    477:     else
                    478:       isBrowserCompliant = hasGetElementById;
                    479:   } else { // other OS
                    480:     isBrowserCompliant = hasGetElementById;
                    481:   }
                    482: 
                    483:   // possibly more checks in the future for this
                    484:   isJavaCompliant = isJavaEnabled;
                    485: 
                    486:   isFullyCompliant = isBrowserCompliant && isJavaCompliant;
                    487: }
                    488: 
                    489: function _jmolApplet(size, inlineModel, script, nameSuffix) {
                    490:   with (_jmol) {
                    491:     if (! nameSuffix)
                    492:       nameSuffix = appletCount;
                    493:     ++appletCount;
                    494:     if (! script)
                    495:       script = "select *";
                    496:     var sz = _jmolGetAppletSize(size);
                    497:     var t;
                    498:     t = "<applet name='jmolApplet" + nameSuffix + "' id='jmolApplet" + nameSuffix +
                    499:         "' " + appletCssText +
                    500:         " code='JmolApplet' archive='JmolApplet.jar'\n" +
                    501:         " codebase='" + codebase + "'\n" +
                    502:         " width='" + sz[0] + "' height='" + sz[1] +
                    503:         "' mayscript='true'>\n" +
                    504:         "  <param name='progressbar' value='true' />\n" +
                    505:         "  <param name='progresscolor' value='" +
                    506:         progresscolor + "' />\n" +
                    507:         "  <param name='boxmessage' value='" +
                    508:         boxmessage + "' />\n" +
                    509:         "  <param name='boxbgcolor' value='" +
                    510:         boxbgcolor + "' />\n" +
                    511:         "  <param name='boxfgcolor' value='" +
                    512:         boxfgcolor + "' />\n" +
                    513:         "  <param name='ReadyCallback' value='_jmolReadyCallback' />\n";
                    514: 
                    515:     if (inlineModel)
                    516:       t += "  <param name='loadInline' value='" + inlineModel + "' />\n";
                    517:     if (script)
                    518:       t += "  <param name='script' value='" + script + "' />\n";
                    519:     t += "</applet>";
                    520:     jmolSetTarget(nameSuffix);
                    521:     ready["jmolApplet" + nameSuffix] = false;
                    522:     if (_jmol.debugAlert)
                    523:       alert(t);
                    524:     document.write(t);
                    525:   }
                    526: }
                    527: 
                    528: function _jmolInitCheck() {
                    529:   if (_jmol.initChecked)
                    530:     return;
                    531:   _jmol.initChecked = true;
                    532:   if (_jmol.initialized)
                    533:     return;
                    534:   alert("jmolInitialize({codebase}, {badBrowseURL}, {badJavaURL})\n" +
                    535:         "  must be called before any other Jmol.js functions");
                    536: }
                    537: 
                    538: function _jmolCheckBrowser() {
                    539:   with (_jmol) {
                    540:     if (browserChecked)
                    541:       return;
                    542:     browserChecked = true;
                    543:   
                    544:     if (isFullyCompliant)
                    545:       return true;
                    546: 
                    547:     if (checkBrowserAction == "redirect")
                    548:       location.href = checkBrowserUrlOrMessage;
                    549:     else if (checkBrowserAction == "popup")
                    550:       _jmolPopup(checkBrowserUrlOrMessage);
                    551:     else {
                    552:       var msg = checkBrowserUrlOrMessage;
                    553:       if (msg == null)
                    554:         msg = "Your web browser is not fully compatible with Jmol\n\n" +
                    555:               "brower: " + browser +
                    556:               "   version: " + browserVersion +
                    557:               "   os: " + os +
                    558:               "\n\n" + ua;
                    559:       alert(msg);
                    560:     }
                    561:   }
                    562:   return false;
                    563: }
                    564: 
                    565: function _jmolPopup(url) {
                    566:   var popup = window.open(url, "JmolPopup",
                    567:                           "left=150,top=150,height=400,width=600," +
                    568:                           "directories=yes,location=yes,menubar=yes," +
                    569:                           "toolbar=yes," +
                    570:                           "resizable=yes,scrollbars=yes,status=yes");
                    571:   if (popup.focus)
                    572:     poup.focus();
                    573: }
                    574: 
                    575: function _jmolReadyCallback(name) {
                    576:   if (_jmol.debugAlert)
                    577:     alert(name + " is ready");
                    578:   _jmol.ready["" + name] = true;
                    579: }
                    580: 
                    581: function _jmolConvertInline(model) {
                    582:   var inlineModel = model.replace(/\r|\n|\r\n/g, "|");
                    583:   if (_jmol.debugAlert)
                    584:     alert("inline model:\n" + inlineModel);
                    585:   return inlineModel;
                    586: }
                    587: 
                    588: function _jmolGetAppletSize(size) {
                    589:   var width, height;
                    590:   var type = typeof size;
                    591:   if (type == "number")
                    592:     width = height = size;
                    593:   else if (type == "object" && size != null) {
                    594:     width = size[0]; height = size[1];
                    595:   }
                    596:   if (! (width >= 25 && width <= 2000))
                    597:     width = 300;
                    598:   if (! (height >= 25 && height <= 2000))
                    599:     height = 300;
                    600:   return [width, height];
                    601: }
                    602: 
                    603: function _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName) {
                    604:   ++_jmol.radioCount;
                    605:   if (groupName == undefined || groupName == null)
                    606:     groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1);
                    607:   if (!script)
                    608:     return "";
                    609:   if (labelHtml == undefined || labelHtml == null)
                    610:     labelHtml = script.substring(0, 32);
                    611:   if (! separatorHtml)
                    612:     separatorHtml = "";
                    613:   var scriptIndex = _jmolAddScript(script);
                    614:   return "<input name='" + groupName +
                    615:          "' type='radio' onClick='_jmolClick(" +
                    616:          scriptIndex + _jmol.targetText +
                    617:          ");return true;' onMouseover='_jmolMouseOver(" +
                    618:          scriptIndex +
                    619:          ");return true;' onMouseout='_jmolMouseOut()' " +
                    620: 	 (isChecked ? "checked " : "") + _jmol.radioCssText + "/>" +
                    621:          labelHtml + separatorHtml;
                    622: }
                    623: 
                    624: function _jmolFindApplet(target) {
                    625:   // first look for the target in the current window
                    626:   var applet = _jmolSearchFrames(window, target);
                    627:   if (applet == undefined)
                    628:     applet = _jmolSearchFrames(top, target); // look starting in top frame
                    629:   return applet;
                    630: }
                    631: 
                    632: function _jmolSearchFrames(win, target) {
                    633:   var applet;
                    634:   var frames = win.frames;
                    635:   if (frames && frames.length) { // look in all the frames below this window
                    636:     for (var i = 0; i < frames.length; ++i) {
                    637:       applet = _jmolSearchFrames(frames[i++], target);
                    638:       if (applet)
                    639:         break;
                    640:     }
                    641:   } else { // look for the applet in this window
                    642:     var doc = win.document;
                    643: // getElementById fails on MacOSX Safari & Mozilla	
                    644:     if (doc.applets)
                    645:       applet = doc.applets[target];
                    646:     else
                    647:       applet = doc[target];
                    648:   }
                    649:   return applet;
                    650: }
                    651: 
                    652: function _jmolAddScript(script) {
                    653:   if (! script)
                    654:     return 0;
                    655:   var index = _jmol.scripts.length;
                    656:   _jmol.scripts[index] = script;
                    657:   return index;
                    658: }
                    659: 
                    660: function _jmolClick(scriptIndex, targetSuffix) {
                    661:   jmolScript(_jmol.scripts[scriptIndex], targetSuffix);
                    662: }
                    663: 
                    664: function _jmolMenuSelected(menuObject, targetSuffix) {
                    665:   var scriptIndex = menuObject.value;
                    666:   if (scriptIndex != undefined) {
                    667:     jmolScript(_jmol.scripts[scriptIndex], targetSuffix);
                    668:     return;
                    669:   }
                    670:   var length = menuObject.length;
                    671:   if (typeof length == "number") {
                    672:     for (var i = 0; i < length; ++i) {
                    673:       if (menuObject[i].selected) {
                    674:         _jmolClick(menuObject[i].value, targetSuffix);
                    675: 	return;
                    676:       }
                    677:     }
                    678:   }
                    679:   alert("?Que? menu selected bug #8734");
                    680: }
                    681: 
                    682: function _jmolCbClick(ckbox, whenChecked, whenUnchecked, targetSuffix) {
                    683:   _jmolClick(ckbox.checked ? whenChecked : whenUnchecked, targetSuffix);
                    684: }
                    685: 
                    686: function _jmolCbOver(ckbox, whenChecked, whenUnchecked) {
                    687:   window.status = _jmol.scripts[ckbox.checked ? whenUnchecked : whenChecked];
                    688: }
                    689: 
                    690: function _jmolMouseOver(scriptIndex) {
                    691:   window.status = _jmol.scripts[scriptIndex];
                    692: }
                    693: 
                    694: function _jmolMouseOut() {
                    695:   window.status = " ";
                    696:   return true;
                    697: }
                    698: 
                    699: function _jmolSetCodebase(codebase) {
                    700:   _jmol.codebase = codebase ? codebase : ".";
                    701:   if (_jmol.debugAlert)
                    702:     alert("jmolCodebase=" + _jmol.codebase);
                    703: }
                    704: 
                    705: function _jmolOnloadResetForms() {
                    706:   _jmol.previousOnloadHandler = window.onload;
                    707:   window.onload =
                    708:   function() {
                    709: //    alert("onloadResetForms");
                    710:     with (_jmol) {
                    711:       if (buttonCount+checkboxCount+menuCount+radioCount+radioGroupCount > 0) {
                    712:         var forms = document.forms;
                    713:         if (!forms || forms.length == 0) {
                    714:           alert("<form> tags seem to be missing\n" +
                    715:                 "Jmol/HTML input controls must be contained " +
                    716:                 "within form tags"
                    717: //                + "\n\n" + forms + " forms.length=" + forms.length +
                    718: //                " typeof=" + (typeof forms)
                    719:                 );
                    720:         } else {
                    721:           for (var i = forms.length; --i >= 0; )
                    722:             forms[i].reset();
                    723:         }
                    724:       }
                    725:       if (previousOnloadHandler)
                    726:         previousOnloadHandler();
                    727:     }
                    728:   }
                    729: }
                    730: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>