/* -*- C -*- */

/* --------------------------------------------------------------------
 * Shine: The Become Interactive Client Application Framework
 * @(#) $Id: com.uk.become.shine.tabs.js,v 1.1 2010/10/28 06:18:02 ultrasis\xiongjiping Exp $
 * --------------------------------------------------------------------
 * 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.Tabs = function()
{	
	this.ontabchanged = false;
}
com.uk.become.shine.Tabs.prototype._activatePage = function(page)
{
	var ev;

	if (!page.shineTabGroup.shineTabHide)
	{
		while(page.shineTabGroup.shinePageContainer.firstChild)
		{
			page.shineTabGroup.shinePageContainer.removeChild(page.shineTabGroup.shinePageContainer.firstChild);
		}		
		page.shineTabGroup.shinePageContainer.appendChild(page);
	}

	if(page.shineTab)
	{
		Shine.addElementClass(page.shineTab, 'shine-active-tab');		
	}
	page.shineTabGroup.shineActivePage = page;
	Shine.addElementClass(page, 'shine-active-sheet');
	ev = new Object();
	ev.tabGroup = page.shineTabGroup;
	ev.tabSheet = page;
	if(this.ontabchanged)
	{
		this.ontabchanged(ev);
	}
}
com.uk.become.shine.Tabs.prototype._deactivatePage = function(group)
{
	if(group.shineActivePage)
	{
		Shine.removeElementClass(group.shineActivePage, 'shine-active-sheet');
		if(group.shineActivePage.shineTab)
		{
			Shine.removeElementClass(group.shineActivePage.shineTab, 'shine-active-tab')
		}
		if (!group.shineTabHide)
		{
			group.shinePageContainer.removeChild(group.shineActivePage);
		}
		group.shineActivePage = false;
	}
}
com.uk.become.shine.Tabs.prototype.switchPage = function(page)
{
	var _this = this;
	
	if(page == page.shineTabGroup.shineActivePage)
	{
		return false;
	}
	_this._deactivatePage(page.shineTabGroup);
	_this._activatePage(page);
}
com.uk.become.shine.Tabs.prototype.ontabfocus = function(Shine, sender, event, data)
{
	if(sender.shineSheet && sender.shineTabGroup)
	{
		this.switchPage(sender.shineSheet);
	}
	return true;
}
com.uk.become.shine.Tabs.prototype.ontabclick = function(Shine, sender, event, data)
{
	if(sender.shineSheet && sender.shineTabGroup)
	{
		this.switchPage(sender.shineSheet);
	}
	return false;
}
com.uk.become.shine.Tabs.prototype.addFocusTab = function(group, element, event)
{
	var sheet;
	
	sheet = document.getElementById(element.id + '-sheet');
	if(!sheet)
	{
		Shine.debug('Tabs:', 'Can\'t locate sheet for tab ' + element.id);
		return false;
	}
	element.shineSheet = sheet;
	element.shineTabGroup = group;
	sheet.shineTab = element;
	Shine.addEventHandler(element, event, { host: this, handler: this.ontabfocus });
	return true;
}
com.uk.become.shine.Tabs.prototype.addClickTab = function(group, element, event)
{
	var sheet;
	
	sheet = document.getElementById(element.id + '-sheet');
	if(!sheet)
	{
		Shine.debug('Tabs:', 'Can\'t locate sheet for tab ' + element.id);
		return false;
	}
	element.shineSheet = sheet;
	element.shineTabGroup = group;
	sheet.shineTab = element;
	Shine.addEventHandler(element, event, { host: this, handler: this.ontabclick });
	return true;
}
com.uk.become.shine.Tabs.prototype.initTabGroup = function(element, hideMode)
{
	var containers, tabs, first, c;
	
	element.shineTabHide = hideMode;
	element.shineTabSheets = Shine.getElementsByClass(element, 'div', 'shine-tab-sheet');
	if(element.shineTabSheets.length == 0)
	{
		return false;
	}
	element.shineActivePage = false;
	containers = Shine.getElementsByClass(element, 'div', 'shine-tab-pages');
	if(containers.length == 0)
	{
		containers = Shine.getElementsByClass(element, 'span', 'shine-tab-pages');
	}
	if(containers.length == 0)
	{
		return false;
	}
	element.shinePageContainer = containers[0];
	first = false;
	tabs = Shine.getElementsByClass(element, 'input', 'shine-tab');
	/* You have to loop the tabs first -- before all of the sheets are removed
	 * from the DOM.
     */
	for(c in tabs)
	{
		this.addFocusTab(element, tabs[c], 'focus');
	}
	tabs = Shine.getElementsByClass(element, 'a', 'shine-tab');
	for(c in tabs)
	{
		this.addClickTab(element, tabs[c], 'click');
	}
	tabs = Shine.getElementsByClass(element, 'span', 'shine-tab');
	for(c in tabs)
	{
		this.addClickTab(element, tabs[c], 'click');
	}
	for(c in element.shineTabSheets)
	{
		if(!first)
		{
			first = element.shineTabSheets[c];
		}
		if(!element.shineActiveTab && 
			Shine.hasElementClass(element.shineTabSheets[c], 'active'))
		{
			element.shineActivePage = element.shineTabSheets[c];
		}
		element.shineTabSheets[c].shineTabGroup = element;
		if (!element.shineTabHide)
		{
			element.shineTabSheets[c].parentNode.removeChild(element.shineTabSheets[c]);
		}
	}
	if(!element.shineActivePage)
	{
		element.shineActivePage = first;
	}
	this._activatePage(element.shineActivePage);
	Shine.addElementClass(element, 'shine-tabs-enabled');
}
com.uk.become.shine.Tabs.prototype.ondocumentloaded = function(Shine, sender, ev, data)
{
	var tabgroups, c;

	tabgroups = Shine.getElementsByClass(document, 'div', 'shine-tab-group');
	for(c in tabgroups)
	{	
		this.initTabGroup(tabgroups[c], false);
	}
	tabgroups = Shine.getElementsByClass(document, 'div', 'shine-tab-group-hide');
	for(c in tabgroups)
	{	
		this.initTabGroup(tabgroups[c], true);
	}
	return true;
}
com.uk.become.shine.TabManager = new com.uk.become.shine.Tabs();
Shine.addLoadHandler(com.uk.become.shine.TabManager);

