var powertabs = new Class({

	options: {
		id: null,
		width:500,
		height:300,
		fx: 'fade',
		orientation:'vertical',
		fxflow: 'RL',
		tabFlow: 'FL',
		duration: 600,
		pause: 3000,
		fps: 77,
		autoplay: true,
		initialTab:0,
		animode:new Fx.Transition(Fx.Transitions.Elastic.easeInOut)
	},

	initialize: function(options){
		this.setOptions(options);
		this.container = $(this.options.id);
		this.slideshow = this.container.getElement('.' + this.options.id + '_slideshow');
		this.strip = this.container.getElement('.' + this.options.id + '_strip');
		this.slides = this.slideshow.getElements('.' + this.options.id + '_slide');
		this.tabs = this.container.getElements('.' + this.options.id + '_tab');
		this.now = this.options.initialTab;
		this.animating = false;
		this.flow;
		this.flowFactor = (this.options.tabFlow == 'FL') ? 1 : -1;
		this.loop;
		this._prev = $(this.options.id + '_prev');
		this._next = $(this.options.id + '_next');
		this.insides = false;
		
		if(this.options.fx == 'slide' && (this.options.fxflow == 'LR' || this.options.fxflow == 'TB')) {
			this.flow = this.slides.length-1;
			this.flowfactor = -1;
			if(this.options.fxflow == 'LR') {
				this.strip.setStyle('left', -this.options.width*(this.slides.lengh-1));
			}else {
				this.strip.setStyle('top', -this.options.height*(this.slides.lengh-1));
			}
		}else{
			this.flow = 0;
			this.flowfactor = 1;
		}
		
		this.fx = new Fx.Styles(this.strip, {duration:this.options.duration, fps:this.options.fps,transition:this.options.animode,
			onComplete: function(){ this.animating = false;	}.bind(this)
		});
		this.slidesfx = new Fx.Elements(this.slides, {duration:this.options.duration, wait:false, fps:this.options.fps, transition:this.options.animode,
			onComplete: function(){ this.animating = false;}.bind(this)
		});

		if(this.options.fx=='fade' || this.options.fx=='none') {
			this.slides.setStyles({position:'absolute'});	
			if(this.options.fx=='fade') {
				this.slidesfx.set( this.oneSlide(this.options.initialTab, {opacity:1}, {opacity:0}) );
				this.slides.setStyles({display:'block'});
			}else {
				this.slidesfx.set( this.oneSlide(this.options.initialTab, {'display':'block'}, {'display':'none'}) );
			}
		}
		if(this.options.fx=='slide'){
			if(this.options.orientation=='horizontal') this.strip.setStyles({width:this.options.width*this.slides.length});
			if(this.options.orientation=='vertical') this.strip.setStyles({height:this.options.height*this.slides.length});
			this.slides.setStyles({display:'block', width:this.options.width, height:this.options.height});
		}
		
		
		this.tabs.each(function(t,i){
			t.addEvent('click', function(){
				if(this.now != i && !this.animating) {
					if(this.options.autoplay) {
						$clear(this.loop);
						this.animating = false;
						this.autoPlay(i);
					}else {
						this.showSlide(i);
						this.setActive(i, this.tabs);
					}
				}
			}.bind(this));
		}, this);
		
		if(this.options.autoplay) {
			this.tt = $time();
			this.autoPlay(this.now, true);
		}
		
		if($defined(this._prev) && $defined(this._next)) {
			this._prev.setStyle('opacity', 0);
			this._next.setStyle('opacity', 0);
			this._prevfx = new Fx.Styles(this._prev, {wait:false,duration:150});
			this._nextfx = new Fx.Styles(this._next, {wait:false,duration:150});
			
			/* Opacity Buttons Control */
			this.slideshow.addEvent('mouseenter', function(){
				this.insides = true;
				this._prevfx.start({opacity:1});
				this._nextfx.start({opacity:1});
			}.bind(this));
			this.slideshow.addEvent('mouseleave', function(){
				this.insides = false;
				this._prevfx.start({opacity:0});
				this._nextfx.start({opacity:0});
			}.bind(this));
			
			/* Buttons Browse Control */
			this._next.addEvent('click', function(){
				if(!this.animating) {
					this.now = (this.now+1 > this.slides.length-1) ? -1 : this.now;
  				if(this.options.autoplay) {
  					$clear(this.loop);
  					this.animating = false;
  					this.autoPlay(this.now+1, false);
  				}else {
  					this.showSlide(this.now+1);
  					this.setActive(this.now+1, this.tabs);
  				}
				}
			}.bind(this));
			this._prev.addEvent('click', function(){
				if(!this.animating) {
  				this.now = (this.now-1 < 0) ? this.slides.length : this.now;
  				if(this.options.autoplay) {
  					$clear(this.loop);
  					this.animating = false;
  					this.autoPlay(this.now-1);
  				}else {
  					this.showSlide(this.now-1);
  					this.setActive(this.now-1, this.tabs);
  				}
				}
			}.bind(this));
			
		}
		
	}, 
	
	showSlide: function(i){
		if(this.options.fx == 'fade') {
			this.animating = true;
			this.highlight(0.25);
			this.slidesfx.start( this.oneSlide(i, {opacity:1}, {opacity:0}) ).chain(function(){
    		this.now = i;
    		this.setActive(i, this.slides);
    		this.highlight(1);
    	}.bind(this));
		}
		if(this.options.fx == 'slide' && this.options.orientation=='horizontal') {
			this.animating = true;
			this.highlight(0.25);
			this.fx.start({'left':-(this.options.width*( (i - this.flow)*this.flowfactor ))}).chain(function(){
	  		this.now = i;
	  		this.setActive(i, this.slides);
	  		this.highlight(1);
	  	}.bind(this));
		}
		if(this.options.fx == 'slide' && this.options.orientation=='vertical') {
			this.animating = true;
			this.highlight(0.25);
			this.fx.start({'top':-(this.options.height*( (i - this.flow)*this.flowfactor ))}).chain(function(){
	  		this.now = i;
	  		this.setActive(i, this.slides);
	  		this.highlight(1);
	  	}.bind(this));
		}
		if(this.options.fx == 'none') {
			this.slides.setStyle('display','none');
			this.slides[i].setStyle('display','block');
	  	this.now = i;
	  	this.setActive(i, this.slides);
	  	this.animating = false;
		}
	},
	
	oneSlide: function(index, istate, astate){
		var o = {};
		this.slides.each(function(s,i){
			o[i] = (index == i) ? istate : astate; 
		});
		return o;
	},
	
	setActive: function(index, arr){
		arr.each(function(t,i){
			if(index == i) t.addClass('current');
			else t.removeClass('current');
		}, this);
	},
	
	inverseSlides: function(){
		this.slides.each(function(s,i){
			if(i!=0) s.injectBefore(this.slides[i-1]);
		}, this);
	},
	
	highlight: function(to){
		if($defined(this._prev) && $defined(this._next) && this.insides) {
			this._prev.setStyle('opacity', to);
			this._next.setStyle('opacity', to);
		}
	},
	
	autoPlay: function(index, wait){
		this.now = ($chk(index) ) ? index-this.flowFactor : this.now;
		var autoLoop = function(){
			if(this.options.tabFlow=='FL'){var next = (this.now < (this.slides.length-1)) ? this.now + this.flowFactor : 0;}
			else{var next = (this.now > 0) ? this.now + this.flowFactor : (this.slides.length-1);}
			this.showSlide(next);
			this.setActive(next, this.tabs);
		}.bind(this);
		if(!wait){ autoLoop(); }
		this.loop = autoLoop.periodical(this.options.duration + this.options.pause);
	}
	
});
powertabs.implement(new Options);
