/* +------------------------------------------------
   | Slider (v0.1 - may 2010)
   | by: jb@khaos.ca
   | (requires jquery 1.4)
   +------------------------------------------------ */
(function(w,$,undefined){



var S = {};

/* +------------------------------------------------
   | S.init()
   +------------------------------------------------ */
S.init = function() {
	var s = {};
	
	var options  = (arguments) ? arguments[0] : {};
	s.id         = options.id;
	s.interval   = options.interval ? options.interval : 3000;
	s.width      = options.width+'px';
	s.speed      = options.speed    ? options.speed    : 500;

	// list
	s.$list = $('#'+s.id);
	if (!s.$list.length) { return false; }

	// nav
	s.$prev  = $('.slider-'+s.id+'-prev');
	s.$next  = $('.slider-'+s.id+'-next');
	s.$nav   = $('.slider-'+s.id+'-nav');
	
	// total items
	s.total = s.$list.find('> li').length;

	// bind events				
	s.$prev.click(function(){ 
		return slide(s, 'prev');
	});
	s.$next.click(function(){ 
		return slide(s, 'next');
	});
	s.$nav.find('> li').each(function(i){ 
		$(this).click(function(){
			return slide(s, i);
		});
	});

	// setup style
	s.curr      = 0;
	s.inSliding = false;
	
	refresh(s);

	s.$list.find('> li').css({
		top:     '0px',
		display: 'none'
	});
	s.$list.find(':first-child').css({
		left:    '0px',
		display: 'block'
	});
	
	s.intervalSeed = setInterval(function(){ slide(s, 'next'); }, s.interval);
}; 


/* +------------------------------------------------
   | slide()
   +------------------------------------------------ */
function slide(s, target) {
	if (s.inSliding) {
		return false;
	}
	
	s.inSliding = true;
	

	var way;

	// current li
	var $liCurr = s.$list.find('> li:nth-child('+(s.curr+1)+')')
	
	// prev/next
	if (target == 'prev' || target == 'next') {
		way = (target == 'prev') ? -1 : 1;
		s.curr = (s.curr == 0 && way == -1) ? (s.total-1) : ((s.curr + way) % s.total);
	
	// item
	} else {
		target == Number(target);
		
		if (target == s.curr) {
			return false;
		}

		way = (target < s.curr) ? -1 : 1;
		s.curr = target;
	}
	
	// new li
	var $liNew = s.$list.find('> li:nth-child('+(s.curr+1)+')');


	// animate
	$liCurr.animate(
		{ left: (way == 1) ? '-'+s.width : s.width },
		s.speed, 
		function(){ $(this).hide(); s.inSliding = false; }
	);
	
	$liNew
		.css({
			left    : (way == 1) ? s.width : '-'+s.width,
			display : 'block'
		})
		.animate({ left: '0px' }, s.speed)
	;
	
	refresh(s);
	return false;
}



/* +------------------------------------------------
   | refresh()
   +------------------------------------------------ */
function refresh(s) {
	s.$nav.find('> li').removeClass('slider-nav-highlight');
	s.$nav.find('> li:nth-child('+(s.curr+1)+')').addClass('slider-nav-highlight');
}






// publish
w.Slider = S;

})(window,jQuery);