function $(elem_id)
{
	return document.getElementById(elem_id);
}

/* .... TYPIC OBJECT ... */

var Typic = new Object();

Typic.getElementsByClassName = function(className)
{
	var children = document.getElementsByTagName('*');
	var elements = new Array();
	for (var i = 0; i < children.length; i++)
	{
		if (Typic.hasClassName(children[i], className))
			elements.push(children[i]);
	}
	return elements;
}

Typic.elementExistsInStringList = function(element, stringList, separator)
{
	// separator might need regexp escaping first...
	return stringList.match(new RegExp("(^|"+separator+")" + element + "("+separator+"|$)", "i"));
}
Typic.hasClassName = function(elem, className)
{
	return elem.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)", "i"));
}
Typic.addClassName = function(elem, className)
{
	elem.className = elem.className + " " + className;
}
Typic.removeClassName = function(elem, className)
{
	elem.className = elem.className.replace(new RegExp("(^|\\s)(" + className + ")(\\s|$)", "gi"), "$1$3");
}
Typic.toggleClassName = function(elem, className)
{
	if (Typic.hasClassName(elem, className))
		Typic.removeClassName(elem, className);
	else
		Typic.addClassName(elem, className);
}

Typic.addMethods = function(elem)
{
	elem.addClassName = function()
	{
		Typic.addClassName(this, arguments[0]);
	}
	elem.removeClassName = function()
	{
		Typic.removeClassName(this, arguments[0]);
	}
	elem.hasClassName = function()
	{
		return Typic.hasClassName(this, arguments[0]);
	}
}

Typic.mouseover_init = function(elem_id)
{
	if (typeof(elem_id) == "object")
	{
		Typic.mouseover_init_element(elem_id);
		return;
	}
	var li = Typic.getElementsByClassName("typic_mouseover", elem_id);
	for (var i = 0; i < li.length; i++)
	{
		var elem = li[i];
		elem.setAttribute("onmouseover", "Typic.addClassName(this, 'mouseover')");
		elem.setAttribute("onmouseout", "Typic.removeClassName(this, 'mouseover')");
		Typic.removeClassName(elem, "typic_mouseover");
	}
	
	var li = Typic.getElementsByClassName("typic_click");
	for (var i = 0; i < li.length; i++)
	{
		var elem = li[i];
		var att_old = elem.getAttribute("onclick");
		var att_new = "Typic.toggleClassName(this, 'click'); Typic.removeClassName(this, 'mouseover')";
		if (att_old != "")
			att_new = att_old + "; " + att_new;
		elem.setAttribute("onclick", att_new);
		Typic.removeClassName(elem, "typic_click");
	}
}

Typic.mouseover_init_element = function(elem)
{
/*	if(!/MSIE (5|6)/.test(navigator.userAgent)) 
	// No need to add mouseover events. Browser probably already understands :hover
	{
		elem.onmouseover = null;
		return;
	}
*/
	elem.onmouseover = function() {Typic.addClassName(this, 'mouseover');}
	elem.onmouseout = function() {Typic.removeClassName(this, 'mouseover');}
	elem.onmouseover();
}


function typic_expand(elem)
{
	y = $(elem + ":collapsed");
	x = $(elem + ":expanded");
	if (!x)
		x = $(elem);
	
	x.style.visibility = "hidden";
	x.style.position = "absolute";
	x.style.display = "";
	max = x.clientHeight;
	
	x.style.overflow = "hidden";
	x.style.height = "20px";
	x.style.position = "relative";
	x.style.visibility = "visible";
	
	if (y)
		y.style.display = "none";
	
	typic_smooth_expand(elem, 20, max);
}

function typic_collapse(elem)
{
	x = document.getElementById(elem + ":expanded");
	x.style.display = "none";
	x = document.getElementById(elem + ":collapsed");
	x.style.display = "";
}

function typic_smooth_expand(elem, h, max)
{
	h = parseInt(h);
	max = parseInt(max);
	var x = $(elem + ":expanded");
	if (!x)
		x = $(elem);
	x.style.height = h + "px";
	//x.style.opacity = h / max;
	//x.style.filter = "alpha(opacity=" + (h / max) * 100 + ")";
	if (h == max)
		return;
	h = h + 1 + (max - h) / 10;
	if (h > max)
		h = max;
	setTimeout("typic_smooth_expand('" + elem + "', " + h + ", " + max + ")", 20);
}
