$.fn.paginate = function(options){
	var options = (typeof options != 'undefined') ? options : {};
	
	var target = $(this).find('.pagination-items-container');
	var paginationContainers = $(this).find('.pagination-control-container');
	var position = paginationContainers.css('background-position');
	
	if(!position) {
		position = paginationContainers.css('background-position-x') + ' ' + paginationContainers.css('background-position-y');
	}
	
	var background = {
		startPositionX: parseInt(position.split(' ')[0]),
		startPositionY: parseInt(position.split(' ')[1]),
		distance: 0
	};
	var itemWidth = options.itemWidth; // contando com margins
	var itemsPerPage = options.itemsPerPage;
	
	var effect = { easing: 'easeOutExpo', duration: 800 };
	
	if(options.effect) {
		$.extend(effect, options.effect);
	}
	
	if(options.background) {
		$.extend(background, options.background);
	}
	
	$(this).find('.pagination-control').bind('click', function(e){
		if($(this).is('.disabled')) {
			return;
		}
		
		var self = this;
		var maxPages = $(this).siblings('[rel|=page]').length-1; // pegar a pagina maxima, (4 paginas = de 0 até 3)
		maxPages += $(this).is('[rel|=page]') ? 1 : 0;
		var rel = $(this).attr('rel');
		var itemsContainer = target;
		var atual = Math.round((itemsContainer.scrollLeft() / itemWidth) / itemsPerPage);
		var factor = 0;
		
		switch(rel) {
			case 'prev':
				factor = Math.max(atual - 1, 0);
				break;
			case 'page-1':
				factor = 0;
				break;
			case 'page-2':
				factor = 1;
				break;
			case 'page-3':
				factor = 2;
				break;
			case 'page-4':
				factor = 3;
				break;
			case 'next':
				factor = Math.min(atual + 1, maxPages);
				break;
		}
		
		if(background.distance > 0) {
			var backgroundPosition = (background.startPositionX + (factor * background.distance));
			paginationContainers.stop().animate({ backgroundPosition: backgroundPosition.toString() + "px "+background.startPositionY.toString()+"px" }, effect.duration, effect.easing);
		}
		factor *= itemsPerPage;
		var finalScrollLeft = factor * itemWidth;
		itemsContainer.stop().animate({scrollLeft: finalScrollLeft}, effect.duration, effect.easing);
		
		$(this).addClass('page-selected').siblings().removeClass('page-selected');
		
		if(finalScrollLeft == 0) {
			paginationContainers.find('[rel=prev]').addClass('disabled');
		} else {
			paginationContainers.find('[rel=prev]').removeClass('disabled');
		}
		if(finalScrollLeft >= (itemsPerPage * itemWidth) * maxPages) {
			paginationContainers.find('[rel=next]').addClass('disabled');
		} else {
			paginationContainers.find('[rel=next]').removeClass('disabled');
		}
	});
	
	return $(this);
};

$.fn.paginateClass = function(options){
	var options = (typeof options != 'undefined') ? options : {};
	
	var target = $(this).find('.pagination-items-container');
	var paginationContainers = $(this).find('.pagination-control-container');
	
	var effect = { easing: 'linear', duration: 400 };
	
	if(options.effect) {
		$.extend(effect, options.effect);
	}
	
	$(this).find('.pagination-control').bind('click', function(e){
		if($(this).is('.disabled') || $(this).is('.page-selected')) {
			return;
		}
		
		var self = this;
		var maxPages = $(this).siblings('[rel|=page]').length-1; // pegar a pagina maxima, (4 paginas = de 0 até 3)
		maxPages += $(this).is('[rel|=page]') ? 1 : 0;
		var rel = $(this).attr('rel');
		var itemsContainer = target;
		var factor = 0;
		var itemSelector = options.itemSelector;
		var activeClass = options.activeClass;
		var transClass = options.transClass;
		
		switch(rel) {
			case 'page-1':
				factor = 0;
				break;
			case 'page-2':
				factor = 1;
				break;
			case 'page-3':
				factor = 2;
				break;
			case 'page-4':
				factor = 3;
				break;
			case 'page-5':
				factor = 4;
				break;
		}
		
		itemsContainer
			.find(itemSelector+'.'+activeClass)
				.addClass(transClass)
				.removeClass(activeClass)
			.parent()
			.find(itemSelector+':eq('+factor+')')
				.css({opacity: 0}).addClass(activeClass)
				.animate({opacity: 1}, effect.duration, effect.easing, function(){
					itemsContainer
					.find(itemSelector+'.'+transClass)
					.removeClass(transClass);
				});
		
		$(this).addClass('page-selected').siblings().removeClass('page-selected');
	});
	
	return $(this);
};
