jQuery.mscroll = {};

jQuery.mscroll.init = function (o, options) {
    var that = this;
    var obj = $(o);
    var ismove = false;
    var pm = 0; // Начальный margin (только положительный) (задает отрицательны левый(верхний) margin)
    var fw = 0; // Длинна всех настоящих блоков
    var w1 = 0; // Длинна одного блока

    var pause = false;

    this.move = function(s) {
        if (!ismove) {
            if (!s)
                s = options.speed;
            ismove = true;
            pm += w1;
            if (pm > fw) {
                pm -= fw;
                if (options.axis == 'hor')
                    obj.css('margin-left', (-1*pm+w1)+'px');
                else
                    obj.css('margin-top', (-1*pm+w1)+'px');
            }
            if (options.axis == 'hor') {
                obj.animate({marginLeft: (-1*pm)+'px'}, s, function() {
                    ismove = false;
                });
            } else {
                obj.animate({marginTop: (-1*pm)+'px'}, s, function() {
                    ismove = false;
                });
            }
        }
    }

    this.moveback = function(s) {
        if (!ismove) {
            if (!s)
                s = options.speed;
            ismove = true;
            pm -= w1;
            if (pm < 0) {
                pm += fw;
                if (options.axis == 'hor')
                    obj.css('margin-left', (-1*pm-w1)+'px');
                else
                    obj.css('margin-top', (-1*pm-w1)+'px');
            }
            if (options.axis == 'hor') {
                obj.animate({marginLeft: (-1*pm)+'px'}, s, function() {
                    ismove = false;
                });
            } else {
                obj.animate({marginTop: (-1*pm)+'px'}, s, function() {
                    ismove = false;
                });
            }
        }
    }

    this.pauseauto = function() {
        pause = true;
    }

    this.startauto = function() {
        pause = false;
    }

    this.setOptions = function(newOptions)
    {
        options = jQuery.extend(options, newOptions);
    }
    initOptions = {
        speed: 150,
        items: '#items',
        axis:  'hor',
        autoscroll: 45,
        inside: 'div'
    };

    options = jQuery.extend(initOptions, options);
    that.setOptions(options);

    obj.bind("mousewheel", function(e, delta){
        if (delta > 0) {
            that.moveback(options.speed/3);
        } else {
            that.move(options.speed/3);
        }
        return false;
    });

    obj.bind("mouseover", function() { that.pauseauto(); });
    obj.bind("mouseout",  function() { that.startauto(); });

    if (options.autoscroll > 0) {
        obj.everyTime(options.autoscroll, function(){
            if (!pause) {
                pm += 2;
                if (pm > fw) {
                    pm -= fw;
                }
                if (options.axis == 'hor')
                    obj.css('margin-left', (-1*pm+1)+'px');
                else
                    obj.css('margin-top', (-1*pm+1)+'px');
            }
        });
    }

    var fc = obj.find(options.inside+':first');
    if (options.axis == 'hor')
        w1 = fc.width()+(parseInt(fc.css('margin-left')) || 0)+(parseInt(fc.css('margin-right')) || 0)+(parseInt(fc.css('border-left-width')) || 0)+(parseInt(fc.css('border-right-width')) || 0);
    else
        w1 = fc.height()+(parseInt(fc.css('margin-top')) || 0)+(parseInt(fc.css('margin-bottom')) || 0)+(parseInt(fc.css('border-top-width')) || 0)+(parseInt(fc.css('border-bottom-width')) || 0)+(parseInt(fc.css('padding-bottom')) || 0)+(parseInt(fc.css('padding-top')) || 0);
    fw = w1*obj.find(options.inside).length;
//alert(w1);    
    obj.find(options.inside).each(function(){
            var cl = $(this).clone(true).appendTo(obj);
    });

}

jQuery.fn.mscroll = function (options) {
    options = options || {};

    this.each(function () {
        if (jQuery(this).data('mscroll'))
            jQuery(this).data('mscroll').setOptions(options);
        else {
            if (options.enable === undefined && options.disable === undefined)
                options.enable = true;

            jQuery(this).data('mscroll', new jQuery.mscroll.init(this, options));
        }
    });

    return this;
};

