aerogel-bootstrap 0.0.2 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/aerogel-bootstrap.gemspec +3 -3
  3. data/assets/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  4. data/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +229 -0
  5. data/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  6. data/assets/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  7. data/assets/javascripts/bootstrap.js +12 -0
  8. data/assets/javascripts/bootstrap/affix.js +135 -0
  9. data/assets/javascripts/bootstrap/alert.js +88 -0
  10. data/assets/javascripts/bootstrap/button.js +107 -0
  11. data/assets/javascripts/bootstrap/carousel.js +205 -0
  12. data/assets/javascripts/bootstrap/collapse.js +175 -0
  13. data/assets/javascripts/bootstrap/dropdown.js +147 -0
  14. data/assets/javascripts/bootstrap/modal.js +271 -0
  15. data/assets/javascripts/bootstrap/popover.js +110 -0
  16. data/assets/javascripts/bootstrap/scrollspy.js +154 -0
  17. data/assets/javascripts/bootstrap/tab.js +125 -0
  18. data/assets/javascripts/bootstrap/tooltip.js +422 -0
  19. data/assets/javascripts/bootstrap/transition.js +48 -0
  20. data/assets/stylesheets/_bootstrap-mincer.scss +17 -0
  21. data/assets/stylesheets/bootstrap.scss +50 -0
  22. data/assets/stylesheets/bootstrap/_alerts.scss +67 -0
  23. data/assets/stylesheets/bootstrap/_badges.scss +57 -0
  24. data/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
  25. data/assets/stylesheets/bootstrap/_button-groups.scss +236 -0
  26. data/assets/stylesheets/bootstrap/_buttons.scss +159 -0
  27. data/assets/stylesheets/bootstrap/_carousel.scss +241 -0
  28. data/assets/stylesheets/bootstrap/_close.scss +35 -0
  29. data/assets/stylesheets/bootstrap/_code.scss +62 -0
  30. data/assets/stylesheets/bootstrap/_component-animations.scss +35 -0
  31. data/assets/stylesheets/bootstrap/_dropdowns.scss +214 -0
  32. data/assets/stylesheets/bootstrap/_forms.scss +478 -0
  33. data/assets/stylesheets/bootstrap/_glyphicons.scss +237 -0
  34. data/assets/stylesheets/bootstrap/_grid.scss +84 -0
  35. data/assets/stylesheets/bootstrap/_input-groups.scss +162 -0
  36. data/assets/stylesheets/bootstrap/_jumbotron.scss +48 -0
  37. data/assets/stylesheets/bootstrap/_labels.scss +66 -0
  38. data/assets/stylesheets/bootstrap/_list-group.scss +129 -0
  39. data/assets/stylesheets/bootstrap/_media.scss +56 -0
  40. data/assets/stylesheets/bootstrap/_mixins.scss +39 -0
  41. data/assets/stylesheets/bootstrap/_modals.scss +147 -0
  42. data/assets/stylesheets/bootstrap/_navbar.scss +658 -0
  43. data/assets/stylesheets/bootstrap/_navs.scss +242 -0
  44. data/assets/stylesheets/bootstrap/_normalize.scss +425 -0
  45. data/assets/stylesheets/bootstrap/_pager.scss +55 -0
  46. data/assets/stylesheets/bootstrap/_pagination.scss +88 -0
  47. data/assets/stylesheets/bootstrap/_panels.scss +240 -0
  48. data/assets/stylesheets/bootstrap/_popovers.scss +133 -0
  49. data/assets/stylesheets/bootstrap/_print.scss +101 -0
  50. data/assets/stylesheets/bootstrap/_progress-bars.scss +89 -0
  51. data/assets/stylesheets/bootstrap/_responsive-embed.scss +34 -0
  52. data/assets/stylesheets/bootstrap/_responsive-utilities.scss +173 -0
  53. data/assets/stylesheets/bootstrap/_scaffolding.scss +150 -0
  54. data/assets/stylesheets/bootstrap/_tables.scss +233 -0
  55. data/assets/stylesheets/bootstrap/_theme.scss +247 -0
  56. data/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
  57. data/assets/stylesheets/bootstrap/_tooltip.scss +95 -0
  58. data/assets/stylesheets/bootstrap/_type.scss +294 -0
  59. data/assets/stylesheets/bootstrap/_utilities.scss +56 -0
  60. data/assets/stylesheets/bootstrap/_variables.scss +849 -0
  61. data/assets/stylesheets/bootstrap/_wells.scss +29 -0
  62. data/assets/stylesheets/bootstrap/bootstrap.scss +50 -0
  63. data/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
  64. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
  65. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  66. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +50 -0
  67. data/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  68. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  69. data/assets/stylesheets/bootstrap/mixins/_forms.scss +84 -0
  70. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
  71. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +87 -0
  72. data/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  73. data/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  74. data/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
  75. data/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  76. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
  77. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  78. data/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  79. data/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
  80. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
  81. data/assets/stylesheets/bootstrap/mixins/_panels.scss +20 -0
  82. data/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +8 -0
  83. data/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  84. data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  85. data/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
  86. data/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  87. data/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  88. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  89. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
  90. data/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  91. data/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +224 -0
  92. data/lib/aerogel/bootstrap.rb +5 -7
  93. data/lib/aerogel/bootstrap/version.rb +5 -0
  94. metadata +104 -29
  95. data/public/README.md +0 -1
@@ -0,0 +1,147 @@
1
+ /* ========================================================================
2
+ * Bootstrap: dropdown.js v3.1.1
3
+ * http://getbootstrap.com/javascript/#dropdowns
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
+ // DROPDOWN CLASS DEFINITION
14
+ // =========================
15
+
16
+ var backdrop = '.dropdown-backdrop'
17
+ var toggle = '[data-toggle="dropdown"]'
18
+ var Dropdown = function (element) {
19
+ $(element).on('click.bs.dropdown', this.toggle)
20
+ }
21
+
22
+ Dropdown.prototype.toggle = function (e) {
23
+ var $this = $(this)
24
+
25
+ if ($this.is('.disabled, :disabled')) return
26
+
27
+ var $parent = getParent($this)
28
+ var isActive = $parent.hasClass('open')
29
+
30
+ clearMenus()
31
+
32
+ if (!isActive) {
33
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
34
+ // if mobile we use a backdrop because click events don't delegate
35
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
36
+ }
37
+
38
+ var relatedTarget = { relatedTarget: this }
39
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
40
+
41
+ if (e.isDefaultPrevented()) return
42
+
43
+ $this.trigger('focus')
44
+
45
+ $parent
46
+ .toggleClass('open')
47
+ .trigger('shown.bs.dropdown', relatedTarget)
48
+ }
49
+
50
+ return false
51
+ }
52
+
53
+ Dropdown.prototype.keydown = function (e) {
54
+ if (!/(38|40|27)/.test(e.keyCode)) return
55
+
56
+ var $this = $(this)
57
+
58
+ e.preventDefault()
59
+ e.stopPropagation()
60
+
61
+ if ($this.is('.disabled, :disabled')) return
62
+
63
+ var $parent = getParent($this)
64
+ var isActive = $parent.hasClass('open')
65
+
66
+ if (!isActive || (isActive && e.keyCode == 27)) {
67
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
68
+ return $this.trigger('click')
69
+ }
70
+
71
+ var desc = ' li:not(.divider):visible a'
72
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
73
+
74
+ if (!$items.length) return
75
+
76
+ var index = $items.index($items.filter(':focus'))
77
+
78
+ if (e.keyCode == 38 && index > 0) index-- // up
79
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
80
+ if (!~index) index = 0
81
+
82
+ $items.eq(index).trigger('focus')
83
+ }
84
+
85
+ function clearMenus(e) {
86
+ $(backdrop).remove()
87
+ $(toggle).each(function () {
88
+ var $parent = getParent($(this))
89
+ var relatedTarget = { relatedTarget: this }
90
+ if (!$parent.hasClass('open')) return
91
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
92
+ if (e.isDefaultPrevented()) return
93
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
94
+ })
95
+ }
96
+
97
+ function getParent($this) {
98
+ var selector = $this.attr('data-target')
99
+
100
+ if (!selector) {
101
+ selector = $this.attr('href')
102
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
103
+ }
104
+
105
+ var $parent = selector && $(selector)
106
+
107
+ return $parent && $parent.length ? $parent : $this.parent()
108
+ }
109
+
110
+
111
+ // DROPDOWN PLUGIN DEFINITION
112
+ // ==========================
113
+
114
+ var old = $.fn.dropdown
115
+
116
+ $.fn.dropdown = function (option) {
117
+ return this.each(function () {
118
+ var $this = $(this)
119
+ var data = $this.data('bs.dropdown')
120
+
121
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
122
+ if (typeof option == 'string') data[option].call($this)
123
+ })
124
+ }
125
+
126
+ $.fn.dropdown.Constructor = Dropdown
127
+
128
+
129
+ // DROPDOWN NO CONFLICT
130
+ // ====================
131
+
132
+ $.fn.dropdown.noConflict = function () {
133
+ $.fn.dropdown = old
134
+ return this
135
+ }
136
+
137
+
138
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
139
+ // ===================================
140
+
141
+ $(document)
142
+ .on('click.bs.dropdown.data-api', clearMenus)
143
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
144
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
145
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
146
+
147
+ }(jQuery);
@@ -0,0 +1,271 @@
1
+ /* ========================================================================
2
+ * Bootstrap: modal.js v3.1.1
3
+ * http://getbootstrap.com/javascript/#modals
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
+ // MODAL CLASS DEFINITION
14
+ // ======================
15
+
16
+ var Modal = function (element, options) {
17
+ this.options = options
18
+ this.$body = $(document.body)
19
+ this.$element = $(element)
20
+ this.$backdrop =
21
+ this.isShown = null
22
+ this.scrollbarWidth = 0
23
+
24
+ if (this.options.remote) {
25
+ this.$element
26
+ .find('.modal-content')
27
+ .load(this.options.remote, $.proxy(function () {
28
+ this.$element.trigger('loaded.bs.modal')
29
+ }, this))
30
+ }
31
+ }
32
+
33
+ Modal.DEFAULTS = {
34
+ backdrop: true,
35
+ keyboard: true,
36
+ show: true
37
+ }
38
+
39
+ Modal.prototype.toggle = function (_relatedTarget) {
40
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
41
+ }
42
+
43
+ Modal.prototype.show = function (_relatedTarget) {
44
+ var that = this
45
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
46
+
47
+ this.$element.trigger(e)
48
+
49
+ if (this.isShown || e.isDefaultPrevented()) return
50
+
51
+ this.isShown = true
52
+
53
+ this.checkScrollbar()
54
+ this.$body.addClass('modal-open')
55
+
56
+ this.setScrollbar()
57
+ this.escape()
58
+
59
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
60
+
61
+ this.backdrop(function () {
62
+ var transition = $.support.transition && that.$element.hasClass('fade')
63
+
64
+ if (!that.$element.parent().length) {
65
+ that.$element.appendTo(that.$body) // don't move modals dom position
66
+ }
67
+
68
+ that.$element
69
+ .show()
70
+ .scrollTop(0)
71
+
72
+ if (transition) {
73
+ that.$element[0].offsetWidth // force reflow
74
+ }
75
+
76
+ that.$element
77
+ .addClass('in')
78
+ .attr('aria-hidden', false)
79
+
80
+ that.enforceFocus()
81
+
82
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
83
+
84
+ transition ?
85
+ that.$element.find('.modal-dialog') // wait for modal to slide in
86
+ .one($.support.transition.end, function () {
87
+ that.$element.trigger('focus').trigger(e)
88
+ })
89
+ .emulateTransitionEnd(300) :
90
+ that.$element.trigger('focus').trigger(e)
91
+ })
92
+ }
93
+
94
+ Modal.prototype.hide = function (e) {
95
+ if (e) e.preventDefault()
96
+
97
+ e = $.Event('hide.bs.modal')
98
+
99
+ this.$element.trigger(e)
100
+
101
+ if (!this.isShown || e.isDefaultPrevented()) return
102
+
103
+ this.isShown = false
104
+
105
+ this.$body.removeClass('modal-open')
106
+
107
+ this.resetScrollbar()
108
+ this.escape()
109
+
110
+ $(document).off('focusin.bs.modal')
111
+
112
+ this.$element
113
+ .removeClass('in')
114
+ .attr('aria-hidden', true)
115
+ .off('click.dismiss.bs.modal')
116
+
117
+ $.support.transition && this.$element.hasClass('fade') ?
118
+ this.$element
119
+ .one($.support.transition.end, $.proxy(this.hideModal, this))
120
+ .emulateTransitionEnd(300) :
121
+ this.hideModal()
122
+ }
123
+
124
+ Modal.prototype.enforceFocus = function () {
125
+ $(document)
126
+ .off('focusin.bs.modal') // guard against infinite focus loop
127
+ .on('focusin.bs.modal', $.proxy(function (e) {
128
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
129
+ this.$element.trigger('focus')
130
+ }
131
+ }, this))
132
+ }
133
+
134
+ Modal.prototype.escape = function () {
135
+ if (this.isShown && this.options.keyboard) {
136
+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
137
+ e.which == 27 && this.hide()
138
+ }, this))
139
+ } else if (!this.isShown) {
140
+ this.$element.off('keyup.dismiss.bs.modal')
141
+ }
142
+ }
143
+
144
+ Modal.prototype.hideModal = function () {
145
+ var that = this
146
+ this.$element.hide()
147
+ this.backdrop(function () {
148
+ that.removeBackdrop()
149
+ that.$element.trigger('hidden.bs.modal')
150
+ })
151
+ }
152
+
153
+ Modal.prototype.removeBackdrop = function () {
154
+ this.$backdrop && this.$backdrop.remove()
155
+ this.$backdrop = null
156
+ }
157
+
158
+ Modal.prototype.backdrop = function (callback) {
159
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
160
+
161
+ if (this.isShown && this.options.backdrop) {
162
+ var doAnimate = $.support.transition && animate
163
+
164
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
165
+ .appendTo(this.$body)
166
+
167
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
168
+ if (e.target !== e.currentTarget) return
169
+ this.options.backdrop == 'static'
170
+ ? this.$element[0].focus.call(this.$element[0])
171
+ : this.hide.call(this)
172
+ }, this))
173
+
174
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
175
+
176
+ this.$backdrop.addClass('in')
177
+
178
+ if (!callback) return
179
+
180
+ doAnimate ?
181
+ this.$backdrop
182
+ .one($.support.transition.end, callback)
183
+ .emulateTransitionEnd(150) :
184
+ callback()
185
+
186
+ } else if (!this.isShown && this.$backdrop) {
187
+ this.$backdrop.removeClass('in')
188
+
189
+ $.support.transition && this.$element.hasClass('fade') ?
190
+ this.$backdrop
191
+ .one($.support.transition.end, callback)
192
+ .emulateTransitionEnd(150) :
193
+ callback()
194
+
195
+ } else if (callback) {
196
+ callback()
197
+ }
198
+ }
199
+
200
+ Modal.prototype.checkScrollbar = function () {
201
+ if (document.body.clientWidth >= window.innerWidth) return
202
+ this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
203
+ }
204
+
205
+ Modal.prototype.setScrollbar = function () {
206
+ var bodyPad = parseInt(this.$body.css('padding-right') || 0)
207
+ if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
208
+ }
209
+
210
+ Modal.prototype.resetScrollbar = function () {
211
+ this.$body.css('padding-right', '')
212
+ }
213
+
214
+ Modal.prototype.measureScrollbar = function () { // thx walsh
215
+ var scrollDiv = document.createElement('div')
216
+ scrollDiv.className = 'modal-scrollbar-measure'
217
+ this.$body.append(scrollDiv)
218
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
219
+ this.$body[0].removeChild(scrollDiv)
220
+ return scrollbarWidth
221
+ }
222
+
223
+
224
+ // MODAL PLUGIN DEFINITION
225
+ // =======================
226
+
227
+ var old = $.fn.modal
228
+
229
+ $.fn.modal = function (option, _relatedTarget) {
230
+ return this.each(function () {
231
+ var $this = $(this)
232
+ var data = $this.data('bs.modal')
233
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
234
+
235
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
236
+ if (typeof option == 'string') data[option](_relatedTarget)
237
+ else if (options.show) data.show(_relatedTarget)
238
+ })
239
+ }
240
+
241
+ $.fn.modal.Constructor = Modal
242
+
243
+
244
+ // MODAL NO CONFLICT
245
+ // =================
246
+
247
+ $.fn.modal.noConflict = function () {
248
+ $.fn.modal = old
249
+ return this
250
+ }
251
+
252
+
253
+ // MODAL DATA-API
254
+ // ==============
255
+
256
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
257
+ var $this = $(this)
258
+ var href = $this.attr('href')
259
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
260
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
261
+
262
+ if ($this.is('a')) e.preventDefault()
263
+
264
+ $target
265
+ .modal(option, this)
266
+ .one('hide', function () {
267
+ $this.is(':visible') && $this.trigger('focus')
268
+ })
269
+ })
270
+
271
+ }(jQuery);
@@ -0,0 +1,110 @@
1
+ /* ========================================================================
2
+ * Bootstrap: popover.js v3.1.1
3
+ * http://getbootstrap.com/javascript/#popovers
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
+ // POPOVER PUBLIC CLASS DEFINITION
14
+ // ===============================
15
+
16
+ var Popover = function (element, options) {
17
+ this.init('popover', element, options)
18
+ }
19
+
20
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
21
+
22
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
23
+ placement: 'right',
24
+ trigger: 'click',
25
+ content: '',
26
+ template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
27
+ })
28
+
29
+
30
+ // NOTE: POPOVER EXTENDS tooltip.js
31
+ // ================================
32
+
33
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
34
+
35
+ Popover.prototype.constructor = Popover
36
+
37
+ Popover.prototype.getDefaults = function () {
38
+ return Popover.DEFAULTS
39
+ }
40
+
41
+ Popover.prototype.setContent = function () {
42
+ var $tip = this.tip()
43
+ var title = this.getTitle()
44
+ var content = this.getContent()
45
+
46
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
47
+ $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
48
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
49
+ ](content)
50
+
51
+ $tip.removeClass('fade top bottom left right in')
52
+
53
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
54
+ // this manually by checking the contents.
55
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
56
+ }
57
+
58
+ Popover.prototype.hasContent = function () {
59
+ return this.getTitle() || this.getContent()
60
+ }
61
+
62
+ Popover.prototype.getContent = function () {
63
+ var $e = this.$element
64
+ var o = this.options
65
+
66
+ return $e.attr('data-content')
67
+ || (typeof o.content == 'function' ?
68
+ o.content.call($e[0]) :
69
+ o.content)
70
+ }
71
+
72
+ Popover.prototype.arrow = function () {
73
+ return this.$arrow = this.$arrow || this.tip().find('.arrow')
74
+ }
75
+
76
+ Popover.prototype.tip = function () {
77
+ if (!this.$tip) this.$tip = $(this.options.template)
78
+ return this.$tip
79
+ }
80
+
81
+
82
+ // POPOVER PLUGIN DEFINITION
83
+ // =========================
84
+
85
+ var old = $.fn.popover
86
+
87
+ $.fn.popover = function (option) {
88
+ return this.each(function () {
89
+ var $this = $(this)
90
+ var data = $this.data('bs.popover')
91
+ var options = typeof option == 'object' && option
92
+
93
+ if (!data && option == 'destroy') return
94
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
95
+ if (typeof option == 'string') data[option]()
96
+ })
97
+ }
98
+
99
+ $.fn.popover.Constructor = Popover
100
+
101
+
102
+ // POPOVER NO CONFLICT
103
+ // ===================
104
+
105
+ $.fn.popover.noConflict = function () {
106
+ $.fn.popover = old
107
+ return this
108
+ }
109
+
110
+ }(jQuery);