| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | /* ============================================================= * bootstrap-scrollspy.js v2.3.2 * http://twitter.github.com/bootstrap/javascript.html#scrollspy * ============================================================= * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================== */!function ($) {  "use strict"; // jshint ;_; /* SCROLLSPY CLASS DEFINITION  * ========================== */  function ScrollSpy(element, options) {    var process = $.proxy(this.process, this)      , $element = $(element).is('body') ? $(window) : $(element)      , href    this.options = $.extend({}, $.fn.scrollspy.defaults, options)    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)    this.selector = (this.options.target      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7      || '') + ' .inav li > a'    this.$body = $('body')    this.refresh()    this.process()  }  ScrollSpy.prototype = {      constructor: ScrollSpy    , refresh: function () {        var self = this          , $targets        this.offsets = $([])        this.targets = $([])        $targets = this.$body          .find(this.selector)          .map(function () {            var $el = $(this)              , href = $el.data('target') || $el.attr('href')              , $href = /^#\w/.test(href) && $(href)            return ( $href              && $href.length              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null          })          .sort(function (a, b) { return a[0] - b[0] })          .each(function () {            self.offsets.push(this[0])            self.targets.push(this[1])          })      }    , process: function () {        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight          , maxScroll = scrollHeight - this.$scrollElement.height()          , offsets = this.offsets          , targets = this.targets          , activeTarget = this.activeTarget          , i        if (scrollTop >= maxScroll) {          return activeTarget != (i = targets.last()[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] )        }      }    , activate: function (target) {        var active          , selector        this.activeTarget = target        $(this.selector)          .parent('.active')          .removeClass('active')        selector = this.selector          + '[data-target="' + target + '"],'          + this.selector + '[href="' + target + '"]'        active = $(selector)          .parent('li')          .addClass('active')        if (active.parent('.dropdown-menu').length)  {          active = active.closest('li.dropdown').addClass('active')        }        active.trigger('activate')      }  } /* SCROLLSPY PLUGIN DEFINITION  * =========================== */  var old = $.fn.scrollspy  $.fn.scrollspy = function (option) {    return this.each(function () {      var $this = $(this)        , data = $this.data('scrollspy')        , options = typeof option == 'object' && option      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))      if (typeof option == 'string') data[option]()    })  }  $.fn.scrollspy.Constructor = ScrollSpy  $.fn.scrollspy.defaults = {    offset: 10  } /* SCROLLSPY NO CONFLICT  * ===================== */  $.fn.scrollspy.noConflict = function () {    $.fn.scrollspy = old    return this  } /* SCROLLSPY DATA-API  * ================== */  $(window).on('load', function () {    $('[data-spy="scroll"]').each(function () {      var $spy = $(this)      $spy.scrollspy($spy.data())    })  })}(window.jQuery);
 |