/*******************************************************************************************
 * cssjs
 * Written by Christian Heilmann (http://icant.co.uk)
 * Eases the dynamic application of CSS classes via DOM
 * Parameters: action a, object o and class names c1 and c2 (c2 optional)
 * Actions: swap exchanges c1 and c2 in object o
 *			add adds class c1 to object o
 *			remove removes class c1 from object o
 *			check tests if class c1 is applied to object o
 * Example:	cssjs('swap',document.getElementById('foo'),'bar','baz');
 *******************************************************************************************/

	function cssjs(a,o,c1,c2) {
		switch (a){
			case 'swap':
				o.className=!cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!o.className) o.className = '';
				if(!cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				if(!o.className) return false;
				return new RegExp('\\b'+c1+'\\b').test(o.className)
			break;
		}
		return true;
	}

/*******************************************************************************************
 * addEvent / removeEvent
 *******************************************************************************************/
	function addEvent(obj, evType, fn) {
		if (obj.addEventListener) {
			obj.addEventListener(evType, fn, false);
			return true;
		} else if (obj.attachEvent) {
			var r = obj.attachEvent("on"+evType, fn);
			return r;
		} else {
			return false;
		}
	}

	function removeEvent(obj, evType, fn) {
		if (obj.removeEventListener) {
			obj.removeEventListener(evType, fn, false);
			return true;
		} else if (obj.detachEvent) {
			var r = obj.detachEvent("on"+evType, fn);
			return r;
		} else {
			return false;
		}
	}

/*******************************************************************************************
 * addLoadEvent
 * Written by Simon Willison (http://simon.incutio.com/)
 * 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');
 *		});
 *******************************************************************************************/


	function addLoadEvent(func) {
		var oldonload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = func;
		} else {
			window.onload = function() {
				func();
				oldonload();
			}
		}
	}


	/*******************************************************
	 * Uncomment if you need to stop JS Flicker
	 *
	 *	if (document.getElementsByTagName) {
	 *		addLoadEvent (function() {
	 *			document.body.style.visibility = 'visible';
	 *		});
	 *		document.write ('<style type="text/css"> body { visibility: hidden; } \</style>');
	 *	}
	 *
	 *******************************************************/



/*******************************************************************************************
 * 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'");
		}
	}
	
/*******************************************************************************************
 * javasciptElement and javascriptAlternativeElement classes
 * Used to better present the information to users bases
 * on the technology they have enabled
 *******************************************************************************************/
	
	document.write('<style type="text/css" media="screen">');
	document.write('<!-- ');
	document.write('/* \\*/');

		document.write('.javascriptElement { display:block; }');
		document.write('.javascriptAlternativeElement { display:none; }');

	document.write('/* */');	
	document.write('-->');
	document.write('<\/style>');
	
/*******************************************************************************************
 * 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;
	}

/*******************************************************************************************
 * doSearchClear
 * Written by Petr Krojzl (krojzl@gmail.com)
 * Clear field if it contains default value (for onfocus event)
 *******************************************************************************************/

	function doSearchClear(field) {
		if (field.value == field.defaultValue)
			field.value = "";
	}

/*******************************************************************************************
 * doSearchFill
 * Written by Petr Krojzl (krojzl@gmail.com)
 * Fill field with default value if it is empty (for onblur event)
 *******************************************************************************************/

	function doSearchFill(field) {
		if (field.value == "")
			field.value = field.defaultValue;
	}
