(function($) {	
	$.fn.rscarousel = function(options) {	
		return this.each(function() {				
			$settings = Array();
			$settings['opts'] = $.extend({
					onScroll: function(newOffset) {}
				}, $.fn.rscarousel.defaults, options);
			$settings['listDimension'] = 0;
			$settings['itemDimension'] = 0;
			$settings['count'] = 0;
			$settings['maxOfset'] = 0;
			$settings['move'] = 0;
			$settings['visibleDimension'] = 0;
			$settings['visibleItems'] = 0;
			$settings['canAnimate'] = false;
			$settings['direction'] = 'left';
			$settings['interval'] = 0;
			
			if ($settings['opts'].scrollDirection == 'height') {
				$settings['direction'] = 'top';
			}
			
			$this = $(this);
			$items = $this.find('ul').find('li');
			
			if($items.length > 0) {
				$settings['count'] = $items.length;
				if ($settings['direction'] == 'left') {
					$settings['itemDimension'] = $($items[0]).outerWidth();
					$settings['visibleDimension'] = $this.find('div.list_holder').width();
				} else {
					$settings['itemDimension'] = $($items[0]).outerHeight();
					$settings['visibleDimension'] = $this.find('div.list_holder').height();
				}
				$settings['visibleItems'] = $settings['visibleDimension'] / $settings['itemDimension'];
				$settings['listDimension'] = $settings['count'] * $settings['itemDimension'];
				$settings['move'] = $settings['opts'].moveCount * $settings['itemDimension'];				
				$settings['maxOfset'] = $settings['listDimension'] - $settings['visibleDimension'];
				$settings['canAnimate'] = true;
				if ($settings['maxOfset'] > 0) {
					$settings['maxOfset'] = - $settings['maxOfset'];
				} else {
					$settings['maxOfset'] = 0;
				}
				
				if ($settings['opts'].autoscroll > 0 && $settings['visibleItems'] < $settings['count']) {
					$.fn.rscarousel.autoscroll($this, $settings);
				}				
			} else {
				return false;
			}			
			
			$this.find('ul').css($settings['opts'].scrollDirection,$settings['listDimension']);
			$.fn.rscarousel.setControls($settings, $this);
			
			var $firstItemIndexOffset = -$settings['itemDimension']*$settings['opts'].firstItemIndex;
			if ($settings['direction'] == 'left') {
				$this.find('ul').css({left: $firstItemIndexOffset});
			} else {
				$this.find('ul').css({top: $firstItemIndexOffset});
			}
			
			$this.bind('click',{parent:$this, settings:$settings}, function(event) {
				$target = $(event.target);				
				if($target.is('a.control')) {
					event.preventDefault();					
					$.fn.rscarousel.multipleSelect($target.attr('href'), event.data.parent);
				} else if ($target.is('a.nav')) {
					event.preventDefault();	
					if (event.data.settings['interval'] == 0) {
						if (event.data.settings['canAnimate'] === true) {
							$.fn.rscarousel.scroll($target.attr('href'), event.data.parent, event.data.settings);
						}
					} else {
						clearInterval(event.data.settings['interval']);
						event.data.settings['interval'] = 0;
						setTimeout(function() {
							$.fn.rscarousel.autoscroll(event.data.parent, event.data.settings);
						}, event.data.settings.opts['waitBeforeContinue']);
					}														
				}			
			});
		});
	};
	
	$.fn.rscarousel.scroll = function($direction, $parent, $settings) {
		if ($settings['canAnimate'] == true) {
			$settings['canAnimate'] = false;
			$curOfset = parseInt($parent.find('ul').css($settings['direction']).replace('px',''));
			$newOfset = 0;
					
			switch ($direction) {				
				case '#back':
					if ($settings['opts'].circular == true) {
						if($curOfset == 0) {
							$newOfset = $settings['maxOfset'];
						} else {
							$newOfset = $curOfset + $settings['move'];
							if ($newOfset > 0) {
								$newOfset = 0;
							}
						}
					} else {
						$newOfset = $curOfset + $settings['move'];
						if ($newOfset > 0) {
							$newOfset = 0;
						}
					}
					break;				
				case '#fwd':
					if ($settings['opts'].circular == true) {
						if($curOfset == $settings['maxOfset']) {
							$newOfset = 0;
						} else {
							$newOfset = $curOfset - $settings['move'];
							if ($newOfset < $settings['maxOfset']) {
								$newOfset = $settings['maxOfset'];
							}
						}
					} else {
						$newOfset = $curOfset - $settings['move'];
						if ($newOfset < $settings['maxOfset']) {
							$newOfset = $settings['maxOfset'];
						}
					}				
					break;
			}
	
			if ($settings['opts'].animation == true) {
				$animationOptions = {left : $newOfset};
				if ($settings['direction'] == 'top') {
					$animationOptions = {top : $newOfset};
				}
				$parent.find('ul').animate($animationOptions, 
					$settings['opts'].speed,
			    	function() {
			    		$.fn.rscarousel.setControls($settings, $parent);
			    		$settings['canAnimate'] = true;
			    	}
				);
			} else {
				$parent.find('ul').css($settings['direction'], $newOfset);
				$.fn.rscarousel.setControls($settings, $parent);
				$settings['canAnimate'] = true;
			}
			$settings['opts'].onScroll(-$newOfset / $settings['itemDimension']);
			
			return true;
		} else {
			return false;
		}
	};
	
	$.fn.rscarousel.setControls = function($settings, $parent) {
		$back = $parent.find('a.nav[href="#back"]');
		$fwd = $parent.find('a.nav[href="#fwd"]');
		$back.removeClass('disabled');
		$fwd.removeClass('disabled');
		$ofset = $parent.find('ul').css($settings['direction']).replace('px','');		
		
		if ($settings['opts'].circular == true) {
			if ($settings['count'] <= $settings['visibleItems']) {
				$back.addClass('disabled');
				$fwd.addClass('disabled');
			}
		} else {
			if ($ofset == 0) {
				$back.addClass('disabled');
			} 
			if ($ofset <= $settings['maxOfset']) {
				$fwd.addClass('disabled');
			} 
		}		
		return true;
	};
	
	$.fn.rscarousel.autoscroll = function($parent, $settings) {
		$settings['interval'] = setInterval( function () {
			$.fn.rscarousel.scroll('#fwd',$parent,$settings);
		},$settings['opts'].autoscroll);
	};
	
	$.fn.rscarousel.multipleSelect = function($select, $parent) {
		$selector = false;
		if ($select == '#all') {			
			$selector = true;
		}
		
		$parent.find('input:checkbox').each(function() {
			$(this).attr('checked', $selector);
		});
		
		return $selector;
	};
	
	$.fn.rscarousel.defaults = {
		moveCount: 1,
		animation: false,
		speed: 500,
		scrollDirection: 'width',
		circular: false,
		autoscroll: 0,
		waitBeforeContinue: 10000,
		firstItemIndex: 0
	};
})(jQuery);

