var DerwiSlider = new Class({
	initialize: function(options){
		this.setOptions({
			maskDiv: 'slider',
			slideDiv: 'sliderContent',
			slideSelector: '.slide',
			slideWidth: 0,
			speed: 200,
			autoPlay: false,
			delay: 5000,
			startIndex: 0,
			nextSlide: false,
			prevSlide: false,
			onComplete: function(){}
		}, options);
 
		this.maskDiv = this.options.maskDiv;
		this.maskDivEl = $(this.maskDiv);
		
		this.slideDiv = this.options.slideDiv;
		this.slideDivEl = $(this.slideDiv);
		
		this.slideSelector = this.options.slideSelector;
		this.onComplete = this.options.onComplete;
		
		
		this.currentIndex = 0;
		
		this.items = $$('#'+this.slideDiv+' '+this.slideSelector);
		this.itemsCount = this.items.length;
		if(this.options.slideWidth>0){
			this.slideWidth = this.options.slideWidth;
		}else{
			this.slideWidth = this.items[0].getSize().x;
		}
		
		this.slideDivEl.setStyle('width', this.slideWidth*this.itemsCount+'px');
		
		this.fx = new Fx.Tween(this.slideDiv, {
			duration: this.options.speed,
			wait:false
		}); 
		this.ready = true;
		
		if(this.options.autoPlay){
			this.timeoutID = this.step.delay(this.options.delay, this, 1);
		}
		
		this.test();
		
		if(this.options.startIndex!=0){
			this.set(this.options.startIndex);
		}else{
			this.onComplete();
		}
		
		
		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.maskDivEl.getStyle('overflow')!='hidden'){
			console.log('#'+this.maskDiv+' required CSS property - overflow: hidden;');
		}
		if(this.maskDivEl.getStyle('position')!='relative'){
			console.log('#'+this.maskDiv+' required CSS property - position: relative;');
		}
		if(this.slideDivEl.getStyle('position')!='relative'){
			console.log('#'+this.slideDiv+' required CSS property - position: relative;');
		}
	},
	
	set: function(index){
		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;
		this.fx.cancel();
		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;
		this.fx.cancel();
		if(n>0){
			this.fx.start('left', (-n*this.slideWidth)).chain((function(){
				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.slideDivEl.setStyle('left', 0);
				this.ready = true;
				this.onComplete();
			}).bind(this));
		}else{
			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.slideDivEl.setStyle('left', n*this.slideWidth+'px');
			
			this.fx.start('left', 0).chain((function(){ this.ready = true; this.onComplete();}).bind(this));
		}
	},
	
	onComplete: function(){
//		console.log(this.currentIndex);
	}, 
	
	goTo: function(index){
		this.step(index-this.currentIndex);
	}
});

DerwiSlider.implement(new Options);
