/*!
 * jQuery Plugin
 * http://www.loekwetzels.nl
 *
 * Copyright 2011, Loek Wetzels
 *
 * Date: Mon Sep 19 13:37:00 2011 +0100
 */
(function($){

	var defaults =	{
						perPage:		20,
						page:			1,
						delayBetween:	150,
						fadeDuration:	600,
						direction:		'down',
						nextBtn:		null,
						prevBtn:		null,
						startHidden:	false
					};
//	var options;
	var info;


	var methods = {
		init:		function(opt)
					{

						var options	= $.extend({}, defaults, opt);
						$(this).data('options', options);
						

						return this.each(function() {
							var o		= options;
							var ul		= $(this);
							var items	= $("li", ul);
							info		= {
												countItems:		items.size(),
												maxPage:		Math.ceil( items.size() / o.perPage ),
												initCalled:		false
											};
							$(this).data('info', info);

							if(o.nextBtn != null)
								o.nextBtn.click(function(){ ul.dominoFade('next'); });

							if(o.prevBtn != null)
								o.prevBtn.click(function(){ ul.dominoFade('prev'); });
							
							if(!options.startHidden)
								ul.dominoFade('update');

							items.hide();

							info.initCalled = true;
							$(this).data('info', info);
						});
					},
		next:		function(){

						var options = $(this).data('options');
						var info = $(this).data('info');

						var items	= $("li", this);
						if(options.page >= info.maxPage)
							return false;

						options.page += 1;
						this.dominoFade('update');
					},
		prev:		function()
					{

						
						var options = $(this).data('options');
						var info = $(this).data('info');

						if(options.page <= 1)
							return false;

						console.log('options TEST');

						options.page -= 1;
						this.dominoFade('update');
					},
		show:		function()
					{
						var options = $(this).data('options');
						var info = $(this).data('info');
						
						// determine what items to show
						var startIndex		= ((options.page-1)*options.perPage);
						var itemsToShow		= $("li", $(this)).slice(startIndex, startIndex+options.perPage);

						var itemsToShowSize = itemsToShow.size();
						itemsToShow.each(function(i) {
							i = (options.direction=='down') ? i : (itemsToShowSize-i);
							$(this).delay((options.delayBetween*i)).fadeTo(options.fadeDuration, 1);;
						});
					},
		hide:		function(){
						var options = $(this).data('options');
						var info = $(this).data('info');
						
						this.dominoFade('update',false);
					},
		update:		function(showNew)
					{
						var options = $(this).data('options');
						var info = $(this).data('info');
						
						if(showNew == undefined) showNew = true;

						var fadeDuration = (!info.initCalled) ? 0 : options.fadeDuration;
						var delayBetween = (!info.initCalled) ? 0 : options.delayBetween;

						// fade out visible
						var visibleItems		= $("li:visible", this);
						var visibleItemsSize	= visibleItems.size();

						visibleItems.each(function(i) {
							i = (options.direction=='down') ? i : (visibleItemsSize-i-1);
							$(this).delay(delayBetween*i).fadeTo(fadeDuration, 0, function(){

								// last item hidden, start showing new items
								if(i == visibleItemsSize-1)
								{
									// really hide invisible items
									visibleItems.hide();

									// show new
									if(showNew)
										$(this).parent().dominoFade('show');
								}
							});

						});


						if(options.nextBtn)
						{
							if(options.page == info.maxPage)
								options.nextBtn.fadeTo('normal', 0.3);
							else
								options.nextBtn.fadeTo('normal', 1);
						}
						if(options.prevBtn)
						{
							if(options.page == 1)
								options.prevBtn.fadeTo('normal', 0.3);
							else
								options.prevBtn.fadeTo('normal', 1);
						}
						
					}
	};

	$.fn.dominoFade = function(method) {
		if ( methods[method] )
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));

		else if ( typeof method === 'object' || ! method )
			return methods.init.apply( this, arguments );

		else
			$.error( 'Method ' +  method + ' does not exist on jQuery.dominoFade' );
	}

})(jQuery);
