









































































/**
 * @author Ryan Johnson <ryan@livepipe.net>
 * @copyright 2007 LivePipe LLC
 * @package Control.Tabs
 * @license MIT
 * @url http://livepipe.net/projects/control_tabs/
 * @version 2.0.0
 */

if(typeof(Control) == 'undefined')
	var Control = {};
Control.Tabs = Class.create();
Object.extend(Control.Tabs,{
	instances: [],
	findByTabId: function(id){
		return Control.Tabs.instances.find(function(tab){
			return tab.links.find(function(link){
				return link.key == id;
			});
		});
	}
});
Object.extend(Control.Tabs.prototype,{
	initialize: function(tab_list_container,options){
		
		//console.debug("Control.Tabs.initialize", tab_list_container, options);
		
		this.activeContainer = false;
		this.activeLink = false;
		this.containers = $H({});
		this.links = [];
		this.tabListContainer = $(tab_list_container);
		this.fxFamily = false;
		
		Control.Tabs.instances.push(this);
		if (!$(tab_list_container)) {
			alert("couldn't find list container id '"+tab_list_container+"'");
			return;
		}
		this.options = {
			beforeChange: Prototype.emptyFunction,
			afterChange: Prototype.emptyFunction,
			hover: false,
			linkSelector: 'li a',
			setClassOnContainer: false,
			activeClassName: 'active',
			defaultTab: 'first',
			autoLinkExternal: true,
			targetRegExp: /#(.+)$/,
			appearClassName: 'appear',
			blindClassName: 'blind',
			slideClassName: 'slide',
			defaultFxFamily: false,
		  defaultSelectedTabClass: 'selected'
		};
		
		this.fxFamily = this.options.defaultFxFamily;
		if (this.tabListContainer.hasClassName(this.options.appearClassName)) {
			this.fxFamily = 'appear';
		}
		else if (this.tabListContainer.hasClassName(this.options.blindClassName)) {
			this.fxFamily = 'blind';
		}
		else if (this.tabListContainer.hasClassName(this.options.slideClassName)) {
			this.fxFamily = 'slide';
		}

		Object.extend(this.options,options || {});
		(typeof(this.options.linkSelector == 'string')
			? $(tab_list_container).getElementsBySelector(this.options.linkSelector)
			: this.options.linkSelector($(tab_list_container))
		).findAll(function(link){
			return (/^#/).exec(link.href.replace(window.location.href.split('#')[0],''));
		}).each(function(link){
			this.addTab(link);
		}.bind(this));
		if(this.options.defaultTab == 'first')
			this.setActiveTab(this.links.first());
		else if(this.options.defaultTab == 'last')
			this.setActiveTab(this.links.last());
		else
			this.setActiveTab(this.options.defaultTab);
		
	  $A( this.containers ).each( function( pair ) {
            //console.debug( "tab is selected", pair );
            tab_id        = pair.key;
            tab_container = pair.value;
            if ( tab_container.hasClassName( this.options.defaultSelectedTabClass ) ) {
                //console.debug( "tab is selected.setActiveTab" );
                this.setActiveTab( tab_id );
                tab_container.removeClassName( this.options.defaultSelectedTabClass );
            }
        }.bind( this )
    );
		
		var targets = this.options.targetRegExp.exec(window.location);
		if(targets && targets[1]){
			targets[1].split(',').each(function(target){
				this.links.each(function(target,link){
					if(link.key == target){
						this.setActiveTab(link);
						throw $break;
					}
				}.bind(this,target));
			}.bind(this));
		}
		if(this.options.autoLinkExternal){
			$A(document.getElementsByTagName('a')).each(function(a){
				if(!this.links.include(a)){
					var clean_href = a.href.replace(window.location.href.split('#')[0],'');
					if(clean_href.substring(0,1) == '#'){
						if(this.containers.keys().include(clean_href.substring(1))){
							$(a).observe('click',function(event,clean_href){
								this.setActiveTab(clean_href.substring(1));
							}.bindAsEventListener(this,clean_href));
						}
					}
				}
			}.bind(this));
		}
	},
	addTab: function(link){
		//console.debug("addTab", link);
		this.links.push(link);
		link.key = link.getAttribute('href').replace(window.location.href.split('#')[0],'').split('/').last().replace(/#/,'');
		this.containers.set(link.key, $(link.key));
		link[this.options.hover ? 'onmouseover' : 'onclick'] = function(link){
			if(window.event)
				Event.stop(window.event);
			this.setActiveTab(link);
			return false;
		}.bind(this,link);
	},
	setActiveTab: function(link){
		//console.debug("setActiveTab", link);
		if(!link)
			return;
		if(typeof(link) == 'string'){
			this.links.each(function(_link){
				if(_link.key == link){
					this.setActiveTab(_link);
					throw $break;
				}
			}.bind(this));
		}else{
			this.notify('beforeChange',this.activeContainer);
			
			//console.debug('Effect.Fade: activeContainer', this.activeContainer);
			
			//console.debug("Control.Tabs.setActiveTab", 'containers', this.containers, 'activeContainer', this.activeContainer);
			if (this.activeContainer) {
				//console.debug("Control.Tabs.setActiveTab", "ACTIVE CONTAINER");
				switch (this.fxFamily) {
					case 'blind':
						new Effect.BlindUp(this.activeContainer, { queue: 'start' });
						break;
					case 'appear':
						new Effect.Fade(this.activeContainer, { queue: 'start' });
						break;
					default:
						this.activeContainer.hide();
				}
			}
			else {
				//console.debug("Control.Tabs.setActiveTab", "NO ACTIVE CONTAINER");
				//console.debug("Control.Tabs.setActiveTab", "this.containers", this.containers);
				//console.log(this.containers);
				this.containers.each(function(item){
					//console.debug("Control.Tabs.setActiveTab", "hide");
					if (item[1]) {
						item[1].hide();
					}
					else {
						console.error("Control.Tabs.setActiveTab: NO_ITEMS", this, item);
					}
				});
			}
			
			this.links.each(function(item){
				(this.options.setClassOnContainer ? item.parent: item).removeClassName(this.options.activeClassName);
			}.bind(this));
			link.addClassName(this.options.activeClassName);
			this.activeContainer = this.containers.get(link.key);
			
			//console.debug('Effect.Appear: activeContainer', this.activeContainer);
			
			switch (this.fxFamily) {
				case 'blind':
					new Effect.BlindDown(this.activeContainer, { queue: 'end' });
					break;
				case 'appear':
					new Effect.Appear(this.activeContainer, { queue: 'end' });
					break;
				default:
					if (this.activeContainer) {
						this.activeContainer.show();
					}
					else {
						console.error("Control.Tabs.setActiveTab: NO_ACTIVE_CONTAINER", this);
					}
			}
			
			//this.containers[link.key].show();
			
			this.activeLink = link;
			this.notify('afterChange',this.containers.get(link.key));
		}
	},
	next: function(){
		this.links.each(function(link,i){
			if(this.activeLink == link && this.links[i + 1]){
				this.setActiveTab(this.links[i + 1]);
				throw $break;
			}
		}.bind(this));
		return false;
	},
	previous: function(){
		this.links.each(function(link,i){
			if(this.activeLink == link && this.links[i - 1]){
				this.setActiveTab(this.links[i - 1]);
				throw $break;
			}
		}.bind(this));
		return false;
	},
	first: function(){
		this.setActiveTab(this.links.first());
		return false;
	},
	last: function(){
		this.setActiveTab(this.links.last());
		return false;
	},
	notify: function(event_name){
		try{
			if(this.options[event_name]) {
				return [this.options[event_name].apply(this.options[event_name],$A(arguments).slice(1))];
			}
		}catch(e){
			if(e != $break)
				throw e;
			else
				return false;
		}
	}
});
if(typeof(Object.Event) != 'undefined')
	Object.Event.extend(Control.Tabs);
