]> granicus.if.org Git - docbook-dsssl/commitdiff
This is a significant rewrite. The JavaScript is much improved (including some code...
authorNorman Walsh <ndw@nwalsh.com>
Wed, 29 May 2002 18:13:42 +0000 (18:13 +0000)
committerNorman Walsh <ndw@nwalsh.com>
Wed, 29 May 2002 18:13:42 +0000 (18:13 +0000)
18 files changed:
slides/browser/list.js [deleted file]
slides/browser/overlay.js
slides/browser/resize.js [deleted file]
slides/browser/slides.css
slides/browser/slides.js
slides/browser/ua.js [new file with mode: 0644]
slides/browser/xbCollapsibleLists.js [new file with mode: 0644]
slides/browser/xbDOM.js [new file with mode: 0644]
slides/browser/xbDebug.js [new file with mode: 0644]
slides/browser/xbStyle.js [new file with mode: 0644]
slides/doc/slides.xml [new file with mode: 0644]
slides/xsl/.cvsignore
slides/xsl/Makefile
slides/xsl/frames.xsl
slides/xsl/graphics.xsl [new file with mode: 0644]
slides/xsl/jscript.xsl [new file with mode: 0644]
slides/xsl/param.xweb [new file with mode: 0644]
slides/xsl/slides.xsl

diff --git a/slides/browser/list.js b/slides/browser/list.js
deleted file mode 100644 (file)
index ede9389..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-var _id = 0, _pid = 0, _lid = 0, _pLayer;
-var _mLists = new Array();
-document.lists = _mLists;
-var isNav4, isIE4;
-if (parseInt(navigator.appVersion.charAt(0)) >= 4) {
-  isNav4 = (navigator.appName == "Netscape") ? true : false;
-  isIE4 = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
-}
-
-function List(visible, width, height, bgColor) {
-  this.setIndent = setIndent;
-  this.addItem = addItem;
-  this.addList = addList;
-  this.build = build;
-  this.rebuild = rebuild;
-  this.setFont = _listSetFont;
-  this._writeList = _writeList;
-  this._showList = _showList;
-  this._updateList = _updateList;
-  this._updateParent = _updateParent;
-  this.onexpand = null; this.postexpand = null;
-  this.lists = new Array(); // sublists
-  this.items = new Array(); // layers
-  this.types = new Array(); // type
-  this.strs = new Array();  // content
-  this.x = 0;
-  this.y = 0;
-  this.visible = visible;
-  this.id = _id;
-  this.i = 18;
-  this.space = true;
-  this.pid = 0;
-  this.fontIntro = false;
-  this.fontOutro = false;
-  this.width = width || 350;
-  this.height = height || 22;
-  this.parLayer = false;
-  this.built = false;
-  this.shown = false;
-  this.needsUpdate = false;
-  this.needsRewrite = false;
-  this.parent = null;
-  this.l = 0;
-  if(bgColor) this.bgColor = bgColor;
-  else this.bgColor = null;
-  _mLists[_id++] = this;
-}
-
-function _listSetFont(i,j) {
-  this.fontIntro = i;
-  this.fontOutro = j;
-}
-
-function setIndent(indent) {
-    this.i = indent;
-    if (this.i < 0) {
-       this.i = 0;
-       this.space = false;
-    }
-}
-
-function setClip(layer, l, r, t, b) {
-  if(isNav4) {
-    layer.clip.left = l; layer.clip.right = r;
-    layer.clip.top = t;  layer.clip.bottom = b;
-  } else {
-    layer.style.pixelWidth = r-l;
-    layer.style.pixelHeight = b-t;
-    layer.style.clip = "rect("+t+","+r+","+b+","+l+")";
-  }
-}
-
-function _writeList() {
-    self.status = "List: Writing list...";
-    var layer, str, clip;
-    for (var i = 0; i < this.types.length; i++) {
-       layer = this.items[i];
-       if (isNav4) layer.visibility = "hidden";
-       else layer.style.visibility = "hidden";
-       str = "";
-
-       alert(layer);
-
-       if(isNav4) layer.document.open();
-
-       str += "<TABLE WIDTH="+this.width+" NOWRAP BORDER=0 CELLPADDING=0 CELLSPACING=0><TR>";
-       if(this.types[i] == "list") {
-           str += "<TD WIDTH=15 NOWRAP VALIGN=MIDDLE><A TARGET='_self' HREF=\"javascript:expand("+this.lists[i].id+");\"><IMG BORDER=0 SRC=\"../graphics/true.gif\" NAME=\"_img"+this.lists[i].id+"\"></A></TD>";
-           _pid++;
-       } else if(this.space)
-           str += "<TD WIDTH=15 NOWRAP>&nbsp;</TD>";
-       if(this.l>0 && this.i>0) str += "<TD WIDTH="+this.l*this.i+" NOWRAP>&nbsp;</TD>";
-       str += "<TD HEIGHT="+(this.height-3)+" WIDTH="+(this.width-15-this.l*this.i)+" VALIGN=MIDDLE ALIGN=LEFT>";
-       if(this.fontIntro) str += this.fontIntro;
-       str += this.strs[i];
-       if(this.fontOutro) str += this.fontOutro;
-       str += "</TD></TABLE>";
-       if(isNav4) {
-           layer.document.writeln(str);
-           layer.document.close();
-       } else layer.innerHTML = str;
-       if(this.types[i] == "list" && this.lists[i].visible)
-           this.lists[i]._writeList();
-    }
-    this.built = true;
-    this.needsRewrite = false;
-    self.status = '';
-}
-
-function _showList() {
-  var layer;
-  for(var i = 0; i < this.types.length; i++) { 
-    layer = this.items[i];
-    setClip(layer, 0, this.width, 0, this.height-1);
-    var bg = layer.oBgColor || this.bgColor;
-    if(isIE4) {
-      if((bg == null) || (bg == "null")) bg = "";
-      layer.style.backgroundColor = bg;
-    } else layer.document.bgColor = bg;
-    if(this.types[i] == "list" && this.lists[i].visible)
-      this.lists[i]._showList();
-  }
-  this.shown = true;
-  this.needsUpdate = false;
-}
-
-function _updateList(pVis, x, y) {
-  var currTop = y, layer;
-  for(var i = 0; i < this.types.length; i++) { 
-    layer = this.items[i];
-    if(this.visible && pVis) {
-      if(isNav4) {
-        layer.visibility = "visible";
-        layer.top = currTop;
-        layer.left = x;
-      } else {
-        layer.style.visibility = "visible";
-        layer.style.pixelTop = currTop;
-        layer.style.pixelLeft = x;
-      }
-      currTop += this.height;
-    } else {
-      if(isNav4) layer.visibility = "hidden";
-      else layer.style.visibility = "hidden";
-    }
-    if(this.types[i] == "list") {
-      if(this.lists[i].visible) {
-        if(!this.lists[i].built || this.lists[i].needsRewrite) this.lists[i]._writeList();
-        if(!this.lists[i].shown || this.lists[i].needsUpdate) this.lists[i]._showList();
-        if(isNav4) layer.document.images[0].src = "../graphics/true.gif";
-        else eval('document.images._img'+this.lists[i].id+'.src = "../graphics/true.gif"');
-      } else {
-        if(isNav4) layer.document.images[0].src = "../graphics/false.gif";
-        else eval('document.images._img'+this.lists[i].id+'.src = "../graphics/false.gif"');
-      }
-      if(this.lists[i].built)
-        currTop = this.lists[i]._updateList(this.visible && pVis, x, currTop);
-    }
-  }
-  return currTop;
-}
-
-function _updateParent(pid, l) {
-  var layer;
-  if(!l) l = 0;
-  this.pid = pid;
-  this.l = l;
-  for(var i = 0; i < this.types.length; i++)
-    if(this.types[i] == "list")
-      this.lists[i]._updateParent(pid, l+1);
-}
-
-function expand(i) {
-  _mLists[i].visible = !_mLists[i].visible;
-  if(_mLists[i].onexpand != null) _mLists[i].onexpand(_mLists[i].id);
-  _mLists[_mLists[i].pid].rebuild();
-  if(_mLists[i].postexpand != null) _mLists[i].postexpand(_mLists[i].id);
-}
-
-function build(x, y) {
-    alert("got here1");
-
-  this._updateParent(this.id);
-  this._writeList();
-  this._showList();
-  this._updateList(true, x, y);
-  this.x = x; this.y = y;
-}
-
-function rebuild() {
-    this._updateList(true, this.x, this.y);
-}
-
-function addItem(str, bgColor, layer) {
-    var testLayer = false;
-    if(!document.all) document.all = document.layers;
-    if(!layer) {
-       if(isIE4 || !this.parLayer) {
-           alert('document.all.lItem'+_lid);
-           testLayer = eval('document.all.lItem'+_lid);
-       } else {
-           _pLayer = this.parLayer;
-           testLayer = eval('_pLayer.document.layers.lItem'+_lid);
-       }
-       if(testLayer) {
-           layer = testLayer;
-       } else {
-           if(isNav4) {
-               if(this.parLayer) layer = new Layer(this.width, this.parLayer);
-               else layer = new Layer(this.width);
-           } else {
-               return;
-           }
-       }
-    }
-  if(bgColor) layer.oBgColor = bgColor;
-  this.items[this.items.length] = layer;
-  this.types[this.types.length] = "item";
-  this.strs[this.strs.length] = str;
-  _lid++;
-}
-
-function addList(list, str, bgColor, layer) {
-  var testLayer = false;
-  if(!document.all) document.all = document.layers;
-  if(!layer) {
-    if(isIE4 || !this.parLayer) testLayer = eval('document.all.lItem'+_lid);
-    else {
-      _pLayer = this.parLayer;
-      testLayer = eval('_pLayer.document.layers.lItem'+_lid);
-    }
-    if(testLayer) layer = testLayer;
-    else {
-      if(isNav4) {
-        if(this.parLayer) layer = new Layer(this.width, this.parLayer);
-        else layer = new Layer(this.width);
-      } else return;
-    }
-  }
-  if(bgColor) layer.oBgColor = bgColor;
-  this.lists[this.items.length] = list;
-  this.items[this.items.length] = layer;
-  this.types[this.types.length] = "list";
-  this.strs[this.strs.length] = str;
-  list.parent = this;
-  _lid++;
-}
-
index 11cd1babd804480a5146821b22a4330fbe8aac56..9055edef00fdd46b8ced315212fd83945b362413 100644 (file)
@@ -34,6 +34,13 @@ function overlayRefresh() {
     if (overlayIE) {
        overlayLx = document.body.clientWidth;
        overlayLy = document.body.clientHeight;
+
+       if (document.body.parentElement) {
+         // For IE6
+         overlayLx = document.body.parentElement.clientWidth;
+          overlayLy = document.body.parentElement.clientHeight;
+        }
+
        overlayH  = overlayDiv.offsetHeight;
        overlayW  = overlayDiv.offsetWidth;
     } else if (overlayNS4) {
@@ -83,8 +90,11 @@ function overlayRefresh() {
        document.overlayDiv.visibility="visible";
     } else if (overlayNS6) {
        var div = document.getElementById("overlayDiv");
-       div.style.left=overlayX;
-       div.style.top=overlayY+window.pageYOffset;
+       var leftpx = overlayX;
+       var toppx = overlayY+window.pageYOffset;
+
+       div.style.left = leftpx + "px";
+       div.style.top = toppx + "px";
     }
 }
 
@@ -94,7 +104,7 @@ function onad() {
 
 function loopfunc() {
     overlayRefresh();
-    setTimeout('loopfunc()',overlayDelay);
+//    setTimeout('loopfunc()',overlayDelay);
 }
 
 function overlaySetup(corner) {
diff --git a/slides/browser/resize.js b/slides/browser/resize.js
deleted file mode 100644 (file)
index 01dfc1b..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * resize.js 0.3 970811
- * by gary smith
- * js component for "reloading page onResize"
- */
-
-if(!window.saveInnerWidth) {
-  window.onresize = resize;
-  window.saveInnerWidth = window.innerWidth;
-  window.saveInnerHeight = window.innerHeight;
-}
-
-function resize() {
-    if (saveInnerWidth < window.innerWidth || 
-        saveInnerWidth > window.innerWidth || 
-        saveInnerHeight > window.innerHeight || 
-        saveInnerHeight < window.innerHeight ) 
-    {
-        window.history.go(0);
-    }
-}
index a17c1e2fc03208db44037392c54e53d2187fa356..e28360181e20bb5c2e06e316507db3c9501426fb 100644 (file)
@@ -113,3 +113,21 @@ span.navfooter        { font-family: sans-serif;
                       }
 
 /* ====================================================================== */
+
+body.topnavigation       { margin-top: 5px;
+                           margin-left: 10px;
+                           margin-right: 10px;
+                         }
+
+body.foil                { margin-top: 5px;
+                           margin-left: 10px;
+                           margin-right: 10px;
+                         }
+
+body.botnavigation       { margin-top: 0px;
+                           padding-top: 0px;
+                           margin-left: 10px;
+                           margin-right: 10px;
+                         }
+
+/* ====================================================================== */
index e9a9ad8968ff2ea7291690551194e8a1c32afff0..89b706fae6f32aeaca46b82e35a9e29690607c87 100644 (file)
 // -*- Java -*-
+//
+// $Id$
+//
+// Copyright (C) 2002 Norman Walsh
+//
+// You are free to use, modify and distribute this software without limitation.
+// This software is provided "AS IS," without a warranty of any kind.
+//
+// This script assumes that the Netscape 'ua.js' module has also been loaded.
+
+function newPage(filename, overlay) {
+    divs = xbGetElementsByName("DIV");
+
+    if (divs) {
+       var xdiv = divs[0];
+
+       if (xdiv) {
+           var xid = xdiv.getAttribute("id");
+
+           var mytoc = window.top.frames[0];
+           if (mytoc.lastUnderlined) {
+               mytoc.lastUnderlined.style.textDecoration = "none";
+           }
 
-function selectBrowser() {
-    var browserName = navigator.appName;
-    var browserVersion = parseFloat(navigator.appVersion);
-    var userAgent = navigator.userAgent;;
-
-    if (browserName == "Netscape" && browserVersion>=5) {
-       // Netscape 6 is Mozilla 5
-       return "ns6";
-    }
-
-    if (browserName == "Netscape" && browserVersion>=4) {
-       return "ns4";
-    }
-
-    if (browserName == "Microsoft Internet Explorer"
-       && userAgent.indexOf("MSIE 6") > 0) {
-       return "ie6";
-    }
-
-    if (browserName == "Microsoft Internet Explorer"
-       && userAgent.indexOf("MSIE 5") > 0) {
-       return "ie5";
-    }
-
-    return null;
-}
-
-function newPage(filename,overlay) {
-    if (selectBrowser() != "ie5"
-       && selectBrowser() != "ie6") {
-       return;
-    }
-
-    if (overlay != 0) {
-       overlaySetup('ll');
-    }
-
-    var parent = self.parent;
-
-    var gparent = null;
-    if (parent != null) {
-       gparent = parent.parent;
-    }
-
-    var filemap = null;
-    if (gparent != null) {
-       filemap = gparent.filemap;
-    }
+           var tdiv = xbGetElementById(xid, mytoc);
 
-    if (filename == "toc.html") {
-       if (filemap == null) {
-           walk_toc();
-       }
-    } else {
-       if (filemap != null) {
-           var id = filemap[filename];
-           if (id != null) {
-               highlight_toc(id);
+           if (tdiv) {
+               var ta = tdiv.getElementsByTagName("a").item(0);
+               ta.style.textDecoration = "underline";
+               mytoc.lastUnderlined = ta;
            }
        }
     }
-}
-
-function navigate (bk,fw,overlay) {
-    var frame = window;
-    if (frame.name != "foil") {
-       frame = frame.parent;
-    }
-    if (frame.name != "foil") {
-       frame = frame.parent;
-    }
 
-    kc=event.keyCode;
-    // [space] or [Enter] or [n] or [N] for next slide
-    if (((kc==32)||(kc==13)||(kc==110)||(kc==78)) && (fw != "")) {
-       frame.location=fw;
-    }
-
-    // [P] or [p] for previous slide
-    if (((kc==80)||(kc==112)) && (bk != "")) {
-       frame.location=bk;
+    if (overlay != 0) {
+       overlaySetup('lc');
     }
 }
 
-function walk_toc() {
-    var doc = self.document;
-    var filemap = new Array();
-    var fileidx = new Array();
-    var filermap = new Array();
-    var fileridx = new Array();
-    var idx = 0;
-    var sectmap = new Array();
-    var section = "";
-    var title = "";
-
-    var parent = self.parent;
-    var gparent = null;
-    if (parent != null) {
-       gparent = parent.parent;
-    }
 
-    for (var i = 0; i < doc.all.length-2; i++) {
-       var div_elem = doc.all.item(i);
-       var img_elem = doc.all.item(i+1);
-       var a_elem   = doc.all.item(i+2);
-
-       if (img_elem.tagName == "A") {
-           a_elem = img_elem;
-       }
-
-       if (div_elem.tagName == "DIV"
-           && a_elem.tagName == "A") {
-           var id   = div_elem.getAttribute("ID");
-           var file = a_elem.getAttribute("HREF");
-           var pos  = file.lastIndexOf("/");
-           if (pos > 0) {
-               file = file.substring(pos+1);
-           }
+function navigate (evt) {
+    var kc = -1;
 
-           //      if (div_elem.className == "toc-section") {
-           //          section = a_elem.innerText;
-           //      }
-
-           if (div_elem.className == "toc-slidesinfo") {
-               title = a_elem.innerText;
-           }
-
-           if (id != "") {
-               fileidx[idx] = file;
-               fileridx[file] = idx;
-               idx++;
-               filemap[file] = id;
-               filermap[id] = file;
-               sectmap[file] = section;
-           }
-       }
-    }
-
-    // Squirrel this away on the top frame
-    if (gparent != null) {
-       gparent.prestitle = title;
-       gparent.filemap = filemap;
-       gparent.filermap = filermap;
-       gparent.fileidx = fileidx;
-       gparent.fileridx = fileridx;
-       gparent.sectmap = sectmap;
+    if (navigator.org == 'microsoft') {
+       kc = window.event.keyCode;
     } else {
-       alert("Unexpected frame context in slides.js");
+       kc = evt.which;
     }
-}
-
-function highlight_toc(id) {
-    var frame = window.parent.parent.frames("toc");
-    var doc   = frame.document;
-    var div   = null;
 
-    // find the div
-    for (var i = 0; i < doc.all.length; i++) {
-       if (doc.all.item(i).tagName == "DIV") {
-           if (doc.all.item(i).getAttribute("ID") == id) {
-               div = doc.all.item(i);
-               break;
-           }
-       }
-    }
+    var forward = (kc==32) || (kc==13) || (kc==110) || (kc==78);
+    var backward = (kc==80) || (kc==112);
 
-    var a = div.children(0);
-    if (a != null && a.tagName != "A") {
-       a = div.children(1);
-    }
+    var links = xbGetElementsByName("LINK");
+    var count = 0;
+    var target = "";
 
-    if (a != null && a.tagName == "A") {
-       if (frame.lastA != null) {
-           frame.lastA.style.textDecorationUnderline = false;
+    for (count = 0; count < links.length; count++) {
+       if (forward && (links[count].getAttribute("rel") == 'next')) {
+           target = links[count].getAttribute("href");
+       }
+       if (backward && (links[count].getAttribute("rel") == 'previous')) {
+           target = links[count].getAttribute("href");
        }
-       a.style.textDecorationUnderline = true;
-       frame.lastA = a;
-    }
-}
-
-function write_nav(id) {
-    var frame = window.parent.frames("navbar");
-    var doc   = frame.document;
-
-    if (id == null) {
-       id = self.parent.filemap[self.parent.fileidx[0]];
-    }
-
-    var file  = self.parent.filermap[id];
-    var num   = self.parent.fileridx[file];
-    var prev  = null;
-    var next  = null;
-
-    if (num > 0) {
-       prev = self.parent.fileidx[num-1];
-    }
-
-    if (num < self.parent.fileidx.length) {
-       next = self.parent.fileidx[num+1];
-    }
-
-    doc.open();
-    doc.close();
-    doc.write("<html><head>\n");
-    doc.write("<link type='text/css' rel='stylesheet' href='slides.css'>\n");
-    doc.write("<title>nav frame</title>\n");
-    doc.write("</head><body bgcolor='#8399B1'>\n");
-    doc.write("<table width='100%' border=0 cellpadding=0 cellspacing=0>\n");
-    doc.write("<tr>\n");
-    doc.write("<td align=left valign=center width='33%'>");
-    if (prev != null) {
-       doc.write("<a href='" + prev + "' target='foil'>");
-       doc.write("<img src='../graphics/left.png' border='0'>");
-       doc.write("</a>");
-    } else {
-       doc.write("&nbsp;");
-    }
-    doc.write("</td>\n");
-    doc.write("<td align=center valign=bottom width='34%'>");
-    if (num > 0) {
-       doc.write("<span class='navfooter'>Slide " + num + "</span>");
-    } else {
-       doc.write("&nbsp;");
-    }
-    doc.write("</td>\n");
-    doc.write("<td align=right valign=center width='33%'>");
-    if (next) {
-       doc.write("<a href='" + next + "' target='foil'>");
-       doc.write("<img src='../graphics/right.png' border='0'>");
-       doc.write("</a>");
-    } else {
-       doc.write("&nbsp;");
     }
-    doc.write("</td>\n");
-    doc.write("</tr>\n");
-    doc.write("</table>\n");
-    doc.close();
-}
 
-function write_header(file) {
-    var frame = window.parent.frames("header");
-    var doc   = frame.document;
-    var title = self.parent.prestitle;
-    var section  = self.parent.sectmap[file];
-
-    var bgcolor = "#8399B1";
-    var header = title + ": " + section;
-
-    if (file == 'titlefoil.html') {
-      header = "";
+    if (target != "") {
+       window.location = target;
     }
-
-    doc.open();
-    doc.close();
-    doc.write("<html><head>\n");
-    doc.write("<link type='text/css' rel='stylesheet' href='slides.css'>\n");
-    doc.write("<title>header frame</title>\n");
-    doc.write("</head><body bgcolor='" + bgcolor + "'>\n");
-    doc.write("<table width='100%' border=0 cellpadding=0 cellspacing=0>\n");
-    doc.write("<tr>\n");
-    doc.write("<td align=center valign=center width='100%'>");
-    doc.write("<span class=navheader>" + header + "</span>");
-    doc.write("</td>\n");
-    doc.write("</tr>\n");
-    doc.write("</table>\n");
-    doc.close();
 }
-
diff --git a/slides/browser/ua.js b/slides/browser/ua.js
new file mode 100644 (file)
index 0000000..7521294
--- /dev/null
@@ -0,0 +1,113 @@
+/*\r
+ua.js revision 0.200 2001-12-03\r
+\r
+Contributor(s): Bob Clary, Netscape Communications, Copyright 2001\r
+\r
+Netscape grants you a royalty free license to use, modify and \r
+distribute this software provided that this copyright notice \r
+appears on all copies.  This software is provided "AS IS," \r
+without a warranty of any kind.\r
+*/\r
+\r
+function xbDetectBrowser()\r
+{\r
+  var oldOnError = window.onerror;\r
+  var element = null;\r
+\r
+  window.onerror = null;\r
+  \r
+  // work around bug in xpcdom Mozilla 0.9.1\r
+  window.saveNavigator = window.navigator;\r
+\r
+  navigator.OS    = '';\r
+  navigator.version  = parseFloat(navigator.appVersion);\r
+  navigator.org    = '';\r
+  navigator.family  = '';\r
+\r
+  var platform;\r
+  if (typeof(window.navigator.platform) != 'undefined')\r
+  {\r
+    platform = window.navigator.platform.toLowerCase();\r
+    if (platform.indexOf('win') != -1)\r
+      navigator.OS = 'win';\r
+    else if (platform.indexOf('mac') != -1)\r
+      navigator.OS = 'mac';\r
+    else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)\r
+      navigator.OS = 'nix';\r
+  }\r
+\r
+  var i = 0;\r
+  var ua = window.navigator.userAgent.toLowerCase();\r
+  \r
+  if (ua.indexOf('opera') != -1)\r
+  {\r
+    i = ua.indexOf('opera');\r
+    navigator.family  = 'opera';\r
+    navigator.org    = 'opera';\r
+    navigator.version  = parseFloat('0' + ua.substr(i+6), 10);\r
+  }\r
+  else if ((i = ua.indexOf('msie')) != -1)\r
+  {\r
+    navigator.org    = 'microsoft';\r
+    navigator.version  = parseFloat('0' + ua.substr(i+5), 10);\r
+    \r
+    if (navigator.version < 4)\r
+      navigator.family = 'ie3';\r
+    else\r
+      navigator.family = 'ie4'\r
+  }\r
+  else if (ua.indexOf('gecko') != -1)\r
+  {\r
+    navigator.family = 'gecko';\r
+    var rvStart = navigator.userAgent.indexOf('rv:') + 3;\r
+    var rvEnd = navigator.userAgent.indexOf(')', rvStart);\r
+    var rv = navigator.userAgent.substring(rvStart, rvEnd);\r
+    var decIndex = rv.indexOf('.');\r
+    if (decIndex != -1)\r
+    {\r
+      rv = rv.replace(/\./g, '')\r
+      rv = rv.substring(0, decIndex-1) + '.' + rv.substr(decIndex)\r
+    }\r
+    navigator.version = parseFloat(rv);\r
+\r
+    if (ua.indexOf('netscape') != -1)\r
+      navigator.org = 'netscape';\r
+    else if (ua.indexOf('compuserve') != -1)\r
+      navigator.org = 'compuserve';\r
+    else\r
+      navigator.org = 'mozilla';\r
+  }\r
+  else if ((ua.indexOf('mozilla') !=-1) && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera')==-1)&& (ua.indexOf('webtv')==-1) && (ua.indexOf('hotjava')==-1))\r
+  {\r
+    var is_major = parseFloat(navigator.appVersion);\r
+    \r
+    if (is_major < 4)\r
+      navigator.version = is_major;\r
+    else\r
+    {\r
+      i = ua.lastIndexOf('/')\r
+      navigator.version = parseFloat('0' + ua.substr(i+1), 10);\r
+    }\r
+    navigator.org = 'netscape';\r
+    navigator.family = 'nn' + parseInt(navigator.appVersion);\r
+  }\r
+  else if ((i = ua.indexOf('aol')) != -1 )\r
+  {\r
+    // aol\r
+    navigator.family  = 'aol';\r
+    navigator.org    = 'aol';\r
+    navigator.version  = parseFloat('0' + ua.substr(i+4), 10);\r
+  }\r
+  else if ((i = ua.indexOf('hotjava')) != -1 )\r
+  {\r
+    // hotjava\r
+    navigator.family  = 'hotjava';\r
+    navigator.org    = 'sun';\r
+    navigator.version  = parseFloat(navigator.appVersion);\r
+  }\r
+\r
+  window.onerror = oldOnError;\r
+}\r
+\r
+xbDetectBrowser();\r
+\r
diff --git a/slides/browser/xbCollapsibleLists.js b/slides/browser/xbCollapsibleLists.js
new file mode 100644 (file)
index 0000000..6a4f93c
--- /dev/null
@@ -0,0 +1,537 @@
+/*
+xbCollapsibleLists.js 2001-02-26
+
+Contributor(s): Michael Bostock, Netscape Communications, Copyright 1997
+                Bob Clary, Netscape Communications, Copyright 2001
+                Seth Dillingham, Macrobyte Resources, Copyright 2001
+                Mark Filanowicz, Amdahl IT Services, Copyright 2002
+                
+Netscape grants you a royalty free license to use, modify or 
+distribute this software provided that this copyright notice 
+appears on all copies.  This software is provided "AS IS," 
+without a warranty of any kind.
+
+See xbCollapsibleLists.js.changelog.html for details of changes.
+*/
+
+
+var xbcl__id = 0;
+var xbcl_item_id = 0;
+var xbcl_mLists = new Array();
+var xbcl_parentElement = null;
+
+document.lists = xbcl_mLists;
+
+function List(visible, width, height, bgColor, collapsedImageURL, expandedImageURL) 
+{
+  this.lists   = new Array();  // sublists
+  this.items   = new Array();  // layers
+  this.types   = new Array();  // type
+  this.strs    = new Array();  // content
+  this.visible = visible;
+  this.id      = xbcl__id;
+  this.width   = width || 350;
+  this.height  = height || 22;
+  
+  this.collapsedImageURL = collapsedImageURL || 'false.gif';
+  this.expandedImageURL  = expandedImageURL || 'true.gif';
+  
+  if (bgColor) 
+    this.bgColor = bgColor;
+
+  xbcl_mLists[xbcl__id++] = this;
+}
+
+function xbcl_SetFont(i,j) 
+{
+  this.fontIntro = i;
+  this.fontOutro = j;
+}
+
+function xbcl_GetFont() 
+{
+  return [this.fontIntro, this.fontOutro];
+}
+
+function xbcl_setIndent(indent) 
+{ 
+  this.i = indent; 
+  if (this.i < 0) 
+  { 
+    this.i = 0; 
+    this.space = false; 
+  }
+  else
+    this.space = true;
+}
+
+function xbcl_getIndent(indent)
+{
+  return this.i;
+}
+
+function xbcl_writeItemDOMHTML( obj, s, flList, listObj )
+{
+  var styleObj;
+  var outerDiv, innerLeft, innerRight;
+  var str;
+  var leftEdge = 0;
+  
+  styleObj = new xbStyle(obj);
+  styleObj.setVisibility('hidden');
+  outerDiv = document.createElement( "DIV" );
+  outerDiv.id = "DIV_" + obj.id;
+  styleObj = new xbStyle( outerDiv );
+  styleObj.setWidth( this.width );
+  
+  if ( flList )
+  {
+    innerLeft = document.createElement( "DIV" );
+    innerLeft.style.position = "absolute";
+    innerLeft.style.valign = "middle";
+    leftEdge = 15;
+    
+    styleObj = new xbStyle( innerLeft );
+    styleObj.setWidth( 15 );
+    styleObj.setBackgroundColor( "transparent" );
+    
+    if ( listObj.visible )
+      str = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>';
+    else
+      str = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>';
+    
+    innerLeft.innerHTML = str;
+    outerDiv.appendChild( innerLeft );
+  }
+  else if ( this.space )
+    leftEdge = 15;
+  
+  innerRight = document.createElement( "DIV" );
+  innerRight.noWrap = true;
+  innerRight.style.position = "absolute";
+  
+  styleObj = new xbStyle( innerRight );
+  styleObj.setLeft( leftEdge + ( this.l * this.i ) );
+  styleObj.setWidth( this.width - 15 - this.l * this.i );
+  styleObj.setBackgroundColor( "transparent" );
+  
+  // start of change by Mark Filanowicz  02-22-2002
+  if ( flList ) 
+       {
+         s = this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro;
+       }
+       else
+       {
+  s = this.fontIntro + s + this.fontOutro;
+       }
+  // end of change by Mark Filanowicz  02-22-2002
+  
+  
+  innerRight.innerHTML = s;
+  outerDiv.appendChild( innerRight );
+
+  obj.appendChild( outerDiv );
+  
+  return;
+}
+
+function xbcl_writeItem( obj, s, flList, listObj )
+{
+  var cellStyle = '';
+  var str = '';
+  var styleObj = new xbStyle( obj );
+  
+  styleObj.setVisibility( 'hidden' );
+  
+  if ( document.body && document.body.style )
+    cellStyle = ' style="background-color: transparent;"';
+  
+  str += '<TABLE WIDTH='+this.width+' NOWRAP BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>';
+
+  if ( flList ) 
+  {
+    str += '<TD WIDTH="15" NOWRAP VALIGN="MIDDLE"' + cellStyle + '>';
+    str += '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');">';
+    
+    if ( listObj.visible )
+      str += '<IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' +  listObj.id + '" NAME="_img' + listObj.id + '">';
+    else
+      str += '<IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' +  listObj.id + '" NAME="_img' + listObj.id + '">';
+    
+    str += '</A></TD>';
+  } 
+  else if (this.space)
+    str += '<TD WIDTH="15" NOWRAP' + cellStyle + '>&nbsp;</TD>';
+  
+  if (this.l>0 && this.i>0) 
+    str += '<TD WIDTH="' + this.l*this.i+ '" NOWRAP' + cellStyle + '>&nbsp;</TD>';
+
+  str += '<TD HEIGHT="' + ( this.height - 3) + '" WIDTH="' + ( this.width - 15 - this.l * this.i ) + '" VALIGN="MIDDLE" ALIGN="LEFT"' + cellStyle + '>';
+  
+  // start of change by Mark Filanowicz  02-22-2002
+  if ( flList ) 
+       {
+         str += this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro;
+       }
+       else
+       {
+  str += this.fontIntro + s + this.fontOutro;
+       }
+  // end of change by Mark Filanowicz  02-22-2002
+  
+  str += '</TD></TR></TABLE>';
+  
+  styleObj.setInnerHTML( str );
+  
+  return;
+}
+
+function xbcl_writeList()
+{
+  var item;
+  var i;
+  var flList;
+  
+  for ( i = 0; i < this.types.length; i++ )
+  {
+    item = this.items[ i ];
+    flList = ( this.types[ i ] == 'list' );
+    
+    this._writeItem( item, this.strs[ i ], flList, this.lists[ i ] );
+    
+    if ( flList && this.lists[ i ].visible )
+      this.lists[ i ]._writeList();
+  }
+  
+  this.built = true;
+  this.needsRewrite = false;
+  self.status = '';
+}
+
+function xbcl_showList() 
+{
+  var item;
+  var styleObj;
+  var i;
+
+  for (i = 0; i < this.types.length; i++) 
+  { 
+    item = this.items[i];
+    styleObj = new xbStyle(item);
+    styleObj.setClipLeft(0);
+    styleObj.setClipRight(this.width);
+    styleObj.setClipTop(0);
+    if (item.height)
+    {
+      styleObj.setClipBottom(item.height);
+      styleObj.setHeight(item.height);
+    }
+    else
+    {
+      styleObj.setClipBottom(this.height);
+      styleObj.setHeight(this.height);
+    }
+    
+    if ( this.visible )
+      styleObj.setVisibility( 'visible' );
+
+    var bg = item.oBgColor || this.bgColor;
+    if ((bg == null) || (bg == 'null')) 
+      bg = '';
+
+    styleObj.setBackgroundColor(bg);
+
+    if (this.types[i] == 'list' && this.lists[i].visible)
+      this.lists[i]._showList();
+  }
+  this.shown = true;
+  this.needsUpdate = false;
+}
+
+function xbcl_setImage(list, item, file)
+{
+  var id = '_img' + list.id;
+  var img = null;
+  
+  // for DOMHTML or IE4 use cross browser getElementById from xbStyle
+  // can't use it for NN4 since it only works for layers in NN4
+  if (document.layers) 
+    img = item.document.images[0];
+  else 
+    img = xbGetElementById(id);
+    
+  if (img)
+    img.src = file;
+}
+
+function xbcl_getHeight() 
+{
+  var totalHeight = 0;
+  var i;
+  
+  if (!this.visible)
+    return 0;
+  
+  for (i = 0; i < this.types.length; i++) 
+  {
+    if (this.items[i].height)
+      totalHeight += this.items[i].height;
+    else
+      totalHeight += this.height;
+    
+    if ((this.types[i] == 'list') && this.lists[i].visible)
+    {
+      totalHeight += this.lists[i].getHeight();
+    }
+  }
+  
+  return totalHeight;
+}
+
+function xbcl_updateList(pVis, x, y) 
+{
+  var currTop = y; 
+  var item;
+  var styleObj;
+  var i;
+
+  for (i = 0; i < this.types.length; i++) 
+  { 
+    item = this.items[i];
+    styleObj = new xbStyle(item);
+
+    if (this.visible && pVis) 
+    {
+      styleObj.moveTo(x, currTop);
+      if (item.height)  // allow custom heights for each item
+        currTop += item.height;
+      else
+        currTop += this.height;
+      
+      styleObj.setVisibility('visible');
+    } 
+    else 
+    {
+      styleObj.setVisibility('hidden');
+    }
+
+    if (this.types[i] == 'list') 
+    {
+      if (this.lists[i].visible) 
+      {
+        if (!this.lists[i].built || this.lists[i].needsRewrite) 
+          this.lists[i]._writeList();
+
+        if (!this.lists[i].shown || this.lists[i].needsUpdate) 
+          this.lists[i]._showList();
+
+        xbcl_setImage(this.lists[i], item, this.expandedImageURL );
+      } 
+      else 
+        xbcl_setImage(this.lists[i], item, this.collapsedImageURL );
+
+      if (this.lists[i].built)
+        currTop = this.lists[i]._updateList(this.visible && pVis, x, currTop);
+    }
+  }
+  return currTop;
+}
+
+function xbcl_updateParent( pid, l ) 
+{
+  var i;
+
+  if ( !l ) 
+    l = 0;
+
+  this.pid = pid;
+  this.l = l;
+
+  for ( i = 0; i < this.types.length; i++ )
+  {
+    if ( this.types[ i ] == 'list' )
+    {
+      this.lists[ i ]._updateParent( pid, l + 1 );
+    }
+  }
+}
+
+function xbcl_expand(i) 
+{
+  xbcl_mLists[i].visible = !xbcl_mLists[i].visible;
+
+  if (xbcl_mLists[i].onexpand != null) 
+    xbcl_mLists[i].onexpand(xbcl_mLists[i].id);
+
+  xbcl_mLists[xbcl_mLists[i].pid].rebuild();
+
+  if (xbcl_mLists[i].postexpand != null) 
+    xbcl_mLists[i].postexpand(xbcl_mLists[i].id);
+}
+
+function xbcl_build(x, y) 
+{
+  this._updateParent(this.id);
+  this._writeList();
+  this._showList();
+  this._updateList(true, x, y);
+  this.x = x; 
+  this.y = y;
+}
+
+function xbcl_rebuild() 
+{ 
+  this._updateList(true, this.x, this.y); 
+}
+
+function xbcl_getNewItem()
+{
+  var newItem = null;
+
+  newItem = xbGetElementById('lItem' + xbcl_item_id);
+
+  if (!newItem) 
+  {
+    if (document.all && !document.getElementById)
+    {
+      var parentElement = this.parentElement;
+      if (!parentElement)
+        parentElement = document.body;
+        
+      parentElement.insertAdjacentHTML('beforeEnd', '<div id="lItem' + xbcl_item_id + '" style="position:absolute;"></div>');
+      newItem = xbGetElementById('lItem' + xbcl_item_id);
+    }
+    else if (document.layers)
+    {
+      if (this.parentElement)
+        newItem = new Layer(this.width, this.parentElement);
+      else
+        newItem = new Layer(this.width);
+    }
+    else if (document.createElement)
+    {
+      newItem = document.createElement('div');
+      newItem.id= 'lItem' + xbcl_item_id;
+      newItem.style.position = 'absolute';
+
+      if (this.parentElement)
+        this.parentElement.appendChild(newItem);
+      else 
+        document.body.appendChild(newItem);
+    }
+  }
+
+  return newItem;
+}
+
+function xbcl_addItem(str, bgColor, item) 
+{
+  if (!item) 
+    item = this._getNewItem();
+  
+  if (!item)
+    return;
+
+  if (bgColor) 
+    item.oBgColor = bgColor;
+
+  this.items[this.items.length] = item;
+  this.types[this.types.length] = 'item';
+  this.strs[this.strs.length] = str;
+  ++xbcl_item_id;
+  
+  if ( this.built )
+  {
+    this._writeItem( item, str, false );
+    xbcl_mLists[this.pid].rebuild();
+    if ( this.visible )
+      this._showList();
+    else
+      this.needsUpdate = true;
+  }
+  
+  return item;
+}
+
+function xbcl_addList(list, str, bgColor, item) 
+{
+  if (!item) 
+    item = this._getNewItem();
+
+  if (!item)
+    return;
+
+  if (bgColor) 
+    item.oBgColor = bgColor;
+
+  this.lists[this.items.length] = list;
+  this.items[this.items.length] = item;
+  this.types[this.types.length] = 'list';
+  this.strs[this.strs.length] = str;
+  ++xbcl_item_id;
+  
+  list.parentList = this;
+  
+  list.pid = this.pid;
+  list.l = this.l + 1;
+  
+  if ( this.built )
+  {
+    this._writeItem( item, str, true, list );
+    xbcl_mLists[ this.pid ].rebuild();
+    if ( this.visible )
+      this._showList();
+    else
+      this.needsUpdate = true;
+  }
+  
+  return item;
+}
+
+List.prototype.setIndent     = xbcl_setIndent;
+List.prototype.getIndent     = xbcl_getIndent;
+List.prototype.addItem       = xbcl_addItem;
+List.prototype.addList       = xbcl_addList;
+List.prototype.build         = xbcl_build;
+List.prototype.rebuild       = xbcl_rebuild;
+List.prototype.setFont       = xbcl_SetFont;
+List.prototype.getFont       = xbcl_GetFont;
+List.prototype.getHeight     = xbcl_getHeight;
+
+List.prototype._writeList    = xbcl_writeList;
+List.prototype._getNewItem   = xbcl_getNewItem;
+
+if ( document.getElementById && document.createElement )
+  List.prototype._writeItem  = xbcl_writeItemDOMHTML;
+else
+  List.prototype._writeItem  = xbcl_writeItem;
+
+List.prototype._showList     = xbcl_showList;
+List.prototype._updateList   = xbcl_updateList;
+List.prototype._updateParent = xbcl_updateParent;
+
+List.prototype.onexpand      = null;
+List.prototype.postexpand    = null;
+List.prototype.lists         = null;  // sublists
+List.prototype.items         = null;  // layers
+List.prototype.types         = null;  // type
+List.prototype.strs          = null;  // content
+List.prototype.x             = 0;
+List.prototype.y             = 0;
+List.prototype.visible       = false;
+List.prototype.id            = -1;
+List.prototype.i             = 18;
+List.prototype.space         = true;
+List.prototype.pid           = 0;
+List.prototype.fontIntro     = '';
+List.prototype.fontOutro     = '';
+List.prototype.width         = 350;
+List.prototype.height        = 22;
+List.prototype.built         = false;
+List.prototype.shown         = false;
+List.prototype.needsUpdate   = false;
+List.prototype.needsRewrite  = false;
+List.prototype.l             = 0;
+List.prototype.bgColor       = null;
+List.prototype.parentList    = null;
+List.prototype.parentElement = null;
diff --git a/slides/browser/xbDOM.js b/slides/browser/xbDOM.js
new file mode 100644 (file)
index 0000000..d1a3ab3
--- /dev/null
@@ -0,0 +1,293 @@
+/*\r
+xbDOM.js v 0.004 2002-03-09\r
+\r
+Contributor(s): Bob Clary, Netscape Communications, Copyright 2001, 2002\r
+\r
+Netscape grants you a royalty free license to use, modify and \r
+distribute this software provided that this copyright notice \r
+appears on all copies.  This software is provided "AS IS," \r
+without a warranty of any kind.\r
+\r
+Change Log: \r
+\r
+2002-03-15: v 0.004\r
+  bclary -\r
+    fix bug in bugfix for 0.003 in xbGetElementsByName \r
+    to not confuse elements with length properties with arrays\r
+\r
+2002-03-09: v 0.003\r
+  bclary -\r
+    fix bug in xbGetElementsByName in Internet Explorer when there is\r
+    only one instance of an element with name value.\r
+\r
+2002-01-19: v 0.002\r
+  bclary - \r
+    nav4FindElementsByName\r
+      removed erroneous obj and return\r
+      added search of form elements\r
+    xbFindElementsByNameAndType\r
+      renamed from FindElementsByNameAndType\r
+      removed erroneouse obj and return\r
+    xbSetInnerHTML\r
+      ported over from xbStyle since it is more\r
+      appropriate here.\r
+\r
+2001-11-27: v 0.01\r
+  bclary - \r
+    removed from xbStyle\r
+*/\r
+\r
+function xbToInt(s)\r
+{\r
+  var i = parseInt(s, 10);\r
+  if (isNaN(i))\r
+    i = 0;\r
+\r
+  return i;\r
+}\r
+\r
+function xbGetWindowWidth(windowRef)\r
+{\r
+  var width = 0;\r
+\r
+  if (!windowRef)\r
+    windowRef = window;\r
+  \r
+  if (typeof(windowRef.innerWidth) == 'number')\r
+    width = windowRef.innerWidth;\r
+  else if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')\r
+    width = windowRef.document.body.clientWidth;  \r
+    \r
+  return width;\r
+}\r
+\r
+function xbGetWindowHeight(windowRef)\r
+{\r
+  var height = 0;\r
+  \r
+  if (!windowRef)\r
+    windowRef = window;\r
+\r
+  if (typeof(windowRef.innerWidth) == 'number')\r
+    height = windowRef.innerHeight;\r
+  else if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')\r
+    height = windowRef.document.body.clientHeight;    \r
+\r
+  return height;\r
+}\r
+\r
+function nav4FindLayer(doc, id)\r
+{\r
+  var i;\r
+  var subdoc;\r
+  var obj;\r
+  \r
+  for (i = 0; i < doc.layers.length; ++i)\r
+  {\r
+    if (doc.layers[i].id && id == doc.layers[i].id)\r
+      return doc.layers[i];\r
+      \r
+    subdoc = doc.layers[i].document;\r
+    obj    = nav4FindLayer(subdoc, id);\r
+    if (obj != null)\r
+      return obj;\r
+  }\r
+  return null;\r
+}\r
+\r
+function nav4FindElementsByName(doc, name, elmlist)\r
+{\r
+  var i;\r
+  var j;\r
+  var subdoc;\r
+\r
+  for (i = 0; i < doc.images.length; ++i)\r
+  {\r
+    if (doc.images[i].name && name == doc.images[i].name)\r
+      elmlist[elmlist.length] = doc.images[i];\r
+  }\r
+\r
+  for (i = 0; i < doc.forms.length; ++i)\r
+  {\r
+    for (j = 0; j < doc.forms[i].elements.length; j++)\r
+      if (doc.forms[i].elements[j].name && name == doc.forms[i].elements[j].name)\r
+        elmlist[elmlist.length] = doc.forms[i].elements[j];\r
+\r
+    if (doc.forms[i].name && name == doc.forms[i].name)\r
+      elmlist[elmlist.length] = doc.forms[i];\r
+  }\r
+\r
+  for (i = 0; i < doc.anchors.length; ++i)\r
+  {\r
+    if (doc.anchors[i].name && name == doc.anchors[i].name)\r
+      elmlist[elmlist.length] = doc.anchors[i];\r
+  }\r
+\r
+  for (i = 0; i < doc.links.length; ++i)\r
+  {\r
+    if (doc.links[i].name && name == doc.links[i].name)\r
+      elmlist[elmlist.length] = doc.links[i];\r
+  }\r
+\r
+  for (i = 0; i < doc.applets.length; ++i)\r
+  {\r
+    if (doc.applets[i].name && name == doc.applets[i].name)\r
+      elmlist[elmlist.length] = doc.applets[i];\r
+  }\r
+\r
+  for (i = 0; i < doc.embeds.length; ++i)\r
+  {\r
+    if (doc.embeds[i].name && name == doc.embeds[i].name)\r
+      elmlist[elmlist.length] = doc.embeds[i];\r
+  }\r
+\r
+  for (i = 0; i < doc.layers.length; ++i)\r
+  {\r
+    if (doc.layers[i].name && name == doc.layers[i].name)\r
+      elmlist[elmlist.length] = doc.layers[i];\r
+      \r
+    subdoc = doc.layers[i].document;\r
+    nav4FindElementsByName(subdoc, name, elmlist);\r
+  }\r
+}\r
+\r
+function xbGetElementsByNameAndType(name, type, windowRef)\r
+{\r
+  if (!windowRef)\r
+    windowRef = window;\r
+\r
+  var elmlist = new Array();\r
+\r
+  xbFindElementsByNameAndType(windowRef.document, name, type, elmlist);\r
+\r
+  return elmlist;\r
+}\r
+\r
+function xbFindElementsByNameAndType(doc, name, type, elmlist)\r
+{\r
+  var i;\r
+  var subdoc;\r
+  \r
+  for (i = 0; i < doc[type].length; ++i)\r
+  {\r
+    if (doc[type][i].name && name == doc[type][i].name)\r
+      elmlist[elmlist.length] = doc[type][i];\r
+  }\r
+\r
+  if (doc.layers)\r
+  {\r
+    for (i = 0; i < doc.layers.length; ++i)\r
+    {\r
+      subdoc = doc.layers[i].document;\r
+      xbFindElementsByNameAndType(subdoc, name, type, elmlist);\r
+    }\r
+  }\r
+}\r
+\r
+//alert("layers: " + document.layers + " all: " + document.all);\r
+\r
+if (document.layers)\r
+{\r
+  xbGetElementById = function (id, windowRef)\r
+  {\r
+    if (!windowRef)\r
+      windowRef = window;\r
+\r
+    return nav4FindLayer(windowRef.document, id);\r
+  };\r
+\r
+  xbGetElementsByName = function (name, windowRef)\r
+  {\r
+    if (!windowRef)\r
+      windowRef = window;\r
+\r
+    var elmlist = new Array();\r
+\r
+    nav4FindElementsByName(windowRef.document, name, elmlist);\r
+\r
+    return elmlist;\r
+  };\r
+\r
+}\r
+else if (document.all)\r
+{\r
+  xbGetElementById = function (id, windowRef)\r
+  {\r
+    if (!windowRef) windowRef = window;\r
+    var elm = windowRef.document.all[id];\r
+    if (!elm) elm = null;\r
+    return elm;\r
+  };\r
+\r
+  xbGetElementsByName = function (name, windowRef)\r
+  {\r
+    if (!windowRef) windowRef = window; \r
+\r
+    var i;\r
+    var idnamelist = windowRef.document.all.tags(name);\r
+    var elmlist = new Array();\r
+\r
+    if (!idnamelist) {\r
+      return null;\r
+    }\r
+\r
+    if (!idnamelist.length || idnamelist.name == name)\r
+    {\r
+      if (idnamelist)\r
+        elmlist[elmlist.length] = idnamelist;\r
+    }\r
+    else\r
+    {\r
+      for (i = 0; i < idnamelist.length; i++)\r
+      {\r
+        if (idnamelist.item(i).tagName == name)\r
+          elmlist[elmlist.length] = idnamelist[i];\r
+      }\r
+    }\r
+\r
+    return elmlist;\r
+  }\r
+\r
+}\r
+else if (document.getElementById)\r
+{\r
+  xbGetElementById = function (id, windowRef) { if (!windowRef) windowRef = window; return windowRef.document.getElementById(id); };\r
+  xbGetElementsByName = function (name, windowRef) { if (!windowRef) windowRef = window; return windowRef.document.getElementsByTagName(name); };\r
+}\r
+else \r
+{\r
+  xbGetElementById = function (id, windowRef) { return null; }\r
+  xbGetElementsByName = function (name, windowRef) { return new Array(); }\r
+}\r
+\r
+if (typeof(window.pageXOffset) == 'number')\r
+{\r
+  xbGetPageScrollX = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.pageXOffset; };\r
+  xbGetPageScrollY = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.pageYOffset; };\r
+}\r
+else if (document.all)\r
+{\r
+  xbGetPageScrollX = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.document.body.scrollLeft; };\r
+  xbGetPageScrollY = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.document.body.scrollTop; };\r
+}\r
+else\r
+{\r
+  xbGetPageScrollX = function (windowRef) { return 0; };\r
+  xbGetPageScrollY = function (windowRef) { return 0; };\r
+}\r
+\r
+if (document.layers)\r
+{\r
+  xbSetInnerHTML = function (element, str) { element.document.write(str); element.document.close(); };\r
+}\r
+else if (document.all || document.getElementById)\r
+{\r
+  xbSetInnerHTML = function (element, str) { if (typeof(element.innerHTML) != 'undefined') element.innerHTML = str; };\r
+}\r
+else\r
+{\r
+  xbSetInnerHTML = function (element, str) {};\r
+}\r
+\r
+\r
+// eof: xbDOM.js\r
diff --git a/slides/browser/xbDebug.js b/slides/browser/xbDebug.js
new file mode 100644 (file)
index 0000000..000f8c7
--- /dev/null
@@ -0,0 +1,223 @@
+/*\r
+xbDebug.js revision: 0.003 2002-02-26\r
+\r
+Contributor(s): Bob Clary, Netscape Communications, Copyright 2001\r
+\r
+Netscape grants you a royalty free license to use, modify and \r
+distribute this software provided that this copyright notice \r
+appears on all copies.  This software is provided "AS IS," \r
+without a warranty of any kind.\r
+\r
+ChangeLog:\r
+\r
+2002-02-25: bclary - modified xbDebugTraceOject to make sure \r
+            that original versions of wrapped functions were not\r
+            rewrapped. This had caused an infinite loop in IE.\r
+\r
+2002-02-07: bclary - modified xbDebug.prototype.close to not null\r
+            the debug window reference. This can cause problems with\r
+           Internet Explorer if the page is refreshed. These issues will\r
+           be addressed at a later date.\r
+*/\r
+\r
+function xbDebug()\r
+{\r
+  this.on = false;\r
+  this.stack = new Array();\r
+  this.debugwindow = null;\r
+  this.execprofile = new Object();\r
+}\r
+\r
+xbDebug.prototype.push = function ()\r
+{\r
+  this.stack[this.stack.length] = this.on;\r
+  this.on = true;\r
+}\r
+\r
+xbDebug.prototype.pop = function ()\r
+{\r
+  this.on = this.stack[this.stack.length - 1];\r
+  --this.stack.length;\r
+}\r
+\r
+xbDebug.prototype.open =  function ()\r
+{\r
+  if (this.debugwindow && !this.debugwindow.closed)\r
+    this.close();\r
+    \r
+  this.debugwindow = window.open('about:blank', 'DEBUGWINDOW', 'height=400,width=600,resizable=yes,scrollbars=yes');\r
+\r
+  this.debugwindow.title = 'xbDebug Window';\r
+  this.debugwindow.document.write('<html><head><title>xbDebug Window</title></head><body><h3>Javascript Debug Window</h3></body></html>');\r
+  this.debugwindow.focus();\r
+}\r
+\r
+xbDebug.prototype.close = function ()\r
+{\r
+  if (!this.debugwindow)\r
+    return;\r
+    \r
+  if (!this.debugwindow.closed)\r
+    this.debugwindow.close();\r
+\r
+  // bc 2002-02-07, other windows may still hold a reference to this: this.debugwindow = null;\r
+}\r
+\r
+xbDebug.prototype.dump = function (msg)\r
+{\r
+  if (!this.on)\r
+    return;\r
+    \r
+  if (!this.debugwindow || this.debugwindow.closed)\r
+    this.open();\r
+    \r
+  this.debugwindow.document.write(msg + '<br>');\r
+  \r
+  return;\r
+}\r
+\r
+var xbDEBUG = new xbDebug();\r
+\r
+window.onunload = function () { xbDEBUG.close(); }\r
+\r
+function xbDebugGetFunctionName(funcref)\r
+{\r
+\r
+  if (funcref.name)\r
+    return funcref.name;\r
+\r
+  var name = funcref + '';\r
+  name = name.substring(name.indexOf(' ') + 1, name.indexOf('('));\r
+  funcref.name = name;\r
+\r
+  return name;\r
+}\r
+\r
+function xbDebugCreateFunctionWrapper(scopename, funcname, precall, postcall)\r
+{\r
+  var wrappedfunc;\r
+  var scopeobject = eval(scopename);\r
+  var funcref = scopeobject[funcname];\r
+\r
+  scopeobject['xbDebug_orig_' + funcname] = funcref;\r
+\r
+  wrappedfunc = function () \r
+  {\r
+    precall(scopename, funcname, arguments);\r
+    var rv = funcref.apply(this, arguments);\r
+    postcall(scopename, funcname, arguments, rv);\r
+    return rv;\r
+  };\r
+\r
+  if (typeof(funcref.constructor) != 'undefined')\r
+    wrappedfunc.constructor = funcref.constuctor;\r
+\r
+  if (typeof(funcref.prototype) != 'undefined')\r
+    wrappedfunc.prototype = funcref.prototype;\r
+\r
+  scopeobject[funcname] = wrappedfunc;\r
+}\r
+\r
+function xbDebugPersistToString(obj)\r
+{\r
+  var s = '';\r
+  var p;\r
+\r
+  if (obj == null)\r
+     return 'null';\r
+\r
+  switch(typeof(obj))\r
+  {\r
+    case 'number':\r
+       return obj;\r
+    case 'string':\r
+       return '"' + obj + '"';\r
+    case 'undefined':\r
+       return 'undefined';\r
+    case 'boolean':\r
+       return obj + '';\r
+  }\r
+\r
+  return '[' + xbDebugGetFunctionName(obj.constructor) + ']';\r
+}\r
+\r
+function xbDebugTraceBefore(scopename, funcname, funcarguments) \r
+{\r
+  var i;\r
+  var s = '';\r
+  var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname];\r
+  if (!execprofile)\r
+    execprofile = xbDEBUG.execprofile[scopename + '.' + funcname] = { started: 0, time: 0, count: 0 };\r
+\r
+  for (i = 0; i < funcarguments.length; i++)\r
+  {\r
+    s += xbDebugPersistToString(funcarguments[i]);\r
+    if (i < funcarguments.length - 1)\r
+      s += ', ';\r
+  }\r
+\r
+  xbDEBUG.dump('enter ' + scopename + '.' + funcname + '(' + s + ')');\r
+  execprofile.started = (new Date()).getTime();\r
+}\r
+\r
+function xbDebugTraceAfter(scopename, funcname, funcarguments, rv) \r
+{\r
+  var i;\r
+  var s = '';\r
+  var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname];\r
+  if (!execprofile)\r
+    xbDEBUG.dump('xbDebugTraceAfter: execprofile not created for ' + scopename + '.' + funcname);\r
+  else if (execprofile.started == 0)\r
+    xbDEBUG.dump('xbDebugTraceAfter: execprofile.started == 0 for ' + scopename + '.' + funcname);\r
+  else \r
+  {\r
+    execprofile.time += (new Date()).getTime() - execprofile.started;\r
+    execprofile.count++;\r
+    execprofile.started = 0;\r
+  }\r
+\r
+  for (i = 0; i < funcarguments.length; i++)\r
+  {\r
+    s += xbDebugPersistToString(funcarguments[i]);\r
+    if (i < funcarguments.length - 1)\r
+      s += ', ';\r
+  }\r
+\r
+  xbDEBUG.dump('exit  ' + scopename + '.' + funcname + '(' + s + ')==' + xbDebugPersistToString(rv));\r
+}\r
+\r
+function xbDebugTraceFunction(scopename, funcname)\r
+{\r
+  xbDebugCreateFunctionWrapper(scopename, funcname, xbDebugTraceBefore, xbDebugTraceAfter);\r
+}\r
+\r
+function xbDebugTraceObject(scopename, objname)\r
+{\r
+  var objref = eval(scopename + '.' + objname);\r
+  var p;\r
+\r
+  if (!objref || !objref.prototype)\r
+     return;\r
+\r
+  for (p in objref.prototype)\r
+  {\r
+    if (typeof(objref.prototype[p]) == 'function' && (p+'').indexOf('xbDebug_orig') == -1)\r
+    {\r
+      xbDebugCreateFunctionWrapper(scopename + '.' + objname + '.prototype', p + '', xbDebugTraceBefore, xbDebugTraceAfter);\r
+    }\r
+  }\r
+}\r
+\r
+function xbDebugDumpProfile()\r
+{\r
+  var p;\r
+  var execprofile;\r
+  var avg;\r
+\r
+  for (p in xbDEBUG.execprofile)\r
+  {\r
+    execprofile = xbDEBUG.execprofile[p];\r
+    avg = Math.round ( 100 * execprofile.time/execprofile.count) /100;\r
+    xbDEBUG.dump('Execution profile ' + p + ' called ' + execprofile.count + ' times. Total time=' + execprofile.time + 'ms. Avg Time=' + avg + 'ms.');\r
+  }\r
+}\r
diff --git a/slides/browser/xbStyle.js b/slides/browser/xbStyle.js
new file mode 100644 (file)
index 0000000..6a48985
--- /dev/null
@@ -0,0 +1,1349 @@
+/*\r
+xbStyle.js Revision: 0.202 2002-02-11\r
+\r
+Contributor(s): Bob Clary, Original Work, Copyright 2000\r
+                Bob Clary, Netscape Communications, Copyright 2001\r
+\r
+Netscape grants you a royalty free license to use, modify and \r
+distribute this software provided that this copyright notice \r
+appears on all copies.  This software is provided "AS IS," \r
+without a warranty of any kind.\r
+\r
+Change Log:\r
+\r
+2001-07-19: bclary - fixed function cssStyleGetLeft() and cssStyleGetTop() to \r
+            correctly handle the case where the initial style.left/style.top\r
+            are not initialized. This fixes positioning for relatively positioned\r
+            DIVS and as a result fixes behavior for ILAYERs exposed as relatively\r
+            positioned divs.\r
+2001-10-02: bclary - added missing xbClipRect.getHeight/setHeight methods.\r
+\r
+2001-11-20: bclary - removed use of practical browser sniffer, \r
+            added object sniffing, and limited support for opera\r
+            note opera returns ints for HTMLElement.style.[left|top|height|width] etc.\r
+\r
+2002-02-11: v 0.201 bclary - with the help of Rob Johnston <rob_johnston@hotmail.com>\r
+            found that the "if (document.getElementsByName)" test excluded\r
+            IE4. Added a test for document.all to enable IE4 to fully use \r
+            xbStyle.\r
+\r
+2002-03-12: v 0.202 Daniel Resare contributed a patch to cssStyleSetPage[X|Y]() which\r
+            handles the case where the element has no parentNode.\r
+*/\r
+\r
+function xbStyleNotSupported() {}\r
+\r
+function xbStyleNotSupportStringValue(propname) { xbDEBUG.dump(propname + ' is not supported in this browser'); return '';};\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbClipRect\r
+\r
+function xbClipRect(a1, a2, a3, a4)\r
+{\r
+  this.top  = 0;\r
+  this.right  = 0;\r
+  this.bottom  = 0;\r
+  this.left  = 0;\r
+\r
+  if (typeof(a1) == 'string')\r
+  {\r
+    var val;\r
+    var ca;\r
+    var i;\r
+      \r
+    if (a1.indexOf('rect(') == 0)\r
+    {\r
+      // I would have preferred [0-9]+[a-zA-Z]+ for a regexp\r
+      // but NN4 returns null for that. \r
+      ca = a1.substring(5, a1.length-1).match(/-?[0-9a-zA-Z]+/g);\r
+      for (i = 0; i < 4; ++i)\r
+      {\r
+        val = xbToInt(ca[i]);\r
+        if (val != 0 && ca[i].indexOf('px') == -1)\r
+        {\r
+          xbDEBUG.dump('xbClipRect: A clipping region ' + a1 + ' was detected that did not use pixels as units.  Click Ok to continue, Cancel to Abort');\r
+          return;\r
+        }\r
+        ca[i] = val;\r
+      }\r
+      this.top    = ca[0];\r
+      this.right  = ca[1];\r
+      this.bottom = ca[2];\r
+      this.left   = ca[3];\r
+    }\r
+  }    \r
+  else if (typeof(a1) == 'number' && typeof(a2) == 'number' && typeof(a3) == 'number' && typeof(a4) == 'number')\r
+  {\r
+    this.top    = a1;\r
+    this.right  = a2;\r
+    this.bottom = a3;\r
+    this.left   = a4;\r
+  }\r
+}\r
+\r
+xbClipRect.prototype.top = 0;\r
+xbClipRect.prototype.right = 0;\r
+xbClipRect.prototype.bottom = 0;\r
+xbClipRect.prototype.left = 0;\r
+\r
+\r
+function xbClipRectGetWidth()\r
+{\r
+    return this.right - this.left;\r
+}\r
+xbClipRect.prototype.getWidth = xbClipRectGetWidth; \r
+\r
+function xbClipRectSetWidth(width)\r
+{\r
+  this.right = this.left + width;\r
+}\r
+xbClipRect.prototype.setWidth = xbClipRectSetWidth;\r
+\r
+function xbClipRectGetHeight()\r
+{\r
+    return this.bottom - this.top;\r
+}\r
+xbClipRect.prototype.getHeight = xbClipRectGetHeight; \r
+\r
+function xbClipRectSetHeight(height)\r
+{\r
+  this.bottom = this.top + height;\r
+}\r
+xbClipRect.prototype.setHeight = xbClipRectSetHeight;\r
+\r
+function xbClipRectToString()\r
+{\r
+  return 'rect(' + this.top + 'px ' + this.right + 'px ' + this.bottom + 'px ' + this.left + 'px )' ;\r
+}\r
+xbClipRect.prototype.toString = xbClipRectToString;\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle\r
+//\r
+// Note Opera violates the standard by cascading the effective values\r
+// into the HTMLElement.style object. We can use IE's HTMLElement.currentStyle\r
+// to get the effective values. In Gecko we will use the W3 DOM Style Standard getComputedStyle\r
+\r
+function xbStyle(obj, position)\r
+{\r
+  if (typeof(obj) == 'object' && typeof(obj.style) != 'undefined') \r
+    this.styleObj = obj.style;\r
+  else if (document.layers) // NN4\r
+  {\r
+    if (typeof(position) == 'undefined')\r
+      position = '';\r
+        \r
+    this.styleObj = obj;\r
+    this.styleObj.position = position;\r
+  }\r
+  this.object = obj;\r
+}\r
+\r
+xbStyle.prototype.styleObj = null;\r
+xbStyle.prototype.object = null;\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getEffectiveValue()\r
+// note that xbStyle's constructor uses the currentStyle object \r
+// for IE5+ and that Opera's style object contains computed values\r
+// already. Netscape Navigator's layer object also contains the \r
+// computed values as well. Note that IE4 will not return the \r
+// computed values.\r
+\r
+function xbStyleGetEffectiveValue(propname)\r
+{\r
+  var value = null;\r
+\r
+  // W3/Gecko\r
+  if (document.defaultView && document.defaultView.getComputedStyle)\r
+  {\r
+    if (navigator.family == 'gecko')\r
+    {\r
+      // xxxHack: work around Gecko getComputedStyle bugs...\r
+      switch(propname)\r
+      {\r
+      case 'clip':\r
+         return this.styleObj[propname];\r
+      case 'top':\r
+        if (navigator.family == 'gecko' && navigator.version < 0.96 && this.styleObj.position == 'relative')\r
+           return this.object.offsetTop;\r
+      case 'left':\r
+        if (navigator.family == 'gecko' && navigator.version < 0.96 && this.styleObj.position == 'relative')\r
+           return this.object.offsetLeft;\r
+      }\r
+    }\r
+    // Note that propname is the name of the property in the CSS Style\r
+    // Object. However the W3 method getPropertyValue takes the actual\r
+    // property name from the CSS Style rule, i.e., propname is \r
+    // 'backgroundColor' but getPropertyValue expects 'background-color'.\r
+\r
+     var capIndex;\r
+     var cappropname = propname;\r
+     while ( (capIndex = cappropname.search(/[A-Z]/)) != -1)\r
+     {\r
+       if (capIndex != -1)\r
+         cappropname = cappropname.substring(0, capIndex) + '-' + cappropname.substring(capIndex, capIndex).toLowerCase() + cappropname.substr(capIndex+1);\r
+     }\r
+\r
+     value =  document.defaultView.getComputedStyle(this.object, '').getPropertyValue(cappropname);\r
+\r
+     // xxxHack for Gecko:\r
+     if (!value && this.styleObj[propname])\r
+       value = this.styleObj[propname];\r
+  }\r
+  else if (typeof(this.styleObj[propname]) == 'undefined') \r
+    value = xbStyleNotSupportStringValue(propname);\r
+  else \r
+  {\r
+    if (navigator.family != 'ie4' || navigator.version < 5)\r
+    {\r
+      // IE4+, Opera, NN4\r
+      value = this.styleObj[propname];\r
+    }\r
+    else\r
+    {\r
+     // IE5+\r
+     value = this.object.currentStyle[propname];\r
+     if (!value)\r
+       value = this.styleObj[propname];\r
+    }\r
+  }\r
+\r
+  return value;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClip()\r
+\r
+function cssStyleGetClip()\r
+{\r
+  var clip = this.getEffectiveValue('clip');\r
+\r
+  // hack opera\r
+  if (clip == 'rect()')\r
+    clip = '';\r
+\r
+  if (clip == '')\r
+    clip = 'rect(0px ' + this.getWidth() + 'px ' + this.getHeight() + 'px 0px)';\r
+\r
+  return clip;\r
+}\r
+\r
+function nsxbStyleGetClip()\r
+{\r
+  var clip = this.styleObj.clip;\r
+  var rect = new xbClipRect(clip.top, clip.right, clip.bottom, clip.left);\r
+  return rect.toString();\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClip()\r
+\r
+function cssStyleSetClip(sClipString)\r
+{\r
+  this.styleObj.clip = sClipString;\r
+}\r
+\r
+function nsxbStyleSetClip(sClipString)\r
+{\r
+  var rect          = new xbClipRect(sClipString);\r
+  this.styleObj.clip.top    = rect.top;\r
+  this.styleObj.clip.right  = rect.right;\r
+  this.styleObj.clip.bottom  = rect.bottom;\r
+  this.styleObj.clip.left    = rect.left;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClipTop()\r
+\r
+function cssStyleGetClipTop()\r
+{\r
+  var clip = this.getClip()\r
+  var rect = new xbClipRect(clip);\r
+  return rect.top;\r
+}\r
+\r
+function nsxbStyleGetClipTop()\r
+{\r
+  return this.styleObj.clip.top;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClipTop()\r
+\r
+function cssStyleSetClipTop(top)\r
+{\r
+  var clip = this.getClip();\r
+  var rect         = new xbClipRect(clip);\r
+  rect.top         = top;\r
+  this.styleObj.clip = rect.toString();\r
+}\r
+\r
+function nsxbStyleSetClipTop(top)\r
+{\r
+  return this.styleObj.clip.top = top;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClipRight()\r
+\r
+function cssStyleGetClipRight()\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  return rect.right;\r
+}\r
+\r
+function nsxbStyleGetClipRight()\r
+{\r
+  return this.styleObj.clip.right;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClipRight()\r
+\r
+function cssStyleSetClipRight(right)\r
+{\r
+  var clip = this.getClip();\r
+  var rect          = new xbClipRect(clip);\r
+  rect.right        = right;\r
+  this.styleObj.clip  = rect.toString();\r
+}\r
+\r
+function nsxbStyleSetClipRight(right)\r
+{\r
+  return this.styleObj.clip.right = right;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClipBottom()\r
+\r
+function cssStyleGetClipBottom()\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  return rect.bottom;\r
+}\r
+\r
+function nsxbStyleGetClipBottom()\r
+{\r
+  return this.styleObj.clip.bottom;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClipBottom()\r
+\r
+function cssStyleSetClipBottom(bottom)\r
+{\r
+  var clip = this.getClip();\r
+  var rect           = new xbClipRect(clip);\r
+  rect.bottom        = bottom;\r
+  this.styleObj.clip   = rect.toString();\r
+}\r
+\r
+function nsxbStyleSetClipBottom(bottom)\r
+{\r
+  return this.styleObj.clip.bottom = bottom;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClipLeft()\r
+\r
+function cssStyleGetClipLeft()\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  return rect.left;\r
+}\r
+\r
+function nsxbStyleGetClipLeft()\r
+{\r
+  return this.styleObj.clip.left;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClipLeft()\r
+\r
+function cssStyleSetClipLeft(left)\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  rect.left = left;\r
+  this.styleObj.clip = rect.toString();\r
+}\r
+\r
+function nsxbStyleSetClipLeft(left)\r
+{\r
+  return this.styleObj.clip.left = left;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClipWidth()\r
+\r
+function cssStyleGetClipWidth()\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  return rect.getWidth();\r
+}\r
+\r
+function nsxbStyleGetClipWidth()\r
+{\r
+  return this.styleObj.clip.width;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClipWidth()\r
+\r
+function cssStyleSetClipWidth(width)\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  rect.setWidth(width);\r
+  this.styleObj.clip = rect.toString();\r
+}\r
+\r
+function nsxbStyleSetClipWidth(width)\r
+{\r
+  return this.styleObj.clip.width = width;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.getClipHeight()\r
+\r
+function cssStyleGetClipHeight()\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  return rect.getHeight();\r
+}\r
+\r
+function nsxbStyleGetClipHeight()\r
+{\r
+  return this.styleObj.clip.height;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////\r
+// xbStyle.setClipHeight()\r
+\r
+function cssStyleSetClipHeight(height)\r
+{\r
+  var clip = this.getClip();\r
+  var rect = new xbClipRect(clip);\r
+  rect.setHeight(height);\r
+  this.styleObj.clip = rect.toString();\r
+}\r
+\r
+function nsxbStyleSetClipHeight(height)\r
+{\r
+  return this.styleObj.clip.height = height;\r
+}\r
+\r
+// the CSS attributes left,top are for absolutely positioned elements\r
+// measured relative to the containing element.  for relatively positioned\r
+// elements, left,top are measured from the element's normal inline position.\r
+// getLeft(), setLeft() operate on this type of coordinate.\r
+//\r
+// to allow dynamic positioning the getOffsetXXX and setOffsetXXX methods are\r
+// defined to return and set the position of either an absolutely or relatively\r
+// positioned element relative to the containing element.\r
+//\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getLeft()\r
+\r
+function cssStyleGetLeft()\r
+{\r
+  var left = this.getEffectiveValue('left');\r
+  if (typeof(left) == 'number')\r
+     return left;\r
+\r
+  if (left != '' && left.indexOf('px') == -1)\r
+  {\r
+    xbDEBUG.dump('xbStyle.getLeft: Element ID=' + this.object.id + ' does not use pixels as units. left=' + left + ' Click Ok to continue, Cancel to Abort');\r
+    return 0;\r
+  }\r
+\r
+  if (left == '')\r
+    left = this.styleObj.left = '0px';\r
+      \r
+  return xbToInt(left);\r
+}\r
+\r
+function nsxbStyleGetLeft()\r
+{\r
+  return this.styleObj.left;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setLeft()\r
+\r
+function cssStyleSetLeft(left)\r
+{\r
+  if (typeof(this.styleObj.left) == 'number')\r
+    this.styleObj.left = left;\r
+  else\r
+    this.styleObj.left = left + 'px';\r
+}\r
+\r
+function nsxbStyleSetLeft(left)\r
+{\r
+  this.styleObj.left = left;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getTop()\r
+\r
+function cssStyleGetTop()\r
+{\r
+  var top = this.getEffectiveValue('top');\r
+  if (typeof(top) == 'number')\r
+     return top;\r
+\r
+  if (top != '' && top.indexOf('px') == -1)\r
+  {\r
+    xbDEBUG.dump('xbStyle.getTop: Element ID=' + this.object.id + ' does not use pixels as units. top=' + top + ' Click Ok to continue, Cancel to Abort');\r
+    return 0;\r
+  }\r
+\r
+  if (top == '')\r
+    top = this.styleObj.top = '0px';\r
+      \r
+  return xbToInt(top);\r
+}\r
+\r
+function nsxbStyleGetTop()\r
+{\r
+  return this.styleObj.top;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setTop()\r
+\r
+function cssStyleSetTop(top)\r
+{\r
+  if (typeof(this.styleObj.top) == 'number')\r
+    this.styleObj.top = top;\r
+  else\r
+    this.styleObj.top = top + 'px';\r
+}\r
+\r
+function nsxbStyleSetTop(top)\r
+{\r
+  this.styleObj.top = top;\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getPageX()\r
+\r
+function cssStyleGetPageX()\r
+{\r
+  var x = 0;\r
+  var elm = this.object;\r
+  var elmstyle;\r
+  var position;\r
+  \r
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the \r
+  // effective position attribute , attempt to use offsetXXX\r
+\r
+  if (typeof(elm.offsetLeft) == 'number')\r
+  {\r
+    while (elm)\r
+    {\r
+      x += elm.offsetLeft;\r
+      elm = elm.offsetParent;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    while (elm)\r
+    {\r
+      if (elm.style)\r
+      {\r
+        elmstyle = new xbStyle(elm);\r
+        position = elmstyle.getEffectiveValue('position');\r
+        if (position != '' && position != 'static')\r
+          x += elmstyle.getLeft();\r
+      }\r
+      elm = elm.parentNode;\r
+    }\r
+  }\r
+  \r
+  return x;\r
+}\r
+\r
+function nsxbStyleGetPageX()\r
+{\r
+  return this.styleObj.pageX;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setPageX()\r
+\r
+function cssStyleSetPageX(x)\r
+{\r
+  var xParent = 0;\r
+  var elm = this.object.parentNode;\r
+  var elmstyle;\r
+  var position;\r
+  \r
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the \r
+  // effective position attribute , attempt to use offsetXXX\r
+\r
+  if (elm && typeof(elm.offsetLeft) == 'number')\r
+  {\r
+    while (elm)\r
+    {\r
+      xParent += elm.offsetLeft;\r
+      elm = elm.offsetParent;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    while (elm)\r
+    {\r
+      if (elm.style)\r
+      {\r
+        elmstyle = new xbStyle(elm);\r
+        position = elmstyle.getEffectiveValue('position');\r
+        if (position != '' && position != 'static')\r
+          xParent += elmstyle.getLeft();\r
+      }\r
+      elm = elm.parentNode;\r
+    }\r
+  }\r
+  \r
+  x -= xParent;\r
+\r
+  this.setLeft(x);\r
+}\r
+    \r
+function nsxbStyleSetPageX(x)\r
+{\r
+  this.styleObj.x = this.styleObj.x  + x - this.styleObj.pageX;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getPageY()\r
+\r
+function cssStyleGetPageY()\r
+{\r
+  var y = 0;\r
+  var elm = this.object;\r
+  var elmstyle;\r
+  var position;\r
+  \r
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the \r
+  // effective position attribute , attempt to use offsetXXX\r
+\r
+  if (typeof(elm.offsetTop) == 'number')\r
+  {\r
+    while (elm)\r
+    {\r
+      y += elm.offsetTop;\r
+      elm = elm.offsetParent;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    while (elm)\r
+    {\r
+      if (elm.style)\r
+      {\r
+        elmstyle = new xbStyle(elm);\r
+        position = elmstyle.getEffectiveValue('position');\r
+        if (position != '' && position != 'static')\r
+          y += elmstyle.getTop();\r
+      }\r
+      elm = elm.parentNode;\r
+    }\r
+  }\r
+  \r
+  return y;\r
+}\r
+\r
+function nsxbStyleGetPageY()\r
+{\r
+  return this.styleObj.pageY;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setPageY()\r
+\r
+function cssStyleSetPageY(y)\r
+{\r
+  var yParent = 0;\r
+  var elm = this.object.parentNode;\r
+  var elmstyle;\r
+  var position;\r
+  \r
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the \r
+  // effective position attribute , attempt to use offsetXXX\r
+\r
+  if (elm && typeof(elm.offsetTop) == 'number')\r
+  {\r
+    while (elm)\r
+    {\r
+      yParent += elm.offsetTop;\r
+      elm = elm.offsetParent;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    while (elm)\r
+    {\r
+      if (elm.style)\r
+      {\r
+        elmstyle = new xbStyle(elm);\r
+        position = elmstyle.getEffectiveValue('position');\r
+        if (position != '' && position != 'static')\r
+          yParent += elmstyle.getTop();\r
+      }\r
+      elm = elm.parentNode;\r
+    }\r
+  }\r
+  \r
+  y -= yParent;\r
+\r
+  this.setTop(y);\r
+}\r
+    \r
+function nsxbStyleSetPageY(y)\r
+{\r
+  this.styleObj.y = this.styleObj.y  + y - this.styleObj.pageY;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getHeight()\r
+\r
+function cssStyleGetHeight()\r
+{\r
+  var height = this.getEffectiveValue('height');\r
+  if (typeof(height) == 'number')\r
+     return height;\r
+\r
+  if ((height == 'auto' || height.indexOf('%') != -1) && typeof(this.object.offsetHeight) == 'number')\r
+    height = this.object.offsetHeight + 'px';\r
+\r
+  if (height != '' && height != 'auto' && height.indexOf('px') == -1)\r
+  {\r
+    xbDEBUG.dump('xbStyle.getHeight: Element ID=' + this.object.id + ' does not use pixels as units. height=' + height + ' Click Ok to continue, Cancel to Abort');\r
+    return 0;\r
+  }\r
+\r
+  height = xbToInt(height);\r
+\r
+  return height;\r
+}\r
+\r
+function nsxbStyleGetHeight()\r
+{\r
+  //if (this.styleObj.document && this.styleObj.document.height)\r
+  //  return this.styleObj.document.height;\r
+    \r
+  return this.styleObj.clip.height;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setHeight()\r
+\r
+function cssStyleSetHeight(height)\r
+{\r
+  if (typeof(this.styleObj.height) == 'number')\r
+    this.styleObj.height = height;\r
+  else\r
+    this.styleObj.height = height + 'px';\r
+}\r
+\r
+function nsxbStyleSetHeight(height)\r
+{\r
+  this.styleObj.clip.height = height;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getWidth()\r
+\r
+function cssStyleGetWidth()\r
+{\r
+  var width = this.getEffectiveValue('width');\r
+  if (typeof(width) == 'number')\r
+     return width;\r
+\r
+  if ((width == 'auto' || width.indexOf('%') != -1) && typeof(this.object.offsetWidth) == 'number')\r
+    width = this.object.offsetWidth + 'px';\r
+\r
+  if (width != '' && width != 'auto' && width.indexOf('px') == -1)\r
+  {\r
+    xbDEBUG.dump('xbStyle.getWidth: Element ID=' + this.object.id + ' does not use pixels as units. width=' + width + ' Click Ok to continue, Cancel to Abort');\r
+    return 0;\r
+  }\r
+\r
+  width = xbToInt(width);\r
+\r
+  return width;\r
+}\r
+\r
+function nsxbStyleGetWidth()\r
+{\r
+  //if (this.styleObj.document && this.styleObj.document.width)\r
+  //  return this.styleObj.document.width;\r
+    \r
+  return this.styleObj.clip.width;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setWidth()\r
+\r
+function cssStyleSetWidth(width)\r
+{\r
+  if (typeof(this.styleObj.width) == 'number')\r
+    this.styleObj.width = width;\r
+  else\r
+    this.styleObj.width = width + 'px';\r
+}\r
+\r
+// netscape will not dynamically change the width of a \r
+// layer. It will only happen upon a refresh.\r
+function nsxbStyleSetWidth(width)\r
+{\r
+  this.styleObj.clip.width = width;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getVisibility()\r
+\r
+function cssStyleGetVisibility()\r
+{\r
+  return this.getEffectiveValue('visibility');\r
+}\r
+\r
+function nsxbStyleGetVisibility()\r
+{\r
+  switch(this.styleObj.visibility)\r
+  {\r
+  case 'hide':\r
+    return 'hidden';\r
+  case 'show':\r
+    return 'visible';\r
+  }\r
+  return '';\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setVisibility()\r
+\r
+function cssStyleSetVisibility(visibility)\r
+{\r
+  this.styleObj.visibility = visibility;\r
+}\r
+\r
+function nsxbStyleSetVisibility(visibility)\r
+{\r
+  switch(visibility)\r
+  {\r
+  case 'hidden':\r
+    visibility = 'hide';\r
+    break;\r
+  case 'visible':\r
+    visibility = 'show';\r
+    break;\r
+  case 'inherit':\r
+    break;\r
+  default:\r
+    visibility = 'show';\r
+    break;\r
+  }\r
+  this.styleObj.visibility = visibility;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getzIndex()\r
+\r
+function cssStyleGetzIndex()\r
+{\r
+  return xbToInt(this.getEffectiveValue('zIndex'));\r
+}\r
+\r
+function nsxbStyleGetzIndex()\r
+{\r
+  return this.styleObj.zIndex;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setzIndex()\r
+\r
+function cssStyleSetzIndex(zIndex)\r
+{\r
+  this.styleObj.zIndex = zIndex;\r
+}\r
+\r
+function nsxbStyleSetzIndex(zIndex)\r
+{\r
+  this.styleObj.zIndex = zIndex;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getBackgroundColor()\r
+\r
+function cssStyleGetBackgroundColor()\r
+{\r
+  return this.getEffectiveValue('backgroundColor');\r
+}\r
+\r
+function nsxbStyleGetBackgroundColor()\r
+{\r
+  return this.styleObj.bgColor;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setBackgroundColor()\r
+\r
+function cssStyleSetBackgroundColor(color)\r
+{\r
+  this.styleObj.backgroundColor = color;\r
+}\r
+\r
+function nsxbStyleSetBackgroundColor(color)\r
+{\r
+  if (color)\r
+  {\r
+    this.styleObj.bgColor = color;\r
+    this.object.document.bgColor = color;\r
+    this.resizeTo(this.getWidth(), this.getHeight());\r
+  }\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getColor()\r
+\r
+function cssStyleGetColor()\r
+{\r
+  return this.getEffectiveValue('color');\r
+}\r
+\r
+function nsxbStyleGetColor()\r
+{\r
+  return '#ffffff';\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setColor()\r
+\r
+function cssStyleSetColor(color)\r
+{\r
+  this.styleObj.color = color;\r
+}\r
+\r
+function nsxbStyleSetColor(color)\r
+{\r
+  this.object.document.fgColor = color;\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.moveAbove()\r
+\r
+function xbStyleMoveAbove(cont)\r
+{\r
+  this.setzIndex(cont.getzIndex()+1);\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.moveBelow()\r
+\r
+function xbStyleMoveBelow(cont)\r
+{\r
+  var zindex = cont.getzIndex() - 1;\r
+            \r
+  this.setzIndex(zindex);\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.moveBy()\r
+\r
+function xbStyleMoveBy(deltaX, deltaY)\r
+{\r
+  this.moveTo(this.getLeft() + deltaX, this.getTop() + deltaY);\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.moveTo()\r
+\r
+function xbStyleMoveTo(x, y)\r
+{\r
+  this.setLeft(x);\r
+  this.setTop(y);\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.moveToAbsolute()\r
+\r
+function xbStyleMoveToAbsolute(x, y)\r
+{\r
+  this.setPageX(x);\r
+  this.setPageY(y);\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.resizeBy()\r
+\r
+function xbStyleResizeBy(deltaX, deltaY)\r
+{\r
+  this.setWidth( this.getWidth() + deltaX );\r
+  this.setHeight( this.getHeight() + deltaY );\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.resizeTo()\r
+\r
+function xbStyleResizeTo(x, y)\r
+{\r
+  this.setWidth(x);\r
+  this.setHeight(y);\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+// Navigator 4.x resizing...\r
+\r
+function nsxbStyleOnresize()\r
+{\r
+    if (saveInnerWidth != xbGetWindowWidth() || saveInnerHeight != xbGetWindowHeight())\r
+    location.reload();\r
+\r
+  return false;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.setInnerHTML()\r
+\r
+function xbSetInnerHTML(str)\r
+{\r
+  if (typeof(this.object.innerHTML) != 'undefined')\r
+    this.object.innerHTML = str;\r
+}\r
+\r
+function nsxbSetInnerHTML(str)\r
+{\r
+  this.object.document.open('text/html');\r
+  this.object.document.write(str);\r
+  this.object.document.close();\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+// Extensions to xbStyle that are not supported by Netscape Navigator 4\r
+// but that provide cross browser implementations of properties for \r
+// Mozilla, Gecko, Netscape 6.x and Opera\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getBorderTopWidth()\r
+\r
+function cssStyleGetBorderTopWidth()\r
+{\r
+  return xbToInt(this.getEffectiveValue('borderTopWidth'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getBorderRightWidth()\r
+\r
+function cssStyleGetBorderRightWidth()\r
+{\r
+  return xbToInt(this.getEffectiveValue('borderRightWidth'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getBorderBottomWidth()\r
+\r
+function cssStyleGetBorderBottomWidth()\r
+{\r
+  return xbToInt(this.getEffectiveValue('borderLeftWidth'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getBorderLeftWidth()\r
+\r
+function cssStyleGetBorderLeftWidth()\r
+{\r
+  return xbToInt(this.getEffectiveValue('borderLeftWidth'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getMarginTop()\r
+\r
+function cssStyleGetMarginTop()\r
+{\r
+  return xbToInt(this.getEffectiveValue('marginTop'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getMarginRight()\r
+\r
+function cssStyleGetMarginRight()\r
+{\r
+  return xbToInt(this.getEffectiveValue('marginRight'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getMarginBottom()\r
+\r
+function cssStyleGetMarginBottom()\r
+{\r
+  return xbToInt(this.getEffectiveValue('marginBottom'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getMarginLeft()\r
+\r
+function cssStyleGetMarginLeft()\r
+{\r
+  return xbToInt(this.getEffectiveValue('marginLeft'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getPaddingTop()\r
+\r
+function cssStyleGetPaddingTop()\r
+{\r
+  return xbToInt(this.getEffectiveValue('paddingTop'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getPaddingRight()\r
+\r
+function cssStyleGetPaddingRight()\r
+{\r
+  return xbToInt(this.getEffectiveValue('paddingRight'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getPaddingBottom()\r
+\r
+function cssStyleGetPaddingBottom()\r
+{\r
+  return xbToInt(this.getEffectiveValue('paddingBottom'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getPaddingLeft()\r
+\r
+function cssStyleGetPaddingLeft()\r
+{\r
+  return xbToInt(this.getEffectiveValue('paddingLeft'));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getClientTop()\r
+\r
+function cssStyleGetClientTop()\r
+{\r
+  return this.getTop() - this.getMarginTop() - this.getBorderTopWidth() - this.getPaddingTop();\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getClientLeft()\r
+\r
+function cssStyleGetClientLeft()\r
+{\r
+  return this.getLeft() - this.getMarginLeft() - this.getBorderLeftWidth() - this.getPaddingLeft();\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getClientWidth()\r
+\r
+function cssStyleGetClientWidth()\r
+{\r
+  return this.getMarginLeft() + this.getBorderLeftWidth() + this.getPaddingLeft() + this.getWidth() + this.getPaddingRight() + this.getBorderRightWidth() + this.getMarginRight();\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// xbStyle.getClientHeight()\r
+\r
+function cssStyleGetClientHeight()\r
+{\r
+  return this.getMarginTop() + this.getBorderTopWidth() + this.getPaddingTop() + this.getHeight() + this.getPaddingBottom() + this.getBorderBottomWidth() + this.getMarginBottom();\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+\r
+xbStyle.prototype.getEffectiveValue     = xbStyleGetEffectiveValue;\r
+xbStyle.prototype.moveAbove             = xbStyleMoveAbove;\r
+xbStyle.prototype.moveBelow             = xbStyleMoveBelow;\r
+xbStyle.prototype.moveBy                = xbStyleMoveBy;\r
+xbStyle.prototype.moveTo                = xbStyleMoveTo;\r
+xbStyle.prototype.moveToAbsolute        = xbStyleMoveToAbsolute;\r
+xbStyle.prototype.resizeBy              = xbStyleResizeBy;\r
+xbStyle.prototype.resizeTo              = xbStyleResizeTo;\r
+\r
+if (document.all || document.getElementsByName)\r
+{\r
+  xbStyle.prototype.getClip            = cssStyleGetClip;\r
+  xbStyle.prototype.setClip            = cssStyleSetClip;  \r
+  xbStyle.prototype.getClipTop         = cssStyleGetClipTop;\r
+  xbStyle.prototype.setClipTop         = cssStyleSetClipTop;  \r
+  xbStyle.prototype.getClipRight       = cssStyleGetClipRight;\r
+  xbStyle.prototype.setClipRight       = cssStyleSetClipRight;  \r
+  xbStyle.prototype.getClipBottom      = cssStyleGetClipBottom;\r
+  xbStyle.prototype.setClipBottom      = cssStyleSetClipBottom;  \r
+  xbStyle.prototype.getClipLeft        = cssStyleGetClipLeft;\r
+  xbStyle.prototype.setClipLeft        = cssStyleSetClipLeft;  \r
+  xbStyle.prototype.getClipWidth       = cssStyleGetClipWidth;\r
+  xbStyle.prototype.setClipWidth       = cssStyleSetClipWidth;  \r
+  xbStyle.prototype.getClipHeight      = cssStyleGetClipHeight;\r
+  xbStyle.prototype.setClipHeight      = cssStyleSetClipHeight;  \r
+  xbStyle.prototype.getLeft            = cssStyleGetLeft;\r
+  xbStyle.prototype.setLeft            = cssStyleSetLeft;\r
+  xbStyle.prototype.getTop             = cssStyleGetTop;\r
+  xbStyle.prototype.setTop             = cssStyleSetTop;\r
+  xbStyle.prototype.getPageX           = cssStyleGetPageX;\r
+  xbStyle.prototype.setPageX           = cssStyleSetPageX;\r
+  xbStyle.prototype.getPageY           = cssStyleGetPageY;\r
+  xbStyle.prototype.setPageY           = cssStyleSetPageY;\r
+  xbStyle.prototype.getVisibility      = cssStyleGetVisibility;\r
+  xbStyle.prototype.setVisibility      = cssStyleSetVisibility;\r
+  xbStyle.prototype.getzIndex          = cssStyleGetzIndex;\r
+  xbStyle.prototype.setzIndex          = cssStyleSetzIndex;            \r
+  xbStyle.prototype.getHeight          = cssStyleGetHeight;\r
+  xbStyle.prototype.setHeight          = cssStyleSetHeight;\r
+  xbStyle.prototype.getWidth           = cssStyleGetWidth;\r
+  xbStyle.prototype.setWidth           = cssStyleSetWidth;\r
+  xbStyle.prototype.getBackgroundColor = cssStyleGetBackgroundColor;\r
+  xbStyle.prototype.setBackgroundColor = cssStyleSetBackgroundColor;\r
+  xbStyle.prototype.getColor           = cssStyleGetColor;\r
+  xbStyle.prototype.setColor           = cssStyleSetColor;\r
+  xbStyle.prototype.setInnerHTML       = xbSetInnerHTML;\r
+  xbStyle.prototype.getBorderTopWidth    = cssStyleGetBorderTopWidth;\r
+  xbStyle.prototype.getBorderRightWidth  = cssStyleGetBorderRightWidth;\r
+  xbStyle.prototype.getBorderBottomWidth = cssStyleGetBorderBottomWidth;\r
+  xbStyle.prototype.getBorderLeftWidth   = cssStyleGetBorderLeftWidth;\r
+  xbStyle.prototype.getMarginLeft        = cssStyleGetMarginLeft;\r
+  xbStyle.prototype.getMarginTop         = cssStyleGetMarginTop;\r
+  xbStyle.prototype.getMarginRight       = cssStyleGetMarginRight;\r
+  xbStyle.prototype.getMarginBottom      = cssStyleGetMarginBottom;\r
+  xbStyle.prototype.getMarginLeft        = cssStyleGetMarginLeft;\r
+  xbStyle.prototype.getPaddingTop        = cssStyleGetPaddingTop;\r
+  xbStyle.prototype.getPaddingRight      = cssStyleGetPaddingRight;\r
+  xbStyle.prototype.getPaddingBottom     = cssStyleGetPaddingBottom;\r
+  xbStyle.prototype.getPaddingLeft       = cssStyleGetPaddingLeft;\r
+  xbStyle.prototype.getClientTop         = cssStyleGetClientTop;\r
+  xbStyle.prototype.getClientLeft        = cssStyleGetClientLeft;\r
+  xbStyle.prototype.getClientWidth       = cssStyleGetClientWidth;\r
+  xbStyle.prototype.getClientHeight      = cssStyleGetClientHeight;\r
+}\r
+else if (document.layers)\r
+{\r
+  xbStyle.prototype.getClip            = nsxbStyleGetClip;\r
+  xbStyle.prototype.setClip            = nsxbStyleSetClip;  \r
+  xbStyle.prototype.getClipTop         = nsxbStyleGetClipTop;\r
+  xbStyle.prototype.setClipTop         = nsxbStyleSetClipTop;  \r
+  xbStyle.prototype.getClipRight       = nsxbStyleGetClipRight;\r
+  xbStyle.prototype.setClipRight       = nsxbStyleSetClipRight;  \r
+  xbStyle.prototype.getClipBottom      = nsxbStyleGetClipBottom;\r
+  xbStyle.prototype.setClipBottom      = nsxbStyleSetClipBottom;  \r
+  xbStyle.prototype.getClipLeft        = nsxbStyleGetClipLeft;\r
+  xbStyle.prototype.setClipLeft        = nsxbStyleSetClipLeft;  \r
+  xbStyle.prototype.getClipWidth       = nsxbStyleGetClipWidth;\r
+  xbStyle.prototype.setClipWidth       = nsxbStyleSetClipWidth;  \r
+  xbStyle.prototype.getClipHeight      = nsxbStyleGetClipHeight;\r
+  xbStyle.prototype.setClipHeight      = nsxbStyleSetClipHeight;  \r
+  xbStyle.prototype.getLeft            = nsxbStyleGetLeft;\r
+  xbStyle.prototype.setLeft            = nsxbStyleSetLeft;\r
+  xbStyle.prototype.getTop             = nsxbStyleGetTop;\r
+  xbStyle.prototype.setTop             = nsxbStyleSetTop;\r
+  xbStyle.prototype.getPageX           = nsxbStyleGetPageX;\r
+  xbStyle.prototype.setPageX           = nsxbStyleSetPageX;\r
+  xbStyle.prototype.getPageY           = nsxbStyleGetPageY;\r
+  xbStyle.prototype.setPageY           = nsxbStyleSetPageY;\r
+  xbStyle.prototype.getVisibility      = nsxbStyleGetVisibility;\r
+  xbStyle.prototype.setVisibility      = nsxbStyleSetVisibility;\r
+  xbStyle.prototype.getzIndex          = nsxbStyleGetzIndex;\r
+  xbStyle.prototype.setzIndex          = nsxbStyleSetzIndex;            \r
+  xbStyle.prototype.getHeight          = nsxbStyleGetHeight;\r
+  xbStyle.prototype.setHeight          = nsxbStyleSetHeight;\r
+  xbStyle.prototype.getWidth           = nsxbStyleGetWidth;\r
+  xbStyle.prototype.setWidth           = nsxbStyleSetWidth;\r
+  xbStyle.prototype.getBackgroundColor = nsxbStyleGetBackgroundColor;\r
+  xbStyle.prototype.setBackgroundColor = nsxbStyleSetBackgroundColor;\r
+  xbStyle.prototype.getColor           = nsxbStyleGetColor;\r
+  xbStyle.prototype.setColor           = nsxbStyleSetColor;\r
+  xbStyle.prototype.setInnerHTML       = nsxbSetInnerHTML;\r
+  xbStyle.prototype.getBorderTopWidth    = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderRightWidth  = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderBottomWidth = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderLeftWidth   = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginTop         = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginRight       = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginBottom      = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingTop        = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingRight      = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingBottom     = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingLeft       = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientTop         = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientWidth       = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientHeight      = xbStyleNotSupported;\r
+\r
+  window.saveInnerWidth = window.innerWidth;\r
+  window.saveInnerHeight = window.innerHeight;\r
+\r
+  window.onresize = nsxbStyleOnresize;\r
+\r
+}\r
+else \r
+{\r
+  xbStyle.prototype.toString           = xbStyleNotSupported;\r
+  xbStyle.prototype.getClip            = xbStyleNotSupported;\r
+  xbStyle.prototype.setClip            = xbStyleNotSupported;\r
+  xbStyle.prototype.getClipTop         = xbStyleNotSupported;\r
+  xbStyle.prototype.setClipTop         = xbStyleNotSupported;\r
+  xbStyle.prototype.getClipRight       = xbStyleNotSupported;\r
+  xbStyle.prototype.setClipRight       = xbStyleNotSupported;\r
+  xbStyle.prototype.getClipBottom      = xbStyleNotSupported;\r
+  xbStyle.prototype.setClipBottom      = xbStyleNotSupported;\r
+  xbStyle.prototype.getClipLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.setClipLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getClipWidth       = xbStyleNotSupported;\r
+  xbStyle.prototype.setClipWidth       = xbStyleNotSupported;\r
+  xbStyle.prototype.getClipHeight      = xbStyleNotSupported;\r
+  xbStyle.prototype.setClipHeight      = xbStyleNotSupported;\r
+  xbStyle.prototype.getLeft            = xbStyleNotSupported;\r
+  xbStyle.prototype.setLeft            = xbStyleNotSupported;\r
+  xbStyle.prototype.getTop             = xbStyleNotSupported;\r
+  xbStyle.prototype.setTop             = xbStyleNotSupported;\r
+  xbStyle.prototype.getVisibility      = xbStyleNotSupported;\r
+  xbStyle.prototype.setVisibility      = xbStyleNotSupported;\r
+  xbStyle.prototype.getzIndex          = xbStyleNotSupported;\r
+  xbStyle.prototype.setzIndex          = xbStyleNotSupported;\r
+  xbStyle.prototype.getHeight          = xbStyleNotSupported;\r
+  xbStyle.prototype.setHeight          = xbStyleNotSupported;\r
+  xbStyle.prototype.getWidth           = xbStyleNotSupported;\r
+  xbStyle.prototype.setWidth           = xbStyleNotSupported;\r
+  xbStyle.prototype.getBackgroundColor = xbStyleNotSupported;\r
+  xbStyle.prototype.setBackgroundColor = xbStyleNotSupported;\r
+  xbStyle.prototype.getColor           = xbStyleNotSupported;\r
+  xbStyle.prototype.setColor           = xbStyleNotSupported;\r
+  xbStyle.prototype.setInnerHTML       = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderTopWidth    = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderRightWidth  = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderBottomWidth = xbStyleNotSupported;\r
+  xbStyle.prototype.getBorderLeftWidth   = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginTop         = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginRight       = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginBottom      = xbStyleNotSupported;\r
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingTop        = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingRight      = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingBottom     = xbStyleNotSupported;\r
+  xbStyle.prototype.getPaddingLeft       = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientTop         = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientLeft        = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientWidth       = xbStyleNotSupported;\r
+  xbStyle.prototype.getClientHeight      = xbStyleNotSupported;\r
+}\r
+\r
+\r
diff --git a/slides/doc/slides.xml b/slides/doc/slides.xml
new file mode 100644 (file)
index 0000000..b9412e5
--- /dev/null
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<article>
+<articleinfo>
+<title>The Slides Document Type</title>
+<releaseinfo role="CVS">$Id$</releaseinfo>
+<author><firstname>Norman</firstname><surname>Walsh</surname>
+        <affiliation><address><email>ndw@nwalsh.com</email></address></affiliation>
+</author>
+</articleinfo>
+
+<para>The Slides Document Type is an XML vocabulary derived from
+DocBook. It is used to create presentations (slides, foils, whatever
+you call them) in HTML or print.</para>
+
+<para>Presentations are by nature visual and the Slides stylesheets
+provide a wide range of options to control how the transformation from
+XML to HTML is performed.</para>
+
+<para>This document is a first attempt at describing what some of
+these options are and how to use them.</para>
+
+<section id="ch.stylesheet">
+<title>Choose a Stylesheet</title>
+
+<para>At the highest level, you can choose one of four stylesheets:</para>
+
+<itemizedlist>
+<listitem>
+<para><filename>slides.xsl</filename> produces basic slides in HTML, one page
+per slide.
+</para>
+</listitem>
+
+<listitem>
+<para><filename>frames.xsl</filename> produces slides in HTML using frames.
+</para>
+</listitem>
+
+<listitem>
+<para><filename>w3c.xsl</filename> produces basic slides in HTML, one
+page per slide, using a navigation style similar to that of most W3C
+talks.
+</para>
+</listitem>
+
+<listitem>
+<para><filename>fo-plain.xsl</filename> produces basic slides, one
+page per slide, for print using XSL Formatting Objects.
+</para>
+</listitem>
+</itemizedlist>
+
+</section>
+
+<section id="ch.browser">
+<title>Choose a Browser</title>
+
+
+</article>
index ae55f4912b6a9be5606df9b190f4cb4cde78a50c..2be1d9fcc2920bdcc1f2f0b51374f0d0f64ceaaa 100644 (file)
@@ -1 +1,2 @@
 titlepage-fo-plain.xsl
+param.xsl
index bb54da8ce3832188e80be17a70224c520ada87c7..f419674e71f8b933ddc3bb2b370f414bfddf80cc 100644 (file)
@@ -1,10 +1,32 @@
 include ../../cvstools/Makefile.incl
 TTLTEMPLATEXSL=/sourceforge/docbook/xsl/template/titlepage.xsl
 
-all: titlepage-fo-plain.xsl
+PARAMPROF=.param.profiled
+PARAMSTRIP=.param.stripped
+
+all: titlepage-fo-plain.xsl param.xsl
 
 %.xsl: %.xml
        $(XSLT) $< $(TTLTEMPLATEXSL) $@
 
+xml: param.xml
+
+html: param.html
+
+param.html: param.xml
+       $(XSLT) $< ../../xsl/docsrc/lrefentry.xsl $@
+
+param.xml: param.xweb
+       $(XSLT) $< ../../xsl/profiling/profile.xsl $(PARAMPROF) profile.condition=html
+       $(XSLT) $(PARAMPROF) ../../xsl/profiling/strip-attributes.xsl $(PARAMSTRIP) attributes=condition
+       $(XSLT) $(PARAMSTRIP) ../../litprog/wdocbook.xsl $@
+       $(RM) $(PARAMPROF) $(PARAMSTRIP)
+
+param.xsl: param.xweb
+       $(XSLT) $< ../../xsl/profiling/profile.xsl $(PARAMPROF) profile.condition=html
+       $(XSLT) $(PARAMPROF) ../../xsl/profiling/strip-attributes.xsl $(PARAMSTRIP) attributes=condition
+       $(XSLT) $(PARAMSTRIP) ../../litprog/xtangle.xsl $@
+       $(RM) $(PARAMPROF) $(PARAMSTRIP)
+
 clean:
        rm -f titlepage-fo-plain.xsl
index eeb932e21d89f82b4a6cc2b1160ec50eafe72693..f479b73deecfd62e5db4893ce11668bb72298c5a 100644 (file)
@@ -4,15 +4,6 @@
 
 <xsl:import href="slides.xsl"/>
 
-<xsl:param name="titlefoil.html" select="'titlefoil.html'"/>
-
-<xsl:param name="ns4" select="1"/>
-<xsl:param name="ie5" select="1"/>
-<xsl:param name="multiframe" select="0"/>
-
-<xsl:param name="multiframe.top.bgcolor" select="'white'"/>
-<xsl:param name="multiframe.bottom.bgcolor" select="'white'"/>
-
 <xsl:template match="slides">
   <xsl:variable name="title">
     <xsl:choose>
@@ -34,6 +25,7 @@
   </xsl:if>
 
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'frames.html')"/>
     <xsl:with-param name="content">
       <html>
     </xsl:with-param>
   </xsl:call-template>
 
-  <xsl:if test="$ie5 != 0">
-    <xsl:call-template name="write.chunk">
-      <xsl:with-param name="filename" select="concat($base.dir,'ie5toc.html')"/>
-      <xsl:with-param name="content">
-        <html>
-          <head>
-            <title>TOC - <xsl:value-of select="$title"/></title>
-            <link type="text/css" rel="stylesheet">
-              <xsl:attribute name="href">
-                <xsl:call-template name="css-stylesheet"/>
-              </xsl:attribute>
-            </link>
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
-            <xsl:if test="$overlay != '0'">
-              <script type="text/javascript" language="JavaScript">
-                <xsl:attribute name="src">
-                  <xsl:call-template name="overlay.js"/>
-                </xsl:attribute>
-              </script>
-            </xsl:if>
-          </head>
-          <body class="toc" onload="newPage('toc.html',{$overlay});">
-            <xsl:call-template name="body.attributes"/>
-            <div class="toc">
-              <xsl:apply-templates mode="toc"/>
-            </div>
-          </body>
-        </html>
-      </xsl:with-param>
-    </xsl:call-template>
-  </xsl:if>
+  <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
+    <xsl:with-param name="filename" select="concat($base.dir,'toc.html')"/>
+    <xsl:with-param name="content">
+      <html>
+        <head>
+          <title>TOC - <xsl:value-of select="$title"/></title>
+          <link type="text/css" rel="stylesheet">
+            <xsl:attribute name="href">
+              <xsl:call-template name="css.stylesheet"/>
+            </xsl:attribute>
+          </link>
 
-  <xsl:if test="$ns4 != 0">
-    <xsl:call-template name="write.chunk">
-      <xsl:with-param name="filename" select="concat($base.dir,'ns4toc.html')"/>
-      <xsl:with-param name="content">
-        <html>
-          <head>
-            <title>TOC - <xsl:value-of select="$title"/></title>
-            <link type="text/css" rel="stylesheet">
-              <xsl:attribute name="href">
-                <xsl:call-template name="css-stylesheet"/>
-              </xsl:attribute>
-            </link>
-            <script type="text/javascript" language="JavaScript1.2">
-              <xsl:attribute name="src">
-                <xsl:call-template name="list.js"/>
-              </xsl:attribute>
-            </script>
-            <script type="text/javascript" language="JavaScript1.2">
-              <xsl:attribute name="src">
-                <xsl:call-template name="resize.js"/>
-              </xsl:attribute>
-            </script>
-            <script type="text/javascript" language="JavaScript"><xsl:text>
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
+
+          <xsl:if test="$overlay != '0'">
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
+
+          <xsl:if test="$dynamic.toc != 0">
+            <script language="JavaScript"><xsl:text>
 function init() {
   var width = </xsl:text>
 <xsl:value-of select="$toc.width"/>
@@ -123,6 +94,10 @@ function init() {
 <xsl:text>;
   myList = new List(true, width, height, "</xsl:text>
 <xsl:value-of select="$toc.bg.color"/>
+<xsl:text>","</xsl:text>
+<xsl:call-template name="plus.image"/>
+<xsl:text>","</xsl:text>
+<xsl:call-template name="minus.image"/>
 <xsl:text>");
 </xsl:text>
 <xsl:apply-templates mode="ns-toc"/>
@@ -137,61 +112,28 @@ function init() {
   <xsl:text>; }
 </xsl:text>
             </style>
-          </head>
-          <body class="toc" onload="init({$overlay});">
-            <xsl:call-template name="body.attributes"/>
-            <div id="spacer"></div>
-          </body>
-        </html>
-      </xsl:with-param>
-    </xsl:call-template>
-  </xsl:if>
-
-  <xsl:call-template name="write.chunk">
-    <xsl:with-param name="filename" select="concat($base.dir,'toc.html')"/>
-    <xsl:with-param name="content">
-      <html>
-        <head>
-          <title>TOC - <xsl:value-of select="$title"/></title>
-          <link type="text/css" rel="stylesheet">
-            <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
-            </xsl:attribute>
-          </link>
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="slides.js"/>
-            </xsl:attribute>
-          </script>
-          <script type="text/javascript" language="JavaScript">
-            <xsl:if test="$ns4 != 0">
-              <xsl:text><![CDATA[
-if (selectBrowser() == "ns4") {
-      location.replace("ns4toc.html");
-}
-]]></xsl:text>
-            </xsl:if>
-            <xsl:if test="$ie5 != 0">
-              <xsl:text><![CDATA[
-if (selectBrowser() == "ie5") {
-      location.replace("ie5toc.html");
-}
-]]></xsl:text>
-            </xsl:if>
-          </script>
-          <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
           </xsl:if>
         </head>
         <body class="toc">
           <xsl:call-template name="body.attributes"/>
-          <div class="toc">
-            <xsl:apply-templates mode="toc"/>
-          </div>
+          <xsl:if test="$dynamic.toc != 0">
+            <xsl:attribute name="onload">
+              <xsl:text>init(</xsl:text>
+              <xsl:value-of select="$overlay"/>
+              <xsl:text>);</xsl:text>
+            </xsl:attribute>
+          </xsl:if>
+
+          <xsl:choose>
+            <xsl:when test="$dynamic.toc = 0">
+              <div class="toc">
+                <xsl:apply-templates mode="toc"/>
+              </div>
+            </xsl:when>
+            <xsl:otherwise>
+              <div id="spacer"/>
+            </xsl:otherwise>
+          </xsl:choose>
         </body>
       </html>
     </xsl:with-param>
@@ -202,6 +144,7 @@ if (selectBrowser() == "ie5") {
 
 <xsl:template match="slidesinfo">
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename"
                     select="concat($base.dir,$titlefoil.html)"/>
     <xsl:with-param name="content">
@@ -210,28 +153,58 @@ if (selectBrowser() == "ie5") {
           <title><xsl:value-of select="title"/></title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
+
+          <link rel="next">
+            <xsl:attribute name="href">
+              <xsl:apply-templates select="(following::section|following::foil)[1]"
+                                   mode="filename"/>
+            </xsl:attribute>
+            <xsl:attribute name="title">
+              <xsl:value-of select="(following::section|following::foil)[1]/title"/>
+            </xsl:attribute>
+          </link>
+
+          <xsl:for-each select="../section">
+            <link rel="section">
+              <xsl:attribute name="href">
+                <xsl:apply-templates select="." mode="filename"/>
               </xsl:attribute>
-            </script>
+              <xsl:attribute name="title">
+                <xsl:value-of select="title[1]"/>
+              </xsl:attribute>
+            </link>
+          </xsl:for-each>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
           </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
         <body class="titlepage">
           <xsl:call-template name="body.attributes"/>
           <xsl:choose>
-            <xsl:when test="$ie5 != 0">
+            <xsl:when test="$active.toc != 0">
               <xsl:attribute name="onload">
                 <xsl:text>newPage('</xsl:text>
                 <xsl:value-of select="$titlefoil.html"/>
@@ -239,11 +212,6 @@ if (selectBrowser() == "ie5") {
                 <xsl:value-of select="$overlay"/>
                 <xsl:text>);</xsl:text>
               </xsl:attribute>
-              <xsl:attribute name="onkeypress">
-                <xsl:text>navigate('','foil01.html',</xsl:text>
-                <xsl:value-of select="$overlay"/>
-                <xsl:text>)</xsl:text>
-              </xsl:attribute>
             </xsl:when>
             <xsl:when test="$overlay != 0">
               <xsl:attribute name="onload">
@@ -251,6 +219,13 @@ if (selectBrowser() == "ie5") {
               </xsl:attribute>
             </xsl:when>
           </xsl:choose>
+
+          <xsl:if test="$keyboard.nav != 0">
+            <xsl:attribute name="onkeypress">
+              <xsl:text>navigate(event)</xsl:text>
+            </xsl:attribute>
+          </xsl:if>
+
           <div class="{name(.)}">
             <xsl:apply-templates mode="titlepage.mode"/>
           </div>
@@ -286,9 +261,7 @@ if (selectBrowser() == "ie5") {
                       <a href="foil01.html">
                         <img alt="Next" border="0">
                           <xsl:attribute name="src">
-                            <xsl:call-template name="graphics.dir"/>
-                            <xsl:text>/</xsl:text>
-                            <xsl:value-of select="$right.image"/>
+                            <xsl:call-template name="right.image"/>
                           </xsl:attribute>
                         </img>
                       </a>
@@ -335,44 +308,41 @@ if (selectBrowser() == "ie5") {
     <xsl:text>.html</xsl:text>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="foil[1]" mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding::foil">
-        <xsl:apply-templates select="preceding::foil[1]" mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,$thissection)"/>
     <xsl:with-param name="content">
       <head>
         <title><xsl:value-of select="title"/></title>
         <link type="text/css" rel="stylesheet">
           <xsl:attribute name="href">
-            <xsl:call-template name="css-stylesheet"/>
+            <xsl:call-template name="css.stylesheet"/>
           </xsl:attribute>
         </link>
-        <xsl:if test="$ie5 != '0'">
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="slides.js"/>
-            </xsl:attribute>
-          </script>
+
+        <xsl:call-template name="section-links"/>
+
+        <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                      or $dynamic.toc != 0 or $active.toc != 0">
+          <script language="JavaScript1.2"/>
         </xsl:if>
+
+        <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+          <xsl:call-template name="ua.js"/>
+          <xsl:call-template name="xbDOM.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
+          <xsl:call-template name="xbStyle.js"/>
+          <xsl:call-template name="xbCollapsibleLists.js"/>
+          <xsl:call-template name="slides.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
+        </xsl:if>
+
         <xsl:if test="$overlay != '0'">
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="overlay.js"/>
-            </xsl:attribute>
-          </script>
+          <xsl:call-template name="overlay.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
       </head>
       <xsl:choose>
@@ -406,10 +376,13 @@ if (selectBrowser() == "ie5") {
     <xsl:text>.html</xsl:text>
   </xsl:variable>
 
-  <frameset rows="25,*,25" border="0" name="foil" framespacing="0">
-    <frame src="top-{$thissection}" name="top" marginheight="0" scrolling="no" frameborder="0"/>
+  <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}"
+            border="0" name="foil" framespacing="0">
+    <frame src="top-{$thissection}" name="top" marginheight="0"
+           scrolling="no" frameborder="0"/>
     <frame src="body-{$thissection}" name="body" marginheight="0" frameborder="0"/>
-    <frame src="bot-{$thissection}" name="bottom" marginheight="0" scrolling="no" frameborder="0"/>
+    <frame src="bot-{$thissection}" name="bottom" marginheight="0"
+           scrolling="no" frameborder="0"/>
     <noframes>
       <body class="frameset">
         <xsl:call-template name="body.attributes"/>
@@ -429,6 +402,7 @@ if (selectBrowser() == "ie5") {
   </xsl:variable>
 
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'top-',$section)"/>
     <xsl:with-param name="content">
       <html>
@@ -436,25 +410,34 @@ if (selectBrowser() == "ie5") {
           <title>Navigation</title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
-        <body class="navigation" bgcolor="{$multiframe.top.bgcolor}">
+        <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
           <xsl:call-template name="section-top-nav">
             <xsl:with-param name="prev-target" select="'foil'"/>
             <xsl:with-param name="next-target" select="'foil'"/>
@@ -480,22 +463,8 @@ if (selectBrowser() == "ie5") {
     <xsl:text>.html</xsl:text>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="foil[1]" mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding::foil">
-        <xsl:apply-templates select="preceding::foil[1]" mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'body-',$thissection)"/>
     <xsl:with-param name="content">
       <html>
@@ -503,22 +472,31 @@ if (selectBrowser() == "ie5") {
           <title>Body</title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
         <xsl:apply-templates select="." mode="singleframe"/>
@@ -542,22 +520,8 @@ if (selectBrowser() == "ie5") {
     <xsl:text>.html</xsl:text>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="foil[1]" mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding::foil">
-        <xsl:apply-templates select="preceding::foil[1]" mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thissection)"/>
     <xsl:with-param name="content">
       <html>
@@ -565,25 +529,34 @@ if (selectBrowser() == "ie5") {
           <title>Navigation</title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
           </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
-        <body class="navigation" bgcolor="{$multiframe.bottom.bgcolor}">
+        <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
           <xsl:call-template name="section-bottom-nav"/>
         </body>
       </html>
@@ -606,25 +579,10 @@ if (selectBrowser() == "ie5") {
     <xsl:text>.html</xsl:text>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="foil[1]" mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding::foil">
-        <xsl:apply-templates select="preceding::foil[1]" mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
   <body class="section">
     <xsl:call-template name="body.attributes"/>
     <xsl:choose>
-      <xsl:when test="$ie5 != 0">
+      <xsl:when test="$active.toc != 0">
         <xsl:attribute name="onload">
           <xsl:text>newPage('</xsl:text>
           <xsl:value-of select="$thissection"/>
@@ -632,15 +590,6 @@ if (selectBrowser() == "ie5") {
           <xsl:value-of select="$overlay"/>
           <xsl:text>);</xsl:text>
         </xsl:attribute>
-        <xsl:attribute name="onkeypress">
-          <xsl:text>navigate('</xsl:text>
-          <xsl:value-of select="$prevfoil"/>
-          <xsl:text>','</xsl:text>
-          <xsl:value-of select="$nextfoil"/>
-          <xsl:text>',</xsl:text>
-          <xsl:value-of select="$overlay"/>
-          <xsl:text>)</xsl:text>
-        </xsl:attribute>
       </xsl:when>
       <xsl:when test="$overlay != 0">
         <xsl:attribute name="onload">
@@ -648,11 +597,15 @@ if (selectBrowser() == "ie5") {
         </xsl:attribute>
       </xsl:when>
     </xsl:choose>
+    <xsl:if test="$keyboard.nav != 0">
+      <xsl:attribute name="onkeypress">
+        <xsl:text>navigate(event)</xsl:text>
+      </xsl:attribute>
+    </xsl:if>
     <div class="{name(.)}" id="{$id}">
       <a name="{$id}"/>
       <xsl:if test="$multiframe=0">
         <xsl:call-template name="section-top-nav"/>
-        <hr/>
       </xsl:if>
 
       <div class="{name(.)}" id="{$id}">
@@ -667,7 +620,6 @@ if (selectBrowser() == "ie5") {
               <xsl:text>position:absolute;visibility:visible;</xsl:text>
             </xsl:attribute>
           </xsl:if>
-          <hr/>
           <xsl:call-template name="section-bottom-nav"/>
         </div>
       </xsl:if>
@@ -675,62 +627,81 @@ if (selectBrowser() == "ie5") {
   </body>
 </xsl:template>
 
+<xsl:template name="section-links">
+  <xsl:variable name="prevfoil"
+                select="(preceding::foil|/slides)[last()]"/>
+
+  <xsl:variable name="nextfoil" select="foil[1]"/>
+
+  <xsl:if test="$prevfoil">
+    <link rel="previous">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$prevfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$prevfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="$nextfoil">
+    <link rel="next">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$nextfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$nextfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
 <xsl:template match="foil">
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
-  <xsl:variable name="section" select="ancestor::section"/>
-
   <xsl:variable name="thisfoil">
     <xsl:apply-templates select="." mode="filename"/>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="(following::foil
-                                 |following::section)[1]"
-                         mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding-sibling::foil">
-        <xsl:apply-templates select="preceding-sibling::foil[1]"
-                             mode="filename"/>
-      </xsl:when>
-      <xsl:when test="parent::section">
-        <xsl:apply-templates select="parent::section[1]"
-                             mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,$thisfoil)"/>
     <xsl:with-param name="content">
       <head>
         <title><xsl:value-of select="title"/></title>
         <link type="text/css" rel="stylesheet">
           <xsl:attribute name="href">
-            <xsl:call-template name="css-stylesheet"/>
+            <xsl:call-template name="css.stylesheet"/>
           </xsl:attribute>
         </link>
-        <xsl:if test="$ie5 != '0'">
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="slides.js"/>
-            </xsl:attribute>
-          </script>
+
+        <xsl:call-template name="foil-links"/>
+
+        <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                      or $dynamic.toc != 0 or $active.toc != 0">
+          <script language="JavaScript1.2"/>
+        </xsl:if>
+
+        <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+          <xsl:call-template name="ua.js"/>
+          <xsl:call-template name="xbDOM.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
+          <xsl:call-template name="xbStyle.js"/>
+          <xsl:call-template name="xbCollapsibleLists.js"/>
+          <xsl:call-template name="slides.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
+
         <xsl:if test="$overlay != '0'">
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="overlay.js"/>
-            </xsl:attribute>
-          </script>
+          <xsl:call-template name="overlay.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
       </head>
       <xsl:choose>
@@ -758,69 +729,23 @@ if (selectBrowser() == "ie5") {
     <xsl:apply-templates select="." mode="filename"/>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="(following::foil
-                                 |following::section)[1]"
-                         mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding-sibling::foil">
-        <xsl:apply-templates select="preceding-sibling::foil[1]"
-                             mode="filename"/>
-      </xsl:when>
-      <xsl:when test="parent::section">
-        <xsl:apply-templates select="parent::section[1]"
-                             mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
-  <frameset rows="25,*,25" border="0" name="foil" framespacing="0">
+  <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" border="0" name="foil" framespacing="0">
     <xsl:attribute name="onkeypress">
-      <xsl:text>navigate('</xsl:text>
-      <xsl:value-of select="$prevfoil"/>
-      <xsl:text>','</xsl:text>
-      <xsl:value-of select="$nextfoil"/>
-      <xsl:text>',</xsl:text>
-      <xsl:value-of select="$overlay"/>
-      <xsl:text>)</xsl:text>
+      <xsl:text>navigate(event)</xsl:text>
     </xsl:attribute>
     <frame src="top-{$thisfoil}" name="top" marginheight="0" scrolling="no" frameborder="0">
       <xsl:attribute name="onkeypress">
-        <xsl:text>navigate('</xsl:text>
-        <xsl:value-of select="$prevfoil"/>
-        <xsl:text>','</xsl:text>
-        <xsl:value-of select="$nextfoil"/>
-        <xsl:text>',</xsl:text>
-        <xsl:value-of select="$overlay"/>
-        <xsl:text>)</xsl:text>
+        <xsl:text>navigate(event)</xsl:text>
       </xsl:attribute>
     </frame>
     <frame src="body-{$thisfoil}" name="body" marginheight="0" frameborder="0">
       <xsl:attribute name="onkeypress">
-        <xsl:text>navigate('</xsl:text>
-        <xsl:value-of select="$prevfoil"/>
-        <xsl:text>','</xsl:text>
-        <xsl:value-of select="$nextfoil"/>
-        <xsl:text>',</xsl:text>
-        <xsl:value-of select="$overlay"/>
-        <xsl:text>)</xsl:text>
+        <xsl:text>navigate(event)</xsl:text>
       </xsl:attribute>
     </frame>
     <frame src="bot-{$thisfoil}" name="bottom" marginheight="0" scrolling="no" frameborder="0">
       <xsl:attribute name="onkeypress">
-        <xsl:text>navigate('</xsl:text>
-        <xsl:value-of select="$prevfoil"/>
-        <xsl:text>','</xsl:text>
-        <xsl:value-of select="$nextfoil"/>
-        <xsl:text>',</xsl:text>
-        <xsl:value-of select="$overlay"/>
-        <xsl:text>)</xsl:text>
+        <xsl:text>navigate(event)</xsl:text>
       </xsl:attribute>
     </frame>
     <noframes>
@@ -840,6 +765,7 @@ if (selectBrowser() == "ie5") {
   </xsl:variable>
 
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'top-',$thisfoil)"/>
     <xsl:with-param name="content">
       <html>
@@ -847,25 +773,34 @@ if (selectBrowser() == "ie5") {
           <title>Navigation</title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
-        <body class="navigation" bgcolor="{$multiframe.top.bgcolor}">
+        <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
           <xsl:call-template name="foil-top-nav">
             <xsl:with-param name="prev-target" select="'foil'"/>
             <xsl:with-param name="next-target" select="'foil'"/>
@@ -882,6 +817,7 @@ if (selectBrowser() == "ie5") {
   </xsl:variable>
 
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoil)"/>
     <xsl:with-param name="content">
       <html>
@@ -889,22 +825,31 @@ if (selectBrowser() == "ie5") {
           <title>Body</title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
         <xsl:apply-templates select="." mode="singleframe"/>
@@ -919,6 +864,7 @@ if (selectBrowser() == "ie5") {
   </xsl:variable>
 
   <xsl:call-template name="write.chunk">
+    <xsl:with-param name="indent" select="$output.indent"/>
     <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoil)"/>
     <xsl:with-param name="content">
       <html>
@@ -926,25 +872,34 @@ if (selectBrowser() == "ie5") {
           <title>Navigation</title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$ie5 != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="slides.js"/>
-              </xsl:attribute>
-            </script>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+                        or $dynamic.toc != 0 or $active.toc != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
+
           <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
           </xsl:if>
         </head>
-        <body class="navigation" bgcolor="{$multiframe.bottom.bgcolor}">
+        <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
           <xsl:call-template name="foil-bottom-nav"/>
         </body>
       </html>
@@ -963,32 +918,10 @@ if (selectBrowser() == "ie5") {
     <xsl:apply-templates select="." mode="filename"/>
   </xsl:variable>
 
-  <xsl:variable name="nextfoil">
-    <xsl:apply-templates select="(following::foil
-                                 |following::section)[1]"
-                         mode="filename"/>
-  </xsl:variable>
-
-  <xsl:variable name="prevfoil">
-    <xsl:choose>
-      <xsl:when test="preceding-sibling::foil">
-        <xsl:apply-templates select="preceding-sibling::foil[1]"
-                             mode="filename"/>
-      </xsl:when>
-      <xsl:when test="parent::section">
-        <xsl:apply-templates select="parent::section[1]"
-                             mode="filename"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$titlefoil.html"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
   <body class="foil">
     <xsl:call-template name="body.attributes"/>
     <xsl:choose>
-      <xsl:when test="$ie5 != 0">
+      <xsl:when test="$active.toc != 0">
         <xsl:attribute name="onload">
           <xsl:text>newPage('</xsl:text>
           <xsl:value-of select="$thisfoil"/>
@@ -996,15 +929,6 @@ if (selectBrowser() == "ie5") {
           <xsl:value-of select="$overlay"/>
           <xsl:text>);</xsl:text>
         </xsl:attribute>
-        <xsl:attribute name="onkeypress">
-          <xsl:text>navigate('</xsl:text>
-          <xsl:value-of select="$prevfoil"/>
-          <xsl:text>','</xsl:text>
-          <xsl:value-of select="$nextfoil"/>
-          <xsl:text>',</xsl:text>
-          <xsl:value-of select="$overlay"/>
-          <xsl:text>)</xsl:text>
-        </xsl:attribute>
       </xsl:when>
       <xsl:when test="$overlay != 0">
         <xsl:attribute name="onload">
@@ -1012,12 +936,16 @@ if (selectBrowser() == "ie5") {
         </xsl:attribute>
       </xsl:when>
     </xsl:choose>
+    <xsl:if test="$keyboard.nav != 0">
+      <xsl:attribute name="onkeypress">
+        <xsl:text>navigate(event)</xsl:text>
+      </xsl:attribute>
+    </xsl:if>
 
     <div class="{name(.)}" id="{$id}">
       <a name="{$id}"/>
       <xsl:if test="$multiframe=0">
         <xsl:call-template name="foil-top-nav"/>
-        <hr/>
       </xsl:if>
 
       <xsl:apply-templates/>
@@ -1029,7 +957,6 @@ if (selectBrowser() == "ie5") {
               <xsl:text>position:absolute;visibility:visible;</xsl:text>
             </xsl:attribute>
           </xsl:if>
-          <hr/>
           <xsl:call-template name="foil-bottom-nav"/>
         </div>
       </xsl:if>
@@ -1037,14 +964,46 @@ if (selectBrowser() == "ie5") {
   </body>
 </xsl:template>
 
+<xsl:template name="foil-links">
+  <xsl:variable name="nextfoil" select="(following::foil
+                                        |following::section)[1]"/>
+
+  <xsl:variable name="prevfoil" select="(preceding-sibling::foil[1]
+                                        |parent::section[1]
+                                        |/slides)[last()]"/>
+
+
+  <xsl:if test="$prevfoil">
+    <link rel="previous">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$prevfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$prevfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="$nextfoil">
+    <link rel="next">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$nextfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$nextfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+</xsl:template>
+
 <!-- ============================================================ -->
 
 <xsl:template match="slidesinfo" mode="toc">
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
-  <div id="{$id}" class="toc-slidesinfo">
-    <a href="{$titlefoil.html}" target="foil">
+  <DIV id="{$id}" class="toc-slidesinfo">
+    <A href="{$titlefoil.html}" target="foil">
       <xsl:choose>
         <xsl:when test="titleabbrev">
           <xsl:apply-templates select="titleabbrev" mode="toc"/>
@@ -1053,9 +1012,9 @@ if (selectBrowser() == "ie5") {
           <xsl:apply-templates select="title" mode="toc"/>
         </xsl:otherwise>
       </xsl:choose>
-    </a>
+    </A>
     <hr/>
-  </div>
+  </DIV>
 </xsl:template>
 
 <xsl:template match="section" mode="toc">
@@ -1070,15 +1029,13 @@ if (selectBrowser() == "ie5") {
     <xsl:text>.html</xsl:text>
   </xsl:variable>
 
-  <div class="toc-section" id="{$id}">
+  <DIV class="toc-section" id="{$id}">
     <img alt="-">
       <xsl:attribute name="src">
-        <xsl:call-template name="graphics.dir"/>
-        <xsl:text>/</xsl:text>
-        <xsl:value-of select="$minus.image"/>
+        <xsl:call-template name="minus.image"/>
       </xsl:attribute>
     </img>
-    <a href="{$thissection}" target="foil">
+    <A href="{$thissection}" target="foil">
       <xsl:choose>
         <xsl:when test="titleabbrev">
           <xsl:apply-templates select="titleabbrev" mode="toc"/>
@@ -1087,26 +1044,24 @@ if (selectBrowser() == "ie5") {
           <xsl:apply-templates select="title" mode="toc"/>
         </xsl:otherwise>
       </xsl:choose>
-    </a>
+    </A>
     <xsl:apply-templates select="foil" mode="toc"/>
-  </div>
+  </DIV>
 </xsl:template>
 
 <xsl:template match="foil" mode="toc">
   <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
   <xsl:variable name="foil">
-    <xsl:apply-templates select="." mode="foil-filename"/>
+    <xsl:apply-templates select="." mode="filename"/>
   </xsl:variable>
 
-  <div id="{$id}" class="toc-foil">
+  <DIV id="{$id}" class="toc-foil">
     <img alt="-">
       <xsl:attribute name="src">
-        <xsl:call-template name="graphics.dir"/>
-        <xsl:text>/</xsl:text>
-        <xsl:value-of select="$bullet.image"/>
+        <xsl:call-template name="bullet.image"/>
       </xsl:attribute>
     </img>
-    <a href="{$foil}" target="foil">
+    <A href="{$foil}" target="foil">
       <xsl:choose>
         <xsl:when test="titleabbrev">
           <xsl:apply-templates select="titleabbrev" mode="toc"/>
@@ -1115,8 +1070,8 @@ if (selectBrowser() == "ie5") {
           <xsl:apply-templates select="title" mode="toc"/>
         </xsl:otherwise>
       </xsl:choose>
-    </a>
-  </div>
+    </A>
+  </DIV>
 </xsl:template>
 
 </xsl:stylesheet>
diff --git a/slides/xsl/graphics.xsl b/slides/xsl/graphics.xsl
new file mode 100644 (file)
index 0000000..84ca0ba
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:param name="graphics.dir" select="''"/>
+
+<xsl:param name="bullet.image" select="'bullet.gif'"/>
+<xsl:param name="right.image" select="'right.gif'"/>
+<xsl:param name="left.image" select="'left.gif'"/>
+
+<xsl:param name="plus.image" select="'plus.gif'"/>
+<xsl:param name="minus.image" select="'minus.gif'"/>
+
+<xsl:param name="hidetoc.image" select="'hidetoc.gif'"/>
+<xsl:param name="showtoc.image" select="'showtoc.gif'"/>
+
+<xsl:template name="graphics-file">
+  <xsl:param name="image" select="'bullet.gif'"/>
+
+  <xsl:variable name="source.graphics.dir">
+    <xsl:call-template name="dbhtml-attribute">
+      <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+      <xsl:with-param name="attribute" select="'graphics-dir'"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:choose>
+    <xsl:when test="$source.graphics.dir != ''">
+      <xsl:value-of select="$source.graphics.dir"/>
+      <xsl:text>/</xsl:text>
+    </xsl:when>
+    <xsl:when test="$graphics.dir != ''">
+      <xsl:value-of select="$graphics.dir"/>
+      <xsl:text>/</xsl:text>
+    </xsl:when>
+  </xsl:choose>
+  <xsl:value-of select="$image"/>
+</xsl:template>
+
+<xsl:template name="bullet.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$bullet.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="left.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$left.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="right.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$right.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="plus.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$plus.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="minus.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$minus.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="hidetoc.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$hidetoc.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="showtoc.image">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:call-template name="graphics-file">
+    <xsl:with-param name="image" select="$showtoc.image"/>
+  </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/slides/xsl/jscript.xsl b/slides/xsl/jscript.xsl
new file mode 100644 (file)
index 0000000..ade1b19
--- /dev/null
@@ -0,0 +1,112 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:param name="script.dir" select="''"/>
+
+<xsl:param name="ua.js" select="'ua.js'"/>
+<xsl:param name="xbDOM.js" select="'xbDOM.js'"/>
+<xsl:param name="xbStyle.js" select="'xbStyle.js'"/>
+<xsl:param name="xbCollapsibleLists.js" select="'xbCollapsibleLists.js'"/>
+
+<xsl:param name="overlay.js" select="'overlay.js'"/>
+<xsl:param name="slides.js" select="'slides.js'"/>
+
+<xsl:template name="script-file">
+  <xsl:param name="js" select="'slides.js'"/>
+
+  <xsl:variable name="source.script.dir">
+    <xsl:call-template name="dbhtml-attribute">
+      <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+      <xsl:with-param name="attribute" select="'script-dir'"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:choose>
+    <xsl:when test="$source.script.dir != ''">
+      <xsl:value-of select="$source.script.dir"/>
+      <xsl:text>/</xsl:text>
+    </xsl:when>
+    <xsl:when test="$script.dir != ''">
+      <xsl:value-of select="$script.dir"/>
+      <xsl:text>/</xsl:text>
+    </xsl:when>
+  </xsl:choose>
+  <xsl:value-of select="$js"/>
+</xsl:template>
+
+<xsl:template name="ua.js">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:param name="language" select="'JavaScript1.2'"/>
+  <script language="{$language}">
+    <xsl:attribute name="src">
+      <xsl:call-template name="script-file">
+        <xsl:with-param name="js" select="$ua.js"/>
+      </xsl:call-template>
+    </xsl:attribute>
+  </script>
+</xsl:template>
+
+<xsl:template name="xbDOM.js">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:param name="language" select="'JavaScript1.2'"/>
+  <script language="{$language}">
+    <xsl:attribute name="src">
+      <xsl:call-template name="script-file">
+        <xsl:with-param name="js" select="$xbDOM.js"/>
+      </xsl:call-template>
+    </xsl:attribute>
+  </script>
+</xsl:template>
+
+<xsl:template name="xbStyle.js">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:param name="language" select="'JavaScript1.2'"/>
+  <script language="{$language}">
+    <xsl:attribute name="src">
+      <xsl:call-template name="script-file">
+        <xsl:with-param name="js" select="$xbStyle.js"/>
+      </xsl:call-template>
+    </xsl:attribute>
+  </script>
+</xsl:template>
+
+<xsl:template name="xbCollapsibleLists.js">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:param name="language" select="'JavaScript1.2'"/>
+  <script language="{$language}">
+    <xsl:attribute name="src">
+      <xsl:call-template name="script-file">
+        <xsl:with-param name="js" select="$xbCollapsibleLists.js"/>
+      </xsl:call-template>
+    </xsl:attribute>
+  </script>
+</xsl:template>
+
+<xsl:template name="overlay.js">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:param name="language" select="'JavaScript1.2'"/>
+  <script language="{$language}">
+    <xsl:attribute name="src">
+      <xsl:call-template name="script-file">
+        <xsl:with-param name="js" select="$overlay.js"/>
+      </xsl:call-template>
+    </xsl:attribute>
+  </script>
+</xsl:template>
+
+<xsl:template name="slides.js">
+  <!-- Danger Will Robinson: template shadows parameter -->
+  <xsl:param name="language" select="'JavaScript1.2'"/>
+  <script language="{$language}">
+    <xsl:attribute name="src">
+      <xsl:call-template name="script-file">
+        <xsl:with-param name="js" select="$slides.js"/>
+      </xsl:call-template>
+    </xsl:attribute>
+  </script>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/slides/xsl/param.xweb b/slides/xsl/param.xweb
new file mode 100644 (file)
index 0000000..4584dc6
--- /dev/null
@@ -0,0 +1,871 @@
+<book xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<bookinfo>
+<title>Slides Parameter Reference</title>
+<releaseinfo role="meta">
+$Id$
+</releaseinfo>
+<author>
+  <surname>Walsh</surname>
+  <firstname>Norman</firstname>
+</author>
+<copyright>
+  <year>2002</year>
+  <holder>Norman Walsh</holder>
+</copyright>
+</bookinfo>
+
+<preface><title>Introduction</title>
+
+<para>This is reference documentation for the Slides stylesheet parameters.
+</para>
+
+<para>This reference describes each of the parameters.
+These are the <quote>easily customizable</quote> parts of the stylesheet.
+If you want to specify an alternate value for one or more of these
+parameters, you can do so in a <quote>driver</quote> stylesheet.</para>
+
+<para>For example, if you want to change the <literal>keyboard.nav</literal>
+parameter to <filename>0</filename>, you might create a driver
+stylesheet like this:</para>
+
+<programlisting><![CDATA[<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version='1.0'>
+
+  <xsl:import href="http://docbook.sourceforge.net/release/slides/current/xsl/slides.xsl"/>
+
+  <xsl:param name="keyboard.nav" select="0"/>
+
+</xsl:stylesheet>]]></programlisting>
+
+<para>Naturally, you have to change the
+<sgmltag class='attribute'>href</sgmltag> attribute on
+<literal>&lt;xsl:import&gt;</literal> to point to the stylesheet
+on your system.</para>
+
+<para>This is not intended to be <quote>user</quote> documentation.
+It is provided for developers writing customization layers for the
+stylesheets, and for anyone who's interested in <quote>how it
+works</quote>.</para>
+
+<para>Although I am trying to be thorough, this documentation is known
+to be incomplete. Don't forget to read the source, too :-)</para>
+</preface>
+
+<reference>
+<title>General Parameters</title>
+
+<refentry id="keyboard.nav">
+<refmeta>
+<refentrytitle>keyboard.nav</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keyboard.nav</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='keyboard.nav.frag'>
+<xsl:param name="keyboard.nav" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="css.stylesheet">
+<refmeta>
+<refentrytitle>css.stylesheet</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='css.stylesheet.frag'>
+<xsl:param name="css.stylesheet" select="'slides.css'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="titlefoil.html">
+<refmeta>
+<refentrytitle>titlefoil.html</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>titlefoil.html</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='titlefoil.html.frag'>
+<xsl:param name="titlefoil.html" select="'titlefoil.html'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="toc.html">
+<refmeta>
+<refentrytitle>toc.html</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.html</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='toc.html.frag'>
+<xsl:param name="toc.html" select="'toc.html'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="output.indent">
+<refmeta>
+<refentrytitle>output.indent</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output.indent</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='output.indent.frag'>
+<xsl:param name="output.indent" select="'no'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="overlay">
+<refmeta>
+<refentrytitle>overlay</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='overlay.frag'>
+<xsl:param name="overlay" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+</reference>
+
+<reference>
+<title>Frame Parameters</title>
+
+<refentry id="nav.separator">
+<refmeta>
+<refentrytitle>nav.separator</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.separator</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='nav.separator.frag'>
+<xsl:param name="nav.separator" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="toc.row.height">
+<refmeta>
+<refentrytitle>toc.row.height</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.row.height</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='toc.row.height.frag'>
+<xsl:param name="toc.row.height" select="22"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="toc.bg.color">
+<refmeta>
+<refentrytitle>toc.bg.color</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.bg.color</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='toc.bg.color.frag'>
+<xsl:param name="toc.bg.color" select="'#FFFFFF'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="toc.width">
+<refmeta>
+<refentrytitle>toc.width</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.width</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='toc.width.frag'>
+<xsl:param name="toc.width" select="250"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="toc.hide.show">
+<refmeta>
+<refentrytitle>toc.hide.show</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.hide.show</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='toc.hide.show.frag'>
+<xsl:param name="toc.hide.show" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="dynamic.toc">
+<refmeta>
+<refentrytitle>dynamic.toc</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dynamic.toc</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='dynamic.toc.frag'>
+<xsl:param name="dynamic.toc" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="active.toc">
+<refmeta>
+<refentrytitle>active.toc</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>active.toc</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='active.toc.frag'>
+<xsl:param name="active.toc" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="multiframe">
+<refmeta>
+<refentrytitle>multiframe</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='multiframe.frag'>
+<xsl:param name="multiframe" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="multiframe.top.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.top.bgcolor</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.top.bgcolor</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='multiframe.top.bgcolor.frag'>
+<xsl:param name="multiframe.top.bgcolor" select="'white'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="multiframe.bottom.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.bottom.bgcolor</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.bottom.bgcolor</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='multiframe.bottom.bgcolor.frag'>
+<xsl:param name="multiframe.bottom.bgcolor" select="'white'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="multiframe.navigation.height">
+<refmeta>
+<refentrytitle>multiframe.navigation.height</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.navigation.height</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='multiframe.navigation.height.frag'>
+<xsl:param name="multiframe.navigation.height" select="40"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+</reference>
+
+<reference>
+<title>Graphics Parameters</title>
+
+<refentry id="graphics.dir">
+<refmeta>
+<refentrytitle>graphics.dir</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphics.dir</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='graphics.dir.frag'>
+<xsl:param name="graphics.dir" select="''"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="bullet.image">
+<refmeta>
+<refentrytitle>bullet.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bullet.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='bullet.image.frag'>
+<xsl:param name="bullet.image" select="'bullet.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="right.image">
+<refmeta>
+<refentrytitle>right.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>right.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='right.image.frag'>
+<xsl:param name="right.image" select="'right.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="left.image">
+<refmeta>
+<refentrytitle>left.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>left.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='left.image.frag'>
+<xsl:param name="left.image" select="'left.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="plus.image">
+<refmeta>
+<refentrytitle>plus.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>plus.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='plus.image.frag'>
+<xsl:param name="plus.image" select="'plus.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="minus.image">
+<refmeta>
+<refentrytitle>minus.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>minus.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='minus.image.frag'>
+<xsl:param name="minus.image" select="'minus.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="hidetoc.image">
+<refmeta>
+<refentrytitle>hidetoc.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hidetoc.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='hidetoc.image.frag'>
+<xsl:param name="hidetoc.image" select="'hidetoc.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="showtoc.image">
+<refmeta>
+<refentrytitle>showtoc.image</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>showtoc.image</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='showtoc.image.frag'>
+<xsl:param name="showtoc.image" select="'showtoc.gif'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+</reference>
+
+<reference>
+<title>JavaScript Parameters</title>
+
+<refentry id="script.dir">
+<refmeta>
+<refentrytitle>script.dir</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>script.dir</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='script.dir.frag'>
+<xsl:param name="script.dir" select="''"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="ua.js">
+<refmeta>
+<refentrytitle>ua.js</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ua.js</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='ua.js.frag'>
+<xsl:param name="ua.js" select="'ua.js'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="xbDOM.js">
+<refmeta>
+<refentrytitle>xbDOM.js</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbDOM.js</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='xbDOM.js.frag'>
+<xsl:param name="xbDOM.js" select="'xbDOM.js'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="xbStyle.js">
+<refmeta>
+<refentrytitle>xbStyle.js</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbStyle.js</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='xbStyle.js.frag'>
+<xsl:param name="xbStyle.js" select="'xbStyle.js'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="xbCollapsibleLists.js">
+<refmeta>
+<refentrytitle>xbCollapsibleLists.js</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbCollapsibleLists.js</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='xbCollapsibleLists.js.frag'>
+<xsl:param name="xbCollapsibleLists.js" select="'xbCollapsibleLists.js'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="overlay.js">
+<refmeta>
+<refentrytitle>overlay.js</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.js</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='overlay.js.frag'>
+<xsl:param name="overlay.js" select="'overlay.js'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+
+<refentry id="slides.js">
+<refmeta>
+<refentrytitle>slides.js</refentrytitle>
+<refmiscinfo role="type"></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.js</refname>
+<refpurpose></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment id='slides.js.frag'>
+<xsl:param name="slides.js" select="'slides.js'"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+
+<para>FIXME:</para>
+
+</refsect1>
+</refentry>
+</reference>
+
+<appendix><title>The Stylesheet</title>
+
+<para>The <filename>param.xsl</filename> stylesheet is just a wrapper
+around all these parameters.</para>
+
+<src:fragment id="top" mundane-result-prefixes="xsl">
+
+<!-- This file is generated from param.xweb; do not edit this file! -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                exclude-result-prefixes="src"
+                version='1.0'>
+
+<!-- ********************************************************************
+     $Id$
+     ********************************************************************
+
+     This file is part of the XSL DocBook Stylesheet distribution.
+     See ../README or http://nwalsh.com/docbook/xsl/ for copyright
+     and other information.
+
+     ******************************************************************** -->
+
+<src:fragref linkend="keyboard.nav.frag"/>
+<src:fragref linkend="css.stylesheet.frag"/>
+<src:fragref linkend="titlefoil.html.frag"/>
+<src:fragref linkend="toc.html.frag"/>
+<src:fragref linkend="output.indent.frag"/>
+<src:fragref linkend="overlay.frag"/>
+<src:fragref linkend="nav.separator.frag"/>
+<src:fragref linkend="toc.row.height.frag"/>
+<src:fragref linkend="toc.bg.color.frag"/>
+<src:fragref linkend="toc.width.frag"/>
+<src:fragref linkend="toc.hide.show.frag"/>
+<src:fragref linkend="dynamic.toc.frag"/>
+<src:fragref linkend="active.toc.frag"/>
+<src:fragref linkend="multiframe.frag"/>
+<src:fragref linkend="multiframe.top.bgcolor.frag"/>
+<src:fragref linkend="multiframe.bottom.bgcolor.frag"/>
+<src:fragref linkend="multiframe.navigation.height.frag"/>
+<src:fragref linkend="graphics.dir.frag"/>
+<src:fragref linkend="bullet.image.frag"/>
+<src:fragref linkend="right.image.frag"/>
+<src:fragref linkend="left.image.frag"/>
+<src:fragref linkend="plus.image.frag"/>
+<src:fragref linkend="minus.image.frag"/>
+<src:fragref linkend="hidetoc.image.frag"/>
+<src:fragref linkend="showtoc.image.frag"/>
+<src:fragref linkend="script.dir.frag"/>
+<src:fragref linkend="ua.js.frag"/>
+<src:fragref linkend="xbDOM.js.frag"/>
+<src:fragref linkend="xbStyle.js.frag"/>
+<src:fragref linkend="xbCollapsibleLists.js.frag"/>
+<src:fragref linkend="overlay.js.frag"/>
+<src:fragref linkend="slides.js.frag"/>
+
+</xsl:stylesheet>
+</src:fragment>
+
+</appendix>
+
+</book>
index a259800db21cd28798158f8eb50652b33dcc60fe..d0d39dfb0d4469d7ce69a1eceaf47d17d133b526 100644 (file)
@@ -2,39 +2,15 @@
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
 
-<xsl:import href="../../xsl/html/chunk.xsl"/>
+<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"/>
+<xsl:include href="jscript.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="param.xsl"/>
 
 <xsl:output method="html"/>
 
 <xsl:strip-space elements="slides foil section"/>
 
-<xsl:param name="css-stylesheet">slides.css</xsl:param>
-<xsl:param name="graphics.dir">graphics</xsl:param>
-<xsl:param name="toc.row.height">22</xsl:param>
-<xsl:param name="bullet.image" select="'bullet.gif'"/>
-<xsl:param name="minus.image" select="'minus.gif'"/>
-<xsl:param name="right.image" select="'right.gif'"/>
-<xsl:param name="left.image" select="'left.gif'"/>
-
-<xsl:param name="script.dir" select="''"/>
-<xsl:param name="overlay.js" select="'overlay.js'"/>
-<xsl:param name="slides.js" select="'slides.js'"/>
-<xsl:param name="list.js" select="'list.js'"/>
-<xsl:param name="resize.js" select="'resize.js'"/>
-
-<xsl:param name="titlefoil.html" select="'index.html'"/>
-<xsl:param name="toc.html" select="'toc.html'"/>
-
-<xsl:param name="toc.bg.color">#FFFFFF</xsl:param>
-<xsl:param name="toc.width">250</xsl:param>
-<xsl:param name="toc.hide.show" select="0"/>
-
-<xsl:param name="overlay" select="0"/>
-
-<xsl:param name="ie5" select="0"/>
-
-<xsl:param name="output.indent" select="'no'"/>
-
 <!-- ============================================================ -->
 
 <xsl:template name="overlayDiv.attributes">
 
 <!-- ============================================================ -->
 
-<xsl:template name="graphics.dir">
-  <!-- danger will robinson: template shadows parameter -->
-  <xsl:variable name="source.graphics.dir">
-    <xsl:call-template name="dbhtml-attribute">
-      <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
-      <xsl:with-param name="attribute" select="'graphics-dir'"/>
-    </xsl:call-template>
-  </xsl:variable>
-
-  <xsl:choose>
-    <xsl:when test="$source.graphics.dir != ''">
-      <xsl:value-of select="$source.graphics.dir"/>
-    </xsl:when>
-    <xsl:otherwise>
-      <xsl:value-of select="$graphics.dir"/>
-    </xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-<xsl:template name="css-stylesheet">
+<xsl:template name="css.stylesheet">
   <!-- danger will robinson: template shadows parameter -->
-  <xsl:variable name="source.css-stylesheet">
+  <xsl:variable name="source.css.stylesheet">
     <xsl:call-template name="dbhtml-attribute">
       <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
       <xsl:with-param name="attribute" select="'css-stylesheet'"/>
   </xsl:variable>
 
   <xsl:choose>
-    <xsl:when test="$source.css-stylesheet != ''">
-      <xsl:value-of select="$source.css-stylesheet"/>
+    <xsl:when test="$source.css.stylesheet != ''">
+      <xsl:value-of select="$source.css.stylesheet"/>
     </xsl:when>
     <xsl:otherwise>
-      <xsl:value-of select="$css-stylesheet"/>
+      <xsl:value-of select="$css.stylesheet"/>
     </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
 
-<xsl:template name="script-file">
-  <xsl:param name="js" select="'slides.js'"/>
-
-  <xsl:variable name="source.script.dir">
-    <xsl:call-template name="dbhtml-attribute">
-      <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
-      <xsl:with-param name="attribute" select="'script-dir'"/>
-    </xsl:call-template>
-  </xsl:variable>
-
-  <xsl:choose>
-    <xsl:when test="$source.script.dir != ''">
-      <xsl:value-of select="$source.script.dir"/>
-      <xsl:text>/</xsl:text>
-    </xsl:when>
-    <xsl:when test="$script.dir != ''">
-      <xsl:value-of select="$script.dir"/>
-      <xsl:text>/</xsl:text>
-    </xsl:when>
-  </xsl:choose>
-  <xsl:value-of select="$js"/>
-</xsl:template>
-
-<xsl:template name="slides.js">
-  <!-- danger will robinson: template shadows parameter -->
-  <xsl:call-template name="script-file">
-    <xsl:with-param name="js" select="$slides.js"/>
-  </xsl:call-template>
-</xsl:template>
-
-<xsl:template name="list.js">
-  <!-- danger will robinson: template shadows parameter -->
-  <xsl:call-template name="script-file">
-    <xsl:with-param name="js" select="$list.js"/>
-  </xsl:call-template>
-</xsl:template>
-
-<xsl:template name="resize.js">
-  <!-- danger will robinson: template shadows parameter -->
-  <xsl:call-template name="script-file">
-    <xsl:with-param name="js" select="$resize.js"/>
-  </xsl:call-template>
-</xsl:template>
-
-<xsl:template name="overlay.js">
-  <!-- danger will robinson: template shadows parameter -->
-  <xsl:call-template name="script-file">
-    <xsl:with-param name="js" select="$overlay.js"/>
-  </xsl:call-template>
-</xsl:template>
-
 <!-- ============================================================ -->
 
 <xsl:template match="/">
           <title><xsl:value-of select="slidesinfo/title"/></title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
-          </xsl:if>
+
           <link rel="top">
             <xsl:attribute name="href">
               <xsl:apply-templates select="/slides" mode="filename"/>
               <xsl:value-of select="/slides/slidesinfo/title[1]"/>
             </xsl:attribute>
           </link>
+
           <xsl:for-each select="section">
             <link rel="section">
               <xsl:attribute name="href">
               </xsl:attribute>
             </link>
           </xsl:for-each>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
+
+          <xsl:if test="$overlay != '0'">
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
         </head>
         <body class="tocpage">
           <xsl:call-template name="body.attributes"/>
               <xsl:text>overlaySetup('lc')</xsl:text>
             </xsl:attribute>
           </xsl:if>
+          <xsl:if test="$keyboard.nav != 0">
+            <xsl:attribute name="onkeypress">
+              <xsl:text>navigate(event)</xsl:text>
+            </xsl:attribute>
+          </xsl:if>
 
           <h1 class="title">
             <a href="{$titlefoil.html}">
                   <a href="{$titlefoil.html}">
                     <img alt="Next" border="0">
                       <xsl:attribute name="src">
-                        <xsl:call-template name="graphics.dir"/>
-                        <xsl:text>/</xsl:text>
-                        <xsl:value-of select="$right.image"/>
+                        <xsl:call-template name="right.image"/>
                       </xsl:attribute>
                     </img>
                   </a>
           <title><xsl:value-of select="title"/></title>
           <link type="text/css" rel="stylesheet">
             <xsl:attribute name="href">
-              <xsl:call-template name="css-stylesheet"/>
+              <xsl:call-template name="css.stylesheet"/>
             </xsl:attribute>
           </link>
-          <xsl:if test="$overlay != '0'">
-            <script type="text/javascript" language="JavaScript">
-              <xsl:attribute name="src">
-                <xsl:call-template name="overlay.js"/>
-              </xsl:attribute>
-            </script>
-          </xsl:if>
+
           <link rel="contents" href="{$toc.html}">
             <xsl:attribute name="title">
               <xsl:value-of select="(following::section|following::foil)[1]/title"/>
             </xsl:attribute>
           </link>
+
           <link rel="next">
             <xsl:attribute name="href">
               <xsl:apply-templates select="(following::section|following::foil)[1]"
               </xsl:attribute>
             </link>
           </xsl:for-each>
+
+          <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+            <script language="JavaScript1.2"/>
+          </xsl:if>
+
+          <xsl:if test="$keyboard.nav != 0">
+            <xsl:call-template name="ua.js"/>
+            <xsl:call-template name="xbDOM.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+            <xsl:call-template name="xbStyle.js"/>
+            <xsl:call-template name="xbCollapsibleLists.js"/>
+            <xsl:call-template name="slides.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
+
+          <xsl:if test="$overlay != '0'">
+            <xsl:call-template name="overlay.js">
+              <xsl:with-param name="language" select="'JavaScript'"/>
+            </xsl:call-template>
+          </xsl:if>
         </head>
         <body class="titlepage">
           <xsl:call-template name="body.attributes"/>
               <xsl:text>overlaySetup('lc')</xsl:text>
             </xsl:attribute>
           </xsl:if>
+          <xsl:if test="$keyboard.nav != 0">
+            <xsl:attribute name="onkeypress">
+              <xsl:text>navigate(event)</xsl:text>
+            </xsl:attribute>
+          </xsl:if>
 
           <xsl:call-template name="slidesinfo-top-nav"/>
 
             <xsl:if test="$overlay != 0">
               <hr/>
             </xsl:if>
+            <xsl:call-template name="slidesinfo-bottom-nav"/>
           </div>
-
-          <xsl:call-template name="slidesinfo-bottom-nav"/>
         </body>
       </html>
     </xsl:with-param>
         </span>
       </td>
       <td align="right" width="20%" valign="top">
-        <a href="foil01.html">
+        <a>
+          <xsl:attribute name="href">
+            <xsl:apply-templates select="(following::section|following::foil)[1]"
+                                 mode="filename"/>
+          </xsl:attribute>
           <img alt="Next" border="0">
             <xsl:attribute name="src">
-              <xsl:call-template name="graphics.dir"/>
-              <xsl:text>/</xsl:text>
-              <xsl:value-of select="$right.image"/>
+              <xsl:call-template name="right.image"/>
             </xsl:attribute>
           </img>
         </a>
         <title><xsl:value-of select="title"/></title>
         <link type="text/css" rel="stylesheet">
           <xsl:attribute name="href">
-            <xsl:call-template name="css-stylesheet"/>
+            <xsl:call-template name="css.stylesheet"/>
           </xsl:attribute>
         </link>
-        <xsl:if test="$overlay != '0'">
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="overlay.js"/>
-            </xsl:attribute>
-          </script>
-        </xsl:if>
 
-        <link rel="contents" href="{$toc.html}">
-          <xsl:attribute name="title">
-            <xsl:value-of select="(following::section|following::foil)[1]/title"/>
-          </xsl:attribute>
-        </link>
+        <xsl:call-template name="section-links"/>
 
-        <link rel="top">
-          <xsl:attribute name="href">
-            <xsl:apply-templates select="/slides" mode="filename"/>
-          </xsl:attribute>
-          <xsl:attribute name="title">
-            <xsl:value-of select="/slides/slidesinfo/title[1]"/>
-          </xsl:attribute>
-        </link>
-
-        <xsl:if test="parent::section">
-          <link rel="up">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="parent::section[1]" mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="parent::section[1]/title"/>
-            </xsl:attribute>
-          </link>
+        <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+          <script language="JavaScript1.2"/>
         </xsl:if>
 
-        <xsl:if test="$prevfoil">
-          <link rel="previous">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="$prevfoil" mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="$prevfoil/title"/>
-            </xsl:attribute>
-          </link>
+        <xsl:if test="$keyboard.nav != 0">
+          <xsl:call-template name="ua.js"/>
+          <xsl:call-template name="xbDOM.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
+          <xsl:call-template name="xbStyle.js"/>
+          <xsl:call-template name="xbCollapsibleLists.js"/>
+          <xsl:call-template name="slides.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
 
-        <xsl:if test="$nextfoil">
-          <link rel="next">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="$nextfoil" mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="$nextfoil/title"/>
-            </xsl:attribute>
-          </link>
+        <xsl:if test="$overlay != '0'">
+          <xsl:call-template name="overlay.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
-
-        <xsl:for-each select="foil">
-          <link rel="slides">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="." mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="title[1]"/>
-            </xsl:attribute>
-          </link>
-        </xsl:for-each>
-
-        <xsl:for-each select="../section">
-          <link rel="section">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="." mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="title[1]"/>
-            </xsl:attribute>
-          </link>
-        </xsl:for-each>
       </head>
       <body class="section">
         <xsl:call-template name="body.attributes"/>
             <xsl:text>overlaySetup('lc')</xsl:text>
           </xsl:attribute>
         </xsl:if>
+        <xsl:if test="$keyboard.nav != 0">
+          <xsl:attribute name="onkeypress">
+            <xsl:text>navigate(event)</xsl:text>
+          </xsl:attribute>
+        </xsl:if>
+
         <div class="{name(.)}" id="{$id}">
           <a name="{$id}"/>
           <xsl:call-template name="section-top-nav"/>
   <span class="navheader"><xsl:apply-templates/></span>
 </xsl:template>
 
+<xsl:template name="section-links">
+  <xsl:variable name="prevfoil"
+                select="(preceding::foil|/slides)[last()]"/>
+
+  <xsl:variable name="nextfoil" select="foil[1]"/>
+
+  <link rel="contents" href="{$toc.html}">
+    <xsl:attribute name="title">
+      <xsl:value-of select="(following::section|following::foil)[1]/title"/>
+    </xsl:attribute>
+  </link>
+
+  <link rel="top">
+    <xsl:attribute name="href">
+      <xsl:apply-templates select="/slides" mode="filename"/>
+    </xsl:attribute>
+    <xsl:attribute name="title">
+      <xsl:value-of select="/slides/slidesinfo/title[1]"/>
+    </xsl:attribute>
+  </link>
+
+  <xsl:if test="parent::section">
+    <link rel="up">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="parent::section[1]" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="parent::section[1]/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="$prevfoil">
+    <link rel="previous">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$prevfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$prevfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="$nextfoil">
+    <link rel="next">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$nextfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$nextfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:for-each select="foil">
+    <link rel="slides">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="." mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="title[1]"/>
+      </xsl:attribute>
+    </link>
+  </xsl:for-each>
+
+  <xsl:for-each select="../section">
+    <link rel="section">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="." mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="title[1]"/>
+      </xsl:attribute>
+    </link>
+  </xsl:for-each>
+</xsl:template>
+
 <!-- ============================================================ -->
 
 <xsl:template match="foil">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
-  <xsl:variable name="section" select="ancestor::section"/>
-
   <xsl:variable name="thisfoil">
     <xsl:apply-templates select="." mode="filename"/>
   </xsl:variable>
         <title><xsl:value-of select="title"/></title>
         <link type="text/css" rel="stylesheet">
           <xsl:attribute name="href">
-            <xsl:call-template name="css-stylesheet"/>
-          </xsl:attribute>
-        </link>
-        <xsl:if test="$overlay != '0'">
-          <script type="text/javascript" language="JavaScript">
-            <xsl:attribute name="src">
-              <xsl:call-template name="overlay.js"/>
-            </xsl:attribute>
-          </script>
-        </xsl:if>
-
-        <link rel="contents" href="{$toc.html}">
-          <xsl:attribute name="title">
-            <xsl:value-of select="(following::section|following::foil)[1]/title"/>
+            <xsl:call-template name="css.stylesheet"/>
           </xsl:attribute>
         </link>
 
-        <link rel="top">
-          <xsl:attribute name="href">
-            <xsl:apply-templates select="/slides" mode="filename"/>
-          </xsl:attribute>
-          <xsl:attribute name="title">
-            <xsl:value-of select="/slides/slidesinfo/title[1]"/>
-          </xsl:attribute>
-        </link>
-
-        <xsl:if test="parent::section">
-          <link rel="up">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="parent::section[1]" mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="parent::section[1]/title"/>
-            </xsl:attribute>
-          </link>
-        </xsl:if>
-
-        <xsl:if test="$prevfoil">
-          <link rel="previous">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="$prevfoil" mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="$prevfoil/title"/>
-            </xsl:attribute>
-          </link>
-        </xsl:if>
+        <xsl:call-template name="foil-links"/>
 
-        <xsl:if test="preceding-sibling::foil">
-          <link rel="first">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="preceding-sibling::foil[last()]"
-                                   mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="preceding-sibling::foil[last()]/title"/>
-            </xsl:attribute>
-          </link>
+        <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+          <script language="JavaScript1.2"/>
         </xsl:if>
 
-        <xsl:if test="$nextfoil">
-          <link rel="next">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="$nextfoil" mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="$nextfoil/title"/>
-            </xsl:attribute>
-          </link>
+        <xsl:if test="$keyboard.nav != 0">
+          <xsl:call-template name="ua.js"/>
+          <xsl:call-template name="xbDOM.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
+          <xsl:call-template name="xbStyle.js"/>
+          <xsl:call-template name="xbCollapsibleLists.js"/>
+          <xsl:call-template name="slides.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
 
-        <xsl:if test="following-sibling::foil">
-          <link rel="last">
-            <xsl:attribute name="href">
-              <xsl:apply-templates select="following-sibling::foil[last()]"
-                                   mode="filename"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-              <xsl:value-of select="following-sibling::foil[last()]/title"/>
-            </xsl:attribute>
-          </link>
+        <xsl:if test="$overlay != '0'">
+          <xsl:call-template name="overlay.js">
+            <xsl:with-param name="language" select="'JavaScript'"/>
+          </xsl:call-template>
         </xsl:if>
-
-          <xsl:for-each select="../../section">
-            <link rel="section">
-              <xsl:attribute name="href">
-                <xsl:apply-templates select="." mode="filename"/>
-              </xsl:attribute>
-              <xsl:attribute name="title">
-                <xsl:value-of select="title[1]"/>
-              </xsl:attribute>
-            </link>
-          </xsl:for-each>
-
-          <xsl:for-each select="../foil">
-            <link rel="slides">
-              <xsl:attribute name="href">
-                <xsl:apply-templates select="." mode="filename"/>
-              </xsl:attribute>
-              <xsl:attribute name="title">
-                <xsl:value-of select="title[1]"/>
-              </xsl:attribute>
-            </link>
-         </xsl:for-each>
       </head>
       <body class="foil">
         <xsl:call-template name="body.attributes"/>
             <xsl:text>overlaySetup('lc')</xsl:text>
           </xsl:attribute>
         </xsl:if>
+        <xsl:if test="$keyboard.nav != 0">
+          <xsl:attribute name="onkeypress">
+            <xsl:text>navigate(event)</xsl:text>
+          </xsl:attribute>
+        </xsl:if>
+
         <div class="{name(.)}" id="{$id}">
           <a name="{$id}"/>
           <xsl:call-template name="foil-top-nav"/>
   </h1>
 </xsl:template>
 
+<xsl:template name="foil-links">
+  <xsl:variable name="nextfoil" select="(following::foil
+                                        |following::section)[1]"/>
+
+  <xsl:variable name="prevfoil" select="(preceding-sibling::foil[1]
+                                        |parent::section[1]
+                                        |/slides)[last()]"/>
+
+
+  <link rel="contents" href="{$toc.html}">
+    <xsl:attribute name="title">
+      <xsl:value-of select="(following::section|following::foil)[1]/title"/>
+    </xsl:attribute>
+  </link>
+
+  <link rel="top">
+    <xsl:attribute name="href">
+      <xsl:apply-templates select="/slides" mode="filename"/>
+    </xsl:attribute>
+    <xsl:attribute name="title">
+      <xsl:value-of select="/slides/slidesinfo/title[1]"/>
+    </xsl:attribute>
+  </link>
+
+  <xsl:if test="parent::section">
+    <link rel="up">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="parent::section[1]" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="parent::section[1]/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="$prevfoil">
+    <link rel="previous">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$prevfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$prevfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="preceding-sibling::foil">
+    <link rel="first">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="preceding-sibling::foil[last()]"
+                             mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="preceding-sibling::foil[last()]/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="$nextfoil">
+    <link rel="next">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="$nextfoil" mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="$nextfoil/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:if test="following-sibling::foil">
+    <link rel="last">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="following-sibling::foil[last()]"
+                             mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="following-sibling::foil[last()]/title"/>
+      </xsl:attribute>
+    </link>
+  </xsl:if>
+
+  <xsl:for-each select="../../section">
+    <link rel="section">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="." mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="title[1]"/>
+      </xsl:attribute>
+    </link>
+  </xsl:for-each>
+
+  <xsl:for-each select="../foil">
+    <link rel="slides">
+      <xsl:attribute name="href">
+        <xsl:apply-templates select="." mode="filename"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="title[1]"/>
+      </xsl:attribute>
+    </link>
+  </xsl:for-each>
+</xsl:template>
+
+<!-- ============================================================ -->
+
 <xsl:template match="processing-instruction('Pub')">
   <xsl:variable name="pidata"><xsl:value-of select="(.)"/></xsl:variable>
   <xsl:choose>
 
 <!-- ============================================================ -->
 
-<xsl:template match="foil" mode="foil-filename">
-  <xsl:text>foil</xsl:text>
-  <xsl:number count="foil" level="any" format="01"/>
-  <xsl:text>.html</xsl:text>
-</xsl:template>
-
-<!-- ============================================================ -->
-
 <xsl:template match="slides" mode="toc">
   <p class="toctitle">
     <b>
 
   <xsl:text>myList.addItem('</xsl:text>
 
-  <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+  <xsl:text disable-output-escaping="yes">&lt;DIV id="</xsl:text>
   <xsl:value-of select="$id"/>
   <xsl:text disable-output-escaping="yes">" class="toc-slidesinfo"&gt;</xsl:text>
 
-  <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+  <xsl:text disable-output-escaping="yes">&lt;A href="</xsl:text>
   <xsl:value-of select="$titlefoil.html"/>
   <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
 
     </xsl:otherwise>
   </xsl:choose>
 
-  <xsl:text disable-output-escaping="yes">&lt;/a&gt;&lt;/div&gt;</xsl:text>
+  <xsl:text disable-output-escaping="yes">&lt;/A&gt;&lt;/DIV&gt;</xsl:text>
   <xsl:text>');&#10;</xsl:text>
 </xsl:template>
 
 <xsl:template match="section" mode="ns-toc">
-  <xsl:variable name="foil">
-    <xsl:apply-templates select="foil[1]" mode="foil-filename"/>
+  <xsl:variable name="id">
+    <xsl:call-template name="object.id"/>
   </xsl:variable>
 
   <xsl:text>subList = new List(false, width, height, "</xsl:text>
   <xsl:apply-templates select="foil" mode="ns-toc"/>
 
   <xsl:text>myList.addList(subList, '</xsl:text>
-  <xsl:text disable-output-escaping="yes">&lt;div class="toc-section"&gt;</xsl:text>
 
-  <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
-  <xsl:value-of select="$foil"/>
+  <xsl:text disable-output-escaping="yes">&lt;DIV id="</xsl:text>
+  <xsl:value-of select="$id"/>
+  <xsl:text disable-output-escaping="yes">" class="toc-section"&gt;</xsl:text>
+
+  <xsl:text disable-output-escaping="yes">&lt;A href="</xsl:text>
+  <xsl:apply-templates select="." mode="filename"/>
   <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
 
   <xsl:choose>
     </xsl:otherwise>
   </xsl:choose>
 
-  <xsl:text disable-output-escaping="yes">&lt;/a&gt;&lt;/div&gt;</xsl:text>
+  <xsl:text disable-output-escaping="yes">&lt;/A&gt;&lt;/DIV&gt;</xsl:text>
   <xsl:text>');&#10;</xsl:text>
 </xsl:template>
 
 <xsl:template match="foil" mode="ns-toc">
   <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
-  <xsl:variable name="foil">
-    <xsl:apply-templates select="." mode="foil-filename"/>
-  </xsl:variable>
 
   <xsl:choose>
     <xsl:when test="ancestor::section">
     </xsl:otherwise>
   </xsl:choose>
 
-  <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+  <xsl:text disable-output-escaping="yes">&lt;DIV id="</xsl:text>
   <xsl:value-of select="$id"/>
   <xsl:text disable-output-escaping="yes">" class="toc-foil"&gt;</xsl:text>
 
   <xsl:text disable-output-escaping="yes">&lt;img alt="-" src="</xsl:text>
-  <xsl:call-template name="graphics.dir"/>
-  <xsl:text>/</xsl:text>
-  <xsl:value-of select="$bullet.image"/>
+  <xsl:call-template name="bullet.image"/>
   <xsl:text disable-output-escaping="yes">"&gt;</xsl:text>
 
-  <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
-  <xsl:value-of select="$foil"/>
+  <xsl:text disable-output-escaping="yes">&lt;A href="</xsl:text>
+  <xsl:apply-templates select="." mode="filename"/>
   <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
 
   <xsl:choose>
     </xsl:otherwise>
   </xsl:choose>
 
-  <xsl:text disable-output-escaping="yes">&lt;/a&gt;&lt;/div&gt;</xsl:text>
+  <xsl:text disable-output-escaping="yes">&lt;/A&gt;&lt;/DIV&gt;</xsl:text>
   <xsl:text>');&#10;</xsl:text>
 </xsl:template>
 
                 </xsl:if>
                 <img alt="Prev" border="0">
                   <xsl:attribute name="src">
-                    <xsl:call-template name="graphics.dir"/>
-                    <xsl:text>/</xsl:text>
-                    <xsl:value-of select="$left.image"/>
+                    <xsl:call-template name="left.image"/>
                   </xsl:attribute>
                 </img>
               </a>
                 </xsl:if>
                 <img alt="Next" border="0">
                   <xsl:attribute name="src">
-                    <xsl:call-template name="graphics.dir"/>
-                    <xsl:text>/</xsl:text>
-                    <xsl:value-of select="$right.image"/>
+                    <xsl:call-template name="right.image"/>
                   </xsl:attribute>
                 </img>
               </a>
                 </xsl:if>
                 <img alt="Prev" border="0">
                   <xsl:attribute name="src">
-                    <xsl:call-template name="graphics.dir"/>
-                    <xsl:text>/</xsl:text>
-                    <xsl:value-of select="$left.image"/>
+                    <xsl:call-template name="left.image"/>
                   </xsl:attribute>
                 </img>
               </a>
                 </xsl:if>
                 <img alt="Next" border="0">
                   <xsl:attribute name="src">
-                    <xsl:call-template name="graphics.dir"/>
-                    <xsl:text>/</xsl:text>
-                    <xsl:value-of select="$right.image"/>
+                    <xsl:call-template name="right.image"/>
                   </xsl:attribute>
                 </img>
               </a>
 </xsl:template>
 
 <xsl:template name="generate.toc.hide.show">
-  <xsl:if test="$toc.hide.show=1 and $ie5=1">
-    <td>    
+  <xsl:if test="$toc.hide.show != 0">
+    <td>
       <img hspace="4">
-       <xsl:attribute name="src">
-         <xsl:call-template name="graphics.dir"/>
-         <xsl:text>/</xsl:text>
-         <xsl:value-of select="'hidetoc.gif'"/>
+        <xsl:attribute name="src">
+          <xsl:call-template name="hidetoc.image"/>
        </xsl:attribute>
        <xsl:attribute name="onClick">
-if (parent.parent.document.all.topframe.cols=="0,*") 
-{ 
-   parent.parent.document.all.topframe.cols="<xsl:value-of select="$toc.width"/>,*"; 
-   this.src = "<xsl:call-template name="graphics.dir"/>
-              <xsl:text>/</xsl:text>
-              <xsl:value-of select="'hidetoc.gif'"/>";
-}
-else 
-{
+if (parent.parent.document.all.topframe.cols=="0,*") {
+   parent.parent.document.all.topframe.cols="<xsl:value-of select="$toc.width"/>,*";
+   this.src = "<xsl:call-template name="hidetoc.image"/>";
+} else {
    parent.parent.document.all.topframe.cols="0,*";
-   this.src = "<xsl:call-template name="graphics.dir"/>
-              <xsl:text>/</xsl:text>
-              <xsl:value-of select="'showtoc.gif'"/>";
-};              
+   this.src = "<xsl:call-template name="showtoc.image"/>";
+};
        </xsl:attribute>
       </img>
     </td>