

	function TabManager(){
	
	
		// --------------------------------------------------------------------------------------------
		// properties
	
			this.classes =
				{
				tab			: 'tab',
				tabOn		: 'tab-on',
				tabOff		: 'tab-off',
				tabOver		: 'tab-over',
				off			: 'off'
				}
		
			this.tabSets = {}

		
		// --------------------------------------------------------------------------------------------
		// objects
	
			this.tabProps = function(tabs, sections){
				this.tabs				= tabs
				this.sections			= sections
				this.lastTabIndex		= 0
				this.lastSectionIndex	= 0
				}
	
		// --------------------------------------------------------------------------------------------
		// setup
	
			this.setMouseHandlers = function(ref, name, node, index){
				$(node).bind('mouseover',	function(){ref.raiseTab(ref, name, index)})
				$(node).bind('mouseout',	function(){ref.lowerTab(ref, name, index)})
				$(node).bind('click',		function(){ref.clickTab(ref, name, index)})
				}
		

			this.setTabs = function(ref, name, id){
				var element			= $('#' +id)[0]
				var elementTagName	= element.nodeName.toLowerCase()

				var selector		= ''
				if(elementTagName == 'table'){
					selector	= 'td'
					}
				else if(elementTagName == 'ul'){
					selector	= 'li'
					}
				else{
					selector	= '> *'
					}
				selector		= '#' +id+ ' ' + selector

				var nodes		= $(selector)
				for(var i = 0; i < nodes.length; i++){
					var node = nodes[i]
					node.className = ref.classes.tab
					ref.setMouseHandlers(ref, name, node, i)
					}
					
				return nodes
				}
				
			this.setSections = function(ref, id){
				var selector	= '#' +id.toString()+ ' > *'
				var nodes		= $(selector)
				for(var i = 0; i < nodes.length; i++){
					var node		= $(nodes[i])
					var className	= i == 0 ? '' : ref.classes.off
					node.addClass(ref.classes.className)
					}
				return nodes
				}
				
				
			this.newTabSet = function(tabsId, sectionsId, options){
			
				var name						= tabsId.replace(/[^\w]/, '_')
				var index						= options && options.index != undefined ? options.index : 0
				var lockHeight					= options && options.lockHeight != undefined ? options.lockHeight : false

				this.tabSets[name]					= new this.tabProps()
				this.tabSets[name].tabs				= this.setTabs(this, name, tabsId, index)
				this.tabSets[name].sections			= this.setSections(this, sectionsId)

				if(index >= this.tabSets[name].tabs.length){
					index = this.tabSets[name].tabs.length - 1
					}

				this.tabSets[name].lastTabIndex		= index
				this.tabSets[name].lastSectionIndex	= index

				if(lockHeight){
					this.setSameHeight(this, name)
					}

				this.hideAllSections(this, name, index)
				this.clickTab(this, name, index)
				}
			
		
		// --------------------------------------------------------------------------------------------
		// operation
	
			this.raiseTab = function(ref, name, index){
				var tab			= $(ref.tabSets[name].tabs[index])
				tab.addClass(ref.classes.tabOver)
				}
				
			this.lowerTab = function(ref, name, index){
				var tab			= $(ref.tabSets[name].tabs[index])
				tab.removeClass(ref.classes.tabOver)
				}
				
			this.clickTab = function(ref, name, index){
				if(index >= ref.tabSets[name].tabs.length){
					return
					}
				var lastTabIndex			= ref.tabSets[name].lastTabIndex
				var lastTab					= $(ref.tabSets[name].tabs[lastTabIndex])
				var tab						= $(ref.tabSets[name].tabs[index])
	
				lastTab.removeClass(ref.classes.tabOn)
				tab.addClass(ref.classes.tabOn)
				ref.tabSets[name].lastTabIndex	= index
				
				ref.showSection(ref, name, index)
				}
			
			this.showSection = function(ref, name, index){
			
				var lastSectionIndex		= ref.tabSets[name].lastSectionIndex
				var lastSection				= $(ref.tabSets[name].sections[lastSectionIndex])
				var section					= $(ref.tabSets[name].sections[index])
	
				lastSection.addClass(ref.classes.off)
				ref.tabSets[name].lastSectionIndex	= index
				section.removeClass(ref.classes.off)
				}
		
		// --------------------------------------------------------------------------------------------
		// utilities
		
			this.hideAllSections = function(ref, name, index){
				for(var i = ref.tabSets[name].tabs.length - 1; i >= 0 ; i--){
					if(i != index){
						$(ref.tabSets[name].sections[i]).addClass(ref.classes.off)
						}
					}
				}
			
			this.setSameHeight = function(ref, name){
				var height	= 0
				for(var i = ref.tabSets[name].sections.length - 1; i >= 0 ; i--){
					var section = ref.tabSets[name].sections[i]
					if(section.scrollHeight > height){
						height = section.scrollHeight
						}
					}
				for(var i = ref.tabSets[name].sections.length - 1; i >= 0 ; i--){
					var section = ref.tabSets[name].sections[i]
					section.style.height = height + 'px'
					}
				}
	}
	
var tabManager	= new TabManager()
