/*
 * jQuery pmSlider
 * 
 * Copyright (c) 2010 Perpetuum Mobile
 * www.perpetuum.hr
 *
 * HTML structure sample
 * ---------------------
 *	<div class="slider-container">
 *		<div>Slide 1</div>
 *		<div>Slide 2</div>
 *		<div>Slide 3</div>
 *	</div>
 *
 *	or
 *
 *	<ul class="slider-container">
 *		<li>Slide 1</li>
 *		<li>Slide 2</li>
 *		<li>Slide 3</li>
 *	</ul>
 * 
 * jQuery code sample
 * ------------------
 *	$("div.slider-container").pmSlider();
 *
 *	or
 *
 *	$("div.slider-container").pmSlider({
 *		pager: true,
 *		switcher: {
 *	 		enable: true
 *	 	},
 *		delay: 2000,
 *		rotate: false,
 *		active: 0
 *	});
 */

(function($){

$.fn.pmSlider = function(options) {

	var opts = $.extend("", $.fn.pmSlider.defaults, options);
	
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	return this.each(function(e){
							  
		var $slider = $(this);
		
		var o = $.meta ?  $.extend({}, opts, $this.data()) : opts;

		var $preloader = $("<span>", {
			"class": "slider-preloader",
			html: o.preloader.title
		});
		
		var sliderHeight = $slider.children().first().height();
		var sliderWidth = 0;
		
		$slider.children().each(function(i){
			$slide = $(this);
		
			if (o.efect == "slide") {
				if (o.switcher.orientation == "horizontal") {
					$slide.css({
						float: "left",
						width: $slider.width()
					});
				};
			};
			
			$slide.data({
				index: i			
			}).
			attr("index", i);
			
			sliderHeight = ($slide.height() > sliderHeight) ? $slide.height() : sliderHeight;
			sliderWidth += $slider.width();
			
			if (o.auto && $slider.children().length > 1) {
				$slide.hover(
					function(){
						clearTimeout(swapslides);
					}, 
					function(){
						autoSlide($slider);
					}
				);
			}
		});
		
		var $sliderWrapper = $("<div>", {
			"class": "slider-wrapper",
			css: {
				overflow: "hidden", 
				position: "relative"
			}
		});
		
		if (o.efect == "slide") {
			$sliderWrapper.css((o.switcher.orientation == "horizontal") ? {width: $slider.width()} : {height: $slider.height()});
		}
		
		$slider.wrap($sliderWrapper);
		
		if (o.preloader.enable) {
			$preloader.prependTo($slider.parent()).hide();		
		}
		
		if (o.efect == "slide") {
			if (o.switcher.orientation == "horizontal") {
				$slider.width(sliderWidth);
			}
		}
		
		
		
		function doSlide(slide, direction) {	
			$slider.data({
				currentSlide: slide			 
			});
			
			if (o.switcher.orientation == "horizontal") {
				if (direction == "left") {
					slide.animate({ marginLeft: -$slider.width() }, o.speed, function() {
						//	move current item to the bottom
						slide.appendTo(slide.parent()).css("marginLeft", 0);
						$preloader.hide();	
					});
				} else {
					slide = $slider.children().last();
					
					slide
						.prependTo($slider)
						.css("marginLeft", -$slider.width())
						.animate({ marginLeft: 0 }, o.speed, function(){
							$preloader.hide();											  
						});
				};
			};
			
		};
		
		function doFade(slide) {			
			$slider.data({
				currentSlide: slide			 
			});
			
			slide.siblings().hide();
				
			slide.fadeIn(o.speed);	
		
			$slider.parent().find(".slider-pager li").removeClass("selected").eq(slide.index()).addClass("selected");
		};
		
		function autoSlide(slider) {
			swapslides = setInterval(function() {
				var $currentSlide = (slider.data().currentSlide) ? slider.data().currentSlide : slider.children().first();
				
				if (o.efect == "fade") {
					doFade(($currentSlide.next().length > 0) ? $currentSlide.next() : slider.children().first());
				} else {
					doSlide(slider.children().first(), "left");
				};
			}, o.delay);
		};
		
		//	build pager functionality
		if (o.pager.enable && $slider.children().length > 1) {
			var $pager = $("<ul/>", {"class": "slider-pager"});
			
			$slider.children().each(function(i){
				var $li = $("<li>");
				
				var slideIndex = i+1;
				
				var $page = $("<a>", {
					"href": "#" + slideIndex,
					"html": slideIndex,
					click: function(event){
						event.preventDefault();
						doFade($slider.children().eq(i));
					}
				});
				
				$li.append($page).appendTo($pager);
			});
			
			$slider.parent().append($pager);
		}
		
		//	build pager functionality
		if (o.switcher.enable && $slider.children().length > 1) {			
			var $leftSwitch = $("<a>", {
				"class": "slider-switch-left",
				"href": "#",
				"html": "<span>" + o.switcher.leftSwitcherTitle + "</span>",
				click: function(event){
					event.preventDefault();
					clearTimeout(swapslides);
					
					$preloader.show();
					
					doSlide($slider.children().first(), "left");
					
					if (o.auto) {
						autoSlide($slider);
					};
				}
			});
			
			$slider.parent().append($leftSwitch);
			
			var $rightSwitch = $("<a>", {
				"class": "slider-switch-right",
				"href": "#",
				"html": "<span>" + o.switcher.rightSwitcherTitle + "</span>",
				click: function(event){
					event.preventDefault();
					clearTimeout(swapslides);
					
					$preloader.show();
					
					doSlide($slider.children().first(), "right");
					
					if (o.auto) {
						autoSlide($slider);
					};
				}
			});
			
			$slider.parent().append($rightSwitch);
		}
		
		
		
		//	start ticker for the first time
		if ($slider.children().length > 1) {
			if (o.auto) {
				if (o.efect == "slide") {
					//doSlide($slider.children().eq(o.active));
					autoSlide($slider, "left");
				} else {
					doFade($slider.children().eq(o.active));	
					autoSlide($slider);
				};
			} else {
				if (o.efect == "slide") {
					//doSlide($slider.children().eq(o.active));
				} else {
					doFade($slider.children().eq(o.active));	
				};
			};
		};
		
	});
};

$.fn.pmSlider.defaults = {
	pager: {
		enable: false					//	show or not pager	
	},				
	switcher: {
		enable: false,					//	show or not switch arrows
		orientation: "horizontal",		//	rotate bottom/up or left/right dirrection
		leftSwitcherTitle: 'Previous',	//	left arrow title
		rightSwitcherTitle: 'Next',		//	right arrow title
		topSwitcherTitle: 'Up',			//	right arrow title
		bottomSwitcherTitle: 'Down'		//	right arrow title
	},			
	delay: 7000,						//	delay in ms before slide
	efect: "fade",						//	possible values slide or fade
	speed: 1500,						//	efect transition speed
	auto: true,							//	autorotate slider
	pause: false,						//	enable pause on mouse over
	active: 0,							//	initialy active slide
	preloader: {
		enable: true,
		title: "Loading ..."
	}
};

})(jQuery);