jekyll-theme-doc-project 0.0.2 → 0.0.3

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