
jQuery.fn.carousel = function (obj) {

	var $obj = obj;
	
	do_list = function(elem) {
		// adjust wrapper
		var width = $(elem).data('settings').single * $($obj, elem).filter(':visible').size();
		$('.wrap', elem).width(width);
		
		// buttons
		$('a.prev', elem).bind('click', function() { return do_prev(elem) });
		$('a.next', elem).bind('click', function() { return do_next(elem) });
	}
	
	do_prev = function(elem) {
		var wrap_left =  parseFloat($('.wrap', elem).css('margin-left'));
		var page_size = $(elem).data('settings').single * $(elem).data('settings').pass;
		var size = wrap_left + page_size;
		
		if(size > 0)
			do_scroll_end(elem, 'prev', 0);
		else
			do_scroll(elem, size);
			
		return false;
	}

	do_next = function(elem) {
		var wrap_size = $('.wrap', elem).width();
		var wrap_left =  parseFloat($('.wrap', elem).css('margin-left'));
		var page_size = $(elem).data('settings').single * $(elem).data('settings').pass;
		var size = wrap_left - page_size;
		
		if(Math.abs(size) >= wrap_size)
			do_scroll_end(elem, 'next', wrap_left);
		else
			do_scroll(elem, size);
			
		return false;
	}
	
	do_scroll = function(elem, size) {
		$('.wrap:not(:animated)', elem).animate({
			'margin-left' : size
			}, 500, 'easeInOutBack');	
	}
	
	do_scroll_end = function(elem, button, size) {
		if(button == 'next')
			calc = size - 100;
		else
			calc = size + 100;
			
		$('.wrap:not(:animated)', elem).animate({
			'margin-left' : calc
		}, 200).animate({
			'margin-left' : size
		}, 200);
	}

	return this.each(function () {
		$(this).data('settings', {
			pass : Math.round($(this).width() / $($obj+':first', this).outerWidth(true)),
			single : $($obj+':first', this).outerWidth(true)
			});
			
		do_list(this);
	});

}
