(function($){

    $.fn.ritScroller = function(options) {

		var defaults = {
			onChange: false,
			onItemClick: false
		};

		var opts = $.extend(false, defaults, options);

		function Scroller(el, options) {

			// Private
			var el = $(el);
			var opts = options;

			var scroller = $('.scroller', el);
			if (scroller.size() == 0) { return false; }

			var items = $('.item', scroller);
			var selected = false;
			items.each(function(i, item) {
				var $item = $(item);
				$item.attr('tabindex', -1);
				$item.data('index', i);
				$item.bind('focus', function(e) { e.currentTarget.blur(); return false; } );
				$item.bind('click', function(e) {
					var $target = $(e.currentTarget);
					var event = jQuery.Event('itemclick');
					event.item = item;
					//debug.append('Event: ' + e.type + ' Current: ' + e.target + ' Selected: ' + selected.get(0) + '<br />');
					if (e.currentTarget !== selected.get(0)) {
						selectItem($target.data('index'));
						e.stopPropagation();
						el.trigger(event);
						return event.result != undefined ? event.result : false;
					}

					e.stopPropagation();
					el.trigger(event);

					return event.result != undefined ? event.result : true;
				});
			});

			if (jQuery.isFunction(opts.onChange)) {
				el.bind('change', opts.onChange);
			}

			if (jQuery.isFunction(opts.onItemClick)) {
				el.bind('itemclick', opts.onItemClick);
			}

			selectItem(0);

			var navBack = $('.back', el);
			if (navBack.size() > 0) {
				if (navBack.attr('tagName').toLowerCase() == 'a') {
					navBack.attr('href', 'javascript:void(0)')
				}
				navBack.each(function(i, el) {
					$(el).bind('click', function() { back(); return false; } );
				});
			}

			var navForward = $('.forward', el);
			if (navForward.size() > 0) {
				if (navForward.attr('tagName').toLowerCase() == 'a') {
					navForward.attr('href', 'javascript:void(0)')
				}
				navForward.each(function(i, el) {
					$(el).bind('click', function() { forward(); return false; } );
				});
			}

			function selectItem(wich) {
				var item = false;
				if (typeof(wich) == 'object') {
					if (items.index(wich) >= 0) {
						item = wich;
					} else if (items.index($(wich)) >= 0) {
						item = $(wich);
					}
				} else {
					item = items.get(wich);
				}

				if (item) {

					if (selected) {
						$(selected).removeClass('selected');
					}

					selected = $(item);
					selected.addClass('selected');

					var scrollToX = scroller.scrollLeft();
					var scrollToY = scroller.scrollTop();

					if (selected.position().left + selected.outerWidth(true) > scroller.innerWidth()) {
						scrollToX = scroller.scrollLeft() + (selected.position().left + selected.outerWidth(true) - scroller.innerWidth());
					}

					if (selected.position().left < 0) {
						scrollToX = scroller.scrollLeft() - Math.abs(selected.position().left);
					}

					if (selected.position().top + selected.outerHeight(true) > scroller.innerHeight()) {
						scrollToY = scroller.scrollTop() + (selected.position().top + selected.outerHeight(true) - scroller.innerHeight());
					}

					if (selected.position().top < 0) {
						scrollToY = scroller.scrollTop() - Math.abs(selected.position().top);
					}

					if ((scrollToX != scroller.scrollLeft()) || (scrollToY != scroller.scrollTop())) {
						scroller.animate({'scrollLeft': scrollToX, 'scrollTop': scrollToY}, 'medium');
					}

					var event = jQuery.Event('change');
					event.item = item;
					el.trigger(event);

					return true;
				}

				return false;
			}

			function findItemById(id) {
				for (item in items) {
					var $item = $(items[item]);
					if ($item.attr('id') == id) {
						return $item;
					}
				}

				return false;
			}

			function back() {
				if (selected) {
					selectItem(items.index(selected) - 1);
				} else {
					selectItem(0);
				}
			}

			function forward() {
				if (selected) {
					selectItem(items.index(selected) + 1);
				} else {
					selectItem(0);
				}
			}

			function itemClicked(e) {
				if (e.target != selected) {
					alert(e.target);
					selectItem($(e.target));
					return false;
				} else {
					return true;
				}
			}

			// Public methods
			this.back = back;
			this.forward = forward;
			this.select = selectItem;
			this.selected = function() { return selected; };
			this.count = function() { return items.length; }
			this.findItemById = findItemById;
		}

		var scrollers = [];

		this.each(function(i, el) {

			var scr = $(this);
 
			if (scr.attr('tagName').toLowerCase() == 'div') {
				scrollers[scrollers.length] = new Scroller(el, opts);
			}

			return el;
		});

		return scrollers;
    }
})(jQuery);

