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

if(typeof(Control) == 'undefined')
	var Control = {};
Control.Tabs = Class.create(  {
  	initialize: function(tab_list_container,options){
  		this.activeContainer = false;
  		this.activeLink = false;
  		this.containers = $H({});
  		this.links = [];
  		Control.Tabs.instances.push(this);
  		this.options = {
  			beforeChange: Prototype.emptyFunction,
  			afterChange: Prototype.emptyFunction,
  			hover: false,
  			linkSelector: 'li a',
  			setClassOnContainer: false,
  			activeClassName: 'active',
  			defaultTab: 'first',
  			autoLinkExternal: true,
  			targetRegExp: /#(.+)$/,
  			showFunction: Element.show,
  			hideFunction: Element.hide
  		};
  		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));
  		this.containers.values().each(this.options.hideFunction);
  		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);
  		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){
  		this.links.push(link);
  		link.key = link.getAttribute('href').replace(window.location.href.split('#')[0],'').split('/').last().replace(/#/,'');
  		this.containers[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){
  		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);
  			if(this.activeContainer)
  				this.options.hideFunction(this.activeContainer);
  			this.links.each(function(item){
  				(this.options.setClassOnContainer ? $(item.parentNode) : item).removeClassName(this.options.activeClassName);
  			}.bind(this));
  			(this.options.setClassOnContainer ? $(link.parentNode) : link).addClassName(this.options.activeClassName);
  			this.activeContainer = this.containers[link.key];
  			this.activeLink = link;
  			this.options.showFunction(this.containers[link.key]);
  			this.notify('afterChange',this.containers[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;
  		}
  	}
});
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;
			});
		});
	}
});

if(typeof(Object.Event) != 'undefined')
	Object.Event.extend(Control.Tabs);