/*
 * simplyScroll 1.0.4 - a scroll-tastic jQuery plugin
 *
 * http://logicbox.net/jquery/simplyscroll
 * http://logicbox.net/blog/simplyscroll-jquery-plugin
 * http://plugins.jquery.com/project/simplyScroll
 *
 * Copyright (c) 2009 Will Kelly - http://logicbox.net
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Last revised: 03/07/2009 21:13
 *
 */
(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 : 'off', 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" style="margin-bottom:140px;margin-right:-357px;"><img src="images/aroow-right.gif"></div>').prepend('<div class="simply-scroll-back" style="margin-bottom:140px;margin-left:113px;"><img src="images/aroow-left.gif"></div>');*/
			this.$list.parent().parent().prepend('<div class="simply-scroll-back" style="margin-bottom:0px;"><img src="images/aroow-left.gif"></div>').prepend('<div class="simply-scroll-forward" style="margin-bottom:0px;margin-right:0px;"><img src="images/aroow-right.gif"></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')
            {
                var addItems = Math.ceil(this.clipMax / this.itemMax);
                this.$items.slice(0, addItems).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;
            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 + ' ' + 'disabled').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.resetPos();
                }
                else {
                    self.moveStop(self.movement);
                }
            },
            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.resetPos();
                }
                else {
                    self.moveStop(self.movement);
                }
            },
            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 {
                this.$clip[0].scrollLeft = 0;
            }
        },
        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);
