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')
		$('.item').css('left', '0px');
	
	var itemsList = $('.ThickerItem');
	var index = -1;
	var indexToMoveOut = -1;
	var timer = null;
	var thickerContainer = $(this);
	var itemWidth = null;
	var itemHeight = null;
	var moveObjectOut = false;
	
	var init = function(){
		itemWidth = thickerContainer.width();
		itemHeight = thickerContainer.height();
		
		if(settings.idThickerStart)
			$('#' + settings.idThickerStart).click(function(){
				showNextItem();
				timer = setInterval(showNextItem, settings.delay);
			});
			
		if(settings.idThickerStop)
			$('#' + settings.idThickerStop).click(function(){
				stopAnimation();
			});
			
		if(settings.idThickerPrevious)
			$('#' + settings.idThickerPrevious).click(function(){
				stopAnimation();
				showPreviousItem();
				timer = setInterval(showNextItem, settings.delay);
			});
			
		if(settings.idThickerNext)
			$('#' + 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--){
					$(itemsList[i]).css('z-Index', zIndex);
					zIndex++;
				}
				if(index == itemsList.length - 1)
					$(itemsList[itemsList.length - 1]).css('z-Index', itemsList.length);
			}else{
				for(i=0; i < itemsList.length; i++){
					$(itemsList[i]).css('z-Index', zIndex);
					zIndex++;
				}
				if(index == 0)
					$(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('-' + itemWidth, 0, itemWidth, $(itemsList[index]), $(itemsList[indexToMoveOut]));
				break;
				case 'fade':
		    //alert('b');
					$(itemsList[index]).fadeIn(settings.speed);
					setTimeout(function(){$(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(itemWidth, 0, '-' + itemWidth, $(itemsList[index]), $(itemsList[indexToMoveOut]));
				break;
				case 'fade':
					$(itemsList[index]).fadeIn(settings.speed);
					setTimeout(function(){$(itemsList[indexToMoveOut]).hide();}, settings.speed);
				break;
				default:
					alert('Invalid effect');
			}
		}
		
		function moveItem(itemToShowStart, itemToShowEnd, itemToHideEnd, itemToShow, itemToHide){
			itemToShow.css({left: itemToShowStart + 'px'});
			itemToShow.show();
			itemToShow.animate({left: itemToShowEnd + 'px'}, settings.speed);
			if(moveObjectOut && itemToHide)
				itemToHide.animate({left: itemToHideEnd + 'px'}, settings.speed);
		}
		
		showNextItem();
		if(itemsList.length > 1){
		    timer = setInterval(showNextItem, settings.delay);
        }
	};
	
	init();
};
