var Rotator =
Class.create({
	initialize: function(targetElement, options)
	{
		// console.log($(targetElement));
		if($(targetElement))
		{
			// console.log('setting up rotator');
			this.targetElement = targetElement;
			this.anim = false;
			this.selectorId = false;
			this.nextPrevId = false;
			this.noPeriodical = false;
			this.promo = false;
			var interval = 5;
			var itemsPerFrame = 1;
			var duration = 0.5;
			if(options)
			{
				if(options.interval)
					interval = options.interval
				if(options.itemsPerFrame)
					itemsPerFrame = options.itemsPerFrame;
				if(options.duration)
					duration = options.duration;
				if(options.selectorId) 
					this.selectorId = options.selectorId;
				if(options.nextPrevId) 
					this.nextPrevId = options.nextPrevId;
				if(options.noPeriodical) 
					this.noPeriodical = true;
			}
			this.duration = duration;
			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();
			//console.log(this.w);
			var ulWidth = this.w * this.count;
			$(targetElement).down('ul').setStyle({width: ulWidth +'px'});
			// console.log($(targetElement).select('.previous_button'));
			if(this.count > 1) {
				if(this.selectorId)
					$$('#' + this.selectorId + ' li').invoke('observe', 'click', this.moveContainerToIndex.bind(this));
				if (this.nextPrevId) {
					$(this.nextPrevId).select('.previous_button').invoke('observe', 'click', this.moveContainerPrevious.bind(this));
					$(this.nextPrevId).select('.next_button').invoke('observe', 'click', this.moveContainerNext.bind(this));
				}
				else {
					$(targetElement).select('.previous_button').invoke('observe', 'click', this.moveContainerPrevious.bind(this));
					$(targetElement).select('.next_button').invoke('observe', 'click', this.moveContainerNext.bind(this));
				}
				this.startPe(); //startPe will check this.noPeriodical
			} else {
//				$(targetElement).select('.previous_button').invoke('hide');
//				$(targetElement).select('.next_button').invoke('hide');
			}
			// console.log(this.w);
			// console.log('rotator setup complete');
		}
	},
	
	moveContainerToIndex: function(e) {
		var element = Event.element(e);
		if(this.anim == false) {
			//Wait until animation is finished before starting new one
			var index = element.readAttribute('jsdata');
			var imageOffset = this.targetElement.select('[jsdata=' + index + ']')[0].cumulativeOffset().left;
			var frameOffset = this.targetElement.cumulativeOffset().left;
			var offsetInPixels = frameOffset - imageOffset;
			var offset = Math.round(offsetInPixels / this.w);
			if(offset == 0)
				return true;
			else {
				element.siblings().each(function(s) {s.removeClassName('selected')});
				element.addClassName('selected');
				this.moveContainerToPosition(offset);
			}
		}
	},

	moveContainerToPosition: function(offset) {
		var targetElement = this.targetElement;
		if(this.anim == false) {
			this.anim = true;
			this.pe.stop();
			this.index = this.index - offset;
			var newPosition = this.w * offset;

			var _this = this;
			new Effect.Move($(targetElement).down('ul'), {x: newPosition, mode: 'relative', duration: this.duration, afterFinish: function(e) {_this.anim = false;_this.startPe();}});
		}
	},

	moveContainerNext: function(e) {
		var w = this.w;
		var promopage = false;
		//
		//Special rule for register form
		//

		//if($('register_form_wrapper') && typeof pageValidated != 'undefined' && pageValidated == false)
			//return;

//		console.log(e.element);
/*
		if(e != undefined && e.element != undefined && e.element().up('.register_form') != undefined) {
			if($(e.element()).up('.register_form').select('input[name=bill_or_promo]').length > 0) {
				var radioValue = $('register_form').getCheckedRadioValue('bill_or_promo');
				promopage = true;
				if(radioValue == 'promo')
					this.promo = true;
				else
					this.promo = false;
			}
		}
*/
		var targetElement = this.targetElement;
		if(this.anim == false) {
			this.anim = true;
			if(this.noPeriodical == false)
				this.pe.stop();
			this.trackIndex('next');
/*
			if(this.promo == true && promopage) {
				this.trackIndex('next');
				w=w*2;
			}
*/
			if(this.selectorId) {
				$$('#' + this.selectorId + ' li.selected').each(function(e) {
					e.removeClassName('selected');
					if(e.next())
						e.next().addClassName('selected');
					else
						e.up('ul').firstDescendant('li').addClassName('selected');
				});
			}	
			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;
			// console.log(this.w);
			new Effect.Move($(targetElement).down('ul'), {x: -w, mode: 'relative', duration: this.duration, afterFinish: function(e) {_this.anim = false;_this.startPe();}});
		}
	},

	moveContainerPrevious: function(e) {
		var targetElement = this.targetElement;
		var lastpage = false;
	/*
		if(e != undefined && e.element != undefined && e.element().up('.register_form') != undefined) {
			if(e.element().siblings().length > 1) {
				if(e.element().siblings()[1].hasClassName('submit'))
					lastpage = true;
			}
		}
	*/
		if(this.anim == false) {
			this.anim = true;
			if(this.noPeriodical == false)
				this.pe.stop();
			this.trackIndex('prev');
			var w = this.w;
/*
			if(this.promo == true && lastpage) {
				w=w*2;
				this.trackIndex('prev');
			}
*/
			if(this.selectorId) {
				$$('#' + this.selectorId + ' li.selected').each(function(e) {
					e.removeClassName('selected');
					if(e.previous())
						e.previous().addClassName('selected');
					else
						e.up('ul').lastDescendant('li').addClassName('selected');
				});
			}	
			if(this.index < 0) {
				this.setLastToFirst();
				this.index++;
			}
			var _this = this;
			//var _e = e;
			// console.log(this.w);
			//new Effect.Move($(targetElement).down('ul'), {x: w, mode: 'relative', duration: this.duration, afterFinish: function(e) {_this.anim = false;_this.startPe();_this.hideThisParentLi(_e);}});
			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').getStyle('left');
		if(pos == null)
			pos = 0;
		var leftPos = parseInt(pos) - this.w;
		// console.log(leftPos);
		$(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').getStyle('left');
		var leftPos = parseInt(pos) + this.w;
		// console.log(pos);
		// 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.noPeriodical == false)
			this.pe = new PeriodicalExecuter(this.moveContainerNext.bindAsEventListener(this), this.interval);
	},
	
	//hideThisParentLi: function(e) {
		//alert(e.element().up());
		//if(typeof e.element().up('li') != 'undefined')
			//e.element().up('li').hide();
	//}
});

Element.addMethods({
    lastDescendant: function(element) {
        element = $(element).lastChild;
        while (element && element.nodeType != 1) 
            element = element.previousSibling;
        return $(element);
    }
});
