/* * * * * * * * * * * * * * * * * * * * * * * * *
 *			 Seir Anphin DOM Utility             *
 *			  Copyright Darrel Grant             *
 *			  http://www.anphin.com	             *
 * * * * * * * * * * * * * * * * * * * * * * * * *
 *   Improve cross-browser support of the DOM.   *
 * * * * * * * * * * * * * * * * * * * * * * * * */

dom = {

	addEvent : function(element, eventType, callback){
		// We're not even going to pretend that event capture is supported
		// when IE 6 and DOM 1 don't support it.
		try {
			// DOM 2 Compliant
			if (element.addEventListener){
				element.addEventListener(eventType, callback, false);
				return true;

			// IE 6
			} else if (element.attachEvent) {
				var r = element.attachEvent('on' + eventType, callback);
				return r;

			// Set DOM 1 property to the function
			} else {
				element['on' + eventType] = callback;
			}
		} catch(e) {
			alert("Could not add event hook on" + eventType + " to element " + element.toString() + ". " + e);
		}
	},
	
	removeEvent : function(element, eventName, callback) {
		try {
			// DOM 2
			if (element.removeEventListener) {
				element.removeEventListener(eventName, callback, false);
			
			// IE
			} else if (element.detachEvent) {
				element.detachEvent("on" + eventName, callback);
			}
		} catch(e) {
			alert("Could not remove event hook." + e);
		}
	},

	getEventTarget : function(event) {
		var targetElement = null;
		if (typeof event.target != "undefined") {
			targetElement = event.target;
		} else {
			targetElement = event.srcElement;
		}

	/**
	* In some cases, some browsers will return a text node inside
	* the actual element that was targeted.  This normalizes the
	* return value for getTarget and getRelatedTarget.
	*/
		while (targetElement.nodeType == 3 && targetElement.parentNode != null) {
			targetElement = targetElement.parentNode;
		}

		return targetElement;
	},

	cancelEvent : function(e) {
		e = e ? e : window.event;
		if (e.stopPropagation)
			e.stopPropagation();
		if (e.preventDefault)
			e.preventDefault();
		e.cancelBubble = true;
		e.cancel = true;
		e.returnValue = false;
		return false;
	},

	// Return the eventTarget whether we're using the DOM or IE...
	getTarget : function(e) {
		var e = e || window.event;
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target) { return false; }

		// Workaround Safari sending link text instead of an element
		if (target.nodeName.toLowerCase() != 'a') { target = target.parentNode; }
		return target;
	},

	// Stops the default action for clicking a link
	stopDefault : function(e) {
		if (window.event && window.event.returnValue) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.preventDefault) {
			e.preventDefault();
		}

		if (e.stopPropagation) {
			e.stopPropagation();
		}
	},

	absoluteCursorPostion : function(eventObj) {
		eventObj = eventObj ? eventObj : window.event;

		if(isNaN(window.scrollX)) {
			return new Position(eventObj.clientX + document.documentElement.scrollLeft
							+ document.body.scrollLeft,
							eventObj.clientY + document.documentElement.scrollTop
							+ document.body.scrollTop);
		} else {
			return new Position(eventObj.clientX + window.scrollX,
							eventObj.clientY + window.scrollY);
		}
	},

	
	dumpProps : function(obj, parent, write_props) {
		if (typeof write_props == 'undefined') write_props = false;
		
		for (var i in obj) {
			// if a parent (2nd parameter) was passed in, then use that to
		    // build the message. Message includes i (the object's property name)
		    // then the object's property value on a new line
		    if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
		    
		    if (!write_props) {
			    // Display the message. If the user clicks "OK", then continue. If they
			    // click "CANCEL" then quit this level of recursion
			    if (!confirm(msg)) { return; }
		    } else {
		    	document.write(msg + "<br>");
		    }
		    // If this property (i) is an object, then recursively process the object
		    if (typeof obj[i] == "object") {
		    	if (parent) { this.dumpProps(obj[i], parent + "." + i, write_props); } else { this.dumpProps(obj[i], i, write_props); }
		    }
		}
	},

	getElm : function(obj) {
		try {
			return document.getElementById(obj) || obj;
		} catch(e) {
			alert("Could not get an object with " + obj + ". Error: " + e);
		}
	}
}


