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.options.pause = (this.options.pause == 0) ? 0 : this.options.pause;
		
		if(this.options.fxflow == 'LR' || this.options.fxflow == 'TB') {
			this.flow = this.slides.length-1;
			//this.slides.reverse();
			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();
			//console.log('loaded at ' + 0);
			//(function(){
				this.autoPlay(this.now, true);
			//}.bind(this));
				
		}
	}, 
	
	showSlide: function(i){
		if(this.options.fx == 'fade') {
			this.animating = true;
			this.slidesfx.start( this.oneSlide(i, {opacity:1}, {opacity:0}) ).chain(function(){
    		this.now = i;
    		this.setActive(i, this.slides);
    	}.bind(this));
		}
		if(this.options.fx == 'slide' && this.options.orientation=='horizontal') {
			this.animating = true;
			this.fx.start({'left':-(this.options.width*( (i - this.flow)*this.flowfactor ))}).chain(function(){
	  		this.now = i;
	  		this.setActive(i, this.slides);
	  	}.bind(this));
		}
		if(this.options.fx == 'slide' && this.options.orientation=='vertical') {
			this.animating = true;
			this.fx.start({'top':-(this.options.height*( (i - this.flow)*this.flowfactor ))}).chain(function(){
	  		this.now = i;
	  		this.setActive(i, this.slides);
	  	}.bind(this));
		}
		if(this.options.fx == 'none') {
			//this.slidesfx.set( this.oneSlide(i, {'display':'block'}, {'display':'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);
	},
	
	autoPlay: function(index, wait){
		this.now = ($chk(index)) ? index-this.flowFactor : this.now;
		var autoLoop = function(){
			//console.log('pause: ' + this.options.pause + ' duration: ' + this.options.duration);
			//console.log('started' + (($time()-this.tt)/1000));
			this.tt = $time();
			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);

window.addEvent('domready', function(){
	
	Fx.Base.implement({
		initialize: function(options){
  		this.element = this.element || null;
  		this.setOptions(options);
  		if (this.options.initialize) this.options.initialize.call(this);
  		this.stepping = 0;
  		this.timming = 0;
  	},
		step: function(){
  		var time = $time();
  		if (time < this.time + this.options.duration){
  			this.stepping++;
  			this.timming = (time - this.time)/1000; 
  			this.delta = this.options.transition((time - this.time) / this.options.duration);
  			this.setNow();
  			this.increase();
  		} else {
  			this.stop(true);
  			this.set(this.to);
  			this.fireEvent('onComplete', this.element, 10);
  			//console.log('total steps: ' + this.stepping + '/ Avrg. steps inverval: ' + Math.round((this.timming/this.stepping)*100)/100 + ' secs');
  			this.stepping=0;
  			this.timming=0;
  			this.callChain();
  		}
		}
	});

});
