/*

 * 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, //No of movements per second

	speed: 2, //No of pixels per frame

	horizontal: true,

	autoMode: 'on', //disables buttons 'loop','bounce'

	pauseOnHover: true,

	startOnLoad: false, //use this if having rendering problems (safari 3 + Mac OSX?)

	localJsonSource: '', //format [{"src":"images/pic.jpg","title":"title","link":"http://"},{etc..}]

	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;

	

	//called on ul/ol/div etc

	this.$list = $(el);

	

	//generate extra markup

	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) { //button placeholders

		this.$list.parent().parent()

		.prepend('<div class="simply-scroll-forward"></div>')

		.prepend('<div class="simply-scroll-back"></div>');

	}

	

	//load image data

	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 {

			//wait for load before completing setup

			$(window).load(function() { self.init();  });

		}

		

	}

		

};

	

$.simplyScroll.fn = $.simplyScroll.prototype = {};



$.simplyScroll.fn.extend = $.simplyScroll.extend = $.extend;



$.simplyScroll.fn.extend({

	init: function() {

		//shortcuts

		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.$items[0].offsetHeight;

			this.clipMax = this.$clip.height(); //this.$clip[0].offsetHeight;

			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);

		

		//ensure that speed is divisible by item width

		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) { //render json data

			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);
