/*******************************************************************************************
 * addLoadEvent
 * Originally written by Simon Willison (http://simonwillison.net/2004/May/26/addLoadEvent/)
 * Incorporated with code by Dean Edwards (http://dean.edwards.name/weblog/2006/06/again)
 * Takes a function as an argument which should be executed once the DOM has loaded
 * Parameters: function func
 * Example:
 *		addLoadEvent(myFunction);
 *		addLoadEvent(function() {
 *			alert ('a');
 *		});
 *******************************************************************************************/

	//--------------------------------------------------
	// Loading setup

		var addLoadEventStack = []; // Array
		var addLoadEventCount = 0;

		function addLoadEvent(func) {
			addLoadEventStack[addLoadEventCount++] = func;
		}

	//--------------------------------------------------
	// Execute the functions when the page has loaded

		var addLoadEventDone = false;
		var addLoadEventSafariTimer;

		function addLoadEventInit() {

			//--------------------------------------------------
			// Do not run the functions twice

				if (addLoadEventDone) {
					return;
				} else {
					addLoadEventDone = true;
				}

			//--------------------------------------------------
			// Remove the loading timer for Safari

				if (addLoadEventSafariTimer) {
					clearInterval(addLoadEventSafariTimer);
				}

			//--------------------------------------------------
			// Execute the functions - cannot use variable 'i'
			// as the executed functions scope could change it

				var addLoadEventProgress;
				for (addLoadEventProgress = 0; addLoadEventProgress < addLoadEventCount; addLoadEventProgress++) {
					addLoadEventStack[addLoadEventProgress]();
				}

		}

	//--------------------------------------------------
	// Triggers for the different browsers

		//--------------------------------------------------
		// For DOM compatible browsers - Firefox and Opera

		 	if (document.addEventListener) {
		 		document.addEventListener('DOMContentLoaded', addLoadEventInit, false);
		 	}

		//--------------------------------------------------
		// For Safari

			if (/WebKit/i.test(navigator.userAgent)) { // sniff
				addLoadEventSafariTimer = setInterval(function() {
					if (/loaded|complete/.test(document.readyState)) {
						addLoadEventInit(); // call the onload handler
					}
				}, 10);
			}

		//--------------------------------------------------
		// For Internet Explorer

			/*@cc_on @*/
			/*@if (@_win32)

				document.write('<script id="addLoadEventIeOnload" defer="defer" src=//:><\/script>');
				var script = document.getElementById("addLoadEventIeOnload");
				script.onreadystatechange = function() {
					if (this.readyState === "complete") {
						addLoadEventInit(); // call the onload handler
					}
				};

			@end @*/

		//--------------------------------------------------
		// Fall back for other browsers

			window.onload = addLoadEventInit;

/*******************************************************************************************
 * addLinkEvent
 * Originally written by Craig Francis (http://craigfrancis.co.uk)
 * Take a link reference and bind a function to the onclick/onkeypress events
 * Example:	addLinkEvent(document.getElementById('myLink'), functionName);
 *******************************************************************************************/

	function addLinkEvent(link, func) {

		try {
			link.style.cursor = 'pointer';
		} catch (e) {
			try {
				link.style.cursor = 'hand';
			} catch (e) {
			}
		}

		link.onclick = func;

		link.tabIndex = 0;

		link.onkeypress = function (e) {
				var keyCode = e ? e.which : window.event.keyCode;
				if (keyCode != 13 && keyCode != 32) return true;
				this.onclick();
				return false;
			};

	}

/*******************************************************************************************
 * cssjs
 * Originally 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) {

		var exp;

		if (action === 'add') {

			if (!cssjs('check', object, className)) {
				object.className += (object.className === '' ? '' : ' ') + className;
			}

		} else if (action === 'remove') {

			exp = new RegExp('(^' + className + '( |$)| ' + className + '\\b)');
			object.className = object.className.replace(exp, '');

		} else if (action === 'check') {

			exp = new RegExp('\\b' + className + '\\b');
			return exp.test(object.className);

		}

		return true;

	}

/*******************************************************************************************
 * 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;
	}

/*******************************************************************************************
 * addCssRule
 * Originally written by Craig Francis (http://craigfrancis.co.uk)
 * Add a CSS rule to the document - includes support for xhtml+xml
 * Example:	addCssRule('#itemId { position: absolute; left: -5000px; }');
 *******************************************************************************************/

	function addCssRule(cssRule) {

		var styleElement;
		var headRef;

		//var useXmlMethods = (document.contentType && document.contentType.indexOf('xml') > -1);

		var useXmlMethods = (document.xmlVersion && document.xmlVersion.indexOf('1.0') > -1);

		if (useXmlMethods) {

			styleElement = createElement('style');
			styleElement.setAttribute('type', 'text/css');
			styleElement.appendChild(document.createTextNode(cssRule));

			headRef = document.getElementsByTagName('head');
			if (headRef[0]) {
				headRef[0].appendChild(styleElement);
			}

		} else {

			document.write ('<style type="text\/css"> ' + cssRule + ' <\/style>');

		}

	}

/*******************************************************************************************
 * 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;
	}

/*******************************************************************************************
 * getParent
 * Written by Richard Cornford (http://www.litotes.demon.co.uk/)
 * Move up the DOM to the specified tag
 * Example:	getParent(this, 'form');
 *******************************************************************************************/

	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;
	}

/*******************************************************************************************
 * Firebug
 * Written by Joe Hewitt (http://www.getfirebug.com/)
 * Suppress any calls to console.log, etc.
 *******************************************************************************************/

	if (!window.console || !console.firebug) {

		var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];

		window.console = {};
		for (var i = 0; i < names.length; ++i) {
			window.console[names[i]] = function() {};
		}

	}
