function getSubElements (obj, element)
{
	var ch = (obj.children) ? obj.children : obj.childNodes;

	var cnt = 0, l = ch.length, arr = new Array(), j=0;
	for (var i=0; i < l; i++)
		if (ch [i].tagName == element)
			arr [j++] = ch [i];
	return arr;
}

function menuHandler (e)
{
	e = (e == null) ? event : e;

	var from = e.target ? e.target : e.srcElement;
	var parent = from.parentNode ? from.parentNode : from.parentElement;

	if (from.tagName != "A")
		return true;

	var uls = getSubElements (parent, "UL");
	if (uls.length == 0)
		return true;

	for (var i=0; i<uls.length; i++)
	{
		var d = uls [i].className;
		uls [i].className = (/\bexpanded/g.test (d)) ? d.replace (/(expanded)?$/, "collapsed") : d.replace (/(collapsed)?$/, "expanded");
	}
	
	return false;
}

function findParent (obj, parent)
{
	var tmp = obj;
	while (tmp != null)
	{
		if (tmp.tagName == parent)
			return tmp;
		tmp = (tmp.parentElement) ? tmp.parentElement : tmp.parentNode;
	}
	return null;
}

function Popup (e, settings)
{
	e = (e == null) ? event : e;
	var from = e.target ? e.target : e.srcElement;
	var link = findParent (from, "A");
    var w = window.open (link.href, link.target, settings);  
    w.focus ();
    return true;
}

function Print (e)
{
	window.print ();
	return false;
}

	/* attaches an event to  */
	function attach (obj, evt, fun)
	{
		if (obj.addEventListener)
			obj.addEventListener (evt, fun, false);
		else if (obj.attachEvent)
			obj.attachEvent ("on" + evt, fun);
		else
			obj["on" + evt] = fun;
	}

	function hierarchy_InitAll (e)
	{
		var sel = document.getElementsByTagName ("SELECT");
		var i;
			
		for (i = 0; i < sel.length; i++)
		{
			if (sel[i].id.match (/_s$/g))
				hierarchy_Init (sel[i].id.substring (0, sel[i].id.length - 2));
			else if (sel[i].id.match (/_d$/g))
				advenacedSelector_Init (sel[i].id.substring (0, sel[i].id.length - 2));
		}
	}

	function hierarchy_Init (id)
	{
		var obj = document.getElementById (id + "_s");
		
		if (!obj || obj.initialized)
			return;
		
		var container = obj.parentNode || obj.parentElement;
		var ops = obj.options;
		var i;
		var prii = -1;
		var seci = 0;

		var primary = document.createElement ("SELECT");
		var secondary = document.createElement ("SELECT");
		primary.master = obj;
		primary.secondary = secondary;
		secondary.primary = primary;
		secondary.master = obj;

		primary.id = id + "_pr";
		secondary.id = id + "_se";

		container.insertBefore (primary, obj);
		container.insertBefore (secondary, obj);

		obj.primary = primary;
		obj.secondary = secondary;

		var lastGroup;
		for (i = 0; i < ops.length; i++)
		{
			var item = ops[i];
			var parent = item.parentNode || item.parentElement;

			if (parent.tagName == "OPTGROUP")
			{
				if (parent != lastGroup)
				{
					lastGroup = parent;
					prii++;
					primary.options[primary.options.length] = new Option (parent.label, "i" + i);

					item.primaryIndex = prii;
					item.secondaryIndex = 0;

					seci = 1;
				}
				else
				{
					item.primaryIndex = prii;
					item.secondaryIndex = seci;
					seci++;
				}
			}
			else if (parent.tagName == "SELECT")
			{
				if (item.value == "")
				{
					primary.options[primary.options.length] = new Option (item.text, "o" + i);
				}
				else
				{
					primary.options[primary.options.length] = new Option (item.text, "s" + i);
				}
				item.primaryIndex = ++prii;
				item.secondaryIndex = -1;
			}
		}
		document.getElementById (id + "_v").style.display = 'none';
		document.getElementById (id + "_i").style.display = 'none';
		document.getElementById (id + "_s").style.display = 'none';

		hierarchy_Synchronize (obj);

		attach (obj, "change", hierarchy_OnSynchronize);
		attach (primary, "change", hierarchy_changePrimary);
		attach (secondary, "change", hierarchy_changeSecondary);
		
		obj.initialized = true;
	}

	function hierarchy_OnSynchronize (event)
	{
		event = event || window.event;
		var select = event.currentTarget || event.srcElement;

		hierarchy_Synchronize (select);
	}

	function hierarchy_Synchronize (master)
	{
		if ((master.secondary.selectedIndex >= 0) && (master.secondary.options[master.secondary.selectedIndex].value == master.selectedIndex))
			return;

		var op = master.options[master.selectedIndex];
		var parent = op.parentNode || op.parentElement;

		if (parent.tagName == "OPTGROUP")
		{
			master.secondary.style.display = '';

			master.primary.selectedIndex = op.primaryIndex;

			hierarchy_fillSecondary (master, false);
			master.secondary.selectedIndex = op.secondaryIndex;
			
			document.getElementById (master.id.substring (0, master.id.length - 2) + "_i").style.display = 'none';
		}
		else if (parent.tagName == "SELECT")
		{
			master.secondary.style.display = 'none';
			master.primary.selectedIndex = op.primaryIndex;
			if (op.value == "")
				document.getElementById (master.id.substring (0, master.id.length - 2) + "_i").style.display = '';
			else
				document.getElementById (master.id.substring (0, master.id.length - 2) + "_i").style.display = 'none';
		}
	}

	function hierarchy_SelectByValue (sel, val)
	{
		var ops = sel.options;

		if (ops == null)
			return;

		var i;
		for (i = 0; i < ops.length; i++)
			if (ops[i].value == val)
			{
				sel.selectedIndex = i;
				return;
			}
	}

	/* fills secondary dropdown with subitems */
	function hierarchy_fillSecondary (master, setFocus)
	{
		var op = master.options[master.selectedIndex];
		var group = op.parentNode || op.parentElement;
		var ops = (group.children) ? group.children : group.childNodes;
		var opIndex = 0;

		master.secondary.selectedIndex = 0;

		while (master.secondary.options.length > 0) 
			master.secondary.remove (master.secondary.length - 1);

		var base = parseInt (master.primary[master.primary.selectedIndex].value.substring (1));
		for (i = 0; i < ops.length; i++)
			if (ops[i].tagName == "OPTION")
			{
				master.secondary.options[master.secondary.options.length] = new Option (ops[i].text, base + opIndex);
				opIndex++;
			}

		if (setFocus)
		{
			master.secondary.focus ();
			master.primary.focus ();
		}
	}

	/*  */
	function hierarchy_changePrimary (event)
	{
		event = event || window.event;
		var select = event.currentTarget || event.srcElement;
		var val = select.options [select.selectedIndex].value;

		select.master.selectedIndex = val.substring (1);
		document.getElementById (select.master.id.substring (0, select.master.id.length - 2) + "_i").value = "";
		if (val.match (/i[0-9]+/g))
		{
			document.getElementById (select.master.id.substring (0, select.master.id.length - 2) + "_i").style.display = 'none';
			// fill up secondary
			select.secondary.selectedIndex = 0;
			select.secondary.style.display = '';
			hierarchy_fillSecondary (select.master, true);
		}
		else if (val.match (/o[0-9]+/g))
		{
			document.getElementById (select.master.id.substring (0, select.master.id.length - 2) + "_i").style.display = '';
			select.secondary.style.display = 'none';
		}
		else 
		{
			document.getElementById (select.master.id.substring (0, select.master.id.length - 2) + "_i").style.display = 'none';
			select.secondary.style.display = 'none';
		}
	}

	/*  */
	function hierarchy_changeSecondary (event)
	{
		event = event || window.event;

		var select = event.currentTarget || event.srcElement;
		var val = select.options [select.selectedIndex].value;

		select.master.selectedIndex = val;
	}

	function advenacedSelector_Init (id)
	{
		var obj = document.getElementById (id + "_d");
		
		if (!obj || obj.initialized)
			return;
		
		var container = obj.parentNode || obj.parentElement;
		var val = obj.options [obj.selectedIndex].value;
		
		attach (obj, "change", advenacedSelector_OnChange);
		
		document.getElementById (id + "_txt").style.display = "none";
		document.getElementById (id + "_t").style.display = (val == "") ? "" : "none";
		
		
		obj.initialized = true;
	}

	function advenacedSelector_OnChange (event)
	{
		event = event || window.event;

		var select = event.currentTarget || event.srcElement;
		var val = select.options [select.selectedIndex].value;
	
		var txtid = select.id.substring (0, select.id.length - 2) + "_t";

		document.getElementById (txtid).style.display = (val == "") ? "" : "none";
	}

attach (window, "load", hierarchy_InitAll);
