var Tab=new Class({options:{link:'chain',fx:{transition:'sine:out',link:'chain'},inactiveClass:'',activeClass:'',animation:'None'},current:0,queue:[],Implements:[Options,Events],initialize:function(options){this.addEvents({create:function(newPanel,index){this.tabs.each(function(el,val){el[val==index?'removeClass':'addClass'](options.inactiveClass)[val==index?'addClass':'removeClass'](options.activeClass)});this.selected=newPanel;this.current=index}}).setOptions(options);options=this.options;this.container=$(options.container).set('morph',{link:'cancel'});var events=this.events={click:function(e){e.stop();var index=this.tabs.indexOf(e.event.target),forward=this.current<index?index-this.current:this.panels.length-this.current+index,backward=this.current>index?this.current-index:this.current+this.panels.length-index;this.setSelectedIndex(index,Math.abs(forward)<=Math.abs(backward)?1:-1)}.pass(null,this)};this.tabs=$$(options.tabs).each(function(tab){tab.addEvents(events)});this.panels=this.container.getChildren(options.selector);this.anim=new this.plugins[options.animation](this.panels,Object.merge({},options.params,{onResize:this.resize.pass(null,this),onChange:this.change.pass(null,this),onComplete:this.complete.pass(null,this)}),options.fx);var current=options.current||0;this.fireEvent('create',[this.panels[current],current]).
setSelectedIndex(current||0);return this},add:function(panel,tab,index){panel=$(panel);tab=$(tab);if(tab)tab.addEvents(this.events);if(this.panels.indexOf(panel)!=-1)return this;if(index==undefined)index=this.panels.length;index=Math.min(index,this.panels.length);switch(index){case 0:if(this.panels.length>0){this.panels.unshift(panel.inject(this.panels[0],'before'));if(tab)this.tabs.unshift(tab.inject(this.tabs[0],'before'));}
break;default:this.panels.splice(index,0,panel.inject(this.panels[index-1],'after'));if(tab)this.tabs.splice(index,0,tab.inject(this.tabs[index-1],'after'));break;}
if(this.anim.add)this.anim.add(panel);this.current=this.panels.indexOf(this.selected);return this},remove:function(index){var panel=this.panels[index],tab=this.tabs[index];if(this.running||panel==undefined||panel==this.selected)return null;this.panels.splice(index,1);if(this.anim.remove)this.anim.remove(panel);panel.dispose();if(tab){tab.removeEvents(this.events).removeClass(this.options.activeClass).dispose();this.tabs.splice(index,1);}
this.current=this.panels.indexOf(this.selected);return{panel:panel,tab:tab}},next:function(){return this.setSelectedIndex((this.getSelectedIndex()+this.panels.length+1)%this.panels.length,1);},previous:function(){return this.setSelectedIndex((this.getSelectedIndex()+this.panels.length-1)%this.panels.length,-1);},change:function(newPanel,oldPanel,index,oldIndex){var _new=this.tabs[index],_old=this.tabs[oldIndex],options=this.options;if(_old)_old.removeClass(options.activeClass).addClass(options.inactiveClass);if(_new)_new.removeClass(options.inactiveClass).addClass(options.activeClass);this.selected=newPanel;this.current=index;this.fireEvent('change',arguments)},complete:function(){this.running=false;this.fireEvent('complete',[this.selected,this.current]);if(this.queue.length>0){var args=this.queue.pop();this.setSelectedIndex.apply(this,args);}},resize:function(panel){panel=panel||this.selected;var position=panel.style.position;panel.style.position='static';this.container.get('morph').start({height:panel.offsetHeight,width:panel.offsetWidth});panel.style.position=position},getSelectedIndex:function(){return this.current},setSelectedIndex:function(index,direction){if(this.running){switch(this.options.link){case'cancel':if(this.anim.cancel)this.anim.cancel();break;case'chain':this.queue=[arguments];return this;case'ignore':return this;}}
var current=this.current,curPanel=this.panels[current],newPanel=this.panels[index],params=[newPanel,curPanel,index,current,direction];if(this.current==index||this.selected==newPanel||index<0||index>=this.panels.length)return this;this.running=true;this.anim.move.apply(this.anim,params);return this}});Tab.prototype.plugins={None:new Class({Implements:Events,initialize:function(panels,options){this.addEvents(options);panels.each(function(el,index){el.style.display=index==0?'block':'none'})},add:function(el){el.style.display='none';return this},move:function(newPanel,oldPanel){newPanel.style.display='block';if(oldPanel)oldPanel.style.display='none';this.fireEvent('change',arguments).fireEvent('complete');}})};
