Subversion Repositories wimsdev

Rev

Rev 1365 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
17 reyssat 1
/* $RCSfile: Jmol.js,v $
2
 * $Author: migueljmol $
3
 * $Date: 2004/12/11 22:22:10 $
4
 * $Revision: 1.28 $
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);
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);
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