jQuery.fn.thicker = function(options) {
    var settings = {
        childrens: '.ThickerItem',
        speed: 6000,
        delay: 500,
        idThickerStart: null,
        idThickerStop: null,
        idThickerPrevious: null,
        idThickerNext: null,
        idThickerGoTo: null,
        idThickerGoToActiveClass: 'On',
        effect: 'slide'
    };

    if (options)
        jQuery.extend(settings, options);

    var itemsList = jQuery(this).children(settings.childrens);
    var index = -1;
    if ($.cookie('vIndex') != null)
        index = $.cookie('vIndex');
    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();

        $("#ThickerContainer").mouseover(function() {
            stopAnimation();
        });

        $("#ThickerContainer").mouseout(function() {
            timer = setInterval(showNextItem, settings.delay);
        });

        if (settings.idThickerStart)
            jQuery(settings.idThickerStart).click(function() {
                showNextItem();
                timer = setInterval(showNextItem, settings.delay);
                return false;
            });

        if (settings.idThickerStop)
            jQuery(settings.idThickerStop).click(function() {
                stopAnimation();
                return false;
            });

        if (settings.idThickerPrevious)
            jQuery(settings.idThickerPrevious).click(function() {
                stopAnimation();
                showPreviousItem();
                timer = setInterval(showNextItem, settings.delay);
                return false;
            });

        if (settings.idThickerNext)
            jQuery(settings.idThickerNext).click(function() {
                stopAnimation();
                showNextItem();
                timer = setInterval(showNextItem, settings.delay);
                return false;
            });

        if (settings.idThickerGoTo)
            jQuery(settings.idThickerGoTo).click(function() {
                if (jQuery(this).attr("rel"))
                    stopAnimation();
                showItem(jQuery(this).attr("rel") - 1);
                timer = setInterval(showNextItem, settings.delay);
                return false;
            });

        function stopAnimation() {
            if (timer != null)
                clearInterval(timer);
        }

        function setItemsListIndexes(backward) {
            if (backward == true) {
                if (index > 0)
                    index--;
                else
                    index = itemsList.length - 1;

                $.cookie('vIndex', index);
                indexToMoveOut = index + 1;
                if (index == itemsList.length - 1)
                    indexToMoveOut = 0;
            } else {
                if (index < itemsList.length - 1)
                    index++;
                else
                    index = 0;

                $.cookie('vIndex', index)
                indexToMoveOut = index - 1;
                if (index == 0)
                    indexToMoveOut = itemsList.length - 1;
            }
        }

        function setItemsListZIndex() {
            for (i = 0; i < itemsList.length; i++) {
                jQuery(itemsList[i]).css('z-Index', 1);
            }
            jQuery(itemsList[indexToMoveOut]).css('z-Index', 2);
            jQuery(itemsList[index]).css('z-Index', 3);
        }

        function showNextItem() {
            setItemsListIndexes();
            setItemsListZIndex();
            switch (settings.effect) {
                case 'slide':
                    moveItem('-' + itemWidth, 0, itemWidth, 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');
            }
            setSelectedLink(index);
            moveObjectOut = true;
        }

        function showPreviousItem() {
            setItemsListIndexes(true);
            setItemsListZIndex();
            switch (settings.effect) {
                case 'slide':
                    moveItem(itemWidth, 0, '-' + itemWidth, 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');
            }
            setSelectedLink(index);
        }

        function showItem(selectedIndex) {
            if (index != -1 && index != selectedIndex) {
                indexToMoveOut = index;
                index = selectedIndex;
                setItemsListZIndex();
                switch (settings.effect) {
                    case 'slide':
                        moveItem(itemWidth, 0, '-' + itemWidth, 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');
                }
                setSelectedLink(index);
            }
        }

        function setSelectedLink(selectedIndex) {
            if (settings.idThickerGoTo) {
                jQuery(settings.idThickerGoTo).removeClass(settings.idThickerGoToActiveClass);
                jQuery(settings.idThickerGoTo).eq(selectedIndex).addClass(settings.idThickerGoToActiveClass);
            }
        }

        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();
};
