(function($){
	$.fn.delegate = function(eventType, rules) {
		return this.bind(eventType, function(e) {
			 var $target = $(e.target);
			 for (var selector in rules)
			 	if ($target.parents().andSelf().is(selector)) return rules[selector].apply($target, arguments);
		});
	}
	
	$.easing['jswing'] = $.easing['swing'];
	
	$.extend( $.easing, {
		def: 'easeOutCubic',
		swing: function (x, t, b, c, d) {
			return $.easing[$.easing.def](x, t, b, c, d);
		},
		easeOutCubic: function (x, t, b, c, d) {
			return c*((t=t/d-1)*t*t + 1) + b;
		}
	});
	
	$.NewsFeed = function(options){
		var self = this;
		var position = options.limit - 1;
		var animating = false;
	
		function getFirstVisible(last){
			var $elem = last;
			for (var i = 1; i < options.limit; i++) $elem = $elem.prev();
			return $elem;
		}
	
		function arrowToggle(arrow, state){
			var oldState = (state == 'on') ? 'off' : 'on';
			//var target = $('#' + arrow).removeClass(oldState).addClass(state).children('img');
			$('#' + arrow).removeClass(oldState).addClass(state);
		}
	
		this.init = function(){
			options.newsItems.eq(position).addClass('lastVisibleItem');
			var $firstVisible = getFirstVisible($('.lastVisibleItem'));
			$firstVisible.addClass('firstVisibleItem');
	
			options.container.find('.arrow').click(function(e){
				if (!animating && $(this).is('.on')) {
					var $last = $('.lastVisibleItem');
					var $first = $('.firstVisibleItem');
					var direction = ($(this).attr('id') == 'up') ? '+' : '-';
	
					// if at top or bottom of the list
					if ((options.newsItems.index($first) == 0 && direction == '+') ||
						(options.newsItems.index($last) == options.newsItems.size() - 1 && direction == '-')) {
						return false;
					}
	
					var remaining = (direction == '+') ? $first.prevAll().size() : $last.nextAll().size();
					var factor = (remaining > options.limit) ? options.limit : remaining;
					position = (direction == '+') ? position - factor : position + factor;
					//var top = ($.browser.msie && $.browser.version == '6.0') ? (factor * 91) + 6 : (factor * 91);
					var top = factor * 54;
	
					animating = true;
					options.list.animate(
						{
							top: direction + '=' + top + 'px'
						},
						'slow',
						function(){
							$last.removeClass('lastVisibleItem');
							$first.removeClass('firstVisibleItem');
							options.newsItems.eq(position).addClass('lastVisibleItem');
	
							var $f = getFirstVisible($('.lastVisibleItem'));
							$f.addClass('firstVisibleItem');
	
							if (options.newsItems.index($f.get(0)) == 0) arrowToggle('up', 'off');
							else arrowToggle('up', 'on');
							if (position == options.newsItems.size() - 1) arrowToggle('down', 'off');
							else arrowToggle('down', 'on');
	
							animating = false;
						}
					);
				}
			})
		}();
	}
})(jQuery);
