nyc_devshop 0.0.2

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