twitter-bootstrap-rails 2.2.8 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +82 -119
  3. data/Rakefile +4 -6
  4. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  5. data/app/assets/fonts/fontawesome-webfont.svg +471 -366
  6. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  7. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  8. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  9. data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  10. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  11. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  12. data/app/assets/javascripts/twitter/bootstrap.js +12 -13
  13. data/app/assets/javascripts/twitter/bootstrap/affix.js +137 -0
  14. data/app/assets/javascripts/twitter/bootstrap/alert.js +88 -0
  15. data/app/assets/javascripts/twitter/bootstrap/button.js +107 -0
  16. data/app/assets/javascripts/twitter/bootstrap/carousel.js +205 -0
  17. data/app/assets/javascripts/twitter/bootstrap/collapse.js +170 -0
  18. data/app/assets/javascripts/twitter/bootstrap/dropdown.js +147 -0
  19. data/app/assets/javascripts/twitter/bootstrap/modal.js +243 -0
  20. data/app/assets/javascripts/twitter/bootstrap/popover.js +110 -0
  21. data/app/assets/javascripts/twitter/bootstrap/scrollspy.js +153 -0
  22. data/app/assets/javascripts/twitter/bootstrap/tab.js +125 -0
  23. data/app/assets/javascripts/twitter/bootstrap/tooltip.js +399 -0
  24. data/app/assets/javascripts/twitter/bootstrap/transition.js +48 -0
  25. data/app/assets/stylesheets/twitter-bootstrap-static/bootstrap.css.erb +1 -890
  26. data/app/assets/stylesheets/twitter-bootstrap-static/fontawesome.css.erb +4 -787
  27. data/app/assets/stylesheets/twitter-bootstrap-static/sprites.css.erb +1 -146
  28. data/app/helpers/bootstrap_flash_helper.rb +7 -5
  29. data/app/helpers/form_errors_helper.rb +22 -0
  30. data/app/helpers/glyph_helper.rb +8 -6
  31. data/app/helpers/modal_helper.rb +29 -21
  32. data/app/helpers/navbar_helper.rb +42 -30
  33. data/app/helpers/twitter_breadcrumbs_helper.rb +3 -2
  34. data/app/views/twitter-bootstrap/_breadcrumbs.html.erb +4 -4
  35. data/lib/generators/bootstrap/install/install_generator.rb +3 -2
  36. data/lib/generators/bootstrap/install/templates/bootstrap_and_overrides.less +7 -8
  37. data/lib/generators/bootstrap/install/templates/en.bootstrap.yml +5 -0
  38. data/lib/generators/bootstrap/layout/layout_generator.rb +1 -4
  39. data/lib/generators/bootstrap/layout/templates/layout.html.erb +22 -43
  40. data/lib/generators/bootstrap/layout/templates/layout.html.haml +16 -31
  41. data/lib/generators/bootstrap/layout/templates/layout.html.slim +10 -25
  42. data/lib/generators/bootstrap/partial/templates/_login.html.erb +2 -3
  43. data/lib/generators/bootstrap/themed/templates/_form.html.erb +25 -8
  44. data/lib/generators/bootstrap/themed/templates/_form.html.haml +7 -7
  45. data/lib/generators/bootstrap/themed/templates/_form.html.slim +7 -7
  46. data/lib/generators/bootstrap/themed/templates/index.html.erb +2 -2
  47. data/lib/generators/bootstrap/themed/templates/index.html.haml +2 -2
  48. data/lib/generators/bootstrap/themed/templates/index.html.slim +2 -2
  49. data/lib/generators/bootstrap/themed/templates/show.html.erb +5 -7
  50. data/lib/generators/bootstrap/themed/templates/show.html.haml +4 -4
  51. data/lib/generators/bootstrap/themed/templates/show.html.slim +5 -6
  52. data/lib/generators/bootstrap/themed/templates/simple_form/_form.html.erb +5 -5
  53. data/lib/generators/bootstrap/themed/templates/simple_form/_form.html.haml +3 -3
  54. data/lib/generators/bootstrap/themed/templates/simple_form/_form.html.slim +4 -4
  55. data/lib/generators/bootstrap/themed/themed_generator.rb +2 -2
  56. data/lib/twitter/bootstrap/rails/{twitter-bootstrap-breadcrumbs.rb → breadcrumbs.rb} +24 -8
  57. data/lib/twitter/bootstrap/rails/engine.rb +5 -2
  58. data/lib/twitter/bootstrap/rails/version.rb +2 -2
  59. data/spec/lib/breadcrumbs_spec.rb +74 -0
  60. data/spec/lib/twitter_bootstrap_rails/badge_label_helper_spec.rb +4 -2
  61. data/spec/lib/twitter_bootstrap_rails/modal_helper_spec.rb +15 -15
  62. data/spec/lib/twitter_bootstrap_rails/navbar_helper_spec.rb +157 -173
  63. data/spec/lib/twitter_bootstrap_rails/uri_state_spec.rb +18 -16
  64. data/spec/spec_helper.rb +7 -1
  65. data/vendor/assets/stylesheets/twitter-bootstrap-static/bootstrap.css.erb +5797 -0
  66. data/vendor/static-source/bootstrap.less +0 -1
  67. data/vendor/static-source/fontawesome.less +0 -1
  68. data/vendor/static-source/sprites.less +1 -1
  69. data/vendor/toolkit/fontawesome/bordered-pulled.less +16 -0
  70. data/vendor/toolkit/fontawesome/core.less +9 -126
  71. data/vendor/toolkit/fontawesome/fixed-width.less +6 -0
  72. data/vendor/toolkit/fontawesome/font-awesome.less +9 -25
  73. data/vendor/toolkit/fontawesome/icons.less +503 -378
  74. data/vendor/toolkit/fontawesome/larger.less +13 -0
  75. data/vendor/toolkit/fontawesome/list.less +19 -0
  76. data/vendor/toolkit/fontawesome/mixins.less +14 -42
  77. data/vendor/toolkit/fontawesome/path.less +1 -1
  78. data/vendor/toolkit/fontawesome/rotated-flipped.less +9 -0
  79. data/vendor/toolkit/fontawesome/spinning.less +32 -0
  80. data/vendor/toolkit/fontawesome/stacked.less +20 -0
  81. data/vendor/toolkit/fontawesome/variables.less +511 -731
  82. data/vendor/toolkit/twitter/bootstrap/alerts.less +47 -58
  83. data/vendor/toolkit/twitter/bootstrap/badges.less +55 -0
  84. data/vendor/toolkit/twitter/bootstrap/bootstrap.less +27 -39
  85. data/vendor/toolkit/twitter/bootstrap/breadcrumbs.less +11 -9
  86. data/vendor/toolkit/twitter/bootstrap/button-groups.less +168 -152
  87. data/vendor/toolkit/twitter/bootstrap/buttons.less +101 -170
  88. data/vendor/toolkit/twitter/bootstrap/carousel.less +150 -65
  89. data/vendor/toolkit/twitter/bootstrap/close.less +20 -19
  90. data/vendor/toolkit/twitter/bootstrap/code.less +38 -30
  91. data/vendor/toolkit/twitter/bootstrap/component-animations.less +12 -3
  92. data/vendor/toolkit/twitter/bootstrap/dropdowns.less +115 -148
  93. data/vendor/toolkit/twitter/bootstrap/forms.less +401 -547
  94. data/vendor/toolkit/twitter/bootstrap/glyphicons.less +233 -0
  95. data/vendor/toolkit/twitter/bootstrap/grid.less +74 -11
  96. data/vendor/toolkit/twitter/bootstrap/input-groups.less +166 -0
  97. data/vendor/toolkit/twitter/bootstrap/jumbotron.less +48 -0
  98. data/vendor/toolkit/twitter/bootstrap/labels.less +64 -0
  99. data/vendor/toolkit/twitter/bootstrap/list-group.less +132 -0
  100. data/vendor/toolkit/twitter/bootstrap/media.less +8 -7
  101. data/vendor/toolkit/twitter/bootstrap/mixins.less +36 -699
  102. data/vendor/toolkit/twitter/bootstrap/mixins/alerts.less +14 -0
  103. data/vendor/toolkit/twitter/bootstrap/mixins/background-variant.less +8 -0
  104. data/vendor/toolkit/twitter/bootstrap/mixins/border-radius.less +18 -0
  105. data/vendor/toolkit/twitter/bootstrap/mixins/buttons.less +52 -0
  106. data/vendor/toolkit/twitter/bootstrap/mixins/center-block.less +7 -0
  107. data/vendor/toolkit/twitter/bootstrap/mixins/clearfix.less +22 -0
  108. data/vendor/toolkit/twitter/bootstrap/mixins/forms.less +85 -0
  109. data/vendor/toolkit/twitter/bootstrap/mixins/gradients.less +59 -0
  110. data/vendor/toolkit/twitter/bootstrap/mixins/grid-framework.less +91 -0
  111. data/vendor/toolkit/twitter/bootstrap/mixins/grid.less +122 -0
  112. data/vendor/toolkit/twitter/bootstrap/mixins/hide-text.less +21 -0
  113. data/vendor/toolkit/twitter/bootstrap/mixins/image.less +33 -0
  114. data/vendor/toolkit/twitter/bootstrap/mixins/labels.less +12 -0
  115. data/vendor/toolkit/twitter/bootstrap/mixins/list-group.less +29 -0
  116. data/vendor/toolkit/twitter/bootstrap/mixins/nav-divider.less +10 -0
  117. data/vendor/toolkit/twitter/bootstrap/mixins/nav-vertical-align.less +9 -0
  118. data/vendor/toolkit/twitter/bootstrap/mixins/opacity.less +8 -0
  119. data/vendor/toolkit/twitter/bootstrap/mixins/pagination.less +23 -0
  120. data/vendor/toolkit/twitter/bootstrap/mixins/panels.less +24 -0
  121. data/vendor/toolkit/twitter/bootstrap/mixins/progress-bar.less +10 -0
  122. data/vendor/toolkit/twitter/bootstrap/mixins/reset-filter.less +8 -0
  123. data/vendor/toolkit/twitter/bootstrap/mixins/resize.less +6 -0
  124. data/vendor/toolkit/twitter/bootstrap/mixins/responsive-visibility.less +15 -0
  125. data/vendor/toolkit/twitter/bootstrap/mixins/size.less +10 -0
  126. data/vendor/toolkit/twitter/bootstrap/mixins/tab-focus.less +9 -0
  127. data/vendor/toolkit/twitter/bootstrap/mixins/table-row.less +28 -0
  128. data/vendor/toolkit/twitter/bootstrap/mixins/text-emphasis.less +8 -0
  129. data/vendor/toolkit/twitter/bootstrap/mixins/text-overflow.less +8 -0
  130. data/vendor/toolkit/twitter/bootstrap/mixins/vendor-prefixes.less +224 -0
  131. data/vendor/toolkit/twitter/bootstrap/modals.less +109 -54
  132. data/vendor/toolkit/twitter/bootstrap/navbar.less +542 -384
  133. data/vendor/toolkit/twitter/bootstrap/navs.less +192 -359
  134. data/vendor/toolkit/twitter/bootstrap/normalize.less +425 -0
  135. data/vendor/toolkit/twitter/bootstrap/pager.less +46 -34
  136. data/vendor/toolkit/twitter/bootstrap/pagination.less +70 -105
  137. data/vendor/toolkit/twitter/bootstrap/panels.less +248 -0
  138. data/vendor/toolkit/twitter/bootstrap/popovers.less +61 -61
  139. data/vendor/toolkit/twitter/bootstrap/print.less +101 -0
  140. data/vendor/toolkit/twitter/bootstrap/progress-bars.less +51 -73
  141. data/vendor/toolkit/twitter/bootstrap/responsive-embed.less +34 -0
  142. data/vendor/toolkit/twitter/bootstrap/responsive-utilities.less +177 -42
  143. data/vendor/toolkit/twitter/bootstrap/scaffolding.less +120 -23
  144. data/vendor/toolkit/twitter/bootstrap/tables.less +171 -182
  145. data/vendor/toolkit/twitter/bootstrap/theme.less +260 -0
  146. data/vendor/toolkit/twitter/bootstrap/thumbnails.less +26 -43
  147. data/vendor/toolkit/twitter/bootstrap/tooltip.less +49 -24
  148. data/vendor/toolkit/twitter/bootstrap/type.less +208 -147
  149. data/vendor/toolkit/twitter/bootstrap/utilities.less +33 -7
  150. data/vendor/toolkit/twitter/bootstrap/variables.less +761 -215
  151. data/vendor/toolkit/twitter/bootstrap/wells.less +7 -7
  152. metadata +128 -138
  153. data/app/assets/javascripts/twitter/bootstrap/bootstrap-affix.js +0 -117
  154. data/app/assets/javascripts/twitter/bootstrap/bootstrap-alert.js +0 -99
  155. data/app/assets/javascripts/twitter/bootstrap/bootstrap-button.js +0 -105
  156. data/app/assets/javascripts/twitter/bootstrap/bootstrap-carousel.js +0 -207
  157. data/app/assets/javascripts/twitter/bootstrap/bootstrap-collapse.js +0 -167
  158. data/app/assets/javascripts/twitter/bootstrap/bootstrap-dropdown.js +0 -169
  159. data/app/assets/javascripts/twitter/bootstrap/bootstrap-modal.js +0 -247
  160. data/app/assets/javascripts/twitter/bootstrap/bootstrap-popover.js +0 -114
  161. data/app/assets/javascripts/twitter/bootstrap/bootstrap-scrollspy.js +0 -162
  162. data/app/assets/javascripts/twitter/bootstrap/bootstrap-tab.js +0 -144
  163. data/app/assets/javascripts/twitter/bootstrap/bootstrap-tooltip.js +0 -361
  164. data/app/assets/javascripts/twitter/bootstrap/bootstrap-transition.js +0 -60
  165. data/app/assets/javascripts/twitter/bootstrap/bootstrap-typeahead.js +0 -335
  166. data/test/lib/breadcrumbs_test.rb +0 -75
  167. data/test/test_helper.rb +0 -11
  168. data/vendor/toolkit/fontawesome/bootstrap.less +0 -84
  169. data/vendor/toolkit/fontawesome/extras.less +0 -93
  170. data/vendor/toolkit/fontawesome/font-awesome-ie7.less +0 -1953
  171. data/vendor/toolkit/twitter/bootstrap/accordion.less +0 -34
  172. data/vendor/toolkit/twitter/bootstrap/hero-unit.less +0 -25
  173. data/vendor/toolkit/twitter/bootstrap/labels-badges.less +0 -84
  174. data/vendor/toolkit/twitter/bootstrap/layouts.less +0 -16
  175. data/vendor/toolkit/twitter/bootstrap/reset.less +0 -216
  176. data/vendor/toolkit/twitter/bootstrap/responsive-1200px-min.less +0 -28
  177. data/vendor/toolkit/twitter/bootstrap/responsive-767px-max.less +0 -193
  178. data/vendor/toolkit/twitter/bootstrap/responsive-768px-979px.less +0 -19
  179. data/vendor/toolkit/twitter/bootstrap/responsive-navbar.less +0 -189
  180. data/vendor/toolkit/twitter/bootstrap/responsive.less +0 -48
  181. data/vendor/toolkit/twitter/bootstrap/sprites.less +0 -197
@@ -0,0 +1,153 @@
1
+ /* ========================================================================
2
+ * Bootstrap: scrollspy.js v3.1.1
3
+ * http://getbootstrap.com/javascript/#scrollspy
4
+ * ========================================================================
5
+ * Copyright 2011-2014 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // SCROLLSPY CLASS DEFINITION
14
+ // ==========================
15
+
16
+ function ScrollSpy(element, options) {
17
+ var href
18
+ var process = $.proxy(this.process, this)
19
+
20
+ this.$element = $(element).is('body') ? $(window) : $(element)
21
+ this.$body = $('body')
22
+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
23
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
24
+ this.selector = (this.options.target
25
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
26
+ || '') + ' .nav li > a'
27
+ this.offsets = $([])
28
+ this.targets = $([])
29
+ this.activeTarget = null
30
+
31
+ this.refresh()
32
+ this.process()
33
+ }
34
+
35
+ ScrollSpy.DEFAULTS = {
36
+ offset: 10
37
+ }
38
+
39
+ ScrollSpy.prototype.refresh = function () {
40
+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
41
+
42
+ this.offsets = $([])
43
+ this.targets = $([])
44
+
45
+ var self = this
46
+ var $targets = this.$body
47
+ .find(this.selector)
48
+ .map(function () {
49
+ var $el = $(this)
50
+ var href = $el.data('target') || $el.attr('href')
51
+ var $href = /^#./.test(href) && $(href)
52
+
53
+ return ($href
54
+ && $href.length
55
+ && $href.is(':visible')
56
+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
57
+ })
58
+ .sort(function (a, b) { return a[0] - b[0] })
59
+ .each(function () {
60
+ self.offsets.push(this[0])
61
+ self.targets.push(this[1])
62
+ })
63
+ }
64
+
65
+ ScrollSpy.prototype.process = function () {
66
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
67
+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
68
+ var maxScroll = scrollHeight - this.$scrollElement.height()
69
+ var offsets = this.offsets
70
+ var targets = this.targets
71
+ var activeTarget = this.activeTarget
72
+ var i
73
+
74
+ if (scrollTop >= maxScroll) {
75
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
76
+ }
77
+
78
+ if (activeTarget && scrollTop <= offsets[0]) {
79
+ return activeTarget != (i = targets[0]) && this.activate(i)
80
+ }
81
+
82
+ for (i = offsets.length; i--;) {
83
+ activeTarget != targets[i]
84
+ && scrollTop >= offsets[i]
85
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
86
+ && this.activate( targets[i] )
87
+ }
88
+ }
89
+
90
+ ScrollSpy.prototype.activate = function (target) {
91
+ this.activeTarget = target
92
+
93
+ $(this.selector)
94
+ .parentsUntil(this.options.target, '.active')
95
+ .removeClass('active')
96
+
97
+ var selector = this.selector +
98
+ '[data-target="' + target + '"],' +
99
+ this.selector + '[href="' + target + '"]'
100
+
101
+ var active = $(selector)
102
+ .parents('li')
103
+ .addClass('active')
104
+
105
+ if (active.parent('.dropdown-menu').length) {
106
+ active = active
107
+ .closest('li.dropdown')
108
+ .addClass('active')
109
+ }
110
+
111
+ active.trigger('activate.bs.scrollspy')
112
+ }
113
+
114
+
115
+ // SCROLLSPY PLUGIN DEFINITION
116
+ // ===========================
117
+
118
+ var old = $.fn.scrollspy
119
+
120
+ $.fn.scrollspy = function (option) {
121
+ return this.each(function () {
122
+ var $this = $(this)
123
+ var data = $this.data('bs.scrollspy')
124
+ var options = typeof option == 'object' && option
125
+
126
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
127
+ if (typeof option == 'string') data[option]()
128
+ })
129
+ }
130
+
131
+ $.fn.scrollspy.Constructor = ScrollSpy
132
+
133
+
134
+ // SCROLLSPY NO CONFLICT
135
+ // =====================
136
+
137
+ $.fn.scrollspy.noConflict = function () {
138
+ $.fn.scrollspy = old
139
+ return this
140
+ }
141
+
142
+
143
+ // SCROLLSPY DATA-API
144
+ // ==================
145
+
146
+ $(window).on('load', function () {
147
+ $('[data-spy="scroll"]').each(function () {
148
+ var $spy = $(this)
149
+ $spy.scrollspy($spy.data())
150
+ })
151
+ })
152
+
153
+ }(jQuery);
@@ -0,0 +1,125 @@
1
+ /* ========================================================================
2
+ * Bootstrap: tab.js v3.1.1
3
+ * http://getbootstrap.com/javascript/#tabs
4
+ * ========================================================================
5
+ * Copyright 2011-2014 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // TAB CLASS DEFINITION
14
+ // ====================
15
+
16
+ var Tab = function (element) {
17
+ this.element = $(element)
18
+ }
19
+
20
+ Tab.prototype.show = function () {
21
+ var $this = this.element
22
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
23
+ var selector = $this.data('target')
24
+
25
+ if (!selector) {
26
+ selector = $this.attr('href')
27
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
28
+ }
29
+
30
+ if ($this.parent('li').hasClass('active')) return
31
+
32
+ var previous = $ul.find('.active:last a')[0]
33
+ var e = $.Event('show.bs.tab', {
34
+ relatedTarget: previous
35
+ })
36
+
37
+ $this.trigger(e)
38
+
39
+ if (e.isDefaultPrevented()) return
40
+
41
+ var $target = $(selector)
42
+
43
+ this.activate($this.parent('li'), $ul)
44
+ this.activate($target, $target.parent(), function () {
45
+ $this.trigger({
46
+ type: 'shown.bs.tab',
47
+ relatedTarget: previous
48
+ })
49
+ })
50
+ }
51
+
52
+ Tab.prototype.activate = function (element, container, callback) {
53
+ var $active = container.find('> .active')
54
+ var transition = callback
55
+ && $.support.transition
56
+ && $active.hasClass('fade')
57
+
58
+ function next() {
59
+ $active
60
+ .removeClass('active')
61
+ .find('> .dropdown-menu > .active')
62
+ .removeClass('active')
63
+
64
+ element.addClass('active')
65
+
66
+ if (transition) {
67
+ element[0].offsetWidth // reflow for transition
68
+ element.addClass('in')
69
+ } else {
70
+ element.removeClass('fade')
71
+ }
72
+
73
+ if (element.parent('.dropdown-menu')) {
74
+ element.closest('li.dropdown').addClass('active')
75
+ }
76
+
77
+ callback && callback()
78
+ }
79
+
80
+ transition ?
81
+ $active
82
+ .one($.support.transition.end, next)
83
+ .emulateTransitionEnd(150) :
84
+ next()
85
+
86
+ $active.removeClass('in')
87
+ }
88
+
89
+
90
+ // TAB PLUGIN DEFINITION
91
+ // =====================
92
+
93
+ var old = $.fn.tab
94
+
95
+ $.fn.tab = function ( option ) {
96
+ return this.each(function () {
97
+ var $this = $(this)
98
+ var data = $this.data('bs.tab')
99
+
100
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
101
+ if (typeof option == 'string') data[option]()
102
+ })
103
+ }
104
+
105
+ $.fn.tab.Constructor = Tab
106
+
107
+
108
+ // TAB NO CONFLICT
109
+ // ===============
110
+
111
+ $.fn.tab.noConflict = function () {
112
+ $.fn.tab = old
113
+ return this
114
+ }
115
+
116
+
117
+ // TAB DATA-API
118
+ // ============
119
+
120
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
121
+ e.preventDefault()
122
+ $(this).tab('show')
123
+ })
124
+
125
+ }(jQuery);
@@ -0,0 +1,399 @@
1
+ /* ========================================================================
2
+ * Bootstrap: tooltip.js v3.1.1
3
+ * http://getbootstrap.com/javascript/#tooltip
4
+ * Inspired by the original jQuery.tipsy by Jason Frame
5
+ * ========================================================================
6
+ * Copyright 2011-2014 Twitter, Inc.
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
8
+ * ======================================================================== */
9
+
10
+
11
+ +function ($) {
12
+ 'use strict';
13
+
14
+ // TOOLTIP PUBLIC CLASS DEFINITION
15
+ // ===============================
16
+
17
+ var Tooltip = function (element, options) {
18
+ this.type =
19
+ this.options =
20
+ this.enabled =
21
+ this.timeout =
22
+ this.hoverState =
23
+ this.$element = null
24
+
25
+ this.init('tooltip', element, options)
26
+ }
27
+
28
+ Tooltip.DEFAULTS = {
29
+ animation: true,
30
+ placement: 'top',
31
+ selector: false,
32
+ template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
33
+ trigger: 'hover focus',
34
+ title: '',
35
+ delay: 0,
36
+ html: false,
37
+ container: false
38
+ }
39
+
40
+ Tooltip.prototype.init = function (type, element, options) {
41
+ this.enabled = true
42
+ this.type = type
43
+ this.$element = $(element)
44
+ this.options = this.getOptions(options)
45
+
46
+ var triggers = this.options.trigger.split(' ')
47
+
48
+ for (var i = triggers.length; i--;) {
49
+ var trigger = triggers[i]
50
+
51
+ if (trigger == 'click') {
52
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
53
+ } else if (trigger != 'manual') {
54
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
55
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
56
+
57
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
58
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
59
+ }
60
+ }
61
+
62
+ this.options.selector ?
63
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
64
+ this.fixTitle()
65
+ }
66
+
67
+ Tooltip.prototype.getDefaults = function () {
68
+ return Tooltip.DEFAULTS
69
+ }
70
+
71
+ Tooltip.prototype.getOptions = function (options) {
72
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
73
+
74
+ if (options.delay && typeof options.delay == 'number') {
75
+ options.delay = {
76
+ show: options.delay,
77
+ hide: options.delay
78
+ }
79
+ }
80
+
81
+ return options
82
+ }
83
+
84
+ Tooltip.prototype.getDelegateOptions = function () {
85
+ var options = {}
86
+ var defaults = this.getDefaults()
87
+
88
+ this._options && $.each(this._options, function (key, value) {
89
+ if (defaults[key] != value) options[key] = value
90
+ })
91
+
92
+ return options
93
+ }
94
+
95
+ Tooltip.prototype.enter = function (obj) {
96
+ var self = obj instanceof this.constructor ?
97
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
98
+
99
+ clearTimeout(self.timeout)
100
+
101
+ self.hoverState = 'in'
102
+
103
+ if (!self.options.delay || !self.options.delay.show) return self.show()
104
+
105
+ self.timeout = setTimeout(function () {
106
+ if (self.hoverState == 'in') self.show()
107
+ }, self.options.delay.show)
108
+ }
109
+
110
+ Tooltip.prototype.leave = function (obj) {
111
+ var self = obj instanceof this.constructor ?
112
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
113
+
114
+ clearTimeout(self.timeout)
115
+
116
+ self.hoverState = 'out'
117
+
118
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
119
+
120
+ self.timeout = setTimeout(function () {
121
+ if (self.hoverState == 'out') self.hide()
122
+ }, self.options.delay.hide)
123
+ }
124
+
125
+ Tooltip.prototype.show = function () {
126
+ var e = $.Event('show.bs.' + this.type)
127
+
128
+ if (this.hasContent() && this.enabled) {
129
+ this.$element.trigger(e)
130
+
131
+ if (e.isDefaultPrevented()) return
132
+ var that = this;
133
+
134
+ var $tip = this.tip()
135
+
136
+ this.setContent()
137
+
138
+ if (this.options.animation) $tip.addClass('fade')
139
+
140
+ var placement = typeof this.options.placement == 'function' ?
141
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
142
+ this.options.placement
143
+
144
+ var autoToken = /\s?auto?\s?/i
145
+ var autoPlace = autoToken.test(placement)
146
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
147
+
148
+ $tip
149
+ .detach()
150
+ .css({ top: 0, left: 0, display: 'block' })
151
+ .addClass(placement)
152
+
153
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
154
+
155
+ var pos = this.getPosition()
156
+ var actualWidth = $tip[0].offsetWidth
157
+ var actualHeight = $tip[0].offsetHeight
158
+
159
+ if (autoPlace) {
160
+ var $parent = this.$element.parent()
161
+
162
+ var orgPlacement = placement
163
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
164
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
165
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
166
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
167
+
168
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
169
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
170
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
171
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
172
+ placement
173
+
174
+ $tip
175
+ .removeClass(orgPlacement)
176
+ .addClass(placement)
177
+ }
178
+
179
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
180
+
181
+ this.applyPlacement(calculatedOffset, placement)
182
+ this.hoverState = null
183
+
184
+ var complete = function() {
185
+ that.$element.trigger('shown.bs.' + that.type)
186
+ }
187
+
188
+ $.support.transition && this.$tip.hasClass('fade') ?
189
+ $tip
190
+ .one($.support.transition.end, complete)
191
+ .emulateTransitionEnd(150) :
192
+ complete()
193
+ }
194
+ }
195
+
196
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
197
+ var replace
198
+ var $tip = this.tip()
199
+ var width = $tip[0].offsetWidth
200
+ var height = $tip[0].offsetHeight
201
+
202
+ // manually read margins because getBoundingClientRect includes difference
203
+ var marginTop = parseInt($tip.css('margin-top'), 10)
204
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
205
+
206
+ // we must check for NaN for ie 8/9
207
+ if (isNaN(marginTop)) marginTop = 0
208
+ if (isNaN(marginLeft)) marginLeft = 0
209
+
210
+ offset.top = offset.top + marginTop
211
+ offset.left = offset.left + marginLeft
212
+
213
+ // $.fn.offset doesn't round pixel values
214
+ // so we use setOffset directly with our own function B-0
215
+ $.offset.setOffset($tip[0], $.extend({
216
+ using: function (props) {
217
+ $tip.css({
218
+ top: Math.round(props.top),
219
+ left: Math.round(props.left)
220
+ })
221
+ }
222
+ }, offset), 0)
223
+
224
+ $tip.addClass('in')
225
+
226
+ // check to see if placing tip in new offset caused the tip to resize itself
227
+ var actualWidth = $tip[0].offsetWidth
228
+ var actualHeight = $tip[0].offsetHeight
229
+
230
+ if (placement == 'top' && actualHeight != height) {
231
+ replace = true
232
+ offset.top = offset.top + height - actualHeight
233
+ }
234
+
235
+ if (/bottom|top/.test(placement)) {
236
+ var delta = 0
237
+
238
+ if (offset.left < 0) {
239
+ delta = offset.left * -2
240
+ offset.left = 0
241
+
242
+ $tip.offset(offset)
243
+
244
+ actualWidth = $tip[0].offsetWidth
245
+ actualHeight = $tip[0].offsetHeight
246
+ }
247
+
248
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
249
+ } else {
250
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
251
+ }
252
+
253
+ if (replace) $tip.offset(offset)
254
+ }
255
+
256
+ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
257
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
258
+ }
259
+
260
+ Tooltip.prototype.setContent = function () {
261
+ var $tip = this.tip()
262
+ var title = this.getTitle()
263
+
264
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
265
+ $tip.removeClass('fade in top bottom left right')
266
+ }
267
+
268
+ Tooltip.prototype.hide = function () {
269
+ var that = this
270
+ var $tip = this.tip()
271
+ var e = $.Event('hide.bs.' + this.type)
272
+
273
+ function complete() {
274
+ if (that.hoverState != 'in') $tip.detach()
275
+ that.$element.trigger('hidden.bs.' + that.type)
276
+ }
277
+
278
+ this.$element.trigger(e)
279
+
280
+ if (e.isDefaultPrevented()) return
281
+
282
+ $tip.removeClass('in')
283
+
284
+ $.support.transition && this.$tip.hasClass('fade') ?
285
+ $tip
286
+ .one($.support.transition.end, complete)
287
+ .emulateTransitionEnd(150) :
288
+ complete()
289
+
290
+ this.hoverState = null
291
+
292
+ return this
293
+ }
294
+
295
+ Tooltip.prototype.fixTitle = function () {
296
+ var $e = this.$element
297
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
298
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
299
+ }
300
+ }
301
+
302
+ Tooltip.prototype.hasContent = function () {
303
+ return this.getTitle()
304
+ }
305
+
306
+ Tooltip.prototype.getPosition = function () {
307
+ var el = this.$element[0]
308
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
309
+ width: el.offsetWidth,
310
+ height: el.offsetHeight
311
+ }, this.$element.offset())
312
+ }
313
+
314
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
315
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
316
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
317
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
318
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
319
+ }
320
+
321
+ Tooltip.prototype.getTitle = function () {
322
+ var title
323
+ var $e = this.$element
324
+ var o = this.options
325
+
326
+ title = $e.attr('data-original-title')
327
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
328
+
329
+ return title
330
+ }
331
+
332
+ Tooltip.prototype.tip = function () {
333
+ return this.$tip = this.$tip || $(this.options.template)
334
+ }
335
+
336
+ Tooltip.prototype.arrow = function () {
337
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
338
+ }
339
+
340
+ Tooltip.prototype.validate = function () {
341
+ if (!this.$element[0].parentNode) {
342
+ this.hide()
343
+ this.$element = null
344
+ this.options = null
345
+ }
346
+ }
347
+
348
+ Tooltip.prototype.enable = function () {
349
+ this.enabled = true
350
+ }
351
+
352
+ Tooltip.prototype.disable = function () {
353
+ this.enabled = false
354
+ }
355
+
356
+ Tooltip.prototype.toggleEnabled = function () {
357
+ this.enabled = !this.enabled
358
+ }
359
+
360
+ Tooltip.prototype.toggle = function (e) {
361
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
362
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
363
+ }
364
+
365
+ Tooltip.prototype.destroy = function () {
366
+ clearTimeout(this.timeout)
367
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
368
+ }
369
+
370
+
371
+ // TOOLTIP PLUGIN DEFINITION
372
+ // =========================
373
+
374
+ var old = $.fn.tooltip
375
+
376
+ $.fn.tooltip = function (option) {
377
+ return this.each(function () {
378
+ var $this = $(this)
379
+ var data = $this.data('bs.tooltip')
380
+ var options = typeof option == 'object' && option
381
+
382
+ if (!data && option == 'destroy') return
383
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
384
+ if (typeof option == 'string') data[option]()
385
+ })
386
+ }
387
+
388
+ $.fn.tooltip.Constructor = Tooltip
389
+
390
+
391
+ // TOOLTIP NO CONFLICT
392
+ // ===================
393
+
394
+ $.fn.tooltip.noConflict = function () {
395
+ $.fn.tooltip = old
396
+ return this
397
+ }
398
+
399
+ }(jQuery);