(function ($) {
    $.fn.simplyScroll = function (o) {
        return this.each(function () {
            new $.simplyScroll(this, o);
        });
    };
    var defaults = {
        className: 'simply-scroll',
        frameRate: 24,
        speed: 1,
        horizontal: true,
        autoMode: 'bounce',
        pauseOnHover: true,
        startOnLoad: false,
        localJsonSource: '',
        flickrFeed: '',
        jsonImgWidth: 240,
        jsonImgHeight: 180
    };
    $.simplyScroll = function (el, o) {
        var self = this;
        this.o = $.extend({}, defaults, o || {});
        this.auto = this.o.autoMode !== "off" ? true : false;
        this.$list = $(el);
        this.$list.addClass('simply-scroll-list').wrap('<div class="simply-scroll-clip"></div>').parent().wrap('<div class="' + this.o.className + ' simply-scroll-container"></div>');
        if (!this.o.auto) {
            this.$list.parent().parent().prepend('<div class="simply-scroll-forward"></div>').prepend('<div class="simply-scroll-back"></div>');
        }
        if (this.o.flickrFeed) {
            $.getJSON(this.o.flickrFeed + "&format=json&jsoncallback=?", function (data) {
                json = [];
                $.each(data.items, function (i, item) {
                    json.push({
                        "src": item.media.m,
                        "title": item.title,
                        "link": item.link
                    });
                });
                self.renderData(json);
            });
        } else if (this.o.localJsonSource) {
            $.getJSON(this.o.localJsonSource, function (json) {
                self.renderData(json);
            });
        } else {
            if (!this.o.startOnLoad) {
                this.init();
            } else {
                $(window).load(function () {
                    self.init();
                });
            }
        }
    };
    $.simplyScroll.fn = $.simplyScroll.prototype = {};
    $.simplyScroll.fn.extend = $.simplyScroll.extend = $.extend;
    $.simplyScroll.fn.extend({
        init: function () {
            this.$items = this.$list.children();
            this.$clip = this.$list.parent();
            this.$container = this.$clip.parent();
            if (!this.o.horizontal) {
                this.itemMax = this.$items[0].offsetHeight;
                this.clipMax = this.$clip.height();
                this.dimension = 'height';
                this.moveBackClass = 'simply-scroll-btn-up';
                this.moveForwardClass = 'simply-scroll-btn-down';
            } else {
                this.itemMax = this.$items[0].offsetWidth;
                this.clipMax = this.$clip.width();
                this.dimension = 'width';
                this.moveBackClass = 'simply-scroll-btn-left';
                this.moveForwardClass = 'simply-scroll-btn-right';
            }
            this.posMin = 0;
            this.posMax = this.$items.length * this.itemMax;
            this.$list.css(this.dimension, this.posMax + 'px');
            if ((this.o.autoMode == 'loop') || (this.o.autoMode == 'off')) {
                //sichtbarer bereich / bildBreite
                var addItems = Math.ceil(this.clipMax / this.itemMax);
                this.$items.slice(0, this.$items.length).clone(true).appendTo(this.$list);
                this.$items.slice(0, this.$items.length).clone(true).appendTo(this.$list);
                this.posMax += (this.clipMax - this.o.speed);
                this.$list.css(this.dimension, this.posMax + (this.itemMax * addItems) + 'px');
            }
            this.interval = null;
            this.intervalDelay = Math.floor(1000 / this.o.frameRate);
            while (this.itemMax % this.o.speed !== 0) {
                this.o.speed--;
                if (this.o.speed === 0) {
                    this.o.speed = 1;
                    break;
                }
            }
            var self = this;
            // Angepasste stelle: (evtl. gar nicht zu gebrauchen, deshalb auskommentiert)
            // Die positionierung des ausgangsbildes muss um die anzahl der zusätzlicher bilder nach links korrigiert werden
            var countAddPict = (this.$items.length - (Math.ceil(this.clipMax/this.itemMax)));
            var scrollLeft = 0;
            if(countAddPict == 0){
                scrollLeft = this.clipMax;
            } else {
                scrollLeft = this.clipMax + this.itemMax * countAddPict;
            }
            this.$clip[0].scrollLeft = scrollLeft;
            this.trigger = null;
            this.funcMoveBack = function () {
                self.trigger = this;
                self.moveBack();
            };
            this.funcMoveForward = function () {
                self.trigger = this;
                self.moveForward();
            };
            this.funcMoveStop = function () {
                self.moveStop();
            };
            this.funcMoveResume = function () {
                self.moveResume();
            };
            if (this.auto) {
                if (this.o.pauseOnHover) {
                    this.$clip.hover(this.funcMoveStop, this.funcMoveResume);
                }
                this.moveForward();
            } else {
                this.$btnBack = $('.simply-scroll-back', this.$container).addClass('simply-scroll-btn' + ' ' + this.moveBackClass + ' ').hover(this.funcMoveBack, this.funcMoveStop);
                this.$btnForward = $('.simply-scroll-forward', this.$container).addClass('simply-scroll-btn' + ' ' + this.moveForwardClass).hover(this.funcMoveForward, this.funcMoveStop);
            }
        },
        moveForward: function () {
            var self = this;
            this.movement = 'forward';
            if (this.trigger !== null) {
                this.$btnBack.removeClass('disabled');
            }
            self.interval = setInterval(function () {
                if (!self.o.horizontal && self.$clip[0].scrollTop < (self.posMax - self.clipMax)) {
                    self.$clip[0].scrollTop += self.o.speed;
                } else if (self.o.horizontal && self.$clip[0].scrollLeft < (self.posMax - self.clipMax)) {
                    self.$clip[0].scrollLeft += self.o.speed;
                } else if ((self.o.autoMode == 'loop') || (self.o.autoMode == 'off')) {
                    self.resetPos("right");
                } else {}
            }, self.intervalDelay);
        },
        moveBack: function () {
            var self = this;
            this.movement = 'back';
            if (this.trigger !== null) {
                this.$btnForward.removeClass('disabled');
            }
            self.interval = setInterval(function () {
                if (!self.o.horizontal && self.$clip[0].scrollTop > 0) {
                    self.$clip[0].scrollTop -= self.o.speed;
                } else if (self.o.horizontal && self.$clip[0].scrollLeft > 0) {
                    self.$clip[0].scrollLeft -= self.o.speed;
                } else if ((self.o.autoMode == 'loop') || (self.o.autoMode == "off")) {
                    self.resetPos("left");
                } else {}
            }, self.intervalDelay);
        },
        moveStop: function (moveDir) {
            clearInterval(this.interval);
            if (this.trigger !== null) {
                if (typeof moveDir != "undefined") {
                    $(this.trigger).addClass('disabled');
                }
                this.trigger = null;
            }
            if (this.auto) {
                if (this.o.autoMode == 'bounce') {
                    moveDir == 'forward' ? this.moveBack() : this.moveForward();
                }
            }
        },
        moveResume: function () {
            this.movement == 'forward' ? this.moveForward() : this.moveBack();
        },
        resetPos: function () {
            if (!this.o.horizontal) {
                this.$clip[0].scrollTop = 0;
            } else {
                if (this.movement == 'forward') {
                    this.$clip[0].scrollLeft = 0;
                }
                else {
                    // Angepasste stelle:
                    // Die positionierung des ausgangsbildes muss um die anzahl der zusätzlicher bilder nach links korrigiert werden
                    var countAddPict = (this.$items.length - (Math.ceil(this.clipMax/this.itemMax)));
                    var scrollLeft = 0;
                    if(countAddPict == 0){
                        scrollLeft = this.clipMax;
                    } else {
                        scrollLeft = this.clipMax + this.itemMax * countAddPict;
                    }
                    this.$clip[0].scrollLeft = scrollLeft;
                }
            }
        },
        renderData: function (json) {
            if (json.length > 0) {
                var self = this;
                $.each(json, function (i, item) {
                    $("<img/>").attr({
                        src: item.src,
                        title: item.title,
                        alt: item.title,
                        width: self.o.jsonImgWidth,
                        height: self.o.jsonImgHeight
                    }).appendTo(self.$list);
                });
                this.init();
            }
        }
    });
})(jQuery);