753 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			753 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/*! nanoScrollerJS - v0.7.2
 | 
						|
* http://jamesflorentino.github.com/nanoScrollerJS/
 | 
						|
* Copyright (c) 2013 James Florentino; Licensed MIT */
 | 
						|
 | 
						|
 | 
						|
(function($, window, document) {
 | 
						|
  "use strict";
 | 
						|
 | 
						|
  var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, defaults, getBrowserScrollbarWidth;
 | 
						|
  defaults = {
 | 
						|
    /**
 | 
						|
      a classname for the pane element.
 | 
						|
      @property paneClass
 | 
						|
      @type String
 | 
						|
      @default 'pane'
 | 
						|
    */
 | 
						|
 | 
						|
    paneClass: 'pane',
 | 
						|
    /**
 | 
						|
      a classname for the slider element.
 | 
						|
      @property sliderClass
 | 
						|
      @type String
 | 
						|
      @default 'slider'
 | 
						|
    */
 | 
						|
 | 
						|
    sliderClass: 'slider',
 | 
						|
    /**
 | 
						|
      a classname for the content element.
 | 
						|
      @property contentClass
 | 
						|
      @type String
 | 
						|
      @default 'content'
 | 
						|
    */
 | 
						|
 | 
						|
    contentClass: 'content',
 | 
						|
    /**
 | 
						|
      a setting to enable native scrolling in iOS devices.
 | 
						|
      @property iOSNativeScrolling
 | 
						|
      @type Boolean
 | 
						|
      @default false
 | 
						|
    */
 | 
						|
 | 
						|
    iOSNativeScrolling: false,
 | 
						|
    /**
 | 
						|
      a setting to prevent the rest of the page being
 | 
						|
      scrolled when user scrolls the `.content` element.
 | 
						|
      @property preventPageScrolling
 | 
						|
      @type Boolean
 | 
						|
      @default false
 | 
						|
    */
 | 
						|
 | 
						|
    preventPageScrolling: false,
 | 
						|
    /**
 | 
						|
      a setting to disable binding to the resize event.
 | 
						|
      @property disableResize
 | 
						|
      @type Boolean
 | 
						|
      @default false
 | 
						|
    */
 | 
						|
 | 
						|
    disableResize: false,
 | 
						|
    /**
 | 
						|
      a setting to make the scrollbar always visible.
 | 
						|
      @property alwaysVisible
 | 
						|
      @type Boolean
 | 
						|
      @default false
 | 
						|
    */
 | 
						|
 | 
						|
    alwaysVisible: false,
 | 
						|
    /**
 | 
						|
      a default timeout for the `flash()` method.
 | 
						|
      @property flashDelay
 | 
						|
      @type Number
 | 
						|
      @default 1500
 | 
						|
    */
 | 
						|
 | 
						|
    flashDelay: 1500,
 | 
						|
    /**
 | 
						|
      a minimum height for the `.slider` element.
 | 
						|
      @property sliderMinHeight
 | 
						|
      @type Number
 | 
						|
      @default 20
 | 
						|
    */
 | 
						|
 | 
						|
    sliderMinHeight: 20,
 | 
						|
    /**
 | 
						|
      a maximum height for the `.slider` element.
 | 
						|
      @property sliderMaxHeight
 | 
						|
      @type Number
 | 
						|
      @default null
 | 
						|
    */
 | 
						|
 | 
						|
    sliderMaxHeight: null
 | 
						|
  };
 | 
						|
  /**
 | 
						|
    @property SCROLLBAR
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  SCROLLBAR = 'scrollbar';
 | 
						|
  /**
 | 
						|
    @property SCROLL
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  SCROLL = 'scroll';
 | 
						|
  /**
 | 
						|
    @property MOUSEDOWN
 | 
						|
    @type String
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  MOUSEDOWN = 'mousedown';
 | 
						|
  /**
 | 
						|
    @property MOUSEMOVE
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  MOUSEMOVE = 'mousemove';
 | 
						|
  /**
 | 
						|
    @property MOUSEWHEEL
 | 
						|
    @type String
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  MOUSEWHEEL = 'mousewheel';
 | 
						|
  /**
 | 
						|
    @property MOUSEUP
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  MOUSEUP = 'mouseup';
 | 
						|
  /**
 | 
						|
    @property RESIZE
 | 
						|
    @type String
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  RESIZE = 'resize';
 | 
						|
  /**
 | 
						|
    @property DRAG
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  DRAG = 'drag';
 | 
						|
  /**
 | 
						|
    @property UP
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  UP = 'up';
 | 
						|
  /**
 | 
						|
    @property PANEDOWN
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  PANEDOWN = 'panedown';
 | 
						|
  /**
 | 
						|
    @property DOMSCROLL
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  DOMSCROLL = 'DOMMouseScroll';
 | 
						|
  /**
 | 
						|
    @property DOWN
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  DOWN = 'down';
 | 
						|
  /**
 | 
						|
    @property WHEEL
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  WHEEL = 'wheel';
 | 
						|
  /**
 | 
						|
    @property KEYDOWN
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  KEYDOWN = 'keydown';
 | 
						|
  /**
 | 
						|
    @property KEYUP
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  KEYUP = 'keyup';
 | 
						|
  /**
 | 
						|
    @property TOUCHMOVE
 | 
						|
    @type String
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  TOUCHMOVE = 'touchmove';
 | 
						|
  /**
 | 
						|
    @property BROWSER_IS_IE7
 | 
						|
    @type Boolean
 | 
						|
    @static
 | 
						|
    @final
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject;
 | 
						|
  /**
 | 
						|
    @property BROWSER_SCROLLBAR_WIDTH
 | 
						|
    @type Number
 | 
						|
    @static
 | 
						|
    @default null
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  BROWSER_SCROLLBAR_WIDTH = null;
 | 
						|
  /**
 | 
						|
    Returns browser's native scrollbar width
 | 
						|
    @method getBrowserScrollbarWidth
 | 
						|
    @return {Number} the scrollbar width in pixels
 | 
						|
    @static
 | 
						|
    @private
 | 
						|
  */
 | 
						|
 | 
						|
  getBrowserScrollbarWidth = function() {
 | 
						|
    var outer, outerStyle, scrollbarWidth;
 | 
						|
    outer = document.createElement('div');
 | 
						|
    outerStyle = outer.style;
 | 
						|
    outerStyle.position = 'absolute';
 | 
						|
    outerStyle.width = '100px';
 | 
						|
    outerStyle.height = '100px';
 | 
						|
    outerStyle.overflow = SCROLL;
 | 
						|
    outerStyle.top = '-9999px';
 | 
						|
    document.body.appendChild(outer);
 | 
						|
    scrollbarWidth = outer.offsetWidth - outer.clientWidth;
 | 
						|
    document.body.removeChild(outer);
 | 
						|
    return scrollbarWidth;
 | 
						|
  };
 | 
						|
  /**
 | 
						|
    @class NanoScroll
 | 
						|
    @param element {HTMLElement|Node} the main element
 | 
						|
    @param options {Object} nanoScroller's options
 | 
						|
    @constructor
 | 
						|
  */
 | 
						|
 | 
						|
  NanoScroll = (function() {
 | 
						|
 | 
						|
    function NanoScroll(el, options) {
 | 
						|
      this.el = el;
 | 
						|
      this.options = options;
 | 
						|
      BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth());
 | 
						|
      this.$el = $(this.el);
 | 
						|
      this.doc = $(document);
 | 
						|
      this.win = $(window);
 | 
						|
      this.$content = this.$el.children("." + options.contentClass);
 | 
						|
      this.$content.attr('tabindex', 0);
 | 
						|
      this.content = this.$content[0];
 | 
						|
      if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) {
 | 
						|
        this.nativeScrolling();
 | 
						|
      } else {
 | 
						|
        this.generate();
 | 
						|
      }
 | 
						|
      this.createEvents();
 | 
						|
      this.addEvents();
 | 
						|
      this.reset();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
      Prevents the rest of the page being scrolled
 | 
						|
      when user scrolls the `.content` element.
 | 
						|
      @method preventScrolling
 | 
						|
      @param event {Event}
 | 
						|
      @param direction {String} Scroll direction (up or down)
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.preventScrolling = function(e, direction) {
 | 
						|
      if (!this.isActive) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      if (e.type === DOMSCROLL) {
 | 
						|
        if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) {
 | 
						|
          e.preventDefault();
 | 
						|
        }
 | 
						|
      } else if (e.type === MOUSEWHEEL) {
 | 
						|
        if (!e.originalEvent || !e.originalEvent.wheelDelta) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
        if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) {
 | 
						|
          e.preventDefault();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Enable iOS native scrolling
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.nativeScrolling = function() {
 | 
						|
      this.$content.css({
 | 
						|
        WebkitOverflowScrolling: 'touch'
 | 
						|
      });
 | 
						|
      this.iOSNativeScrolling = true;
 | 
						|
      this.isActive = true;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Updates those nanoScroller properties that
 | 
						|
      are related to current scrollbar position.
 | 
						|
      @method updateScrollValues
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.updateScrollValues = function() {
 | 
						|
      var content;
 | 
						|
      content = this.content;
 | 
						|
      this.maxScrollTop = content.scrollHeight - content.clientHeight;
 | 
						|
      this.contentScrollTop = content.scrollTop;
 | 
						|
      if (!this.iOSNativeScrolling) {
 | 
						|
        this.maxSliderTop = this.paneHeight - this.sliderHeight;
 | 
						|
        this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop;
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Creates event related methods
 | 
						|
      @method createEvents
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.createEvents = function() {
 | 
						|
      var _this = this;
 | 
						|
      this.events = {
 | 
						|
        down: function(e) {
 | 
						|
          _this.isBeingDragged = true;
 | 
						|
          _this.offsetY = e.pageY - _this.slider.offset().top;
 | 
						|
          _this.pane.addClass('active');
 | 
						|
          _this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]);
 | 
						|
          return false;
 | 
						|
        },
 | 
						|
        drag: function(e) {
 | 
						|
          _this.sliderY = e.pageY - _this.$el.offset().top - _this.offsetY;
 | 
						|
          _this.scroll();
 | 
						|
          _this.updateScrollValues();
 | 
						|
          if (_this.contentScrollTop >= _this.maxScrollTop) {
 | 
						|
            _this.$el.trigger('scrollend');
 | 
						|
          } else if (_this.contentScrollTop === 0) {
 | 
						|
            _this.$el.trigger('scrolltop');
 | 
						|
          }
 | 
						|
          return false;
 | 
						|
        },
 | 
						|
        up: function(e) {
 | 
						|
          _this.isBeingDragged = false;
 | 
						|
          _this.pane.removeClass('active');
 | 
						|
          _this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]);
 | 
						|
          return false;
 | 
						|
        },
 | 
						|
        resize: function(e) {
 | 
						|
          _this.reset();
 | 
						|
        },
 | 
						|
        panedown: function(e) {
 | 
						|
          _this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5);
 | 
						|
          _this.scroll();
 | 
						|
          _this.events.down(e);
 | 
						|
          return false;
 | 
						|
        },
 | 
						|
        scroll: function(e) {
 | 
						|
          if (_this.isBeingDragged) {
 | 
						|
            return;
 | 
						|
          }
 | 
						|
          _this.updateScrollValues();
 | 
						|
          if (!_this.iOSNativeScrolling) {
 | 
						|
            _this.sliderY = _this.sliderTop;
 | 
						|
            _this.slider.css({
 | 
						|
              top: _this.sliderTop
 | 
						|
            });
 | 
						|
          }
 | 
						|
          if (e == null) {
 | 
						|
            return;
 | 
						|
          }
 | 
						|
          if (_this.contentScrollTop >= _this.maxScrollTop) {
 | 
						|
            if (_this.options.preventPageScrolling) {
 | 
						|
              _this.preventScrolling(e, DOWN);
 | 
						|
            }
 | 
						|
            _this.$el.trigger('scrollend');
 | 
						|
          } else if (_this.contentScrollTop === 0) {
 | 
						|
            if (_this.options.preventPageScrolling) {
 | 
						|
              _this.preventScrolling(e, UP);
 | 
						|
            }
 | 
						|
            _this.$el.trigger('scrolltop');
 | 
						|
          }
 | 
						|
        },
 | 
						|
        wheel: function(e) {
 | 
						|
          if (e == null) {
 | 
						|
            return;
 | 
						|
          }
 | 
						|
          _this.sliderY += -e.wheelDeltaY || -e.delta;
 | 
						|
          _this.scroll();
 | 
						|
          return false;
 | 
						|
        }
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Adds event listeners with jQuery.
 | 
						|
      @method addEvents
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.addEvents = function() {
 | 
						|
      var events;
 | 
						|
      this.removeEvents();
 | 
						|
      events = this.events;
 | 
						|
      if (!this.options.disableResize) {
 | 
						|
        this.win.bind(RESIZE, events[RESIZE]);
 | 
						|
      }
 | 
						|
      if (!this.iOSNativeScrolling) {
 | 
						|
        this.slider.bind(MOUSEDOWN, events[DOWN]);
 | 
						|
        this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]);
 | 
						|
      }
 | 
						|
      this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Removes event listeners with jQuery.
 | 
						|
      @method removeEvents
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.removeEvents = function() {
 | 
						|
      var events;
 | 
						|
      events = this.events;
 | 
						|
      this.win.unbind(RESIZE, events[RESIZE]);
 | 
						|
      if (!this.iOSNativeScrolling) {
 | 
						|
        this.slider.unbind();
 | 
						|
        this.pane.unbind();
 | 
						|
      }
 | 
						|
      this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Generates nanoScroller's scrollbar and elements for it.
 | 
						|
      @method generate
 | 
						|
      @chainable
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.generate = function() {
 | 
						|
      var contentClass, cssRule, options, paneClass, sliderClass;
 | 
						|
      options = this.options;
 | 
						|
      paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass;
 | 
						|
      if (!this.$el.find("" + paneClass).length && !this.$el.find("" + sliderClass).length) {
 | 
						|
        this.$el.append("<div class=\"" + paneClass + "\"><div class=\"" + sliderClass + "\" /></div>");
 | 
						|
      }
 | 
						|
      this.pane = this.$el.children("." + paneClass);
 | 
						|
      this.slider = this.pane.find("." + sliderClass);
 | 
						|
      if (BROWSER_SCROLLBAR_WIDTH) {
 | 
						|
        cssRule = this.$el.css('direction') === 'rtl' ? {
 | 
						|
          left: -BROWSER_SCROLLBAR_WIDTH
 | 
						|
        } : {
 | 
						|
          right: -BROWSER_SCROLLBAR_WIDTH
 | 
						|
        };
 | 
						|
        this.$el.addClass('has-scrollbar');
 | 
						|
      }
 | 
						|
      if (cssRule != null) {
 | 
						|
        this.$content.css(cssRule);
 | 
						|
      }
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      @method restore
 | 
						|
      @private
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.restore = function() {
 | 
						|
      this.stopped = false;
 | 
						|
      this.pane.show();
 | 
						|
      this.addEvents();
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Resets nanoScroller's scrollbar.
 | 
						|
      @method reset
 | 
						|
      @chainable
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller();
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.reset = function() {
 | 
						|
      var content, contentHeight, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, sliderHeight;
 | 
						|
      if (this.iOSNativeScrolling) {
 | 
						|
        this.contentHeight = this.content.scrollHeight;
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      if (!this.$el.find("." + this.options.paneClass).length) {
 | 
						|
        this.generate().stop();
 | 
						|
      }
 | 
						|
      if (this.stopped) {
 | 
						|
        this.restore();
 | 
						|
      }
 | 
						|
      content = this.content;
 | 
						|
      contentStyle = content.style;
 | 
						|
      contentStyleOverflowY = contentStyle.overflowY;
 | 
						|
      if (BROWSER_IS_IE7) {
 | 
						|
        this.$content.css({
 | 
						|
          height: this.$content.height()
 | 
						|
        });
 | 
						|
      }
 | 
						|
      contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH;
 | 
						|
      paneHeight = this.pane.outerHeight();
 | 
						|
      paneTop = parseInt(this.pane.css('top'), 10);
 | 
						|
      paneBottom = parseInt(this.pane.css('bottom'), 10);
 | 
						|
      paneOuterHeight = paneHeight + paneTop + paneBottom;
 | 
						|
      sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight);
 | 
						|
      if (sliderHeight < this.options.sliderMinHeight) {
 | 
						|
        sliderHeight = this.options.sliderMinHeight;
 | 
						|
      } else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) {
 | 
						|
        sliderHeight = this.options.sliderMaxHeight;
 | 
						|
      }
 | 
						|
      if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) {
 | 
						|
        sliderHeight += BROWSER_SCROLLBAR_WIDTH;
 | 
						|
      }
 | 
						|
      this.maxSliderTop = paneOuterHeight - sliderHeight;
 | 
						|
      this.contentHeight = contentHeight;
 | 
						|
      this.paneHeight = paneHeight;
 | 
						|
      this.paneOuterHeight = paneOuterHeight;
 | 
						|
      this.sliderHeight = sliderHeight;
 | 
						|
      this.slider.height(sliderHeight);
 | 
						|
      this.events.scroll();
 | 
						|
      this.pane.show();
 | 
						|
      this.isActive = true;
 | 
						|
      if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) {
 | 
						|
        this.pane.hide();
 | 
						|
        this.isActive = false;
 | 
						|
      } else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) {
 | 
						|
        this.slider.hide();
 | 
						|
      } else {
 | 
						|
        this.slider.show();
 | 
						|
      }
 | 
						|
      this.pane.css({
 | 
						|
        opacity: (this.options.alwaysVisible ? 1 : ''),
 | 
						|
        visibility: (this.options.alwaysVisible ? 'visible' : '')
 | 
						|
      });
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      @method scroll
 | 
						|
      @private
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller({ scroll: 'top' });
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.scroll = function() {
 | 
						|
      if (!this.isActive) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      this.sliderY = Math.max(0, this.sliderY);
 | 
						|
      this.sliderY = Math.min(this.maxSliderTop, this.sliderY);
 | 
						|
      this.$content.scrollTop((this.paneHeight - this.contentHeight + BROWSER_SCROLLBAR_WIDTH) * this.sliderY / this.maxSliderTop * -1);
 | 
						|
      if (!this.iOSNativeScrolling) {
 | 
						|
        this.slider.css({
 | 
						|
          top: this.sliderY
 | 
						|
        });
 | 
						|
      }
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Scroll at the bottom with an offset value
 | 
						|
      @method scrollBottom
 | 
						|
      @param offsetY {Number}
 | 
						|
      @chainable
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller({ scrollBottom: value });
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.scrollBottom = function(offsetY) {
 | 
						|
      if (!this.isActive) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      this.reset();
 | 
						|
      this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL);
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Scroll at the top with an offset value
 | 
						|
      @method scrollTop
 | 
						|
      @param offsetY {Number}
 | 
						|
      @chainable
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller({ scrollTop: value });
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.scrollTop = function(offsetY) {
 | 
						|
      if (!this.isActive) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      this.reset();
 | 
						|
      this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL);
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      Scroll to an element
 | 
						|
      @method scrollTo
 | 
						|
      @param node {Node} A node to scroll to.
 | 
						|
      @chainable
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller({ scrollTo: $('#a_node') });
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.scrollTo = function(node) {
 | 
						|
      if (!this.isActive) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      this.reset();
 | 
						|
      this.scrollTop($(node).get(0).offsetTop);
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      To stop the operation.
 | 
						|
      This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI.
 | 
						|
      @method stop
 | 
						|
      @chainable
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller({ stop: true });
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.stop = function() {
 | 
						|
      this.stopped = true;
 | 
						|
      this.removeEvents();
 | 
						|
      this.pane.hide();
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
      To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s).
 | 
						|
      Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him.
 | 
						|
      @method flash
 | 
						|
      @chainable
 | 
						|
      @example
 | 
						|
          $(".nano").nanoScroller({ flash: true });
 | 
						|
    */
 | 
						|
 | 
						|
 | 
						|
    NanoScroll.prototype.flash = function() {
 | 
						|
      var _this = this;
 | 
						|
      if (!this.isActive) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      this.reset();
 | 
						|
      this.pane.addClass('flashed');
 | 
						|
      setTimeout(function() {
 | 
						|
        _this.pane.removeClass('flashed');
 | 
						|
      }, this.options.flashDelay);
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
 | 
						|
    return NanoScroll;
 | 
						|
 | 
						|
  })();
 | 
						|
  $.fn.nanoScroller = function(settings) {
 | 
						|
    return this.each(function() {
 | 
						|
      var options, scrollbar;
 | 
						|
      if (!(scrollbar = this.nanoscroller)) {
 | 
						|
        options = $.extend({}, defaults, settings);
 | 
						|
        this.nanoscroller = scrollbar = new NanoScroll(this, options);
 | 
						|
      }
 | 
						|
      if (settings && typeof settings === "object") {
 | 
						|
        $.extend(scrollbar.options, settings);
 | 
						|
        if (settings.scrollBottom) {
 | 
						|
          return scrollbar.scrollBottom(settings.scrollBottom);
 | 
						|
        }
 | 
						|
        if (settings.scrollTop) {
 | 
						|
          return scrollbar.scrollTop(settings.scrollTop);
 | 
						|
        }
 | 
						|
        if (settings.scrollTo) {
 | 
						|
          return scrollbar.scrollTo(settings.scrollTo);
 | 
						|
        }
 | 
						|
        if (settings.scroll === 'bottom') {
 | 
						|
          return scrollbar.scrollBottom(0);
 | 
						|
        }
 | 
						|
        if (settings.scroll === 'top') {
 | 
						|
          return scrollbar.scrollTop(0);
 | 
						|
        }
 | 
						|
        if (settings.scroll && settings.scroll instanceof $) {
 | 
						|
          return scrollbar.scrollTo(settings.scroll);
 | 
						|
        }
 | 
						|
        if (settings.stop) {
 | 
						|
          return scrollbar.stop();
 | 
						|
        }
 | 
						|
        if (settings.flash) {
 | 
						|
          return scrollbar.flash();
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return scrollbar.reset();
 | 
						|
    });
 | 
						|
  };
 | 
						|
})(jQuery, window, document);
 |