(function($)
{
	$.fn.keenlook_sliders = function(options)
	{
		var defaults =
		{
			 slides: '>div',
			 activeClass: 'active',
			 auto_add_sliders_tabs: '',
			 auto_add_sliders_tabs_ul:'all_tab_controls',
			 linksNav: 'ul#all_tab_controls li a',
			 findParent: true, //use parent elements to define active states
			 lengthElement: 'li', //parent element, used only if findParent is set to true
			 useArrows: true,
			 arrowLeft: 'a.sliders-prev-arrow',
			 arrowRight: 'a.sliders-next-arrow',
			 auto: false,
			 autoSpeed: 5000,
			 slidePadding: '',
			 pauseOnHover: true,
			 fx: 'fade',
			 sliderType: ''
		};

		var options = $.extend(defaults, options);
		var linksNavItems = '';
		return this.each(function()
		{
				
			var slidesContainer = jQuery(this).parent().css('position','relative'),
				$slides = jQuery(this).css({'overflow':'hidden','position':'relative'}),
				$slide = $slides.find(options.slides).css({'opacity':'1','position':'absolute','top':'0px','left':'0px','display':'none'}),
				slidesNum = $slide.length,
				zIndex = slidesNum,
				currentPosition = 1,
				slideHeight = 0,
				$activeSlide,
				$nextSlide;
			
			
			if (options.fx === 'slide') {
				$slide.css({'opacity':'0','position':'absolute','top':'0px','left':'0px','display':'block'});
			} else {
				$slide.filter(':first').css({'display':'block'});
			}
			
			if (options.slidePadding != '') $slide.css('padding',options.slidePadding);
			
			var i=0;
			$slide.each(function(){
				i++;
				if (options.sliders_tabs != '') {linksNavItems += '<li><a href="#">'+i+'</a></li>';}
				
				
				jQuery(this).css('z-index',zIndex).addClass('clearfix');
				if (options.fx === 'slide') zIndex--;
				
				slideH = jQuery(this).innerHeight();
				if (slideH > slideHeight) slideHeight = slideH;
			});
			
			$slides.css('height', slideHeight);
			$slides.css('width', $slides.width());
							
			var slideWidth = $slide.width(),
				slideOuterWidth = $slide.outerWidth();
			
			$slide.css('width',slideWidth);
			
			$slide.filter(':first').css('opacity','1');
			
			if (options.sliderType != '') {
				if (options.sliderType === 'images') {
					controllersHtml = '<div class="sliders-controllers-wrapper">';
					controllersHtml += '<a href="#" class="sliders-prev-arrow">Previous</a>';
					controllersHtml += '<div id="sliders_tabs"></div>';
					controllersHtml += '<a href="#" class="sliders-next-arrow">Next</a>';
					controllersHtml += '</div>';		
					$controllersWrap = jQuery(controllersHtml).prependTo($slides.parent());
					
					options.auto_add_sliders_tabs='#sliders_tabs';
				}
				
				var etimage_width = $slide.width();
	
				slidesContainer.css({'width':etimage_width});
				$slides.css({'width':etimage_width});
				
				if (options.sliderType === 'images') {
					slidesContainer.css({'height':$slide.height()});
					$slides.css({'height':$slide.height()});
					
					var controllers_width = $controllersWrap.width(),
					leftPosition = Math.round((etimage_width - controllers_width) / 2);
				
					$controllersWrap.css({left: leftPosition});
				}	
			}
			
			
			if (options.sliders_tabs != '') {
				var sliders_tabs = jQuery(options.auto_add_sliders_tabs);
				$(sliders_tabs).append('<ul id="'+options.auto_add_sliders_tabs_ul+'">'+linksNavItems+'</ul>');
			}
			
			if (options.linksNav != '') {
				var linkSwitcher = jQuery(options.linksNav);
				
				var linkSwitcherTab = '';
				if (options.findParent) linkSwitcherTab = linkSwitcher.parent();
				else linkSwitcherTab = linkSwitcher;
				
				if (!linkSwitcherTab.filter('.active').length) linkSwitcherTab.filter(':first').addClass('active');
								
				linkSwitcher.click(function(){
					
					var targetElement;

					if (options.findParent) targetElement = jQuery(this).parent();
					else targetElement = jQuery(this);
					
					var orderNum = targetElement.prevAll(options.lengthElement).length+1;
					if (orderNum > currentPosition) gotoSlide(orderNum, 1);
					else gotoSlide(orderNum, -1); 
					
					return false;
				});
			}
			
			
			if (options.useArrows) {
				var $right_arrow = jQuery(options.arrowRight),
					$left_arrow = jQuery(options.arrowLeft);
									
				$right_arrow.click(function(){				
					if (currentPosition === slidesNum) 
						gotoSlide(1,1);
					else 
						gotoSlide(currentPosition+1),1;
					
					if (options.linksNav != '') changeTab();
											
					return false;
				});
				
				$left_arrow.click(function(){
					if (currentPosition === 1)
						gotoSlide(slidesNum,-1);
					else 
						gotoSlide(currentPosition-1,-1);
					
					if (options.linksNav != '') changeTab();
					
					return false;
				});
				
			}
			
							
			function changeTab(){
				if (linkSwitcherTab != '') { 
					linkSwitcherTab.siblings().removeClass('active');
					linkSwitcherTab.filter(':eq('+(currentPosition-1)+')').addClass('active');
				}
			}
			
			function gotoSlide(slideNumber,dir){
				if ($slide.filter(':animated').length) return;
			
				$slide.css('opacity','0');
																	
				$activeSlide = $slide.filter(':eq('+(currentPosition-1)+')').css('opacity','1');
								
				if (currentPosition === slideNumber) return;
								
				$nextSlide = $slide.filter(':eq('+(slideNumber-1)+')').css('opacity','1');
								
				if ((currentPosition > slideNumber || currentPosition === 1) && (dir === -1)) {
					if (options.fx === 'slide') slideBack(500);
					if (options.fx === 'fade') slideFade(500);
				} else {
					if (options.fx === 'slide') slideForward(500);
					if (options.fx === 'fade') slideFade(500);
				}
				
				currentPosition = $nextSlide.prevAll().length + 1;
				
				if (options.linksNav != '') changeTab();
				
				if (typeof interval != 'undefined' && options.auto) {
					clearInterval(interval);
					auto_rotate();
				}
									
				return false;
			}
			
			
			if (options.auto) {
				auto_rotate();
				var pauseSlider = false;
			}
			
			if (options.pauseOnHover) { 				
				slidesContainer.hover(function(){
					pauseSlider = true;
				},function(){
					pauseSlider = false;
				});
			}
			
			function auto_rotate(){
				
				interval = setInterval(function(){
					if (!pauseSlider) { 
						if (currentPosition === slidesNum) 
							gotoSlide(1,1);
						else 
							gotoSlide(currentPosition+1),1;
						
						if (options.linksNav != '') changeTab();
					}
				},options.autoSpeed);
				
			}
			
			function slideForward(speed){
				$nextSlide.css('left',slideOuterWidth+'px');
				$activeSlide.animate({left: '-'+slideOuterWidth},speed);
				$nextSlide.animate({left: 0},speed);
			}
			
			function slideBack(speed){
				$nextSlide.css('left','-'+slideOuterWidth+'px');
				$activeSlide.animate({left: slideOuterWidth},speed);
				$nextSlide.animate({left: 0},speed);
			}
			
			function slideFade(speed){					
				$activeSlide.css({zIndex: slidesNum}).fadeOut(700);
				$nextSlide.css({zIndex: (slidesNum+1)}).fadeIn(700);
			}
			
		});
	} 
})(jQuery);

