flexi_generators 0.3.3 → 0.3.4

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.
Files changed (38) hide show
  1. checksums.yaml +15 -0
  2. data/lib/generators/flexi/config/config_generator.rb +3 -3
  3. data/lib/generators/flexi/config/templates/field_error.rb +1 -12
  4. data/lib/generators/flexi/config/templates/inflector_portuguese.rb +0 -3
  5. data/lib/generators/flexi/config/templates/pt-BR.yml +13 -12
  6. data/lib/generators/flexi/install/install_generator.rb +1 -1
  7. data/lib/generators/flexi/install/templates/application.css +1 -1
  8. data/lib/generators/flexi/layout/layout_generator.rb +3 -4
  9. data/lib/generators/flexi/layout/templates/_navbar.html.erb +5 -6
  10. data/lib/generators/flexi/layout/templates/_sidebar.html.erb +13 -16
  11. data/lib/generators/flexi/layout/templates/_user_dropdown.html.erb +12 -11
  12. data/lib/generators/flexi/layout/templates/application.css +1 -1
  13. data/lib/generators/flexi/layout/templates/dashboard.html.erb +1 -48
  14. data/lib/generators/flexi/layout/templates/error_messages_helper.rb +6 -5
  15. data/lib/generators/flexi/layout/templates/layout.css +104 -3
  16. data/lib/generators/flexi/layout/templates/layout.html.erb +23 -46
  17. data/lib/generators/flexi/scaffold/scaffold_generator.rb +1 -1
  18. data/lib/generators/flexi/scaffold/templates/_form.html.erb +15 -17
  19. data/lib/generators/flexi/scaffold/templates/controller.rb +29 -15
  20. data/lib/generators/flexi/scaffold/templates/index.html.erb +25 -15
  21. data/lib/generators/flexi/scaffold/templates/show.html.erb +10 -11
  22. data/lib/twitter-bootstrap/version.rb +1 -1
  23. data/lib/version.rb +1 -1
  24. data/vendor/assets/fonts/flexi/glyphicons-halflings-regular.eot +0 -0
  25. data/vendor/assets/fonts/flexi/glyphicons-halflings-regular.svg +229 -0
  26. data/vendor/assets/fonts/flexi/glyphicons-halflings-regular.ttf +0 -0
  27. data/vendor/assets/fonts/flexi/glyphicons-halflings-regular.woff +0 -0
  28. data/vendor/assets/javascripts/flexi/bootstrap.js +1259 -1588
  29. data/vendor/assets/javascripts/flexi/bootstrap.min.js +5 -5
  30. data/vendor/assets/stylesheets/flexi/bootstrap-theme.css +347 -0
  31. data/vendor/assets/stylesheets/flexi/bootstrap-theme.min.css +7 -0
  32. data/vendor/assets/stylesheets/flexi/bootstrap.css +4696 -5078
  33. data/vendor/assets/stylesheets/flexi/bootstrap.min.css +7 -9
  34. metadata +11 -15
  35. data/vendor/assets/images/flexi/glyphicons-halflings-white.png +0 -0
  36. data/vendor/assets/images/flexi/glyphicons-halflings.png +0 -0
  37. data/vendor/assets/stylesheets/flexi/bootstrap-responsive.css +0 -1109
  38. data/vendor/assets/stylesheets/flexi/bootstrap-responsive.min.css +0 -9
@@ -1,139 +1,126 @@
1
- /* ===================================================
2
- * bootstrap-transition.js v2.3.2
3
- * http://getbootstrap.com/2.3.2/javascript.html#transitions
4
- * ===================================================
5
- * Copyright 2013 Twitter, Inc.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the "License");
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- * ========================================================== */
19
-
20
-
21
- !function ($) {
22
-
23
- "use strict"; // jshint ;_;
24
-
25
-
26
- /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27
- * ======================================================= */
1
+ /*!
2
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
28
6
 
29
- $(function () {
7
+ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
30
8
 
31
- $.support.transition = (function () {
9
+ /* ========================================================================
10
+ * Bootstrap: transition.js v3.1.1
11
+ * http://getbootstrap.com/javascript/#transitions
12
+ * ========================================================================
13
+ * Copyright 2011-2014 Twitter, Inc.
14
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
+ * ======================================================================== */
32
16
 
33
- var transitionEnd = (function () {
34
17
 
35
- var el = document.createElement('bootstrap')
36
- , transEndEventNames = {
37
- 'WebkitTransition' : 'webkitTransitionEnd'
38
- , 'MozTransition' : 'transitionend'
39
- , 'OTransition' : 'oTransitionEnd otransitionend'
40
- , 'transition' : 'transitionend'
41
- }
42
- , name
18
+ +function ($) {
19
+ 'use strict';
43
20
 
44
- for (name in transEndEventNames){
45
- if (el.style[name] !== undefined) {
46
- return transEndEventNames[name]
47
- }
48
- }
21
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
22
+ // ============================================================
49
23
 
50
- }())
24
+ function transitionEnd() {
25
+ var el = document.createElement('bootstrap')
26
+
27
+ var transEndEventNames = {
28
+ 'WebkitTransition' : 'webkitTransitionEnd',
29
+ 'MozTransition' : 'transitionend',
30
+ 'OTransition' : 'oTransitionEnd otransitionend',
31
+ 'transition' : 'transitionend'
32
+ }
51
33
 
52
- return transitionEnd && {
53
- end: transitionEnd
34
+ for (var name in transEndEventNames) {
35
+ if (el.style[name] !== undefined) {
36
+ return { end: transEndEventNames[name] }
54
37
  }
38
+ }
55
39
 
56
- })()
40
+ return false // explicit for ie8 ( ._.)
41
+ }
57
42
 
58
- })
43
+ // http://blog.alexmaccaw.com/css-transitions
44
+ $.fn.emulateTransitionEnd = function (duration) {
45
+ var called = false, $el = this
46
+ $(this).one($.support.transition.end, function () { called = true })
47
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
48
+ setTimeout(callback, duration)
49
+ return this
50
+ }
59
51
 
60
- }(window.jQuery);/* ==========================================================
61
- * bootstrap-alert.js v2.3.2
62
- * http://getbootstrap.com/2.3.2/javascript.html#alerts
63
- * ==========================================================
64
- * Copyright 2013 Twitter, Inc.
65
- *
66
- * Licensed under the Apache License, Version 2.0 (the "License");
67
- * you may not use this file except in compliance with the License.
68
- * You may obtain a copy of the License at
69
- *
70
- * http://www.apache.org/licenses/LICENSE-2.0
71
- *
72
- * Unless required by applicable law or agreed to in writing, software
73
- * distributed under the License is distributed on an "AS IS" BASIS,
74
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75
- * See the License for the specific language governing permissions and
76
- * limitations under the License.
77
- * ========================================================== */
52
+ $(function () {
53
+ $.support.transition = transitionEnd()
54
+ })
78
55
 
56
+ }(jQuery);
79
57
 
80
- !function ($) {
58
+ /* ========================================================================
59
+ * Bootstrap: alert.js v3.1.1
60
+ * http://getbootstrap.com/javascript/#alerts
61
+ * ========================================================================
62
+ * Copyright 2011-2014 Twitter, Inc.
63
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
64
+ * ======================================================================== */
81
65
 
82
- "use strict"; // jshint ;_;
83
66
 
67
+ +function ($) {
68
+ 'use strict';
84
69
 
85
- /* ALERT CLASS DEFINITION
86
- * ====================== */
70
+ // ALERT CLASS DEFINITION
71
+ // ======================
87
72
 
88
73
  var dismiss = '[data-dismiss="alert"]'
89
- , Alert = function (el) {
90
- $(el).on('click', dismiss, this.close)
91
- }
74
+ var Alert = function (el) {
75
+ $(el).on('click', dismiss, this.close)
76
+ }
92
77
 
93
78
  Alert.prototype.close = function (e) {
94
- var $this = $(this)
95
- , selector = $this.attr('data-target')
96
- , $parent
79
+ var $this = $(this)
80
+ var selector = $this.attr('data-target')
97
81
 
98
82
  if (!selector) {
99
83
  selector = $this.attr('href')
100
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
84
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
101
85
  }
102
86
 
103
- $parent = $(selector)
87
+ var $parent = $(selector)
104
88
 
105
- e && e.preventDefault()
89
+ if (e) e.preventDefault()
106
90
 
107
- $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
91
+ if (!$parent.length) {
92
+ $parent = $this.hasClass('alert') ? $this : $this.parent()
93
+ }
108
94
 
109
- $parent.trigger(e = $.Event('close'))
95
+ $parent.trigger(e = $.Event('close.bs.alert'))
110
96
 
111
97
  if (e.isDefaultPrevented()) return
112
98
 
113
99
  $parent.removeClass('in')
114
100
 
115
101
  function removeElement() {
116
- $parent
117
- .trigger('closed')
118
- .remove()
102
+ $parent.trigger('closed.bs.alert').remove()
119
103
  }
120
104
 
121
105
  $.support.transition && $parent.hasClass('fade') ?
122
- $parent.on($.support.transition.end, removeElement) :
106
+ $parent
107
+ .one($.support.transition.end, removeElement)
108
+ .emulateTransitionEnd(150) :
123
109
  removeElement()
124
110
  }
125
111
 
126
112
 
127
- /* ALERT PLUGIN DEFINITION
128
- * ======================= */
113
+ // ALERT PLUGIN DEFINITION
114
+ // =======================
129
115
 
130
116
  var old = $.fn.alert
131
117
 
132
118
  $.fn.alert = function (option) {
133
119
  return this.each(function () {
134
120
  var $this = $(this)
135
- , data = $this.data('alert')
136
- if (!data) $this.data('alert', (data = new Alert(this)))
121
+ var data = $this.data('bs.alert')
122
+
123
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
137
124
  if (typeof option == 'string') data[option].call($this)
138
125
  })
139
126
  }
@@ -141,8 +128,8 @@
141
128
  $.fn.alert.Constructor = Alert
142
129
 
143
130
 
144
- /* ALERT NO CONFLICT
145
- * ================= */
131
+ // ALERT NO CONFLICT
132
+ // =================
146
133
 
147
134
  $.fn.alert.noConflict = function () {
148
135
  $.fn.alert = old
@@ -150,99 +137,102 @@
150
137
  }
151
138
 
152
139
 
153
- /* ALERT DATA-API
154
- * ============== */
140
+ // ALERT DATA-API
141
+ // ==============
155
142
 
156
- $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
143
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
157
144
 
158
- }(window.jQuery);/* ============================================================
159
- * bootstrap-button.js v2.3.2
160
- * http://getbootstrap.com/2.3.2/javascript.html#buttons
161
- * ============================================================
162
- * Copyright 2013 Twitter, Inc.
163
- *
164
- * Licensed under the Apache License, Version 2.0 (the "License");
165
- * you may not use this file except in compliance with the License.
166
- * You may obtain a copy of the License at
167
- *
168
- * http://www.apache.org/licenses/LICENSE-2.0
169
- *
170
- * Unless required by applicable law or agreed to in writing, software
171
- * distributed under the License is distributed on an "AS IS" BASIS,
172
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
173
- * See the License for the specific language governing permissions and
174
- * limitations under the License.
175
- * ============================================================ */
145
+ }(jQuery);
176
146
 
147
+ /* ========================================================================
148
+ * Bootstrap: button.js v3.1.1
149
+ * http://getbootstrap.com/javascript/#buttons
150
+ * ========================================================================
151
+ * Copyright 2011-2014 Twitter, Inc.
152
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
153
+ * ======================================================================== */
177
154
 
178
- !function ($) {
179
155
 
180
- "use strict"; // jshint ;_;
156
+ +function ($) {
157
+ 'use strict';
181
158
 
182
-
183
- /* BUTTON PUBLIC CLASS DEFINITION
184
- * ============================== */
159
+ // BUTTON PUBLIC CLASS DEFINITION
160
+ // ==============================
185
161
 
186
162
  var Button = function (element, options) {
187
- this.$element = $(element)
188
- this.options = $.extend({}, $.fn.button.defaults, options)
163
+ this.$element = $(element)
164
+ this.options = $.extend({}, Button.DEFAULTS, options)
165
+ this.isLoading = false
166
+ }
167
+
168
+ Button.DEFAULTS = {
169
+ loadingText: 'loading...'
189
170
  }
190
171
 
191
172
  Button.prototype.setState = function (state) {
192
- var d = 'disabled'
193
- , $el = this.$element
194
- , data = $el.data()
195
- , val = $el.is('input') ? 'val' : 'html'
173
+ var d = 'disabled'
174
+ var $el = this.$element
175
+ var val = $el.is('input') ? 'val' : 'html'
176
+ var data = $el.data()
196
177
 
197
178
  state = state + 'Text'
198
- data.resetText || $el.data('resetText', $el[val]())
179
+
180
+ if (!data.resetText) $el.data('resetText', $el[val]())
199
181
 
200
182
  $el[val](data[state] || this.options[state])
201
183
 
202
184
  // push to event loop to allow forms to submit
203
- setTimeout(function () {
204
- state == 'loadingText' ?
205
- $el.addClass(d).attr(d, d) :
185
+ setTimeout($.proxy(function () {
186
+ if (state == 'loadingText') {
187
+ this.isLoading = true
188
+ $el.addClass(d).attr(d, d)
189
+ } else if (this.isLoading) {
190
+ this.isLoading = false
206
191
  $el.removeClass(d).removeAttr(d)
207
- }, 0)
192
+ }
193
+ }, this), 0)
208
194
  }
209
195
 
210
196
  Button.prototype.toggle = function () {
211
- var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
212
-
213
- $parent && $parent
214
- .find('.active')
215
- .removeClass('active')
197
+ var changed = true
198
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
199
+
200
+ if ($parent.length) {
201
+ var $input = this.$element.find('input')
202
+ if ($input.prop('type') == 'radio') {
203
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
204
+ else $parent.find('.active').removeClass('active')
205
+ }
206
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
207
+ }
216
208
 
217
- this.$element.toggleClass('active')
209
+ if (changed) this.$element.toggleClass('active')
218
210
  }
219
211
 
220
212
 
221
- /* BUTTON PLUGIN DEFINITION
222
- * ======================== */
213
+ // BUTTON PLUGIN DEFINITION
214
+ // ========================
223
215
 
224
216
  var old = $.fn.button
225
217
 
226
218
  $.fn.button = function (option) {
227
219
  return this.each(function () {
228
- var $this = $(this)
229
- , data = $this.data('button')
230
- , options = typeof option == 'object' && option
231
- if (!data) $this.data('button', (data = new Button(this, options)))
220
+ var $this = $(this)
221
+ var data = $this.data('bs.button')
222
+ var options = typeof option == 'object' && option
223
+
224
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
225
+
232
226
  if (option == 'toggle') data.toggle()
233
227
  else if (option) data.setState(option)
234
228
  })
235
229
  }
236
230
 
237
- $.fn.button.defaults = {
238
- loadingText: 'loading...'
239
- }
240
-
241
231
  $.fn.button.Constructor = Button
242
232
 
243
233
 
244
- /* BUTTON NO CONFLICT
245
- * ================== */
234
+ // BUTTON NO CONFLICT
235
+ // ==================
246
236
 
247
237
  $.fn.button.noConflict = function () {
248
238
  $.fn.button = old
@@ -250,367 +240,364 @@
250
240
  }
251
241
 
252
242
 
253
- /* BUTTON DATA-API
254
- * =============== */
243
+ // BUTTON DATA-API
244
+ // ===============
255
245
 
256
- $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
246
+ $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
257
247
  var $btn = $(e.target)
258
248
  if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
259
249
  $btn.button('toggle')
250
+ e.preventDefault()
260
251
  })
261
252
 
262
- }(window.jQuery);/* ==========================================================
263
- * bootstrap-carousel.js v2.3.2
264
- * http://getbootstrap.com/2.3.2/javascript.html#carousel
265
- * ==========================================================
266
- * Copyright 2013 Twitter, Inc.
267
- *
268
- * Licensed under the Apache License, Version 2.0 (the "License");
269
- * you may not use this file except in compliance with the License.
270
- * You may obtain a copy of the License at
271
- *
272
- * http://www.apache.org/licenses/LICENSE-2.0
273
- *
274
- * Unless required by applicable law or agreed to in writing, software
275
- * distributed under the License is distributed on an "AS IS" BASIS,
276
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
277
- * See the License for the specific language governing permissions and
278
- * limitations under the License.
279
- * ========================================================== */
280
-
253
+ }(jQuery);
281
254
 
282
- !function ($) {
255
+ /* ========================================================================
256
+ * Bootstrap: carousel.js v3.1.1
257
+ * http://getbootstrap.com/javascript/#carousel
258
+ * ========================================================================
259
+ * Copyright 2011-2014 Twitter, Inc.
260
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
261
+ * ======================================================================== */
283
262
 
284
- "use strict"; // jshint ;_;
285
263
 
264
+ +function ($) {
265
+ 'use strict';
286
266
 
287
- /* CAROUSEL CLASS DEFINITION
288
- * ========================= */
267
+ // CAROUSEL CLASS DEFINITION
268
+ // =========================
289
269
 
290
270
  var Carousel = function (element, options) {
291
- this.$element = $(element)
271
+ this.$element = $(element)
292
272
  this.$indicators = this.$element.find('.carousel-indicators')
293
- this.options = options
273
+ this.options = options
274
+ this.paused =
275
+ this.sliding =
276
+ this.interval =
277
+ this.$active =
278
+ this.$items = null
279
+
294
280
  this.options.pause == 'hover' && this.$element
295
281
  .on('mouseenter', $.proxy(this.pause, this))
296
282
  .on('mouseleave', $.proxy(this.cycle, this))
297
283
  }
298
284
 
299
- Carousel.prototype = {
285
+ Carousel.DEFAULTS = {
286
+ interval: 5000,
287
+ pause: 'hover',
288
+ wrap: true
289
+ }
300
290
 
301
- cycle: function (e) {
302
- if (!e) this.paused = false
303
- if (this.interval) clearInterval(this.interval);
304
- this.options.interval
305
- && !this.paused
306
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
307
- return this
308
- }
291
+ Carousel.prototype.cycle = function (e) {
292
+ e || (this.paused = false)
309
293
 
310
- , getActiveIndex: function () {
311
- this.$active = this.$element.find('.item.active')
312
- this.$items = this.$active.parent().children()
313
- return this.$items.index(this.$active)
314
- }
294
+ this.interval && clearInterval(this.interval)
315
295
 
316
- , to: function (pos) {
317
- var activeIndex = this.getActiveIndex()
318
- , that = this
296
+ this.options.interval
297
+ && !this.paused
298
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
319
299
 
320
- if (pos > (this.$items.length - 1) || pos < 0) return
300
+ return this
301
+ }
321
302
 
322
- if (this.sliding) {
323
- return this.$element.one('slid', function () {
324
- that.to(pos)
325
- })
326
- }
303
+ Carousel.prototype.getActiveIndex = function () {
304
+ this.$active = this.$element.find('.item.active')
305
+ this.$items = this.$active.parent().children()
327
306
 
328
- if (activeIndex == pos) {
329
- return this.pause().cycle()
330
- }
307
+ return this.$items.index(this.$active)
308
+ }
331
309
 
332
- return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
333
- }
310
+ Carousel.prototype.to = function (pos) {
311
+ var that = this
312
+ var activeIndex = this.getActiveIndex()
334
313
 
335
- , pause: function (e) {
336
- if (!e) this.paused = true
337
- if (this.$element.find('.next, .prev').length && $.support.transition.end) {
338
- this.$element.trigger($.support.transition.end)
339
- this.cycle(true)
340
- }
341
- clearInterval(this.interval)
342
- this.interval = null
343
- return this
344
- }
314
+ if (pos > (this.$items.length - 1) || pos < 0) return
345
315
 
346
- , next: function () {
347
- if (this.sliding) return
348
- return this.slide('next')
349
- }
316
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
317
+ if (activeIndex == pos) return this.pause().cycle()
350
318
 
351
- , prev: function () {
352
- if (this.sliding) return
353
- return this.slide('prev')
319
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
320
+ }
321
+
322
+ Carousel.prototype.pause = function (e) {
323
+ e || (this.paused = true)
324
+
325
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
326
+ this.$element.trigger($.support.transition.end)
327
+ this.cycle(true)
354
328
  }
355
329
 
356
- , slide: function (type, next) {
357
- var $active = this.$element.find('.item.active')
358
- , $next = next || $active[type]()
359
- , isCycling = this.interval
360
- , direction = type == 'next' ? 'left' : 'right'
361
- , fallback = type == 'next' ? 'first' : 'last'
362
- , that = this
363
- , e
330
+ this.interval = clearInterval(this.interval)
364
331
 
365
- this.sliding = true
332
+ return this
333
+ }
366
334
 
367
- isCycling && this.pause()
335
+ Carousel.prototype.next = function () {
336
+ if (this.sliding) return
337
+ return this.slide('next')
338
+ }
368
339
 
369
- $next = $next.length ? $next : this.$element.find('.item')[fallback]()
340
+ Carousel.prototype.prev = function () {
341
+ if (this.sliding) return
342
+ return this.slide('prev')
343
+ }
370
344
 
371
- e = $.Event('slide', {
372
- relatedTarget: $next[0]
373
- , direction: direction
374
- })
345
+ Carousel.prototype.slide = function (type, next) {
346
+ var $active = this.$element.find('.item.active')
347
+ var $next = next || $active[type]()
348
+ var isCycling = this.interval
349
+ var direction = type == 'next' ? 'left' : 'right'
350
+ var fallback = type == 'next' ? 'first' : 'last'
351
+ var that = this
375
352
 
376
- if ($next.hasClass('active')) return
353
+ if (!$next.length) {
354
+ if (!this.options.wrap) return
355
+ $next = this.$element.find('.item')[fallback]()
356
+ }
377
357
 
378
- if (this.$indicators.length) {
379
- this.$indicators.find('.active').removeClass('active')
380
- this.$element.one('slid', function () {
381
- var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
382
- $nextIndicator && $nextIndicator.addClass('active')
383
- })
384
- }
358
+ if ($next.hasClass('active')) return this.sliding = false
359
+
360
+ var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
361
+ this.$element.trigger(e)
362
+ if (e.isDefaultPrevented()) return
363
+
364
+ this.sliding = true
365
+
366
+ isCycling && this.pause()
367
+
368
+ if (this.$indicators.length) {
369
+ this.$indicators.find('.active').removeClass('active')
370
+ this.$element.one('slid.bs.carousel', function () {
371
+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
372
+ $nextIndicator && $nextIndicator.addClass('active')
373
+ })
374
+ }
385
375
 
386
- if ($.support.transition && this.$element.hasClass('slide')) {
387
- this.$element.trigger(e)
388
- if (e.isDefaultPrevented()) return
389
- $next.addClass(type)
390
- $next[0].offsetWidth // force reflow
391
- $active.addClass(direction)
392
- $next.addClass(direction)
393
- this.$element.one($.support.transition.end, function () {
376
+ if ($.support.transition && this.$element.hasClass('slide')) {
377
+ $next.addClass(type)
378
+ $next[0].offsetWidth // force reflow
379
+ $active.addClass(direction)
380
+ $next.addClass(direction)
381
+ $active
382
+ .one($.support.transition.end, function () {
394
383
  $next.removeClass([type, direction].join(' ')).addClass('active')
395
384
  $active.removeClass(['active', direction].join(' '))
396
385
  that.sliding = false
397
- setTimeout(function () { that.$element.trigger('slid') }, 0)
386
+ setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
398
387
  })
399
- } else {
400
- this.$element.trigger(e)
401
- if (e.isDefaultPrevented()) return
402
- $active.removeClass('active')
403
- $next.addClass('active')
404
- this.sliding = false
405
- this.$element.trigger('slid')
406
- }
407
-
408
- isCycling && this.cycle()
409
-
410
- return this
388
+ .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
389
+ } else {
390
+ $active.removeClass('active')
391
+ $next.addClass('active')
392
+ this.sliding = false
393
+ this.$element.trigger('slid.bs.carousel')
411
394
  }
412
395
 
396
+ isCycling && this.cycle()
397
+
398
+ return this
413
399
  }
414
400
 
415
401
 
416
- /* CAROUSEL PLUGIN DEFINITION
417
- * ========================== */
402
+ // CAROUSEL PLUGIN DEFINITION
403
+ // ==========================
418
404
 
419
405
  var old = $.fn.carousel
420
406
 
421
407
  $.fn.carousel = function (option) {
422
408
  return this.each(function () {
423
- var $this = $(this)
424
- , data = $this.data('carousel')
425
- , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
426
- , action = typeof option == 'string' ? option : options.slide
427
- if (!data) $this.data('carousel', (data = new Carousel(this, options)))
409
+ var $this = $(this)
410
+ var data = $this.data('bs.carousel')
411
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
412
+ var action = typeof option == 'string' ? option : options.slide
413
+
414
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
428
415
  if (typeof option == 'number') data.to(option)
429
416
  else if (action) data[action]()
430
417
  else if (options.interval) data.pause().cycle()
431
418
  })
432
419
  }
433
420
 
434
- $.fn.carousel.defaults = {
435
- interval: 5000
436
- , pause: 'hover'
437
- }
438
-
439
421
  $.fn.carousel.Constructor = Carousel
440
422
 
441
423
 
442
- /* CAROUSEL NO CONFLICT
443
- * ==================== */
424
+ // CAROUSEL NO CONFLICT
425
+ // ====================
444
426
 
445
427
  $.fn.carousel.noConflict = function () {
446
428
  $.fn.carousel = old
447
429
  return this
448
430
  }
449
431
 
450
- /* CAROUSEL DATA-API
451
- * ================= */
452
432
 
453
- $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
454
- var $this = $(this), href
455
- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
456
- , options = $.extend({}, $target.data(), $this.data())
457
- , slideIndex
433
+ // CAROUSEL DATA-API
434
+ // =================
435
+
436
+ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
437
+ var $this = $(this), href
438
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
439
+ var options = $.extend({}, $target.data(), $this.data())
440
+ var slideIndex = $this.attr('data-slide-to')
441
+ if (slideIndex) options.interval = false
458
442
 
459
443
  $target.carousel(options)
460
444
 
461
445
  if (slideIndex = $this.attr('data-slide-to')) {
462
- $target.data('carousel').pause().to(slideIndex).cycle()
446
+ $target.data('bs.carousel').to(slideIndex)
463
447
  }
464
448
 
465
449
  e.preventDefault()
466
450
  })
467
451
 
468
- }(window.jQuery);/* =============================================================
469
- * bootstrap-collapse.js v2.3.2
470
- * http://getbootstrap.com/2.3.2/javascript.html#collapse
471
- * =============================================================
472
- * Copyright 2013 Twitter, Inc.
473
- *
474
- * Licensed under the Apache License, Version 2.0 (the "License");
475
- * you may not use this file except in compliance with the License.
476
- * You may obtain a copy of the License at
477
- *
478
- * http://www.apache.org/licenses/LICENSE-2.0
479
- *
480
- * Unless required by applicable law or agreed to in writing, software
481
- * distributed under the License is distributed on an "AS IS" BASIS,
482
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
483
- * See the License for the specific language governing permissions and
484
- * limitations under the License.
485
- * ============================================================ */
452
+ $(window).on('load', function () {
453
+ $('[data-ride="carousel"]').each(function () {
454
+ var $carousel = $(this)
455
+ $carousel.carousel($carousel.data())
456
+ })
457
+ })
486
458
 
459
+ }(jQuery);
487
460
 
488
- !function ($) {
461
+ /* ========================================================================
462
+ * Bootstrap: collapse.js v3.1.1
463
+ * http://getbootstrap.com/javascript/#collapse
464
+ * ========================================================================
465
+ * Copyright 2011-2014 Twitter, Inc.
466
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
467
+ * ======================================================================== */
489
468
 
490
- "use strict"; // jshint ;_;
491
469
 
470
+ +function ($) {
471
+ 'use strict';
492
472
 
493
- /* COLLAPSE PUBLIC CLASS DEFINITION
494
- * ================================ */
473
+ // COLLAPSE PUBLIC CLASS DEFINITION
474
+ // ================================
495
475
 
496
476
  var Collapse = function (element, options) {
497
- this.$element = $(element)
498
- this.options = $.extend({}, $.fn.collapse.defaults, options)
477
+ this.$element = $(element)
478
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
479
+ this.transitioning = null
499
480
 
500
- if (this.options.parent) {
501
- this.$parent = $(this.options.parent)
502
- }
481
+ if (this.options.parent) this.$parent = $(this.options.parent)
482
+ if (this.options.toggle) this.toggle()
483
+ }
503
484
 
504
- this.options.toggle && this.toggle()
485
+ Collapse.DEFAULTS = {
486
+ toggle: true
505
487
  }
506
488
 
507
- Collapse.prototype = {
489
+ Collapse.prototype.dimension = function () {
490
+ var hasWidth = this.$element.hasClass('width')
491
+ return hasWidth ? 'width' : 'height'
492
+ }
508
493
 
509
- constructor: Collapse
494
+ Collapse.prototype.show = function () {
495
+ if (this.transitioning || this.$element.hasClass('in')) return
510
496
 
511
- , dimension: function () {
512
- var hasWidth = this.$element.hasClass('width')
513
- return hasWidth ? 'width' : 'height'
514
- }
497
+ var startEvent = $.Event('show.bs.collapse')
498
+ this.$element.trigger(startEvent)
499
+ if (startEvent.isDefaultPrevented()) return
515
500
 
516
- , show: function () {
517
- var dimension
518
- , scroll
519
- , actives
520
- , hasData
501
+ var actives = this.$parent && this.$parent.find('> .panel > .in')
521
502
 
522
- if (this.transitioning || this.$element.hasClass('in')) return
503
+ if (actives && actives.length) {
504
+ var hasData = actives.data('bs.collapse')
505
+ if (hasData && hasData.transitioning) return
506
+ actives.collapse('hide')
507
+ hasData || actives.data('bs.collapse', null)
508
+ }
523
509
 
524
- dimension = this.dimension()
525
- scroll = $.camelCase(['scroll', dimension].join('-'))
526
- actives = this.$parent && this.$parent.find('> .accordion-group > .in')
510
+ var dimension = this.dimension()
527
511
 
528
- if (actives && actives.length) {
529
- hasData = actives.data('collapse')
530
- if (hasData && hasData.transitioning) return
531
- actives.collapse('hide')
532
- hasData || actives.data('collapse', null)
533
- }
512
+ this.$element
513
+ .removeClass('collapse')
514
+ .addClass('collapsing')
515
+ [dimension](0)
534
516
 
535
- this.$element[dimension](0)
536
- this.transition('addClass', $.Event('show'), 'shown')
537
- $.support.transition && this.$element[dimension](this.$element[0][scroll])
538
- }
517
+ this.transitioning = 1
539
518
 
540
- , hide: function () {
541
- var dimension
542
- if (this.transitioning || !this.$element.hasClass('in')) return
543
- dimension = this.dimension()
544
- this.reset(this.$element[dimension]())
545
- this.transition('removeClass', $.Event('hide'), 'hidden')
546
- this.$element[dimension](0)
519
+ var complete = function () {
520
+ this.$element
521
+ .removeClass('collapsing')
522
+ .addClass('collapse in')
523
+ [dimension]('auto')
524
+ this.transitioning = 0
525
+ this.$element.trigger('shown.bs.collapse')
547
526
  }
548
527
 
549
- , reset: function (size) {
550
- var dimension = this.dimension()
528
+ if (!$.support.transition) return complete.call(this)
551
529
 
552
- this.$element
553
- .removeClass('collapse')
554
- [dimension](size || 'auto')
555
- [0].offsetWidth
530
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
556
531
 
557
- this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
532
+ this.$element
533
+ .one($.support.transition.end, $.proxy(complete, this))
534
+ .emulateTransitionEnd(350)
535
+ [dimension](this.$element[0][scrollSize])
536
+ }
558
537
 
559
- return this
560
- }
538
+ Collapse.prototype.hide = function () {
539
+ if (this.transitioning || !this.$element.hasClass('in')) return
561
540
 
562
- , transition: function (method, startEvent, completeEvent) {
563
- var that = this
564
- , complete = function () {
565
- if (startEvent.type == 'show') that.reset()
566
- that.transitioning = 0
567
- that.$element.trigger(completeEvent)
568
- }
541
+ var startEvent = $.Event('hide.bs.collapse')
542
+ this.$element.trigger(startEvent)
543
+ if (startEvent.isDefaultPrevented()) return
569
544
 
570
- this.$element.trigger(startEvent)
545
+ var dimension = this.dimension()
571
546
 
572
- if (startEvent.isDefaultPrevented()) return
547
+ this.$element
548
+ [dimension](this.$element[dimension]())
549
+ [0].offsetHeight
573
550
 
574
- this.transitioning = 1
551
+ this.$element
552
+ .addClass('collapsing')
553
+ .removeClass('collapse')
554
+ .removeClass('in')
575
555
 
576
- this.$element[method]('in')
556
+ this.transitioning = 1
577
557
 
578
- $.support.transition && this.$element.hasClass('collapse') ?
579
- this.$element.one($.support.transition.end, complete) :
580
- complete()
558
+ var complete = function () {
559
+ this.transitioning = 0
560
+ this.$element
561
+ .trigger('hidden.bs.collapse')
562
+ .removeClass('collapsing')
563
+ .addClass('collapse')
581
564
  }
582
565
 
583
- , toggle: function () {
584
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
585
- }
566
+ if (!$.support.transition) return complete.call(this)
567
+
568
+ this.$element
569
+ [dimension](0)
570
+ .one($.support.transition.end, $.proxy(complete, this))
571
+ .emulateTransitionEnd(350)
572
+ }
586
573
 
574
+ Collapse.prototype.toggle = function () {
575
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
587
576
  }
588
577
 
589
578
 
590
- /* COLLAPSE PLUGIN DEFINITION
591
- * ========================== */
579
+ // COLLAPSE PLUGIN DEFINITION
580
+ // ==========================
592
581
 
593
582
  var old = $.fn.collapse
594
583
 
595
584
  $.fn.collapse = function (option) {
596
585
  return this.each(function () {
597
- var $this = $(this)
598
- , data = $this.data('collapse')
599
- , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
600
- if (!data) $this.data('collapse', (data = new Collapse(this, options)))
586
+ var $this = $(this)
587
+ var data = $this.data('bs.collapse')
588
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
589
+
590
+ if (!data && options.toggle && option == 'show') option = !option
591
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
601
592
  if (typeof option == 'string') data[option]()
602
593
  })
603
594
  }
604
595
 
605
- $.fn.collapse.defaults = {
606
- toggle: true
607
- }
608
-
609
596
  $.fn.collapse.Constructor = Collapse
610
597
 
611
598
 
612
- /* COLLAPSE NO CONFLICT
613
- * ==================== */
599
+ // COLLAPSE NO CONFLICT
600
+ // ====================
614
601
 
615
602
  $.fn.collapse.noConflict = function () {
616
603
  $.fn.collapse = old
@@ -618,162 +605,151 @@
618
605
  }
619
606
 
620
607
 
621
- /* COLLAPSE DATA-API
622
- * ================= */
608
+ // COLLAPSE DATA-API
609
+ // =================
623
610
 
624
- $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
625
- var $this = $(this), href
626
- , target = $this.attr('data-target')
611
+ $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
612
+ var $this = $(this), href
613
+ var target = $this.attr('data-target')
627
614
  || e.preventDefault()
628
615
  || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
629
- , option = $(target).data('collapse') ? 'toggle' : $this.data()
630
- $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
631
- $(target).collapse(option)
616
+ var $target = $(target)
617
+ var data = $target.data('bs.collapse')
618
+ var option = data ? 'toggle' : $this.data()
619
+ var parent = $this.attr('data-parent')
620
+ var $parent = parent && $(parent)
621
+
622
+ if (!data || !data.transitioning) {
623
+ if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
624
+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
625
+ }
626
+
627
+ $target.collapse(option)
632
628
  })
633
629
 
634
- }(window.jQuery);/* ============================================================
635
- * bootstrap-dropdown.js v2.3.2
636
- * http://getbootstrap.com/2.3.2/javascript.html#dropdowns
637
- * ============================================================
638
- * Copyright 2013 Twitter, Inc.
639
- *
640
- * Licensed under the Apache License, Version 2.0 (the "License");
641
- * you may not use this file except in compliance with the License.
642
- * You may obtain a copy of the License at
643
- *
644
- * http://www.apache.org/licenses/LICENSE-2.0
645
- *
646
- * Unless required by applicable law or agreed to in writing, software
647
- * distributed under the License is distributed on an "AS IS" BASIS,
648
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
649
- * See the License for the specific language governing permissions and
650
- * limitations under the License.
651
- * ============================================================ */
652
-
653
-
654
- !function ($) {
655
-
656
- "use strict"; // jshint ;_;
657
-
658
-
659
- /* DROPDOWN CLASS DEFINITION
660
- * ========================= */
661
-
662
- var toggle = '[data-toggle=dropdown]'
663
- , Dropdown = function (element) {
664
- var $el = $(element).on('click.dropdown.data-api', this.toggle)
665
- $('html').on('click.dropdown.data-api', function () {
666
- $el.parent().removeClass('open')
667
- })
668
- }
630
+ }(jQuery);
669
631
 
670
- Dropdown.prototype = {
632
+ /* ========================================================================
633
+ * Bootstrap: dropdown.js v3.1.1
634
+ * http://getbootstrap.com/javascript/#dropdowns
635
+ * ========================================================================
636
+ * Copyright 2011-2014 Twitter, Inc.
637
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
638
+ * ======================================================================== */
671
639
 
672
- constructor: Dropdown
673
640
 
674
- , toggle: function (e) {
675
- var $this = $(this)
676
- , $parent
677
- , isActive
641
+ +function ($) {
642
+ 'use strict';
678
643
 
679
- if ($this.is('.disabled, :disabled')) return
644
+ // DROPDOWN CLASS DEFINITION
645
+ // =========================
680
646
 
681
- $parent = getParent($this)
647
+ var backdrop = '.dropdown-backdrop'
648
+ var toggle = '[data-toggle=dropdown]'
649
+ var Dropdown = function (element) {
650
+ $(element).on('click.bs.dropdown', this.toggle)
651
+ }
682
652
 
683
- isActive = $parent.hasClass('open')
653
+ Dropdown.prototype.toggle = function (e) {
654
+ var $this = $(this)
684
655
 
685
- clearMenus()
656
+ if ($this.is('.disabled, :disabled')) return
686
657
 
687
- if (!isActive) {
688
- if ('ontouchstart' in document.documentElement) {
689
- // if mobile we we use a backdrop because click events don't delegate
690
- $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
691
- }
692
- $parent.toggleClass('open')
658
+ var $parent = getParent($this)
659
+ var isActive = $parent.hasClass('open')
660
+
661
+ clearMenus()
662
+
663
+ if (!isActive) {
664
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
665
+ // if mobile we use a backdrop because click events don't delegate
666
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
693
667
  }
694
668
 
695
- $this.focus()
669
+ var relatedTarget = { relatedTarget: this }
670
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
696
671
 
697
- return false
698
- }
672
+ if (e.isDefaultPrevented()) return
699
673
 
700
- , keydown: function (e) {
701
- var $this
702
- , $items
703
- , $active
704
- , $parent
705
- , isActive
706
- , index
674
+ $parent
675
+ .toggleClass('open')
676
+ .trigger('shown.bs.dropdown', relatedTarget)
707
677
 
708
- if (!/(38|40|27)/.test(e.keyCode)) return
678
+ $this.focus()
679
+ }
709
680
 
710
- $this = $(this)
681
+ return false
682
+ }
711
683
 
712
- e.preventDefault()
713
- e.stopPropagation()
684
+ Dropdown.prototype.keydown = function (e) {
685
+ if (!/(38|40|27)/.test(e.keyCode)) return
714
686
 
715
- if ($this.is('.disabled, :disabled')) return
687
+ var $this = $(this)
716
688
 
717
- $parent = getParent($this)
689
+ e.preventDefault()
690
+ e.stopPropagation()
718
691
 
719
- isActive = $parent.hasClass('open')
692
+ if ($this.is('.disabled, :disabled')) return
720
693
 
721
- if (!isActive || (isActive && e.keyCode == 27)) {
722
- if (e.which == 27) $parent.find(toggle).focus()
723
- return $this.click()
724
- }
694
+ var $parent = getParent($this)
695
+ var isActive = $parent.hasClass('open')
725
696
 
726
- $items = $('[role=menu] li:not(.divider):visible a', $parent)
697
+ if (!isActive || (isActive && e.keyCode == 27)) {
698
+ if (e.which == 27) $parent.find(toggle).focus()
699
+ return $this.click()
700
+ }
727
701
 
728
- if (!$items.length) return
702
+ var desc = ' li:not(.divider):visible a'
703
+ var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
729
704
 
730
- index = $items.index($items.filter(':focus'))
705
+ if (!$items.length) return
731
706
 
732
- if (e.keyCode == 38 && index > 0) index-- // up
733
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
734
- if (!~index) index = 0
707
+ var index = $items.index($items.filter(':focus'))
735
708
 
736
- $items
737
- .eq(index)
738
- .focus()
739
- }
709
+ if (e.keyCode == 38 && index > 0) index-- // up
710
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
711
+ if (!~index) index = 0
740
712
 
713
+ $items.eq(index).focus()
741
714
  }
742
715
 
743
- function clearMenus() {
744
- $('.dropdown-backdrop').remove()
716
+ function clearMenus(e) {
717
+ $(backdrop).remove()
745
718
  $(toggle).each(function () {
746
- getParent($(this)).removeClass('open')
719
+ var $parent = getParent($(this))
720
+ var relatedTarget = { relatedTarget: this }
721
+ if (!$parent.hasClass('open')) return
722
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
723
+ if (e.isDefaultPrevented()) return
724
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
747
725
  })
748
726
  }
749
727
 
750
728
  function getParent($this) {
751
729
  var selector = $this.attr('data-target')
752
- , $parent
753
730
 
754
731
  if (!selector) {
755
732
  selector = $this.attr('href')
756
- selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
733
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
757
734
  }
758
735
 
759
- $parent = selector && $(selector)
760
-
761
- if (!$parent || !$parent.length) $parent = $this.parent()
736
+ var $parent = selector && $(selector)
762
737
 
763
- return $parent
738
+ return $parent && $parent.length ? $parent : $this.parent()
764
739
  }
765
740
 
766
741
 
767
- /* DROPDOWN PLUGIN DEFINITION
768
- * ========================== */
742
+ // DROPDOWN PLUGIN DEFINITION
743
+ // ==========================
769
744
 
770
745
  var old = $.fn.dropdown
771
746
 
772
747
  $.fn.dropdown = function (option) {
773
748
  return this.each(function () {
774
749
  var $this = $(this)
775
- , data = $this.data('dropdown')
776
- if (!data) $this.data('dropdown', (data = new Dropdown(this)))
750
+ var data = $this.data('bs.dropdown')
751
+
752
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
777
753
  if (typeof option == 'string') data[option].call($this)
778
754
  })
779
755
  }
@@ -781,8 +757,8 @@
781
757
  $.fn.dropdown.Constructor = Dropdown
782
758
 
783
759
 
784
- /* DROPDOWN NO CONFLICT
785
- * ==================== */
760
+ // DROPDOWN NO CONFLICT
761
+ // ====================
786
762
 
787
763
  $.fn.dropdown.noConflict = function () {
788
764
  $.fn.dropdown = old
@@ -790,237 +766,230 @@
790
766
  }
791
767
 
792
768
 
793
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
794
- * =================================== */
769
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
770
+ // ===================================
795
771
 
796
772
  $(document)
797
- .on('click.dropdown.data-api', clearMenus)
798
- .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
799
- .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
800
- .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
801
-
802
- }(window.jQuery);
803
- /* =========================================================
804
- * bootstrap-modal.js v2.3.2
805
- * http://getbootstrap.com/2.3.2/javascript.html#modals
806
- * =========================================================
807
- * Copyright 2013 Twitter, Inc.
808
- *
809
- * Licensed under the Apache License, Version 2.0 (the "License");
810
- * you may not use this file except in compliance with the License.
811
- * You may obtain a copy of the License at
812
- *
813
- * http://www.apache.org/licenses/LICENSE-2.0
814
- *
815
- * Unless required by applicable law or agreed to in writing, software
816
- * distributed under the License is distributed on an "AS IS" BASIS,
817
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
818
- * See the License for the specific language governing permissions and
819
- * limitations under the License.
820
- * ========================================================= */
821
-
822
-
823
- !function ($) {
824
-
825
- "use strict"; // jshint ;_;
826
-
827
-
828
- /* MODAL CLASS DEFINITION
829
- * ====================== */
773
+ .on('click.bs.dropdown.data-api', clearMenus)
774
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
775
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
776
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
830
777
 
831
- var Modal = function (element, options) {
832
- this.options = options
833
- this.$element = $(element)
834
- .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
835
- this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
836
- }
778
+ }(jQuery);
837
779
 
838
- Modal.prototype = {
780
+ /* ========================================================================
781
+ * Bootstrap: modal.js v3.1.1
782
+ * http://getbootstrap.com/javascript/#modals
783
+ * ========================================================================
784
+ * Copyright 2011-2014 Twitter, Inc.
785
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
786
+ * ======================================================================== */
839
787
 
840
- constructor: Modal
841
788
 
842
- , toggle: function () {
843
- return this[!this.isShown ? 'show' : 'hide']()
844
- }
789
+ +function ($) {
790
+ 'use strict';
845
791
 
846
- , show: function () {
847
- var that = this
848
- , e = $.Event('show')
792
+ // MODAL CLASS DEFINITION
793
+ // ======================
849
794
 
850
- this.$element.trigger(e)
795
+ var Modal = function (element, options) {
796
+ this.options = options
797
+ this.$element = $(element)
798
+ this.$backdrop =
799
+ this.isShown = null
851
800
 
852
- if (this.isShown || e.isDefaultPrevented()) return
801
+ if (this.options.remote) {
802
+ this.$element
803
+ .find('.modal-content')
804
+ .load(this.options.remote, $.proxy(function () {
805
+ this.$element.trigger('loaded.bs.modal')
806
+ }, this))
807
+ }
808
+ }
853
809
 
854
- this.isShown = true
810
+ Modal.DEFAULTS = {
811
+ backdrop: true,
812
+ keyboard: true,
813
+ show: true
814
+ }
855
815
 
856
- this.escape()
816
+ Modal.prototype.toggle = function (_relatedTarget) {
817
+ return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
818
+ }
857
819
 
858
- this.backdrop(function () {
859
- var transition = $.support.transition && that.$element.hasClass('fade')
820
+ Modal.prototype.show = function (_relatedTarget) {
821
+ var that = this
822
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
860
823
 
861
- if (!that.$element.parent().length) {
862
- that.$element.appendTo(document.body) //don't move modals dom position
863
- }
824
+ this.$element.trigger(e)
864
825
 
865
- that.$element.show()
826
+ if (this.isShown || e.isDefaultPrevented()) return
866
827
 
867
- if (transition) {
868
- that.$element[0].offsetWidth // force reflow
869
- }
828
+ this.isShown = true
870
829
 
871
- that.$element
872
- .addClass('in')
873
- .attr('aria-hidden', false)
830
+ this.escape()
874
831
 
875
- that.enforceFocus()
832
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
876
833
 
877
- transition ?
878
- that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
879
- that.$element.focus().trigger('shown')
834
+ this.backdrop(function () {
835
+ var transition = $.support.transition && that.$element.hasClass('fade')
880
836
 
881
- })
837
+ if (!that.$element.parent().length) {
838
+ that.$element.appendTo(document.body) // don't move modals dom position
882
839
  }
883
840
 
884
- , hide: function (e) {
885
- e && e.preventDefault()
841
+ that.$element
842
+ .show()
843
+ .scrollTop(0)
886
844
 
887
- var that = this
845
+ if (transition) {
846
+ that.$element[0].offsetWidth // force reflow
847
+ }
888
848
 
889
- e = $.Event('hide')
849
+ that.$element
850
+ .addClass('in')
851
+ .attr('aria-hidden', false)
890
852
 
891
- this.$element.trigger(e)
853
+ that.enforceFocus()
892
854
 
893
- if (!this.isShown || e.isDefaultPrevented()) return
855
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
894
856
 
895
- this.isShown = false
857
+ transition ?
858
+ that.$element.find('.modal-dialog') // wait for modal to slide in
859
+ .one($.support.transition.end, function () {
860
+ that.$element.focus().trigger(e)
861
+ })
862
+ .emulateTransitionEnd(300) :
863
+ that.$element.focus().trigger(e)
864
+ })
865
+ }
896
866
 
897
- this.escape()
867
+ Modal.prototype.hide = function (e) {
868
+ if (e) e.preventDefault()
898
869
 
899
- $(document).off('focusin.modal')
870
+ e = $.Event('hide.bs.modal')
900
871
 
901
- this.$element
902
- .removeClass('in')
903
- .attr('aria-hidden', true)
872
+ this.$element.trigger(e)
904
873
 
905
- $.support.transition && this.$element.hasClass('fade') ?
906
- this.hideWithTransition() :
907
- this.hideModal()
908
- }
874
+ if (!this.isShown || e.isDefaultPrevented()) return
909
875
 
910
- , enforceFocus: function () {
911
- var that = this
912
- $(document).on('focusin.modal', function (e) {
913
- if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
914
- that.$element.focus()
915
- }
916
- })
917
- }
876
+ this.isShown = false
918
877
 
919
- , escape: function () {
920
- var that = this
921
- if (this.isShown && this.options.keyboard) {
922
- this.$element.on('keyup.dismiss.modal', function ( e ) {
923
- e.which == 27 && that.hide()
924
- })
925
- } else if (!this.isShown) {
926
- this.$element.off('keyup.dismiss.modal')
927
- }
928
- }
878
+ this.escape()
929
879
 
930
- , hideWithTransition: function () {
931
- var that = this
932
- , timeout = setTimeout(function () {
933
- that.$element.off($.support.transition.end)
934
- that.hideModal()
935
- }, 500)
880
+ $(document).off('focusin.bs.modal')
936
881
 
937
- this.$element.one($.support.transition.end, function () {
938
- clearTimeout(timeout)
939
- that.hideModal()
940
- })
941
- }
882
+ this.$element
883
+ .removeClass('in')
884
+ .attr('aria-hidden', true)
885
+ .off('click.dismiss.bs.modal')
942
886
 
943
- , hideModal: function () {
944
- var that = this
945
- this.$element.hide()
946
- this.backdrop(function () {
947
- that.removeBackdrop()
948
- that.$element.trigger('hidden')
949
- })
950
- }
887
+ $.support.transition && this.$element.hasClass('fade') ?
888
+ this.$element
889
+ .one($.support.transition.end, $.proxy(this.hideModal, this))
890
+ .emulateTransitionEnd(300) :
891
+ this.hideModal()
892
+ }
951
893
 
952
- , removeBackdrop: function () {
953
- this.$backdrop && this.$backdrop.remove()
954
- this.$backdrop = null
955
- }
894
+ Modal.prototype.enforceFocus = function () {
895
+ $(document)
896
+ .off('focusin.bs.modal') // guard against infinite focus loop
897
+ .on('focusin.bs.modal', $.proxy(function (e) {
898
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
899
+ this.$element.focus()
900
+ }
901
+ }, this))
902
+ }
956
903
 
957
- , backdrop: function (callback) {
958
- var that = this
959
- , animate = this.$element.hasClass('fade') ? 'fade' : ''
904
+ Modal.prototype.escape = function () {
905
+ if (this.isShown && this.options.keyboard) {
906
+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
907
+ e.which == 27 && this.hide()
908
+ }, this))
909
+ } else if (!this.isShown) {
910
+ this.$element.off('keyup.dismiss.bs.modal')
911
+ }
912
+ }
960
913
 
961
- if (this.isShown && this.options.backdrop) {
962
- var doAnimate = $.support.transition && animate
914
+ Modal.prototype.hideModal = function () {
915
+ var that = this
916
+ this.$element.hide()
917
+ this.backdrop(function () {
918
+ that.removeBackdrop()
919
+ that.$element.trigger('hidden.bs.modal')
920
+ })
921
+ }
963
922
 
964
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
965
- .appendTo(document.body)
923
+ Modal.prototype.removeBackdrop = function () {
924
+ this.$backdrop && this.$backdrop.remove()
925
+ this.$backdrop = null
926
+ }
966
927
 
967
- this.$backdrop.click(
968
- this.options.backdrop == 'static' ?
969
- $.proxy(this.$element[0].focus, this.$element[0])
970
- : $.proxy(this.hide, this)
971
- )
928
+ Modal.prototype.backdrop = function (callback) {
929
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
972
930
 
973
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
931
+ if (this.isShown && this.options.backdrop) {
932
+ var doAnimate = $.support.transition && animate
974
933
 
975
- this.$backdrop.addClass('in')
934
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
935
+ .appendTo(document.body)
976
936
 
977
- if (!callback) return
937
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
938
+ if (e.target !== e.currentTarget) return
939
+ this.options.backdrop == 'static'
940
+ ? this.$element[0].focus.call(this.$element[0])
941
+ : this.hide.call(this)
942
+ }, this))
978
943
 
979
- doAnimate ?
980
- this.$backdrop.one($.support.transition.end, callback) :
981
- callback()
944
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
982
945
 
983
- } else if (!this.isShown && this.$backdrop) {
984
- this.$backdrop.removeClass('in')
946
+ this.$backdrop.addClass('in')
985
947
 
986
- $.support.transition && this.$element.hasClass('fade')?
987
- this.$backdrop.one($.support.transition.end, callback) :
988
- callback()
948
+ if (!callback) return
989
949
 
990
- } else if (callback) {
991
- callback()
992
- }
993
- }
950
+ doAnimate ?
951
+ this.$backdrop
952
+ .one($.support.transition.end, callback)
953
+ .emulateTransitionEnd(150) :
954
+ callback()
955
+
956
+ } else if (!this.isShown && this.$backdrop) {
957
+ this.$backdrop.removeClass('in')
958
+
959
+ $.support.transition && this.$element.hasClass('fade') ?
960
+ this.$backdrop
961
+ .one($.support.transition.end, callback)
962
+ .emulateTransitionEnd(150) :
963
+ callback()
964
+
965
+ } else if (callback) {
966
+ callback()
967
+ }
994
968
  }
995
969
 
996
970
 
997
- /* MODAL PLUGIN DEFINITION
998
- * ======================= */
971
+ // MODAL PLUGIN DEFINITION
972
+ // =======================
999
973
 
1000
974
  var old = $.fn.modal
1001
975
 
1002
- $.fn.modal = function (option) {
976
+ $.fn.modal = function (option, _relatedTarget) {
1003
977
  return this.each(function () {
1004
- var $this = $(this)
1005
- , data = $this.data('modal')
1006
- , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
1007
- if (!data) $this.data('modal', (data = new Modal(this, options)))
1008
- if (typeof option == 'string') data[option]()
1009
- else if (options.show) data.show()
1010
- })
1011
- }
978
+ var $this = $(this)
979
+ var data = $this.data('bs.modal')
980
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1012
981
 
1013
- $.fn.modal.defaults = {
1014
- backdrop: true
1015
- , keyboard: true
1016
- , show: true
982
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
983
+ if (typeof option == 'string') data[option](_relatedTarget)
984
+ else if (options.show) data.show(_relatedTarget)
985
+ })
1017
986
  }
1018
987
 
1019
988
  $.fn.modal.Constructor = Modal
1020
989
 
1021
990
 
1022
- /* MODAL NO CONFLICT
1023
- * ================= */
991
+ // MODAL NO CONFLICT
992
+ // =================
1024
993
 
1025
994
  $.fn.modal.noConflict = function () {
1026
995
  $.fn.modal = old
@@ -1028,644 +997,676 @@
1028
997
  }
1029
998
 
1030
999
 
1031
- /* MODAL DATA-API
1032
- * ============== */
1000
+ // MODAL DATA-API
1001
+ // ==============
1033
1002
 
1034
- $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
1035
- var $this = $(this)
1036
- , href = $this.attr('href')
1037
- , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1038
- , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
1003
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1004
+ var $this = $(this)
1005
+ var href = $this.attr('href')
1006
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1007
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1039
1008
 
1040
- e.preventDefault()
1009
+ if ($this.is('a')) e.preventDefault()
1041
1010
 
1042
1011
  $target
1043
- .modal(option)
1012
+ .modal(option, this)
1044
1013
  .one('hide', function () {
1045
- $this.focus()
1014
+ $this.is(':visible') && $this.focus()
1046
1015
  })
1047
1016
  })
1048
1017
 
1049
- }(window.jQuery);
1050
- /* ===========================================================
1051
- * bootstrap-tooltip.js v2.3.2
1052
- * http://getbootstrap.com/2.3.2/javascript.html#tooltips
1053
- * Inspired by the original jQuery.tipsy by Jason Frame
1054
- * ===========================================================
1055
- * Copyright 2013 Twitter, Inc.
1056
- *
1057
- * Licensed under the Apache License, Version 2.0 (the "License");
1058
- * you may not use this file except in compliance with the License.
1059
- * You may obtain a copy of the License at
1060
- *
1061
- * http://www.apache.org/licenses/LICENSE-2.0
1062
- *
1063
- * Unless required by applicable law or agreed to in writing, software
1064
- * distributed under the License is distributed on an "AS IS" BASIS,
1065
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1066
- * See the License for the specific language governing permissions and
1067
- * limitations under the License.
1068
- * ========================================================== */
1018
+ $(document)
1019
+ .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
1020
+ .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
1069
1021
 
1022
+ }(jQuery);
1070
1023
 
1071
- !function ($) {
1024
+ /* ========================================================================
1025
+ * Bootstrap: tooltip.js v3.1.1
1026
+ * http://getbootstrap.com/javascript/#tooltip
1027
+ * Inspired by the original jQuery.tipsy by Jason Frame
1028
+ * ========================================================================
1029
+ * Copyright 2011-2014 Twitter, Inc.
1030
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1031
+ * ======================================================================== */
1072
1032
 
1073
- "use strict"; // jshint ;_;
1074
1033
 
1034
+ +function ($) {
1035
+ 'use strict';
1075
1036
 
1076
- /* TOOLTIP PUBLIC CLASS DEFINITION
1077
- * =============================== */
1037
+ // TOOLTIP PUBLIC CLASS DEFINITION
1038
+ // ===============================
1078
1039
 
1079
1040
  var Tooltip = function (element, options) {
1041
+ this.type =
1042
+ this.options =
1043
+ this.enabled =
1044
+ this.timeout =
1045
+ this.hoverState =
1046
+ this.$element = null
1047
+
1080
1048
  this.init('tooltip', element, options)
1081
1049
  }
1082
1050
 
1083
- Tooltip.prototype = {
1051
+ Tooltip.DEFAULTS = {
1052
+ animation: true,
1053
+ placement: 'top',
1054
+ selector: false,
1055
+ template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
1056
+ trigger: 'hover focus',
1057
+ title: '',
1058
+ delay: 0,
1059
+ html: false,
1060
+ container: false
1061
+ }
1084
1062
 
1085
- constructor: Tooltip
1063
+ Tooltip.prototype.init = function (type, element, options) {
1064
+ this.enabled = true
1065
+ this.type = type
1066
+ this.$element = $(element)
1067
+ this.options = this.getOptions(options)
1086
1068
 
1087
- , init: function (type, element, options) {
1088
- var eventIn
1089
- , eventOut
1090
- , triggers
1091
- , trigger
1092
- , i
1069
+ var triggers = this.options.trigger.split(' ')
1093
1070
 
1094
- this.type = type
1095
- this.$element = $(element)
1096
- this.options = this.getOptions(options)
1097
- this.enabled = true
1071
+ for (var i = triggers.length; i--;) {
1072
+ var trigger = triggers[i]
1098
1073
 
1099
- triggers = this.options.trigger.split(' ')
1074
+ if (trigger == 'click') {
1075
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1076
+ } else if (trigger != 'manual') {
1077
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
1078
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
1100
1079
 
1101
- for (i = triggers.length; i--;) {
1102
- trigger = triggers[i]
1103
- if (trigger == 'click') {
1104
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1105
- } else if (trigger != 'manual') {
1106
- eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
1107
- eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
1108
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1109
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1110
- }
1080
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1081
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1111
1082
  }
1112
-
1113
- this.options.selector ?
1114
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1115
- this.fixTitle()
1116
1083
  }
1117
1084
 
1118
- , getOptions: function (options) {
1119
- options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
1085
+ this.options.selector ?
1086
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1087
+ this.fixTitle()
1088
+ }
1120
1089
 
1121
- if (options.delay && typeof options.delay == 'number') {
1122
- options.delay = {
1123
- show: options.delay
1124
- , hide: options.delay
1125
- }
1126
- }
1090
+ Tooltip.prototype.getDefaults = function () {
1091
+ return Tooltip.DEFAULTS
1092
+ }
1127
1093
 
1128
- return options
1094
+ Tooltip.prototype.getOptions = function (options) {
1095
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1096
+
1097
+ if (options.delay && typeof options.delay == 'number') {
1098
+ options.delay = {
1099
+ show: options.delay,
1100
+ hide: options.delay
1101
+ }
1129
1102
  }
1130
1103
 
1131
- , enter: function (e) {
1132
- var defaults = $.fn[this.type].defaults
1133
- , options = {}
1134
- , self
1104
+ return options
1105
+ }
1135
1106
 
1136
- this._options && $.each(this._options, function (key, value) {
1137
- if (defaults[key] != value) options[key] = value
1138
- }, this)
1107
+ Tooltip.prototype.getDelegateOptions = function () {
1108
+ var options = {}
1109
+ var defaults = this.getDefaults()
1139
1110
 
1140
- self = $(e.currentTarget)[this.type](options).data(this.type)
1111
+ this._options && $.each(this._options, function (key, value) {
1112
+ if (defaults[key] != value) options[key] = value
1113
+ })
1141
1114
 
1142
- if (!self.options.delay || !self.options.delay.show) return self.show()
1115
+ return options
1116
+ }
1143
1117
 
1144
- clearTimeout(this.timeout)
1145
- self.hoverState = 'in'
1146
- this.timeout = setTimeout(function() {
1147
- if (self.hoverState == 'in') self.show()
1148
- }, self.options.delay.show)
1149
- }
1118
+ Tooltip.prototype.enter = function (obj) {
1119
+ var self = obj instanceof this.constructor ?
1120
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
1150
1121
 
1151
- , leave: function (e) {
1152
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1122
+ clearTimeout(self.timeout)
1153
1123
 
1154
- if (this.timeout) clearTimeout(this.timeout)
1155
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
1124
+ self.hoverState = 'in'
1156
1125
 
1157
- self.hoverState = 'out'
1158
- this.timeout = setTimeout(function() {
1159
- if (self.hoverState == 'out') self.hide()
1160
- }, self.options.delay.hide)
1161
- }
1126
+ if (!self.options.delay || !self.options.delay.show) return self.show()
1162
1127
 
1163
- , show: function () {
1164
- var $tip
1165
- , pos
1166
- , actualWidth
1167
- , actualHeight
1168
- , placement
1169
- , tp
1170
- , e = $.Event('show')
1171
-
1172
- if (this.hasContent() && this.enabled) {
1173
- this.$element.trigger(e)
1174
- if (e.isDefaultPrevented()) return
1175
- $tip = this.tip()
1176
- this.setContent()
1177
-
1178
- if (this.options.animation) {
1179
- $tip.addClass('fade')
1180
- }
1128
+ self.timeout = setTimeout(function () {
1129
+ if (self.hoverState == 'in') self.show()
1130
+ }, self.options.delay.show)
1131
+ }
1181
1132
 
1182
- placement = typeof this.options.placement == 'function' ?
1183
- this.options.placement.call(this, $tip[0], this.$element[0]) :
1184
- this.options.placement
1133
+ Tooltip.prototype.leave = function (obj) {
1134
+ var self = obj instanceof this.constructor ?
1135
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
1185
1136
 
1186
- $tip
1187
- .detach()
1188
- .css({ top: 0, left: 0, display: 'block' })
1137
+ clearTimeout(self.timeout)
1189
1138
 
1190
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1139
+ self.hoverState = 'out'
1191
1140
 
1192
- pos = this.getPosition()
1141
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
1193
1142
 
1194
- actualWidth = $tip[0].offsetWidth
1195
- actualHeight = $tip[0].offsetHeight
1143
+ self.timeout = setTimeout(function () {
1144
+ if (self.hoverState == 'out') self.hide()
1145
+ }, self.options.delay.hide)
1146
+ }
1196
1147
 
1197
- switch (placement) {
1198
- case 'bottom':
1199
- tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
1200
- break
1201
- case 'top':
1202
- tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
1203
- break
1204
- case 'left':
1205
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
1206
- break
1207
- case 'right':
1208
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
1209
- break
1210
- }
1148
+ Tooltip.prototype.show = function () {
1149
+ var e = $.Event('show.bs.' + this.type)
1211
1150
 
1212
- this.applyPlacement(tp, placement)
1213
- this.$element.trigger('shown')
1214
- }
1215
- }
1151
+ if (this.hasContent() && this.enabled) {
1152
+ this.$element.trigger(e)
1153
+
1154
+ if (e.isDefaultPrevented()) return
1155
+ var that = this;
1216
1156
 
1217
- , applyPlacement: function(offset, placement){
1218
1157
  var $tip = this.tip()
1219
- , width = $tip[0].offsetWidth
1220
- , height = $tip[0].offsetHeight
1221
- , actualWidth
1222
- , actualHeight
1223
- , delta
1224
- , replace
1158
+
1159
+ this.setContent()
1160
+
1161
+ if (this.options.animation) $tip.addClass('fade')
1162
+
1163
+ var placement = typeof this.options.placement == 'function' ?
1164
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
1165
+ this.options.placement
1166
+
1167
+ var autoToken = /\s?auto?\s?/i
1168
+ var autoPlace = autoToken.test(placement)
1169
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1225
1170
 
1226
1171
  $tip
1227
- .offset(offset)
1172
+ .detach()
1173
+ .css({ top: 0, left: 0, display: 'block' })
1228
1174
  .addClass(placement)
1229
- .addClass('in')
1230
1175
 
1231
- actualWidth = $tip[0].offsetWidth
1232
- actualHeight = $tip[0].offsetHeight
1176
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1177
+
1178
+ var pos = this.getPosition()
1179
+ var actualWidth = $tip[0].offsetWidth
1180
+ var actualHeight = $tip[0].offsetHeight
1181
+
1182
+ if (autoPlace) {
1183
+ var $parent = this.$element.parent()
1184
+
1185
+ var orgPlacement = placement
1186
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
1187
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
1188
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
1189
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
1190
+
1191
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
1192
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
1193
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
1194
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
1195
+ placement
1233
1196
 
1234
- if (placement == 'top' && actualHeight != height) {
1235
- offset.top = offset.top + height - actualHeight
1236
- replace = true
1197
+ $tip
1198
+ .removeClass(orgPlacement)
1199
+ .addClass(placement)
1237
1200
  }
1238
1201
 
1239
- if (placement == 'bottom' || placement == 'top') {
1240
- delta = 0
1202
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1241
1203
 
1242
- if (offset.left < 0){
1243
- delta = offset.left * -2
1244
- offset.left = 0
1245
- $tip.offset(offset)
1246
- actualWidth = $tip[0].offsetWidth
1247
- actualHeight = $tip[0].offsetHeight
1248
- }
1204
+ this.applyPlacement(calculatedOffset, placement)
1205
+ this.hoverState = null
1249
1206
 
1250
- this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
1251
- } else {
1252
- this.replaceArrow(actualHeight - height, actualHeight, 'top')
1207
+ var complete = function() {
1208
+ that.$element.trigger('shown.bs.' + that.type)
1253
1209
  }
1254
1210
 
1255
- if (replace) $tip.offset(offset)
1211
+ $.support.transition && this.$tip.hasClass('fade') ?
1212
+ $tip
1213
+ .one($.support.transition.end, complete)
1214
+ .emulateTransitionEnd(150) :
1215
+ complete()
1256
1216
  }
1217
+ }
1257
1218
 
1258
- , replaceArrow: function(delta, dimension, position){
1259
- this
1260
- .arrow()
1261
- .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
1262
- }
1219
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
1220
+ var replace
1221
+ var $tip = this.tip()
1222
+ var width = $tip[0].offsetWidth
1223
+ var height = $tip[0].offsetHeight
1224
+
1225
+ // manually read margins because getBoundingClientRect includes difference
1226
+ var marginTop = parseInt($tip.css('margin-top'), 10)
1227
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
1228
+
1229
+ // we must check for NaN for ie 8/9
1230
+ if (isNaN(marginTop)) marginTop = 0
1231
+ if (isNaN(marginLeft)) marginLeft = 0
1232
+
1233
+ offset.top = offset.top + marginTop
1234
+ offset.left = offset.left + marginLeft
1235
+
1236
+ // $.fn.offset doesn't round pixel values
1237
+ // so we use setOffset directly with our own function B-0
1238
+ $.offset.setOffset($tip[0], $.extend({
1239
+ using: function (props) {
1240
+ $tip.css({
1241
+ top: Math.round(props.top),
1242
+ left: Math.round(props.left)
1243
+ })
1244
+ }
1245
+ }, offset), 0)
1263
1246
 
1264
- , setContent: function () {
1265
- var $tip = this.tip()
1266
- , title = this.getTitle()
1247
+ $tip.addClass('in')
1267
1248
 
1268
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1269
- $tip.removeClass('fade in top bottom left right')
1270
- }
1249
+ // check to see if placing tip in new offset caused the tip to resize itself
1250
+ var actualWidth = $tip[0].offsetWidth
1251
+ var actualHeight = $tip[0].offsetHeight
1271
1252
 
1272
- , hide: function () {
1273
- var that = this
1274
- , $tip = this.tip()
1275
- , e = $.Event('hide')
1253
+ if (placement == 'top' && actualHeight != height) {
1254
+ replace = true
1255
+ offset.top = offset.top + height - actualHeight
1256
+ }
1276
1257
 
1277
- this.$element.trigger(e)
1278
- if (e.isDefaultPrevented()) return
1258
+ if (/bottom|top/.test(placement)) {
1259
+ var delta = 0
1279
1260
 
1280
- $tip.removeClass('in')
1261
+ if (offset.left < 0) {
1262
+ delta = offset.left * -2
1263
+ offset.left = 0
1281
1264
 
1282
- function removeWithAnimation() {
1283
- var timeout = setTimeout(function () {
1284
- $tip.off($.support.transition.end).detach()
1285
- }, 500)
1265
+ $tip.offset(offset)
1286
1266
 
1287
- $tip.one($.support.transition.end, function () {
1288
- clearTimeout(timeout)
1289
- $tip.detach()
1290
- })
1267
+ actualWidth = $tip[0].offsetWidth
1268
+ actualHeight = $tip[0].offsetHeight
1291
1269
  }
1292
1270
 
1293
- $.support.transition && this.$tip.hasClass('fade') ?
1294
- removeWithAnimation() :
1295
- $tip.detach()
1271
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
1272
+ } else {
1273
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
1274
+ }
1296
1275
 
1297
- this.$element.trigger('hidden')
1276
+ if (replace) $tip.offset(offset)
1277
+ }
1298
1278
 
1299
- return this
1300
- }
1279
+ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
1280
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
1281
+ }
1301
1282
 
1302
- , fixTitle: function () {
1303
- var $e = this.$element
1304
- if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1305
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1306
- }
1307
- }
1283
+ Tooltip.prototype.setContent = function () {
1284
+ var $tip = this.tip()
1285
+ var title = this.getTitle()
1308
1286
 
1309
- , hasContent: function () {
1310
- return this.getTitle()
1311
- }
1287
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1288
+ $tip.removeClass('fade in top bottom left right')
1289
+ }
1312
1290
 
1313
- , getPosition: function () {
1314
- var el = this.$element[0]
1315
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
1316
- width: el.offsetWidth
1317
- , height: el.offsetHeight
1318
- }, this.$element.offset())
1291
+ Tooltip.prototype.hide = function () {
1292
+ var that = this
1293
+ var $tip = this.tip()
1294
+ var e = $.Event('hide.bs.' + this.type)
1295
+
1296
+ function complete() {
1297
+ if (that.hoverState != 'in') $tip.detach()
1298
+ that.$element.trigger('hidden.bs.' + that.type)
1319
1299
  }
1320
1300
 
1321
- , getTitle: function () {
1322
- var title
1323
- , $e = this.$element
1324
- , o = this.options
1301
+ this.$element.trigger(e)
1325
1302
 
1326
- title = $e.attr('data-original-title')
1327
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1303
+ if (e.isDefaultPrevented()) return
1328
1304
 
1329
- return title
1330
- }
1305
+ $tip.removeClass('in')
1331
1306
 
1332
- , tip: function () {
1333
- return this.$tip = this.$tip || $(this.options.template)
1334
- }
1307
+ $.support.transition && this.$tip.hasClass('fade') ?
1308
+ $tip
1309
+ .one($.support.transition.end, complete)
1310
+ .emulateTransitionEnd(150) :
1311
+ complete()
1335
1312
 
1336
- , arrow: function(){
1337
- return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
1338
- }
1313
+ this.hoverState = null
1339
1314
 
1340
- , validate: function () {
1341
- if (!this.$element[0].parentNode) {
1342
- this.hide()
1343
- this.$element = null
1344
- this.options = null
1345
- }
1346
- }
1315
+ return this
1316
+ }
1347
1317
 
1348
- , enable: function () {
1349
- this.enabled = true
1318
+ Tooltip.prototype.fixTitle = function () {
1319
+ var $e = this.$element
1320
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1321
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1350
1322
  }
1323
+ }
1351
1324
 
1352
- , disable: function () {
1353
- this.enabled = false
1354
- }
1325
+ Tooltip.prototype.hasContent = function () {
1326
+ return this.getTitle()
1327
+ }
1355
1328
 
1356
- , toggleEnabled: function () {
1357
- this.enabled = !this.enabled
1358
- }
1329
+ Tooltip.prototype.getPosition = function () {
1330
+ var el = this.$element[0]
1331
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
1332
+ width: el.offsetWidth,
1333
+ height: el.offsetHeight
1334
+ }, this.$element.offset())
1335
+ }
1359
1336
 
1360
- , toggle: function (e) {
1361
- var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
1362
- self.tip().hasClass('in') ? self.hide() : self.show()
1363
- }
1337
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1338
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1339
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1340
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1341
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1342
+ }
1343
+
1344
+ Tooltip.prototype.getTitle = function () {
1345
+ var title
1346
+ var $e = this.$element
1347
+ var o = this.options
1364
1348
 
1365
- , destroy: function () {
1366
- this.hide().$element.off('.' + this.type).removeData(this.type)
1349
+ title = $e.attr('data-original-title')
1350
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1351
+
1352
+ return title
1353
+ }
1354
+
1355
+ Tooltip.prototype.tip = function () {
1356
+ return this.$tip = this.$tip || $(this.options.template)
1357
+ }
1358
+
1359
+ Tooltip.prototype.arrow = function () {
1360
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
1361
+ }
1362
+
1363
+ Tooltip.prototype.validate = function () {
1364
+ if (!this.$element[0].parentNode) {
1365
+ this.hide()
1366
+ this.$element = null
1367
+ this.options = null
1367
1368
  }
1369
+ }
1370
+
1371
+ Tooltip.prototype.enable = function () {
1372
+ this.enabled = true
1373
+ }
1374
+
1375
+ Tooltip.prototype.disable = function () {
1376
+ this.enabled = false
1377
+ }
1378
+
1379
+ Tooltip.prototype.toggleEnabled = function () {
1380
+ this.enabled = !this.enabled
1381
+ }
1382
+
1383
+ Tooltip.prototype.toggle = function (e) {
1384
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
1385
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1386
+ }
1368
1387
 
1388
+ Tooltip.prototype.destroy = function () {
1389
+ clearTimeout(this.timeout)
1390
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
1369
1391
  }
1370
1392
 
1371
1393
 
1372
- /* TOOLTIP PLUGIN DEFINITION
1373
- * ========================= */
1394
+ // TOOLTIP PLUGIN DEFINITION
1395
+ // =========================
1374
1396
 
1375
1397
  var old = $.fn.tooltip
1376
1398
 
1377
- $.fn.tooltip = function ( option ) {
1399
+ $.fn.tooltip = function (option) {
1378
1400
  return this.each(function () {
1379
- var $this = $(this)
1380
- , data = $this.data('tooltip')
1381
- , options = typeof option == 'object' && option
1382
- if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
1401
+ var $this = $(this)
1402
+ var data = $this.data('bs.tooltip')
1403
+ var options = typeof option == 'object' && option
1404
+
1405
+ if (!data && option == 'destroy') return
1406
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1383
1407
  if (typeof option == 'string') data[option]()
1384
1408
  })
1385
1409
  }
1386
1410
 
1387
1411
  $.fn.tooltip.Constructor = Tooltip
1388
1412
 
1389
- $.fn.tooltip.defaults = {
1390
- animation: true
1391
- , placement: 'top'
1392
- , selector: false
1393
- , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1394
- , trigger: 'hover focus'
1395
- , title: ''
1396
- , delay: 0
1397
- , html: false
1398
- , container: false
1399
- }
1400
-
1401
1413
 
1402
- /* TOOLTIP NO CONFLICT
1403
- * =================== */
1414
+ // TOOLTIP NO CONFLICT
1415
+ // ===================
1404
1416
 
1405
1417
  $.fn.tooltip.noConflict = function () {
1406
1418
  $.fn.tooltip = old
1407
1419
  return this
1408
1420
  }
1409
1421
 
1410
- }(window.jQuery);
1411
- /* ===========================================================
1412
- * bootstrap-popover.js v2.3.2
1413
- * http://getbootstrap.com/2.3.2/javascript.html#popovers
1414
- * ===========================================================
1415
- * Copyright 2013 Twitter, Inc.
1416
- *
1417
- * Licensed under the Apache License, Version 2.0 (the "License");
1418
- * you may not use this file except in compliance with the License.
1419
- * You may obtain a copy of the License at
1420
- *
1421
- * http://www.apache.org/licenses/LICENSE-2.0
1422
- *
1423
- * Unless required by applicable law or agreed to in writing, software
1424
- * distributed under the License is distributed on an "AS IS" BASIS,
1425
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1426
- * See the License for the specific language governing permissions and
1427
- * limitations under the License.
1428
- * =========================================================== */
1429
-
1422
+ }(jQuery);
1430
1423
 
1431
- !function ($) {
1424
+ /* ========================================================================
1425
+ * Bootstrap: popover.js v3.1.1
1426
+ * http://getbootstrap.com/javascript/#popovers
1427
+ * ========================================================================
1428
+ * Copyright 2011-2014 Twitter, Inc.
1429
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1430
+ * ======================================================================== */
1432
1431
 
1433
- "use strict"; // jshint ;_;
1434
1432
 
1433
+ +function ($) {
1434
+ 'use strict';
1435
1435
 
1436
- /* POPOVER PUBLIC CLASS DEFINITION
1437
- * =============================== */
1436
+ // POPOVER PUBLIC CLASS DEFINITION
1437
+ // ===============================
1438
1438
 
1439
1439
  var Popover = function (element, options) {
1440
1440
  this.init('popover', element, options)
1441
1441
  }
1442
1442
 
1443
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1443
1444
 
1444
- /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1445
- ========================================== */
1445
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1446
+ placement: 'right',
1447
+ trigger: 'click',
1448
+ content: '',
1449
+ template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1450
+ })
1446
1451
 
1447
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1448
1452
 
1449
- constructor: Popover
1453
+ // NOTE: POPOVER EXTENDS tooltip.js
1454
+ // ================================
1450
1455
 
1451
- , setContent: function () {
1452
- var $tip = this.tip()
1453
- , title = this.getTitle()
1454
- , content = this.getContent()
1456
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1455
1457
 
1456
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1457
- $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
1458
+ Popover.prototype.constructor = Popover
1458
1459
 
1459
- $tip.removeClass('fade top bottom left right in')
1460
- }
1460
+ Popover.prototype.getDefaults = function () {
1461
+ return Popover.DEFAULTS
1462
+ }
1461
1463
 
1462
- , hasContent: function () {
1463
- return this.getTitle() || this.getContent()
1464
- }
1464
+ Popover.prototype.setContent = function () {
1465
+ var $tip = this.tip()
1466
+ var title = this.getTitle()
1467
+ var content = this.getContent()
1465
1468
 
1466
- , getContent: function () {
1467
- var content
1468
- , $e = this.$element
1469
- , o = this.options
1469
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1470
+ $tip.find('.popover-content')[ // we use append for html objects to maintain js events
1471
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
1472
+ ](content)
1470
1473
 
1471
- content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1472
- || $e.attr('data-content')
1474
+ $tip.removeClass('fade top bottom left right in')
1473
1475
 
1474
- return content
1475
- }
1476
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
1477
+ // this manually by checking the contents.
1478
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1479
+ }
1476
1480
 
1477
- , tip: function () {
1478
- if (!this.$tip) {
1479
- this.$tip = $(this.options.template)
1480
- }
1481
- return this.$tip
1482
- }
1481
+ Popover.prototype.hasContent = function () {
1482
+ return this.getTitle() || this.getContent()
1483
+ }
1483
1484
 
1484
- , destroy: function () {
1485
- this.hide().$element.off('.' + this.type).removeData(this.type)
1486
- }
1485
+ Popover.prototype.getContent = function () {
1486
+ var $e = this.$element
1487
+ var o = this.options
1487
1488
 
1488
- })
1489
+ return $e.attr('data-content')
1490
+ || (typeof o.content == 'function' ?
1491
+ o.content.call($e[0]) :
1492
+ o.content)
1493
+ }
1494
+
1495
+ Popover.prototype.arrow = function () {
1496
+ return this.$arrow = this.$arrow || this.tip().find('.arrow')
1497
+ }
1489
1498
 
1499
+ Popover.prototype.tip = function () {
1500
+ if (!this.$tip) this.$tip = $(this.options.template)
1501
+ return this.$tip
1502
+ }
1490
1503
 
1491
- /* POPOVER PLUGIN DEFINITION
1492
- * ======================= */
1504
+
1505
+ // POPOVER PLUGIN DEFINITION
1506
+ // =========================
1493
1507
 
1494
1508
  var old = $.fn.popover
1495
1509
 
1496
1510
  $.fn.popover = function (option) {
1497
1511
  return this.each(function () {
1498
- var $this = $(this)
1499
- , data = $this.data('popover')
1500
- , options = typeof option == 'object' && option
1501
- if (!data) $this.data('popover', (data = new Popover(this, options)))
1512
+ var $this = $(this)
1513
+ var data = $this.data('bs.popover')
1514
+ var options = typeof option == 'object' && option
1515
+
1516
+ if (!data && option == 'destroy') return
1517
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1502
1518
  if (typeof option == 'string') data[option]()
1503
1519
  })
1504
1520
  }
1505
1521
 
1506
1522
  $.fn.popover.Constructor = Popover
1507
1523
 
1508
- $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1509
- placement: 'right'
1510
- , trigger: 'click'
1511
- , content: ''
1512
- , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1513
- })
1514
-
1515
1524
 
1516
- /* POPOVER NO CONFLICT
1517
- * =================== */
1525
+ // POPOVER NO CONFLICT
1526
+ // ===================
1518
1527
 
1519
1528
  $.fn.popover.noConflict = function () {
1520
1529
  $.fn.popover = old
1521
1530
  return this
1522
1531
  }
1523
1532
 
1524
- }(window.jQuery);
1525
- /* =============================================================
1526
- * bootstrap-scrollspy.js v2.3.2
1527
- * http://getbootstrap.com/2.3.2/javascript.html#scrollspy
1528
- * =============================================================
1529
- * Copyright 2013 Twitter, Inc.
1530
- *
1531
- * Licensed under the Apache License, Version 2.0 (the "License");
1532
- * you may not use this file except in compliance with the License.
1533
- * You may obtain a copy of the License at
1534
- *
1535
- * http://www.apache.org/licenses/LICENSE-2.0
1536
- *
1537
- * Unless required by applicable law or agreed to in writing, software
1538
- * distributed under the License is distributed on an "AS IS" BASIS,
1539
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1540
- * See the License for the specific language governing permissions and
1541
- * limitations under the License.
1542
- * ============================================================== */
1533
+ }(jQuery);
1543
1534
 
1535
+ /* ========================================================================
1536
+ * Bootstrap: scrollspy.js v3.1.1
1537
+ * http://getbootstrap.com/javascript/#scrollspy
1538
+ * ========================================================================
1539
+ * Copyright 2011-2014 Twitter, Inc.
1540
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1541
+ * ======================================================================== */
1544
1542
 
1545
- !function ($) {
1546
1543
 
1547
- "use strict"; // jshint ;_;
1544
+ +function ($) {
1545
+ 'use strict';
1548
1546
 
1549
-
1550
- /* SCROLLSPY CLASS DEFINITION
1551
- * ========================== */
1547
+ // SCROLLSPY CLASS DEFINITION
1548
+ // ==========================
1552
1549
 
1553
1550
  function ScrollSpy(element, options) {
1554
- var process = $.proxy(this.process, this)
1555
- , $element = $(element).is('body') ? $(window) : $(element)
1556
- , href
1557
- this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1558
- this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
1559
- this.selector = (this.options.target
1551
+ var href
1552
+ var process = $.proxy(this.process, this)
1553
+
1554
+ this.$element = $(element).is('body') ? $(window) : $(element)
1555
+ this.$body = $('body')
1556
+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
1557
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1558
+ this.selector = (this.options.target
1560
1559
  || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1561
1560
  || '') + ' .nav li > a'
1562
- this.$body = $('body')
1561
+ this.offsets = $([])
1562
+ this.targets = $([])
1563
+ this.activeTarget = null
1564
+
1563
1565
  this.refresh()
1564
1566
  this.process()
1565
1567
  }
1566
1568
 
1567
- ScrollSpy.prototype = {
1569
+ ScrollSpy.DEFAULTS = {
1570
+ offset: 10
1571
+ }
1568
1572
 
1569
- constructor: ScrollSpy
1573
+ ScrollSpy.prototype.refresh = function () {
1574
+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
1570
1575
 
1571
- , refresh: function () {
1572
- var self = this
1573
- , $targets
1576
+ this.offsets = $([])
1577
+ this.targets = $([])
1574
1578
 
1575
- this.offsets = $([])
1576
- this.targets = $([])
1579
+ var self = this
1580
+ var $targets = this.$body
1581
+ .find(this.selector)
1582
+ .map(function () {
1583
+ var $el = $(this)
1584
+ var href = $el.data('target') || $el.attr('href')
1585
+ var $href = /^#./.test(href) && $(href)
1577
1586
 
1578
- $targets = this.$body
1579
- .find(this.selector)
1580
- .map(function () {
1581
- var $el = $(this)
1582
- , href = $el.data('target') || $el.attr('href')
1583
- , $href = /^#\w/.test(href) && $(href)
1584
- return ( $href
1585
- && $href.length
1586
- && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
1587
- })
1588
- .sort(function (a, b) { return a[0] - b[0] })
1589
- .each(function () {
1590
- self.offsets.push(this[0])
1591
- self.targets.push(this[1])
1592
- })
1593
- }
1587
+ return ($href
1588
+ && $href.length
1589
+ && $href.is(':visible')
1590
+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
1591
+ })
1592
+ .sort(function (a, b) { return a[0] - b[0] })
1593
+ .each(function () {
1594
+ self.offsets.push(this[0])
1595
+ self.targets.push(this[1])
1596
+ })
1597
+ }
1594
1598
 
1595
- , process: function () {
1596
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1597
- , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1598
- , maxScroll = scrollHeight - this.$scrollElement.height()
1599
- , offsets = this.offsets
1600
- , targets = this.targets
1601
- , activeTarget = this.activeTarget
1602
- , i
1603
-
1604
- if (scrollTop >= maxScroll) {
1605
- return activeTarget != (i = targets.last()[0])
1606
- && this.activate ( i )
1607
- }
1599
+ ScrollSpy.prototype.process = function () {
1600
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1601
+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1602
+ var maxScroll = scrollHeight - this.$scrollElement.height()
1603
+ var offsets = this.offsets
1604
+ var targets = this.targets
1605
+ var activeTarget = this.activeTarget
1606
+ var i
1608
1607
 
1609
- for (i = offsets.length; i--;) {
1610
- activeTarget != targets[i]
1611
- && scrollTop >= offsets[i]
1612
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1613
- && this.activate( targets[i] )
1614
- }
1615
- }
1608
+ if (scrollTop >= maxScroll) {
1609
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
1610
+ }
1616
1611
 
1617
- , activate: function (target) {
1618
- var active
1619
- , selector
1612
+ if (activeTarget && scrollTop <= offsets[0]) {
1613
+ return activeTarget != (i = targets[0]) && this.activate(i)
1614
+ }
1620
1615
 
1621
- this.activeTarget = target
1616
+ for (i = offsets.length; i--;) {
1617
+ activeTarget != targets[i]
1618
+ && scrollTop >= offsets[i]
1619
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1620
+ && this.activate( targets[i] )
1621
+ }
1622
+ }
1622
1623
 
1623
- $(this.selector)
1624
- .parent('.active')
1625
- .removeClass('active')
1624
+ ScrollSpy.prototype.activate = function (target) {
1625
+ this.activeTarget = target
1626
1626
 
1627
- selector = this.selector
1628
- + '[data-target="' + target + '"],'
1629
- + this.selector + '[href="' + target + '"]'
1627
+ $(this.selector)
1628
+ .parentsUntil(this.options.target, '.active')
1629
+ .removeClass('active')
1630
1630
 
1631
- active = $(selector)
1632
- .parent('li')
1633
- .addClass('active')
1631
+ var selector = this.selector +
1632
+ '[data-target="' + target + '"],' +
1633
+ this.selector + '[href="' + target + '"]'
1634
1634
 
1635
- if (active.parent('.dropdown-menu').length) {
1636
- active = active.closest('li.dropdown').addClass('active')
1637
- }
1635
+ var active = $(selector)
1636
+ .parents('li')
1637
+ .addClass('active')
1638
1638
 
1639
- active.trigger('activate')
1640
- }
1639
+ if (active.parent('.dropdown-menu').length) {
1640
+ active = active
1641
+ .closest('li.dropdown')
1642
+ .addClass('active')
1643
+ }
1641
1644
 
1645
+ active.trigger('activate.bs.scrollspy')
1642
1646
  }
1643
1647
 
1644
1648
 
1645
- /* SCROLLSPY PLUGIN DEFINITION
1646
- * =========================== */
1649
+ // SCROLLSPY PLUGIN DEFINITION
1650
+ // ===========================
1647
1651
 
1648
1652
  var old = $.fn.scrollspy
1649
1653
 
1650
1654
  $.fn.scrollspy = function (option) {
1651
1655
  return this.each(function () {
1652
- var $this = $(this)
1653
- , data = $this.data('scrollspy')
1654
- , options = typeof option == 'object' && option
1655
- if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1656
+ var $this = $(this)
1657
+ var data = $this.data('bs.scrollspy')
1658
+ var options = typeof option == 'object' && option
1659
+
1660
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
1656
1661
  if (typeof option == 'string') data[option]()
1657
1662
  })
1658
1663
  }
1659
1664
 
1660
1665
  $.fn.scrollspy.Constructor = ScrollSpy
1661
1666
 
1662
- $.fn.scrollspy.defaults = {
1663
- offset: 10
1664
- }
1665
-
1666
1667
 
1667
- /* SCROLLSPY NO CONFLICT
1668
- * ===================== */
1668
+ // SCROLLSPY NO CONFLICT
1669
+ // =====================
1669
1670
 
1670
1671
  $.fn.scrollspy.noConflict = function () {
1671
1672
  $.fn.scrollspy = old
@@ -1673,8 +1674,8 @@
1673
1674
  }
1674
1675
 
1675
1676
 
1676
- /* SCROLLSPY DATA-API
1677
- * ================== */
1677
+ // SCROLLSPY DATA-API
1678
+ // ==================
1678
1679
 
1679
1680
  $(window).on('load', function () {
1680
1681
  $('[data-spy="scroll"]').each(function () {
@@ -1683,125 +1684,108 @@
1683
1684
  })
1684
1685
  })
1685
1686
 
1686
- }(window.jQuery);/* ========================================================
1687
- * bootstrap-tab.js v2.3.2
1688
- * http://getbootstrap.com/2.3.2/javascript.html#tabs
1689
- * ========================================================
1690
- * Copyright 2013 Twitter, Inc.
1691
- *
1692
- * Licensed under the Apache License, Version 2.0 (the "License");
1693
- * you may not use this file except in compliance with the License.
1694
- * You may obtain a copy of the License at
1695
- *
1696
- * http://www.apache.org/licenses/LICENSE-2.0
1697
- *
1698
- * Unless required by applicable law or agreed to in writing, software
1699
- * distributed under the License is distributed on an "AS IS" BASIS,
1700
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1701
- * See the License for the specific language governing permissions and
1702
- * limitations under the License.
1703
- * ======================================================== */
1687
+ }(jQuery);
1704
1688
 
1689
+ /* ========================================================================
1690
+ * Bootstrap: tab.js v3.1.1
1691
+ * http://getbootstrap.com/javascript/#tabs
1692
+ * ========================================================================
1693
+ * Copyright 2011-2014 Twitter, Inc.
1694
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1695
+ * ======================================================================== */
1705
1696
 
1706
- !function ($) {
1707
1697
 
1708
- "use strict"; // jshint ;_;
1698
+ +function ($) {
1699
+ 'use strict';
1709
1700
 
1710
-
1711
- /* TAB CLASS DEFINITION
1712
- * ==================== */
1701
+ // TAB CLASS DEFINITION
1702
+ // ====================
1713
1703
 
1714
1704
  var Tab = function (element) {
1715
1705
  this.element = $(element)
1716
1706
  }
1717
1707
 
1718
- Tab.prototype = {
1708
+ Tab.prototype.show = function () {
1709
+ var $this = this.element
1710
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
1711
+ var selector = $this.data('target')
1712
+
1713
+ if (!selector) {
1714
+ selector = $this.attr('href')
1715
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1716
+ }
1719
1717
 
1720
- constructor: Tab
1718
+ if ($this.parent('li').hasClass('active')) return
1721
1719
 
1722
- , show: function () {
1723
- var $this = this.element
1724
- , $ul = $this.closest('ul:not(.dropdown-menu)')
1725
- , selector = $this.attr('data-target')
1726
- , previous
1727
- , $target
1728
- , e
1720
+ var previous = $ul.find('.active:last a')[0]
1721
+ var e = $.Event('show.bs.tab', {
1722
+ relatedTarget: previous
1723
+ })
1729
1724
 
1730
- if (!selector) {
1731
- selector = $this.attr('href')
1732
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1733
- }
1725
+ $this.trigger(e)
1734
1726
 
1735
- if ( $this.parent('li').hasClass('active') ) return
1727
+ if (e.isDefaultPrevented()) return
1736
1728
 
1737
- previous = $ul.find('.active:last a')[0]
1729
+ var $target = $(selector)
1738
1730
 
1739
- e = $.Event('show', {
1731
+ this.activate($this.parent('li'), $ul)
1732
+ this.activate($target, $target.parent(), function () {
1733
+ $this.trigger({
1734
+ type: 'shown.bs.tab',
1740
1735
  relatedTarget: previous
1741
1736
  })
1737
+ })
1738
+ }
1742
1739
 
1743
- $this.trigger(e)
1744
-
1745
- if (e.isDefaultPrevented()) return
1746
-
1747
- $target = $(selector)
1740
+ Tab.prototype.activate = function (element, container, callback) {
1741
+ var $active = container.find('> .active')
1742
+ var transition = callback
1743
+ && $.support.transition
1744
+ && $active.hasClass('fade')
1748
1745
 
1749
- this.activate($this.parent('li'), $ul)
1750
- this.activate($target, $target.parent(), function () {
1751
- $this.trigger({
1752
- type: 'shown'
1753
- , relatedTarget: previous
1754
- })
1755
- })
1756
- }
1746
+ function next() {
1747
+ $active
1748
+ .removeClass('active')
1749
+ .find('> .dropdown-menu > .active')
1750
+ .removeClass('active')
1757
1751
 
1758
- , activate: function ( element, container, callback) {
1759
- var $active = container.find('> .active')
1760
- , transition = callback
1761
- && $.support.transition
1762
- && $active.hasClass('fade')
1763
-
1764
- function next() {
1765
- $active
1766
- .removeClass('active')
1767
- .find('> .dropdown-menu > .active')
1768
- .removeClass('active')
1769
-
1770
- element.addClass('active')
1771
-
1772
- if (transition) {
1773
- element[0].offsetWidth // reflow for transition
1774
- element.addClass('in')
1775
- } else {
1776
- element.removeClass('fade')
1777
- }
1752
+ element.addClass('active')
1778
1753
 
1779
- if ( element.parent('.dropdown-menu') ) {
1780
- element.closest('li.dropdown').addClass('active')
1781
- }
1782
-
1783
- callback && callback()
1754
+ if (transition) {
1755
+ element[0].offsetWidth // reflow for transition
1756
+ element.addClass('in')
1757
+ } else {
1758
+ element.removeClass('fade')
1784
1759
  }
1785
1760
 
1786
- transition ?
1787
- $active.one($.support.transition.end, next) :
1788
- next()
1761
+ if (element.parent('.dropdown-menu')) {
1762
+ element.closest('li.dropdown').addClass('active')
1763
+ }
1789
1764
 
1790
- $active.removeClass('in')
1765
+ callback && callback()
1791
1766
  }
1767
+
1768
+ transition ?
1769
+ $active
1770
+ .one($.support.transition.end, next)
1771
+ .emulateTransitionEnd(150) :
1772
+ next()
1773
+
1774
+ $active.removeClass('in')
1792
1775
  }
1793
1776
 
1794
1777
 
1795
- /* TAB PLUGIN DEFINITION
1796
- * ===================== */
1778
+ // TAB PLUGIN DEFINITION
1779
+ // =====================
1797
1780
 
1798
1781
  var old = $.fn.tab
1799
1782
 
1800
1783
  $.fn.tab = function ( option ) {
1801
1784
  return this.each(function () {
1802
1785
  var $this = $(this)
1803
- , data = $this.data('tab')
1804
- if (!data) $this.data('tab', (data = new Tab(this)))
1786
+ var data = $this.data('bs.tab')
1787
+
1788
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
1805
1789
  if (typeof option == 'string') data[option]()
1806
1790
  })
1807
1791
  }
@@ -1809,8 +1793,8 @@
1809
1793
  $.fn.tab.Constructor = Tab
1810
1794
 
1811
1795
 
1812
- /* TAB NO CONFLICT
1813
- * =============== */
1796
+ // TAB NO CONFLICT
1797
+ // ===============
1814
1798
 
1815
1799
  $.fn.tab.noConflict = function () {
1816
1800
  $.fn.tab = old
@@ -1818,440 +1802,128 @@
1818
1802
  }
1819
1803
 
1820
1804
 
1821
- /* TAB DATA-API
1822
- * ============ */
1805
+ // TAB DATA-API
1806
+ // ============
1823
1807
 
1824
- $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1808
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1825
1809
  e.preventDefault()
1826
1810
  $(this).tab('show')
1827
1811
  })
1828
1812
 
1829
- }(window.jQuery);/* =============================================================
1830
- * bootstrap-typeahead.js v2.3.2
1831
- * http://getbootstrap.com/2.3.2/javascript.html#typeahead
1832
- * =============================================================
1833
- * Copyright 2013 Twitter, Inc.
1834
- *
1835
- * Licensed under the Apache License, Version 2.0 (the "License");
1836
- * you may not use this file except in compliance with the License.
1837
- * You may obtain a copy of the License at
1838
- *
1839
- * http://www.apache.org/licenses/LICENSE-2.0
1840
- *
1841
- * Unless required by applicable law or agreed to in writing, software
1842
- * distributed under the License is distributed on an "AS IS" BASIS,
1843
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1844
- * See the License for the specific language governing permissions and
1845
- * limitations under the License.
1846
- * ============================================================ */
1847
-
1813
+ }(jQuery);
1848
1814
 
1849
- !function($){
1815
+ /* ========================================================================
1816
+ * Bootstrap: affix.js v3.1.1
1817
+ * http://getbootstrap.com/javascript/#affix
1818
+ * ========================================================================
1819
+ * Copyright 2011-2014 Twitter, Inc.
1820
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1821
+ * ======================================================================== */
1850
1822
 
1851
- "use strict"; // jshint ;_;
1852
1823
 
1824
+ +function ($) {
1825
+ 'use strict';
1853
1826
 
1854
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
1855
- * ================================= */
1827
+ // AFFIX CLASS DEFINITION
1828
+ // ======================
1856
1829
 
1857
- var Typeahead = function (element, options) {
1858
- this.$element = $(element)
1859
- this.options = $.extend({}, $.fn.typeahead.defaults, options)
1860
- this.matcher = this.options.matcher || this.matcher
1861
- this.sorter = this.options.sorter || this.sorter
1862
- this.highlighter = this.options.highlighter || this.highlighter
1863
- this.updater = this.options.updater || this.updater
1864
- this.source = this.options.source
1865
- this.$menu = $(this.options.menu)
1866
- this.shown = false
1867
- this.listen()
1868
- }
1869
-
1870
- Typeahead.prototype = {
1871
-
1872
- constructor: Typeahead
1873
-
1874
- , select: function () {
1875
- var val = this.$menu.find('.active').attr('data-value')
1876
- this.$element
1877
- .val(this.updater(val))
1878
- .change()
1879
- return this.hide()
1880
- }
1881
-
1882
- , updater: function (item) {
1883
- return item
1884
- }
1885
-
1886
- , show: function () {
1887
- var pos = $.extend({}, this.$element.position(), {
1888
- height: this.$element[0].offsetHeight
1889
- })
1890
-
1891
- this.$menu
1892
- .insertAfter(this.$element)
1893
- .css({
1894
- top: pos.top + pos.height
1895
- , left: pos.left
1896
- })
1897
- .show()
1898
-
1899
- this.shown = true
1900
- return this
1901
- }
1902
-
1903
- , hide: function () {
1904
- this.$menu.hide()
1905
- this.shown = false
1906
- return this
1907
- }
1908
-
1909
- , lookup: function (event) {
1910
- var items
1911
-
1912
- this.query = this.$element.val()
1913
-
1914
- if (!this.query || this.query.length < this.options.minLength) {
1915
- return this.shown ? this.hide() : this
1916
- }
1917
-
1918
- items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
1919
-
1920
- return items ? this.process(items) : this
1921
- }
1922
-
1923
- , process: function (items) {
1924
- var that = this
1925
-
1926
- items = $.grep(items, function (item) {
1927
- return that.matcher(item)
1928
- })
1929
-
1930
- items = this.sorter(items)
1931
-
1932
- if (!items.length) {
1933
- return this.shown ? this.hide() : this
1934
- }
1935
-
1936
- return this.render(items.slice(0, this.options.items)).show()
1937
- }
1938
-
1939
- , matcher: function (item) {
1940
- return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1941
- }
1942
-
1943
- , sorter: function (items) {
1944
- var beginswith = []
1945
- , caseSensitive = []
1946
- , caseInsensitive = []
1947
- , item
1948
-
1949
- while (item = items.shift()) {
1950
- if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1951
- else if (~item.indexOf(this.query)) caseSensitive.push(item)
1952
- else caseInsensitive.push(item)
1953
- }
1954
-
1955
- return beginswith.concat(caseSensitive, caseInsensitive)
1956
- }
1957
-
1958
- , highlighter: function (item) {
1959
- var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1960
- return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
1961
- return '<strong>' + match + '</strong>'
1962
- })
1963
- }
1964
-
1965
- , render: function (items) {
1966
- var that = this
1967
-
1968
- items = $(items).map(function (i, item) {
1969
- i = $(that.options.item).attr('data-value', item)
1970
- i.find('a').html(that.highlighter(item))
1971
- return i[0]
1972
- })
1973
-
1974
- items.first().addClass('active')
1975
- this.$menu.html(items)
1976
- return this
1977
- }
1978
-
1979
- , next: function (event) {
1980
- var active = this.$menu.find('.active').removeClass('active')
1981
- , next = active.next()
1982
-
1983
- if (!next.length) {
1984
- next = $(this.$menu.find('li')[0])
1985
- }
1986
-
1987
- next.addClass('active')
1988
- }
1989
-
1990
- , prev: function (event) {
1991
- var active = this.$menu.find('.active').removeClass('active')
1992
- , prev = active.prev()
1993
-
1994
- if (!prev.length) {
1995
- prev = this.$menu.find('li').last()
1996
- }
1997
-
1998
- prev.addClass('active')
1999
- }
2000
-
2001
- , listen: function () {
2002
- this.$element
2003
- .on('focus', $.proxy(this.focus, this))
2004
- .on('blur', $.proxy(this.blur, this))
2005
- .on('keypress', $.proxy(this.keypress, this))
2006
- .on('keyup', $.proxy(this.keyup, this))
2007
-
2008
- if (this.eventSupported('keydown')) {
2009
- this.$element.on('keydown', $.proxy(this.keydown, this))
2010
- }
2011
-
2012
- this.$menu
2013
- .on('click', $.proxy(this.click, this))
2014
- .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
2015
- .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
2016
- }
2017
-
2018
- , eventSupported: function(eventName) {
2019
- var isSupported = eventName in this.$element
2020
- if (!isSupported) {
2021
- this.$element.setAttribute(eventName, 'return;')
2022
- isSupported = typeof this.$element[eventName] === 'function'
2023
- }
2024
- return isSupported
2025
- }
2026
-
2027
- , move: function (e) {
2028
- if (!this.shown) return
2029
-
2030
- switch(e.keyCode) {
2031
- case 9: // tab
2032
- case 13: // enter
2033
- case 27: // escape
2034
- e.preventDefault()
2035
- break
2036
-
2037
- case 38: // up arrow
2038
- e.preventDefault()
2039
- this.prev()
2040
- break
2041
-
2042
- case 40: // down arrow
2043
- e.preventDefault()
2044
- this.next()
2045
- break
2046
- }
2047
-
2048
- e.stopPropagation()
2049
- }
2050
-
2051
- , keydown: function (e) {
2052
- this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
2053
- this.move(e)
2054
- }
2055
-
2056
- , keypress: function (e) {
2057
- if (this.suppressKeyPressRepeat) return
2058
- this.move(e)
2059
- }
1830
+ var Affix = function (element, options) {
1831
+ this.options = $.extend({}, Affix.DEFAULTS, options)
1832
+ this.$window = $(window)
1833
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
1834
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
2060
1835
 
2061
- , keyup: function (e) {
2062
- switch(e.keyCode) {
2063
- case 40: // down arrow
2064
- case 38: // up arrow
2065
- case 16: // shift
2066
- case 17: // ctrl
2067
- case 18: // alt
2068
- break
2069
-
2070
- case 9: // tab
2071
- case 13: // enter
2072
- if (!this.shown) return
2073
- this.select()
2074
- break
2075
-
2076
- case 27: // escape
2077
- if (!this.shown) return
2078
- this.hide()
2079
- break
2080
-
2081
- default:
2082
- this.lookup()
2083
- }
1836
+ this.$element = $(element)
1837
+ this.affixed =
1838
+ this.unpin =
1839
+ this.pinnedOffset = null
2084
1840
 
2085
- e.stopPropagation()
2086
- e.preventDefault()
1841
+ this.checkPosition()
2087
1842
  }
2088
1843
 
2089
- , focus: function (e) {
2090
- this.focused = true
2091
- }
2092
-
2093
- , blur: function (e) {
2094
- this.focused = false
2095
- if (!this.mousedover && this.shown) this.hide()
2096
- }
2097
-
2098
- , click: function (e) {
2099
- e.stopPropagation()
2100
- e.preventDefault()
2101
- this.select()
2102
- this.$element.focus()
2103
- }
2104
-
2105
- , mouseenter: function (e) {
2106
- this.mousedover = true
2107
- this.$menu.find('.active').removeClass('active')
2108
- $(e.currentTarget).addClass('active')
2109
- }
2110
-
2111
- , mouseleave: function (e) {
2112
- this.mousedover = false
2113
- if (!this.focused && this.shown) this.hide()
2114
- }
1844
+ Affix.RESET = 'affix affix-top affix-bottom'
2115
1845
 
1846
+ Affix.DEFAULTS = {
1847
+ offset: 0
2116
1848
  }
2117
1849
 
2118
-
2119
- /* TYPEAHEAD PLUGIN DEFINITION
2120
- * =========================== */
2121
-
2122
- var old = $.fn.typeahead
2123
-
2124
- $.fn.typeahead = function (option) {
2125
- return this.each(function () {
2126
- var $this = $(this)
2127
- , data = $this.data('typeahead')
2128
- , options = typeof option == 'object' && option
2129
- if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
2130
- if (typeof option == 'string') data[option]()
2131
- })
1850
+ Affix.prototype.getPinnedOffset = function () {
1851
+ if (this.pinnedOffset) return this.pinnedOffset
1852
+ this.$element.removeClass(Affix.RESET).addClass('affix')
1853
+ var scrollTop = this.$window.scrollTop()
1854
+ var position = this.$element.offset()
1855
+ return (this.pinnedOffset = position.top - scrollTop)
2132
1856
  }
2133
1857
 
2134
- $.fn.typeahead.defaults = {
2135
- source: []
2136
- , items: 8
2137
- , menu: '<ul class="typeahead dropdown-menu"></ul>'
2138
- , item: '<li><a href="#"></a></li>'
2139
- , minLength: 1
1858
+ Affix.prototype.checkPositionWithEventLoop = function () {
1859
+ setTimeout($.proxy(this.checkPosition, this), 1)
2140
1860
  }
2141
1861
 
2142
- $.fn.typeahead.Constructor = Typeahead
2143
-
2144
-
2145
- /* TYPEAHEAD NO CONFLICT
2146
- * =================== */
2147
-
2148
- $.fn.typeahead.noConflict = function () {
2149
- $.fn.typeahead = old
2150
- return this
2151
- }
2152
-
2153
-
2154
- /* TYPEAHEAD DATA-API
2155
- * ================== */
2156
-
2157
- $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
2158
- var $this = $(this)
2159
- if ($this.data('typeahead')) return
2160
- $this.typeahead($this.data())
2161
- })
2162
-
2163
- }(window.jQuery);
2164
- /* ==========================================================
2165
- * bootstrap-affix.js v2.3.2
2166
- * http://getbootstrap.com/2.3.2/javascript.html#affix
2167
- * ==========================================================
2168
- * Copyright 2013 Twitter, Inc.
2169
- *
2170
- * Licensed under the Apache License, Version 2.0 (the "License");
2171
- * you may not use this file except in compliance with the License.
2172
- * You may obtain a copy of the License at
2173
- *
2174
- * http://www.apache.org/licenses/LICENSE-2.0
2175
- *
2176
- * Unless required by applicable law or agreed to in writing, software
2177
- * distributed under the License is distributed on an "AS IS" BASIS,
2178
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2179
- * See the License for the specific language governing permissions and
2180
- * limitations under the License.
2181
- * ========================================================== */
2182
-
1862
+ Affix.prototype.checkPosition = function () {
1863
+ if (!this.$element.is(':visible')) return
2183
1864
 
2184
- !function ($) {
1865
+ var scrollHeight = $(document).height()
1866
+ var scrollTop = this.$window.scrollTop()
1867
+ var position = this.$element.offset()
1868
+ var offset = this.options.offset
1869
+ var offsetTop = offset.top
1870
+ var offsetBottom = offset.bottom
2185
1871
 
2186
- "use strict"; // jshint ;_;
1872
+ if (this.affixed == 'top') position.top += scrollTop
2187
1873
 
1874
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
1875
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
1876
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2188
1877
 
2189
- /* AFFIX CLASS DEFINITION
2190
- * ====================== */
1878
+ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
1879
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
1880
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
2191
1881
 
2192
- var Affix = function (element, options) {
2193
- this.options = $.extend({}, $.fn.affix.defaults, options)
2194
- this.$window = $(window)
2195
- .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
2196
- .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
2197
- this.$element = $(element)
2198
- this.checkPosition()
2199
- }
1882
+ if (this.affixed === affix) return
1883
+ if (this.unpin) this.$element.css('top', '')
2200
1884
 
2201
- Affix.prototype.checkPosition = function () {
2202
- if (!this.$element.is(':visible')) return
1885
+ var affixType = 'affix' + (affix ? '-' + affix : '')
1886
+ var e = $.Event(affixType + '.bs.affix')
2203
1887
 
2204
- var scrollHeight = $(document).height()
2205
- , scrollTop = this.$window.scrollTop()
2206
- , position = this.$element.offset()
2207
- , offset = this.options.offset
2208
- , offsetBottom = offset.bottom
2209
- , offsetTop = offset.top
2210
- , reset = 'affix affix-top affix-bottom'
2211
- , affix
2212
-
2213
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
2214
- if (typeof offsetTop == 'function') offsetTop = offset.top()
2215
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
2216
-
2217
- affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
2218
- false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
2219
- 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
2220
- 'top' : false
1888
+ this.$element.trigger(e)
2221
1889
 
2222
- if (this.affixed === affix) return
1890
+ if (e.isDefaultPrevented()) return
2223
1891
 
2224
1892
  this.affixed = affix
2225
- this.unpin = affix == 'bottom' ? position.top - scrollTop : null
1893
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
1894
+
1895
+ this.$element
1896
+ .removeClass(Affix.RESET)
1897
+ .addClass(affixType)
1898
+ .trigger($.Event(affixType.replace('affix', 'affixed')))
2226
1899
 
2227
- this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
1900
+ if (affix == 'bottom') {
1901
+ this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
1902
+ }
2228
1903
  }
2229
1904
 
2230
1905
 
2231
- /* AFFIX PLUGIN DEFINITION
2232
- * ======================= */
1906
+ // AFFIX PLUGIN DEFINITION
1907
+ // =======================
2233
1908
 
2234
1909
  var old = $.fn.affix
2235
1910
 
2236
1911
  $.fn.affix = function (option) {
2237
1912
  return this.each(function () {
2238
- var $this = $(this)
2239
- , data = $this.data('affix')
2240
- , options = typeof option == 'object' && option
2241
- if (!data) $this.data('affix', (data = new Affix(this, options)))
1913
+ var $this = $(this)
1914
+ var data = $this.data('bs.affix')
1915
+ var options = typeof option == 'object' && option
1916
+
1917
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
2242
1918
  if (typeof option == 'string') data[option]()
2243
1919
  })
2244
1920
  }
2245
1921
 
2246
1922
  $.fn.affix.Constructor = Affix
2247
1923
 
2248
- $.fn.affix.defaults = {
2249
- offset: 0
2250
- }
2251
-
2252
1924
 
2253
- /* AFFIX NO CONFLICT
2254
- * ================= */
1925
+ // AFFIX NO CONFLICT
1926
+ // =================
2255
1927
 
2256
1928
  $.fn.affix.noConflict = function () {
2257
1929
  $.fn.affix = old
@@ -2259,22 +1931,21 @@
2259
1931
  }
2260
1932
 
2261
1933
 
2262
- /* AFFIX DATA-API
2263
- * ============== */
1934
+ // AFFIX DATA-API
1935
+ // ==============
2264
1936
 
2265
1937
  $(window).on('load', function () {
2266
1938
  $('[data-spy="affix"]').each(function () {
2267
1939
  var $spy = $(this)
2268
- , data = $spy.data()
1940
+ var data = $spy.data()
2269
1941
 
2270
1942
  data.offset = data.offset || {}
2271
1943
 
2272
- data.offsetBottom && (data.offset.bottom = data.offsetBottom)
2273
- data.offsetTop && (data.offset.top = data.offsetTop)
1944
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
1945
+ if (data.offsetTop) data.offset.top = data.offsetTop
2274
1946
 
2275
1947
  $spy.affix(data)
2276
1948
  })
2277
1949
  })
2278
1950
 
2279
-
2280
- }(window.jQuery);
1951
+ }(jQuery);