// $Id: main.js 422 2005-06-07 09:27:47Z jonathan $

window.onload = initialise;
function initialise()
{
	vMenu = document.getElementById("menu");
	if(vMenu)
	{
		vMenu.onmouseover = menuMouseOver;
		vMenu.onmouseout = menuMouseOut;
		vMenu.hideEntireMenu = false;		
		setInterval("hideEntireMenu()", 1300);		
		document.getElementsByTagName("body")[0].onmouseover = menuMouseOver;
		
		setupMenu();
	}
}

function setupMenu()
{
	vList = document.getElementById("menu").getElementsByTagName("a");
	for(i=0; i < vList.length; i++)
		if(vList[i].href == location.href)
		{
			vList[i].parentNode.className = "current";
			vList[i].removeAttribute("href");
			break;
		}
	
	for(i=0; i < vList.length; i++)
	{	
		if(vList[i].parentNode.getElementsByTagName("ul").length)
			vList[i].className = "parent";
		if(vList[i].href.match(/#$/))
		{	
			vList[i].onclick = doNothing;
			vList[i].className += " noLink";
		}
	}
}

function doNothing()
{
	return false;
}

function menuMouseOver(pEvent)
{
	if(!pEvent) 
		pEvent = event;
	vTarget = (pEvent.target) ? pEvent.target : pEvent.srcElement;
	vMenu = document.getElementById("menu");
	
	if(!isChildOf(vMenu, vTarget) && menuVisible())
		vMenu.hideEntireMenu = true;
	else if(vTarget.tagName == "A")
	{
		vListItem = vTarget.parentNode;
		
		if(vListItem.parentNode.parentNode.id != "menu")
			vMenu.hideEntireMenu = false;		

		deactivate(vListItem.parentNode.getElementsByTagName("a"));								
		vChildList = vListItem.getElementsByTagName("ul")[0];
		if(vChildList) // show sub-menu
		{
			vMenu.hideEntireMenu = false;
			vChildList.className = "visible";			
			if(!vTarget.className.match(/active/)) vTarget.className += " active";
		}
		vSiblingList = vListItem.parentNode.getElementsByTagName("ul");
		setTimeout("hideSiblings(vSiblingList, vChildList)", 1);
	}
}

function hideSiblings(pSiblingList, pTarget)
{
	for(i=0; i< pSiblingList.length; i++)
		if(pSiblingList[i] != pTarget) pSiblingList[i].className = "";
}

function deactivate(pList)
{
	for(i=0; i < pList.length; i++)
		pList[i].className = pList[i].className.replace(/active/, "");
}

function menuMouseOut(pEvent)
{
	if(!pEvent) 
		pEvent = event;
	vTarget = (pEvent.target) ? pEvent.target : pEvent.srcElement;
	vNewElement = (pEvent.relatedTarget) ? pEvent.relatedTarget : pEvent.toElement;
	vMenu = document.getElementById("menu");
	
	if(vTarget.tagName == "A")
	{
		vListItem = vTarget.parentNode; // mouse is leaving this <li>
		vSubMenu = vListItem.getElementsByTagName("ul")[0];
		
		if(!vNewElement || !isChildOf(vMenu, vNewElement))
			vMenu.hideEntireMenu = true;
		else if(!isChildOf(vListItem.parentNode.parentNode, vNewElement)) 
		{
			// mouse not in cousin of ours
			if(vListItem.parentNode.parentNode.id != "menu")
				vListItem.parentNode.className = '';			
		}
	}
}
function hideEntireMenu()
{
	vMenu = document.getElementById("menu");
	if(!vMenu.hideEntireMenu)			
		return;
	vTopList = vMenu.getElementsByTagName("ul")[0];
	setClassOnAll(vTopList.getElementsByTagName("ul"), "");
	deactivate(vMenu.getElementsByTagName("a"));
	vMenu.hideEntireMenu = false;
}

function menuVisible()
{
	vULList =  document.getElementById("menu").getElementsByTagName("ul");
	for(i = 1; i < vULList.length; i++) // miss out first ul, always visible
		if (vULList[i].className == "visible") return true;
	return false;
}

function isChildOf(pParent, pChild)
{
	vCurrent = pChild;
	while(vCurrent)
	{
		if(vCurrent == pParent)
			return true;
		vCurrent = vCurrent.parentNode;			
	}
	return false;
}

function showTab(pTarget)
{
	setClassOnImmediateChildren(document.getElementById("tourContent").getElementsByTagName("div"), "hidden", document.getElementById("tourContent"));
	setClassOnAll(document.getElementById("tabs").getElementsByTagName("li"), "");
	
	vTargetName = pTarget.getAttribute("href").match(/#(.*)$/)[1];
	document.getElementById(vTargetName).className = "";
	
	pTarget.parentNode.className = "current";
	pTarget.blur();
	return false;
}

function showNamedTab(pId)
{
	return showTab(document.getElementById(pId));
}

function setClassOnAll(pList, pClass)
{
	for(i=0; i < pList.length; i++)
		pList[i].className = pClass;
}
function setClassOnImmediateChildren(pList, pClass, pParent)
{
	for(i=0; i < pList.length; i++)
		if(pList[i].parentNode == pParent) pList[i].className = pClass;
}


function deactivateLinks(pElement)
{
	vLinkList = pElement.getElementsByTagName("a");
	for(i=0; i < vLinkList.length; i++)
		vLinkList[i].removeAttribute("href");
}
function setEventHandlerOnAll(pList, pEvent, pHandler)
{
	for(i=0; i < pList.length; i++)
	{
		eval("pList[" + i +"]." + pEvent + "= " + pHandler + ";");
	}
}

function hasClass(pElement, pClassName)
{
	var vPattern = new RegExp('\\b' + pClassName + '\\b');
	if(!pElement.className)
		return false;
	return (pElement.className.match(vPattern) != null);
}

function addClass(pElement, pClassName)
{
	var vPattern = new RegExp("\\b" + pClassName + "\\b");
	if( !( pElement.className && pElement.className.match(vPattern)) )
		pElement.className += " " + pClassName;
}

function removeClass(pElement, pClassName)
{
	var vPattern = new RegExp("\\b" + pClassName + "\\b");
	if(pElement.className && pElement.className.match(vPattern))
		pElement.className = pElement.className.replace(vPattern, "");
}

function loseWhitespace(pInput)
{
	pInput.value = pInput.value.replace(/\s+/g, "");
}

function errorMouseover(pEvent, pFromFocus)
{
	if(!pEvent) 
		pEvent = event;
	vTarget = (pEvent.target) ? pEvent.target : pEvent.srcElement;
	if(pFromFocus)
		vTarget = vTarget.parentNode;	
	/*
	else if(!hasClass(vTarget, "errorRow"))
		return;*/
			
	vList = vTarget.getElementsByTagName("div");
	for(i=0;i<vList.length;i++)
		if(hasClass(vList[i], "errorMessage")) addClass(vList[i], "visible");
}

function errorMouseout(pEvent, pFromFocus)
{
	if(!pEvent) 
		pEvent = event;
	vTarget = (pEvent.target) ? pEvent.target : pEvent.srcElement;
	vNewElement = (pEvent.relatedTarget) ? pEvent.relatedTarget : pEvent.toElement;

	if(pFromFocus)
		vTarget = vTarget.parentNode;	
	else if(!hasClass(vTarget, "errorRow"))
		return;
	if(vNewElement && isChildOf(vTarget, vNewElement))
		return;
	
	vList = vTarget.getElementsByTagName("div");
	for(i=0;i<vList.length;i++)
		if(hasClass(vList[i], "errorMessage"))
		{
			vMessage = vList[i];
			setTimeout("hideErrorMessage(vMessage)", 500);
			break;
		} 
}

function focusErrorField(pEvent)
{
	if(!pEvent) pEvent = event;
	vTarget = (pEvent.target) ? pEvent.target : pEvent.srcElement;
	vTarget.parentNode.hasFocus = true;
	errorMouseover(pEvent, true);	
}
function blurErrorField(pEvent)
{
	if(!pEvent) pEvent = event;
	vTarget = (pEvent.target) ? pEvent.target : pEvent.srcElement;
	vTarget.parentNode.hasFocus = false;
	errorMouseout(pEvent, true);	
}

function hideErrorMessage(pElement)
{
	if(pElement.parentNode && 
		pElement.parentNode.parentNode && (!pElement.parentNode.parentNode.hasFocus))
		removeClass(pElement, "visible");
}

function showError(pElement, pMessageText, pSkipFocus)
{
	vParentElement = pElement.parentNode;
	if(hasClass(vParentElement, "errorRow"))
		return;
	
	if(document.errorCount) document.errorCount++;
		else document.errorCount = 1;
	if(document.errorList) document.errorList += "\n" + pMessageText;
		else document.errorList = "\n" + pMessageText;
	
	addClass(vParentElement, "errorRow");
	
	vError = document.createElement("div");
	vError.className = "errorWarning";
	vMessageDiv = document.createElement("div");
	vMessageDiv.className = "errorMessage";
	vMessageDiv.appendChild(document.createTextNode(pMessageText));
	vError.appendChild(vMessageDiv);
	vParentElement.insertBefore(vError, vParentElement.firstChild);
	
	vParentElement.onmouseover = errorMouseover;
	vParentElement.onmouseout = errorMouseout;	
	if(!pSkipFocus)
	{
		pElement.onfocus = focusErrorField;
		pElement.onblur = blurErrorField;
	}
}
function alertErrors()
{
	if(document.errorCount > 0)
	{	
		alert(
			(document.errorCount == 1 ? "There is an error " : 
			"There are " + document.errorCount + " errors " ) +	"in your input:\n" + document.errorList);
		return false;
	}
	return true;
}

function clearErrors()
{
	blurForms(); // or all hell breaks loose
	document.errorCount = 0;
	document.errorList = "";
	vList = filterListByClass(document.getElementsByTagName("div"), "errorWarning");
	
	while(vElement = vList.shift())
	{
		vParent = vElement.parentNode;
		removeClass(vParent, "errorRow");
		vParent.onmouseover = "";
		vParent.onmouseout = "";	
		vParent.removeChild(vElement);	
	}	
}

function filterListByClass(pList, pClass)
{
	vArray = new Array();
	for(i=0;i<pList.length;i++)
		if (hasClass(pList[i], pClass)) vArray.unshift(pList[i]);
	return vArray;
}
function blurForms()
{
	vFormList = document.getElementsByTagName("form");
	for(i=0;i<vFormList.length;i++)
	{
		vList = vFormList[i].getElementsByTagName("input");
		for(j=0;i<vList.length;i++) vList[j].blur();
	}
}

function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;  
} else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;  
} else {
    alert("Handler could not be removed");  
}
} 

function prepareTextBoxes()
{ 
if (!document.getElementsByTagName)
 return;
 var oi=0;
 var thisObj;
 var objs = document.getElementsByTagName("input");
 for (oi=0;oi<objs.length;oi++) 
{
  thisObj = objs[oi];
  if(thisObj.getAttribute('type') == 'text')
{   
thisObj.className = 'textbox ' + thisObj.className;
  } 
}
}

addEvent(window, "load", prepareTextBoxes);
