/**
 * Por Design Slider
 *
 * Copyright (c) 2010 Por Design (pordesign.eu)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * 
 * NOTE: pagination works only for options.visible = 1
 *
 */

(function($)
{
	$.fn.slider = function(options)
	{
		$sliders = $(this);
		
		options = $.extend
		({
			nav: 'ul.nav',
			pagination: 'ul.pagination',
			items: 'ul.items',
			item: options.item,
			visible: 3,
			slide: 1,
			speed: 200,
			auto_width: true,
			width: null,
			wrapper_class: 'slider-wrapper',
			fade: false,
			auto_slide: false,
			auto_delay: 500,
			auto_direction: 'right',
			easing: 'swing',
			auto_height: true,
			auto_height_parent: false,
			count: null,
			on_show: null
		}, options);
		
		$sliders.each( function()
		{
			$slider = $(this);
			
			$slider_nav = $(this).children(options.nav);
			$slider_pagination = $(this).children(options.pagination);
			$slider_items = $(this).children(options.items);
				
			$slider_items.after($slider_items.clone().hide());
				
			$slider_items_content = $(this).children(options.items).eq(1);
			
			$slider_items.css
			({
				'position': 'absolute',
				'width': 9999
			}).wrap
			(
				$('<div />').addClass(options.wrapper_class).css
				({
					'position': 'relative',
					'overflow': 'hidden',
					'height': $slider_items.outerHeight(true),
					'width': (options.auto_width ? 'auto': options.width)
				})
			).children(options.item).css
			({
				'float': 'left'
			});
			
			if (options.count == null)
			{
				options.count = $slider_items.children(options.item).length;
			}
				
			$slider_items.children(options.item).remove();
			$slider_items.data('last-index', options.visible);
			
			height = 0;
			
			for (i = 0; i < options.visible; i++)
			{
				$item = $slider_items_content.children(options.item).eq(i).clone();
				
				if (options.on_show != null)
				{
					options.on_show($item);
				}
				
				$slider_items.append($item);
				
				if (options.auto_height)
				{
					if ($slider_items.children(options.item).last().outerHeight(true) > height)
					{
						height = $slider_items.children(options.item).last().outerHeight(true);
					}
				}
			}

			if (options.auto_height && height != 0)
			{
				if (options.auto_height_parent)
				{
					$slider_items.parent('div.' + options.wrapper_class).parent().height(height);
				} else
				{
					$slider_items.parent('div.' + options.wrapper_class).height(height);
				}
			}
			
			slider_item = function()
			{
				$slider = $(this).data('slider');
				options = $slider.data('options');
				$slider_pagination = $slider.children(options.pagination);
				$slider_items = $slider.children('div.' + options.wrapper_class).children(options.items);				
				$slider_items_content = $slider.children(options.items);
				var item = $slider_pagination.children(options.item).index(this);
				
				if (options.count > options.visible)
				{
					if ($slider_items.is(':not(:animated)'))
					{
						start_index = $slider_items.data('last-index') - 1;
						height = 0;

						if (item < start_index)
						{
							$item = $slider_items_content.children(options.item).eq(item).clone();
							
							if (options.on_show)
							{
								options.on_show($item);
							}
							
							$slider_items.prepend($item);
								
							if (options.auto_height)
							{
								if ($slider_items.children(options.item).first().outerHeight(true))
								{
									height = $slider_items.children(options.item).first().outerHeight(true);
								}
							}
								
							$slider_items.data('last-index', (item + 1 >= options.count ? 0 : item + 1));
						} else if (item > start_index)
						{
							$item = $slider_items_content.children(options.item).eq(item).clone();
							
							if (options.on_show != null)
							{
								options.on_show($item);
							}
							
							$slider_items.append($item);
							
							if (options.auto_height)
							{
								if ($slider_items.children(options.item).last().outerHeight(true))
								{
									height = $slider_items.children(options.item).last().outerHeight(true);
								}
							}
							
							$slider_items.data('last-index', (item + 1 >= options.count ? 0 : item + 1));
						}
						
						if (item != start_index)
						{
							$slider_pagination.children(options.item).removeClass('current').eq(item).addClass('current');
							
							if (item < start_index)
							{
								$slider_items.css('left', -$slider_items.children(options.item).outerWidth(true) * options.slide);
							}
								
							if (options.fade)
							{
								if (item < start_index)
								{
									$slider_items.children(options.item).last().fadeOut(options.speed);
								} else
								{
									$slider_items.children(options.item).first().fadeOut(options.speed);
								}
							}
							
							if (options.auto_height && height != 0)
							{
								if (options.auto_height_parent)
								{
									$slider_items.parent('div.' + options.wrapper_class).parent().animate
									({
										'height': height
									}, options.speed);
								} else
								{
									$slider_items.parent('div.' + options.wrapper_class).animate
									({
										'height': height
									}, options.speed);
								}
							}
							
							if (item < start_index)
							{
								$slider_items.animate
								({
									'left': '+=' + $slider_items.children(options.item).outerWidth(true) * options.slide
								}, options.speed, options.easing, function()
								{
									for (i = 0; i < options.slide; i++)
									{
										$slider_items.children(options.item).last().remove();
									}
								});
							} else
							{
								$slider_items.animate
								({
									'left': '-=' + $slider_items.children(options.item).outerWidth(true) * options.slide
								}, options.speed, options.easing, function()
								{
									$slider_items.css('left', 0);

									for (i = 0; i < options.slide; i++)
									{
										$slider_items.children(options.item).first().remove();
									}
								});
							}
						}
					}
				}
					
				return false;
			}
				
			slide_left = function()
			{
				$slider = $(this).data('slider');
				options = $slider.data('options');
				$slider_nav = $slider.children(options.nav);
				$slider_pagination = $slider.children(options.pagination);
				$slider_items = $slider.children('div.' + options.wrapper_class).children(options.items);				
				$slider_items_content = $slider.children(options.items);

				if (options.count > options.visible)
				{
					if ($slider_items.is(':not(:animated)'))
					{
						start_index = $slider_items.data('last-index') - options.visible - 1;
						height = 0;
						
						for (i = start_index; i > start_index - options.slide ; i--)
						{
							if (i < 0)
							{
								var index = $slider_items_content.children(options.item).length + i;
							} else
							{
								var index = i;
							}
							
							$item = $slider_items_content.children(options.item).eq(index).clone();
							
							if (options.on_show != null)
							{
								options.on_show($item);
							}
			
							$slider_items.prepend($item);
							
							if (options.auto_height)
							{
								if ($slider_items.children(options.item).first().outerHeight(true))
								{
									height = $slider_items.children(options.item).first().outerHeight(true);
								}
							}
							
							$slider_items.data('last-index', index + options.visible);
						}
						
						$slider_pagination.children(options.item).removeClass('current').eq(index).addClass('current');
						
						$slider_items.css('left', -$slider_items.children(options.item).outerWidth(true) * options.slide);
							
						if (options.fade)
						{
							for (i = $slider_items.children(options.item).length - 1; i > $slider_items.children(options.item).length - options.slide - 1; i--)
							{
								$slider_items.children(options.item).eq(i).fadeOut(options.speed);
							}
						}
						
						if (options.auto_height && height != 0)
						{
							if (options.auto_height_parent)
							{
								$slider_items.parent('div.' + options.wrapper_class).parent().animate
								({
									'height': height
								}, options.speed);
							} else
							{
								$slider_items.parent('div.' + options.wrapper_class).animate
								({
									'height': height
								}, options.speed);
							}
						}

						$slider_items.animate
						({
							'left': '+=' + $slider_items.children(options.item).outerWidth(true) * options.slide
						}, options.speed, options.easing, function()
						{
							for (i = 0; i < options.slide; i++)
							{
								$slider_items.children(options.item).last().remove();
							}
						});
					}
				}
					
				return false;
			};
			
			slide_right = function()
			{
				$slider = $(this).data('slider');
				options = $slider.data('options');
				$slider_nav = $slider.children(options.nav);
				$slider_items = $slider.children('div.' + options.wrapper_class).children(options.items);
				$slider_items_content = $slider.children(options.items);
				
				if (options.count > options.visible)
				{
					if ($slider_items.is(':not(:animated)'))
					{
						start_index = $slider_items.data('last-index');
						height = 0;
						
						for (i = start_index; i < start_index + options.slide ; i++)
						{
							if (i >= $slider_items_content.children(options.item).length)
							{
								var index = i - $slider_items_content.children(options.item).length;
							} else
							{
								var index = i;
							}
							
							$item = $slider_items_content.children(options.item).eq(index).clone();
							
							if (options.on_show != null)
							{
								options.on_show($item);
							}
							
							$slider_items.append($item);
							
							if (options.auto_height)
							{
								if ($slider_items.children(options.item).last().outerHeight(true))
								{
									height = $slider_items.children(options.item).last().outerHeight(true);
								}
							}
							
							$slider_items.data('last-index', index + 1);
						}
						
						$slider_pagination.children(options.item).removeClass('current').eq(index).addClass('current');
							
						if (options.fade)
						{
							for (i = 0; i < options.slide; i++)
							{
								$slider_items.children(options.item).eq(i).fadeOut(options.speed);
							}
						}
						
						if (options.auto_height && height != 0)
						{
							if (options.auto_height_parent)
							{
								$slider_items.parent('div.' + options.wrapper_class).parent().animate
								({
									'height': height
								}, options.speed);
							} else
							{
								$slider_items.parent('div.' + options.wrapper_class).animate
								({
									'height': height
								}, options.speed);
							}
						}

						$slider_items.animate
						({
							'left': '-=' + $slider_items.children(options.item).outerWidth(true) * options.slide
						}, options.speed, options.easing, function()
						{
							$slider_items.css('left', 0);

							for (i = 0; i < options.slide; i++)
							{
								$slider_items.children(options.item).first().remove();
							}
						});
					}
				}
					
				return false;
			};
			
			$slider.data('options', options);
			$slider_nav.children('li.prev').data('slider', $slider).click(slide_left);
			$slider_nav.children('li.next').data('slider', $slider).click(slide_right);
			
			$slider_pagination.children(options.item).data('slider', $slider).click(slider_item);
			
			if (options.auto_slide)
			{
                            	setInterval( function()
                                {
                                    $slider.find('li.next').click();    
                                }, options.auto_delay);
			}
		});
	
		return this;
	}
})(jQuery);

