//Attaches an event handler to a DOM element
function addEvent(element, eventname, func, use_capture)
{
        if (element.addEventListener)
        {
                element.addEventListener(eventname, func, use_capture);
                return true;
        }
        else if (element.attachEvent)
        {
                var r=element.attachEvent('on'+eventname, func);
                return r;
        }
        else
        {
                element['on'+eventname]=func;
                return true;
        }

        return false;
}

function getEventSource(e)
{
	if (window.event && window.event.srcElement)
		return window.event.srcElement;
	else if (e && e.target)
		return e.target;
}

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

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

function inClass(el, cls)
{
	if (el.nodeType != Node.ELEMENT_NODE)
		return false;
        var elclass=el.getAttribute('class');
        if (!elclass)
                elclass=el.getAttribute('className');

        return (' '+elclass+' ').indexOf(' '+cls+' ') != -1;
}

function getParentIndex(el)
{
        var parent=el.parentNode;

        for (var i=0; i < parent.childNodes.length; i++)
        {
                if (el == parent.childNodes[i])
                        return i;
        }

        return -1;
}

var timer=new Object;
//Cancels hiding of all menus
function cancel_hide()
{
	if (timer['linkbar'])
		clearTimeout(timer['linkbar']);
	timer['linkbar']=0;
}

//Hides all menus after a delay
function hmd()
{
	if (timer['linkbar'])
		clearTimeout(timer['linkbar']);
	
	timer['linkbar']=setTimeout(hide_menus, 500);
}

//Hides all menus
function hide_menus()
{
	timer['linkbar']=0;

	var menubar=document.getElementById('menubar');

	var menus=menubar.getElementsByTagName('ul');

	for (var i=0; i < menus.length; i++)
		setMenuVisible(menus[i], false);
}

function cleanTextNodes(el)
{
	for (var i=0; i < el.childNodes.length; i++)
	{
		var c=el.childNodes[i];
		if (c.nodeType == 1)
		{
			cleanTextNodes(c);
		}
		else if (c.nodeType == 3)
		{
			var spaces= /^\s*$/
			if (spaces.test(c.nodeValue))
			{
				el.removeChild(c);
				i--;
			}
		}
	}
}

function setupEvents()
{
	if (document.getElementById)
	{
	        var menubar=document.getElementById('menubar');
		addEvent(menubar, 'mouseout', hmd, false);

		cleanTextNodes(menubar);

		var menuitems=menubar.getElementsByTagName('li');
		for (var i=0; i < menuitems.length; i++)
		{
			var c=menuitems[i];
			if (c.getElementsByTagName('ul').length > 0)
			{
				addEvent(c, 'mouseover', open_menu, false);
				addEvent(c, 'focus', open_menu, false);

				//Yes it's a hack but I can't see why IE's layout is chucking this space in
				if (navigator.appName == 'Microsoft Internet Explorer')
					c.style.marginBottom="-1.3em";
			}
		}
	}
}

function dump_dom(el)
{
	if (el.nodeType == 1)
	{
		dump("&lt;"+el.nodeName+"&gt;<div style=\"padding-left: 20px\">");
		for(var i=0; i<el.childNodes.length; i++)
		{
			dump_dom(el.childNodes[i]);
		}
		dump("</div>&lt;/"+el.nodeName+"&gt;");
	}
	if (el.nodeType == 3)
		dump(el.nodeValue);
}

function getChildElementsByTagName(el, tagname)
{
	var ces=new Array();

	for (var i=0; i < el.childNodes.length; i++)
	{
		c=el.childNodes[i];

		if (c.nodeType == 1 && c.nodeName.toLowerCase() == tagname.toLowerCase())
		{
			ces[ces.length]=c;
		}
	}

	return ces;
}

function ascendDOM(e, target)
{
	while (e.nodeName.toLowerCase() != target)
	{
		if (e == document.documentElement)
			return null;
		e=e.parentNode;
	}
	return e;
}

function open_menu(e)
{
	cancel_hide();

	var target=getEventSource(e);

	target=ascendDOM(target, 'li');
	while (target.getElementsByTagName('ul').length == 0)
		target=ascendDOM(target.parentNode, 'li');

	var submenu=getChildElementsByTagName(target, 'ul');
	
	if (submenu.length > 0)
		setMenuVisible(submenu[0], true);

	close_siblings(target);
}

function close_siblings(t)
{
	var sibs=t.parentNode.childNodes;

	for (var i=0; i < sibs.length; i++)
	{
		var c=sibs[i];
		if (c != t && c.nodeType == 1)
		{
			var submenus=c.getElementsByTagName('ul');
			for (var j=0; j < submenus.length; j++)
			{
				setMenuVisible(submenus[j], false);
			}
		}
	}
}

function setMenuVisible(el, vis)
{
	if (vis) {
		el.style.visibility='visible';
		var as=getChildElementsByTagName(el.parentNode, 'a');
		for (var i=0; i < as.length; i++)
			as[i].className='selected';
	} else {
		el.style.visibility='hidden';
		var as=getChildElementsByTagName(el.parentNode, 'a');
		for (var i=0; i < as.length; i++)
			as[i].className='';
	}
}

function map(arr, fn)
{
	var ret=new Array();
	for (var i=0; i < arr.length; i++)
	{
		ret[i]=fn(arr[i]);
	}

	return ret;
}

function dump(str)
{
	var content=document.getElementById('content');
	content.innerHTML=content.innerHTML+'<br />'+str;
}
addEvent(window, 'load', setupEvents, false);

