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

function SetFocus() {
/*
	if( !document.getElementById )
		return;
	var focusElem = document.getElementById('focus');
	if( !focusElem || !focusElem.getElementsByTagName('input') )
		return;
	focusElem.getElementsByTagName('input')[0].focus();
*/
	return;
}

function SetHover(id, tagName) {
	if( !document.getElementById || !document.getElementsByTagName )
		return;

	var idElem, elemTags, elemTagCount;
	if( !(idElem = document.getElementById(id)) || !(elemTags = idElem.getElementsByTagName(tagName)) )
		return;
	elemTagCount = elemTags.length;
	for( var i = 0; i < elemTagCount; i++ ) {
		if( /shouldHover/.test(elemTags[i].className) ) {
			elemTags[i].onmouseover=function(){Hover(this);};
			elemTags[i].onmouseout=function(){Hover(this);};
			elemTags[i].onfocus=function(){Hover(this);};
			elemTags[i].onblur=function(){Hover(this);};
		}
	}
}

function Hover(obj) {
	if( !obj)
		return;

	if( /shouldHover/.test(obj.className) ) {
		obj.className = 'hover';
	} else {
		obj.className = 'shouldHover';
	}
}

function ConfirmSubmit(msg) {
	if( !msg )
		msg = 'Are you sure you want to do this?';
	return confirm(msg);
}

function CheckForm(form) {
	if( !document.getElementById || !document.createTextNode || !document.getElementById('RequiredFields') )
		return;

	var errorID	= 'errorMsg';
	var errorClass	= 'error';
	var errorMsg	= 'Please correct the fields labeled ';
	var errorImg	= '/images/alert.gif';
	var errorAlt	= 'Invalid data';
	var errorTitle	= 'This field contains invalid data!';
	var errorSize	= '30px';
	var reqFields	= document.getElementById('RequiredFields').value.split(',');

	if( document.getElementById(errorID) ) {
		var err = document.getElementById(errorID);
		err.parentNode.removeChild(err);
	}

	for( var i = 0; i < reqFields.length; i++ ) {
		var field = document.getElementById(reqFields[i]);
		if( !field )
			continue;

		if( field.nextSibling && /img/i.test(field.nextSibling.nodeName) )
			field.parentNode.removeChild(field.nextSibling);
		field.className = '';

		switch( field.type.toLowerCase() ) {
			case 'text':
			case 'textarea':
				field.value = trim(field.value);
				if( field.value == '' )
					AddFormError(field);
				break;
			case 'checkbox':
				if( !field.checked )
					AddFormError(field);
				break;
			case 'select-one':
				break;
		}
	}
	return !document.getElementById(errorID);

	function trim(str) {
		return str.replace(/^\s+|\s$/g, "");
	}

	function CheckFormEmail(obj) {
		return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	}

	function AddFormError(obj) {
		var errorIndicator = createElement('img');
		errorIndicator.src = errorImg;
		errorIndicator.alt = errorAlt;
		errorIndicator.title = errorTitle;
		if( errorSize ) {
			errorIndicator.style.width = errorSize;
			errorIndicator.style.height = errorSize;
		}
		obj.className = errorClass;
		if( obj.nextSibling )
			obj.parentNode.insertBefore(errorIndicator, obj.nextSibling);
		else
			obj.parentNode.appendChild(errorIndicator);

		if( !document.getElementById(errorID) ) {
			var err = createElement('div');
			err.id = errorID;
			var newP = createElement('p');
			newP.appendChild(document.createTextNode(errorMsg));
			newP.appendChild(errorIndicator.cloneNode(true));
			err.appendChild(newP);

			var inputs = form.getElementsByTagName('input');
			for( var i = 0; i < inputs.length; i++ ) {
				if( /submit/i.test(inputs[i].type) ) {
					var submit = inputs[i];
					break;
				}
			}
			if( submit )
				submit.parentNode.insertBefore(err, submit);
		}
	}
}

/*
 * ul2finder
 * written by Christian Heilmann (http://icant.co.uk)
 * turns the nested list with the ID "finder" into a dynamic list
 * uses the CSS classes defined in the variables
 */
function ul2finder()
{
	// Define variables used and classes to be applied/removed
	var i,uls,als,finder;
	var parentClass='parent';
	var showClass='shown';
	var hideClass='hidden';
	var openClass='open';

	// check if our finder list exists, if not, stop all activities
	finder=document.getElementById('finder');
	if(!finder){return;}

	// add the class domenabled to the body
	cssjs('add',document.body,'domenabled')

	// loop through all lists inside finder, position and hide them
	// by applying the class hidden
	uls=document.getElementById('finder').getElementsByTagName('ul');
	for(i=0;i<uls.length;i++)
	{
		cssjs('add',uls[i],hideClass);
	}

	// loop through all links of inside finder
	lis=document.getElementById('finder').getElementsByTagName('li');
	for(i=0;i<lis.length;i++)
	{
		// if the li containing the link has no nested list, skip this one
		if(!lis[i].getElementsByTagName('ul')[0])
		{
			continue;
		}
		var newa=createElement('a');
		newa.href='#';
		newa.appendChild(document.createTextNode(lis[i].firstChild.nodeValue));
		lis[i].replaceChild(newa,lis[i].firstChild);
		// otherwise apply the parent class
		cssjs('add',newa,parentClass);

		// if the user clicks on the link
		lis[i].getElementsByTagName('a')[0].onclick=function()
		{
		// loop through all lists inside finder
			for(var i=0;i<uls.length;i++)
			{
				// avoid the list connected to this link
				var found=false;
				for(j=0;j<uls[i].getElementsByTagName('ul').length;j++)
				{
					if(uls[i].getElementsByTagName('ul')[j] ==
						this.parentNode.getElementsByTagName('ul')[0])
					{
						found=true;
						break;
					}
				}
				// and hide all others
				if(!found)
				{
					cssjs('add',uls[i],hideClass)
					cssjs('remove',uls[i],showClass)
					cssjs('remove',uls[i].parentNode.getElementsByTagName('a')[0],openClass)
					cssjs('add',uls[i].parentNode.getElementsByTagName('a')[0],parentClass)
				}
			}
			// change the current link from parent to open
			cssjs('swap',this,parentClass,openClass)
			// show the current nested list
			cssjs('add',this.parentNode.getElementsByTagName('ul')[0],showClass)

			// don't follow the real HREF of the link
			return false;
		}
	}

	/*
	 * 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(!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':
				return new RegExp('\\b'+c1+'\\b').test(o.className)
			break;
		}
	}
}

window.onload=function(){
	SetFocus();
	SetHover('navMenu', 'a');
	SetHover('shoppingCart', 'tr');
	ul2finder();
}
