/*
 * simplyScroll 1.0.4 - a scroll-tastic jQuery plugin
 *
 * http://logicbox.net/jquery/simplyscroll
 * http://logicbox.net/blog/simplyscroll-jquery-plugin
 * http://plugins.jquery.com/project/simplyScroll
 *
 * Copyright (c) 2009 Will Kelly - http://logicbox.net
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Last revised: 03/07/2009 21:13
 *
 */

(function (jQuery) {
	jQuery.fn.simplyScroll = function (o) {
		return this.each(function () {
			new jQuery.simplyScroll(this, o);
		});
	};
	var defaults = {
		className: 'simply-scroll',
		frameRate: 24,
		speed: 1,
		horizontal: true,
		autoMode: 'off',
		pauseOnHover: true,
		startOnLoad: false,
		localJsonSource: '',
		flickrFeed: '',
		jsonImgWidth: 240,
		jsonImgHeight: 180
	};
	jQuery.simplyScroll = function (el, o) {
		var self = this;
		this.o = jQuery.extend({},
		defaults, o || {});
		this.auto = this.o.autoMode !== "off" ? true: false;
		this.$list = jQuery(el);
		this.$list.addClass('simply-scroll-list').wrap('<div class="simply-scroll-clip"></div>').parent().wrap('<div class="' + this.o.className + ' simply-scroll-container"></div>');
		if (!this.o.auto) {
			this.$list.parent().parent().prepend('<div class="simply-scroll-forward"></div>').prepend('<div class="simply-scroll-back"></div>');
		}
		if (this.o.flickrFeed) {
			jQuery.getJSON(this.o.flickrFeed + "&format=json&jsoncallback=?", function (data) {
				json = [];
				jQuery.each(data.items, function (i, item) {
					json.push({
						"src": item.media.m,
						"title": item.title,
						"link": item.link
					});
				});
				self.renderData(json);
			});
		} else if (this.o.localJsonSource) {
			jQuery.getJSON(this.o.localJsonSource, function (json) {
				self.renderData(json);
			});
		} else {
			if (!this.o.startOnLoad) {
				this.init();
			} else {
				jQuery(window).load(function () {
					self.init();
				});
			}
		}
	};
	jQuery.simplyScroll.fn = jQuery.simplyScroll.prototype = {};
	jQuery.simplyScroll.fn.extend = jQuery.simplyScroll.extend = jQuery.extend;
	jQuery.simplyScroll.fn.extend({
		init: function () {
			this.$items = this.$list.children();
			this.$clip = this.$list.parent();
			this.$container = this.$clip.parent();
			if (!this.o.horizontal) {
				this.itemMax = this.$items[0].offsetHeight;
				this.clipMax = this.$clip.height();
				this.dimension = 'height';
				this.moveBackClass = 'simply-scroll-btn-up';
				this.moveForwardClass = 'simply-scroll-btn-down';
			} else {
				this.itemMax = this.$items[0].offsetWidth;
				this.clipMax = this.$clip.width();
				this.dimension = 'width';
				this.moveBackClass = 'simply-scroll-btn-left';
				this.moveForwardClass = 'simply-scroll-btn-right';
			}
			this.posMin = 0;
			this.posMax = this.$items.length * this.itemMax;
			this.$list.css(this.dimension, this.posMax + 'px');
			if (this.o.autoMode == 'loop') {
				var addItems = Math.ceil(this.clipMax / this.itemMax);
				this.$items.slice(0, addItems).clone(true).appendTo(this.$list);
				this.posMax += (this.clipMax - this.o.speed);
				this.$list.css(this.dimension, this.posMax + (this.itemMax * addItems) + 'px');
			}
			this.interval = null;
			this.intervalDelay = Math.floor(1000 / this.o.frameRate);
			while (this.itemMax % this.o.speed !== 0) {
				this.o.speed--;
				if (this.o.speed === 0) {
					this.o.speed = 1;
					break;
				}
			}
			var self = this;
			this.trigger = null;
			this.funcMoveBack = function () {
				self.trigger = this;
				self.moveBack();
			};
			this.funcMoveForward = function () {
				self.trigger = this;
				self.moveForward();
			};
			this.funcMoveStop = function () {
				self.moveStop();
			};
			this.funcMoveResume = function () {
				self.moveResume();
			};
			if (this.auto) {
				if (this.o.pauseOnHover) {
					this.$clip.hover(this.funcMoveStop, this.funcMoveResume);
				}
				this.moveForward();
			} else {
				this.$btnBack = jQuery('.simply-scroll-back', this.$container).addClass('simply-scroll-btn' + ' ' + this.moveBackClass + ' ' + 'disabled').hover(this.funcMoveBack, this.funcMoveStop);
				this.$btnForward = jQuery('.simply-scroll-forward', this.$container).addClass('simply-scroll-btn' + ' ' + this.moveForwardClass).hover(this.funcMoveForward, this.funcMoveStop);
			}
		},
		moveForward: function () {
			var self = this;
			this.movement = 'forward';
			if (this.trigger !== null) {
				this.$btnBack.removeClass('disabled');
			}
			self.interval = setInterval(function () {
				if (!self.o.horizontal && self.$clip[0].scrollTop < (self.posMax - self.clipMax)) {
					self.$clip[0].scrollTop += self.o.speed;
				} else if (self.o.horizontal && self.$clip[0].scrollLeft < (self.posMax - self.clipMax)) {
					self.$clip[0].scrollLeft += self.o.speed;
				} else if (self.o.autoMode == 'loop') {
					self.resetPos();
				} else {
					self.moveStop(self.movement);
				}
			},
			self.intervalDelay);
		},
		moveBack: function () {
			var self = this;
			this.movement = 'back';
			if (this.trigger !== null) {
				this.$btnForward.removeClass('disabled');
			}
			self.interval = setInterval(function () {
				if (!self.o.horizontal && self.$clip[0].scrollTop > 0) {
					self.$clip[0].scrollTop -= self.o.speed;
				} else if (self.o.horizontal && self.$clip[0].scrollLeft > 0) {
					self.$clip[0].scrollLeft -= self.o.speed;
				} else if (self.o.autoMode == 'loop') {
					self.resetPos();
				} else {
					self.moveStop(self.movement);
				}
			},
			self.intervalDelay);
		},
		moveStop: function (moveDir) {
			clearInterval(this.interval);
			if (this.trigger !== null) {
				if (typeof moveDir != "undefined") {
					jQuery(this.trigger).addClass('disabled');
				}
				this.trigger = null;
			}
			if (this.auto) {
				if (this.o.autoMode == 'bounce') {
					moveDir == 'forward' ? this.moveBack() : this.moveForward();
				}
			}
		},
		moveResume: function () {
			this.movement == 'forward' ? this.moveForward() : this.moveBack();
		},
		resetPos: function () {
			if (!this.o.horizontal) {
				this.$clip[0].scrollTop = 0;
			} else {
				this.$clip[0].scrollLeft = 0;
			}
		},
		renderData: function (json) {
			if (json.length > 0) {
				var self = this;
				jQuery.each(json, function (i, item) {
					jQuery("<img/>").attr({
						src: item.src,
						title: item.title,
						alt: item.title,
						width: self.o.jsonImgWidth,
						height: self.o.jsonImgHeight
					}).appendTo(self.$list);
				});
				this.init();
			}
		}
	});
})(jQuery);
