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 index2 = -1;
    var index3 = -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;

                index2 = index + 1;
                if (index == itemsList.length - 1)
                    index2 = 0;
                index3 = index2 + 1;
                if (index2 == itemsList.length - 1)
                    index3 = 0;
                indexToMoveOut = index3 + 1;
                if (index3 == itemsList.length - 1)
                    indexToMoveOut = 0;
            } else {
                if (index < itemsList.length - 1)
                    index++;
                else
                    index = 0;
                index2 = index - 1;
                if (index == 0)
                    index2 = itemsList.length - 1;
                index3 = index2 - 1;
                if (index2 == 0)
                    index3 = itemsList.length - 1;
                indexToMoveOut = index3 - 1;
                if (index3 == 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() {
            setItemsListIndexes();
            setItemsListZIndex();
            switch (settings.effect) {
                case 'slide':
                    //alert('a');
                    moveItem('-' + (itemHeight / 3), 0, itemHeight / 3, itemHeight * 2 / 3, itemHeight, $(itemsList[index]), $(itemsList[index2]), $(itemsList[index3]), $(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(itemHeight / 3, 0, '-' + (itemHeight / 3), '-' + (itemHeight * 2 / 3), '-' + itemHeight, $(itemsList[index]), $(itemsList[index2]), $(itemsList[index3]), $(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, itemToShow2End, itemToShow3End, itemToHideEnd, itemToShow, itemToShow2, itemToShow3, itemToHide) {

            itemToShow.css({ top: itemToShowStart + 'px' });
            itemToShow.show();
            itemToShow2.css({ top: itemToShowEnd + 'px' });
            itemToShow2.show();
            itemToShow3.css({ top: itemToShow2End + 'px' });
            itemToShow3.show();
            itemToShow.animate({ top: itemToShowEnd + 'px' }, settings.speed);

            if (itemToShow2)
                itemToShow2.animate({ top: itemToShow2End + 'px' }, settings.speed);

            if (itemToShow3) {

                itemToShow3.animate({ top: itemToShow3End + 'px' }, settings.speed);
            }

            if (moveObjectOut && itemToHide)
                itemToHide.animate({ top: itemToHideEnd + 'px' }, settings.speed);
        }
        setItemsListIndexes();
        setItemsListZIndex();
        $(itemsList[index]).css({ top: 0 + 'px' });
        $(itemsList[index]).show();
        $(itemsList[index2]).css({ top: itemHeight / 3 + 'px' });
        $(itemsList[index2]).show();
        $(itemsList[index3]).css({ top: itemHeight * 2 / 3 + 'px' });
        $(itemsList[index3]).show();
        moveObjectOut = true;
        //showNextItem();
        if (itemsList.length > 1) {
            timer = setInterval(showNextItem, settings.delay);
        }
    };

    init();
};