twitter-bootstrap-rails 3.2.0 → 3.2.1.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of twitter-bootstrap-rails might be problematic. Click here for more details.

Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +85 -121
  3. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  4. data/app/assets/fonts/fontawesome-webfont.svg +479 -463
  5. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  6. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  7. data/app/assets/javascripts/twitter/bootstrap/affix.js +19 -14
  8. data/app/assets/javascripts/twitter/bootstrap/alert.js +10 -6
  9. data/app/assets/javascripts/twitter/bootstrap/button.js +11 -8
  10. data/app/assets/javascripts/twitter/bootstrap/carousel.js +49 -31
  11. data/app/assets/javascripts/twitter/bootstrap/collapse.js +22 -22
  12. data/app/assets/javascripts/twitter/bootstrap/dropdown.js +17 -13
  13. data/app/assets/javascripts/twitter/bootstrap/modal.js +66 -29
  14. data/app/assets/javascripts/twitter/bootstrap/popover.js +10 -7
  15. data/app/assets/javascripts/twitter/bootstrap/scrollspy.js +40 -23
  16. data/app/assets/javascripts/twitter/bootstrap/tab.js +11 -8
  17. data/app/assets/javascripts/twitter/bootstrap/tooltip.js +115 -57
  18. data/app/assets/javascripts/twitter/bootstrap/transition.js +18 -7
  19. data/app/assets/stylesheets/twitter-bootstrap-static/fontawesome.css.erb +1670 -2
  20. data/app/helpers/bootstrap_flash_helper.rb +1 -1
  21. data/app/helpers/form_errors_helper.rb +11 -11
  22. data/app/helpers/glyph_helper.rb +2 -1
  23. data/app/helpers/modal_helper.rb +3 -3
  24. data/lib/generators/bootstrap/install/templates/bootstrap_and_overrides.less +6 -3
  25. data/lib/generators/bootstrap/layout/templates/layout.html.erb +5 -5
  26. data/lib/generators/bootstrap/layout/templates/layout.html.haml +3 -3
  27. data/lib/generators/bootstrap/layout/templates/layout.html.slim +3 -5
  28. data/lib/generators/bootstrap/themed/templates/_form.html.erb +12 -9
  29. data/lib/generators/bootstrap/themed/templates/_form.html.haml +7 -5
  30. data/lib/generators/bootstrap/themed/templates/_form.html.slim +8 -6
  31. data/lib/generators/bootstrap/themed/templates/edit.html.slim +1 -1
  32. data/lib/generators/bootstrap/themed/templates/index.html.slim +2 -3
  33. data/lib/generators/bootstrap/themed/templates/new.html.slim +1 -1
  34. data/lib/generators/bootstrap/themed/templates/show.html.slim +1 -1
  35. data/lib/twitter/bootstrap/rails/engine.rb +16 -12
  36. data/lib/twitter/bootstrap/rails/version.rb +1 -1
  37. data/spec/lib/breadcrumbs_spec.rb +2 -2
  38. data/spec/lib/twitter_bootstrap_rails/badge_label_helper_spec.rb +10 -4
  39. data/spec/lib/twitter_bootstrap_rails/form_errors_helper_spec.rb +148 -0
  40. data/spec/lib/twitter_bootstrap_rails/glyph_helper_spec.rb +24 -0
  41. data/spec/lib/twitter_bootstrap_rails/modal_helper_spec.rb +1 -1
  42. data/spec/lib/twitter_bootstrap_rails/navbar_helper_spec.rb +1 -1
  43. data/vendor/assets/stylesheets/twitter-bootstrap-static/bootstrap.css.erb +1 -3
  44. data/vendor/toolkit/fontawesome/core.less +3 -4
  45. data/vendor/toolkit/fontawesome/font-awesome.less +1 -1
  46. data/vendor/toolkit/fontawesome/icons.less +48 -2
  47. data/vendor/toolkit/fontawesome/list.less +1 -1
  48. data/vendor/toolkit/fontawesome/mixins.less +9 -4
  49. data/vendor/toolkit/fontawesome/path.less +5 -5
  50. data/vendor/toolkit/fontawesome/rotated-flipped.less +11 -0
  51. data/vendor/toolkit/fontawesome/spinning.less +15 -18
  52. data/vendor/toolkit/fontawesome/variables.less +49 -3
  53. data/vendor/toolkit/twitter/bootstrap/bootstrap.less +0 -1
  54. data/vendor/toolkit/twitter/bootstrap/glyphicons.less +6 -5
  55. metadata +59 -25
  56. data/app/assets/images/twitter/bootstrap/glyphicons-halflings-white.png +0 -0
  57. data/app/assets/images/twitter/bootstrap/glyphicons-halflings.png +0 -0
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: dropdown.js v3.1.1
2
+ * Bootstrap: dropdown.js v3.2.0
3
3
  * http://getbootstrap.com/javascript/#dropdowns
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -14,11 +14,13 @@
14
14
  // =========================
15
15
 
16
16
  var backdrop = '.dropdown-backdrop'
17
- var toggle = '[data-toggle=dropdown]'
17
+ var toggle = '[data-toggle="dropdown"]'
18
18
  var Dropdown = function (element) {
19
19
  $(element).on('click.bs.dropdown', this.toggle)
20
20
  }
21
21
 
22
+ Dropdown.VERSION = '3.2.0'
23
+
22
24
  Dropdown.prototype.toggle = function (e) {
23
25
  var $this = $(this)
24
26
 
@@ -40,11 +42,11 @@
40
42
 
41
43
  if (e.isDefaultPrevented()) return
42
44
 
45
+ $this.trigger('focus')
46
+
43
47
  $parent
44
48
  .toggleClass('open')
45
49
  .trigger('shown.bs.dropdown', relatedTarget)
46
-
47
- $this.focus()
48
50
  }
49
51
 
50
52
  return false
@@ -64,12 +66,12 @@
64
66
  var isActive = $parent.hasClass('open')
65
67
 
66
68
  if (!isActive || (isActive && e.keyCode == 27)) {
67
- if (e.which == 27) $parent.find(toggle).focus()
68
- return $this.click()
69
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
70
+ return $this.trigger('click')
69
71
  }
70
72
 
71
73
  var desc = ' li:not(.divider):visible a'
72
- var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
74
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
73
75
 
74
76
  if (!$items.length) return
75
77
 
@@ -79,10 +81,11 @@
79
81
  if (e.keyCode == 40 && index < $items.length - 1) index++ // down
80
82
  if (!~index) index = 0
81
83
 
82
- $items.eq(index).focus()
84
+ $items.eq(index).trigger('focus')
83
85
  }
84
86
 
85
87
  function clearMenus(e) {
88
+ if (e && e.which === 3) return
86
89
  $(backdrop).remove()
87
90
  $(toggle).each(function () {
88
91
  var $parent = getParent($(this))
@@ -99,7 +102,7 @@
99
102
 
100
103
  if (!selector) {
101
104
  selector = $this.attr('href')
102
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
105
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
103
106
  }
104
107
 
105
108
  var $parent = selector && $(selector)
@@ -111,9 +114,7 @@
111
114
  // DROPDOWN PLUGIN DEFINITION
112
115
  // ==========================
113
116
 
114
- var old = $.fn.dropdown
115
-
116
- $.fn.dropdown = function (option) {
117
+ function Plugin(option) {
117
118
  return this.each(function () {
118
119
  var $this = $(this)
119
120
  var data = $this.data('bs.dropdown')
@@ -123,6 +124,9 @@
123
124
  })
124
125
  }
125
126
 
127
+ var old = $.fn.dropdown
128
+
129
+ $.fn.dropdown = Plugin
126
130
  $.fn.dropdown.Constructor = Dropdown
127
131
 
128
132
 
@@ -142,6 +146,6 @@
142
146
  .on('click.bs.dropdown.data-api', clearMenus)
143
147
  .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
144
148
  .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
145
- .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
149
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
146
150
 
147
151
  }(jQuery);
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: modal.js v3.1.1
2
+ * Bootstrap: modal.js v3.2.0
3
3
  * http://getbootstrap.com/javascript/#modals
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -14,10 +14,12 @@
14
14
  // ======================
15
15
 
16
16
  var Modal = function (element, options) {
17
- this.options = options
18
- this.$element = $(element)
19
- this.$backdrop =
20
- this.isShown = null
17
+ this.options = options
18
+ this.$body = $(document.body)
19
+ this.$element = $(element)
20
+ this.$backdrop =
21
+ this.isShown = null
22
+ this.scrollbarWidth = 0
21
23
 
22
24
  if (this.options.remote) {
23
25
  this.$element
@@ -28,6 +30,8 @@
28
30
  }
29
31
  }
30
32
 
33
+ Modal.VERSION = '3.2.0'
34
+
31
35
  Modal.DEFAULTS = {
32
36
  backdrop: true,
33
37
  keyboard: true,
@@ -35,7 +39,7 @@
35
39
  }
36
40
 
37
41
  Modal.prototype.toggle = function (_relatedTarget) {
38
- return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
42
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
39
43
  }
40
44
 
41
45
  Modal.prototype.show = function (_relatedTarget) {
@@ -48,6 +52,10 @@
48
52
 
49
53
  this.isShown = true
50
54
 
55
+ this.checkScrollbar()
56
+ this.$body.addClass('modal-open')
57
+
58
+ this.setScrollbar()
51
59
  this.escape()
52
60
 
53
61
  this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
@@ -56,7 +64,7 @@
56
64
  var transition = $.support.transition && that.$element.hasClass('fade')
57
65
 
58
66
  if (!that.$element.parent().length) {
59
- that.$element.appendTo(document.body) // don't move modals dom position
67
+ that.$element.appendTo(that.$body) // don't move modals dom position
60
68
  }
61
69
 
62
70
  that.$element
@@ -77,11 +85,11 @@
77
85
 
78
86
  transition ?
79
87
  that.$element.find('.modal-dialog') // wait for modal to slide in
80
- .one($.support.transition.end, function () {
81
- that.$element.focus().trigger(e)
88
+ .one('bsTransitionEnd', function () {
89
+ that.$element.trigger('focus').trigger(e)
82
90
  })
83
91
  .emulateTransitionEnd(300) :
84
- that.$element.focus().trigger(e)
92
+ that.$element.trigger('focus').trigger(e)
85
93
  })
86
94
  }
87
95
 
@@ -96,6 +104,9 @@
96
104
 
97
105
  this.isShown = false
98
106
 
107
+ this.$body.removeClass('modal-open')
108
+
109
+ this.resetScrollbar()
99
110
  this.escape()
100
111
 
101
112
  $(document).off('focusin.bs.modal')
@@ -107,7 +118,7 @@
107
118
 
108
119
  $.support.transition && this.$element.hasClass('fade') ?
109
120
  this.$element
110
- .one($.support.transition.end, $.proxy(this.hideModal, this))
121
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
111
122
  .emulateTransitionEnd(300) :
112
123
  this.hideModal()
113
124
  }
@@ -117,7 +128,7 @@
117
128
  .off('focusin.bs.modal') // guard against infinite focus loop
118
129
  .on('focusin.bs.modal', $.proxy(function (e) {
119
130
  if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
120
- this.$element.focus()
131
+ this.$element.trigger('focus')
121
132
  }
122
133
  }, this))
123
134
  }
@@ -136,7 +147,6 @@
136
147
  var that = this
137
148
  this.$element.hide()
138
149
  this.backdrop(function () {
139
- that.removeBackdrop()
140
150
  that.$element.trigger('hidden.bs.modal')
141
151
  })
142
152
  }
@@ -147,13 +157,14 @@
147
157
  }
148
158
 
149
159
  Modal.prototype.backdrop = function (callback) {
160
+ var that = this
150
161
  var animate = this.$element.hasClass('fade') ? 'fade' : ''
151
162
 
152
163
  if (this.isShown && this.options.backdrop) {
153
164
  var doAnimate = $.support.transition && animate
154
165
 
155
166
  this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
156
- .appendTo(document.body)
167
+ .appendTo(this.$body)
157
168
 
158
169
  this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
159
170
  if (e.target !== e.currentTarget) return
@@ -170,31 +181,56 @@
170
181
 
171
182
  doAnimate ?
172
183
  this.$backdrop
173
- .one($.support.transition.end, callback)
184
+ .one('bsTransitionEnd', callback)
174
185
  .emulateTransitionEnd(150) :
175
186
  callback()
176
187
 
177
188
  } else if (!this.isShown && this.$backdrop) {
178
189
  this.$backdrop.removeClass('in')
179
190
 
191
+ var callbackRemove = function () {
192
+ that.removeBackdrop()
193
+ callback && callback()
194
+ }
180
195
  $.support.transition && this.$element.hasClass('fade') ?
181
196
  this.$backdrop
182
- .one($.support.transition.end, callback)
197
+ .one('bsTransitionEnd', callbackRemove)
183
198
  .emulateTransitionEnd(150) :
184
- callback()
199
+ callbackRemove()
185
200
 
186
201
  } else if (callback) {
187
202
  callback()
188
203
  }
189
204
  }
190
205
 
206
+ Modal.prototype.checkScrollbar = function () {
207
+ if (document.body.clientWidth >= window.innerWidth) return
208
+ this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
209
+ }
210
+
211
+ Modal.prototype.setScrollbar = function () {
212
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
213
+ if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
214
+ }
215
+
216
+ Modal.prototype.resetScrollbar = function () {
217
+ this.$body.css('padding-right', '')
218
+ }
219
+
220
+ Modal.prototype.measureScrollbar = function () { // thx walsh
221
+ var scrollDiv = document.createElement('div')
222
+ scrollDiv.className = 'modal-scrollbar-measure'
223
+ this.$body.append(scrollDiv)
224
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
225
+ this.$body[0].removeChild(scrollDiv)
226
+ return scrollbarWidth
227
+ }
228
+
191
229
 
192
230
  // MODAL PLUGIN DEFINITION
193
231
  // =======================
194
232
 
195
- var old = $.fn.modal
196
-
197
- $.fn.modal = function (option, _relatedTarget) {
233
+ function Plugin(option, _relatedTarget) {
198
234
  return this.each(function () {
199
235
  var $this = $(this)
200
236
  var data = $this.data('bs.modal')
@@ -206,6 +242,9 @@
206
242
  })
207
243
  }
208
244
 
245
+ var old = $.fn.modal
246
+
247
+ $.fn.modal = Plugin
209
248
  $.fn.modal.Constructor = Modal
210
249
 
211
250
 
@@ -224,20 +263,18 @@
224
263
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
225
264
  var $this = $(this)
226
265
  var href = $this.attr('href')
227
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
266
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
228
267
  var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
229
268
 
230
269
  if ($this.is('a')) e.preventDefault()
231
270
 
232
- $target
233
- .modal(option, this)
234
- .one('hide', function () {
235
- $this.is(':visible') && $this.focus()
271
+ $target.one('show.bs.modal', function (showEvent) {
272
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
273
+ $target.one('hidden.bs.modal', function () {
274
+ $this.is(':visible') && $this.trigger('focus')
236
275
  })
276
+ })
277
+ Plugin.call($target, option, this)
237
278
  })
238
279
 
239
- $(document)
240
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
241
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
242
-
243
280
  }(jQuery);
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: popover.js v3.1.1
2
+ * Bootstrap: popover.js v3.2.0
3
3
  * http://getbootstrap.com/javascript/#popovers
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -19,11 +19,13 @@
19
19
 
20
20
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
21
21
 
22
+ Popover.VERSION = '3.2.0'
23
+
22
24
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
23
25
  placement: 'right',
24
26
  trigger: 'click',
25
27
  content: '',
26
- template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
28
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
27
29
  })
28
30
 
29
31
 
@@ -44,7 +46,7 @@
44
46
  var content = this.getContent()
45
47
 
46
48
  $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
47
- $tip.find('.popover-content')[ // we use append for html objects to maintain js events
49
+ $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
48
50
  this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
49
51
  ](content)
50
52
 
@@ -70,7 +72,7 @@
70
72
  }
71
73
 
72
74
  Popover.prototype.arrow = function () {
73
- return this.$arrow = this.$arrow || this.tip().find('.arrow')
75
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
74
76
  }
75
77
 
76
78
  Popover.prototype.tip = function () {
@@ -82,9 +84,7 @@
82
84
  // POPOVER PLUGIN DEFINITION
83
85
  // =========================
84
86
 
85
- var old = $.fn.popover
86
-
87
- $.fn.popover = function (option) {
87
+ function Plugin(option) {
88
88
  return this.each(function () {
89
89
  var $this = $(this)
90
90
  var data = $this.data('bs.popover')
@@ -96,6 +96,9 @@
96
96
  })
97
97
  }
98
98
 
99
+ var old = $.fn.popover
100
+
101
+ $.fn.popover = Plugin
99
102
  $.fn.popover.Constructor = Popover
100
103
 
101
104
 
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: scrollspy.js v3.1.1
2
+ * Bootstrap: scrollspy.js v3.2.0
3
3
  * http://getbootstrap.com/javascript/#scrollspy
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -14,36 +14,48 @@
14
14
  // ==========================
15
15
 
16
16
  function ScrollSpy(element, options) {
17
- var href
18
17
  var process = $.proxy(this.process, this)
19
18
 
20
- this.$element = $(element).is('body') ? $(window) : $(element)
21
19
  this.$body = $('body')
22
- this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
20
+ this.$scrollElement = $(element).is('body') ? $(window) : $(element)
23
21
  this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
24
- this.selector = (this.options.target
25
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
26
- || '') + ' .nav li > a'
27
- this.offsets = $([])
28
- this.targets = $([])
22
+ this.selector = (this.options.target || '') + ' .nav li > a'
23
+ this.offsets = []
24
+ this.targets = []
29
25
  this.activeTarget = null
26
+ this.scrollHeight = 0
30
27
 
28
+ this.$scrollElement.on('scroll.bs.scrollspy', process)
31
29
  this.refresh()
32
30
  this.process()
33
31
  }
34
32
 
33
+ ScrollSpy.VERSION = '3.2.0'
34
+
35
35
  ScrollSpy.DEFAULTS = {
36
36
  offset: 10
37
37
  }
38
38
 
39
+ ScrollSpy.prototype.getScrollHeight = function () {
40
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
41
+ }
42
+
39
43
  ScrollSpy.prototype.refresh = function () {
40
- var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
44
+ var offsetMethod = 'offset'
45
+ var offsetBase = 0
41
46
 
42
- this.offsets = $([])
43
- this.targets = $([])
47
+ if (!$.isWindow(this.$scrollElement[0])) {
48
+ offsetMethod = 'position'
49
+ offsetBase = this.$scrollElement.scrollTop()
50
+ }
51
+
52
+ this.offsets = []
53
+ this.targets = []
54
+ this.scrollHeight = this.getScrollHeight()
44
55
 
45
56
  var self = this
46
- var $targets = this.$body
57
+
58
+ this.$body
47
59
  .find(this.selector)
48
60
  .map(function () {
49
61
  var $el = $(this)
@@ -53,7 +65,7 @@
53
65
  return ($href
54
66
  && $href.length
55
67
  && $href.is(':visible')
56
- && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
68
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
57
69
  })
58
70
  .sort(function (a, b) { return a[0] - b[0] })
59
71
  .each(function () {
@@ -64,15 +76,19 @@
64
76
 
65
77
  ScrollSpy.prototype.process = function () {
66
78
  var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
67
- var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
68
- var maxScroll = scrollHeight - this.$scrollElement.height()
79
+ var scrollHeight = this.getScrollHeight()
80
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
69
81
  var offsets = this.offsets
70
82
  var targets = this.targets
71
83
  var activeTarget = this.activeTarget
72
84
  var i
73
85
 
86
+ if (this.scrollHeight != scrollHeight) {
87
+ this.refresh()
88
+ }
89
+
74
90
  if (scrollTop >= maxScroll) {
75
- return activeTarget != (i = targets.last()[0]) && this.activate(i)
91
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
76
92
  }
77
93
 
78
94
  if (activeTarget && scrollTop <= offsets[0]) {
@@ -83,7 +99,7 @@
83
99
  activeTarget != targets[i]
84
100
  && scrollTop >= offsets[i]
85
101
  && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
86
- && this.activate( targets[i] )
102
+ && this.activate(targets[i])
87
103
  }
88
104
  }
89
105
 
@@ -115,9 +131,7 @@
115
131
  // SCROLLSPY PLUGIN DEFINITION
116
132
  // ===========================
117
133
 
118
- var old = $.fn.scrollspy
119
-
120
- $.fn.scrollspy = function (option) {
134
+ function Plugin(option) {
121
135
  return this.each(function () {
122
136
  var $this = $(this)
123
137
  var data = $this.data('bs.scrollspy')
@@ -128,6 +142,9 @@
128
142
  })
129
143
  }
130
144
 
145
+ var old = $.fn.scrollspy
146
+
147
+ $.fn.scrollspy = Plugin
131
148
  $.fn.scrollspy.Constructor = ScrollSpy
132
149
 
133
150
 
@@ -143,10 +160,10 @@
143
160
  // SCROLLSPY DATA-API
144
161
  // ==================
145
162
 
146
- $(window).on('load', function () {
163
+ $(window).on('load.bs.scrollspy.data-api', function () {
147
164
  $('[data-spy="scroll"]').each(function () {
148
165
  var $spy = $(this)
149
- $spy.scrollspy($spy.data())
166
+ Plugin.call($spy, $spy.data())
150
167
  })
151
168
  })
152
169