var Tab = Class.create(
{
	initialize: function(options)
	{
	
		this.tab = $(options.id);
		if (!this.tab)
		{
			throw ("Attempted to initalize tab with undefined element: " + options.id);
		}
		
		var styles = 
		{
			'display': 'none',
			'opacity': 0
		};

		this.toggleClass = "tabs";
		this.activeClass = "active";
		this.contentClass = "tabbed-content";
		
		this.current = 0;
		this.tabs = this.tab.select("." + this.toggleClass + " li");
		this.contents = this.tab.select('.' + this.contentClass);
		this.isAnimating = false;

		// setup event listeners and determine current
		options.event = options.event || 'click';
		
		this.tabs.each(function(e,i)
		{
			if(e.hasClassName(this.activeClass))
			{
				this.current = i;
			}
			e.observe(options.event,this.toggle.bindAsEventListener(this,i));
		}.bind(this));

		this.tabs[this.current].addClassName(this.activeClass);

		// initialize display
		this.contents.each(function(section,i)
		{
			if(this.current != i)
			{
				section.setStyle(styles);
			}
		}.bind(this));
	},
	
	toggle: function(e,i)
	{
	    if (i < this.contents.length)
	    {
		    if(this.isAnimating || this.current == i)
		    {
			    return false;
		    }

		    e.stop();

		    // hide old, reset new, toggle class names
		    this.tabs[i].addClassName(this.activeClass);
    		
		    this.contents[this.current].setStyle
		    (
			    {
				    'display': 'none',
				    'opacity': 0
			    }
		    );
    		
		    this.tabs[this.current].removeClassName(this.activeClass);
    		
		    this.contents[i].setStyle
		    (
			    {
				    'display': 'block'
			    }
		    );

		    // fade in new with effects library
		    new Effect.Opacity(this.contents[i],
		    {
			    from: 0,
			    to: 1,
			    transition: Effect.Transitions.sinoidal,
			    duration: 0,
			    beforeStart: function()
			    {
				    this.isAnimating = true;
			    }.bind(this),
			    afterFinish: function()
			    {
				    this.isAnimating = false;
				    this.current = i;
			    }.bind(this)
		    });
        }
	}
});
