/* ***********************************************************
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, isIE6CSS;
	// 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;
		}
	}

	function DhtmlHelper(args){
		function Constructor(){
			this.handle = null;
		}

		with(Constructor){
			method('Test', function(str){
				alert(str);
			});
			
			method('SeekLayer', function(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 = this.SeekLayer(document.layers[i].document, name);
					}
				}
				return theObj;
			});

			method('GetRawObject', function(obj){
				var theObj;
				if (typeof obj == "string") {					
					if (isW3C) {
						theObj = document.getElementById(obj);
					} else if (isIE4) {
						theObj = document.all(obj);
					} else if (isNN4) {
						theObj = this.SeekLayer(document, obj);
					}
				} else {					
					// pass through object reference
					theObj = obj;
				}
				return theObj;			
			});

			method('GetObject', function(obj){
				var theObj = this.GetRawObject(obj);
				if (theObj && isCSS) {
					theObj = theObj.style;
				}
				return theObj;
			});

			method('ShiftTo', function(obj, x, y){
				var theObj = this.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)
					}
				}
			});

			method('ShiftBy', function(obj, deltaX, deltaY){
				var theObj = this.GetObject(obj);
				if (theObj) {					
					if (isCSS) {
						// equalize incorrect numeric value type
						var units = (typeof theObj.left == "string") ? "px" : 0 
						theObj.left = this.GetObjectLeft(obj) + deltaX + units;
						theObj.top = this.GetObjectTop(obj) + deltaY + units;
					} else if (isNN4) {
						theObj.moveBy(deltaX, deltaY);
					}
				}
			});

			method('SetZIndex', function(obj, zOrder){
				var theObj = this.GetObject(obj);
				if (theObj) {
					theObj.zIndex = zOrder;
				}
			});

			method('SetBgColor', function(obj, color){
				var theObj = this.GetObject(obj);
				if (theObj) {
					if (isNN4) {
						theObj.bgColor = color;
					} else if (isCSS) {
						theObj.backgroundColor = color;
					}
				}
			});

			method('Show', function(obj){
				var theObj = this.GetObject(obj);
				if (theObj) {
					theObj.visibility = "visible";
				}
			});

			method('Hide', function(obj){
				var theObj = this.GetObject(obj);
				if (theObj) {
					theObj.visibility = "hidden";					
				}
			});

			method('GetObjectLeft', function(obj){
				obj = this.GetRawObject(obj);
				var curleft = 0;
				if (obj.offsetParent){
					while (obj.offsetParent){
						curleft += obj.offsetLeft
						obj = obj.offsetParent;
					}
				}
				else if (obj.x)
					curleft += obj.x;

				return curleft;
			});

			method('GetObjectTop', function(obj){
				obj = this.GetRawObject(obj);
				var curtop = 0;
				if (obj.offsetParent){
					while (obj.offsetParent){
						curtop += obj.offsetTop
						obj = obj.offsetParent;
					}
				}
				else if (obj.y)
					curtop += obj.y;

				return curtop;
			});

			method('GetObjectWidth', function(obj){
				var elem = this.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);			
			});

			method('GetObjectHeight', function(obj){
				var elem = this.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);				
			});

			method('GetInsideWindowWidth', function(){
				if (window.innerWidth) {
					return window.innerWidth;
				} else if (isIE6CSS) {
					return document.body.parentElement.clientWidth
				} else if (document.body && document.body.clientWidth) {
					return document.body.clientWidth;
				}
				return 0;				
			});

			method('GetInsideWindowHeight', function(){
				if (window.innerHeight) {
					return window.innerHeight;
				} else if (isIE6CSS) {
					return document.body.parentElement.clientHeight
				} else if (document.body && document.body.clientHeight) {
					return document.body.clientHeight;
				}
				return 0;				
			});

			method('GetEvent', function(evt){
				return (evt) ? evt : event;
			});

			method('GetEventSource', function(evt){
				evt = this.GetEvent(evt);
				return obj = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			});

			method('SetAlpha', function(obj,opc){
				var theObj = this.GetObject(obj);

				if(theObj.setProperty)
					theObj.setProperty("-moz-opacity",parseInt(opc)/100,"");
				else
					theObj.filter = "progid:DXImageTransform.Microsoft.Alpha(Opacity=" + opc + ")";
			});
		}

		return new Constructor();
	}