var TabStrip = new TabStrip();
AddEventHandler(window,"onload",TabStrip.Init);

function TabStrip()
{
    this.Init = Init; 
    this.Select = Select;

    var TAB_STRIP_CLASS = "Tabs";
    var TAB_STRIP_ELEMENT = "UL";
    var TAB_ELEMENT = "LI";
    var TAB_TRIGGER_CLASS = "TabTrigger";
    var TAB_TRIGGER_ELEMENT = "A";
    
	var TAB_SELECTED_CLASS = "s";
	var TAB_FIRST_SELECTED_CLASS = "fs";
	var TAB_LAST_SELECTED_CLASS = "ls";
	var TAB_POST_SELECTED_CLASS = "ps";
	var HIDDEN_CLASS = "Hidden";
	var FIRST_TAB_CLASS = "t1";
	var LAST_TAB_CLASS = "tl";
	var TAB_CONTENT_ID_PREFIX = "tab-";

    var TabStrips = new Array(); 
    var DHTMLTabs = new Array(); 
    var DHTMLTabContentCollection = new Array(); 
    var DHTMLTabsDefined = false; 

    function Init()
    {
		var tabTriggers = getTriggers();

		for(var i=0;i<tabTriggers.length;i++)
		{
			setTabActions(tabTriggers[i]);
		}
    }    

    function getTriggers()
    {
		var tabTriggerElements = document.getElementsByTagName(TAB_TRIGGER_ELEMENT);
		var tabTriggers = new Array();

		for (var i=0;i<tabTriggerElements.length;i++)
		{
			if (IsMemberOfSpecificClass(tabTriggerElements[i], TAB_TRIGGER_CLASS))
			tabTriggers.push(tabTriggerElements[i]);
		}

		return tabTriggers;       
    }    

    function setTabActions(obj)
    {
		AddEventHandler(obj, "onclick", TabStrip.Select);
    }

    var tabOnclick;
    function SelectDefinedDHTMLTab(id)
    {
		var tab;
		var tabHashIndex; 
		var tabHashID;
		for (var i=0;i<DHTMLTabs.length;i++)
		{
			tab = DHTMLTabs[i];
			tabHashIndex = tab.href.toString().indexOf("#");
			if (tabHashIndex > 0)
			{
				tabHashID = tab.href.toString().substring(tabHashIndex+1);
				if (tabHashID == id)
				{
					if (IsIE)
					{
						tab.fireEvent("onclick", window.event.srcElement);
					} else {
						eval(getMethodContents(tab.onclick));
					} 
					Select(tab);
				} 
			}
		} 
    }

    function getMethodContents(strMethod)
    {
		var contents;
		var bodyIndex = strMethod.toString().indexOf("{"); 
		if (bodyIndex > 0)
		{
			contents = strMethod.toString().substring(bodyIndex+1,strMethod.toString().length-1);
			contents = contents.replace("return false;","");
		}  
		return contents; 
    } 

    function Select(e)
    {
		var selectedTab; //this will be the LI tag of the tab that has been selected
		var eventObj = (GetEventSourceObject(e) != "") ? GetEventSourceObject(e) : e; 

		if (eventObj != undefined)
		{ 
			selectedTab = eventObj.parentNode;
			while(selectedTab.nodeName != TAB_ELEMENT)
			{
				selectedTab = selectedTab.parentNode;
				if(selectedTab.nodeName == "BODY")
				{
					selectedTab = null;
					break;
				} 
			} 

			if(selectedTab != null)
			{   
				var tabStrip = selectedTab.parentNode;
				var tabs = tabStrip.getElementsByTagName(TAB_ELEMENT);

				for(var i=0;i<tabs.length;i++)
				{
					var tabContent = document.getElementById(TAB_CONTENT_ID_PREFIX + tabs[i].id);
					if(tabContent != null)
						tabContent.className = tabContent.className.toString() + " " + HIDDEN_CLASS;
				}

				var selectedContent = document.getElementById(TAB_CONTENT_ID_PREFIX + selectedTab.id);
				if(selectedContent != null)
					RemoveClass(selectedContent, HIDDEN_CLASS);

				var preSelected = getPreviousSibling(selectedTab);
				var postSelected = selectedTab.nextSibling;

				clearTabSelection(tabs);

				selectedTab.className = selectedTab.className.toString() + " " + TAB_SELECTED_CLASS;

				if(selectedTab.className.match(FIRST_TAB_CLASS))
					selectedTab.className = selectedTab.className.toString() + " " + TAB_FIRST_SELECTED_CLASS;

				if(selectedTab.className.match(LAST_TAB_CLASS))
					selectedTab.className = selectedTab.className.toString() + " " + TAB_LAST_SELECTED_CLASS;
				else
					postSelected.className = postSelected.className.toString() + " " + TAB_POST_SELECTED_CLASS;

				if (IsIE) 
					return false;//cancel the href navigate on the anchor
			} 
		}
    }    

    function getPreviousSibling(node)
    {
        //method used instead of WC3 node.previousSibling b/c Mozilla may return a non-complex node
        var previousNode;  
        var parent = removeSimpleNodes(node.parentNode);
        var childNodes = parent.childNodes;
        var currentIndex;
        var previousNodeIndex;
        for (var i=0;i<childNodes.length;i++)
        {
            if (childNodes[i] == node)
                currentIndex = i;
        } 

        previousNodeIndex = (currentIndex != 0) ? currentIndex-1 : childNodes.length;
        previousNode = childNodes[previousNodeIndex];
        return previousNode;
    } 

    function clearTabSelection(tabs)
    {
        for (var i=0;i<tabs.length;i++)
        { 
			var tab = tabs[i];
			RemoveClass(tab, TAB_SELECTED_CLASS);
			RemoveClass(tab, TAB_POST_SELECTED_CLASS);
			RemoveClass(tab, TAB_FIRST_SELECTED_CLASS);
			RemoveClass(tab, TAB_LAST_SELECTED_CLASS);
        } 
    }   
}