/*
tabs[index]
	[0] = id
	[1] = text
	[2] = navigateUrl
	[3] = clientScript
*/

function Telligent_TabSet (varName, containerId, stateId, cssClass, tabCssClasses, tabSelectedCssClasses, tabHoverCssClasses, onTabSetResizeFunction, enableResizing, tabs)
{
	this._variableName = varName;
	this._container = document.getElementById(containerId);
	this._state = document.getElementById(stateId);
	this.CssClass = cssClass;
	this.TabCssClasses = tabCssClasses;
	this.TabSelectedCssClasses = tabSelectedCssClasses;
	this.TabHoverCssClasses = tabHoverCssClasses;
	this.OnTabSetResizeFunction = onTabSetResizeFunction;
	this._selectedTab = null;
	this._selectedTabRow = null;
	this._tabs = new Array();
	this._tabRows = new Array();
	this._resizeCheckHandle = null;
	this._isRendered = false;
	this.EnableResizing = enableResizing;
	this._originalWindowOnUnload = null;
	
	if (window.onunload)
		this._originalWindowOnUnload = window.onunload;
	
	window.onunload = new Function(this._variableName + '._windowOnUnload();');
	
	this.ParseTabs(tabs, this._getStateValue('selected'));
	
	if (this._tabs.length > 0)
		this.Refresh();
}

Telligent_TabSet.prototype._setStateValue = function(key, value)
{
	if (!this._state)
		return;
	
	var newValue = '';
	var values = this._state.value.split(/\?/);
	var found = false;
	for (var i = 0; i < values.length; i++)
	{
		if (newValue != '')
			newValue += '?';
		
		var keyValue = values[i].split(/\:/, 2);
		if (keyValue.length == 2 && keyValue[0] == key)
		{
			newValue += key + ':' + value;
			found = true;
		}
		else
			newValue += values[i];
	}
	
	if (!found)
	{
		if (newValue != '')
			newValue += '?';
		
		newValue += key + ':' + value;
	}
	
	this._state.value = newValue;
}

Telligent_TabSet.prototype._getStateValue = function(key)
{
	if (this._state && this._state.value)
	{
		var values = this._state.value.split(/\?/);
		for (var i = 0; i < values.length; i++)
		{
			var keyValue = values[i].split(/\:/, 2);
			if (keyValue.length == 2 && keyValue[0] == key)
				return keyValue[1];
		}
	}

	return '';
}

Telligent_TabSet.prototype._windowOnUnload = function()
{
	this.Dispose();
	
	if (this._originalWindowOnUnload)
		this._originalWindowOnUnload();	
}

Telligent_TabSet.prototype.Dispose = function()
{
	this._disposeNodes();
	this._container = null;
	this._state = null;
}

Telligent_TabSet.prototype._disposeNodes = function()
{
	for (var i = 0; i < this._tabRows.length; i++)
	{
		if (this._tabRows[i] && this._tabRows[i]._element)
		{
			if (this._tabRows[i]._element.childNodes[0] && this._tabRows[i]._element.childNodes[0].childNodes[0])
			{
				var tr = this._tabRows[i]._element.childNodes[0].childNodes[0];
				for (var j = 0; j < tr.childNodes.length; j++)
				{
					if (tr.childNodes[j] && tr.childNodes[j]._tab)
					{
						tr.childNodes[j]._tab._element = null;
						tr.childNodes[j]._tab = null;
						tr.childNodes[j].onclick = null;
						tr.childNodes[j].onmouseover = null;
						tr.childNodes[j].onmouseout = null;
					}
				}
			}
			
			this._tabRows[i]._element = null;
		}
	}
}

Telligent_TabSet.prototype._setCssClasses = function(element, classes)
{
	if (typeof(classes) == 'object')
	{
		var i = 0;
		while (element && i < classes.length)
		{
			element.className = classes[i];
			i++;
			element = element.childNodes[0];
		}
	}
	else if (element)
		element.className = classes;
}

Telligent_TabSet.prototype._tabMouseOver = function(tab)
{
	if (tab != this._selectedTab)
		this._setCssClasses(tab._element.childNodes[0], this.TabHoverCssClasses);
				
	return false;
}

Telligent_TabSet.prototype._tabMouseOut = function(tab)
{
	if (tab != this._selectedTab)
		this._setCssClasses(tab._element.childNodes[0], this.TabCssClasses);
		
	return false;
}

Telligent_TabSet.prototype._tabClick = function(tab)
{
	// execute the client script, if defined
	if (tab.ClientScript)
	{
		hadHandler = true;
		if ((tab.ClientScript(this, tab)) == false)
			return false;
	}
	
	// mark the tab as selected
	if (tab != this._selectedTab)
	{
		if (this._selectedTab)
			this._setCssClasses(this._selectedTab._element.childNodes[0], this.TabCssClasses);
			
		this._selectedTab = tab;
		this._setCssClasses(tab._element.childNodes[0], this.TabSelectedCssClasses);

		if (this._tabRows.length > 1)
		{		
			var found;
			this._selectedTabRow = null;
			for (var i = 0; i < this._tabRows.length; i++)
			{	
				found = false;
				for (var j = 0; j < this._tabRows[i]._tabs.length; j++)
				{
					if (this._tabRows[i]._tabs[j] == this._selectedTab)
					{
						this._selectedTabRow = this._tabRows[i];
						break;
					}
				}
				
				if (this._selectedTabRow)
					break;
			}
			
			if (this._selectedTabRow)
			{
				this._container.childNodes[0].removeChild(this._selectedTabRow._element);
				this._container.childNodes[0].appendChild(this._selectedTabRow._element);
			}
		}
		else
			this._selectedTabRow = this._tabRows[0];
		
		this._setStateValue('selected', this._selectedTab.ID);
	}
		
	// navigate to the navigate url, if defined
	if (tab.NavigateUrl)
		window.location = tab.NavigateUrl;
	
	return false;
}

Telligent_TabSet.prototype.Refresh = function()
{
	this._isRendered = false;
	
	this._disposeNodes();

	hiddenContainer = document.createElement('div');
	hiddenContainer.style.visibility = 'hidden';
	hiddenContainer.style.position = 'absolute';
	
	this._container.appendChild(hiddenContainer);
	
	while (hiddenContainer.childNodes.length > 0)
		hiddenContainer.removeChild(hiddenContainer.childNodes[0]);	
	
	var table = document.createElement('table');
	table.cellPadding = '0';
	table.border = '0';
	table.cellSpacing = '0';
	table.appendChild(document.createElement('tbody'));
	table.childNodes[0].appendChild(document.createElement('tr'));
	hiddenContainer.appendChild(table);
	
	var elementDepth = 1;
	if (typeof(this.TabHoverCssClasses) == "object" && this.TabHoverCssClasses.length > elementDepth)
		elementDepth = this.TabHoverCssClasses.length;
	
	if (typeof(this.TabSelectedCssClasses) == "object" && this.TabSelectedCssClasses.length > elementDepth)
		elementDepth = this.TabSelectedCssClasses.length;
	
	if (typeof(this.TabCssClasses) == "object" && this.TabCssClasses.length > elementDepth)
		elementDepth = this.TabCssClasses.length;			
	
	var totalWidth = 0;
	var maxWidth = 0;
	for(var i = 0; i < this._tabs.length; i++)
	{
		var cell = document.createElement('td');
		
		// create child elements (to receive style classes)
		var element = cell;
		for (var j = 0; j < elementDepth; j++)
		{
			element.appendChild(document.createElement('div'));
			element = element.childNodes[0];
		}	
		element.innerHTML = this._tabs[i].Text;
		
		// place tab into hidden container
		table.childNodes[0].childNodes[0].appendChild(cell);
		cell._tab = this._tabs[i];
		this._tabs[i]._element = cell;

		// determine the maximum width
		this._setCssClasses(cell.childNodes[0], this.TabHoverCssClasses);
		cell._tab._maxWidth = cell.offsetWidth;
			
		this._setCssClasses(cell.childNodes[0], this.TabSelectedCssClasses);
		if (cell._tab._maxWidth < cell.offsetWidth)
			cell._tab._maxWidth = cell.offsetWidth;

		this._setCssClasses(cell.childNodes[0], this.TabCssClasses);
		if (cell._tab._maxWidth < cell.offsetWidth)
			cell._tab._maxWidth = cell.offsetWidth;
			
		totalWidth += cell._tab._maxWidth;
		if (cell._tab._maxWidth > maxWidth)
			maxWidth = cell._tab._maxWidth;
	}
	
	var numRows = Math.ceil((((totalWidth * 3) / this._container.offsetWidth) + ((maxWidth * this._tabs.length) / this._container.offsetWidth)) / 4);
	var maxTabsPerRow = Math.ceil(this._tabs.length / numRows);
	if (maxTabsPerRow < 1)
		maxTabsPerRow = 1;
	
	while (this._container.childNodes.length > 0)
		this._container.removeChild(this._container.childNodes[0]);
		
	this._container.className = this.CssClass;
	
	var container = document.createElement('div');
	
	if (this.EnableResizing)
	{
		container.style.width = '100%';
		container.style.overflow = 'hidden';
	}
	
	this._container.appendChild(container);
	
	this._tabRows = new Array();	
	
	var selectedTab = this._selectedTab;
	this._selectedTabRow = null;
	this._selectedTab = null;
	
	var j = -1;
	for (var i = 0; i < this._tabs.length; i++)
	{
		if (j == -1 || (this.EnableResizing && (this._tabRows[j]._tabs.length == maxTabsPerRow || (this._tabRows[j]._element.offsetWidth + this._tabs[i]._maxWidth > container.offsetWidth && this._tabRows[j]._tabs.length > 0))))
		{
			var table = document.createElement('table');
			table.cellPadding = '0';
			table.border = '0';
			table.cellSpacing = '0';
			table.appendChild(document.createElement('tbody'));
			table.childNodes[0].appendChild(document.createElement('tr'));
			container.appendChild(table);
			
			j++;
			this._tabRows[j] = new Telligent_TabSetRow(table);
		}
		
		this._tabRows[j]._element.childNodes[0].childNodes[0].appendChild(this._tabs[i]._element);
		this._tabRows[j]._tabs[this._tabRows[j]._tabs.length] = this._tabs[i];
	
		this._tabs[i]._tabRow = this._tabRows[j];
		this._tabs[i]._element.onclick = new Function('return ' + this._variableName + '._tabClick(this._tab, ' + j + ');');
		this._tabs[i]._element.onmouseover = new Function('return ' + this._variableName + '._tabMouseOver(this._tab, ' + j + ');');;
		this._tabs[i]._element.onmouseout = new Function('return ' + this._variableName + '._tabMouseOut(this._tab, ' + j + ');');;
		
		if (this._tabs[i] == selectedTab)
		{
			this._selectedTab = this._tabs[i];
			this._selectedTabRow = this._tabRows[j];
			this._setCssClasses(this._tabs[i]._element.childNodes[0], this.TabSelectedCssClasses);
		}
	}
	
	if (this._tabRows.length > 1)
	{
		for (var i = 0; i < this._tabRows.length; i++)
		{
			this._tabRows[i]._element.style.width = '100%';
		}
		
		if (this._selectedTabRow)
		{
			container.removeChild(this._selectedTabRow._element);
			container.appendChild(this._selectedTabRow._element);
		}
	}
	
	if (this._selectedTab)
		this._setStateValue('selected', this._selectedTab.ID);
	else
		this._setStateValue('selected', '');
	
	this._isRendered = true;
	
	if (this._tabs.length > 0)
	{
		if (this._resizeCheckHandle)
			window.clearTimeout(this._resizeCheckHandle);
		
		this._resizeCheckHandle = window.setTimeout(new Function(this._variableName + '._resizeCheck();'), 49);
	}
}

Telligent_TabSet.prototype.ParseTabs = function(tabs, selectedTabId)
{
	if (typeof(selectedTabId) == 'undefined' && this._selectedTab)
		selectedTabId = this._selectedTab.ID;

	this._tabs = new Array();
	if (!tabs || tabs.length == 0)
		return;
		
	for (var i = 0; i < tabs.length; i++)
	{
		this._tabs[i] = new Telligent_TabSetTab(tabs[i][0], tabs[i][1]);
		this._tabs[i].NavigateUrl = tabs[i][2];
		this._tabs[i].ClientScript = tabs[i][3];
		this._tabs[i]._tabSet = this;
		if (this._tabs[i].ID == selectedTabId)
			this._selectedTab = this._tabs[i];
	}
}

Telligent_TabSet.prototype._resizeCheck = function()
{
	if (this._resizeCheckHandle)
		window.clearTimeout(this._resizeCheckHandle);

	if (this.EnableResizing && this._isRendered && this._container.offsetWidth != this._previousContainerOffsetWidth)
	{
		this.Refresh();
		this._previousContainerOffsetWidth = this._container.offsetWidth;
		
		if (this.OnTabSetResizeFunction)
			this.OnTabSetResizeFunction(this);
	}
	
	this._resizeCheckHandle = window.setTimeout(new Function(this._variableName + '._resizeCheck();'), 999);
}

Telligent_TabSet.prototype.AddTab = function(tab)
{
	this.RemoveTab(tab);
	if (tab)
	{
		tab._tabSet = this;
		this._tabs[this._tabs.length] = tab;
	}
}

Telligent_TabSet.prototype.RemoveTab = function(tab)
{
	var tabs = new Array();
	var found = false;
	for (var i = 0; i < this._tabs.length; i++)
	{
		if (this._tabs[i] == tab)
			found = true;
		else
			tabs[tabs.length] = this._tabs[i];
	}
	
	if (found)
		this._tabs = tabs;
}

Telligent_TabSet.prototype.ClearTabs = function()
{
	this._tabs = new Array();
}

Telligent_TabSet.prototype.InsertTab = function(tab, index)
{
	this.RemoveTab(tab);
	
	var tabs = new Array();
	var inserted = false;
	for (var i = 0; i < this._tabs.length; i++)
	{
		if (i == index)
		{
			inserted = true;
			tab._tabSet = this;
			tabs[tabs.length] = tab;
		}
		
		tabs[tabs.length] = this._tabs[i];
	}
	
	if (!inserted)
		tabs[tabs.length] = tab;
	
	this._tabs = tabs;
}

Telligent_TabSet.prototype.GetTabById = function(id)
{
	for (var i = 0; i < this._tabs.length; i++)
	{
		if (this._tabs[i].ID == id)
			return this._tabs[i];
	}
	
	return null;
}

Telligent_TabSet.prototype.GetTabsByText = function(text)
{
	var tabs = new Array();
	
	for (var i = 0; i < this._tabs.length; i++)
	{
		if (this._tabs[i].Text == text)
			tabs[tabs.length] = this._tabs[i];
	}
	
	return tabs;
}

Telligent_TabSet.prototype.GetTabAtIndex = function(index)
{
	if (index >= 0 && index < this._tabs.length)
		return this._tabs[index];
	else
		return null;
}

Telligent_TabSet.prototype.GetTabCount = function()
{
	return this._tabs.length;
}

Telligent_TabSet.prototype.SelectTab = function (tab)
{
	if (tab && tab._tabSet == this)
		this._tabClick(tab);
}

Telligent_TabSet.prototype.GetSelectedTab = function()
{
	return this._selectedTab;
}

function Telligent_TabSetTab (id, text)
{
	this.ID = id;
	this.Text = text;
	this.NavigateUrl = null;
	this.ClientScript = null;
	this._maxWidth = 0;
	this._element = null;
	this._tabSet = null;
	this._tabSetRow = null;
}

Telligent_TabSetTab.prototype.GetTabSet = function()
{
	return this._tabSet;
}

function Telligent_TabSetRow(element)
{
	this._element = element;
	this._tabs = new Array();
	this._tabSet = null;
}