/* -*- C -*- */

/* --------------------------------------------------------------------
 * Shine: The Become Interactive Client Application Framework
 * @(#) $Id: com.uk.become.shine.expanders.js 10300 2007-02-14 11:59:32Z mo $
 * --------------------------------------------------------------------
 * Copyright (c) 2006 Become Interactive
 * http://www.becomeinteractive.co.uk
 * All rights reserved.
 * --------------------------------------------------------------------
 * This software is the confidential and proprietary information of
 * Become Interactive ("Confidential Information").
 *
 * You shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement you
 * with the terms of the license agreement you entered into with
 * Become Interactive.
 * --------------------------------------------------------------------
 */

/**
 * com.uk.become.shine.Expanders
 *
 * Deal with collapsible blocks of content.
 */
com.uk.become.shine.Expanders = function()
{
}
com.uk.become.shine.Expanders.prototype.addDefinitionHooks = function(nodes)
{
	var c;

	for(c = 0; c < nodes.length; c++)
		{
			this.addDefinitionHook(nodes[c]);
		}
}
com.uk.become.shine.Expanders.prototype._onclick = function(Shine, sender, ev, data)
{
	var c;
	
	for(c = 0; c < sender.shineExpanders.length; c++)
	{
		if(sender.shineCollapsed)
		{
			Shine.removeElementClass(sender.shineExpanders[c], 'shine-collapsed');
		}
		else
		{
			Shine.addElementClass(sender.shineExpanders[c], 'shine-collapsed');
		}
	}
	sender.shineCollapsed = !sender.shineCollapsed;
}
com.uk.become.shine.Expanders.prototype._ontreeclick = function(Shine, sender, ev, data)
{
	if(sender.shineExpansionTarget)
	{
		sender = sender.shineExpansionTarget;
	}
	if(sender.shineCollapsed)
	{
		Shine.removeElementClass(sender, 'shine-collapsed');
		Shine.addElementClass(sender, 'shine-expanded');
	}
	else
	{
		Shine.addElementClass(sender, 'shine-collapsed');
		Shine.removeElementClass(sender, 'shine-expanded');
	}
	sender.shineCollapsed = !sender.shineCollapsed;
}
com.uk.become.shine.Expanders.prototype.addDefinitionHook = function(element)
{
	var c, d, dt;
	
	/* Get all of the dt elements */
	for(c = 0; c < element.childNodes.length; c++)
	{
		if(element.childNodes[c].tagName && element.childNodes[c].tagName.toLowerCase() == 'dt')
		{
			element.childNodes[c].shineExpanders = new Array();
			for(d = c + 1; d < element.childNodes.length; d++)
			{
				if(!element.childNodes[d].tagName || element.childNodes[d].tagName.toLowerCase() != 'dd')
				{
					if(element.childNodes[d].tagName && element.childNodes[d].tagName.toLowerCase() == 'dt')
					{
						break;
					}
					continue;
				}
				element.childNodes[c].shineExpanders[element.childNodes[c].shineExpanders.length] = element.childNodes[d];
				Shine.addElementClass(element.childNodes[d], 'shine-collapsed');
			}
			element.childNodes[c].shineCollapsed = true;
			Shine.addElementClass(element.childNodes[c], 'shine-expander-node');
			Shine.addEventHandler(element.childNodes[c], 'click', { host: this, handler: this._onclick });
		}
	}
}
com.uk.become.shine.Expanders.prototype.addTreeHook = function(element)
{
	var c, node, ind;
	
	for(c = 0; c < element.childNodes.length; c++)
	{
		if(element.childNodes[c].tagName && element.childNodes[c].tagName.toLowerCase() == 'li')
		{
			node = element.childNodes[c];
			if(!Shine.hasElementClass(node, 'branch'))
			{
				continue;
			}
			ind = Shine.createHTMLElement('span');
			ind.shineExpansionTarget = node;
			ind.appendChild(document.createTextNode("\u00A0"));
			Shine.addElementClass(ind, 'shine-indicator');
			Shine.appendFirst(node, ind);
			
			if(!Shine.hasElementClass(node, 'shine-expanded'))
			{
				Shine.addElementClass(node, 'shine-collapsed');
				node.shineCollapsed = true;
			}
			else
			{
				node.shileCollapsed = false;
			}
			Shine.addElementClass(ind, 'shine-expander-node');
			Shine.addEventHandler(ind, 'click', { host: this, handler: this._ontreeclick });
		}
	}
}
com.uk.become.shine.Expanders.prototype.addTreeHooks = function(nodes)
{
	var c;

	for(c = 0; c < nodes.length; c++)
		{
			this.addTreeHook(nodes[c]);
		}
}
com.uk.become.shine.Expanders.prototype.ondocumentloaded = function(Shine, sender, ev, data)
{
	var nodes;
	
	nodes = Shine.getElementsByClass(document, 'dl', 'shine-expander');
	this.addDefinitionHooks(nodes);
	nodes = Shine.getElementsByClass(document, 'ul', 'shine-expand-tree');
	this.addTreeHooks(nodes);
}

Shine.addLoadHandler(new com.uk.become.shine.Expanders());
