function $(element)
{
	if (typeof element == 'string') {
		element = document.getElementById(element);
	}
	
	return element;
}

function getElementsByClassName(parentElement, className)
{
	var all_elements = parentElement.getElementsByTagName('*');
	var elements = new Array();
	for (var i = 0; i < all_elements.length; i++) {
		if(elementHasClassName(all_elements[i], className)) {
			elements.push(all_elements[i]);
		}
	}
	return elements;
}

function elementHasClassName(element, className)
{
	var classNames = element.className.split(/\s+/);
	for (var i = 0; i < classNames.length; i++) {
		if (classNames[i] == className) {
			return true;
		}
	}
	return false;
}

function attachListener(element, event_type, event_handler)
{
	if (element.addEventListener) {
		element.addEventListener(event_type, event_handler, false);
	} else if (element.attachEvent) {
		element.attachEvent('on' + event_type, event_handler);
	}
}

function wrapEventHandler(event_handler, self)
{
	return function (e)
	{
		if (window.event) {
			e = {
				target: window.event.srcElement,
				preventDefault: function () { window.event.returnValue = false; }
			}
		}
		
		return event_handler.call(self || this, e);
	}
}

var openSections = {};

attachListener(window, 'load',
	function ()
	{
		var sectionLinkClick, tocs, sections, links;
		var j;
		
		sectionLinkClick = function (e)
		{
			var uls = this.getElementsByTagName('UL');
			
			if (uls.length > 0)
			{
				if (openSections[this]) {
					openSections[this].style.display = '';
				}
				
				if (openSections[this] != uls[0]) {
					uls[0].style.display = 'block';
					openSections[this] = uls[0];
				} else {
					openSections[this] = null;
				}
				
				e.preventDefault();
			}
		}
		
		tocs = getElementsByClassName(document.body, 'expandable-toc');
		
		for (i = 0; i < tocs.length; i++)
		{
			sections = getElementsByClassName(tocs[i], 'section');
			
			for (j = 0; j < sections.length; j++)
			{
				links = sections[j].getElementsByTagName('A');
				if (links.length > 0) {
					attachListener(links[0], 'click', wrapEventHandler(sectionLinkClick, sections[j]));
				}
			}
		}
	}
);

