middleman-liaison 0.1.0

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