/* 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 initializeAdvancedEdit ()
{
	var el = document.getElementsByTagName ("DIV");
	var ell = el.length, i;
	for (i = 0; i < ell; i++)
	{
		if (!el[i].className.match ("advedit"))
			continue;

		var container = el[i];
		var label = container.getElementsByTagName ("LABEL")[0];
		var span = label.getElementsByTagName ("SPAN")[0];
		
		if (!span)
			return;
		
		var ta = container.getElementsByTagName ("TEXTAREA")[0];

		attach (ta, "keydown", updateTextCount);
		attach (ta, "keyup", updateTextCount);
		attach (ta, "change", updateTextCount);

		container.maxLength = parseInt (span.innerHTML);
		span.innerHTML = "(" + ta.value.length + " / " + container.maxLength + ") ";

//		var anch = document.createElement ("A");
//		anch.innerHTML = "Edit&nbsp;in&nbsp;new&nbsp;window&nbsp;&raquo;";
//		attach (anch, "click", showEditPopup);

//		label.appendChild (anch);
	}
}

function showEditPopup (event)
{
	event = event || window.event;
	var anch = event.currentTarget || event.srcElement;

	var container = anch.parentElement.parentElement;
	var ta = container.getElementsByTagName ("TEXTAREA")[0];

	var w = window.open (window.location, "_blank", "width=400,height=400,scrollbars=no,menubar=yes,toolbar=no,status=yes,resizable=yes");
	w.document.write ('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>' + document.getElementsByTagName ("HEAD")[0].innerHTML + '<style type="text/css">html, body { height: 100%; margin: 0; padding: 0; text-align: right } textarea { border: solid 0; border-width: 1px 0; display: block; margin: 0; padding: 0; width: 100% }</style><script type="text/javascript">var taid = "' + ta.id +'"; attach (window, "resize", editWindowResizedEvent);</script></head><body><textarea id="value"></textarea><button onclick="editWindowOnSubmit ()">Update &amp; close</button><button onclick="window.close()">Close</button><script type="text/javascript">initializeEditWindow ();</script></body></html>');
	w.focus ();
}

function updateTextCount (event) 
{ 
	event = event || window.event;
	var ta = event.currentTarget || event.srcElement;
	updateTextAreaCount (ta);
}

function updateTextAreaCount (ta) 
{ 
	var container = (ta.parentElement) ? ta.parentElement : ta.parentNode;
	var span = container.getElementsByTagName ("SPAN")[0];

	var len = ta.value.length;
	if (len > container.maxLength)
		ta.value = ta.value.substring (0, container.maxLength);

	span.innerHTML = "(" + ta.value.length + " / " + container.maxLength + ") ";
}

function initializeEditWindow ()
{
	document.getElementById ("value").value = window.opener.document.getElementById (taid).value;
	editWindowResizedEvent ();
}

function editWindowResizedEvent ()
{
	var y = window.innerHeight ? window.innerHeight : document.body.clientHeight;
	document.getElementById ('value').style.pixelHeight = y - 50;
}

function editWindowOnSubmit ()
{
	var ta = document.getElementById ("value");
	window.opener.document.getElementById (taid).value = ta.value; 
	window.opener.updateTextAreaCount (window.opener.document.getElementById (taid));
	window.close ();
}

function advancedSelector_InitAll ()
{
	var sel = document.getElementsByTagName ("SELECT");
	var i;
		
	for (i = 0; i < sel.length; i++)
	{
		if (sel[i].id.match (/_d$/g))
			advancedSelector_Init (sel[i].id.substring (0, sel[i].id.length - 2));
	}
}

function advancedSelector_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", advancedSelector_OnChange);
	
	document.getElementById (id + "_txt").style.display = "none";
	document.getElementById (id + "_t").style.display = (val == "") ? "" : "none";
	
	obj.initialized = true;
}

function advancedSelector_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";
}



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));
			else if (sel[i].id.match (/_sa$/g))
				hierarchyAdvanced_Init (sel[i].id.substring (0, sel[i].id.length - 3));
		}
	}

	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;
			}
		}
		if (document.getElementById (id + "_v")) document.getElementById (id + "_v").style.display = 'none';
		if (document.getElementById (id + "_i")) document.getElementById (id + "_i").style.display = 'none';
		if (document.getElementById (id + "_s")) 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;
			
			if (document.getElementById (master.id.substring (0, master.id.length - 2) + "_i"))
				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 (document.getElementById (master.id.substring (0, master.id.length - 2) + "_i"))
			{
				if (op.value == "" && master.selectedIndex > 0)
					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;

		var input = document.getElementById (select.master.id.substring (0, select.master.id.length - 2) + "_i");

		select.master.selectedIndex = val.substring (1);
		
		if (input) input.value = "";
		if (val.match (/i[0-9]+/g))
		{
			if (input) input.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) && select.selectedIndex > 0)
		{
			if (input) input.style.display = '';
			select.secondary.style.display = 'none';
		}
		else 
		{
			if (input) input.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 hierarchyAdvanced_Init (id)
	{
		var obj = document.getElementById (id + "_sa");
		
		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 + "_pra";
		secondary.id = id + "_sea";

		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;
			}
		}
		if (document.getElementById (id + "_va")) document.getElementById (id + "_va").style.display = 'none';
		if (document.getElementById (id + "_ia")) document.getElementById (id + "_ia").style.display = 'none';
		if (document.getElementById (id + "_sa")) document.getElementById (id + "_sa").style.display = 'none';

		hierarchyAdvanced_Synchronize (obj);

		attach (obj, "change", hierarchyAdvanced_OnSynchronize);
		attach (primary, "change", hierarchyAdvanced_changePrimary);
		attach (secondary, "change", hierarchyAdvanced_changeSecondary);
		
		obj.initialized = true;
	}

	function hierarchyAdvanced_OnSynchronize (event)
	{
		event = event || window.event;
		var select = event.currentTarget || event.srcElement;

		hierarchyAdvanced_Synchronize (select);
	}

	function hierarchyAdvanced_Synchronize (master)
	{
		if ((master.secondary.selectedIndex >= 0) && (master.secondary.options[master.secondary.selectedIndex].value == master.selectedIndex))
			return;

		var input = document.getElementById (master.id.substring (0, master.id.length - 3) + "_ia");

		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;

			hierarchyAdvanced_fillSecondary (master, false);
			master.secondary.selectedIndex = op.secondaryIndex;
			
			if (input)
			{
				if (op.value.match (/-$/))
					input.style.display = '';
				else
					input.style.display = 'none';
			}
		}
		else if (parent.tagName == "SELECT")
		{
			master.secondary.style.display = 'none';
			master.primary.selectedIndex = op.primaryIndex;
			if (input)
			{
				if (op.value == "" && master.selectedIndex > 0)
					input.style.display = '';
				else
					input.style.display = 'none';
			}
		}
	}

	function hierarchyAdvanced_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 hierarchyAdvanced_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 hierarchyAdvanced_changePrimary (event)
	{
		event = event || window.event;
		var select = event.currentTarget || event.srcElement;
		var val = select.options [select.selectedIndex].value;

		var input = document.getElementById (select.master.id.substring (0, select.master.id.length - 3) + "_ia");

		select.master.selectedIndex = val.substring (1);
		
		if (input) input.value = "";
		if (val.match (/i[0-9]+/g))
		{
			if (input) input.style.display = 'none';
			// fill up secondary
			select.secondary.selectedIndex = 0;
			select.secondary.style.display = '';
			hierarchyAdvanced_fillSecondary (select.master, true);
		}
		else if (val.match (/o[0-9]+/g) && select.selectedIndex > 0)
		{
			if (input) input.style.display = '';
			select.secondary.style.display = 'none';
		}
		else 
		{
			if (input) input.style.display = 'none';
			select.secondary.style.display = 'none';
		}
	}

	/*  */
	function hierarchyAdvanced_changeSecondary (event)
	{
		event = event || window.event;

		var select = event.currentTarget || event.srcElement;
		var val = select.options [select.selectedIndex].value;
		var input = document.getElementById (select.master.id.substring (0, select.master.id.length - 3) + "_ia");

		select.master.selectedIndex = val;
		
		if (select.master.options [select.master.selectedIndex].value.match (/-$/))
		{
			if (input) input.style.display = '';
			//select.secondary.style.display = 'none';
		}
		else
		{
			if (input) input.style.display = 'none';
			input.value = "";
		}
		
	}





































	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";
	}

function clickableMenu (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 initializeAll ()
{
	initializeAdvancedEdit ();
	advancedSelector_InitAll ();
	hierarchy_InitAll ();
}



attach (window, "load", initializeAll);
