﻿(function($) {
    $.fn.scroller = function(options) {
        var timer = undefined;

        var presenter = {};
        presenter.parent = $(this).selector;
        presenter.slide = '.slide';
        presenter.slider = '.slides';
        presenter.arrowClass = 'arrow';
        presenter.leftArrowClass = 'left';
        presenter.rightArrowClass = 'right';
        presenter.activeArrowClass = 'active';
        presenter.waitTime = 8000;
        presenter.animationSpeed = 750;
        presenter.leftToRight = true;
        presenter.auto = true;
        presenter.manual = true;
        presenter.switchImage = function(goRight, addedTime) {
            goRight = goRight == undefined ? presenter.leftToRight : goRight;
            var self = this,
                    slides = $(self.slide, self.parent),
                    currentSlide = slides.filter(':eq(1)'),
                    slideToRotate = goRight ? slides.filter(':first') : slides.filter(':last'),
                    marginLeft = $(self.slider).css('margin-left'),
                    originalLeft = $(self.slider).css('margin-left'),
                    widthToMove = goRight ? 0 - $(self.slide).width() : $(self.slide).width(),
                    addedTime = (addedTime || 0) + self.waitTime;
            if (!$(self.slider).is(':animated')) {
                if (currentSlide.next(self.slide).length) {
                    marginLeft = (new Number(marginLeft.replace('px', '')) + widthToMove) + 'px';
                }
                $(self.slider).animate({
                    'margin-left': marginLeft
                }, self.animationSpeed, function() {
                    if (goRight) {
                        slideToRotate.appendTo($(self.slider));
                    } else {
                        slideToRotate.prependTo($(self.slider));
                    }
                    $(self.slider).css('margin-left', originalLeft);
                });

                self.updateTimeout(self.waitTime);
            }
        };
        presenter.setupSlides = function() {
            var self = this;
            $(self.slide, self.parent).filter(':last').prependTo($(self.slider));
            $(self.slider).css('margin-left', (-$(self.slide).width()) + 'px');
        };
        presenter.updateTimeout = function(addedTime) {
            var self = this;
            if (self.auto) {
                if (timer) {
                    clearTimeout(timer);
                }
                timer = setTimeout(function() {
                    self.switchImage();
                }, addedTime);
            }
        };
        presenter.setupArrows = function() {
            var self = this;
            var height = $(self.slide, self.parent).height();
            var arrows = $('<div /><div />').addClass(self.arrowClass).css({
                position: 'absolute',
                top: '0px',
                cursor: 'pointer',
                zIndex: 100,
                height: height,
                width: '100px'
            }).filter(':first').addClass(self.leftArrowClass).css('left', '0px').end()
                .filter(':last').addClass(self.rightArrowClass).css('right', '0px').end()
                .appendTo(self.parent);

            $('.' + self.arrowClass).live('mouseover mouseout', function(event) {
                if (event.type == 'mouseover') {
                    $(this).addClass(self.activeArrowClass);
                } else {
                    $(this).removeClass(self.activeArrowClass);
                }
            }).live('click', function(e) {
                e.stopPropagation();
                self.switchImage($(e.target).hasClass(self.rightArrowClass), self.waitTime);
            });
        };
        presenter.load = function() {
            var self = this;
            self.setupSlides();
            if (self.manual) {
                self.setupArrows();
            }
            self.updateTimeout(self.waitTime);
        };

        presenter = $.extend(presenter, options);

        presenter.load();

        return this;
    };
})(jQuery);
