var jbScroller = function() {
	S = {
		init: function(opts){
			if(initialized) return; // don't initialize twice
			initialized = true;
			
            opts = opts || {};
			
			this.imageW = opts.imageW;
			this.imageH = opts.imageH;
			this.initScrollX = opts.scrollerX || 0;
			this.scrollX = opts.scrollerX || 0;
			this.direction = opts.direction || 1;
			this.duration = opts.duration || 1;
			this.delay = opts.delay || 3;
			this.imgArr = opts.imgArr || [];
			this.numImages = this.imgArr.length;
			this.attachTo = $(opts.attachTo) || document.body;
			this.isPaused = true;

			this.attachTo.insert(new Element('div', { 'id':'scrollcrop' }));
			$('scrollcrop').setStyle({
				position: 'absolute',
				top: '0px',
				height: this.imageH + 'px',
				width: '100%',
				overflow: 'hidden'
			});

			$('scrollcrop').insert(new Element('div', { 'id':'scrollcontent' }));
			$('scrollcontent').setStyle({
				position: 'relative',
				height: this.imageH + 'px',
				width: (this.numImages * this.imageW * 2) + 'px',
				left: this.scrollX + 'px'
			});

			for (var j=0;j<2;j++) {
				for (var i=0;i<this.numImages;i++) {
					var divid = 'scroll' + j + '_' + i;
					$('scrollcontent').insert(new Element('div', { 'id':divid, 'class':'scrollitem' }));
					$(divid).setStyle({
						height: this.imageH + 'px',
						width: this.imageW + 'px',
						float: 'left'
					});

					$(divid).insert(new Element('img', { 'src':this.imgArr[i] }));
				}
			}
			
			if (this.numImages > 1) {
				this.isPaused = false;
				this.animate();
			}
		},
		
		animate: function() {
			S.scrollSlide(S.direction, S.duration, S.delay, S.animate);
		},
		
		pause: function() {
			this.isPaused = true;
		},
		
		play: function() {
			this.isPaused = false;
			this.animate();
		},
		
		scrollSlide: function(direction, duration, delay, callback) {
			if (this.isAnimating) { return; }
			if (this.isPaused) { return; }
			if (direction > 0) {//scroll to the left
				direction = 1;
				if (this.scrollX <= -this.numImages * this.imageW - this.initScrollX) {
					this.scrollX = this.initScrollX;
					$('scrollcontent').setStyle({
						left: this.scrollX + 'px'
					});
				}
			} else {
				direction = -1;
				if (this.scrollX >= this.initScrollX) {
					this.scrollX = -this.numImages * this.imageW - this.initScrollX;
					$('scrollcontent').setStyle({
						left: this.scrollX + 'px'
					});
				}
			}
			this.scrollX -= this.imageW * direction;
			new Effect.Move('scrollcontent', {
				x: this.scrollX, y: 0, mode: 'absolute',
				transition: Effect.Transitions.sinoidal,
				duration: duration,
				delay: delay,
				afterFinish: function() {
					S.isAnimating = false;
					if (typeof callback == 'function') {
						callback.call();
					}
				},
				afterSetup: function() {
					S.isAnimating = true;
				}
			});
		},
		
		shuffle: function(v){
			for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
			return v;
		}
		
	};
	initialized = false;
	return S;
}();
