jQuery.fn.rotator = function(options) {
    var settings = jQuery.extend({
        width: 0,
        effect: "fade",
        delay: 5000,
        auto: true,
        effectDelday: 1500,
        elements: null,
        navigator: null,
        previous: null,
        next: null,
        offsetTop: 0,
        offsetLeft: 0
    }, options);

    var currentIndex = 0;

    var obj = this;
    var elements = settings.elements;
    var navigator = settings.navigator;
    var container;

    //console.log(elements.length);
    if (!elements.length) return false;
    if (elements.length == 1) return false;

    $(this).css({ position: 'relative' });

    if (settings.effect == "fade") {
        elements.each(function(index) {
            $(this).css({ position: 'absolute', top: settings.offsetTop, left: settings.offsetLeft });

            if (index > 0) {
                $(this).fadeOut(0);
            }
        });
    } else if (settings.effect == "scroll") {
        container = $('<div/>').css({ position: 'relative' });
        var parent = $(elements[0]).parent();
        var elementWidth = settings.width ? settings.width : $(elements[0]).width();
        //console.log(elementWidth);

        parent.css({ width: elementWidth, position: 'relative' });

        elements.each(function(index) {
            $(this).css({ width: elementWidth, overflow: 'hidden' });
            container.append($(this));
        });
        container.css({ width: elementWidth * elements.length });

        parent.append(container);
    } else {
        alert('Only fade and scrool allow for effect');
        return false;
    }

    var auto = function() {
        if (navigator != null)
            $(navigator[currentIndex]).removeClass('active');

        if (settings.effect == "fade") {
            $(elements[currentIndex]).fadeOut(settings.effectDelday);
        }

        currentIndex++;
        if (currentIndex >= elements.length) currentIndex = 0;


        if (navigator != null)
            $(navigator[currentIndex]).addClass('active');

        if (settings.effect == "fade") {
            $(elements[currentIndex]).fadeIn(settings.effectDelday);
        } else if (settings.effect == "scroll") {
            var target = -1 * currentIndex * settings.width;
            $(container).animate({ marginLeft: target }, settings.effectDelday);
        }
    }

    var cancelAuto = function() {
        $(obj).stopTime();
    }

    if ((navigator != null) && (navigator.length)) {
        navigator.each(function(index) {
            $(this).click(function() {
                cancelAuto();
                $(navigator[currentIndex]).removeClass('active');

                $(this).addClass('active');
                if (settings.effect == "fade") {
                    $(elements[currentIndex]).fadeOut(settings.effectDelday);
                } else if (settings.effect == "scroll") {
                }

                currentIndex = index;

                if (settings.effect == "fade") {
                    $(elements[currentIndex]).fadeIn(settings.effectDelday);
                } else if (settings.effect == "scroll") {
                    var target = -1 * currentIndex * settings.width;
                    $(container).animate({ marginLeft: target }, settings.effectDelday);
                }

                return false;
            });
        });
    }

    if (settings.previous) {
        settings.previous.click(function() {
            cancelAuto();

            $(navigator[currentIndex]).removeClass('active');
            if (settings.effect == "fade") {
                $(elements[currentIndex]).fadeOut(settings.effectDelday);
            } else if (settings.effect == "scroll") {
            }

            currentIndex--;
            if (currentIndex < 0) currentIndex = (elements.length - 1);

            $(navigator[currentIndex]).addClass('active');
            if (settings.effect == "fade") {
                $(elements[currentIndex]).fadeIn(settings.effectDelday);
            } else if (settings.effect == "scroll") {
                var target = -1 * currentIndex * settings.width;
                $(container).animate({ marginLeft: target }, settings.effectDelday);
            }

            return false;
        });
    }

    if (settings.next) {
        settings.next.click(function() {
            cancelAuto();

            $(navigator[currentIndex]).removeClass('active');
            if (settings.effect == "fade") {
                $(elements[currentIndex]).fadeOut(settings.effectDelday);
            } else if (settings.effect == "scroll") {
            }

            currentIndex++;
            if (currentIndex >= elements.length) currentIndex = 0;

            $(navigator[currentIndex]).addClass('active');
            if (settings.effect == "fade") {
                $(elements[currentIndex]).fadeIn(settings.effectDelday);
            } else if (settings.effect == "scroll") {
                var target = -1 * currentIndex * settings.width;
                $(container).animate({ marginLeft: target }, settings.effectDelday);
            }


            return false;
        });
    }
    
    if (settings.auto) {
        this.everyTime(settings.delay, "autoplay", auto);
    }
}
