/**
 * sfSlider
 *
 * @version: 1.5.1
 * @author SimpleFlame http://www.simpleflame.com/
 *
 * Required settings:
 *  display   - provide number of items displayed at once
 *
 * Other settings:
 *  time      - transition time
 *  easing    - easing for the transition
 *  width     - width of the scrolled area (by default visible area + right margin on the last visible item)
 *  previous  - previous link text
 *  next      - next link text
 *  wrap      - wrap container selector
 *  slider    - items container selector
 *  items     - items selector
 *  paging    - set it to true if you want to display paging numbers
 *  auto      - set to true to enable autosliding
 *  autoTime  - duration between auto sliding
 *  transition - transition effect to be used - slide (default) or fade
 *  wrapSlides - should first slide be displayed after the last slide
 *  hoverPause - boolean, default false
 */ 

(function($) {
	$.fn.sfSlider = function(options){
		var defaults = {
			width     : 0,
			display   : 60,
			
			time      : 90000,
			easing    : 'swing',
			
			previous  : 'Previous',
			next      : 'Next',
			wrap      : 'div.slider-wrapper',
			slider    : 'div.item',
			items     : 'div.item ',
			paging    : false,
			auto      : true,
			autoTime  :3000,	
			transition : 'slide',
			wrapSlides : false,
			hoverPause : false
		};
		
		var settings = $.extend({}, defaults, options);
		
		return this.each(function(){
			var 
				move, $pagingTriggers,
				$root = $(this),
				$wrap = $root.find(settings.wrap),
				$slider = $root.find(settings.slider),
				$items = $root.find(settings.items),
				all = $items.size(),
				pages = Math.ceil(all/settings.display),
				i;
				
			
			$items.filter(':last').addClass('last');
			$items.filter(':first').addClass('first');
			
			// check is there enough items for paging
			if($items.size() <= settings.display) {
				return false;
			}
			
			// try to estimate visible area width if not set
			var width = settings.width;
			if(settings.width === 0) {
				width = $wrap.width() + parseInt($items.css('margin-right'),10);
			}
			
			// defaults
			var current = 0;
			
			// insert paging links					
			
			var $previousTrigger = $('<a href="#previous">'+settings.previous+'</a>').click(function(e){
				e.preventDefault();
				move(current - 1);
			});
			
			if (settings.wrapSlides === false) {
				$previousTrigger.addClass('off');
			}
			
			var $nextTrigger = $('<a href="#next">'+settings.next+'</a>').click(function(e){
				e.preventDefault();
				move(current + 1);
			});
			
			var $noteValue = '<span class="current-no">'+(current+1)+'</span> of '+ $items.size();
			
			var $controls = $('<ul class="index"><li class="prev"/><li class="note" /><li class="next"/></ul>');
			
			$controls.find('.prev').append($previousTrigger);
			$controls.find('.next').append($nextTrigger);
			$controls.find('.note').append($noteValue);
			
			$root.append($controls);			
			
			if (settings.paging === true) {
				var 
					$paging = $('<ul class="paging"></ul>');

				for (i = 0; i < pages; i++) {
					$paging.append('<li><a href="#">'+(i+1)+'</a></li>');
				}
				
				$pagingTriggers = $paging.find('a');
				$pagingTriggers.eq(0).addClass('active');
				$pagingTriggers.click(function(e){
					e.preventDefault();					
					move(parseInt($(this).text(), 10) - 1);
				});
				$root.append($paging);
			}
			
			var timeout = null;

			var restartTimer = function(){
				timeout = window.setTimeout(function(){
					move(current + 1);
				}, settings.autoTime + settings.time);
			};
			
			if (settings.auto === true) {			
				restartTimer();
			}
			
			//hide all but the first element
			if (settings.transition === 'fade') {
				$items.filter(':gt(' + (settings.display - 1) + ')').hide();
			}
			
			move = function(position){		
				var i;
				
				if(position === current) {
					return false;
				}						
				
				if (settings.wrapSlides === false && (position < 0 || position >= pages)) {
					return false;
				}
				else if (settings.wrapSlides === true && position < 0) {
					position = pages - 1;
				}
				else if (settings.wrapSlides === true && position >= pages) {
					position = 0;
				}
				
				
				current = position;
				//disable navigation if first/last item and slider should not wrap
				if (settings.wrapSlides === false) {
					$previousTrigger.toggleClass('off', current === 0);
					$nextTrigger.toggleClass('off', current + 1 === pages);				
				}
			
				if (settings.paging === true) {
					$pagingTriggers.removeClass('active');
					$pagingTriggers.eq(current).addClass('active');
				}
				
				if (settings.transition === 'slide') {
					var offset = - position * width;
					$slider.stop().animate({'marginLeft': offset + 'px'}, settings.time, settings.easing);
				}
				else if (settings.transition === 'fade') {
					$items.filter(':visible').fadeOut(function(){
						$(this).hide();
						
						var limit = (position + 1) * settings.display;
						for (i = position * settings.display; i < limit; i++) {
							$items.eq(i).fadeIn();	
						}											
					});
				}
				
				if (settings.auto === true) {
					window.clearTimeout(timeout);
					restartTimer();
				}
				$controls.find('.note .current-no').html(current+1);
			};		
					
			if (settings.hoverPause === true) {
				$root.hover(function(){
					window.clearTimeout(timeout);
				},function(){
					restartTimer();
				});
			}				
		});
	};
}(jQuery));
