entreprise7pro-bootstrap-sass 3.4.6

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 (171) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +19 -0
  4. data/CHANGELOG.md +233 -0
  5. data/CONTRIBUTING.md +86 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +22 -0
  8. data/README.md +376 -0
  9. data/Rakefile +98 -0
  10. data/assets/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  11. data/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
  12. data/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  13. data/assets/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  14. data/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  15. data/assets/images/.keep +0 -0
  16. data/assets/javascripts/bootstrap/affix.js +166 -0
  17. data/assets/javascripts/bootstrap/alert.js +97 -0
  18. data/assets/javascripts/bootstrap/button.js +136 -0
  19. data/assets/javascripts/bootstrap/carousel.js +248 -0
  20. data/assets/javascripts/bootstrap/collapse.js +214 -0
  21. data/assets/javascripts/bootstrap/dropdown.js +167 -0
  22. data/assets/javascripts/bootstrap/modal.js +356 -0
  23. data/assets/javascripts/bootstrap/popover.js +123 -0
  24. data/assets/javascripts/bootstrap/scrollspy.js +174 -0
  25. data/assets/javascripts/bootstrap/tab.js +157 -0
  26. data/assets/javascripts/bootstrap/tooltip.js +679 -0
  27. data/assets/javascripts/bootstrap/transition.js +61 -0
  28. data/assets/javascripts/bootstrap-sprockets.js +12 -0
  29. data/assets/javascripts/bootstrap.js +2611 -0
  30. data/assets/javascripts/bootstrap.min.js +7 -0
  31. data/assets/javascripts/jquery.min.js +2 -0
  32. data/assets/stylesheets/_bootstrap-compass.scss +9 -0
  33. data/assets/stylesheets/_bootstrap-mincer.scss +19 -0
  34. data/assets/stylesheets/_bootstrap-sprockets.scss +9 -0
  35. data/assets/stylesheets/_bootstrap.scss +56 -0
  36. data/assets/stylesheets/bootstrap/_alerts.scss +73 -0
  37. data/assets/stylesheets/bootstrap/_badges.scss +68 -0
  38. data/assets/stylesheets/bootstrap/_breadcrumbs.scss +28 -0
  39. data/assets/stylesheets/bootstrap/_button-groups.scss +244 -0
  40. data/assets/stylesheets/bootstrap/_buttons.scss +168 -0
  41. data/assets/stylesheets/bootstrap/_carousel.scss +263 -0
  42. data/assets/stylesheets/bootstrap/_close.scss +37 -0
  43. data/assets/stylesheets/bootstrap/_code.scss +70 -0
  44. data/assets/stylesheets/bootstrap/_component-animations.scss +38 -0
  45. data/assets/stylesheets/bootstrap/_dropdowns.scss +212 -0
  46. data/assets/stylesheets/bootstrap/_forms.scss +602 -0
  47. data/assets/stylesheets/bootstrap/_glyphicons.scss +307 -0
  48. data/assets/stylesheets/bootstrap/_grid.scss +94 -0
  49. data/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
  50. data/assets/stylesheets/bootstrap/_jumbotron.scss +55 -0
  51. data/assets/stylesheets/bootstrap/_labels.scss +66 -0
  52. data/assets/stylesheets/bootstrap/_list-group.scss +128 -0
  53. data/assets/stylesheets/bootstrap/_media.scss +66 -0
  54. data/assets/stylesheets/bootstrap/_mixins.scss +39 -0
  55. data/assets/stylesheets/bootstrap/_modals.scss +150 -0
  56. data/assets/stylesheets/bootstrap/_navbar.scss +657 -0
  57. data/assets/stylesheets/bootstrap/_navs.scss +242 -0
  58. data/assets/stylesheets/bootstrap/_normalize.scss +422 -0
  59. data/assets/stylesheets/bootstrap/_pager.scss +54 -0
  60. data/assets/stylesheets/bootstrap/_pagination.scss +86 -0
  61. data/assets/stylesheets/bootstrap/_panels.scss +271 -0
  62. data/assets/stylesheets/bootstrap/_popovers.scss +126 -0
  63. data/assets/stylesheets/bootstrap/_print.scss +99 -0
  64. data/assets/stylesheets/bootstrap/_progress-bars.scss +87 -0
  65. data/assets/stylesheets/bootstrap/_responsive-embed.scss +35 -0
  66. data/assets/stylesheets/bootstrap/_responsive-utilities.scss +157 -0
  67. data/assets/stylesheets/bootstrap/_scaffolding.scss +161 -0
  68. data/assets/stylesheets/bootstrap/_tables.scss +233 -0
  69. data/assets/stylesheets/bootstrap/_theme.scss +293 -0
  70. data/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
  71. data/assets/stylesheets/bootstrap/_tooltip.scss +112 -0
  72. data/assets/stylesheets/bootstrap/_type.scss +299 -0
  73. data/assets/stylesheets/bootstrap/_utilities.scss +55 -0
  74. data/assets/stylesheets/bootstrap/_variables.scss +875 -0
  75. data/assets/stylesheets/bootstrap/_wells.scss +29 -0
  76. data/assets/stylesheets/bootstrap/mixins/_alerts.scss +15 -0
  77. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +12 -0
  78. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  79. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +61 -0
  80. data/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  81. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  82. data/assets/stylesheets/bootstrap/mixins/_forms.scss +88 -0
  83. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +50 -0
  84. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +82 -0
  85. data/assets/stylesheets/bootstrap/mixins/_grid.scss +123 -0
  86. data/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  87. data/assets/stylesheets/bootstrap/mixins/_image.scss +28 -0
  88. data/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  89. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +32 -0
  90. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +11 -0
  91. data/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +10 -0
  92. data/assets/stylesheets/bootstrap/mixins/_opacity.scss +7 -0
  93. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +24 -0
  94. data/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
  95. data/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
  96. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +18 -0
  97. data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  98. data/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +17 -0
  99. data/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  100. data/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  101. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  102. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +12 -0
  103. data/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  104. data/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +210 -0
  105. data/bower.json +38 -0
  106. data/composer.json +21 -0
  107. data/entreprise7pro-bootstrap-sass.gemspec +37 -0
  108. data/eyeglass-exports.js +7 -0
  109. data/lib/entreprise7pro-bootstrap-sass/engine.rb +17 -0
  110. data/lib/entreprise7pro-bootstrap-sass/version.rb +4 -0
  111. data/lib/entreprise7pro-bootstrap-sass.rb +91 -0
  112. data/package-lock.json +1011 -0
  113. data/package.json +48 -0
  114. data/sache.json +5 -0
  115. data/tasks/bower.rake +31 -0
  116. data/tasks/converter/char_string_scanner.rb +38 -0
  117. data/tasks/converter/fonts_conversion.rb +16 -0
  118. data/tasks/converter/js_conversion.rb +47 -0
  119. data/tasks/converter/less_conversion.rb +752 -0
  120. data/tasks/converter/logger.rb +57 -0
  121. data/tasks/converter/network.rb +97 -0
  122. data/tasks/converter.rb +80 -0
  123. data/templates/project/_bootstrap-variables.sass +876 -0
  124. data/templates/project/manifest.rb +20 -0
  125. data/templates/project/styles.sass +6 -0
  126. data/test/compilation_test.rb +30 -0
  127. data/test/dummy_node_mincer/apple-touch-icon-144-precomposed.png +0 -0
  128. data/test/dummy_node_mincer/application.css.ejs.scss +6 -0
  129. data/test/dummy_node_mincer/manifest.js +87 -0
  130. data/test/dummy_rails/README.rdoc +3 -0
  131. data/test/dummy_rails/Rakefile +6 -0
  132. data/test/dummy_rails/app/assets/images/.keep +0 -0
  133. data/test/dummy_rails/app/assets/javascripts/application.js +2 -0
  134. data/test/dummy_rails/app/assets/stylesheets/application.sass +2 -0
  135. data/test/dummy_rails/app/controllers/application_controller.rb +5 -0
  136. data/test/dummy_rails/app/controllers/pages_controller.rb +4 -0
  137. data/test/dummy_rails/app/helpers/application_helper.rb +2 -0
  138. data/test/dummy_rails/app/views/layouts/application.html.erb +14 -0
  139. data/test/dummy_rails/app/views/pages/root.html.slim +84 -0
  140. data/test/dummy_rails/config/application.rb +31 -0
  141. data/test/dummy_rails/config/boot.rb +5 -0
  142. data/test/dummy_rails/config/environment.rb +5 -0
  143. data/test/dummy_rails/config/environments/development.rb +23 -0
  144. data/test/dummy_rails/config/environments/production.rb +82 -0
  145. data/test/dummy_rails/config/environments/test.rb +38 -0
  146. data/test/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  147. data/test/dummy_rails/config/initializers/filter_parameter_logging.rb +4 -0
  148. data/test/dummy_rails/config/initializers/inflections.rb +16 -0
  149. data/test/dummy_rails/config/initializers/mime_types.rb +5 -0
  150. data/test/dummy_rails/config/initializers/secret_token.rb +18 -0
  151. data/test/dummy_rails/config/initializers/session_store.rb +3 -0
  152. data/test/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  153. data/test/dummy_rails/config/locales/en.yml +3 -0
  154. data/test/dummy_rails/config/locales/es.yml +3 -0
  155. data/test/dummy_rails/config/routes.rb +3 -0
  156. data/test/dummy_rails/config.ru +4 -0
  157. data/test/dummy_rails/log/.keep +0 -0
  158. data/test/dummy_sass_only/Gemfile +4 -0
  159. data/test/dummy_sass_only/compile.rb +20 -0
  160. data/test/dummy_sass_only/import_all.scss +2 -0
  161. data/test/gemfiles/default.gemfile +3 -0
  162. data/test/node_mincer_test.rb +35 -0
  163. data/test/node_sass_compile_test.sh +9 -0
  164. data/test/pages_test.rb +14 -0
  165. data/test/sass_test.rb +29 -0
  166. data/test/sprockets_rails_test.rb +31 -0
  167. data/test/support/dummy_rails_integration.rb +22 -0
  168. data/test/support/reporting.rb +27 -0
  169. data/test/test_helper.rb +36 -0
  170. data/test/test_helper_rails.rb +6 -0
  171. metadata +467 -0
@@ -0,0 +1,2611 @@
1
+ /*!
2
+ * Bootstrap v3.4.3 (https://bootstrap.7pro.ca/)
3
+ * Copyright 2024 Entreprise 7pro.ca Inc since v3.4.2
4
+ * Copyright 2011-2019 Twitter Inc (now X)
5
+ * Licensed under the MIT license
6
+ */
7
+
8
+ if (typeof $ != 'undefined') {
9
+ jQuery = $;
10
+ }
11
+ if (typeof jQuery === 'undefined') {
12
+ throw new Error('Bootstrap\'s JavaScript requires jQuery');
13
+ }
14
+
15
+ +function ($) {
16
+ 'use strict';
17
+ var version = $.fn.jquery.split(' ')[0].split('.')
18
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 4)) {
19
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 5')
20
+ }
21
+ }(jQuery);
22
+
23
+ /* ========================================================================
24
+ * Bootstrap: transition.js v3.4.3
25
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#transitions
26
+ * ========================================================================
27
+ * Copyright 2024 Entreprise 7pro.ca Inc.
28
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
29
+ * Copyright 2011-2019 Twitter, Inc.
30
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
31
+ * ======================================================================== */
32
+
33
+
34
+ +function ($) {
35
+ 'use strict';
36
+
37
+ // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
38
+ // ============================================================
39
+
40
+ function transitionEnd() {
41
+ var el = document.createElement('bootstrap')
42
+
43
+ var transEndEventNames = {
44
+ WebkitTransition : 'webkitTransitionEnd',
45
+ MozTransition : 'transitionend',
46
+ OTransition : 'oTransitionEnd otransitionend',
47
+ transition : 'transitionend'
48
+ }
49
+
50
+ for (var name in transEndEventNames) {
51
+ if (el.style[name] !== undefined) {
52
+ return { end: transEndEventNames[name] }
53
+ }
54
+ }
55
+
56
+ return false // explicit for ie8 ( ._.)
57
+ }
58
+
59
+ // https://blog.alexmaccaw.com/css-transitions
60
+ $.fn.emulateTransitionEnd = function (duration) {
61
+ var called = false
62
+ var $el = this
63
+ $(this).one('bsTransitionEnd', function () { called = true })
64
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
65
+ setTimeout(callback, duration)
66
+ return this
67
+ }
68
+
69
+ $(function () {
70
+ $.support.transition = transitionEnd()
71
+
72
+ if (!$.support.transition) return
73
+
74
+ $.event.special.bsTransitionEnd = {
75
+ bindType: $.support.transition.end,
76
+ delegateType: $.support.transition.end,
77
+ handle: function (e) {
78
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
79
+ }
80
+ }
81
+ })
82
+
83
+ }(jQuery);
84
+
85
+ /* ========================================================================
86
+ * Bootstrap: alert.js v3.4.3
87
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#alerts
88
+ * ========================================================================
89
+ * Copyright 2024 Entreprise 7pro.ca Inc.
90
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
91
+ * Copyright 2011-2019 Twitter, Inc.
92
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
93
+ * ======================================================================== */
94
+
95
+
96
+ +function ($) {
97
+ 'use strict';
98
+
99
+ // ALERT CLASS DEFINITION
100
+ // ======================
101
+
102
+ var dismiss = '[data-dismiss="alert"]'
103
+ var Alert = function (el) {
104
+ $(el).on('click', dismiss, this.close)
105
+ }
106
+
107
+ Alert.VERSION = '3.4.3'
108
+
109
+ Alert.TRANSITION_DURATION = 150
110
+
111
+ Alert.prototype.close = function (e) {
112
+ var $this = $(this)
113
+ var selector = $this.attr('data-target')
114
+
115
+ if (!selector) {
116
+ selector = $this.attr('href')
117
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
118
+ }
119
+
120
+ selector = selector === '#' ? [] : selector
121
+ var $parent = $(document).find(selector)
122
+
123
+ if (e) e.preventDefault()
124
+
125
+ if (!$parent.length) {
126
+ $parent = $this.closest('.alert')
127
+ }
128
+
129
+ $parent.trigger(e = $.Event('close.bs.alert'))
130
+
131
+ if (e.isDefaultPrevented()) return
132
+
133
+ $parent.removeClass('in')
134
+
135
+ function removeElement() {
136
+ // detach from parent, fire event then clean up data
137
+ $parent.detach().trigger('closed.bs.alert').remove()
138
+ }
139
+
140
+ $.support.transition && $parent.hasClass('fade') ?
141
+ $parent
142
+ .one('bsTransitionEnd', removeElement)
143
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
144
+ removeElement()
145
+ }
146
+
147
+
148
+ // ALERT PLUGIN DEFINITION
149
+ // =======================
150
+
151
+ function Plugin(option) {
152
+ return this.each(function () {
153
+ var $this = $(this)
154
+ var data = $this.data('bs.alert')
155
+
156
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
157
+ if (typeof option == 'string') data[option].call($this)
158
+ })
159
+ }
160
+
161
+ var old = $.fn.alert
162
+
163
+ $.fn.alert = Plugin
164
+ $.fn.alert.Constructor = Alert
165
+
166
+
167
+ // ALERT NO CONFLICT
168
+ // =================
169
+
170
+ $.fn.alert.noConflict = function () {
171
+ $.fn.alert = old
172
+ return this
173
+ }
174
+
175
+
176
+ // ALERT DATA-API
177
+ // ==============
178
+
179
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
180
+
181
+ }(jQuery);
182
+
183
+ /* ========================================================================
184
+ * Bootstrap: button.js v3.4.3
185
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#buttons
186
+ * ========================================================================
187
+ * Copyright 2024 Entreprise 7pro.ca Inc.
188
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
189
+ * Copyright 2011-2019 Twitter, Inc.
190
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
191
+ * ======================================================================== */
192
+
193
+
194
+ +function ($) {
195
+ 'use strict';
196
+
197
+ // BUTTON PUBLIC CLASS DEFINITION
198
+ // ==============================
199
+
200
+ var Button = function (element, options) {
201
+ this.$element = $(element)
202
+ this.options = $.extend({}, Button.DEFAULTS, options)
203
+ this.isLoading = false
204
+ }
205
+
206
+ Button.VERSION = '3.4.3'
207
+
208
+ Button.DEFAULTS = {
209
+ loadingText: 'loading...'
210
+ }
211
+
212
+ Button.prototype.sanitize = function (unsafeText) {
213
+ return unsafeText
214
+ .replace(/&/g, '&amp;')
215
+ .replace(/</g, '&lt;')
216
+ .replace(/>/g, '&gt;')
217
+ .replace(/"/g, '&quot;')
218
+ .replace(/'/g, '&#039;');
219
+ }
220
+
221
+ Button.prototype.setState = function (state) {
222
+ var d = 'disabled'
223
+ var $el = this.$element
224
+ var val = $el.is('input') ? 'val' : 'html'
225
+ var data = $el.data()
226
+
227
+ state += 'Text'
228
+
229
+ if (data.resetText == null) $el.data('resetText', $el[val]())
230
+
231
+ // push to event loop to allow forms to submit
232
+ setTimeout($.proxy(function () {
233
+ $el[val](data[state] == null ? this.options[state] : this.sanitize(data[state]))
234
+
235
+ if (state == 'loadingText') {
236
+ this.isLoading = true
237
+ $el.addClass(d).attr(d, d).prop(d, true)
238
+ } else if (this.isLoading) {
239
+ this.isLoading = false
240
+ $el.removeClass(d).removeAttr(d).prop(d, false)
241
+ }
242
+ }, this), 0)
243
+ }
244
+
245
+ Button.prototype.toggle = function () {
246
+ var changed = true
247
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
248
+
249
+ if ($parent.length) {
250
+ var $input = this.$element.find('input')
251
+ if ($input.prop('type') == 'radio') {
252
+ if ($input.prop('checked')) changed = false
253
+ $parent.find('.active').removeClass('active')
254
+ this.$element.addClass('active')
255
+ } else if ($input.prop('type') == 'checkbox') {
256
+ if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
257
+ this.$element.toggleClass('active')
258
+ }
259
+ $input.prop('checked', this.$element.hasClass('active'))
260
+ if (changed) $input.trigger('change')
261
+ } else {
262
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
263
+ this.$element.toggleClass('active')
264
+ }
265
+ }
266
+
267
+
268
+ // BUTTON PLUGIN DEFINITION
269
+ // ========================
270
+
271
+ function Plugin(option) {
272
+ return this.each(function () {
273
+ var $this = $(this)
274
+ var data = $this.data('bs.button')
275
+ var options = typeof option == 'object' && option
276
+
277
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
278
+
279
+ if (option == 'toggle') data.toggle()
280
+ else if (option) data.setState(option)
281
+ })
282
+ }
283
+
284
+ var old = $.fn.button
285
+
286
+ $.fn.button = Plugin
287
+ $.fn.button.Constructor = Button
288
+
289
+
290
+ // BUTTON NO CONFLICT
291
+ // ==================
292
+
293
+ $.fn.button.noConflict = function () {
294
+ $.fn.button = old
295
+ return this
296
+ }
297
+
298
+
299
+ // BUTTON DATA-API
300
+ // ===============
301
+
302
+ $(document)
303
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
304
+ var $btn = $(e.target).closest('.btn')
305
+ Plugin.call($btn, 'toggle')
306
+ if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
307
+ // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
308
+ e.preventDefault()
309
+ // The target component still receive the focus
310
+ if ($btn.is('input,button')) $btn.trigger('focus')
311
+ else $btn.find('input:visible,button:visible').first().trigger('focus')
312
+ }
313
+ })
314
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
315
+ $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
316
+ })
317
+
318
+ }(jQuery);
319
+
320
+ /* ========================================================================
321
+ * Bootstrap: carousel.js v3.4.3
322
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#carousel
323
+ * ========================================================================
324
+ * Copyright 2024 Entreprise 7pro.ca Inc.
325
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
326
+ * Copyright 2011-2019 Twitter, Inc.
327
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
328
+ * ======================================================================== */
329
+
330
+
331
+ +function ($) {
332
+ 'use strict';
333
+
334
+ // CAROUSEL CLASS DEFINITION
335
+ // =========================
336
+
337
+ var Carousel = function (element, options) {
338
+ this.$element = $(element)
339
+ this.$indicators = this.$element.find('.carousel-indicators')
340
+ this.options = options
341
+ this.paused = null
342
+ this.sliding = null
343
+ this.interval = null
344
+ this.$active = null
345
+ this.$items = null
346
+
347
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
348
+
349
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
350
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
351
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
352
+ }
353
+
354
+ Carousel.VERSION = '3.4.3'
355
+
356
+ Carousel.TRANSITION_DURATION = 600
357
+
358
+ Carousel.DEFAULTS = {
359
+ interval: 5000,
360
+ pause: 'hover',
361
+ wrap: true,
362
+ keyboard: true
363
+ }
364
+
365
+ Carousel.prototype.keydown = function (e) {
366
+ if (/input|textarea/i.test(e.target.tagName)) return
367
+ switch (e.which) {
368
+ case 37: this.prev(); break
369
+ case 39: this.next(); break
370
+ default: return
371
+ }
372
+
373
+ e.preventDefault()
374
+ }
375
+
376
+ Carousel.prototype.cycle = function (e) {
377
+ e || (this.paused = false)
378
+
379
+ this.interval && clearInterval(this.interval)
380
+
381
+ this.options.interval
382
+ && !this.paused
383
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
384
+
385
+ return this
386
+ }
387
+
388
+ Carousel.prototype.getItemIndex = function (item) {
389
+ this.$items = item.parent().children('.item')
390
+ return this.$items.index(item || this.$active)
391
+ }
392
+
393
+ Carousel.prototype.getItemForDirection = function (direction, active) {
394
+ var activeIndex = this.getItemIndex(active)
395
+ var willWrap = (direction == 'prev' && activeIndex === 0)
396
+ || (direction == 'next' && activeIndex == (this.$items.length - 1))
397
+ if (willWrap && !this.options.wrap) return active
398
+ var delta = direction == 'prev' ? -1 : 1
399
+ var itemIndex = (activeIndex + delta) % this.$items.length
400
+ return this.$items.eq(itemIndex)
401
+ }
402
+
403
+ Carousel.prototype.to = function (pos) {
404
+ var that = this
405
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
406
+
407
+ if (pos > (this.$items.length - 1) || pos < 0) return
408
+
409
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
410
+ if (activeIndex == pos) return this.pause().cycle()
411
+
412
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
413
+ }
414
+
415
+ Carousel.prototype.pause = function (e) {
416
+ e || (this.paused = true)
417
+
418
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
419
+ this.$element.trigger($.support.transition.end)
420
+ this.cycle(true)
421
+ }
422
+
423
+ this.interval = clearInterval(this.interval)
424
+
425
+ return this
426
+ }
427
+
428
+ Carousel.prototype.next = function () {
429
+ if (this.sliding) return
430
+ return this.slide('next')
431
+ }
432
+
433
+ Carousel.prototype.prev = function () {
434
+ if (this.sliding) return
435
+ return this.slide('prev')
436
+ }
437
+
438
+ Carousel.prototype.slide = function (type, next) {
439
+ var $active = this.$element.find('.item.active')
440
+ var $next = next || this.getItemForDirection(type, $active)
441
+ var isCycling = this.interval
442
+ var direction = type == 'next' ? 'left' : 'right'
443
+ var that = this
444
+
445
+ if ($next.hasClass('active')) return (this.sliding = false)
446
+
447
+ var relatedTarget = $next[0]
448
+ var slideEvent = $.Event('slide.bs.carousel', {
449
+ relatedTarget: relatedTarget,
450
+ direction: direction
451
+ })
452
+ this.$element.trigger(slideEvent)
453
+ if (slideEvent.isDefaultPrevented()) return
454
+
455
+ this.sliding = true
456
+
457
+ isCycling && this.pause()
458
+
459
+ if (this.$indicators.length) {
460
+ this.$indicators.find('.active').removeClass('active')
461
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
462
+ $nextIndicator && $nextIndicator.addClass('active')
463
+ }
464
+
465
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
466
+ if ($.support.transition && this.$element.hasClass('slide')) {
467
+ $next.addClass(type)
468
+ if (typeof $next === 'object' && $next.length) {
469
+ $next[0].offsetWidth // force reflow
470
+ }
471
+ $active.addClass(direction)
472
+ $next.addClass(direction)
473
+ $active
474
+ .one('bsTransitionEnd', function () {
475
+ $next.removeClass([type, direction].join(' ')).addClass('active')
476
+ $active.removeClass(['active', direction].join(' '))
477
+ that.sliding = false
478
+ setTimeout(function () {
479
+ that.$element.trigger(slidEvent)
480
+ }, 0)
481
+ })
482
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
483
+ } else {
484
+ $active.removeClass('active')
485
+ $next.addClass('active')
486
+ this.sliding = false
487
+ this.$element.trigger(slidEvent)
488
+ }
489
+
490
+ isCycling && this.cycle()
491
+
492
+ return this
493
+ }
494
+
495
+
496
+ // CAROUSEL PLUGIN DEFINITION
497
+ // ==========================
498
+
499
+ function Plugin(option) {
500
+ return this.each(function () {
501
+ var $this = $(this)
502
+ var data = $this.data('bs.carousel')
503
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
504
+ var action = typeof option == 'string' ? option : options.slide
505
+
506
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
507
+ if (typeof option == 'number') data.to(option)
508
+ else if (action) data[action]()
509
+ else if (options.interval) data.pause().cycle()
510
+ })
511
+ }
512
+
513
+ var old = $.fn.carousel
514
+
515
+ $.fn.carousel = Plugin
516
+ $.fn.carousel.Constructor = Carousel
517
+
518
+
519
+ // CAROUSEL NO CONFLICT
520
+ // ====================
521
+
522
+ $.fn.carousel.noConflict = function () {
523
+ $.fn.carousel = old
524
+ return this
525
+ }
526
+
527
+
528
+ // CAROUSEL DATA-API
529
+ // =================
530
+
531
+ var clickHandler = function (e) {
532
+ var $this = $(this)
533
+ var href = $this.attr('href')
534
+ if (href) {
535
+ href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
536
+ }
537
+
538
+ var target = $this.attr('data-target') || href
539
+ var $target = $(document).find(target)
540
+
541
+ if (!$target.hasClass('carousel')) return
542
+
543
+ var options = $.extend({}, $target.data(), $this.data())
544
+ var slideIndex = $this.attr('data-slide-to')
545
+ if (slideIndex) options.interval = false
546
+
547
+ Plugin.call($target, options)
548
+
549
+ if (slideIndex) {
550
+ $target.data('bs.carousel').to(slideIndex)
551
+ }
552
+
553
+ e.preventDefault()
554
+ }
555
+
556
+ $(document)
557
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
558
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
559
+
560
+ $(window).on('load', function () {
561
+ $('[data-ride="carousel"]').each(function () {
562
+ var $carousel = $(this)
563
+ Plugin.call($carousel, $carousel.data())
564
+ })
565
+ })
566
+
567
+ }(jQuery);
568
+
569
+ /* ========================================================================
570
+ * Bootstrap: collapse.js v3.4.3
571
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#collapse
572
+ * ========================================================================
573
+ * Copyright 2024 Entreprise 7pro.ca Inc.
574
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
575
+ * Copyright 2011-2019 Twitter, Inc.
576
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
577
+ * ======================================================================== */
578
+
579
+ /* jshint latedef: false */
580
+
581
+ +function ($) {
582
+ 'use strict';
583
+
584
+ // COLLAPSE PUBLIC CLASS DEFINITION
585
+ // ================================
586
+
587
+ var Collapse = function (element, options) {
588
+ this.$element = $(element)
589
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
590
+ this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
591
+ '[data-toggle="collapse"][data-target="#' + element.id + '"]')
592
+ this.transitioning = null
593
+
594
+ if (this.options.parent) {
595
+ this.$parent = this.getParent()
596
+ } else {
597
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
598
+ }
599
+
600
+ if (this.options.toggle) this.toggle()
601
+ }
602
+
603
+ Collapse.VERSION = '3.4.3'
604
+
605
+ Collapse.TRANSITION_DURATION = 350
606
+
607
+ Collapse.DEFAULTS = {
608
+ toggle: true
609
+ }
610
+
611
+ Collapse.prototype.dimension = function () {
612
+ var hasWidth = this.$element.hasClass('width')
613
+ return hasWidth ? 'width' : 'height'
614
+ }
615
+
616
+ Collapse.prototype.show = function () {
617
+ if (this.transitioning || this.$element.hasClass('in')) return
618
+
619
+ var activesData
620
+ var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
621
+
622
+ if (actives && actives.length) {
623
+ activesData = actives.data('bs.collapse')
624
+ if (activesData && activesData.transitioning) return
625
+ }
626
+
627
+ var startEvent = $.Event('show.bs.collapse')
628
+ this.$element.trigger(startEvent)
629
+ if (startEvent.isDefaultPrevented()) return
630
+
631
+ if (actives && actives.length) {
632
+ Plugin.call(actives, 'hide')
633
+ activesData || actives.data('bs.collapse', null)
634
+ }
635
+
636
+ var dimension = this.dimension()
637
+
638
+ this.$element
639
+ .removeClass('collapse')
640
+ .addClass('collapsing')[dimension](0)
641
+ .attr('aria-expanded', true)
642
+
643
+ this.$trigger
644
+ .removeClass('collapsed')
645
+ .attr('aria-expanded', true)
646
+
647
+ this.transitioning = 1
648
+
649
+ var complete = function () {
650
+ this.$element
651
+ .removeClass('collapsing')
652
+ .addClass('collapse in')[dimension]('')
653
+ this.transitioning = 0
654
+ this.$element
655
+ .trigger('shown.bs.collapse')
656
+ }
657
+
658
+ if (!$.support.transition) return complete.call(this)
659
+
660
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
661
+
662
+ this.$element
663
+ .one('bsTransitionEnd', $.proxy(complete, this))
664
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
665
+ }
666
+
667
+ Collapse.prototype.hide = function () {
668
+ if (this.transitioning || !this.$element.hasClass('in')) return
669
+
670
+ var startEvent = $.Event('hide.bs.collapse')
671
+ this.$element.trigger(startEvent)
672
+ if (startEvent.isDefaultPrevented()) return
673
+
674
+ var dimension = this.dimension()
675
+
676
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
677
+
678
+ this.$element
679
+ .addClass('collapsing')
680
+ .removeClass('collapse in')
681
+ .attr('aria-expanded', false)
682
+
683
+ this.$trigger
684
+ .addClass('collapsed')
685
+ .attr('aria-expanded', false)
686
+
687
+ this.transitioning = 1
688
+
689
+ var complete = function () {
690
+ this.transitioning = 0
691
+ this.$element
692
+ .removeClass('collapsing')
693
+ .addClass('collapse')
694
+ .trigger('hidden.bs.collapse')
695
+ }
696
+
697
+ if (!$.support.transition) return complete.call(this)
698
+
699
+ this.$element
700
+ [dimension](0)
701
+ .one('bsTransitionEnd', $.proxy(complete, this))
702
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
703
+ }
704
+
705
+ Collapse.prototype.toggle = function () {
706
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
707
+ }
708
+
709
+ Collapse.prototype.getParent = function () {
710
+ return $(document).find(this.options.parent)
711
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
712
+ .each($.proxy(function (i, element) {
713
+ var $element = $(element)
714
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
715
+ }, this))
716
+ .end()
717
+ }
718
+
719
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
720
+ var isOpen = $element.hasClass('in')
721
+
722
+ $element.attr('aria-expanded', isOpen)
723
+ $trigger
724
+ .toggleClass('collapsed', !isOpen)
725
+ .attr('aria-expanded', isOpen)
726
+ }
727
+
728
+ function getTargetFromTrigger($trigger) {
729
+ var href
730
+ var target = $trigger.attr('data-target')
731
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
732
+
733
+ return $(document).find(target)
734
+ }
735
+
736
+
737
+ // COLLAPSE PLUGIN DEFINITION
738
+ // ==========================
739
+
740
+ function Plugin(option) {
741
+ return this.each(function () {
742
+ var $this = $(this)
743
+ var data = $this.data('bs.collapse')
744
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
745
+
746
+ if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
747
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
748
+ if (typeof option == 'string') data[option]()
749
+ })
750
+ }
751
+
752
+ var old = $.fn.collapse
753
+
754
+ $.fn.collapse = Plugin
755
+ $.fn.collapse.Constructor = Collapse
756
+
757
+
758
+ // COLLAPSE NO CONFLICT
759
+ // ====================
760
+
761
+ $.fn.collapse.noConflict = function () {
762
+ $.fn.collapse = old
763
+ return this
764
+ }
765
+
766
+
767
+ // COLLAPSE DATA-API
768
+ // =================
769
+
770
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
771
+ var $this = $(this)
772
+
773
+ if (!$this.attr('data-target')) e.preventDefault()
774
+
775
+ var $target = getTargetFromTrigger($this)
776
+ var data = $target.data('bs.collapse')
777
+ var option = data ? 'toggle' : $this.data()
778
+
779
+ Plugin.call($target, option)
780
+ })
781
+
782
+ }(jQuery);
783
+
784
+ /* ========================================================================
785
+ * Bootstrap: dropdown.js v3.4.3
786
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#dropdowns
787
+ * ========================================================================
788
+ * Copyright 2024 Entreprise 7pro.ca Inc.
789
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
790
+ * Copyright 2011-2019 Twitter, Inc (now X).
791
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
792
+ * ======================================================================== */
793
+
794
+
795
+ +function ($) {
796
+ 'use strict';
797
+
798
+ // DROPDOWN CLASS DEFINITION
799
+ // =========================
800
+
801
+ var backdrop = '.dropdown-backdrop'
802
+ var toggle = '[data-toggle="dropdown"]'
803
+ var Dropdown = function (element) {
804
+ $(element).on('click.bs.dropdown', this.toggle)
805
+ }
806
+
807
+ Dropdown.VERSION = '3.4.3'
808
+
809
+ function getParent($this) {
810
+ var selector = $this.attr('data-target')
811
+
812
+ if (!selector) {
813
+ selector = $this.attr('href')
814
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
815
+ }
816
+
817
+ var $parent = selector !== '#' ? $(document).find(selector) : null
818
+
819
+ return $parent && $parent.length ? $parent : $this.parent()
820
+ }
821
+
822
+ function clearMenus(e) {
823
+ if (e && e.which === 3) return
824
+ $(backdrop).remove()
825
+ $(toggle).each(function () {
826
+ var $this = $(this)
827
+ var $parent = getParent($this)
828
+ var relatedTarget = { relatedTarget: this }
829
+
830
+ if (!$parent.hasClass('open')) return
831
+
832
+ if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
833
+
834
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
835
+
836
+ if (e.isDefaultPrevented()) return
837
+
838
+ $this.attr('aria-expanded', 'false')
839
+ $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
840
+ })
841
+ }
842
+
843
+ Dropdown.prototype.toggle = function (e) {
844
+ var $this = $(this)
845
+
846
+ if ($this.is('.disabled, :disabled')) return
847
+
848
+ var $parent = getParent($this)
849
+ var isActive = $parent.hasClass('open')
850
+
851
+ clearMenus()
852
+
853
+ if (!isActive) {
854
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
855
+ // if mobile we use a backdrop because click events don't delegate
856
+ $(document.createElement('div'))
857
+ .addClass('dropdown-backdrop')
858
+ .insertAfter($(this))
859
+ .on('click', clearMenus)
860
+ }
861
+
862
+ var relatedTarget = { relatedTarget: this }
863
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
864
+
865
+ if (e.isDefaultPrevented()) return
866
+
867
+ $this
868
+ .trigger('focus')
869
+ .attr('aria-expanded', 'true')
870
+
871
+ $parent
872
+ .toggleClass('open')
873
+ .trigger($.Event('shown.bs.dropdown', relatedTarget))
874
+ }
875
+
876
+ return false
877
+ }
878
+
879
+ Dropdown.prototype.keydown = function (e) {
880
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
881
+
882
+ var $this = $(this)
883
+
884
+ e.preventDefault()
885
+ e.stopPropagation()
886
+
887
+ if ($this.is('.disabled, :disabled')) return
888
+
889
+ var $parent = getParent($this)
890
+ var isActive = $parent.hasClass('open')
891
+
892
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
893
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
894
+ return $this.trigger('click')
895
+ }
896
+
897
+ var desc = ' li:not(.disabled):visible a'
898
+ var $items = $parent.find('.dropdown-menu' + desc)
899
+
900
+ if (!$items.length) return
901
+
902
+ var index = $items.index(e.target)
903
+
904
+ if (e.which == 38 && index > 0) index-- // up
905
+ if (e.which == 40 && index < $items.length - 1) index++ // down
906
+ if (!~index) index = 0
907
+
908
+ $items.eq(index).trigger('focus')
909
+ }
910
+
911
+
912
+ // DROPDOWN PLUGIN DEFINITION
913
+ // ==========================
914
+
915
+ function Plugin(option) {
916
+ return this.each(function () {
917
+ var $this = $(this)
918
+ var data = $this.data('bs.dropdown')
919
+
920
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
921
+ if (typeof option == 'string') data[option].call($this)
922
+ })
923
+ }
924
+
925
+ var old = $.fn.dropdown
926
+
927
+ $.fn.dropdown = Plugin
928
+ $.fn.dropdown.Constructor = Dropdown
929
+
930
+
931
+ // DROPDOWN NO CONFLICT
932
+ // ====================
933
+
934
+ $.fn.dropdown.noConflict = function () {
935
+ $.fn.dropdown = old
936
+ return this
937
+ }
938
+
939
+
940
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
941
+ // ===================================
942
+
943
+ $(document)
944
+ .on('click.bs.dropdown.data-api', clearMenus)
945
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
946
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
947
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
948
+ .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
949
+
950
+ }(jQuery);
951
+
952
+ /* ========================================================================
953
+ * Bootstrap: modal.js v3.4.3
954
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#modals
955
+ * ========================================================================
956
+ * Copyright 2024 Entreprise 7pro.ca Inc.
957
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
958
+ * Copyright 2011-2019 Twitter, Inc.
959
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
960
+ * ======================================================================== */
961
+
962
+
963
+ +function ($) {
964
+ 'use strict';
965
+
966
+ // MODAL CLASS DEFINITION
967
+ // ======================
968
+
969
+ var Modal = function (element, options) {
970
+ this.options = options
971
+ this.$body = $(document.body)
972
+ this.$element = $(element)
973
+ this.$dialog = this.$element.find('.modal-dialog')
974
+ this.$backdrop = null
975
+ this.isShown = null
976
+ this.originalBodyPad = null
977
+ this.scrollbarWidth = 0
978
+ this.ignoreBackdropClick = false
979
+ this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
980
+
981
+ if (this.options.remote) {
982
+ this.$element
983
+ .find('.modal-content')
984
+ .load(this.options.remote, $.proxy(function () {
985
+ this.$element.trigger('loaded.bs.modal')
986
+ }, this))
987
+ }
988
+ }
989
+
990
+ Modal.VERSION = '3.4.3'
991
+
992
+ Modal.TRANSITION_DURATION = 300
993
+ Modal.BACKDROP_TRANSITION_DURATION = 150
994
+
995
+ Modal.DEFAULTS = {
996
+ backdrop: true,
997
+ keyboard: true,
998
+ show: true
999
+ }
1000
+
1001
+ Modal.prototype.toggle = function (_relatedTarget) {
1002
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
1003
+ }
1004
+
1005
+ Modal.prototype.show = function (_relatedTarget) {
1006
+ var that = this
1007
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
1008
+
1009
+ this.$element.trigger(e)
1010
+
1011
+ if (this.isShown || e.isDefaultPrevented()) return
1012
+
1013
+ this.isShown = true
1014
+
1015
+ this.checkScrollbar()
1016
+ this.setScrollbar()
1017
+ this.$body.addClass('modal-open')
1018
+
1019
+ this.escape()
1020
+ this.resize()
1021
+
1022
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
1023
+
1024
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
1025
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
1026
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
1027
+ })
1028
+ })
1029
+
1030
+ this.backdrop(function () {
1031
+ var transition = $.support.transition && that.$element.hasClass('fade')
1032
+
1033
+ if (!that.$element.parent().length) {
1034
+ that.$element.appendTo(that.$body) // don't move modals dom position
1035
+ }
1036
+
1037
+ that.$element
1038
+ .show()
1039
+ .scrollTop(0)
1040
+
1041
+ that.adjustDialog()
1042
+
1043
+ if (transition) {
1044
+ that.$element[0].offsetWidth // force reflow
1045
+ }
1046
+
1047
+ that.$element.addClass('in')
1048
+
1049
+ that.enforceFocus()
1050
+
1051
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
1052
+
1053
+ transition ?
1054
+ that.$dialog // wait for modal to slide in
1055
+ .one('bsTransitionEnd', function () {
1056
+ that.$element.trigger('focus').trigger(e)
1057
+ })
1058
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1059
+ that.$element.trigger('focus').trigger(e)
1060
+ })
1061
+ }
1062
+
1063
+ Modal.prototype.hide = function (e) {
1064
+ if (e) e.preventDefault()
1065
+
1066
+ e = $.Event('hide.bs.modal')
1067
+
1068
+ this.$element.trigger(e)
1069
+
1070
+ if (!this.isShown || e.isDefaultPrevented()) return
1071
+
1072
+ this.isShown = false
1073
+
1074
+ this.escape()
1075
+ this.resize()
1076
+
1077
+ $(document).off('focusin.bs.modal')
1078
+
1079
+ this.$element
1080
+ .removeClass('in')
1081
+ .off('click.dismiss.bs.modal')
1082
+ .off('mouseup.dismiss.bs.modal')
1083
+
1084
+ this.$dialog.off('mousedown.dismiss.bs.modal')
1085
+
1086
+ $.support.transition && this.$element.hasClass('fade') ?
1087
+ this.$element
1088
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1089
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1090
+ this.hideModal()
1091
+ }
1092
+
1093
+ Modal.prototype.enforceFocus = function () {
1094
+ $(document)
1095
+ .off('focusin.bs.modal') // guard against infinite focus loop
1096
+ .on('focusin.bs.modal', $.proxy(function (e) {
1097
+ if (document !== e.target &&
1098
+ this.$element[0] !== e.target &&
1099
+ !this.$element.has(e.target).length) {
1100
+ this.$element.trigger('focus')
1101
+ }
1102
+ }, this))
1103
+ }
1104
+
1105
+ Modal.prototype.escape = function () {
1106
+ if (this.isShown && this.options.keyboard) {
1107
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
1108
+ e.which == 27 && this.hide()
1109
+ }, this))
1110
+ } else if (!this.isShown) {
1111
+ this.$element.off('keydown.dismiss.bs.modal')
1112
+ }
1113
+ }
1114
+
1115
+ Modal.prototype.resize = function () {
1116
+ if (this.isShown) {
1117
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
1118
+ } else {
1119
+ $(window).off('resize.bs.modal')
1120
+ }
1121
+ }
1122
+
1123
+ Modal.prototype.hideModal = function () {
1124
+ var that = this
1125
+ this.$element.hide()
1126
+ this.backdrop(function () {
1127
+ that.$body.removeClass('modal-open')
1128
+ that.resetAdjustments()
1129
+ that.resetScrollbar()
1130
+ that.$element.trigger('hidden.bs.modal')
1131
+ })
1132
+ }
1133
+
1134
+ Modal.prototype.removeBackdrop = function () {
1135
+ this.$backdrop && this.$backdrop.remove()
1136
+ this.$backdrop = null
1137
+ }
1138
+
1139
+ Modal.prototype.backdrop = function (callback) {
1140
+ var that = this
1141
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
1142
+
1143
+ if (this.isShown && this.options.backdrop) {
1144
+ var doAnimate = $.support.transition && animate
1145
+
1146
+ this.$backdrop = $(document.createElement('div'))
1147
+ .addClass('modal-backdrop ' + animate)
1148
+ .appendTo(this.$body)
1149
+
1150
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
1151
+ if (this.ignoreBackdropClick) {
1152
+ this.ignoreBackdropClick = false
1153
+ return
1154
+ }
1155
+ if (e.target !== e.currentTarget) return
1156
+ this.options.backdrop == 'static'
1157
+ ? this.$element[0].focus()
1158
+ : this.hide()
1159
+ }, this))
1160
+
1161
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1162
+
1163
+ this.$backdrop.addClass('in')
1164
+
1165
+ if (!callback) return
1166
+
1167
+ doAnimate ?
1168
+ this.$backdrop
1169
+ .one('bsTransitionEnd', callback)
1170
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1171
+ callback()
1172
+
1173
+ } else if (!this.isShown && this.$backdrop) {
1174
+ this.$backdrop.removeClass('in')
1175
+
1176
+ var callbackRemove = function () {
1177
+ that.removeBackdrop()
1178
+ callback && callback()
1179
+ }
1180
+ $.support.transition && this.$element.hasClass('fade') ?
1181
+ this.$backdrop
1182
+ .one('bsTransitionEnd', callbackRemove)
1183
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1184
+ callbackRemove()
1185
+
1186
+ } else if (callback) {
1187
+ callback()
1188
+ }
1189
+ }
1190
+
1191
+ // these following methods are used to handle overflowing modals
1192
+
1193
+ Modal.prototype.handleUpdate = function () {
1194
+ this.adjustDialog()
1195
+ }
1196
+
1197
+ Modal.prototype.adjustDialog = function () {
1198
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1199
+
1200
+ this.$element.css({
1201
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1202
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
1203
+ })
1204
+ }
1205
+
1206
+ Modal.prototype.resetAdjustments = function () {
1207
+ this.$element.css({
1208
+ paddingLeft: '',
1209
+ paddingRight: ''
1210
+ })
1211
+ }
1212
+
1213
+ Modal.prototype.checkScrollbar = function () {
1214
+ var fullWindowWidth = window.innerWidth
1215
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
1216
+ this.scrollbarWidth = this.measureScrollbar()
1217
+ }
1218
+
1219
+ Modal.prototype.setScrollbar = function () {
1220
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1221
+ this.originalBodyPad = document.body.style.paddingRight || ''
1222
+ var scrollbarWidth = this.scrollbarWidth
1223
+ if (this.bodyIsOverflowing) {
1224
+ this.$body.css('padding-right', bodyPad + scrollbarWidth)
1225
+ $(this.fixedContent).each(function (index, element) {
1226
+ var actualPadding = element.style.paddingRight
1227
+ var calculatedPadding = $(element).css('padding-right')
1228
+ $(element)
1229
+ .data('padding-right', actualPadding)
1230
+ .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
1231
+ })
1232
+ }
1233
+ }
1234
+
1235
+ Modal.prototype.resetScrollbar = function () {
1236
+ this.$body.css('padding-right', this.originalBodyPad)
1237
+ $(this.fixedContent).each(function (index, element) {
1238
+ var padding = $(element).data('padding-right')
1239
+ $(element).removeData('padding-right')
1240
+ element.style.paddingRight = padding ? padding : ''
1241
+ })
1242
+ }
1243
+
1244
+ Modal.prototype.measureScrollbar = function () { // thx walsh
1245
+ var scrollDiv = document.createElement('div')
1246
+ scrollDiv.className = 'modal-scrollbar-measure'
1247
+ this.$body.append(scrollDiv)
1248
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
1249
+ this.$body[0].removeChild(scrollDiv)
1250
+ return scrollbarWidth
1251
+ }
1252
+
1253
+
1254
+ // MODAL PLUGIN DEFINITION
1255
+ // =======================
1256
+
1257
+ function Plugin(option, _relatedTarget) {
1258
+ return this.each(function () {
1259
+ var $this = $(this)
1260
+ var data = $this.data('bs.modal')
1261
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1262
+
1263
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
1264
+ if (typeof option == 'string') data[option](_relatedTarget)
1265
+ else if (options.show) data.show(_relatedTarget)
1266
+ })
1267
+ }
1268
+
1269
+ var old = $.fn.modal
1270
+
1271
+ $.fn.modal = Plugin
1272
+ $.fn.modal.Constructor = Modal
1273
+
1274
+
1275
+ // MODAL NO CONFLICT
1276
+ // =================
1277
+
1278
+ $.fn.modal.noConflict = function () {
1279
+ $.fn.modal = old
1280
+ return this
1281
+ }
1282
+
1283
+
1284
+ // MODAL DATA-API
1285
+ // ==============
1286
+
1287
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1288
+ var $this = $(this)
1289
+ var href = $this.attr('href')
1290
+ var target = $this.attr('data-target') ||
1291
+ (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
1292
+
1293
+ var $target = $(document).find(target)
1294
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1295
+
1296
+ if ($this.is('a')) e.preventDefault()
1297
+
1298
+ $target.one('show.bs.modal', function (showEvent) {
1299
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
1300
+ $target.one('hidden.bs.modal', function () {
1301
+ $this.is(':visible') && $this.trigger('focus')
1302
+ })
1303
+ })
1304
+ Plugin.call($target, option, this)
1305
+ })
1306
+
1307
+ }(jQuery);
1308
+
1309
+ /* ========================================================================
1310
+ * Bootstrap: tooltip.js v3.4.3
1311
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#tooltip
1312
+ * Inspired by the original jQuery.tipsy by Jason Frame
1313
+ * ========================================================================
1314
+ * Copyright 2024 Entreprise 7pro.ca Inc.
1315
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
1316
+ * Copyright 2011-2019 Twitter, Inc.
1317
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
1318
+ * ======================================================================== */
1319
+
1320
+ +function ($) {
1321
+ 'use strict';
1322
+
1323
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
1324
+
1325
+ var uriAttrs = [
1326
+ 'background',
1327
+ 'cite',
1328
+ 'href',
1329
+ 'itemtype',
1330
+ 'longdesc',
1331
+ 'poster',
1332
+ 'src',
1333
+ 'xlink:href'
1334
+ ]
1335
+
1336
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
1337
+
1338
+ var DefaultWhitelist = {
1339
+ // Global attributes allowed on any supplied element below.
1340
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
1341
+ a: ['target', 'href', 'title', 'rel'],
1342
+ area: [],
1343
+ b: [],
1344
+ br: [],
1345
+ col: [],
1346
+ code: [],
1347
+ div: [],
1348
+ em: [],
1349
+ hr: [],
1350
+ h1: [],
1351
+ h2: [],
1352
+ h3: [],
1353
+ h4: [],
1354
+ h5: [],
1355
+ h6: [],
1356
+ i: [],
1357
+ img: ['src', 'alt', 'title', 'width', 'height'],
1358
+ li: [],
1359
+ ol: [],
1360
+ p: [],
1361
+ pre: [],
1362
+ s: [],
1363
+ small: [],
1364
+ span: [],
1365
+ sub: [],
1366
+ sup: [],
1367
+ strong: [],
1368
+ u: [],
1369
+ ul: []
1370
+ }
1371
+
1372
+ /**
1373
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
1374
+ *
1375
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
1376
+ */
1377
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
1378
+
1379
+ /**
1380
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
1381
+ *
1382
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
1383
+ */
1384
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
1385
+
1386
+ function allowedAttribute(attr, allowedAttributeList) {
1387
+ var attrName = attr.nodeName.toLowerCase()
1388
+
1389
+ if ($.inArray(attrName, allowedAttributeList) !== -1) {
1390
+ if ($.inArray(attrName, uriAttrs) !== -1) {
1391
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
1392
+ }
1393
+
1394
+ return true
1395
+ }
1396
+
1397
+ var regExp = $(allowedAttributeList).filter(function (index, value) {
1398
+ return value instanceof RegExp
1399
+ })
1400
+
1401
+ // Check if a regular expression validates the attribute.
1402
+ for (var i = 0, l = regExp.length; i < l; i++) {
1403
+ if (attrName.match(regExp[i])) {
1404
+ return true
1405
+ }
1406
+ }
1407
+
1408
+ return false
1409
+ }
1410
+
1411
+ function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
1412
+ if (unsafeHtml.length === 0) {
1413
+ return unsafeHtml
1414
+ }
1415
+
1416
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
1417
+ return sanitizeFn(unsafeHtml)
1418
+ }
1419
+
1420
+ var createdDocument = document.implementation.createHTMLDocument('sanitization')
1421
+ createdDocument.body.innerHTML = unsafeHtml
1422
+
1423
+ var whitelistKeys = $.map(whiteList, function (el, i) { return i })
1424
+ var elements = $(createdDocument.body).find('*')
1425
+
1426
+ for (var i = 0, len = elements.length; i < len; i++) {
1427
+ var el = elements[i]
1428
+ var elName = el.nodeName.toLowerCase()
1429
+
1430
+ if ($.inArray(elName, whitelistKeys) === -1) {
1431
+ el.parentNode.removeChild(el)
1432
+
1433
+ continue
1434
+ }
1435
+
1436
+ var attributeList = $.map(el.attributes, function (el) { return el })
1437
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
1438
+
1439
+ for (var j = 0, len2 = attributeList.length; j < len2; j++) {
1440
+ if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
1441
+ el.removeAttribute(attributeList[j].nodeName)
1442
+ }
1443
+ }
1444
+ }
1445
+
1446
+ return createdDocument.body.innerHTML
1447
+ }
1448
+
1449
+ // TOOLTIP PUBLIC CLASS DEFINITION
1450
+ // ===============================
1451
+
1452
+ var Tooltip = function (element, options) {
1453
+ this.type = null
1454
+ this.options = null
1455
+ this.enabled = null
1456
+ this.timeout = null
1457
+ this.hoverState = null
1458
+ this.$element = null
1459
+ this.inState = null
1460
+
1461
+ this.init('tooltip', element, options)
1462
+ }
1463
+
1464
+ Tooltip.VERSION = '3.4.3'
1465
+
1466
+ Tooltip.TRANSITION_DURATION = 150
1467
+
1468
+ Tooltip.DEFAULTS = {
1469
+ animation: true,
1470
+ placement: 'top',
1471
+ selector: false,
1472
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
1473
+ trigger: 'hover focus',
1474
+ title: '',
1475
+ delay: 0,
1476
+ html: false,
1477
+ container: false,
1478
+ viewport: {
1479
+ selector: 'body',
1480
+ padding: 0
1481
+ },
1482
+ sanitize : true,
1483
+ sanitizeFn : null,
1484
+ whiteList : DefaultWhitelist
1485
+ }
1486
+
1487
+ Tooltip.prototype.init = function (type, element, options) {
1488
+ this.enabled = true
1489
+ this.type = type
1490
+ this.$element = $(element)
1491
+ this.options = this.getOptions(options)
1492
+ this.$viewport = this.options.viewport && $(document).find(
1493
+ typeof this.options.viewport === 'function'
1494
+ ? this.options.viewport.call(this, this.$element)
1495
+ : (this.options.viewport.selector || this.options.viewport)
1496
+ )
1497
+ this.inState = { click: false, hover: false, focus: false }
1498
+
1499
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
1500
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
1501
+ }
1502
+
1503
+ var triggers = this.options.trigger.split(' ')
1504
+
1505
+ for (var i = triggers.length; i--;) {
1506
+ var trigger = triggers[i]
1507
+
1508
+ if (trigger == 'click') {
1509
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1510
+ } else if (trigger != 'manual') {
1511
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
1512
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
1513
+
1514
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1515
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1516
+ }
1517
+ }
1518
+
1519
+ this.options.selector ?
1520
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1521
+ this.fixTitle()
1522
+ }
1523
+
1524
+ Tooltip.prototype.getDefaults = function () {
1525
+ return Tooltip.DEFAULTS
1526
+ }
1527
+
1528
+ Tooltip.prototype.getOptions = function (options) {
1529
+ var dataAttributes = this.$element.data()
1530
+
1531
+
1532
+ for (var dataAttr in dataAttributes) {
1533
+ if (Object.prototype.hasOwnProperty.call(dataAttributes, dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
1534
+ delete dataAttributes[dataAttr];
1535
+ }
1536
+ }
1537
+
1538
+ options = $.extend({}, this.getDefaults(), dataAttributes, options)
1539
+
1540
+ if (options.delay && typeof options.delay == 'number') {
1541
+ options.delay = {
1542
+ show: options.delay,
1543
+ hide: options.delay
1544
+ }
1545
+ }
1546
+
1547
+ if (options.sanitize) {
1548
+ options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)
1549
+ }
1550
+
1551
+ return options
1552
+ }
1553
+
1554
+ Tooltip.prototype.getDelegateOptions = function () {
1555
+ var options = {}
1556
+ var defaults = this.getDefaults()
1557
+
1558
+ this._options && $.each(this._options, function (key, value) {
1559
+ if (defaults[key] != value) options[key] = value
1560
+ })
1561
+
1562
+ return options
1563
+ }
1564
+
1565
+ Tooltip.prototype.enter = function (obj) {
1566
+ var self = obj instanceof this.constructor ?
1567
+ obj : $(obj.currentTarget).data('bs.' + this.type)
1568
+
1569
+ if (!self) {
1570
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1571
+ $(obj.currentTarget).data('bs.' + this.type, self)
1572
+ }
1573
+
1574
+ if (obj instanceof $.Event) {
1575
+ self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
1576
+ }
1577
+
1578
+ if (self.tip().hasClass('in') || self.hoverState == 'in') {
1579
+ self.hoverState = 'in'
1580
+ return
1581
+ }
1582
+
1583
+ clearTimeout(self.timeout)
1584
+
1585
+ self.hoverState = 'in'
1586
+
1587
+ if (!self.options.delay || !self.options.delay.show) return self.show()
1588
+
1589
+ self.timeout = setTimeout(function () {
1590
+ if (self.hoverState == 'in') self.show()
1591
+ }, self.options.delay.show)
1592
+ }
1593
+
1594
+ Tooltip.prototype.isInStateTrue = function () {
1595
+ for (var key in this.inState) {
1596
+ if (this.inState[key]) return true
1597
+ }
1598
+
1599
+ return false
1600
+ }
1601
+
1602
+ Tooltip.prototype.leave = function (obj) {
1603
+ var self = obj instanceof this.constructor ?
1604
+ obj : $(obj.currentTarget).data('bs.' + this.type)
1605
+
1606
+ if (!self) {
1607
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1608
+ $(obj.currentTarget).data('bs.' + this.type, self)
1609
+ }
1610
+
1611
+ if (obj instanceof $.Event) {
1612
+ self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
1613
+ }
1614
+
1615
+ if (self.isInStateTrue()) return
1616
+
1617
+ clearTimeout(self.timeout)
1618
+
1619
+ self.hoverState = 'out'
1620
+
1621
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
1622
+
1623
+ self.timeout = setTimeout(function () {
1624
+ if (self.hoverState == 'out') self.hide()
1625
+ }, self.options.delay.hide)
1626
+ }
1627
+
1628
+ Tooltip.prototype.show = function () {
1629
+ var e = $.Event('show.bs.' + this.type)
1630
+
1631
+ if (this.hasContent() && this.enabled) {
1632
+ this.$element.trigger(e)
1633
+
1634
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
1635
+ if (e.isDefaultPrevented() || !inDom) return
1636
+ var that = this
1637
+
1638
+ var $tip = this.tip()
1639
+
1640
+ var tipId = this.getUID(this.type)
1641
+
1642
+ this.setContent()
1643
+ $tip.attr('id', tipId)
1644
+ this.$element.attr('aria-describedby', tipId)
1645
+
1646
+ if (this.options.animation) $tip.addClass('fade')
1647
+
1648
+ var placement = typeof this.options.placement == 'function' ?
1649
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
1650
+ this.options.placement
1651
+
1652
+ var autoToken = /\s?auto?\s?/i
1653
+ var autoPlace = autoToken.test(placement)
1654
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1655
+
1656
+ $tip
1657
+ .detach()
1658
+ .css({ top: 0, left: 0, display: 'block' })
1659
+ .addClass(placement)
1660
+ .data('bs.' + this.type, this)
1661
+
1662
+ this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
1663
+ this.$element.trigger('inserted.bs.' + this.type)
1664
+
1665
+ var pos = this.getPosition()
1666
+ var actualWidth = $tip[0].offsetWidth
1667
+ var actualHeight = $tip[0].offsetHeight
1668
+
1669
+ if (autoPlace) {
1670
+ var orgPlacement = placement
1671
+ var viewportDim = this.getPosition(this.$viewport)
1672
+
1673
+ placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
1674
+ placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
1675
+ placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
1676
+ placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
1677
+ placement
1678
+
1679
+ $tip
1680
+ .removeClass(orgPlacement)
1681
+ .addClass(placement)
1682
+ }
1683
+
1684
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1685
+
1686
+ this.applyPlacement(calculatedOffset, placement)
1687
+
1688
+ var complete = function () {
1689
+ var prevHoverState = that.hoverState
1690
+ that.$element.trigger('shown.bs.' + that.type)
1691
+ that.hoverState = null
1692
+
1693
+ if (prevHoverState == 'out') that.leave(that)
1694
+ }
1695
+
1696
+ $.support.transition && this.$tip.hasClass('fade') ?
1697
+ $tip
1698
+ .one('bsTransitionEnd', complete)
1699
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1700
+ complete()
1701
+ }
1702
+ }
1703
+
1704
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
1705
+ var $tip = this.tip()
1706
+ var width = $tip[0].offsetWidth
1707
+ var height = $tip[0].offsetHeight
1708
+
1709
+ // manually read margins because getBoundingClientRect includes difference
1710
+ var marginTop = parseInt($tip.css('margin-top'), 10)
1711
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
1712
+
1713
+ // we must check for NaN for ie 8/9
1714
+ if (isNaN(marginTop)) marginTop = 0
1715
+ if (isNaN(marginLeft)) marginLeft = 0
1716
+
1717
+ offset.top += marginTop
1718
+ offset.left += marginLeft
1719
+
1720
+ // $.fn.offset doesn't round pixel values
1721
+ // so we use setOffset directly with our own function B-0
1722
+ $.offset.setOffset($tip[0], $.extend({
1723
+ using: function (props) {
1724
+ $tip.css({
1725
+ top: Math.round(props.top),
1726
+ left: Math.round(props.left)
1727
+ })
1728
+ }
1729
+ }, offset), 0)
1730
+
1731
+ $tip.addClass('in')
1732
+
1733
+ // check to see if placing tip in new offset caused the tip to resize itself
1734
+ var actualWidth = $tip[0].offsetWidth
1735
+ var actualHeight = $tip[0].offsetHeight
1736
+
1737
+ if (placement == 'top' && actualHeight != height) {
1738
+ offset.top = offset.top + height - actualHeight
1739
+ }
1740
+
1741
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
1742
+
1743
+ if (delta.left) offset.left += delta.left
1744
+ else offset.top += delta.top
1745
+
1746
+ var isVertical = /top|bottom/.test(placement)
1747
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
1748
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
1749
+
1750
+ $tip.offset(offset)
1751
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
1752
+ }
1753
+
1754
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
1755
+ this.arrow()
1756
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
1757
+ .css(isVertical ? 'top' : 'left', '')
1758
+ }
1759
+
1760
+ Tooltip.prototype.setContent = function () {
1761
+ var $tip = this.tip()
1762
+ var title = this.getTitle()
1763
+
1764
+ if (this.options.html) {
1765
+ if (this.options.sanitize) {
1766
+ title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)
1767
+ }
1768
+
1769
+ $tip.find('.tooltip-inner').html(title)
1770
+ } else {
1771
+ $tip.find('.tooltip-inner').text(title)
1772
+ }
1773
+
1774
+ $tip.removeClass('fade in top bottom left right')
1775
+ }
1776
+
1777
+ Tooltip.prototype.hide = function (callback) {
1778
+ var that = this
1779
+ var $tip = $(this.$tip)
1780
+ var e = $.Event('hide.bs.' + this.type)
1781
+
1782
+ function complete() {
1783
+ if (that.hoverState != 'in') $tip.detach()
1784
+ if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
1785
+ that.$element
1786
+ .removeAttr('aria-describedby')
1787
+ .trigger('hidden.bs.' + that.type)
1788
+ }
1789
+ callback && callback()
1790
+ }
1791
+
1792
+ this.$element.trigger(e)
1793
+
1794
+ if (e.isDefaultPrevented()) return
1795
+
1796
+ $tip.removeClass('in')
1797
+
1798
+ $.support.transition && $tip.hasClass('fade') ?
1799
+ $tip
1800
+ .one('bsTransitionEnd', complete)
1801
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1802
+ complete()
1803
+
1804
+ this.hoverState = null
1805
+
1806
+ return this
1807
+ }
1808
+
1809
+ Tooltip.prototype.fixTitle = function () {
1810
+ var $e = this.$element
1811
+ if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
1812
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1813
+ }
1814
+ }
1815
+
1816
+ Tooltip.prototype.hasContent = function () {
1817
+ return this.getTitle()
1818
+ }
1819
+
1820
+ Tooltip.prototype.getPosition = function ($element) {
1821
+ $element = $element || this.$element
1822
+
1823
+ var el = $element[0]
1824
+ var isBody = el.tagName == 'BODY'
1825
+
1826
+ var elRect = el.getBoundingClientRect()
1827
+ if (elRect.width == null) {
1828
+ // Width and height are missing in retro browsers, computing manually; see https://github.com/twbs/bootstrap/issues/14093.
1829
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
1830
+ }
1831
+ var isSvg = window.SVGElement && el instanceof window.SVGElement
1832
+ // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
1833
+ // See https://github.com/twbs/bootstrap/issues/20280
1834
+ var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
1835
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
1836
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
1837
+
1838
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
1839
+ }
1840
+
1841
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1842
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1843
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1844
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1845
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1846
+
1847
+ }
1848
+
1849
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
1850
+ var delta = { top: 0, left: 0 }
1851
+ if (!this.$viewport) return delta
1852
+
1853
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
1854
+ var viewportDimensions = this.getPosition(this.$viewport)
1855
+
1856
+ if (/right|left/.test(placement)) {
1857
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
1858
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
1859
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
1860
+ delta.top = viewportDimensions.top - topEdgeOffset
1861
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
1862
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
1863
+ }
1864
+ } else {
1865
+ var leftEdgeOffset = pos.left - viewportPadding
1866
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
1867
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
1868
+ delta.left = viewportDimensions.left - leftEdgeOffset
1869
+ } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
1870
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1871
+ }
1872
+ }
1873
+
1874
+ return delta
1875
+ }
1876
+
1877
+ Tooltip.prototype.getTitle = function () {
1878
+ var title
1879
+ var $e = this.$element
1880
+ var o = this.options
1881
+
1882
+ title = $e.attr('data-original-title')
1883
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1884
+
1885
+ return title
1886
+ }
1887
+
1888
+ Tooltip.prototype.getUID = function (prefix) {
1889
+ do prefix += ~~(Math.random() * 1000000)
1890
+ while (document.getElementById(prefix))
1891
+ return prefix
1892
+ }
1893
+
1894
+ Tooltip.prototype.tip = function () {
1895
+ if (!this.$tip) {
1896
+ this.$tip = $(this.options.template)
1897
+ if (this.$tip.length != 1) {
1898
+ throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
1899
+ }
1900
+ }
1901
+ return this.$tip
1902
+ }
1903
+
1904
+ Tooltip.prototype.arrow = function () {
1905
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
1906
+ }
1907
+
1908
+ Tooltip.prototype.enable = function () {
1909
+ this.enabled = true
1910
+ }
1911
+
1912
+ Tooltip.prototype.disable = function () {
1913
+ this.enabled = false
1914
+ }
1915
+
1916
+ Tooltip.prototype.toggleEnabled = function () {
1917
+ this.enabled = !this.enabled
1918
+ }
1919
+
1920
+ Tooltip.prototype.toggle = function (e) {
1921
+ var self = this
1922
+ if (e) {
1923
+ self = $(e.currentTarget).data('bs.' + this.type)
1924
+ if (!self) {
1925
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
1926
+ $(e.currentTarget).data('bs.' + this.type, self)
1927
+ }
1928
+ }
1929
+
1930
+ if (e) {
1931
+ self.inState.click = !self.inState.click
1932
+ if (self.isInStateTrue()) self.enter(self)
1933
+ else self.leave(self)
1934
+ } else {
1935
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1936
+ }
1937
+ }
1938
+
1939
+ Tooltip.prototype.destroy = function () {
1940
+ var that = this
1941
+ clearTimeout(this.timeout)
1942
+ this.hide(function () {
1943
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
1944
+ if (that.$tip) {
1945
+ that.$tip.detach()
1946
+ }
1947
+ that.$tip = null
1948
+ that.$arrow = null
1949
+ that.$viewport = null
1950
+ that.$element = null
1951
+ })
1952
+ }
1953
+
1954
+ Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {
1955
+ return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)
1956
+ }
1957
+
1958
+ // TOOLTIP PLUGIN DEFINITION
1959
+ // =========================
1960
+
1961
+ function Plugin(option) {
1962
+ return this.each(function () {
1963
+ var $this = $(this)
1964
+ var data = $this.data('bs.tooltip')
1965
+ var options = typeof option == 'object' && option
1966
+
1967
+ if (!data && /destroy|hide/.test(option)) return
1968
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1969
+ if (typeof option == 'string') data[option]()
1970
+ })
1971
+ }
1972
+
1973
+ var old = $.fn.tooltip
1974
+
1975
+ $.fn.tooltip = Plugin
1976
+ $.fn.tooltip.Constructor = Tooltip
1977
+
1978
+
1979
+ // TOOLTIP NO CONFLICT
1980
+ // ===================
1981
+
1982
+ $.fn.tooltip.noConflict = function () {
1983
+ $.fn.tooltip = old
1984
+ return this
1985
+ }
1986
+
1987
+ }(jQuery);
1988
+
1989
+ /* ========================================================================
1990
+ * Bootstrap: popover.js v3.4.3
1991
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#popovers
1992
+ * ========================================================================
1993
+ * Copyright 2024 Entreprise 7pro.ca Inc.
1994
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
1995
+ * Copyright 2011-2019 Twitter, Inc.
1996
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
1997
+ * ======================================================================== */
1998
+
1999
+
2000
+ +function ($) {
2001
+ 'use strict';
2002
+
2003
+ // POPOVER PUBLIC CLASS DEFINITION
2004
+ // ===============================
2005
+
2006
+ var Popover = function (element, options) {
2007
+ this.init('popover', element, options)
2008
+ }
2009
+
2010
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
2011
+
2012
+ Popover.VERSION = '3.4.3'
2013
+
2014
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
2015
+ placement: 'right',
2016
+ trigger: 'click',
2017
+ content: '',
2018
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
2019
+ })
2020
+
2021
+
2022
+ // NOTE: POPOVER EXTENDS tooltip.js
2023
+ // ================================
2024
+
2025
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
2026
+
2027
+ Popover.prototype.constructor = Popover
2028
+
2029
+ Popover.prototype.getDefaults = function () {
2030
+ return Popover.DEFAULTS
2031
+ }
2032
+
2033
+ Popover.prototype.setContent = function () {
2034
+ var $tip = this.tip()
2035
+ var title = this.getTitle()
2036
+ var content = this.getContent()
2037
+
2038
+ if (this.options.html) {
2039
+ var typeContent = typeof content
2040
+
2041
+ if (this.options.sanitize) {
2042
+ title = this.sanitizeHtml(title)
2043
+
2044
+ if (typeContent === 'string') {
2045
+ content = this.sanitizeHtml(content)
2046
+ }
2047
+ }
2048
+
2049
+ $tip.find('.popover-title').html(title)
2050
+ $tip.find('.popover-content').children().detach().end()[
2051
+ typeContent === 'string' ? 'html' : 'append'
2052
+ ](content)
2053
+ } else {
2054
+ $tip.find('.popover-title').text(title)
2055
+ $tip.find('.popover-content').children().detach().end().text(content)
2056
+ }
2057
+
2058
+ $tip.removeClass('fade top bottom left right in')
2059
+
2060
+ $tip.find('.popover-title').hide()
2061
+ }
2062
+
2063
+ Popover.prototype.hasContent = function () {
2064
+ return this.getTitle() || this.getContent()
2065
+ }
2066
+
2067
+ Popover.prototype.getContent = function () {
2068
+ var $e = this.$element
2069
+ var o = this.options
2070
+
2071
+ return $e.attr('data-content')
2072
+ || (typeof o.content == 'function' ?
2073
+ o.content.call($e[0]) :
2074
+ o.content)
2075
+ }
2076
+
2077
+ Popover.prototype.arrow = function () {
2078
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
2079
+ }
2080
+
2081
+
2082
+ // POPOVER PLUGIN DEFINITION
2083
+ // =========================
2084
+
2085
+ function Plugin(option) {
2086
+ return this.each(function () {
2087
+ var $this = $(this)
2088
+ var data = $this.data('bs.popover')
2089
+ var options = typeof option == 'object' && option
2090
+
2091
+ if (!data && /destroy|hide/.test(option)) return
2092
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
2093
+ if (typeof option == 'string') data[option]()
2094
+ })
2095
+ }
2096
+
2097
+ var old = $.fn.popover
2098
+
2099
+ $.fn.popover = Plugin
2100
+ $.fn.popover.Constructor = Popover
2101
+
2102
+
2103
+ // POPOVER NO CONFLICT
2104
+ // ===================
2105
+
2106
+ $.fn.popover.noConflict = function () {
2107
+ $.fn.popover = old
2108
+ return this
2109
+ }
2110
+
2111
+ }(jQuery);
2112
+
2113
+ /* ========================================================================
2114
+ * Bootstrap: scrollspy.js v3.4.3
2115
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#scrollspy
2116
+ * ========================================================================
2117
+ * Copyright 2024 Entreprise 7pro.ca Inc.
2118
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
2119
+ * Copyright 2011-2019 Twitter, Inc.
2120
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
2121
+ * ======================================================================== */
2122
+
2123
+
2124
+ +function ($) {
2125
+ 'use strict';
2126
+
2127
+ // SCROLLSPY CLASS DEFINITION
2128
+ // ==========================
2129
+
2130
+ function ScrollSpy(element, options) {
2131
+ this.$body = $(document.body)
2132
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
2133
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
2134
+ this.selector = (this.options.target || '') + ' .nav li > a'
2135
+ this.offsets = []
2136
+ this.targets = []
2137
+ this.activeTarget = null
2138
+ this.scrollHeight = 0
2139
+
2140
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
2141
+ this.refresh()
2142
+ this.process()
2143
+ }
2144
+
2145
+ ScrollSpy.VERSION = '3.4.3'
2146
+
2147
+ ScrollSpy.DEFAULTS = {
2148
+ offset: 10
2149
+ }
2150
+
2151
+ ScrollSpy.prototype.getScrollHeight = function () {
2152
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
2153
+ }
2154
+
2155
+ ScrollSpy.prototype.refresh = function () {
2156
+ var that = this
2157
+ var offsetMethod = 'offset'
2158
+ var offsetBase = 0
2159
+
2160
+ this.offsets = []
2161
+ this.targets = []
2162
+ this.scrollHeight = this.getScrollHeight()
2163
+
2164
+ if (!$.isWindow(this.$scrollElement[0])) {
2165
+ offsetMethod = 'position'
2166
+ offsetBase = this.$scrollElement.scrollTop()
2167
+ }
2168
+
2169
+ this.$body
2170
+ .find(this.selector)
2171
+ .map(function () {
2172
+ var $el = $(this)
2173
+ var href = $el.data('target') || $el.attr('href')
2174
+ var $href = /^#./.test(href) && $(href)
2175
+
2176
+ return ($href
2177
+ && $href.length
2178
+ && $href.is(':visible')
2179
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
2180
+ })
2181
+ .sort(function (a, b) { return a[0] - b[0] })
2182
+ .each(function () {
2183
+ that.offsets.push(this[0])
2184
+ that.targets.push(this[1])
2185
+ })
2186
+ }
2187
+
2188
+ ScrollSpy.prototype.process = function () {
2189
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
2190
+ var scrollHeight = this.getScrollHeight()
2191
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
2192
+ var offsets = this.offsets
2193
+ var targets = this.targets
2194
+ var activeTarget = this.activeTarget
2195
+ var i
2196
+
2197
+ if (this.scrollHeight != scrollHeight) {
2198
+ this.refresh()
2199
+ }
2200
+
2201
+ if (scrollTop >= maxScroll) {
2202
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
2203
+ }
2204
+
2205
+ if (activeTarget && scrollTop < offsets[0]) {
2206
+ this.activeTarget = null
2207
+ return this.clear()
2208
+ }
2209
+
2210
+ for (i = offsets.length; i--;) {
2211
+ activeTarget != targets[i]
2212
+ && scrollTop >= offsets[i]
2213
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
2214
+ && this.activate(targets[i])
2215
+ }
2216
+ }
2217
+
2218
+ ScrollSpy.prototype.activate = function (target) {
2219
+ this.activeTarget = target
2220
+
2221
+ this.clear()
2222
+
2223
+ var selector = this.selector +
2224
+ '[data-target="' + target + '"],' +
2225
+ this.selector + '[href="' + target + '"]'
2226
+
2227
+ var active = $(selector)
2228
+ .parents('li')
2229
+ .addClass('active')
2230
+
2231
+ if (active.parent('.dropdown-menu').length) {
2232
+ active = active
2233
+ .closest('li.dropdown')
2234
+ .addClass('active')
2235
+ }
2236
+
2237
+ active.trigger('activate.bs.scrollspy')
2238
+ }
2239
+
2240
+ ScrollSpy.prototype.clear = function () {
2241
+ $(this.selector)
2242
+ .parentsUntil(this.options.target, '.active')
2243
+ .removeClass('active')
2244
+ }
2245
+
2246
+
2247
+ // SCROLLSPY PLUGIN DEFINITION
2248
+ // ===========================
2249
+
2250
+ function Plugin(option) {
2251
+ return this.each(function () {
2252
+ var $this = $(this)
2253
+ var data = $this.data('bs.scrollspy')
2254
+ var options = typeof option == 'object' && option
2255
+
2256
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
2257
+ if (typeof option == 'string') data[option]()
2258
+ })
2259
+ }
2260
+
2261
+ var old = $.fn.scrollspy
2262
+
2263
+ $.fn.scrollspy = Plugin
2264
+ $.fn.scrollspy.Constructor = ScrollSpy
2265
+
2266
+
2267
+ // SCROLLSPY NO CONFLICT
2268
+ // =====================
2269
+
2270
+ $.fn.scrollspy.noConflict = function () {
2271
+ $.fn.scrollspy = old
2272
+ return this
2273
+ }
2274
+
2275
+
2276
+ // SCROLLSPY DATA-API
2277
+ // ==================
2278
+
2279
+ $(window).on('load.bs.scrollspy.data-api', function () {
2280
+ $('[data-spy="scroll"]').each(function () {
2281
+ var $spy = $(this)
2282
+ Plugin.call($spy, $spy.data())
2283
+ })
2284
+ })
2285
+
2286
+ }(jQuery);
2287
+
2288
+ /* ========================================================================
2289
+ * Bootstrap: tab.js v3.4.3
2290
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#tabs
2291
+ * ========================================================================
2292
+ * Copyright 2024 Entreprise 7pro.ca Inc.
2293
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
2294
+ * Copyright 2011-2019 Twitter, Inc.
2295
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
2296
+ * ======================================================================== */
2297
+
2298
+
2299
+ +function ($) {
2300
+ 'use strict';
2301
+
2302
+ // TAB CLASS DEFINITION
2303
+ // ====================
2304
+
2305
+ var Tab = function (element) {
2306
+ // jscs:disable requireDollarBeforejQueryAssignment
2307
+ this.element = $(element)
2308
+ // jscs:enable requireDollarBeforejQueryAssignment
2309
+ }
2310
+
2311
+ Tab.VERSION = '3.4.3'
2312
+
2313
+ Tab.TRANSITION_DURATION = 150
2314
+
2315
+ Tab.prototype.show = function () {
2316
+ var $this = this.element
2317
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
2318
+ var selector = $this.data('target')
2319
+
2320
+ if (!selector) {
2321
+ selector = $this.attr('href')
2322
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
2323
+ }
2324
+
2325
+ if ($this.parent('li').hasClass('active')) return
2326
+
2327
+ var $previous = $ul.find('.active:last a')
2328
+ var hideEvent = $.Event('hide.bs.tab', {
2329
+ relatedTarget: $this[0]
2330
+ })
2331
+ var showEvent = $.Event('show.bs.tab', {
2332
+ relatedTarget: $previous[0]
2333
+ })
2334
+
2335
+ $previous.trigger(hideEvent)
2336
+ $this.trigger(showEvent)
2337
+
2338
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
2339
+
2340
+ var $target = $(document).find(selector)
2341
+
2342
+ this.activate($this.closest('li'), $ul)
2343
+ this.activate($target, $target.parent(), function () {
2344
+ $previous.trigger({
2345
+ type: 'hidden.bs.tab',
2346
+ relatedTarget: $this[0]
2347
+ })
2348
+ $this.trigger({
2349
+ type: 'shown.bs.tab',
2350
+ relatedTarget: $previous[0]
2351
+ })
2352
+ })
2353
+ }
2354
+
2355
+ Tab.prototype.activate = function (element, container, callback) {
2356
+ var $active = container.find('> .active')
2357
+ var transition = callback
2358
+ && $.support.transition
2359
+ && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
2360
+
2361
+ function next() {
2362
+ $active
2363
+ .removeClass('active')
2364
+ .find('> .dropdown-menu > .active')
2365
+ .removeClass('active')
2366
+ .end()
2367
+ .find('[data-toggle="tab"]')
2368
+ .attr('aria-expanded', false)
2369
+
2370
+ element
2371
+ .addClass('active')
2372
+ .find('[data-toggle="tab"]')
2373
+ .attr('aria-expanded', true)
2374
+
2375
+ if (transition) {
2376
+ element[0].offsetWidth // reflow for transition
2377
+ element.addClass('in')
2378
+ } else {
2379
+ element.removeClass('fade')
2380
+ }
2381
+
2382
+ if (element.parent('.dropdown-menu').length) {
2383
+ element
2384
+ .closest('li.dropdown')
2385
+ .addClass('active')
2386
+ .end()
2387
+ .find('[data-toggle="tab"]')
2388
+ .attr('aria-expanded', true)
2389
+ }
2390
+
2391
+ callback && callback()
2392
+ }
2393
+
2394
+ $active.length && transition ?
2395
+ $active
2396
+ .one('bsTransitionEnd', next)
2397
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
2398
+ next()
2399
+
2400
+ $active.removeClass('in')
2401
+ }
2402
+
2403
+
2404
+ // TAB PLUGIN DEFINITION
2405
+ // =====================
2406
+
2407
+ function Plugin(option) {
2408
+ return this.each(function () {
2409
+ var $this = $(this)
2410
+ var data = $this.data('bs.tab')
2411
+
2412
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
2413
+ if (typeof option == 'string') data[option]()
2414
+ })
2415
+ }
2416
+
2417
+ var old = $.fn.tab
2418
+
2419
+ $.fn.tab = Plugin
2420
+ $.fn.tab.Constructor = Tab
2421
+
2422
+
2423
+ // TAB NO CONFLICT
2424
+ // ===============
2425
+
2426
+ $.fn.tab.noConflict = function () {
2427
+ $.fn.tab = old
2428
+ return this
2429
+ }
2430
+
2431
+
2432
+ // TAB DATA-API
2433
+ // ============
2434
+
2435
+ var clickHandler = function (e) {
2436
+ e.preventDefault()
2437
+ Plugin.call($(this), 'show')
2438
+ }
2439
+
2440
+ $(document)
2441
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
2442
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
2443
+
2444
+ }(jQuery);
2445
+
2446
+ /* ========================================================================
2447
+ * Bootstrap: affix.js v3.4.3
2448
+ * https://bootstrap.7pro.ca/docs/3.4/javascript/#affix
2449
+ * ========================================================================
2450
+ * Copyright 2024 Entreprise 7pro.ca Inc.
2451
+ * Licensed under MIT (https://github.com/entreprise7pro/bootstrap/blob/v3-dev/LICENSE)
2452
+ * Copyright 2011-2019 Twitter, Inc.
2453
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/v3-dev/LICENSE)
2454
+ * ======================================================================== */
2455
+
2456
+
2457
+ +function ($) {
2458
+ 'use strict';
2459
+
2460
+ // AFFIX CLASS DEFINITION
2461
+ // ======================
2462
+
2463
+ var Affix = function (element, options) {
2464
+ this.options = $.extend({}, Affix.DEFAULTS, options)
2465
+
2466
+ var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
2467
+
2468
+ this.$target = target
2469
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
2470
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
2471
+
2472
+ this.$element = $(element)
2473
+ this.affixed = null
2474
+ this.unpin = null
2475
+ this.pinnedOffset = null
2476
+
2477
+ this.checkPosition()
2478
+ }
2479
+
2480
+ Affix.VERSION = '3.4.3'
2481
+
2482
+ Affix.RESET = 'affix affix-top affix-bottom'
2483
+
2484
+ Affix.DEFAULTS = {
2485
+ offset: 0,
2486
+ target: window
2487
+ }
2488
+
2489
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
2490
+ var scrollTop = this.$target.scrollTop()
2491
+ var position = this.$element.offset()
2492
+ var targetHeight = this.$target.height()
2493
+
2494
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
2495
+
2496
+ if (this.affixed == 'bottom') {
2497
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
2498
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
2499
+ }
2500
+
2501
+ var initializing = this.affixed == null
2502
+ var colliderTop = initializing ? scrollTop : position.top
2503
+ var colliderHeight = initializing ? targetHeight : height
2504
+
2505
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
2506
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
2507
+
2508
+ return false
2509
+ }
2510
+
2511
+ Affix.prototype.getPinnedOffset = function () {
2512
+ if (this.pinnedOffset) return this.pinnedOffset
2513
+ this.$element.removeClass(Affix.RESET).addClass('affix')
2514
+ var scrollTop = this.$target.scrollTop()
2515
+ var position = this.$element.offset()
2516
+ return (this.pinnedOffset = position.top - scrollTop)
2517
+ }
2518
+
2519
+ Affix.prototype.checkPositionWithEventLoop = function () {
2520
+ setTimeout($.proxy(this.checkPosition, this), 1)
2521
+ }
2522
+
2523
+ Affix.prototype.checkPosition = function () {
2524
+ if (!this.$element.is(':visible')) return
2525
+
2526
+ var height = this.$element.height()
2527
+ var offset = this.options.offset
2528
+ var offsetTop = offset.top
2529
+ var offsetBottom = offset.bottom
2530
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
2531
+
2532
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
2533
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
2534
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2535
+
2536
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2537
+
2538
+ if (this.affixed != affix) {
2539
+ if (this.unpin != null) this.$element.css('top', '')
2540
+
2541
+ var affixType = 'affix' + (affix ? '-' + affix : '')
2542
+ var e = $.Event(affixType + '.bs.affix')
2543
+
2544
+ this.$element.trigger(e)
2545
+
2546
+ if (e.isDefaultPrevented()) return
2547
+
2548
+ this.affixed = affix
2549
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2550
+
2551
+ this.$element
2552
+ .removeClass(Affix.RESET)
2553
+ .addClass(affixType)
2554
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
2555
+ }
2556
+
2557
+ if (affix == 'bottom') {
2558
+ this.$element.offset({
2559
+ top: scrollHeight - height - offsetBottom
2560
+ })
2561
+ }
2562
+ }
2563
+
2564
+
2565
+ // AFFIX PLUGIN DEFINITION
2566
+ // =======================
2567
+
2568
+ function Plugin(option) {
2569
+ return this.each(function () {
2570
+ var $this = $(this)
2571
+ var data = $this.data('bs.affix')
2572
+ var options = typeof option == 'object' && option
2573
+
2574
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
2575
+ if (typeof option == 'string') data[option]()
2576
+ })
2577
+ }
2578
+
2579
+ var old = $.fn.affix
2580
+
2581
+ $.fn.affix = Plugin
2582
+ $.fn.affix.Constructor = Affix
2583
+
2584
+
2585
+ // AFFIX NO CONFLICT
2586
+ // =================
2587
+
2588
+ $.fn.affix.noConflict = function () {
2589
+ $.fn.affix = old
2590
+ return this
2591
+ }
2592
+
2593
+
2594
+ // AFFIX DATA-API
2595
+ // ==============
2596
+
2597
+ $(window).on('load', function () {
2598
+ $('[data-spy="affix"]').each(function () {
2599
+ var $spy = $(this)
2600
+ var data = $spy.data()
2601
+
2602
+ data.offset = data.offset || {}
2603
+
2604
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
2605
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
2606
+
2607
+ Plugin.call($spy, data)
2608
+ })
2609
+ })
2610
+
2611
+ }(jQuery);