/**
 *
 * jquery.endlessScroller.js version 0.81b
 * requires jQuery version 1.4 or higher
 * 
 */
 
(function($){  
	$.fn.endlessScroller = function(options){
		var defaults = {  
		   scrollPerClick:5,
		   intScroll:0,
		   eventSize:120,
		   scrollSpeed: 1500,
		   arrowAnimSpeed:250,
		   ajax: false,
		   ajaxURL: '',
		   ajaxDirectionValues: {left:'left', right:'right'}
		   
		   
		};  
		var options = $.extend(defaults, options);
		
		return this.each(function(){
			
			
			var container = this;
			var wrapper = $('.wrapper', container);
			wrapper.css('width', $(wrapper).children().length*options.eventSize+'px');
			$('.item:first', container).addClass('firstVisible');
			
			if($('.item', container).length===0)
				$(container).hide();
			$('.wrapper > .item', container).each(function(){
				$(this).metadata();
				$(this).data($(this).data('metadata'));
			});
						
			function displayArrows(){
				$('.leftArrow > a, .rightArrow > a', container).fadeIn(options.arrowAnimSpeed);
			}
						
			function moveWindowLeft(){
				var numberToMove = options.scrollPerClick;
				var currentItem = $('.item.firstVisible', container);
				var sizeLoaded = currentItem.prevAll().length;
				
				if(options.intScroll > 0){
					numberToMove = options.intScroll;
					options.intScroll = 0;
				}
				
				if(sizeLoaded<numberToMove)numberToMove=sizeLoaded;
				if(numberToMove>0){
					currentItem.removeClass('firstVisible');
					for(x=0; x<numberToMove; x++){
						currentItem=currentItem.prev();	
					}
					currentItem.addClass('firstVisible');
					wrapper.animate({
						left: "+="+(options.eventSize*numberToMove)
					}, options.scrollSpeed*(numberToMove/options.scrollPerClick), displayArrows);
					
				}
			}
			
			function moveWindowRight(){
				var numberToMove = options.scrollPerClick;
				var currentItem = $('.item.firstVisible', container);
				var sizeLoaded = currentItem.nextAll().length-options.scrollPerClick+1;
				if(sizeLoaded<numberToMove)numberToMove=sizeLoaded;
				if(numberToMove>0){
					currentItem.removeClass('firstVisible');
					for(x=0; x<numberToMove; x++){
						currentItem=currentItem.next();	
					}
					
					currentItem.addClass('firstVisible');
					wrapper.animate({
						left: "-="+(options.eventSize*numberToMove)
					}, options.scrollSpeed*(numberToMove/options.scrollPerClick), displayArrows);
					
					
				}
			}
			
			
			
			
			$('.leftArrow > a', container).click(function(){
				var sizeLoaded = $('.item.firstVisible', container).prevAll().length;
				$(this).hide();
				if(sizeLoaded<options.scrollPerClick && options.ajax===true){
					$.get(options.ajaxURL+'&dir='+options.ajaxDirectionValues.left,$('.item.firstVisible', container).prevAll().andSelf().first().data(), function(data){
						if(data){
							var newWidth=parseInt(wrapper.css('width'));
							numberAdded=$(data).length;
							$(data).hide();
							var newLeft=parseInt(wrapper.css('left'));
							newLeft=newLeft-numberAdded*options.eventSize;
							newWidth=newWidth+numberAdded*options.eventSize;
							wrapper.css('width', newWidth+'px').css('left', newLeft+'px');
							$(data).each(function(){
								$(this).metadata();
								$(this).data($(this).data('metadata'));
								$(this).prependTo(wrapper);
							});
						}
						moveWindowLeft();
					});
				}else
					moveWindowLeft();
				return false;
				
			});
			
			$('.rightArrow > a', container).click(function(){
				var sizeLoaded = $('.item.firstVisible', container).nextAll().length-options.scrollPerClick;
				$(this).hide();
				if(sizeLoaded<options.scrollPerClick  && options.ajax===true){
					$.get(options.ajaxURL+'&dir='+options.ajaxDirectionValues.right, $('.item.firstVisible', container).nextAll().andSelf().last().data(), function(data){
						if(data){
							var newWidth=parseInt(wrapper.css('width'));					
							numberAdded=$(data).length;
							$(data).hide();
							newWidth=newWidth+numberAdded*options.eventSize;
							wrapper.css('width', newWidth+'px');						
							$(data).each(function(){
								$(this).metadata();
								$(this).data($(this).data('metadata'));
								$(this).appendTo(wrapper);
							});
						}
						moveWindowRight();
						
					});
				}else
					moveWindowRight();
				return false;
			});
		});
	};
})(jQuery);
