var Rotator =
Class.create({
	initialize: function(targetElement, options)
	{
		// console.log($(targetElement));
		if($(targetElement))
		{
			// console.log('setting up rotator');
			this.targetElement = targetElement;
			this.anim = false;
			var interval = 7;
			var itemsPerFrame = 1;
			var duration = 0.5;
			var autoRotate = true;
			if(options)
			{
				if(options.interval)
					interval = options.interval
				if(options.itemsPerFrame)
					itemsPerFrame = options.itemsPerFrame;
				if(options.duration)
					duration = options.duration;
				if(options.autoRotate != null)
					autoRotate = options.autoRotate;
			}
			this.duration = duration;
			this.autoRotate = autoRotate;
			this.interval = interval;
			this.itemsPerFrame = itemsPerFrame;
			this.count = $(targetElement).down('ul').childElements().length;
			if(this.count < (itemsPerFrame + 1)) // Not enough images to proceed, so return with false
				return false;
			this.index = 0;
			this.w = $(targetElement).down('li').getWidth();
			var ulWidth = this.w * this.count;
			$(targetElement).down('ul').setStyle({ width: ulWidth +'px' });
			// console.log($(targetElement).select('.previous_button'));
			if(this.count > 1) {
				$(targetElement).select('.previous_button').invoke('observe', 'click', this.moveContainerPrevious.bind(this));
				$(targetElement).select('.next_button').invoke('observe', 'click', this.moveContainerNext.bind(this));
				this.startPe();
			} else {
				$(targetElement).select('.previous_button').invoke('hide');
				$(targetElement).select('.next_button').invoke('hide');
			}
			// console.log(this.w);
			// console.log('rotator setup complete');
		}
	},

	moveContainerNext: function(e) {
		var targetElement = this.targetElement;
		if(this.anim == false) {
			this.anim = true;
			if(this.pe)
				this.pe.stop();
			this.trackIndex('next');
			/*
			console.log(this.index + this.itemsPerFrame - 1);
			console.log(this.count);
			*/
			if(this.index + this.itemsPerFrame - 1 >= this.count) {
				this.setFirstToLast();
				this.index--; // decrement the index so we're still on the last element
			}
			var _this = this;
			new Effect.Move($(targetElement).down('ul'), {x: -this.w, mode: 'relative', duration: this.duration, afterFinish: function(e) { _this.anim = false; _this.startPe();}});
		}
	},

	moveContainerPrevious: function(e) {
		var targetElement = this.targetElement;
		
		if(this.anim == false) {
			this.anim = true;
			if(this.pe)
				this.pe.stop();
			this.trackIndex('prev');
			var w = this.w;
			if(this.index < 0) {
				this.setLastToFirst();
				this.index++;
			}
			var _this = this;
			new Effect.Move($(targetElement).down('ul'), {x: w, mode: 'relative', duration: this.duration, afterFinish: function(e) { _this.anim = false; _this.startPe();}});
		}
	},

	setLastToFirst: function()
	{
		var targetElement = this.targetElement;
		var lastLi = $(targetElement).down("ul li:last-child");
		var clone = lastLi.cloneNode(true);
		clone = $(clone);
		lastLi.remove();
		$(targetElement).down('ul').insert({ top: clone });
		var pos = $(targetElement).down('ul').positionedOffset();
		var leftPos = pos.left - this.w;
		$(targetElement).down('ul').setStyle({ left: leftPos + 'px'});
	},

	setFirstToLast: function()
	{
		var targetElement = this.targetElement;
		var firstLi = $(targetElement).down('ul').firstDescendant();
		var clone = firstLi.cloneNode(true);
		clone = $(clone);
		firstLi.remove();
		$(targetElement).down('ul').insert(clone);
		var pos = $(targetElement).down('ul').positionedOffset();
		var leftPos = pos.left + this.w;
		// console.log('pos: ' + pos);
		// console.log('leftPos: ' + (pos.left + this.w));
		$(targetElement).down('ul').setStyle({ left: leftPos + 'px'});
	},

	trackIndex: function(dir) {
		(dir == "next") ? this.index++ : this.index--;
	},

	startPe: function() {
		if(this.autoRotate)
			this.pe = new PeriodicalExecuter(this.moveContainerNext.bindAsEventListener(this), this.interval);
	}
});
