var DerwiFader = new Class({
	initialize: function(options){
		this.setOptions({
			slideDiv: 'sliderContent',
			slideSelector: '.slide',
			speed: 200,
			autoPlay: true,
			delay: 5000,
			startIndex: 0,
			nextSlide: false,
			prevSlide: false,
			onComplete: function(){}
		}, options);
 
		this.slideDiv = this.options.slideDiv;
		this.slideDivEl = $(this.slideDiv);
		
		this.slideSelector = this.options.slideSelector;
		this.onComplete = this.options.onComplete;
		
		this.itemsCount = $$('#'+this.slideDiv+' '+this.slideSelector).length;
		this.currentIndex = this.itemsCount-1;
		
		this.ready = true;
		
		if(this.options.autoPlay){
			this.timeoutID = this.step.delay(this.options.delay, this, 1);
		}
		
//		this.test();
		
		if(this.options.startIndex!=this.currentIndex){
			this.set(this.options.startIndex);
		}
		
		
		if(this.options.nextSlide){
			$(this.options.nextSlide).addEvent('click', (function(e){
				this.step(1);
				return false;
			}).bind(this));
		}

		if(this.options.prevSlide){
			$(this.options.prevSlide).addEvent('click', (function(e){
				this.step(-1);
				return false;
			}).bind(this));
		}
	},
	
	
	test: function(){
		if(this.slideDivEl.getStyle('position')!='relative'){
			console.log('#'+this.slideDiv+' required CSS property - position: relative;');
		}
		
		$$('#'+this.slideDiv+' '+this.slideSelector).each((function(slide){
			if(slide.getStyle('position')!='absolute'){
				console.log('#'+this.slideDiv+' '+this.slideSelector+' required CSS property - position: absolute;');
			}
		}).bind(this));
	},
	
	set: function(index){
		index = index%this.itemsCount;
		if(!this.ready || this.currentIndex==index) return;
		
		if(this.options.autoPlay){
			clearTimeout(this.timeoutID);
			this.timeoutID = this.step.delay(this.options.delay, this, 1);
		}
		
		this.ready = false;
		n = index-this.currentIndex;
		if(n>0){
			n = n % this.itemsCount;
			var items = this.slideDivEl.getChildren(this.slideSelector);
			for(i=0; i<n; i++){
				items[i].clone().inject(this.slideDivEl.getLast(this.slideSelector),'after');
				items[i].destroy();
				this.currentIndex = (this.currentIndex+1)%this.itemsCount;
			}
			this.ready = true;
			this.onComplete();
		}else{
			n = - (Math.abs(n) % this.itemsCount);
			var items = this.slideDivEl.getChildren(this.slideSelector);
			for(i=0; i<Math.abs(n); i++){
				items[items.length-1-i].clone().inject(this.slideDivEl.getFirst(this.slideSelector),'before');
				items[items.length-1-i].destroy();
				this.currentIndex = (this.currentIndex + this.itemsCount - 1)%this.itemsCount;
			}
			
			this.ready = true; 
			this.onComplete();
		}
	},
	
	step: function(n){
		n = n%this.itemsCount;
		if(!this.ready || n==0) return;
		
		if(this.options.autoPlay){
			clearTimeout(this.timeoutID);
			this.timeoutID = this.step.delay(this.options.delay, this, 1);
		}
		
		this.ready = false;
		if(n>0){
			this.slideDivEl.getChildren(this.slideSelector).each((function(slide, pos){
				if(pos!=(this.itemsCount-1)){
					slide.setStyle('opacity', 0);
				}
			}).bind(this));
			for(i=0; i<n; i++){
				var firstSlide = this.slideDivEl.getFirst(this.slideSelector);
				var lastSlide = this.slideDivEl.getLast(this.slideSelector);
				firstSlide.clone().inject(lastSlide,'after').setStyle('opacity', 0);
				firstSlide.destroy();
				this.currentIndex = (this.currentIndex+1)%this.itemsCount;
			}
			
			var lastSlide = this.slideDivEl.getLast(this.slideSelector)
			var tmpMyFx = new Fx.Tween(lastSlide, {property: 'opacity', duration: this.options.speed });
			tmpMyFx.start(0,1).chain((function(){
				this.ready = true;
				this.onComplete();
			}).bind(this));
		}else{
			this.slideDivEl.getChildren(this.slideSelector).each((function(slide, pos){
				if(pos!=(this.itemsCount-1)){
					slide.setStyle('opacity', 0);
				}
			}).bind(this));
			
			var items = this.slideDivEl.getChildren(this.slideSelector);
			
			var lastSlide = this.slideDivEl.getLast(this.slideSelector);
			var firstSlide = this.slideDivEl.getFirst(this.slideSelector);

			for(i=0; i<Math.abs(n); i++){
				items[this.itemsCount-Math.abs(n)+i].clone().inject(firstSlide, 'before').setStyle('opacity', 0);
			}
			
			items[this.itemsCount-1-Math.abs(n)].setStyle('opacity', 1);
			var tmpMyFx = new Fx.Tween(lastSlide, {property: 'opacity', duration: this.options.speed});
			tmpMyFx.start(1,0).chain((function(){
				var items = this.slideDivEl.getChildren(this.slideSelector);
				for(i=0; i<items.length - this.itemsCount; i++){
					items[items.length-1-i].destroy();
				}
				this.currentIndex = (this.currentIndex + this.itemsCount - (items.length - this.itemsCount))%this.itemsCount;
				this.ready = true;
				this.onComplete();
			}).bind(this));
		}
		
		
	},
	
	onComplete: function(){
	}, 
	
	goTo: function(index){
		this.step(index-this.currentIndex);
	}
});

DerwiFader.implement(new Options);
