/*
 * 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($) {
	$.fn.simplyScroll = function(o) {
		return this.each(function() {
			new $.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
	};
	$.simplyScroll = function(el, o) {
		var self = this;
		this.o = $.extend( {}, defaults, o || {});
		this.auto = this.o.autoMode !== "off" ? true : false;
		this.$list = $(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) {
			$.getJSON(this.o.flickrFeed + "&format=json&jsoncallback=?",
					function(data) {
						json = [];
						$.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) {
			$.getJSON(this.o.localJsonSource, function(json) {
				self.renderData(json);
			});
		} else {
			if (!this.o.startOnLoad) {
				this.init();
			} else {
				$(window).load(function() {
					self.init();
				});
			}
		}
	};
	$.simplyScroll.fn = $.simplyScroll.prototype = {};
	$.simplyScroll.fn.extend = $.simplyScroll.extend = $.extend;
	$.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 +2) * 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 = $('.simply-scroll-back',
								this.$container).addClass(
								'simply-scroll-btn' + ' ' + this.moveBackClass
										+ ' ' + 'disabled').hover(
								this.funcMoveBack, this.funcMoveStop);
						this.$btnForward = $('.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") {
							$(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;
						$.each(json, function(i, item) {
							$("<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);
