/*******************************************************************************************
 * addLoadEvent
 * Origionally written by Simon Willison (http://simon.incutio.com/)
 * ReWritten by Craig Francis to use DOMContentLoaded
 * Takes a function as an argument which should be executed once the page has loaded
 * Parameters: function func
 * Example:
 *		addLoadEvent(myFunction);
 *		addLoadEvent(function() {
 *			alert ('a');
 *		});
 *******************************************************************************************/

	var loadFunctions = new Array();
	var documentLoadDone = false;

	function addLoadEvent(func) {
		loadFunctions[loadFunctions.length] = func;
	}

	function initLoadEvent() {
		if (documentLoadDone == false) {
			documentLoadDone = true;
			for (i in loadFunctions) {
				loadFunctions[i]();
			}
		}
	}

	window.onload = initLoadEvent;
 	if (document.addEventListener) {
 		document.addEventListener('DOMContentLoaded', initLoadEvent, false);
 	}

/*******************************************************************************************
 * cssjs
 * Origionally written by Christian Heilmann (http://icant.co.uk)
 * Eases the dynamic application of CSS classes via DOM
 * Example:	cssjs('add', document.getElementById('foo'), 'bar');
 *******************************************************************************************/

	function cssjs(action, object, className) {

		if (action == 'add') {

			if (!cssjs('check', object, className)) {
				object.className += (object.className == '' ? '' : ' ') + className;
			}

		} else if (action == 'remove') {

			var exp = new RegExp('(^' + className + '( |$)| ' + className + '\\b)');
			object.className = object.className.replace(exp, '');

		} else if (action == 'check') {

			var exp = new RegExp('\\b' + className + '\\b');
			return exp.test(object.className);

		}

		return true;

	}

/*******************************************************************************************
 * isEmailAddr
 * Written by Christian Heilmann (http://icant.co.uk)
 * Check that the email address matches the correct basic format
 * Parameters: string str
 * Example:	isEmailAddr('1@1.com');
 *******************************************************************************************/

	function isEmailAddr(str) {
		var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/;
		return re.test(str);
	}

/*******************************************************************************************
 * isValidDate
 * Written by Chris Hogben (http://www.codetoad.com)
 * Check that the date is valid
 * Example:	isValidDate(30, 1, 2005);
 *******************************************************************************************/

	function isValidDate(day, month, year) {
		month--; // JavaScript takes January as "0"
		var dteDate=new Date(year, month, day);
		return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
	}

/*******************************************************************************************
 * printMe
 * Try to run the "print" function, otherwise tell the user how to print correctly.
 * Example:	printMe();
 *******************************************************************************************/

	function printMe() {
		try {
			print();
		} catch(exception){
			alert("To print this page, click file and\n select 'Print' or 'Print Preview' ");
		}
	}

/*******************************************************************************************
 * findPosX and findPosY
 * Written by Peter-Paul Koch (http://www.quirksmode.org/) and Alex Tingle (http://blog.firetree.net/)
 * Find where an element is on the page.
 * Example:	findPosX(this);
 *******************************************************************************************/

	function findPosX(obj) {
		var curleft = 0;
		if (obj.offsetParent) {
			while(1) {
				curleft += obj.offsetLeft;
				if(!obj.offsetParent) {
					break;
				}
				obj = obj.offsetParent;
			}
		} else if (obj.x) {
			curleft += obj.x;
		}
		return curleft;
	}

	function findPosY(obj) {
		var curtop = 0;
		if (obj.offsetParent) {
			while(1) {
				curtop += obj.offsetTop;
				if (!obj.offsetParent) {
					break;
				}
				obj = obj.offsetParent;
			}
		} else if (obj.y) {
			curtop += obj.y;
		}
		return curtop;
	}

/*******************************************************************************************
 * createElement
 * Written by Simon Willison (http://simon.incutio.com/)
 * Create an xhtml element with a nameSpace if possible
 * Example:	createElement('a');
 *******************************************************************************************/

	function createElement(element) {
		if (typeof document.createElementNS != 'undefined') {
			return document.createElementNS('http://www.w3.org/1999/xhtml', element);
		}
		if (typeof document.createElement != 'undefined') {
			return document.createElement(element);
		}
		return false;
	}

/*******************************************************************************************
 * getParent and getDecendentByTagName
 * Written by Richard Cornford (http://www.litotes.demon.co.uk/)
 * Move up/down the DOM to the specified tag
 * Example:	findPosX(this);
 *******************************************************************************************/

	function getParent(el, pTagName) {
		if (el != null) {
			if ((el.nodeType == 1) && (el.tagName.toUpperCase() == pTagName.toUpperCase())) {
				return el;
			} else if (el.parentNode) {
				return getParent(el.parentNode, pTagName);
			}
		}
		return null;
	}

	function getDecendentByTagName(el, dTagName) {
		var ndList;
		if (el.getElementsByTagName) {
			ndList = el.getElementsByTagName(dTagName);
		} else if (el.all) {
			ndList = el.all.tags(dTagName);
		}
		if (!ndList) {
			ndList = [];
		} else if (typeof ndList.length == 'undefined'){
			ndList = [ndList];
		}
		return ndList;
	}
