﻿(function ($) {
    if (!$) {
        return false;
    }
    var defConfig = {
        trigger: 'mouseover',
        size: 1,
        continues: true,
        continuesEvent: 'mousedown,mouseover',
        cancelEvents: 'mouseout',
        mainCls: 'scroll-wrapper',
        upCls: 'scrollpage-up',
        downCls: 'scrollpage-down',
        speedTrigger: 'click',
        timespan: 5
    },
    guid = function () { return Math.random().toString().replace('.', '-') },
    divStr = '<div/>',
    pStr = '<p/>',
    aStr = '<a/>';

    function scrollpage(handle, option) {
        if (!(this instanceof scrollpage)) {
            return new scrollpage(handle, option);
        }
        var ran = guid(),
        currentHeight = handle.height(),
        clone = handle.clone().hide().appendTo('body'),
        realHeight = clone.css('height', 'auto').height(),
        config = $.extend({}, defConfig, option),
        scollContent = handle.children(),
        triggerOn = false,
        top = 0,
        up = false, speedUp = 2;

        clone.remove();

        handle.children().wrapAll('<div class="scroll-content-' + ran + '"/>');

        var content = $('.scroll-content-' + ran).width(handle.width()).height(handle.height()).css({
            overflow: 'hidden'
        }).addClass('scroll-content'),

        navigator = $(divStr).addClass('scroll-navigator'),

        upHandle = $('<a href="javascript:;" class="navigator-up">up</a>').appendTo(navigator),

        downHandle = $('<a href="javascript:;" class="navigator-down">down</a>').appendTo(navigator);

        content.after(navigator);

        content.add(navigator).wrapAll('<div class="scroll-' + ran + ' ' + config.mainCls + '"/>');

        upHandle.add(downHandle).bind(config.speedTrigger, function () {
            speedUp++;
        });

        content.scroll(function (e, o) {
            //debugger;
        });

        function scroll() {
            if (up) {
                top = top - config.size - speedUp;
                top = Math.max(0, top);
            } else {
                top = top + config.size + speedUp;
                top = Math.min(top, realHeight);
              if(top >= realHeight){
              	top = top +500;
              }
            }
            content.scrollTop(top);
            hideUpDown();

        }

        setInterval(function () {
            if (triggerOn) {
                scroll();
            }
        }, config.timespan);



        upHandle.bind(config.trigger, function (e) {
            if (config.continues) {
                triggerOn = true;
                up = true;
            } else {
                scroll();
            }
        }).bind(config.cancelEvents, function () {
            triggerOn = false;
            speedUp = 0;
        });

        downHandle.bind(config.trigger, function () {
            if (config.continues) {
                triggerOn = true;
                up = false;
            } else {
                scroll();
            }

        }).bind(config.cancelEvents, function () {
            triggerOn = false;
            speedUp = 0;
        });

        hideUpDown();

        function hideUpDown() {
            if (top == 0) {
                upHandle.hide();
            } else {
                upHandle.show();
            }

            if (top == realHeight || realHeight == currentHeight) {
                downHandle.hide();
            } else {
                downHandle.show();
            }
        }

        this.destory = function () {
            triggerOn = false;
        }
    }

    $.fn.scrollpage = function (option) {
        this.each(function () {
            var handle = $(this);
            handle.data('kooboo.scollpage', scrollpage(handle, option));
        });
        return this;
    }

})(jQuery);
