// Power-slider 1.3 Beta
/*Last Update : 10-03-2011
Author : Moorthy
Email : moorthyrweb@gmail.com
*/
(function($){
jQuery.fn.powerSlider = function(opt){
	
	var settings = {
		panelSelector:".panel", //selector for slides
		direction:"hori", //Options "hori/vertical"
		autoNavigation : null, //slider navigation ul class
		staticNavigation : ".sample", //slider navigation ul class
		nextSelector : ".nxtb", // next button
		prevSelector : ".prevb", // prev button
		hoverStopElemnts : null, //you can give many selectors you want
		duration : 500, // Animation duration in mili-seconds
		easeFunction : "swing",// Ease function
		autoSlide: false, // Active slide show
		slideInterval : 4000,// Slide show interval in mili-seconds
		loadPanel : 1,// which panel to load initially
		relativeNav : false, // whether navigations relative to slider or global
		onComplete : function(){}
	};
	var o = jQuery.extend(settings, opt);
	
	
	return this.each(function(){	
		var $slider = $(this);		
		var $panel = $(o.panelSelector, $slider);
		var totalPanels = $panel.length;
		var panelWidth = $slider.width();
		var panelHeight = $slider.height();	
		var amination = false;
		var slide = o.loadPanel-1;
		var tout;
		var $slideNav;
		
		if(o.relativeNav){
			var $btnNext = $(o.nextSelector, $slider);
			var $btnPrev = $(o.prevSelector, $slider);
		}else{
			var $btnNext = $(o.nextSelector);
			var $btnPrev = $(o.prevSelector);
		}		
		
		if(totalPanels <=1){
			$btnNext.hide();
			$btnPrev.hide();
		}
		$panel.show();
			   
	   if(o.direction!="vertical"){
		    $panel.wrapAll('<div class="slideflow" style="position:relative"><div class="slidewrap"></div></div>');
			$slider.find(".slidewrap").width(panelWidth*totalPanels+100).end()
				.find(".slideflow").css({"overflow":"hidden", "width":panelWidth});		   
	   		$panel.width(panelWidth);
	   }else{
		   $panel.wrapAll('<div class="slideflow"><div class="slidewrap"></div></div>');
			$slider.find(".slidewrap").height(panelHeight*totalPanels+100).end()
				.find(".slideflow").css({"overflow":"hidden", "height":panelHeight});		  
		   $panel.height(panelHeight);
	   }
				
		//Moving Element
		var $slideWrap = $slider.find(".slidewrap");
		
		//Apply float to panels
		$panel.css("float", "left");
		
		if(o.autoSlide){
			resetTimeout();
			
			if(o.hoverStopElemnts!=null){
				var $hstop = $(o.hoverStopElemnts);
			}else{
				$hstop = $slider;
			}
			$hstop.hover(function(){
				clearTimeout(tout);
			},function(){
				tout = setTimeout(autoSlide, o.slideInterval);
			});			
		};
		
		if(o.autoNavigation != null){
			autoNavigation();			
		}else if(o.staticNavigation != null){
			if(o.relativeNav){
				$slideNav =$slider.find(o.staticNavigation).find("a");
			}else{
				$slideNav = $("a", o.staticNavigation);
			}
		}
		
		//prev btn
		$btnPrev.click(function(){
			if(amination){
				return false;
			};
			if(slide <=0){
				slide = totalPanels;
			};
			moveSlideTo(--slide);
			return false;
		});
		
		//prev btn
		$btnNext.click(function(){
			if(amination){
				return false;
			};
			// 
			if(slide >=totalPanels-1){
				slide = -1;
			};
			moveSlideTo(++slide);
			return false;
		});
		
		//slide Navigation
		$slideNav.click(function(){
			var index = $slideNav.index($(this));
			if(index >= totalPanels){
				return false;
			};
			
			//set current slide
			slide = index;
			moveSlideTo(slide);			
			
			return false;
    	 });
		
		
		function moveSlideTo(slideNumber){
			 if(o.direction!="vertical"){
				var movement = slideNumber*panelWidth*-1;
			 }else{
				var movement = slideNumber*panelHeight*-1;
			 }
			
			//helps to disable events while animating
			amination = true;
			
			clearTimeout(tout);
			
			setActive();
			
			//move slide and set !amination onComplete
			if(o.direction!="vertical"){
				$slideWrap.animate({"margin-left":movement}, o.duration, o.easeFunction,function(){
					amination=false;
					resetTimeout();
					o.onComplete();
				});
			}else{				
				$slideWrap.animate({"margin-top":movement}, o.duration, o.easeFunction,function(){
					amination=false;
					resetTimeout();
					o.onComplete();
				});
			}
		};
		
		function autoSlide(){
			if(slide >=totalPanels-1){
				slide = -1;
			};
			moveSlideTo(++slide);
		};
		
		//Handle active class
		function setActive(){
			$slideNav.removeClass("active");
			$slideNav.eq(slide).addClass("active");			
		};
		
		
		function autoNavigation(){
						
			if(o.relativeNav){
				var $rnav = $(o.autoNavigation, $slider);
			}else{
				var $rnav = $(o.autoNavigation)
			};
			
			// Empty the element and generate nav
			$rnav.empty();
			for(var i=1; i<=totalPanels && totalPanels > 1;i++){
				$rnav.append('<li><a href="#">'+i+'</a></li>');
			};			
			
			$slideNav = $("a", $rnav);
		}
		
		function resetTimeout(){
			if(o.autoSlide){
				clearTimeout(tout);
				tout = setTimeout(autoSlide, o.slideInterval);
			}
		}
		
		moveSlideTo(slide);
		setActive();
		
    });
	
	
};
})(jQuery);
