/**
 * BB Fader
 *
 * A simple jQuery plugin to fade between the elements in a ul
 *
 * The following structure is required
 * <div class="fader">
 * <ul>
 * ...
 * </ul>
 * <div class="buttons">
 * <a>...</a><!-- prev button -->
 * <a>...</a><!-- next button -->
 * </div>
 *
 * Then it is called like so:
 * $(document).ready(function() {
 * 	$('.fader').bbfader();
 * });
 *
 * @author Dan Hensby <dan@betterbrief.co.uk>
 * @copyright Copyright (c) 2010, Better Brief LLP
 * @version 1.0
 */
(function($){
	
	$.fn.bbfader = function(options) {
		
		var opts = $.extend({}, $.fn.bbfader.defaults, options);
		
		return this.each(function() {
			//variables
			var $this = $(this); //should be a div containing a ul
			var $holder = $this.children('ul'); //the UL holder
			var $items = $holder.children(); //the list items
			var $buttons = $this.children('.' + opts.buttonsClassName); //the buttons in the container
			var $current = $($items[0]);
			var $siblings = $current.siblings();
			if (opts.autoFade) {
				setInterval(function() { $buttons.children('a:last').click(); }, opts.fadeInterval);
			}
			
			// if there are any siblings, assign click methods
			if ($siblings.length) {
				
				var pagerHTML = ['<div class="' + opts.paginationClassName + '"><ol>'];
				var activeClass = opts.currentClassName;
				var canRun = true;
				var i = 0;
				$items.each(function() {
					if(i > 0) {
						activeClass = '';
					}
					pagerHTML.push('<li class="' + activeClass + '"><a href="#">' + (i + 1) + '</a></li>');
					i += 1;
				});
				
				pagerHTML.push('</ol></div>');
				
				$this.append(pagerHTML.join(''));
				
				var $pagerItems = $this.children('.' + opts.paginationClassName).find('li');
				var numItems = $pagerItems.length;
				var $currentPager = $($pagerItems[0]);
				var $nextPager = $currentPager.next();
				var $prevPager = $currentPager.siblings(':last');
				
				var $next = $current.next();
				var $prev = $current.siblings(':last');
				
				$current.addClass(opts.currentClassName).siblings().removeClass(opts.currentClassName).hide();
				//functions
				$pagerItems.children('a').click(function() {
					if (!$this.hasClass(opts.animatingClassName)){
						$this.addClass(opts.animatingClassName);
						var $i = $(this).parent();
						if (!$i.hasClass(opts.currentClassName)) {
							var index = $i.index();
							var $item = $($items[index]);
							
							//fade out current item and fade in new one
							$current.fadeOut(opts.fadeOutSpeed,function() {
								$current = $item;
								$current.fadeIn(opts.fadeInSpeed).addClass(opts.currentClassName);
								$prev = $current.prev();
								$next = $current.next();
								$i.addClass(opts.currentClassName).siblings('.' + opts.currentClassName).removeClass(opts.currentClassName);
								$this.removeClass(opts.animatingClassName);
							}).removeClass(opts.currentClassName);
						}
					}
					return false;
				});
				
				$buttons.children('a:first').click(function() {
					//previous button
					if (!$this.hasClass(opts.animatingClassName)) {
						$this.addClass(opts.animatingClassName);
						$current.fadeOut(opts.fadeOutSpeed,function() {
							$next = $current;
							if ($prev.length) {
								$current = $prev;
								$current.fadeIn(opts.fadeInSpeed).addClass(opts.currentClassName);
							}
							else {
								$current = $current.siblings(':last');
								$current.fadeIn(opts.fadeInSpeed).addClass(opts.currentClassName);
							}
							$($pagerItems[$current.index()]).addClass(opts.currentClassName).siblings('.' + opts.currentClassName).removeClass(opts.currentClassName);
							$prev = $current.prev();
							$siblings = $current.siblings();
							$this.removeClass(opts.animatingClassName);
						}).removeClass(opts.currentClassName);
					}
					return false;
				}).next().click(function(){
					//next button
					if (!$this.hasClass(opts.animatingClassName)) {
						$this.addClass(opts.animatingClassName);
						$current.fadeOut(opts.fadeInSpeed,function() {
							$prev = $current;
							if ($next.length) {
								$current = $next;
								$current.fadeIn(opts.fadeInSpeed).addClass(opts.currentClassName);
							}
							else {
								$current = $current.siblings(':first');
								$current.fadeIn(opts.fadeInSpeed).addClass(opts.currentClassName);
							}
							$($pagerItems[$current.index()]).addClass(opts.currentClassName).siblings('.' + opts.currentClassName).removeClass(opts.currentClassName);
							$next = $current.next();
							$siblings = $current.siblings();
							$this.removeClass(opts.animatingClassName);
						}).removeClass(opts.currentClassName);
					}
					return false;
				});
				
			}
			else { //no siblings so no need for buttons
				$buttons.remove();
			}
		});
		
	};
	
	$.fn.bbfader.defaults = {
        fadeInSpeed: 'slow',
		fadeOutSpeed: 'slow',
		currentClassName: 'current',
		animatingClassName: 'animating',
		buttonsClassName: 'buttons',
		paginationClassName: 'pagination',
		autoFade: false,
		fadeInterval: 20
    }

})(jQuery);
