| Index: experimental/webtry/res/webtry/js/bootstrap/scrollspy.js
|
| diff --git a/experimental/webtry/res/webtry/js/bootstrap/scrollspy.js b/experimental/webtry/res/webtry/js/bootstrap/scrollspy.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..db2378787e3d578c3b812ba73af42556e99bb0a5
|
| --- /dev/null
|
| +++ b/experimental/webtry/res/webtry/js/bootstrap/scrollspy.js
|
| @@ -0,0 +1,170 @@
|
| +/* ========================================================================
|
| + * Bootstrap: scrollspy.js v3.2.0
|
| + * http://getbootstrap.com/javascript/#scrollspy
|
| + * ========================================================================
|
| + * Copyright 2011-2014 Twitter, Inc.
|
| + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
| + * ======================================================================== */
|
| +
|
| +
|
| ++function ($) {
|
| + 'use strict';
|
| +
|
| + // SCROLLSPY CLASS DEFINITION
|
| + // ==========================
|
| +
|
| + function ScrollSpy(element, options) {
|
| + var process = $.proxy(this.process, this)
|
| +
|
| + this.$body = $('body')
|
| + this.$scrollElement = $(element).is('body') ? $(window) : $(element)
|
| + this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
|
| + this.selector = (this.options.target || '') + ' .nav li > a'
|
| + this.offsets = []
|
| + this.targets = []
|
| + this.activeTarget = null
|
| + this.scrollHeight = 0
|
| +
|
| + this.$scrollElement.on('scroll.bs.scrollspy', process)
|
| + this.refresh()
|
| + this.process()
|
| + }
|
| +
|
| + ScrollSpy.VERSION = '3.2.0'
|
| +
|
| + ScrollSpy.DEFAULTS = {
|
| + offset: 10
|
| + }
|
| +
|
| + ScrollSpy.prototype.getScrollHeight = function () {
|
| + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
|
| + }
|
| +
|
| + ScrollSpy.prototype.refresh = function () {
|
| + var offsetMethod = 'offset'
|
| + var offsetBase = 0
|
| +
|
| + if (!$.isWindow(this.$scrollElement[0])) {
|
| + offsetMethod = 'position'
|
| + offsetBase = this.$scrollElement.scrollTop()
|
| + }
|
| +
|
| + this.offsets = []
|
| + this.targets = []
|
| + this.scrollHeight = this.getScrollHeight()
|
| +
|
| + var self = this
|
| +
|
| + this.$body
|
| + .find(this.selector)
|
| + .map(function () {
|
| + var $el = $(this)
|
| + var href = $el.data('target') || $el.attr('href')
|
| + var $href = /^#./.test(href) && $(href)
|
| +
|
| + return ($href
|
| + && $href.length
|
| + && $href.is(':visible')
|
| + && [[$href[offsetMethod]().top + offsetBase, href]]) || null
|
| + })
|
| + .sort(function (a, b) { return a[0] - b[0] })
|
| + .each(function () {
|
| + self.offsets.push(this[0])
|
| + self.targets.push(this[1])
|
| + })
|
| + }
|
| +
|
| + ScrollSpy.prototype.process = function () {
|
| + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
|
| + var scrollHeight = this.getScrollHeight()
|
| + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
|
| + var offsets = this.offsets
|
| + var targets = this.targets
|
| + var activeTarget = this.activeTarget
|
| + var i
|
| +
|
| + if (this.scrollHeight != scrollHeight) {
|
| + this.refresh()
|
| + }
|
| +
|
| + if (scrollTop >= maxScroll) {
|
| + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
|
| + }
|
| +
|
| + if (activeTarget && scrollTop <= offsets[0]) {
|
| + return activeTarget != (i = targets[0]) && this.activate(i)
|
| + }
|
| +
|
| + for (i = offsets.length; i--;) {
|
| + activeTarget != targets[i]
|
| + && scrollTop >= offsets[i]
|
| + && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
|
| + && this.activate(targets[i])
|
| + }
|
| + }
|
| +
|
| + ScrollSpy.prototype.activate = function (target) {
|
| + this.activeTarget = target
|
| +
|
| + $(this.selector)
|
| + .parentsUntil(this.options.target, '.active')
|
| + .removeClass('active')
|
| +
|
| + var selector = this.selector +
|
| + '[data-target="' + target + '"],' +
|
| + this.selector + '[href="' + target + '"]'
|
| +
|
| + var active = $(selector)
|
| + .parents('li')
|
| + .addClass('active')
|
| +
|
| + if (active.parent('.dropdown-menu').length) {
|
| + active = active
|
| + .closest('li.dropdown')
|
| + .addClass('active')
|
| + }
|
| +
|
| + active.trigger('activate.bs.scrollspy')
|
| + }
|
| +
|
| +
|
| + // SCROLLSPY PLUGIN DEFINITION
|
| + // ===========================
|
| +
|
| + function Plugin(option) {
|
| + return this.each(function () {
|
| + var $this = $(this)
|
| + var data = $this.data('bs.scrollspy')
|
| + var options = typeof option == 'object' && option
|
| +
|
| + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
|
| + if (typeof option == 'string') data[option]()
|
| + })
|
| + }
|
| +
|
| + var old = $.fn.scrollspy
|
| +
|
| + $.fn.scrollspy = Plugin
|
| + $.fn.scrollspy.Constructor = ScrollSpy
|
| +
|
| +
|
| + // SCROLLSPY NO CONFLICT
|
| + // =====================
|
| +
|
| + $.fn.scrollspy.noConflict = function () {
|
| + $.fn.scrollspy = old
|
| + return this
|
| + }
|
| +
|
| +
|
| + // SCROLLSPY DATA-API
|
| + // ==================
|
| +
|
| + $(window).on('load.bs.scrollspy.data-api', function () {
|
| + $('[data-spy="scroll"]').each(function () {
|
| + var $spy = $(this)
|
| + Plugin.call($spy, $spy.data())
|
| + })
|
| + })
|
| +
|
| +}(jQuery);
|
|
|