(function($) {

	$.fn.extend({

		listScroll: function(_opts) {
			var defaults = {
				showItems: 5,
				scrollItems: 4,
				moveDownLabel: 'Older',
				moveUpLabel: 'Newer'
			};

			var opts = $.extend(defaults, _opts);

			return this.each(function() {
				var $listItems = $(this).children();

				var startIndex = 0;
				var selectedIndex = $listItems.index($listItems.filter('.selected').first());

				// start with selected item in middle
				if (opts.showItems < $listItems.size()) {
					if (selectedIndex != -1) {
						var offset = Math.ceil(opts.showItems / 2) - 1;
						if (selectedIndex >= offset) {
							if (selectedIndex > ($listItems.size() - opts.showItems + offset))
								startIndex = $listItems.size() - opts.showItems;
							else
								startIndex = selectedIndex - offset;
						}
					}

					$(this).children().hide();
					$(this).children().slice(startIndex, startIndex + opts.showItems).show();
				}

				var $controlsBox = $('<div class="listScrollControls" />');
				var $moveDownLink = $('<a href="#" class="moveDown">' + opts.moveDownLabel + '</a>');
				var $moveUpLink = $('<a href="#" class="moveUp">' + opts.moveUpLabel + '</a>');
				var $clearMe = $('<div class="clear-me" />');

				$controlsBox.append($moveUpLink);
				$controlsBox.append($moveDownLink);
				$controlsBox.append($clearMe);

				$(this).after($controlsBox);

				function firstVisibleIndex() {
					return $listItems.index($listItems.filter(':visible').first());
				}

				function setLinkVisibility(firstVisibleIdx) {
					if (firstVisibleIdx > 0)
						$moveUpLink.removeClass('disabled');
					else
						$moveUpLink.addClass('disabled');

					if (firstVisibleIdx + opts.showItems < $listItems.size())
						$moveDownLink.removeClass('disabled');
					else
						$moveDownLink.addClass('disabled');
				}

				setLinkVisibility(startIndex);

				$moveDownLink.click(function() {
					var firstVisibleIdx = firstVisibleIndex();

					var _scrollItems = opts.scrollItems;
					if ((firstVisibleIdx + opts.showItems + opts.scrollItems) > $listItems.size())
						_scrollItems = $listItems.size() - (firstVisibleIdx + opts.showItems);

					if (_scrollItems > 0) {
						setLinkVisibility(firstVisibleIdx + _scrollItems);
						$listItems.slice(firstVisibleIdx, firstVisibleIdx + _scrollItems).hide('slow');
						$listItems.slice(firstVisibleIdx + opts.showItems, firstVisibleIdx + opts.showItems + _scrollItems).show('slow');
					}

					return false;
				});

				$moveUpLink.click(function() {
					var firstVisibleIdx = firstVisibleIndex();

					var _scrollItems = opts.scrollItems;
					if ((firstVisibleIdx - opts.scrollItems) < 0)
						_scrollItems = firstVisibleIdx;

					if (_scrollItems > 0) {
						setLinkVisibility(firstVisibleIdx - _scrollItems);
						$listItems.slice(firstVisibleIdx - _scrollItems, firstVisibleIdx).show('slow');
						$listItems.slice(firstVisibleIdx + opts.showItems - _scrollItems, firstVisibleIdx + opts.showItems).hide('slow');
					}

					return false;
				});
			});
		}

	});

})(jQuery);

