]> granicus.if.org Git - docbook-dsssl/commitdiff
Browser files
authorNorman Walsh <ndw@nwalsh.com>
Mon, 16 Sep 2002 23:59:58 +0000 (23:59 +0000)
committerNorman Walsh <ndw@nwalsh.com>
Mon, 16 Sep 2002 23:59:58 +0000 (23:59 +0000)
13 files changed:
slides/demo/browser/overlay.js [new file with mode: 0644]
slides/demo/browser/slides-default.css [new file with mode: 0644]
slides/demo/browser/slides-frames.css [new file with mode: 0644]
slides/demo/browser/slides-plain.css [new file with mode: 0644]
slides/demo/browser/slides-table.css [new file with mode: 0644]
slides/demo/browser/slides-w3c.css [new file with mode: 0644]
slides/demo/browser/slides.css [new file with mode: 0644]
slides/demo/browser/slides.js [new file with mode: 0644]
slides/demo/browser/ua.js [new file with mode: 0644]
slides/demo/browser/xbCollapsibleLists.js [new file with mode: 0644]
slides/demo/browser/xbDOM.js [new file with mode: 0644]
slides/demo/browser/xbDebug.js [new file with mode: 0644]
slides/demo/browser/xbStyle.js [new file with mode: 0644]

diff --git a/slides/demo/browser/overlay.js b/slides/demo/browser/overlay.js
new file mode 100644 (file)
index 0000000..9b52d9b
--- /dev/null
@@ -0,0 +1,140 @@
+// -*- Java -*-
+//
+// Overlay.js, adapted from Floating image II on dynamicdrive.com
+/* Usage:
+<html>
+<head>
+<script LANGUAGE="JavaScript1.2" src="overlay.js"></script>
+...rest of head...
+</head>
+<body onload="overlaySetup(corner)">
+<div id="overlayDiv" STYLE="position:absolute;visibility:visible;">
+...body of overlay...
+</div>
+...rest of page...
+*/
+
+var overlayNS4 = document.layers ? 1 : 0;
+var overlayIE  = document.all ? 1 : 0;
+var overlayNS6 = document.getElementById && !document.all ? 1 : 0;
+
+var overlayPadX = 15;
+var overlayPadY = 15;
+var overlayDelay = 60;
+
+var overlayCorner = 'ur'; // ul, ll, ur, lr, uc, lc, cl, cr
+
+function overlayRefresh() {
+    var overlayLx = 0;
+    var overlayLy = 0;
+
+    var overlayX = 0;
+    var overlayY = 0;
+    var overlayW = 0;
+    var overlayH = 0;
+    var contentH = 0;
+
+    var body = xbGetElementsByName('BODY')[0];
+
+    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  = body.offsetWidth; // overlayDiv.offsetWidth;
+       contentH  = body.offsetHeight;
+    } else if (overlayNS4) {
+       overlayLy = window.innerHeight;
+       overlayLx = window.innerWidth;
+       overlayH  = document.overlayDiv.clip.height;
+       overlayW  = body.clip.width; // document.overlayDiv.clip.width;
+       contentH  = body.clip.height;
+    } else if (overlayNS6) {
+       var odiv = document.getElementById('overlayDiv');
+
+       overlayLy = window.innerHeight;
+       overlayLx = window.innerWidth;
+       overlayH  = odiv.offsetHeight;
+       overlayW  = body.offsetWidth; // odiv.offsetWidth;
+       contentH  = body.offsetHeight;
+    }
+
+    if (overlayCorner == 'ul') {
+       overlayX = overlayPadX;
+       overlayY = overlayPadY;
+    } else if (overlayCorner == 'cl') {
+       overlayX = overlayPadX;
+       overlayY = (overlayLy - overlayH) / 2;
+    } else if (overlayCorner == 'll') {
+       overlayX = overlayPadX;
+       overlayY = (overlayLy - overlayH) - overlayPadY;
+    } else if (overlayCorner == 'ur') {
+       overlayX = (overlayLx - overlayW) - overlayPadX;
+       overlayY = overlayPadY;
+    } else if (overlayCorner == 'cr') {
+       overlayX = (overlayLx - overlayW) - overlayPadX;
+       overlayY = (overlayLy - overlayH) / 2;
+    } else if (overlayCorner == 'lr') {
+       overlayX = (overlayLx - overlayW) - overlayPadX;
+       overlayY = (overlayLy - overlayH) - overlayPadY;
+    } else if (overlayCorner == 'uc') {
+       overlayX = (overlayLx - overlayW) / 2;
+       overlayY = overlayPadY;
+    } else { // overlayCorner == 'lc'
+       overlayX = (overlayLx - overlayW) / 2;
+       overlayY = (overlayLy - overlayH) - overlayPadY;
+    }
+
+    if (overlayIE) {
+       overlayDiv.style.left=overlayX;
+       overlayDiv.style.top=overlayY+document.body.scrollTop;
+
+       if (contentH > overlayLy) {
+           overlayDiv.style.visibility = "hidden";
+       }
+    } else if (overlayNS4) {
+       document.overlayDiv.pageX=overlayX;
+       document.overlayDiv.pageY=overlayY+window.pageYOffset;
+       document.overlayDiv.visibility="visible";
+
+       if (contentH > overlayLy) {
+           document.overlayDiv.style.visibility = "hidden";
+       }
+    } else if (overlayNS6) {
+       var div = document.getElementById("overlayDiv");
+       var leftpx = overlayX;
+       var toppx = overlayY+window.pageYOffset;
+       var widthpx = overlayW;
+
+       div.style.left = leftpx + "px";
+       div.style.top = toppx + "px";
+       div.style.width = widthpx + "px";
+
+       if (contentH > overlayLy) {
+           div.style.visibility = "hidden";
+       }
+    }
+}
+
+function onad() {
+    loopfunc();
+}
+
+function loopfunc() {
+    overlayRefresh();
+    setTimeout('loopfunc()',overlayDelay);
+}
+
+function overlaySetup(corner) {
+    overlayCorner = corner;
+
+    if (overlayIE || overlayNS4 || overlayNS6) {
+       onad();
+    }
+}
diff --git a/slides/demo/browser/slides-default.css b/slides/demo/browser/slides-default.css
new file mode 100644 (file)
index 0000000..1022d6b
--- /dev/null
@@ -0,0 +1,9 @@
+@import url('slides.css');
+
+.toclink { font-size: 10pt;
+             font-weight: normal;
+           }
+
+.toclink a         { color: blue; }
+.toclink a:link    { color: blue; }
+.toclink a:visited { color: blue; }
diff --git a/slides/demo/browser/slides-frames.css b/slides/demo/browser/slides-frames.css
new file mode 100644 (file)
index 0000000..47d6f8f
--- /dev/null
@@ -0,0 +1,73 @@
+@import url('slides.css');
+
+.toc-body             { margin-left: 2px;
+                        margin-right: 2px;
+                      }
+
+.foil-body            { margin-left: 2px;
+                        margin-right: 2px;
+                      }
+
+h1.title              { margin-top: 0px;
+                        padding-top: 0px;
+                      }
+
+.navhead              { display: visible;
+                      }
+
+.navfoot              { display: visible;
+                      }
+
+/* ====================================================================== */
+
+.navfoot              { border-top: 1px solid black;
+                        margin-top: 10px;
+                        padding-top: 4px;
+                      }
+/* ====================================================================== */
+
+.toc                  { font-weight: bold;
+                        font-size: 10pt;
+                      }
+
+.toc a                { text-decoration: none; }
+.toc a:link           { color: blue; }
+.toc a:visited        { color: blue; }
+
+.toc .toc-foilgroup a         { color: red; }
+.toc .toc-foilgroup a:link    { color: red; }
+.toc .toc-foilgroup a:visited { color: red; }
+
+.toc .toc-titlefoil a         { color: black; }
+.toc .toc-titlefoil a:link    { color: black; }
+.toc .toc-titlefoil a:visited { color: black; }
+
+.toc .toc-foil a         { color: blue; }
+.toc .toc-foil a:link    { color: blue; }
+.toc .toc-foil a:visited { color: blue; }
+
+.toc-slidesinfo       { font-family: sans-serif;
+                        font-weight: bold;
+                        text-align: center;
+                      }
+
+.toc-titlefoil        { font-family: sans-serif;
+                        font-weight: bold;
+                        text-align: center;
+                      }
+
+.toc-foilgroup        { font-family: sans-serif;
+                        margin-left: 0.25in;
+                        text-indent: -0.25in;
+                       font-weight: bold;
+                        color: red;
+                      }
+
+.toc-foil             { font-family: sans-serif;
+                        font-size: 10pt;
+                        margin-left: 0.25in;
+                        text-indent: -0.4in;
+                       font-weight: bold;
+                        color: blue;
+                      }
+
diff --git a/slides/demo/browser/slides-plain.css b/slides/demo/browser/slides-plain.css
new file mode 100644 (file)
index 0000000..c22f289
--- /dev/null
@@ -0,0 +1 @@
+@import url('slides.css');
diff --git a/slides/demo/browser/slides-table.css b/slides/demo/browser/slides-table.css
new file mode 100644 (file)
index 0000000..1c195c9
--- /dev/null
@@ -0,0 +1,41 @@
+@import url('slides.css');
+
+.toc-body             { margin-left: 2px;
+                        margin-right: 2px;
+                      }
+
+.foil-body            { margin-left: 2px;
+                        margin-right: 2px;
+                      }
+
+.foilgroup-body       { margin-left: 2px;
+                        margin-right: 2px;
+                      }
+
+h1.title              { 
+                        margin-top: 0px;
+                        padding-top: 0px;
+                      }
+
+/* ToC Stuff */
+
+.ttoc                 {
+                        font-size: 10pt;
+                       color: white;
+                      }
+
+.ttoc a               { text-decoration: none; }
+.ttoc a:link          { color: white }
+.ttoc a:visited       { color: white }
+
+.ttoc-title           {
+                        font-size: 10pt;
+                      }
+
+.ttoc-foilset         {
+                        font-size: 10pt;
+                      }
+
+.ttoc-foil            {
+                        font-size: 10pt;
+                      }
diff --git a/slides/demo/browser/slides-w3c.css b/slides/demo/browser/slides-w3c.css
new file mode 100644 (file)
index 0000000..c22f289
--- /dev/null
@@ -0,0 +1 @@
+@import url('slides.css');
diff --git a/slides/demo/browser/slides.css b/slides/demo/browser/slides.css
new file mode 100644 (file)
index 0000000..0febaa4
--- /dev/null
@@ -0,0 +1,115 @@
+/* General formatting */
+
+body                  { font-family: sans-serif;
+                        font-weight: bold;
+                      }
+
+.copyright            { color: #7F7F7F;
+                      }
+
+/* Title page formatting */
+
+.slidesinfo           { text-align: center; }
+
+.slidesinfo h1.title  { color: blue;
+                      }
+
+.slidesinfo h1.author { color: green;
+                      }
+
+.slidesinfo .copyright { color: black;
+                      }
+
+
+/* ToC page formatting */
+
+.tocpage h1.title     { color: blue;
+                       text-align: center;
+                      }
+
+.tocpage a            { text-decoration: none; }
+.tocpage a:link       { color: blue; }
+.tocpage a:visited    { color: blue; }
+
+.toc-body             { margin-left: 0.5in;
+                        margin-right: 0.5in;
+                      }
+
+/* Foil page formatting */
+
+.foil                 { font-size: 16pt;
+                      }
+.foil h1.title        { text-align: center;
+                        color: blue;
+                       padding-top: 0pt;
+                       margin-top: 0pt;
+                      }
+.foil h2.subtitle     { text-align: center;
+                        color: blue;
+                       padding-top: 0pt;
+                       margin-top: 0pt;
+                      }
+
+.foil pre             { font-size: 18pt;
+                      }
+
+.foil-body            { margin-left: 0.5in;
+                        margin-right: 0.5in;
+                      }
+
+/* Foilgroup page formatting */
+
+.foilgroup            { font-size: 16pt;
+                      }
+.foilgroup h1.title   { text-align: center;
+                        color: red;
+                       padding-top: 0pt;
+                       margin-top: 0pt;
+                      }
+.foilgroup h2.subtitle { text-align: center;
+                        color: blue;
+                       padding-top: 0pt;
+                       margin-top: 0pt;
+                      }
+
+.foilgroup-body       { margin-left: 0.5in;
+                        margin-right: 0.5in;
+                      }
+
+/* Navigation header formatting */
+
+.navhead              { border-bottom: 1px solid black;
+                        margin-bottom: 10px;
+                        padding-bottom: 4px;
+                      }
+
+.navhead hr.top-nav-sep { display: none; }
+
+.navhead .slidestitle { font-weight: normal;
+                        font-size: 10pt;
+                        font-style: italic;
+                      }
+
+/* Navigation footer formatting */
+
+.navfoot              { border-top: 1px solid black;
+                        margin-top: 10px;
+                        padding-top: 4px;
+                      }
+
+.navfoot hr.bottom-nav-sep { display: none; }
+
+/* General navigation formatting */
+
+.link-text            { font-weight: bold
+                        font-size: 10pt;
+                      }
+
+
+.link-text a          { text-decoration: none; }
+.link-text a:link     { color: blue; }
+.link-text a:visited  { color: blue; }
+
+.no-link-text         { color: #7F7F7F; }
+
+/* EOF */
diff --git a/slides/demo/browser/slides.js b/slides/demo/browser/slides.js
new file mode 100644 (file)
index 0000000..b946c56
--- /dev/null
@@ -0,0 +1,87 @@
+// -*- 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";
+           }
+
+           var tdiv = xbGetElementById(xid, mytoc);
+
+           if (tdiv) {
+               var ta = tdiv.getElementsByTagName("a").item(0);
+               ta.style.textDecoration = "underline";
+               mytoc.lastUnderlined = ta;
+           }
+       }
+    }
+
+    if (overlay != 0) {
+       overlaySetup('lc');
+    }
+}
+
+
+function navigate (evt) {
+    var kc = -1;
+
+    if (navigator.org == 'microsoft') {
+       kc = window.event.keyCode;
+    } else {
+       kc = evt.which;
+    }
+
+    var forward = (kc==32) || (kc==13) || (kc==110) || (kc==78);
+    var backward = (kc==80) || (kc==112);
+
+    var links = xbGetElementsByName("LINK");
+    var count = 0;
+    var target = "";
+
+    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");
+       }
+    }
+
+    if (target != "") {
+       window.location = target;
+    }
+}
+
+function toggletoc (img, width, hidegraphic, showgraphic) {
+    var fsc = xbGetElementsByName('FRAMESET',top);
+    if (fsc) {
+       var fs = fsc[0];
+       if (fs) {
+           if (fs.cols == "0,*") {
+               fs.cols = width + ",*";
+               img.src = hidegraphic;
+           } else {
+               fs.cols = "0,*";
+               img.src = showgraphic;
+           }
+       }
+    }
+}
+
diff --git a/slides/demo/browser/ua.js b/slides/demo/browser/ua.js
new file mode 100644 (file)
index 0000000..236822c
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ua.js revision 0.200 2001-12-03
+
+Contributor(s): Bob Clary, Netscape Communications, Copyright 2001
+
+Netscape grants you a royalty free license to use, modify and 
+distribute this software provided that this copyright notice 
+appears on all copies.  This software is provided "AS IS," 
+without a warranty of any kind.
+*/
+
+function xbDetectBrowser()
+{
+  var oldOnError = window.onerror;
+  var element = null;
+
+  window.onerror = null;
+  
+  // work around bug in xpcdom Mozilla 0.9.1
+  window.saveNavigator = window.navigator;
+
+  navigator.OS    = '';
+  navigator.version  = parseFloat(navigator.appVersion);
+  navigator.org    = '';
+  navigator.family  = '';
+
+  var platform;
+  if (typeof(window.navigator.platform) != 'undefined')
+  {
+    platform = window.navigator.platform.toLowerCase();
+    if (platform.indexOf('win') != -1)
+      navigator.OS = 'win';
+    else if (platform.indexOf('mac') != -1)
+      navigator.OS = 'mac';
+    else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)
+      navigator.OS = 'nix';
+  }
+
+  var i = 0;
+  var ua = window.navigator.userAgent.toLowerCase();
+  
+  if (ua.indexOf('opera') != -1)
+  {
+    i = ua.indexOf('opera');
+    navigator.family  = 'opera';
+    navigator.org    = 'opera';
+    navigator.version  = parseFloat('0' + ua.substr(i+6), 10);
+  }
+  else if ((i = ua.indexOf('msie')) != -1)
+  {
+    navigator.org    = 'microsoft';
+    navigator.version  = parseFloat('0' + ua.substr(i+5), 10);
+    
+    if (navigator.version < 4)
+      navigator.family = 'ie3';
+    else
+      navigator.family = 'ie4'
+  }
+  else if (ua.indexOf('gecko') != -1)
+  {
+    navigator.family = 'gecko';
+    var rvStart = navigator.userAgent.indexOf('rv:') + 3;
+    var rvEnd = navigator.userAgent.indexOf(')', rvStart);
+    var rv = navigator.userAgent.substring(rvStart, rvEnd);
+    var decIndex = rv.indexOf('.');
+    if (decIndex != -1)
+    {
+      rv = rv.replace(/\./g, '')
+      rv = rv.substring(0, decIndex-1) + '.' + rv.substr(decIndex)
+    }
+    navigator.version = parseFloat(rv);
+
+    if (ua.indexOf('netscape') != -1)
+      navigator.org = 'netscape';
+    else if (ua.indexOf('compuserve') != -1)
+      navigator.org = 'compuserve';
+    else
+      navigator.org = 'mozilla';
+  }
+  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))
+  {
+    var is_major = parseFloat(navigator.appVersion);
+    
+    if (is_major < 4)
+      navigator.version = is_major;
+    else
+    {
+      i = ua.lastIndexOf('/')
+      navigator.version = parseFloat('0' + ua.substr(i+1), 10);
+    }
+    navigator.org = 'netscape';
+    navigator.family = 'nn' + parseInt(navigator.appVersion);
+  }
+  else if ((i = ua.indexOf('aol')) != -1 )
+  {
+    // aol
+    navigator.family  = 'aol';
+    navigator.org    = 'aol';
+    navigator.version  = parseFloat('0' + ua.substr(i+4), 10);
+  }
+  else if ((i = ua.indexOf('hotjava')) != -1 )
+  {
+    // hotjava
+    navigator.family  = 'hotjava';
+    navigator.org    = 'sun';
+    navigator.version  = parseFloat(navigator.appVersion);
+  }
+
+  window.onerror = oldOnError;
+}
+
+xbDetectBrowser();
+
diff --git a/slides/demo/browser/xbCollapsibleLists.js b/slides/demo/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/demo/browser/xbDOM.js b/slides/demo/browser/xbDOM.js
new file mode 100644 (file)
index 0000000..40bcb8f
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+xbDOM.js v 0.004 2002-03-09
+
+Contributor(s): Bob Clary, Netscape Communications, Copyright 2001, 2002
+
+Netscape grants you a royalty free license to use, modify and 
+distribute this software provided that this copyright notice 
+appears on all copies.  This software is provided "AS IS," 
+without a warranty of any kind.
+
+Change Log: 
+
+2002-03-15: v 0.004
+  bclary -
+    fix bug in bugfix for 0.003 in xbGetElementsByName 
+    to not confuse elements with length properties with arrays
+
+2002-03-09: v 0.003
+  bclary -
+    fix bug in xbGetElementsByName in Internet Explorer when there is
+    only one instance of an element with name value.
+
+2002-01-19: v 0.002
+  bclary - 
+    nav4FindElementsByName
+      removed erroneous obj and return
+      added search of form elements
+    xbFindElementsByNameAndType
+      renamed from FindElementsByNameAndType
+      removed erroneouse obj and return
+    xbSetInnerHTML
+      ported over from xbStyle since it is more
+      appropriate here.
+
+2001-11-27: v 0.01
+  bclary - 
+    removed from xbStyle
+*/
+
+function xbToInt(s)
+{
+  var i = parseInt(s, 10);
+  if (isNaN(i))
+    i = 0;
+
+  return i;
+}
+
+function xbGetWindowWidth(windowRef)
+{
+  var width = 0;
+
+  if (!windowRef)
+    windowRef = window;
+  
+  if (typeof(windowRef.innerWidth) == 'number')
+    width = windowRef.innerWidth;
+  else if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')
+    width = windowRef.document.body.clientWidth;  
+    
+  return width;
+}
+
+function xbGetWindowHeight(windowRef)
+{
+  var height = 0;
+  
+  if (!windowRef)
+    windowRef = window;
+
+  if (typeof(windowRef.innerWidth) == 'number')
+    height = windowRef.innerHeight;
+  else if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')
+    height = windowRef.document.body.clientHeight;    
+
+  return height;
+}
+
+function nav4FindLayer(doc, id)
+{
+  var i;
+  var subdoc;
+  var obj;
+  
+  for (i = 0; i < doc.layers.length; ++i)
+  {
+    if (doc.layers[i].id && id == doc.layers[i].id)
+      return doc.layers[i];
+      
+    subdoc = doc.layers[i].document;
+    obj    = nav4FindLayer(subdoc, id);
+    if (obj != null)
+      return obj;
+  }
+  return null;
+}
+
+function nav4FindElementsByName(doc, name, elmlist)
+{
+  var i;
+  var j;
+  var subdoc;
+
+  for (i = 0; i < doc.images.length; ++i)
+  {
+    if (doc.images[i].name && name == doc.images[i].name)
+      elmlist[elmlist.length] = doc.images[i];
+  }
+
+  for (i = 0; i < doc.forms.length; ++i)
+  {
+    for (j = 0; j < doc.forms[i].elements.length; j++)
+      if (doc.forms[i].elements[j].name && name == doc.forms[i].elements[j].name)
+        elmlist[elmlist.length] = doc.forms[i].elements[j];
+
+    if (doc.forms[i].name && name == doc.forms[i].name)
+      elmlist[elmlist.length] = doc.forms[i];
+  }
+
+  for (i = 0; i < doc.anchors.length; ++i)
+  {
+    if (doc.anchors[i].name && name == doc.anchors[i].name)
+      elmlist[elmlist.length] = doc.anchors[i];
+  }
+
+  for (i = 0; i < doc.links.length; ++i)
+  {
+    if (doc.links[i].name && name == doc.links[i].name)
+      elmlist[elmlist.length] = doc.links[i];
+  }
+
+  for (i = 0; i < doc.applets.length; ++i)
+  {
+    if (doc.applets[i].name && name == doc.applets[i].name)
+      elmlist[elmlist.length] = doc.applets[i];
+  }
+
+  for (i = 0; i < doc.embeds.length; ++i)
+  {
+    if (doc.embeds[i].name && name == doc.embeds[i].name)
+      elmlist[elmlist.length] = doc.embeds[i];
+  }
+
+  for (i = 0; i < doc.layers.length; ++i)
+  {
+    if (doc.layers[i].name && name == doc.layers[i].name)
+      elmlist[elmlist.length] = doc.layers[i];
+      
+    subdoc = doc.layers[i].document;
+    nav4FindElementsByName(subdoc, name, elmlist);
+  }
+}
+
+function xbGetElementsByNameAndType(name, type, windowRef)
+{
+  if (!windowRef)
+    windowRef = window;
+
+  var elmlist = new Array();
+
+  xbFindElementsByNameAndType(windowRef.document, name, type, elmlist);
+
+  return elmlist;
+}
+
+function xbFindElementsByNameAndType(doc, name, type, elmlist)
+{
+  var i;
+  var subdoc;
+  
+  for (i = 0; i < doc[type].length; ++i)
+  {
+    if (doc[type][i].name && name == doc[type][i].name)
+      elmlist[elmlist.length] = doc[type][i];
+  }
+
+  if (doc.layers)
+  {
+    for (i = 0; i < doc.layers.length; ++i)
+    {
+      subdoc = doc.layers[i].document;
+      xbFindElementsByNameAndType(subdoc, name, type, elmlist);
+    }
+  }
+}
+
+//alert("layers: " + document.layers + " all: " + document.all);
+
+if (document.layers)
+{
+  xbGetElementById = function (id, windowRef)
+  {
+    if (!windowRef)
+      windowRef = window;
+
+    return nav4FindLayer(windowRef.document, id);
+  };
+
+  xbGetElementsByName = function (name, windowRef)
+  {
+    if (!windowRef)
+      windowRef = window;
+
+    var elmlist = new Array();
+
+    nav4FindElementsByName(windowRef.document, name, elmlist);
+
+    return elmlist;
+  };
+
+}
+else if (document.all)
+{
+  xbGetElementById = function (id, windowRef)
+  {
+    if (!windowRef) windowRef = window;
+    var elm = windowRef.document.all[id];
+    if (!elm) elm = null;
+    return elm;
+  };
+
+  xbGetElementsByName = function (name, windowRef)
+  {
+    if (!windowRef) windowRef = window; 
+
+    var i;
+    var idnamelist = windowRef.document.all.tags(name);
+    var elmlist = new Array();
+
+    if (!idnamelist) {
+      return null;
+    }
+
+    if (!idnamelist.length || idnamelist.name == name)
+    {
+      if (idnamelist)
+        elmlist[elmlist.length] = idnamelist;
+    }
+    else
+    {
+      for (i = 0; i < idnamelist.length; i++)
+      {
+        if (idnamelist.item(i).tagName == name)
+          elmlist[elmlist.length] = idnamelist[i];
+      }
+    }
+
+    return elmlist;
+  }
+
+}
+else if (document.getElementById)
+{
+  xbGetElementById = function (id, windowRef) { if (!windowRef) windowRef = window; return windowRef.document.getElementById(id); };
+  xbGetElementsByName = function (name, windowRef) { if (!windowRef) windowRef = window; return windowRef.document.getElementsByTagName(name); };
+}
+else 
+{
+  xbGetElementById = function (id, windowRef) { return null; }
+  xbGetElementsByName = function (name, windowRef) { return new Array(); }
+}
+
+if (typeof(window.pageXOffset) == 'number')
+{
+  xbGetPageScrollX = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.pageXOffset; };
+  xbGetPageScrollY = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.pageYOffset; };
+}
+else if (document.all)
+{
+  xbGetPageScrollX = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.document.body.scrollLeft; };
+  xbGetPageScrollY = function (windowRef) { if (!windowRef) windowRef = window; return windowRef.document.body.scrollTop; };
+}
+else
+{
+  xbGetPageScrollX = function (windowRef) { return 0; };
+  xbGetPageScrollY = function (windowRef) { return 0; };
+}
+
+if (document.layers)
+{
+  xbSetInnerHTML = function (element, str) { element.document.write(str); element.document.close(); };
+}
+else if (document.all || document.getElementById)
+{
+  xbSetInnerHTML = function (element, str) { if (typeof(element.innerHTML) != 'undefined') element.innerHTML = str; };
+}
+else
+{
+  xbSetInnerHTML = function (element, str) {};
+}
+
+
+// eof: xbDOM.js
diff --git a/slides/demo/browser/xbDebug.js b/slides/demo/browser/xbDebug.js
new file mode 100644 (file)
index 0000000..88f6006
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+xbDebug.js revision: 0.003 2002-02-26
+
+Contributor(s): Bob Clary, Netscape Communications, Copyright 2001
+
+Netscape grants you a royalty free license to use, modify and 
+distribute this software provided that this copyright notice 
+appears on all copies.  This software is provided "AS IS," 
+without a warranty of any kind.
+
+ChangeLog:
+
+2002-02-25: bclary - modified xbDebugTraceOject to make sure 
+            that original versions of wrapped functions were not
+            rewrapped. This had caused an infinite loop in IE.
+
+2002-02-07: bclary - modified xbDebug.prototype.close to not null
+            the debug window reference. This can cause problems with
+           Internet Explorer if the page is refreshed. These issues will
+           be addressed at a later date.
+*/
+
+function xbDebug()
+{
+  this.on = false;
+  this.stack = new Array();
+  this.debugwindow = null;
+  this.execprofile = new Object();
+}
+
+xbDebug.prototype.push = function ()
+{
+  this.stack[this.stack.length] = this.on;
+  this.on = true;
+}
+
+xbDebug.prototype.pop = function ()
+{
+  this.on = this.stack[this.stack.length - 1];
+  --this.stack.length;
+}
+
+xbDebug.prototype.open =  function ()
+{
+  if (this.debugwindow && !this.debugwindow.closed)
+    this.close();
+    
+  this.debugwindow = window.open('about:blank', 'DEBUGWINDOW', 'height=400,width=600,resizable=yes,scrollbars=yes');
+
+  this.debugwindow.title = 'xbDebug Window';
+  this.debugwindow.document.write('<html><head><title>xbDebug Window</title></head><body><h3>Javascript Debug Window</h3></body></html>');
+  this.debugwindow.focus();
+}
+
+xbDebug.prototype.close = function ()
+{
+  if (!this.debugwindow)
+    return;
+    
+  if (!this.debugwindow.closed)
+    this.debugwindow.close();
+
+  // bc 2002-02-07, other windows may still hold a reference to this: this.debugwindow = null;
+}
+
+xbDebug.prototype.dump = function (msg)
+{
+  if (!this.on)
+    return;
+    
+  if (!this.debugwindow || this.debugwindow.closed)
+    this.open();
+    
+  this.debugwindow.document.write(msg + '<br>');
+  
+  return;
+}
+
+var xbDEBUG = new xbDebug();
+
+window.onunload = function () { xbDEBUG.close(); }
+
+function xbDebugGetFunctionName(funcref)
+{
+
+  if (funcref.name)
+    return funcref.name;
+
+  var name = funcref + '';
+  name = name.substring(name.indexOf(' ') + 1, name.indexOf('('));
+  funcref.name = name;
+
+  return name;
+}
+
+function xbDebugCreateFunctionWrapper(scopename, funcname, precall, postcall)
+{
+  var wrappedfunc;
+  var scopeobject = eval(scopename);
+  var funcref = scopeobject[funcname];
+
+  scopeobject['xbDebug_orig_' + funcname] = funcref;
+
+  wrappedfunc = function () 
+  {
+    precall(scopename, funcname, arguments);
+    var rv = funcref.apply(this, arguments);
+    postcall(scopename, funcname, arguments, rv);
+    return rv;
+  };
+
+  if (typeof(funcref.constructor) != 'undefined')
+    wrappedfunc.constructor = funcref.constuctor;
+
+  if (typeof(funcref.prototype) != 'undefined')
+    wrappedfunc.prototype = funcref.prototype;
+
+  scopeobject[funcname] = wrappedfunc;
+}
+
+function xbDebugPersistToString(obj)
+{
+  var s = '';
+  var p;
+
+  if (obj == null)
+     return 'null';
+
+  switch(typeof(obj))
+  {
+    case 'number':
+       return obj;
+    case 'string':
+       return '"' + obj + '"';
+    case 'undefined':
+       return 'undefined';
+    case 'boolean':
+       return obj + '';
+  }
+
+  return '[' + xbDebugGetFunctionName(obj.constructor) + ']';
+}
+
+function xbDebugTraceBefore(scopename, funcname, funcarguments) 
+{
+  var i;
+  var s = '';
+  var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname];
+  if (!execprofile)
+    execprofile = xbDEBUG.execprofile[scopename + '.' + funcname] = { started: 0, time: 0, count: 0 };
+
+  for (i = 0; i < funcarguments.length; i++)
+  {
+    s += xbDebugPersistToString(funcarguments[i]);
+    if (i < funcarguments.length - 1)
+      s += ', ';
+  }
+
+  xbDEBUG.dump('enter ' + scopename + '.' + funcname + '(' + s + ')');
+  execprofile.started = (new Date()).getTime();
+}
+
+function xbDebugTraceAfter(scopename, funcname, funcarguments, rv) 
+{
+  var i;
+  var s = '';
+  var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname];
+  if (!execprofile)
+    xbDEBUG.dump('xbDebugTraceAfter: execprofile not created for ' + scopename + '.' + funcname);
+  else if (execprofile.started == 0)
+    xbDEBUG.dump('xbDebugTraceAfter: execprofile.started == 0 for ' + scopename + '.' + funcname);
+  else 
+  {
+    execprofile.time += (new Date()).getTime() - execprofile.started;
+    execprofile.count++;
+    execprofile.started = 0;
+  }
+
+  for (i = 0; i < funcarguments.length; i++)
+  {
+    s += xbDebugPersistToString(funcarguments[i]);
+    if (i < funcarguments.length - 1)
+      s += ', ';
+  }
+
+  xbDEBUG.dump('exit  ' + scopename + '.' + funcname + '(' + s + ')==' + xbDebugPersistToString(rv));
+}
+
+function xbDebugTraceFunction(scopename, funcname)
+{
+  xbDebugCreateFunctionWrapper(scopename, funcname, xbDebugTraceBefore, xbDebugTraceAfter);
+}
+
+function xbDebugTraceObject(scopename, objname)
+{
+  var objref = eval(scopename + '.' + objname);
+  var p;
+
+  if (!objref || !objref.prototype)
+     return;
+
+  for (p in objref.prototype)
+  {
+    if (typeof(objref.prototype[p]) == 'function' && (p+'').indexOf('xbDebug_orig') == -1)
+    {
+      xbDebugCreateFunctionWrapper(scopename + '.' + objname + '.prototype', p + '', xbDebugTraceBefore, xbDebugTraceAfter);
+    }
+  }
+}
+
+function xbDebugDumpProfile()
+{
+  var p;
+  var execprofile;
+  var avg;
+
+  for (p in xbDEBUG.execprofile)
+  {
+    execprofile = xbDEBUG.execprofile[p];
+    avg = Math.round ( 100 * execprofile.time/execprofile.count) /100;
+    xbDEBUG.dump('Execution profile ' + p + ' called ' + execprofile.count + ' times. Total time=' + execprofile.time + 'ms. Avg Time=' + avg + 'ms.');
+  }
+}
diff --git a/slides/demo/browser/xbStyle.js b/slides/demo/browser/xbStyle.js
new file mode 100644 (file)
index 0000000..77cfef4
--- /dev/null
@@ -0,0 +1,1349 @@
+/*
+xbStyle.js Revision: 0.202 2002-02-11
+
+Contributor(s): Bob Clary, Original Work, Copyright 2000
+                Bob Clary, Netscape Communications, Copyright 2001
+
+Netscape grants you a royalty free license to use, modify and 
+distribute this software provided that this copyright notice 
+appears on all copies.  This software is provided "AS IS," 
+without a warranty of any kind.
+
+Change Log:
+
+2001-07-19: bclary - fixed function cssStyleGetLeft() and cssStyleGetTop() to 
+            correctly handle the case where the initial style.left/style.top
+            are not initialized. This fixes positioning for relatively positioned
+            DIVS and as a result fixes behavior for ILAYERs exposed as relatively
+            positioned divs.
+2001-10-02: bclary - added missing xbClipRect.getHeight/setHeight methods.
+
+2001-11-20: bclary - removed use of practical browser sniffer, 
+            added object sniffing, and limited support for opera
+            note opera returns ints for HTMLElement.style.[left|top|height|width] etc.
+
+2002-02-11: v 0.201 bclary - with the help of Rob Johnston <rob_johnston@hotmail.com>
+            found that the "if (document.getElementsByName)" test excluded
+            IE4. Added a test for document.all to enable IE4 to fully use 
+            xbStyle.
+
+2002-03-12: v 0.202 Daniel Resare contributed a patch to cssStyleSetPage[X|Y]() which
+            handles the case where the element has no parentNode.
+*/
+
+function xbStyleNotSupported() {}
+
+function xbStyleNotSupportStringValue(propname) { xbDEBUG.dump(propname + ' is not supported in this browser'); return '';};
+
+/////////////////////////////////////////////////////////////
+// xbClipRect
+
+function xbClipRect(a1, a2, a3, a4)
+{
+  this.top  = 0;
+  this.right  = 0;
+  this.bottom  = 0;
+  this.left  = 0;
+
+  if (typeof(a1) == 'string')
+  {
+    var val;
+    var ca;
+    var i;
+      
+    if (a1.indexOf('rect(') == 0)
+    {
+      // I would have preferred [0-9]+[a-zA-Z]+ for a regexp
+      // but NN4 returns null for that. 
+      ca = a1.substring(5, a1.length-1).match(/-?[0-9a-zA-Z]+/g);
+      for (i = 0; i < 4; ++i)
+      {
+        val = xbToInt(ca[i]);
+        if (val != 0 && ca[i].indexOf('px') == -1)
+        {
+          xbDEBUG.dump('xbClipRect: A clipping region ' + a1 + ' was detected that did not use pixels as units.  Click Ok to continue, Cancel to Abort');
+          return;
+        }
+        ca[i] = val;
+      }
+      this.top    = ca[0];
+      this.right  = ca[1];
+      this.bottom = ca[2];
+      this.left   = ca[3];
+    }
+  }    
+  else if (typeof(a1) == 'number' && typeof(a2) == 'number' && typeof(a3) == 'number' && typeof(a4) == 'number')
+  {
+    this.top    = a1;
+    this.right  = a2;
+    this.bottom = a3;
+    this.left   = a4;
+  }
+}
+
+xbClipRect.prototype.top = 0;
+xbClipRect.prototype.right = 0;
+xbClipRect.prototype.bottom = 0;
+xbClipRect.prototype.left = 0;
+
+
+function xbClipRectGetWidth()
+{
+    return this.right - this.left;
+}
+xbClipRect.prototype.getWidth = xbClipRectGetWidth; 
+
+function xbClipRectSetWidth(width)
+{
+  this.right = this.left + width;
+}
+xbClipRect.prototype.setWidth = xbClipRectSetWidth;
+
+function xbClipRectGetHeight()
+{
+    return this.bottom - this.top;
+}
+xbClipRect.prototype.getHeight = xbClipRectGetHeight; 
+
+function xbClipRectSetHeight(height)
+{
+  this.bottom = this.top + height;
+}
+xbClipRect.prototype.setHeight = xbClipRectSetHeight;
+
+function xbClipRectToString()
+{
+  return 'rect(' + this.top + 'px ' + this.right + 'px ' + this.bottom + 'px ' + this.left + 'px )' ;
+}
+xbClipRect.prototype.toString = xbClipRectToString;
+
+/////////////////////////////////////////////////////////////
+// xbStyle
+//
+// Note Opera violates the standard by cascading the effective values
+// into the HTMLElement.style object. We can use IE's HTMLElement.currentStyle
+// to get the effective values. In Gecko we will use the W3 DOM Style Standard getComputedStyle
+
+function xbStyle(obj, position)
+{
+  if (typeof(obj) == 'object' && typeof(obj.style) != 'undefined') 
+    this.styleObj = obj.style;
+  else if (document.layers) // NN4
+  {
+    if (typeof(position) == 'undefined')
+      position = '';
+        
+    this.styleObj = obj;
+    this.styleObj.position = position;
+  }
+  this.object = obj;
+}
+
+xbStyle.prototype.styleObj = null;
+xbStyle.prototype.object = null;
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getEffectiveValue()
+// note that xbStyle's constructor uses the currentStyle object 
+// for IE5+ and that Opera's style object contains computed values
+// already. Netscape Navigator's layer object also contains the 
+// computed values as well. Note that IE4 will not return the 
+// computed values.
+
+function xbStyleGetEffectiveValue(propname)
+{
+  var value = null;
+
+  // W3/Gecko
+  if (document.defaultView && document.defaultView.getComputedStyle)
+  {
+    if (navigator.family == 'gecko')
+    {
+      // xxxHack: work around Gecko getComputedStyle bugs...
+      switch(propname)
+      {
+      case 'clip':
+         return this.styleObj[propname];
+      case 'top':
+        if (navigator.family == 'gecko' && navigator.version < 0.96 && this.styleObj.position == 'relative')
+           return this.object.offsetTop;
+      case 'left':
+        if (navigator.family == 'gecko' && navigator.version < 0.96 && this.styleObj.position == 'relative')
+           return this.object.offsetLeft;
+      }
+    }
+    // Note that propname is the name of the property in the CSS Style
+    // Object. However the W3 method getPropertyValue takes the actual
+    // property name from the CSS Style rule, i.e., propname is 
+    // 'backgroundColor' but getPropertyValue expects 'background-color'.
+
+     var capIndex;
+     var cappropname = propname;
+     while ( (capIndex = cappropname.search(/[A-Z]/)) != -1)
+     {
+       if (capIndex != -1)
+         cappropname = cappropname.substring(0, capIndex) + '-' + cappropname.substring(capIndex, capIndex).toLowerCase() + cappropname.substr(capIndex+1);
+     }
+
+     value =  document.defaultView.getComputedStyle(this.object, '').getPropertyValue(cappropname);
+
+     // xxxHack for Gecko:
+     if (!value && this.styleObj[propname])
+       value = this.styleObj[propname];
+  }
+  else if (typeof(this.styleObj[propname]) == 'undefined') 
+    value = xbStyleNotSupportStringValue(propname);
+  else 
+  {
+    if (navigator.family != 'ie4' || navigator.version < 5)
+    {
+      // IE4+, Opera, NN4
+      value = this.styleObj[propname];
+    }
+    else
+    {
+     // IE5+
+     value = this.object.currentStyle[propname];
+     if (!value)
+       value = this.styleObj[propname];
+    }
+  }
+
+  return value;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClip()
+
+function cssStyleGetClip()
+{
+  var clip = this.getEffectiveValue('clip');
+
+  // hack opera
+  if (clip == 'rect()')
+    clip = '';
+
+  if (clip == '')
+    clip = 'rect(0px ' + this.getWidth() + 'px ' + this.getHeight() + 'px 0px)';
+
+  return clip;
+}
+
+function nsxbStyleGetClip()
+{
+  var clip = this.styleObj.clip;
+  var rect = new xbClipRect(clip.top, clip.right, clip.bottom, clip.left);
+  return rect.toString();
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClip()
+
+function cssStyleSetClip(sClipString)
+{
+  this.styleObj.clip = sClipString;
+}
+
+function nsxbStyleSetClip(sClipString)
+{
+  var rect          = new xbClipRect(sClipString);
+  this.styleObj.clip.top    = rect.top;
+  this.styleObj.clip.right  = rect.right;
+  this.styleObj.clip.bottom  = rect.bottom;
+  this.styleObj.clip.left    = rect.left;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipTop()
+
+function cssStyleGetClipTop()
+{
+  var clip = this.getClip()
+  var rect = new xbClipRect(clip);
+  return rect.top;
+}
+
+function nsxbStyleGetClipTop()
+{
+  return this.styleObj.clip.top;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipTop()
+
+function cssStyleSetClipTop(top)
+{
+  var clip = this.getClip();
+  var rect         = new xbClipRect(clip);
+  rect.top         = top;
+  this.styleObj.clip = rect.toString();
+}
+
+function nsxbStyleSetClipTop(top)
+{
+  return this.styleObj.clip.top = top;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipRight()
+
+function cssStyleGetClipRight()
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  return rect.right;
+}
+
+function nsxbStyleGetClipRight()
+{
+  return this.styleObj.clip.right;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipRight()
+
+function cssStyleSetClipRight(right)
+{
+  var clip = this.getClip();
+  var rect          = new xbClipRect(clip);
+  rect.right        = right;
+  this.styleObj.clip  = rect.toString();
+}
+
+function nsxbStyleSetClipRight(right)
+{
+  return this.styleObj.clip.right = right;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipBottom()
+
+function cssStyleGetClipBottom()
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  return rect.bottom;
+}
+
+function nsxbStyleGetClipBottom()
+{
+  return this.styleObj.clip.bottom;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipBottom()
+
+function cssStyleSetClipBottom(bottom)
+{
+  var clip = this.getClip();
+  var rect           = new xbClipRect(clip);
+  rect.bottom        = bottom;
+  this.styleObj.clip   = rect.toString();
+}
+
+function nsxbStyleSetClipBottom(bottom)
+{
+  return this.styleObj.clip.bottom = bottom;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipLeft()
+
+function cssStyleGetClipLeft()
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  return rect.left;
+}
+
+function nsxbStyleGetClipLeft()
+{
+  return this.styleObj.clip.left;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipLeft()
+
+function cssStyleSetClipLeft(left)
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  rect.left = left;
+  this.styleObj.clip = rect.toString();
+}
+
+function nsxbStyleSetClipLeft(left)
+{
+  return this.styleObj.clip.left = left;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipWidth()
+
+function cssStyleGetClipWidth()
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  return rect.getWidth();
+}
+
+function nsxbStyleGetClipWidth()
+{
+  return this.styleObj.clip.width;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipWidth()
+
+function cssStyleSetClipWidth(width)
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  rect.setWidth(width);
+  this.styleObj.clip = rect.toString();
+}
+
+function nsxbStyleSetClipWidth(width)
+{
+  return this.styleObj.clip.width = width;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipHeight()
+
+function cssStyleGetClipHeight()
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  return rect.getHeight();
+}
+
+function nsxbStyleGetClipHeight()
+{
+  return this.styleObj.clip.height;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipHeight()
+
+function cssStyleSetClipHeight(height)
+{
+  var clip = this.getClip();
+  var rect = new xbClipRect(clip);
+  rect.setHeight(height);
+  this.styleObj.clip = rect.toString();
+}
+
+function nsxbStyleSetClipHeight(height)
+{
+  return this.styleObj.clip.height = height;
+}
+
+// the CSS attributes left,top are for absolutely positioned elements
+// measured relative to the containing element.  for relatively positioned
+// elements, left,top are measured from the element's normal inline position.
+// getLeft(), setLeft() operate on this type of coordinate.
+//
+// to allow dynamic positioning the getOffsetXXX and setOffsetXXX methods are
+// defined to return and set the position of either an absolutely or relatively
+// positioned element relative to the containing element.
+//
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getLeft()
+
+function cssStyleGetLeft()
+{
+  var left = this.getEffectiveValue('left');
+  if (typeof(left) == 'number')
+     return left;
+
+  if (left != '' && left.indexOf('px') == -1)
+  {
+    xbDEBUG.dump('xbStyle.getLeft: Element ID=' + this.object.id + ' does not use pixels as units. left=' + left + ' Click Ok to continue, Cancel to Abort');
+    return 0;
+  }
+
+  if (left == '')
+    left = this.styleObj.left = '0px';
+      
+  return xbToInt(left);
+}
+
+function nsxbStyleGetLeft()
+{
+  return this.styleObj.left;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setLeft()
+
+function cssStyleSetLeft(left)
+{
+  if (typeof(this.styleObj.left) == 'number')
+    this.styleObj.left = left;
+  else
+    this.styleObj.left = left + 'px';
+}
+
+function nsxbStyleSetLeft(left)
+{
+  this.styleObj.left = left;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getTop()
+
+function cssStyleGetTop()
+{
+  var top = this.getEffectiveValue('top');
+  if (typeof(top) == 'number')
+     return top;
+
+  if (top != '' && top.indexOf('px') == -1)
+  {
+    xbDEBUG.dump('xbStyle.getTop: Element ID=' + this.object.id + ' does not use pixels as units. top=' + top + ' Click Ok to continue, Cancel to Abort');
+    return 0;
+  }
+
+  if (top == '')
+    top = this.styleObj.top = '0px';
+      
+  return xbToInt(top);
+}
+
+function nsxbStyleGetTop()
+{
+  return this.styleObj.top;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setTop()
+
+function cssStyleSetTop(top)
+{
+  if (typeof(this.styleObj.top) == 'number')
+    this.styleObj.top = top;
+  else
+    this.styleObj.top = top + 'px';
+}
+
+function nsxbStyleSetTop(top)
+{
+  this.styleObj.top = top;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPageX()
+
+function cssStyleGetPageX()
+{
+  var x = 0;
+  var elm = this.object;
+  var elmstyle;
+  var position;
+  
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the 
+  // effective position attribute , attempt to use offsetXXX
+
+  if (typeof(elm.offsetLeft) == 'number')
+  {
+    while (elm)
+    {
+      x += elm.offsetLeft;
+      elm = elm.offsetParent;
+    }
+  }
+  else
+  {
+    while (elm)
+    {
+      if (elm.style)
+      {
+        elmstyle = new xbStyle(elm);
+        position = elmstyle.getEffectiveValue('position');
+        if (position != '' && position != 'static')
+          x += elmstyle.getLeft();
+      }
+      elm = elm.parentNode;
+    }
+  }
+  
+  return x;
+}
+
+function nsxbStyleGetPageX()
+{
+  return this.styleObj.pageX;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setPageX()
+
+function cssStyleSetPageX(x)
+{
+  var xParent = 0;
+  var elm = this.object.parentNode;
+  var elmstyle;
+  var position;
+  
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the 
+  // effective position attribute , attempt to use offsetXXX
+
+  if (elm && typeof(elm.offsetLeft) == 'number')
+  {
+    while (elm)
+    {
+      xParent += elm.offsetLeft;
+      elm = elm.offsetParent;
+    }
+  }
+  else
+  {
+    while (elm)
+    {
+      if (elm.style)
+      {
+        elmstyle = new xbStyle(elm);
+        position = elmstyle.getEffectiveValue('position');
+        if (position != '' && position != 'static')
+          xParent += elmstyle.getLeft();
+      }
+      elm = elm.parentNode;
+    }
+  }
+  
+  x -= xParent;
+
+  this.setLeft(x);
+}
+    
+function nsxbStyleSetPageX(x)
+{
+  this.styleObj.x = this.styleObj.x  + x - this.styleObj.pageX;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPageY()
+
+function cssStyleGetPageY()
+{
+  var y = 0;
+  var elm = this.object;
+  var elmstyle;
+  var position;
+  
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the 
+  // effective position attribute , attempt to use offsetXXX
+
+  if (typeof(elm.offsetTop) == 'number')
+  {
+    while (elm)
+    {
+      y += elm.offsetTop;
+      elm = elm.offsetParent;
+    }
+  }
+  else
+  {
+    while (elm)
+    {
+      if (elm.style)
+      {
+        elmstyle = new xbStyle(elm);
+        position = elmstyle.getEffectiveValue('position');
+        if (position != '' && position != 'static')
+          y += elmstyle.getTop();
+      }
+      elm = elm.parentNode;
+    }
+  }
+  
+  return y;
+}
+
+function nsxbStyleGetPageY()
+{
+  return this.styleObj.pageY;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setPageY()
+
+function cssStyleSetPageY(y)
+{
+  var yParent = 0;
+  var elm = this.object.parentNode;
+  var elmstyle;
+  var position;
+  
+  //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the 
+  // effective position attribute , attempt to use offsetXXX
+
+  if (elm && typeof(elm.offsetTop) == 'number')
+  {
+    while (elm)
+    {
+      yParent += elm.offsetTop;
+      elm = elm.offsetParent;
+    }
+  }
+  else
+  {
+    while (elm)
+    {
+      if (elm.style)
+      {
+        elmstyle = new xbStyle(elm);
+        position = elmstyle.getEffectiveValue('position');
+        if (position != '' && position != 'static')
+          yParent += elmstyle.getTop();
+      }
+      elm = elm.parentNode;
+    }
+  }
+  
+  y -= yParent;
+
+  this.setTop(y);
+}
+    
+function nsxbStyleSetPageY(y)
+{
+  this.styleObj.y = this.styleObj.y  + y - this.styleObj.pageY;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getHeight()
+
+function cssStyleGetHeight()
+{
+  var height = this.getEffectiveValue('height');
+  if (typeof(height) == 'number')
+     return height;
+
+  if ((height == 'auto' || height.indexOf('%') != -1) && typeof(this.object.offsetHeight) == 'number')
+    height = this.object.offsetHeight + 'px';
+
+  if (height != '' && height != 'auto' && height.indexOf('px') == -1)
+  {
+    xbDEBUG.dump('xbStyle.getHeight: Element ID=' + this.object.id + ' does not use pixels as units. height=' + height + ' Click Ok to continue, Cancel to Abort');
+    return 0;
+  }
+
+  height = xbToInt(height);
+
+  return height;
+}
+
+function nsxbStyleGetHeight()
+{
+  //if (this.styleObj.document && this.styleObj.document.height)
+  //  return this.styleObj.document.height;
+    
+  return this.styleObj.clip.height;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setHeight()
+
+function cssStyleSetHeight(height)
+{
+  if (typeof(this.styleObj.height) == 'number')
+    this.styleObj.height = height;
+  else
+    this.styleObj.height = height + 'px';
+}
+
+function nsxbStyleSetHeight(height)
+{
+  this.styleObj.clip.height = height;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getWidth()
+
+function cssStyleGetWidth()
+{
+  var width = this.getEffectiveValue('width');
+  if (typeof(width) == 'number')
+     return width;
+
+  if ((width == 'auto' || width.indexOf('%') != -1) && typeof(this.object.offsetWidth) == 'number')
+    width = this.object.offsetWidth + 'px';
+
+  if (width != '' && width != 'auto' && width.indexOf('px') == -1)
+  {
+    xbDEBUG.dump('xbStyle.getWidth: Element ID=' + this.object.id + ' does not use pixels as units. width=' + width + ' Click Ok to continue, Cancel to Abort');
+    return 0;
+  }
+
+  width = xbToInt(width);
+
+  return width;
+}
+
+function nsxbStyleGetWidth()
+{
+  //if (this.styleObj.document && this.styleObj.document.width)
+  //  return this.styleObj.document.width;
+    
+  return this.styleObj.clip.width;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setWidth()
+
+function cssStyleSetWidth(width)
+{
+  if (typeof(this.styleObj.width) == 'number')
+    this.styleObj.width = width;
+  else
+    this.styleObj.width = width + 'px';
+}
+
+// netscape will not dynamically change the width of a 
+// layer. It will only happen upon a refresh.
+function nsxbStyleSetWidth(width)
+{
+  this.styleObj.clip.width = width;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getVisibility()
+
+function cssStyleGetVisibility()
+{
+  return this.getEffectiveValue('visibility');
+}
+
+function nsxbStyleGetVisibility()
+{
+  switch(this.styleObj.visibility)
+  {
+  case 'hide':
+    return 'hidden';
+  case 'show':
+    return 'visible';
+  }
+  return '';
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setVisibility()
+
+function cssStyleSetVisibility(visibility)
+{
+  this.styleObj.visibility = visibility;
+}
+
+function nsxbStyleSetVisibility(visibility)
+{
+  switch(visibility)
+  {
+  case 'hidden':
+    visibility = 'hide';
+    break;
+  case 'visible':
+    visibility = 'show';
+    break;
+  case 'inherit':
+    break;
+  default:
+    visibility = 'show';
+    break;
+  }
+  this.styleObj.visibility = visibility;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getzIndex()
+
+function cssStyleGetzIndex()
+{
+  return xbToInt(this.getEffectiveValue('zIndex'));
+}
+
+function nsxbStyleGetzIndex()
+{
+  return this.styleObj.zIndex;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setzIndex()
+
+function cssStyleSetzIndex(zIndex)
+{
+  this.styleObj.zIndex = zIndex;
+}
+
+function nsxbStyleSetzIndex(zIndex)
+{
+  this.styleObj.zIndex = zIndex;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getBackgroundColor()
+
+function cssStyleGetBackgroundColor()
+{
+  return this.getEffectiveValue('backgroundColor');
+}
+
+function nsxbStyleGetBackgroundColor()
+{
+  return this.styleObj.bgColor;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setBackgroundColor()
+
+function cssStyleSetBackgroundColor(color)
+{
+  this.styleObj.backgroundColor = color;
+}
+
+function nsxbStyleSetBackgroundColor(color)
+{
+  if (color)
+  {
+    this.styleObj.bgColor = color;
+    this.object.document.bgColor = color;
+    this.resizeTo(this.getWidth(), this.getHeight());
+  }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getColor()
+
+function cssStyleGetColor()
+{
+  return this.getEffectiveValue('color');
+}
+
+function nsxbStyleGetColor()
+{
+  return '#ffffff';
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setColor()
+
+function cssStyleSetColor(color)
+{
+  this.styleObj.color = color;
+}
+
+function nsxbStyleSetColor(color)
+{
+  this.object.document.fgColor = color;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveAbove()
+
+function xbStyleMoveAbove(cont)
+{
+  this.setzIndex(cont.getzIndex()+1);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveBelow()
+
+function xbStyleMoveBelow(cont)
+{
+  var zindex = cont.getzIndex() - 1;
+            
+  this.setzIndex(zindex);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveBy()
+
+function xbStyleMoveBy(deltaX, deltaY)
+{
+  this.moveTo(this.getLeft() + deltaX, this.getTop() + deltaY);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveTo()
+
+function xbStyleMoveTo(x, y)
+{
+  this.setLeft(x);
+  this.setTop(y);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveToAbsolute()
+
+function xbStyleMoveToAbsolute(x, y)
+{
+  this.setPageX(x);
+  this.setPageY(y);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.resizeBy()
+
+function xbStyleResizeBy(deltaX, deltaY)
+{
+  this.setWidth( this.getWidth() + deltaX );
+  this.setHeight( this.getHeight() + deltaY );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.resizeTo()
+
+function xbStyleResizeTo(x, y)
+{
+  this.setWidth(x);
+  this.setHeight(y);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Navigator 4.x resizing...
+
+function nsxbStyleOnresize()
+{
+    if (saveInnerWidth != xbGetWindowWidth() || saveInnerHeight != xbGetWindowHeight())
+    location.reload();
+
+  return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setInnerHTML()
+
+function xbSetInnerHTML(str)
+{
+  if (typeof(this.object.innerHTML) != 'undefined')
+    this.object.innerHTML = str;
+}
+
+function nsxbSetInnerHTML(str)
+{
+  this.object.document.open('text/html');
+  this.object.document.write(str);
+  this.object.document.close();
+}
+
+////////////////////////////////////////////////////////////////////////
+// Extensions to xbStyle that are not supported by Netscape Navigator 4
+// but that provide cross browser implementations of properties for 
+// Mozilla, Gecko, Netscape 6.x and Opera
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getBorderTopWidth()
+
+function cssStyleGetBorderTopWidth()
+{
+  return xbToInt(this.getEffectiveValue('borderTopWidth'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getBorderRightWidth()
+
+function cssStyleGetBorderRightWidth()
+{
+  return xbToInt(this.getEffectiveValue('borderRightWidth'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getBorderBottomWidth()
+
+function cssStyleGetBorderBottomWidth()
+{
+  return xbToInt(this.getEffectiveValue('borderLeftWidth'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getBorderLeftWidth()
+
+function cssStyleGetBorderLeftWidth()
+{
+  return xbToInt(this.getEffectiveValue('borderLeftWidth'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getMarginTop()
+
+function cssStyleGetMarginTop()
+{
+  return xbToInt(this.getEffectiveValue('marginTop'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getMarginRight()
+
+function cssStyleGetMarginRight()
+{
+  return xbToInt(this.getEffectiveValue('marginRight'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getMarginBottom()
+
+function cssStyleGetMarginBottom()
+{
+  return xbToInt(this.getEffectiveValue('marginBottom'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getMarginLeft()
+
+function cssStyleGetMarginLeft()
+{
+  return xbToInt(this.getEffectiveValue('marginLeft'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPaddingTop()
+
+function cssStyleGetPaddingTop()
+{
+  return xbToInt(this.getEffectiveValue('paddingTop'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPaddingRight()
+
+function cssStyleGetPaddingRight()
+{
+  return xbToInt(this.getEffectiveValue('paddingRight'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPaddingBottom()
+
+function cssStyleGetPaddingBottom()
+{
+  return xbToInt(this.getEffectiveValue('paddingBottom'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPaddingLeft()
+
+function cssStyleGetPaddingLeft()
+{
+  return xbToInt(this.getEffectiveValue('paddingLeft'));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getClientTop()
+
+function cssStyleGetClientTop()
+{
+  return this.getTop() - this.getMarginTop() - this.getBorderTopWidth() - this.getPaddingTop();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getClientLeft()
+
+function cssStyleGetClientLeft()
+{
+  return this.getLeft() - this.getMarginLeft() - this.getBorderLeftWidth() - this.getPaddingLeft();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getClientWidth()
+
+function cssStyleGetClientWidth()
+{
+  return this.getMarginLeft() + this.getBorderLeftWidth() + this.getPaddingLeft() + this.getWidth() + this.getPaddingRight() + this.getBorderRightWidth() + this.getMarginRight();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getClientHeight()
+
+function cssStyleGetClientHeight()
+{
+  return this.getMarginTop() + this.getBorderTopWidth() + this.getPaddingTop() + this.getHeight() + this.getPaddingBottom() + this.getBorderBottomWidth() + this.getMarginBottom();
+}
+
+////////////////////////////////////////////////////////////////////////
+
+xbStyle.prototype.getEffectiveValue     = xbStyleGetEffectiveValue;
+xbStyle.prototype.moveAbove             = xbStyleMoveAbove;
+xbStyle.prototype.moveBelow             = xbStyleMoveBelow;
+xbStyle.prototype.moveBy                = xbStyleMoveBy;
+xbStyle.prototype.moveTo                = xbStyleMoveTo;
+xbStyle.prototype.moveToAbsolute        = xbStyleMoveToAbsolute;
+xbStyle.prototype.resizeBy              = xbStyleResizeBy;
+xbStyle.prototype.resizeTo              = xbStyleResizeTo;
+
+if (document.all || document.getElementsByName)
+{
+  xbStyle.prototype.getClip            = cssStyleGetClip;
+  xbStyle.prototype.setClip            = cssStyleSetClip;  
+  xbStyle.prototype.getClipTop         = cssStyleGetClipTop;
+  xbStyle.prototype.setClipTop         = cssStyleSetClipTop;  
+  xbStyle.prototype.getClipRight       = cssStyleGetClipRight;
+  xbStyle.prototype.setClipRight       = cssStyleSetClipRight;  
+  xbStyle.prototype.getClipBottom      = cssStyleGetClipBottom;
+  xbStyle.prototype.setClipBottom      = cssStyleSetClipBottom;  
+  xbStyle.prototype.getClipLeft        = cssStyleGetClipLeft;
+  xbStyle.prototype.setClipLeft        = cssStyleSetClipLeft;  
+  xbStyle.prototype.getClipWidth       = cssStyleGetClipWidth;
+  xbStyle.prototype.setClipWidth       = cssStyleSetClipWidth;  
+  xbStyle.prototype.getClipHeight      = cssStyleGetClipHeight;
+  xbStyle.prototype.setClipHeight      = cssStyleSetClipHeight;  
+  xbStyle.prototype.getLeft            = cssStyleGetLeft;
+  xbStyle.prototype.setLeft            = cssStyleSetLeft;
+  xbStyle.prototype.getTop             = cssStyleGetTop;
+  xbStyle.prototype.setTop             = cssStyleSetTop;
+  xbStyle.prototype.getPageX           = cssStyleGetPageX;
+  xbStyle.prototype.setPageX           = cssStyleSetPageX;
+  xbStyle.prototype.getPageY           = cssStyleGetPageY;
+  xbStyle.prototype.setPageY           = cssStyleSetPageY;
+  xbStyle.prototype.getVisibility      = cssStyleGetVisibility;
+  xbStyle.prototype.setVisibility      = cssStyleSetVisibility;
+  xbStyle.prototype.getzIndex          = cssStyleGetzIndex;
+  xbStyle.prototype.setzIndex          = cssStyleSetzIndex;            
+  xbStyle.prototype.getHeight          = cssStyleGetHeight;
+  xbStyle.prototype.setHeight          = cssStyleSetHeight;
+  xbStyle.prototype.getWidth           = cssStyleGetWidth;
+  xbStyle.prototype.setWidth           = cssStyleSetWidth;
+  xbStyle.prototype.getBackgroundColor = cssStyleGetBackgroundColor;
+  xbStyle.prototype.setBackgroundColor = cssStyleSetBackgroundColor;
+  xbStyle.prototype.getColor           = cssStyleGetColor;
+  xbStyle.prototype.setColor           = cssStyleSetColor;
+  xbStyle.prototype.setInnerHTML       = xbSetInnerHTML;
+  xbStyle.prototype.getBorderTopWidth    = cssStyleGetBorderTopWidth;
+  xbStyle.prototype.getBorderRightWidth  = cssStyleGetBorderRightWidth;
+  xbStyle.prototype.getBorderBottomWidth = cssStyleGetBorderBottomWidth;
+  xbStyle.prototype.getBorderLeftWidth   = cssStyleGetBorderLeftWidth;
+  xbStyle.prototype.getMarginLeft        = cssStyleGetMarginLeft;
+  xbStyle.prototype.getMarginTop         = cssStyleGetMarginTop;
+  xbStyle.prototype.getMarginRight       = cssStyleGetMarginRight;
+  xbStyle.prototype.getMarginBottom      = cssStyleGetMarginBottom;
+  xbStyle.prototype.getMarginLeft        = cssStyleGetMarginLeft;
+  xbStyle.prototype.getPaddingTop        = cssStyleGetPaddingTop;
+  xbStyle.prototype.getPaddingRight      = cssStyleGetPaddingRight;
+  xbStyle.prototype.getPaddingBottom     = cssStyleGetPaddingBottom;
+  xbStyle.prototype.getPaddingLeft       = cssStyleGetPaddingLeft;
+  xbStyle.prototype.getClientTop         = cssStyleGetClientTop;
+  xbStyle.prototype.getClientLeft        = cssStyleGetClientLeft;
+  xbStyle.prototype.getClientWidth       = cssStyleGetClientWidth;
+  xbStyle.prototype.getClientHeight      = cssStyleGetClientHeight;
+}
+else if (document.layers)
+{
+  xbStyle.prototype.getClip            = nsxbStyleGetClip;
+  xbStyle.prototype.setClip            = nsxbStyleSetClip;  
+  xbStyle.prototype.getClipTop         = nsxbStyleGetClipTop;
+  xbStyle.prototype.setClipTop         = nsxbStyleSetClipTop;  
+  xbStyle.prototype.getClipRight       = nsxbStyleGetClipRight;
+  xbStyle.prototype.setClipRight       = nsxbStyleSetClipRight;  
+  xbStyle.prototype.getClipBottom      = nsxbStyleGetClipBottom;
+  xbStyle.prototype.setClipBottom      = nsxbStyleSetClipBottom;  
+  xbStyle.prototype.getClipLeft        = nsxbStyleGetClipLeft;
+  xbStyle.prototype.setClipLeft        = nsxbStyleSetClipLeft;  
+  xbStyle.prototype.getClipWidth       = nsxbStyleGetClipWidth;
+  xbStyle.prototype.setClipWidth       = nsxbStyleSetClipWidth;  
+  xbStyle.prototype.getClipHeight      = nsxbStyleGetClipHeight;
+  xbStyle.prototype.setClipHeight      = nsxbStyleSetClipHeight;  
+  xbStyle.prototype.getLeft            = nsxbStyleGetLeft;
+  xbStyle.prototype.setLeft            = nsxbStyleSetLeft;
+  xbStyle.prototype.getTop             = nsxbStyleGetTop;
+  xbStyle.prototype.setTop             = nsxbStyleSetTop;
+  xbStyle.prototype.getPageX           = nsxbStyleGetPageX;
+  xbStyle.prototype.setPageX           = nsxbStyleSetPageX;
+  xbStyle.prototype.getPageY           = nsxbStyleGetPageY;
+  xbStyle.prototype.setPageY           = nsxbStyleSetPageY;
+  xbStyle.prototype.getVisibility      = nsxbStyleGetVisibility;
+  xbStyle.prototype.setVisibility      = nsxbStyleSetVisibility;
+  xbStyle.prototype.getzIndex          = nsxbStyleGetzIndex;
+  xbStyle.prototype.setzIndex          = nsxbStyleSetzIndex;            
+  xbStyle.prototype.getHeight          = nsxbStyleGetHeight;
+  xbStyle.prototype.setHeight          = nsxbStyleSetHeight;
+  xbStyle.prototype.getWidth           = nsxbStyleGetWidth;
+  xbStyle.prototype.setWidth           = nsxbStyleSetWidth;
+  xbStyle.prototype.getBackgroundColor = nsxbStyleGetBackgroundColor;
+  xbStyle.prototype.setBackgroundColor = nsxbStyleSetBackgroundColor;
+  xbStyle.prototype.getColor           = nsxbStyleGetColor;
+  xbStyle.prototype.setColor           = nsxbStyleSetColor;
+  xbStyle.prototype.setInnerHTML       = nsxbSetInnerHTML;
+  xbStyle.prototype.getBorderTopWidth    = xbStyleNotSupported;
+  xbStyle.prototype.getBorderRightWidth  = xbStyleNotSupported;
+  xbStyle.prototype.getBorderBottomWidth = xbStyleNotSupported;
+  xbStyle.prototype.getBorderLeftWidth   = xbStyleNotSupported;
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getMarginTop         = xbStyleNotSupported;
+  xbStyle.prototype.getMarginRight       = xbStyleNotSupported;
+  xbStyle.prototype.getMarginBottom      = xbStyleNotSupported;
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingTop        = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingRight      = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingBottom     = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingLeft       = xbStyleNotSupported;
+  xbStyle.prototype.getClientTop         = xbStyleNotSupported;
+  xbStyle.prototype.getClientLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getClientWidth       = xbStyleNotSupported;
+  xbStyle.prototype.getClientHeight      = xbStyleNotSupported;
+
+  window.saveInnerWidth = window.innerWidth;
+  window.saveInnerHeight = window.innerHeight;
+
+  window.onresize = nsxbStyleOnresize;
+
+}
+else 
+{
+  xbStyle.prototype.toString           = xbStyleNotSupported;
+  xbStyle.prototype.getClip            = xbStyleNotSupported;
+  xbStyle.prototype.setClip            = xbStyleNotSupported;
+  xbStyle.prototype.getClipTop         = xbStyleNotSupported;
+  xbStyle.prototype.setClipTop         = xbStyleNotSupported;
+  xbStyle.prototype.getClipRight       = xbStyleNotSupported;
+  xbStyle.prototype.setClipRight       = xbStyleNotSupported;
+  xbStyle.prototype.getClipBottom      = xbStyleNotSupported;
+  xbStyle.prototype.setClipBottom      = xbStyleNotSupported;
+  xbStyle.prototype.getClipLeft        = xbStyleNotSupported;
+  xbStyle.prototype.setClipLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getClipWidth       = xbStyleNotSupported;
+  xbStyle.prototype.setClipWidth       = xbStyleNotSupported;
+  xbStyle.prototype.getClipHeight      = xbStyleNotSupported;
+  xbStyle.prototype.setClipHeight      = xbStyleNotSupported;
+  xbStyle.prototype.getLeft            = xbStyleNotSupported;
+  xbStyle.prototype.setLeft            = xbStyleNotSupported;
+  xbStyle.prototype.getTop             = xbStyleNotSupported;
+  xbStyle.prototype.setTop             = xbStyleNotSupported;
+  xbStyle.prototype.getVisibility      = xbStyleNotSupported;
+  xbStyle.prototype.setVisibility      = xbStyleNotSupported;
+  xbStyle.prototype.getzIndex          = xbStyleNotSupported;
+  xbStyle.prototype.setzIndex          = xbStyleNotSupported;
+  xbStyle.prototype.getHeight          = xbStyleNotSupported;
+  xbStyle.prototype.setHeight          = xbStyleNotSupported;
+  xbStyle.prototype.getWidth           = xbStyleNotSupported;
+  xbStyle.prototype.setWidth           = xbStyleNotSupported;
+  xbStyle.prototype.getBackgroundColor = xbStyleNotSupported;
+  xbStyle.prototype.setBackgroundColor = xbStyleNotSupported;
+  xbStyle.prototype.getColor           = xbStyleNotSupported;
+  xbStyle.prototype.setColor           = xbStyleNotSupported;
+  xbStyle.prototype.setInnerHTML       = xbStyleNotSupported;
+  xbStyle.prototype.getBorderTopWidth    = xbStyleNotSupported;
+  xbStyle.prototype.getBorderRightWidth  = xbStyleNotSupported;
+  xbStyle.prototype.getBorderBottomWidth = xbStyleNotSupported;
+  xbStyle.prototype.getBorderLeftWidth   = xbStyleNotSupported;
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getMarginTop         = xbStyleNotSupported;
+  xbStyle.prototype.getMarginRight       = xbStyleNotSupported;
+  xbStyle.prototype.getMarginBottom      = xbStyleNotSupported;
+  xbStyle.prototype.getMarginLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingTop        = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingRight      = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingBottom     = xbStyleNotSupported;
+  xbStyle.prototype.getPaddingLeft       = xbStyleNotSupported;
+  xbStyle.prototype.getClientTop         = xbStyleNotSupported;
+  xbStyle.prototype.getClientLeft        = xbStyleNotSupported;
+  xbStyle.prototype.getClientWidth       = xbStyleNotSupported;
+  xbStyle.prototype.getClientHeight      = xbStyleNotSupported;
+}
+
+