--- /dev/null
+/* ***********************************************************
+Example 4-3 (DHTMLapi.js)
+"Dynamic HTML:The Definitive Reference"
+2nd Edition
+by Danny Goodman
+Published by O'Reilly & Associates ISBN 1-56592-494-0
+http://www.oreilly.com
+Copyright 2002 Danny Goodman. All Rights Reserved.
+************************************************************ */
+// DHTMLapi.js custom API for cross-platform
+// object positioning by Danny Goodman (http://www.dannyg.com).
+// Release 2.0. Supports NN4, IE, and W3C DOMs.
+
+// Global variables
+var isCSS, isW3C, isIE4, isNN4;
+// initialize upon load to let all browsers establish content objects
+function initDHTMLAPI() {
+ if (document.images) {
+ isCSS = (document.body && document.body.style) ? true : false;
+ isW3C = (isCSS && document.getElementById) ? true : false;
+ isIE4 = (isCSS && document.all) ? true : false;
+ isNN4 = (document.layers) ? true : false;
+ isIE6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >= 0) ? true : false;
+ }
+}
+// set event handler to initialize API
+//window.onload = initDHTMLAPI;
+addListener(window, 'load', initDHTMLAPI);
+//registerStartupFunction(initDHTMLAPI)
+
+// Seek nested NN4 layer from string name
+function seekLayer(doc, name) {
+ var theObj;
+ for (var i = 0; i < doc.layers.length; i++) {
+ if (doc.layers[i].name == name) {
+ theObj = doc.layers[i];
+ break;
+ }
+ // dive into nested layers if necessary
+ if (doc.layers[i].document.layers.length > 0) {
+ theObj = seekLayer(document.layers[i].document, name);
+ }
+ }
+ return theObj;
+}
+
+// Convert object name string or object reference
+// into a valid element object reference
+function getRawObject(obj) {
+ var theObj;
+ if (typeof obj == "string") {
+ if (isW3C) {
+ theObj = document.getElementById(obj);
+ } else if (isIE4) {
+ theObj = document.all(obj);
+ } else if (isNN4) {
+ theObj = seekLayer(document, obj);
+ }
+ } else {
+ // pass through object reference
+ theObj = obj;
+ }
+ return theObj;
+}
+
+// Convert object name string or object reference
+// into a valid style (or NN4 layer) reference
+function getObject(obj) {
+ var theObj = getRawObject(obj);
+ if (theObj && isCSS) {
+ theObj = theObj.style;
+ }
+ return theObj;
+}
+
+// Position an object at a specific pixel coordinate
+function shiftTo(obj, x, y) {
+ var theObj = getObject(obj);
+ if (theObj) {
+ if (isCSS) {
+ // equalize incorrect numeric value type
+ var units = (typeof theObj.left == "string") ? "px" : 0
+ theObj.left = x + units;
+ theObj.top = y + units;
+ } else if (isNN4) {
+ theObj.moveTo(x,y)
+ }
+ }
+}
+
+// Move an object by x and/or y pixels
+function shiftBy(obj, deltaX, deltaY) {
+ var theObj = getObject(obj);
+ if (theObj) {
+ if (isCSS) {
+ // equalize incorrect numeric value type
+ var units = (typeof theObj.left == "string") ? "px" : 0
+ theObj.left = getObjectLeft(obj) + deltaX + units;
+ theObj.top = getObjectTop(obj) + deltaY + units;
+ } else if (isNN4) {
+ theObj.moveBy(deltaX, deltaY);
+ }
+ }
+}
+
+// Set the z-order of an object
+function setZIndex(obj, zOrder) {
+ var theObj = getObject(obj);
+ if (theObj) {
+ theObj.zIndex = zOrder;
+ }
+}
+
+// Set the background color of an object
+function setBGColor(obj, color) {
+ var theObj = getObject(obj);
+ if (theObj) {
+ if (isNN4) {
+ theObj.bgColor = color;
+ } else if (isCSS) {
+ theObj.backgroundColor = color;
+ }
+ }
+}
+
+// Set the visibility of an object to visible
+function show(obj) {
+ var theObj = getObject(obj);
+ if (theObj) {
+ theObj.visibility = "visible";
+ }
+}
+
+// Set the visibility of an object to hidden
+function hide(obj) {
+ var theObj = getObject(obj);
+ if (theObj) {
+ theObj.visibility = "hidden";
+ }
+}
+
+// Retrieve the x coordinate of a positionable object
+function getObjectLeft(obj) {
+ var elem = getRawObject(obj);
+ var result = 0;
+ if (document.defaultView) {
+ var style = document.defaultView;
+ var cssDecl = style.getComputedStyle(elem, "");
+ result = cssDecl.getPropertyValue("left");
+ } else if (elem.currentStyle) {
+ result = elem.currentStyle.left;
+ } else if (elem.style) {
+ result = elem.style.left;
+ } else if (isNN4) {
+ result = elem.left;
+ }
+ return parseInt(result);
+}
+
+// Retrieve the y coordinate of a positionable object
+function getObjectTop(obj) {
+ var elem = getRawObject(obj);
+ var result = 0;
+ if (elem.offsetTop) {
+ result = elem.offsetTop;
+ } else if (document.defaultView) {
+ var style = document.defaultView;
+ var cssDecl = style.getComputedStyle(elem, "");
+ result = cssDecl.getPropertyValue("top");
+ } else if (elem.currentStyle) {
+ result = elem.currentStyle.top;
+ } else if (elem.style) {
+ result = elem.style.top;
+ } else if (isNN4) {
+ result = elem.top;
+ }
+ return parseInt(result);
+}
+
+// Retrieve the rendered width of an element
+function getObjectWidth(obj) {
+ var elem = getRawObject(obj);
+ var result = 0;
+ if (elem.offsetWidth) {
+ result = elem.offsetWidth;
+ } else if (elem.clip && elem.clip.width) {
+ result = elem.clip.width;
+ } else if (elem.style && elem.style.pixelWidth) {
+ result = elem.style.pixelWidth;
+ }
+ return parseInt(result);
+}
+
+// Retrieve the rendered height of an element
+function getObjectHeight(obj) {
+ var elem = getRawObject(obj);
+ var result = 0;
+ if (elem.offsetHeight) {
+ result = elem.offsetHeight;
+ } else if (elem.clip && elem.clip.height) {
+ result = elem.clip.height;
+ } else if (elem.style && elem.style.pixelHeight) {
+ result = elem.style.pixelHeight;
+ }
+ return parseInt(result);
+}
+
+
+// Return the available content width space in browser window
+function getInsideWindowWidth() {
+ if (window.innerWidth) {
+ return window.innerWidth;
+ } else if (isIE6CSS) {
+ // measure the html element's clientWidth
+ return document.body.parentElement.clientWidth
+ } else if (document.body && document.body.clientWidth) {
+ return document.body.clientWidth;
+ }
+ return 0;
+}
+// Return the available content height space in browser window
+function getInsideWindowHeight() {
+ if (window.innerHeight) {
+ return window.innerHeight;
+ } else if (isIE6CSS) {
+ // measure the html element's clientHeight
+ return document.body.parentElement.clientHeight
+ } else if (document.body && document.body.clientHeight) {
+ return document.body.clientHeight;
+ }
+ return 0;
+}
+