/* -*- C -*- */

/* --------------------------------------------------------------------
 * Shine: The Become Interactive Client Application Framework
 * @(#) $Id$
 * --------------------------------------------------------------------
 * 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.
 */
if(typeof com == "undefined") var com = new Object();
if(typeof com.uk == "undefined") com.uk = new Object();
if(typeof com.uk.become == "undefined") com.uk.become = new Object();
if(typeof com.uk.become.shine == "undefined") com.uk.become.shine = new Object();

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.addDivHooks = function(nodes)
{
	var c;

	for(c = 0; c < nodes.length; c++)
		{
			this.addDivHook(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.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.addDivHook = function(element)
{
	var c, d, dt, h;
	
	for(c = 0; c < element.childNodes.length; c++)
	{
		if(element.childNodes[c].tagName)
		{
			h = element.childNodes[c].tagName.toLowerCase();
		}
		else
		{
			h = null;
		}
		if(h && (h == 'h1' || h == 'h2' || h == 'h3' || h == 'h4' || h == 'h5'))
		{
			element.childNodes[c].shineExpanders = new Array();
			for(d = c + 1; d < element.childNodes.length; d++)
			{
				if(element.childNodes[d].tagName)
				{
					h = element.childNodes[d].tagName.toLowerCase();
				}
				else
				{
					h = null;
				}
				if(h && h != 'div')
				{
					break;
				}
				if(!h)
				{
					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.ondocumentloaded = function(Shine, sender, ev, data)
{
	var nodes;
	
	nodes = Shine.getElementsByClass(document, 'dl', 'shine-expander');
	this.addDefinitionHooks(nodes);
	nodes = Shine.getElementsByClass(document, 'div', 'shine-expander');
	this.addDivHooks(nodes);
}

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

