var divEl = new Array(null, null, null);
var linkEl = new Array(null, null, null);

function init()
	{
	var div = document.getElementById('level1');
	if (div == null)
		return;
	initDom(div);
	}
function initDom(catEl)
	{
	walk(catEl, function(el)
		{
		if (el.nodeName.toLowerCase() == 'a')
			{
			if (el.className)
				{
				if (el.className.substr(0,3) == 'cat')
					el.onclick = showSubcategories;
				else
					if (el.className == 'tab')
						el.onclick = showMaincategory;
					else
						if (el.className == 'res')
							el.onclick = showResults;
				}
			}
		else
		if (el.nodeName.toLowerCase() == 'div')
			{
			if (el.className == 'show' || el.className == 'hide')
				{
				el.lvl = el.title.substr(1);
				el.title = '';
				if (el.className == 'show')
					{
					divEl[el.lvl] = el;
					linkEl[el.lvl] = el.parentNode.childNodes[0];
					}
				}
			}
		});
	}
function showMaincategory(e)
	{
	removeResults();
	var thisLink = findTarget(e);
	var thisDiv = thisLink.parentNode.parentNode;
	var level = thisDiv.lvl;
	level = level * 1 + 1;
	for (var i = level; i < linkEl.length; i++)
		{
		if (divEl[i] == null)
			break;
		linkEl[i].className = 'cat';
		divEl[i].className = 'hide';
		}
	return false;
	}
function showSubcategories(e)
	{
	removeResults();
	var thisLink = findTarget(e);
	var parentlevel = thisLink.parentNode.parentNode.parentNode.lvl;
	if (parentlevel == null)
		return false;
	var level = parentlevel * 1  + 1;
	for (var i = level; i < linkEl.length; i++)
		{
		if (divEl[i] == null)
			break;
		linkEl[i].className = 'cat';
		divEl[i].className = 'hide';
		}
	var thisDiv = thisLink.parentNode.childNodes[2];
	if (thisDiv == null)
		return false;
	linkEl[level] = thisLink;
	divEl[level] = thisDiv;
	thisLink.className = 'cat active';
	thisDiv.className = 'show';

	var ul = getElementInChildren(thisDiv, 'ul');
	if (ul.childNodes.length < 2)
		{ // need to retrieve subcategories
		ResultItems.ul = ul;
		ResultItems.returnFunction = ResultItems.getSubcategories;
		ResultItems.targetUrl = thisLink.href.replace(/\/[^\/]*\/([^\/]*)\/([^\/]*)$/, '/results/$1/$2');
		ResultItems.doGet();
		initDom(ul);
		}
	return false;
	}
function showResults(e)
	{
	var results = removeResults();
	var thisLink = findTarget(e);
	var parentlevel = thisLink.parentNode.parentNode.parentNode.lvl;
	if (parentlevel == null)
		return false;
	var level = parentlevel * 1  + 1;
	for (var i = level; i < linkEl.length; i++)
		{
		if (divEl[i] == null)
			break;
		linkEl[i].className = 'cat';
		divEl[i].className = 'hide';
		}
	var div = document.createElement('div');
	results.appendChild(div);
	var h2 = document.createElement('h2');
	h2.appendChild(document.createTextNode(thisLink.childNodes[0].nodeValue));
	div.appendChild(h2);
	div.appendChild(document.createElement('div'));
	ResultItems.returnFunction = ResultItems.displayResults;
	ResultItems.targetUrl = thisLink.href.replace(/\/[^\/]*\/([^\/]*)\/([^\/]*)$/, '/results/$1/$2');
	ResultItems.doGet();
	return false;
	}
function removeResults()
	{
	var results = document.getElementById('results');
	if (results != null)
		{
		if (results.firstChild)
			results.removeChild(results.firstChild);
		}
	return results;
	}
function getElementInChildren(el, tag)
	{
	var foundEl;
	for (var i = 0; i < el.childNodes.length; i++)
		{
		foundEl = el.childNodes[i];
		if (foundEl.nodeType == 1 && foundEl.nodeName.toLowerCase() == tag)
			return foundEl;			
		}
	return null;
	}
function findTarget(e)
	{
	var target;
	if (window.event && window.event.srcElement)
		target = window.event.srcElement;
	else
		if (e && e.target)
			target = e.target;
	if ( ! target)
		return null;
	while (target != document.body && target.nodeName.toLowerCase() != 'a')
		target = target.parentNode;
	if (target.nodeName.toLowerCase() != 'a')
		return null;
	return target;
	}
window.onload = function()
	{
	init();
	//ResultItems.init();
	}
function walk(el, processTag)
	{
	processTag(el);
	var childEl;
	for (var i = 0; i < el.childNodes.length; i++)
		{
		childEl = el.childNodes[i];
		if (childEl.nodeType == 1)
			walk(childEl, processTag)
		}
	}
var ResultItems = new function()
{
	this.targetUrl = null;
	this.responseFormat = 'text';
	this.showHand = null;
	this.ajax = new Ajax();
	this.ajax.async = false;
	this.returnFunction = null;
	this.ul = null;

	this.getSubcategories = function(text)
		{
		ResultItems.ul.innerHTML = text;
		}

	this.displayResults = function(text)
		{
		var results = document.getElementById('results');
		if (results)
			{
			var div = results.firstChild;
			if (div)
				{
				div = div.childNodes[1];
				if (div)
					div.innerHTML = text;
				}
			}
		results = null;
		div = null;
		}
	this.doGet = function()
		{
		var self = ResultItems;
		self.ajax.doGet(self.targetUrl, self.returnFunction, self.responseFormat);
		}
}
function Ajax()
{
	this.req = null;
	this.url = null;
	this.method = 'GET';
	this.async = true;
	this.status = null;
	this.statusText = '';
	this.postData = null;
	this.readyState = null;
	this.responseText = null;
	this.responseXMP = null;
	this.handleResp = null;
	this.responseFormat = 'text';  // 'text, 'xml', or 'object'
	this.mimeType = null;

	this.doGet = function(url, hand, format)
		{
		this.url = url;
		this.handleResp = hand;
		this.responseFormat = format || 'text';
		this.doReq();
		}

	this.doReq = function()
		{
		if ( ! this.init())
			{
			alert('Could not create XMLHttpRequest object.');
			return;
			}
		this.req.open(this.method, this.url, this.async);
		var self = this; // fix loss-of-scope in inner function
		if (this.async)
			this.req.onreadystatechange = function()
				{
				if (self.req.readyState == 4)
					{
					self.getResponse();
					}
				};
		this.req.send(this.postData);
		if ( ! this.async)
			this.getResponse();
		};

	this.getResponse = function()
		{
		switch (this.responseFormat)
			{
			case 'text':
				resp = this.req.responseText;
				break;
			case 'xml':
				resp = this.req.responseXML;
				break;
			case 'object':
				resp = this.req;
				break;
			}
		if (this.req.status >= 200 && this.req.status <= 299)
			this.handleResp(resp);
		else
			this.handleErr(resp);
		}
	this.init = function()
		{
		if ( ! this.req)
			{
			try
				{
				// try to craete object for firefox, safari, ie7, etc
				this.req = new XMLHttpRequest();
				} catch (e)
						{
						try
							{
							// try to create object for later versions of ie
							this.req = new ActiveXObject('MSXML2.XMLHTTP');
							} catch (e)
									{
									try
										{
										// try to create object for early versions of ie
										this .req = new ActiveXObject('Microsoft.XMLHTTP');
										} catch (e)
												{
												// could not create an XMLHttpRequest object
												return false;
												}
									}
						}
			}
		return this.req;
		};

	this.handleErr = function()
		{
		var errorWin;
		try
			{
			errorWin = window.open('', 'errorWin');
			errorWin.document.body.innerHTML = this.responseText;
			} catch(e)
					{
					alert ('An error occurred, but the error message cannot be displayed. This is probably because of your browser\'s pop-up blocker.\n'
					     + 'Please allow pop-ups from this web site if you want to see the full error messages.\n\n'
							 + 'Status Code: ' + this.req.status + '\n'
							 + 'Status Description: ' + this.req.statusText);
					}
		};
}
