crosslanguagespotter 0.0.2-java

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