Upgrade bootstrap to 2.1
[contractdashboard.git] / js / bootstrap-scrollspy.js
blob:a/js/bootstrap-scrollspy.js -> blob:b/js/bootstrap-scrollspy.js
  /* =============================================================
  * bootstrap-scrollspy.js v2.1.0
  * 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
  || '') + ' .nav 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, 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
  * =========================== */
   
  $.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 DATA-API
  * ================== */
   
  $(window).on('load', function () {
  $('[data-spy="scroll"]').each(function () {
  var $spy = $(this)
  $spy.scrollspy($spy.data())
  })
  })
   
  }(window.jQuery);