ClipScroller = new Class.create();
ClipScroller.prototype = {
	element: null,
	numClips: null,
	clipWidth: null,
	numToShift: null,
	totalWidth: null,
	shiftWidth: null,
	move: null,
	options: {},
	
	initialize: function(element, numClips, clipWidth, numToShift, options) {
		this.element = $(element);
		this.clipWidth = clipWidth;
		this.numToShift = numToShift;

		this.setNumClips(numClips);
		
		if (!options.transition) options.transition = Fx.Transitions.quartOut;
		if (!options.duration) options.duration = 700;
		if (options) this.options = options;
		
		// intialize slide effect
		this.move = new Fx.Style(element, 'left', {transition: options.transition, duration: options.duration});
	},
	
	getCurPos: function() {
		var curPos = this.element.style.left;

		if (!curPos) { curPos = 0; }
		return parseInt(curPos);
	},
	
	setNumClips: function(num) {
		this.numClips = num;
		this.totalWidth = (this.numClips*this.clipWidth);
		this.shiftWidth = this.numToShift*this.clipWidth;
	
		this.element.style.left = '0';
		
		var setWidth = new Fx.Style(this.element, 'width').set(this.totalWidth);
	},
	
	moveLeft: function() {
		
		if (this.numClips < this.numToShift) return;
		var num = this.numToShift;
		var curPos = this.getCurPos();
		do {
			amount = -curPos + num * (this.clipWidth);
			num--;
		} while ((this.totalWidth - amount) < this.shiftWidth);
		
		var moveTo = -amount;
	
		if (moveTo == curPos) {
			if (!this.options.stopAtEnd) moveTo = 0;
			else if (this.options.stopFunction) {
				this.options.stopFunction('left');
			}
		}
		this.move.custom(curPos, moveTo);
	},
	
	moveRight: function() {
		if (this.numClips < this.numToShift) return;
		var num = this.numToShift;
		var curPos = this.getCurPos();
		do {
			amount = -curPos - num * (this.clipWidth);
			num--;
		} while (amount < 0);
		
		var moveTo = -amount;
	
		if (moveTo == curPos) {
			if (!this.options.stopAtEnd) moveTo = this.shiftWidth - this.totalWidth;
			else if (this.options.stopFunction) {
				this.options.stopFunction('right');
			}
		}
		this.move.custom(curPos, moveTo);
	}
}
