jQuery.fn.thicker = function(options) {
	var settings = {
			 speed: 1000,
			 delay: 2000,
			 idThickerStart: null,
			 idThickerStop: null,
			 idThickerPrevious: null,
			 idThickerNext: null,
			 effect: 'slide'
		};
		
	if(options)
		jQuery.extend(settings, options);
	
	if(settings.effect == 'fade')
		jQuery('.item').css('left', '0px');
	
	var itemsList = jQuery('.ThickerItem');
	var index = -1;
	var indexToMoveOut = -1;
	var timer = null;
	var thickerContainer = jQuery(this);
	var itemWidth = null;
	var itemHeight = null;
	var moveObjectOut = false;
	
	var init = function(){
		itemWidth = thickerContainer.width();
		itemHeight = thickerContainer.height();
		
		if(settings.idThickerStart)
			jQuery('#' + settings.idThickerStart).click(function(){
				showNextItem();
				timer = setInterval(showNextItem, settings.delay);
			});
			
		if(settings.idThickerStop)
			jQuery('#' + settings.idThickerStop).click(function(){
				stopAnimation();
			});
			
		if(settings.idThickerPrevious)
			jQuery('#' + settings.idThickerPrevious).click(function(){
				stopAnimation();
				showPreviousItem();
				timer = setInterval(showNextItem, settings.delay);
			});
			
		if(settings.idThickerNext)
			jQuery('#' + settings.idThickerNext).click(function(){
				stopAnimation();
				showNextItem();
				timer = setInterval(showNextItem, settings.delay);
			});
		
		function stopAnimation(){
			if(timer != null)
				clearInterval(timer);
		}
		
		function setItemsListIndexes(backward){
			if(backward == true){
				if(index > 0)
					index--;
				else
					index = itemsList.length - 1;
				
				indexToMoveOut = index + 1;
				if(index == itemsList.length - 1)
					indexToMoveOut = 0;
			} else {
				if(index < itemsList.length-1)
					index++;
				else
					index = 0;
				
				indexToMoveOut = index - 1;
				if(index == 0)
					indexToMoveOut = itemsList.length - 1;
			}
		}
		
		function setItemsListZIndex(backward){
			zIndex=1;
			if(backward == true){
				for(i=itemsList.length - 1; i >= 0; i--){
					jQuery(itemsList[i]).css('z-Index', zIndex);
					zIndex++;
				}
				if(index == itemsList.length - 1)
					jQuery(itemsList[itemsList.length - 1]).css('z-Index', itemsList.length);
			}else{
				for(i=0; i < itemsList.length; i++){
					jQuery(itemsList[i]).css('z-Index', zIndex);
					zIndex++;
				}
				if(index == 0)
					jQuery(itemsList[0]).css('z-Index', itemsList.length + 1);
			}
		}
		
		function showNextItem(){
		    //alert('1');
			setItemsListIndexes();
		    //alert('2');
			setItemsListZIndex();
		    //alert('3');
			switch(settings.effect){
				case 'slide':
		    //alert('a');
					moveItem('-' + itemHeight, 0, itemHeight, jQuery(itemsList[index]), jQuery(itemsList[indexToMoveOut]));
				break;
				case 'fade':
		    //alert('b');
					jQuery(itemsList[index]).fadeIn(settings.speed);
					setTimeout(function(){jQuery(itemsList[indexToMoveOut]).hide();}, settings.speed);
				break;
				default:
					alert('Invalid effect');
			}
		    //alert('c');
			moveObjectOut = true;
		}
		
		function showPreviousItem(){
			setItemsListIndexes(true);
			setItemsListZIndex(true);				
			switch(settings.effect){
				case 'slide':
					moveItem(itemHeight, 0, '-' + itemHeight, jQuery(itemsList[index]), jQuery(itemsList[indexToMoveOut]));
				break;
				case 'fade':
					jQuery(itemsList[index]).fadeIn(settings.speed);
					setTimeout(function(){jQuery(itemsList[indexToMoveOut]).hide();}, settings.speed);
				break;
				default:
					alert('Invalid effect');
			}
		}
		
		function moveItem(itemToShowStart, itemToShowEnd, itemToHideEnd, itemToShow, itemToHide){
			itemToShow.css({top: itemToShowStart + 'px'});
			itemToShow.show();
			itemToShow.animate({top: itemToShowEnd + 'px'}, settings.speed);
      
			if(moveObjectOut && itemToHide)
				itemToHide.animate({top: itemToHideEnd + 'px'}, settings.speed);
		}
		
		showNextItem();
		if(itemsList.length > 1){
		    timer = setInterval(showNextItem, settings.delay);
        }
	};
	
	init();
};