nfl.ui.tabset	= Class.create({
	/*
	 * Class for easily creating tab sets.
	 * 
	 * @class nfl.ui.tabset
	 * @namespace nfl.ui
	 * @param {Object} tabSetId - id, or reference obj of tabset ul element
	 * @param {Object} options for setting initialization parameters and behaviors.
	 * @author arianna.winters@nfl.com
	 * @requires prototype, nfl.global
	*/
	initialize: function(tabSet,options){
		this.tabs		= {};
		this.options	= (typeof options !== 'undefined')?options:{};
		this.options.keepState			= (typeof this.options.keepstate === 'boolean')?this.options.keepstate:false;
		this.options.defaultIndex		= (typeof this.options.defaultindex !== 'undefined')?this.options.defaultindex:0;
		this.options.removeTabContent	= (typeof this.options.removetabcontent === 'boolean')?this.options.removetabcontent:false;
		this.options.currentTab			= false;
		this.options.tabSet				= tabSet;
		this.options.cssClasses			= {tabs:{active:'active'}};
		this.options.tabonly			= (typeof this.options.tabonly === 'boolean')?this.options.tabonly:false;
		this.options.tabStyles			= {tabs:{active:{'cursor':'default'},inactive:{'cursor':'pointer'}}};
		this.options.replaceTabContent	= (typeof this.options.replaceTabContent !== 'undefined')?this.options.replaceTabContent:false;
		/* attempt to activate */
		this.activate();
		document.observe('window:hashchange',this.onHashChange.bind(this));
	},
	activate: function(){
		if(!$(this.options.tabSet)){
			/* 
			 * if tabset ele does not exist yet, poll for
			 * it until document has been fully loaded
			 */
			console.log('nfl.ui.tabset.activate: cannot find ('+this.options.tabSet+'). try again in 500 milliseconds.');
			if(!document.loaded){setTimeout(this.activate.bind(this),200);}
			return false;
		}
		this.tabList	= $(this.options.tabSet);
		
		var hashTarget		= this.getTargetFromHash(window.location.hashparams.get());
		var defaultTarget	= false;
		//console.log('ui.tabset; default index '+this.options.defaultIndex);
		this.tabList.select('li a').each(function(ele,index){
			/* collect each tablist li a element, wire up parent li and remove .
			 * we do this because it's just easier that way, trust me.
			 */
			//console.info('nfl.ui.tabset.activate: iterating on item #'+index+'');
			var li		= ele.up('li'); 
			if(!li.id){ li.writeAttribute('id',(this.tabList.identify()+'-tab-'+index));}
			var target	= (ele.getAttribute('href'));
			target		= target.substring((target.indexOf('#')+1));
			this.tabs[target]	= {tab:li,element:$(target)};
			li.setAttribute('target',target);
			if(this.options.removeTabContent){
				if(this.options.replaceTabContent){li.update(this.options.replaceTabContent);}else{li.update();}
			}else{li.update(ele.innerHTML);}
			li.setStyle(this.options.tabStyles.tabs.inactive);
			
			if(hashTarget && hashTarget === target){this.options.defaultIndex = index;}
			if(this.options.defaultIndex === index){ defaultTarget	= target; /* this is the default tab, set it to active */ }
		}.bind(this));
		if (defaultTarget) { this.activateTab(defaultTarget);}
		this.tabList.observe('click',this.onTabClick.bind(this));
	},
	onTabClick: function(event){
		var ele			= Event.element(event);
		var parentList	= ele.up('ol');
		var li			= null;
		if(parentList){
			if(parentList.identify() == this.tabList.identify()){
				li	= (ele.tagName != 'LI')?(ele.up('li')):ele; /* grab this elements parent li first */
			}
		}
		if(li && !(li.hasClassName(this.options.cssClasses.tabs.active)) && li.readAttribute('target')){
			var target	= li.readAttribute('target');
			if($(target) || this.options.tabonly){
				if (this.options.keepState) {
					/* call activateTab */
					this.activateTab(target);
					document.fire((this.tabList.identify()+':tabclicked'),target);
					/* update hash params */
					var hashParams = (window.location.hashparams.get() !== null) ? (window.location.hashparams.get()) : (new Hash());
					hashParams.set(this.tabList.identify(), target);
					window.location.hashparams.set(hashParams);
				}else{
					if(!this.options.tabonly){this.activateTab(target);};
					document.fire((this.tabList.identify()+':tabclicked'),target);
				}
				Event.stop(event)
			}
		}
	},
	activateTab: function(target){
		if(($(target) || this.options.tabonly) && target !== this.options.currentTab){
			console.log('nfl.ui.tabset.activateTab: activating "'+ target +'"');
			this.options.currentTab	= target;
			/* element exists, update tabset with classes */
			this.tabList.select('li.'+this.options.cssClasses.tabs.active).each(function(ele){ele.removeClassName(this.options.cssClasses.tabs.active); ele.setStyle(this.options.tabStyles.tabs.inactive);}.bind(this));
			this.tabs[target].tab.addClassName(this.options.cssClasses.tabs.active);
			this.tabs[target].tab.setStyle(this.options.tabStyles.tabs.active);
			document.fire((this.tabList.identify()+':tabchange'),target);
			if(!this.options.tabonly){
				for(tabkey in this.tabs){
					var tab	= this.tabs[tabkey];
					if(tab.element.identify() === target){tab.element.show();}else{tab.element.hide();}
				}
			}
			document.fire((this.tabList.identify()+':tabchanged'),target);
		}
	},
	onHashChange: function(event){
		/* check for this tablist's id in the hashparams */
		var target	= event.memo[this.tabList.identify()];
		if(target){
			/* has an active hash parameter belonging to this tabset */
			console.log('nfl.ui.tabset.onHashChange: active hash parameter found. ('+ target +')');
			this.activateTab(target);
		}
	},
	getTargetFromHash: function(hash){
		if(hash && hash.get(this.tabList.identify())){
			/* has an active hash parameter belonging to this tabset */
			return hash.get(this.tabList.identify())
		}
		return false
	}
});