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