
var DHTML = (document.getElementById || document.all || document.layers);

// Return OBJECT and STYLE OBJECT for given id
function getObj(name)
{
	this.found = false;

	// Try to retrieve the requested object
	if (document.getElementById)
	{
  		// ( store under a window variable so testing if it exists won't cause an error )
  		window.getTheObject = document.getElementById(name);
	}
	else if (document.all)
	{
		window.getTheObject = document.all[name];
	}
	else if (document.layers)
	{
   		window.getTheObject = document.layers[name];
	}

	// Did we find a valid object?
	if ( window.getTheObject )
	{
		this.obj = window.getTheObject;
		this.style = window.getTheObject.style;
		this.found = true;
	}

	// Release our hold on temporary window var
	window.getTheObject = null;

	return this;
}

// Return value for requested param
function getQueryVariable( variable, required )
{
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	for (var i=0;i<vars.length;i++)
	{
		var pair = vars[i].split("=");
		if (pair[0] == variable)
		{
			return pair[1];
		}
	} 

	if ( required == true )
	{
		alert('Query variable ' + variable + ' not found');
	}
}

// Display standard error messages
function showErr ( errMsg )
{
	
	alert(
		'Please complete the following before continuing:\n\n'
		+ errMsg
	);
}

/*
 * HOOKING events to page elements
 */

// Wrapper to attach an event to an element
function hookEvent(element, eventName, callback)
{
	if(typeof(element) == "string")
		element = new getObj(element).obj;
	if(element == null)
		return;
	if(element.addEventListener)
		element.addEventListener(eventName, callback, false);
	else if(element.attachEvent)
		element.attachEvent("on" + eventName, callback);
}

// Wrapper to detach an event
function unhookEvent(element, eventName, callback)
{
	if(typeof(element) == "string")
		element = new getObj(element).obj;
	if(element == null)
		return;
	if(element.removeEventListener)
		element.removeEventListener(eventName, callback, false);
	else if(element.detachEvent)
		element.detachEvent("on" + eventName, callback);
}

// Get an event
function getEvent(e)
{
	if(!e)
		return window.event
	return e;
}

// Get the target of an event
function getTarget(e)
{
	if(!e)
		e = window.event;
	if(e.target)
		return e.target;
	return e.srcElement;
}

// Stop event propagation / bubbling
function cancelEvent(e)
{
	if(!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;
}

// Recursive function to find
function findElementType (o, tagType)
{
	var name = (o.nodeType == 1) ? o.tagName.toLowerCase() : '';
	if ( name == tagType )
	{
		return o;
	}
	else
	{
		if ( o.parentElement )
			return findElementType( o.parentElement, tagType );
		else
			return null;
	}
}

// Dumps an object to a string for debugging
var MAX_DUMP_DEPTH = 10;
function dumpObj(obj, name, indent, depth) {
	if (depth > MAX_DUMP_DEPTH) {
		return indent + name + ": <Maximum Depth Reached>\n";
	}
	if (typeof obj == "object") {
		var child = null;
		var output = indent + name + "\n";
		indent += "\t";
		for (var item in obj)
		{
			try {
				child = obj[item];
			} catch (e) {
				child = "<Unable to Evaluate>";
			}
			if (typeof child == "object") {
				output += dumpObj(child, item, indent, depth + 1);
			} else {
				output += indent + item + ": " + child + "\n";
			}
		}
		return output;
	} else {
		return obj;
	}
}

