/*
Script: plaintabs.js
	PlainTabs provides a simple tabbed interface mechanism that requires only a
	minimal structure and does not require the introduction of superfluous CSS
	classes or identifiers.

License:
	MIT-style license, refer to LICENSE file.
	
Credits:
  James Thompson <james@plainprograms.com> - Implementation & Conceptual Refinements
  Shane Thacker <shane@shanethacker.com> - HTML Structural Concept
*/

/*
Class: PlainTabs

Implements:
  Options
  
Syntax:
  >var plaintabs = new PlainTabs(element, [{options}]);
  
Arguments:
  element - (string) Element acting as wrapper for tab set
  options - (hash, optional) see Options below
  
Options:
  activeTabClass - (string) CSS class to assign to active tabs and panels
  activateOnLoad - (integer) Count of which tab and panel to activate on load 
*/
var PlainTabs = new Class({
  options: {
    //changeTransition: Fx.Transitions.Expo.easeOut,
    //duration:         1000,
    activeTabClass:   'active',
    activateOnLoad:   1
  },
  
  initialize: function(tabarea, options) {
    this.setOptions(options);
    
    this.tabarea = $(tabarea);
    
    this.tabs = this.tabarea.getElement('ul').getElements('li');
    firstPanel = this.tabarea.getElement('div');
    
    this.panels = new Array();
    
    this.panels.merge([firstPanel]);
    
    currentPanel = firstPanel.getNext();
    
    for(var i = 1; i <= this.tabs.length - 1; i++){
      this.panels[i] = currentPanel;
      
      currentPanel = currentPanel.getNext();
    };
    
    this.tabs.each(function(item, index) {
      item.addEvent('click', function() {
        this.activate(index + 1);
      }.bind(this));
    }.bind(this));
    
    if(this.options.activateOnLoad != 'none')
		{
			this.activate(this.options.activateOnLoad, true);	
		}
  },
  
  activate: function(tabNumber, skipAnim) {
    if(! $defined(skipAnim))
		{
			skipAnim = false;
		}
		
		tabIndex = tabNumber - 1;
		
		tab = this.tabs[tabIndex];
		tabPanel = this.panels[tabIndex];
		
		this.deactivate();
	  
	  tab.addClass(this.options.activeTabClass);
	  tabPanel.addClass(this.options.activeTabClass);
  },
  
  deactivate: function() {
    activeTabs = this.tabarea.getElement('ul').getElements('li.' + this.options.activeTabClass);
    
    activeTabs.each(function(item){
      item.removeClass(this.options.activeTabClass);
    }.bind(this));
    
    this.panels.each(function(item){
      if(item.hasClass(this.options.activeTabClass)){
        item.removeClass(this.options.activeTabClass);
      }
    }.bind(this));
  }
});

PlainTabs.implement(new Options);