/pack-rat/003_pack_rat/pack-rat/bower_components/bootstrap/js/scrollspy.js |
@@ -0,0 +1,172 @@ |
/* ======================================================================== |
* Bootstrap: scrollspy.js v3.3.7 |
* http://getbootstrap.com/javascript/#scrollspy |
* ======================================================================== |
* Copyright 2011-2016 Twitter, Inc. |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
* ======================================================================== */ |
|
|
+function ($) { |
'use strict'; |
|
// SCROLLSPY CLASS DEFINITION |
// ========================== |
|
function ScrollSpy(element, options) { |
this.$body = $(document.body) |
this.$scrollElement = $(element).is(document.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', $.proxy(this.process, this)) |
this.refresh() |
this.process() |
} |
|
ScrollSpy.VERSION = '3.3.7' |
|
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 that = this |
var offsetMethod = 'offset' |
var offsetBase = 0 |
|
this.offsets = [] |
this.targets = [] |
this.scrollHeight = this.getScrollHeight() |
|
if (!$.isWindow(this.$scrollElement[0])) { |
offsetMethod = 'position' |
offsetBase = this.$scrollElement.scrollTop() |
} |
|
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 () { |
that.offsets.push(this[0]) |
that.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]) { |
this.activeTarget = null |
return this.clear() |
} |
|
for (i = offsets.length; i--;) { |
activeTarget != targets[i] |
&& scrollTop >= offsets[i] |
&& (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) |
&& this.activate(targets[i]) |
} |
} |
|
ScrollSpy.prototype.activate = function (target) { |
this.activeTarget = target |
|
this.clear() |
|
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.prototype.clear = function () { |
$(this.selector) |
.parentsUntil(this.options.target, '.active') |
.removeClass('active') |
} |
|
|
// 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); |