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,154 @@
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.scrollspy', 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
+
47
+ this.$body
48
+ .find(this.selector)
49
+ .map(function () {
50
+ var $el = $(this)
51
+ var href = $el.data('target') || $el.attr('href')
52
+ var $href = /^#./.test(href) && $(href)
53
+
54
+ return ($href
55
+ && $href.length
56
+ && $href.is(':visible')
57
+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
58
+ })
59
+ .sort(function (a, b) { return a[0] - b[0] })
60
+ .each(function () {
61
+ self.offsets.push(this[0])
62
+ self.targets.push(this[1])
63
+ })
64
+ }
65
+
66
+ ScrollSpy.prototype.process = function () {
67
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
68
+ var scrollHeight = this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
69
+ var maxScroll = scrollHeight - this.$scrollElement.height()
70
+ var offsets = this.offsets
71
+ var targets = this.targets
72
+ var activeTarget = this.activeTarget
73
+ var i
74
+
75
+ if (scrollTop >= maxScroll) {
76
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
77
+ }
78
+
79
+ if (activeTarget && scrollTop <= offsets[0]) {
80
+ return activeTarget != (i = targets[0]) && this.activate(i)
81
+ }
82
+
83
+ for (i = offsets.length; i--;) {
84
+ activeTarget != targets[i]
85
+ && scrollTop >= offsets[i]
86
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
87
+ && this.activate( targets[i] )
88
+ }
89
+ }
90
+
91
+ ScrollSpy.prototype.activate = function (target) {
92
+ this.activeTarget = target
93
+
94
+ $(this.selector)
95
+ .parentsUntil(this.options.target, '.active')
96
+ .removeClass('active')
97
+
98
+ var selector = this.selector +
99
+ '[data-target="' + target + '"],' +
100
+ this.selector + '[href="' + target + '"]'
101
+
102
+ var active = $(selector)
103
+ .parents('li')
104
+ .addClass('active')
105
+
106
+ if (active.parent('.dropdown-menu').length) {
107
+ active = active
108
+ .closest('li.dropdown')
109
+ .addClass('active')
110
+ }
111
+
112
+ active.trigger('activate.bs.scrollspy')
113
+ }
114
+
115
+
116
+ // SCROLLSPY PLUGIN DEFINITION
117
+ // ===========================
118
+
119
+ var old = $.fn.scrollspy
120
+
121
+ $.fn.scrollspy = function (option) {
122
+ return this.each(function () {
123
+ var $this = $(this)
124
+ var data = $this.data('bs.scrollspy')
125
+ var options = typeof option == 'object' && option
126
+
127
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
128
+ if (typeof option == 'string') data[option]()
129
+ })
130
+ }
131
+
132
+ $.fn.scrollspy.Constructor = ScrollSpy
133
+
134
+
135
+ // SCROLLSPY NO CONFLICT
136
+ // =====================
137
+
138
+ $.fn.scrollspy.noConflict = function () {
139
+ $.fn.scrollspy = old
140
+ return this
141
+ }
142
+
143
+
144
+ // SCROLLSPY DATA-API
145
+ // ==================
146
+
147
+ $(window).on('load.bs.scrollspy.data-api', function () {
148
+ $('[data-spy="scroll"]').each(function () {
149
+ var $spy = $(this)
150
+ $spy.scrollspy($spy.data())
151
+ })
152
+ })
153
+
154
+ }(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,422 @@
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" role="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
+ viewport: {
39
+ selector: 'body',
40
+ padding: 0
41
+ }
42
+ }
43
+
44
+ Tooltip.prototype.init = function (type, element, options) {
45
+ this.enabled = true
46
+ this.type = type
47
+ this.$element = $(element)
48
+ this.options = this.getOptions(options)
49
+ this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
50
+
51
+ var triggers = this.options.trigger.split(' ')
52
+
53
+ for (var i = triggers.length; i--;) {
54
+ var trigger = triggers[i]
55
+
56
+ if (trigger == 'click') {
57
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
58
+ } else if (trigger != 'manual') {
59
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
60
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
61
+
62
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
63
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
64
+ }
65
+ }
66
+
67
+ this.options.selector ?
68
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
69
+ this.fixTitle()
70
+ }
71
+
72
+ Tooltip.prototype.getDefaults = function () {
73
+ return Tooltip.DEFAULTS
74
+ }
75
+
76
+ Tooltip.prototype.getOptions = function (options) {
77
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
78
+
79
+ if (options.delay && typeof options.delay == 'number') {
80
+ options.delay = {
81
+ show: options.delay,
82
+ hide: options.delay
83
+ }
84
+ }
85
+
86
+ return options
87
+ }
88
+
89
+ Tooltip.prototype.getDelegateOptions = function () {
90
+ var options = {}
91
+ var defaults = this.getDefaults()
92
+
93
+ this._options && $.each(this._options, function (key, value) {
94
+ if (defaults[key] != value) options[key] = value
95
+ })
96
+
97
+ return options
98
+ }
99
+
100
+ Tooltip.prototype.enter = function (obj) {
101
+ var self = obj instanceof this.constructor ?
102
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
103
+
104
+ clearTimeout(self.timeout)
105
+
106
+ self.hoverState = 'in'
107
+
108
+ if (!self.options.delay || !self.options.delay.show) return self.show()
109
+
110
+ self.timeout = setTimeout(function () {
111
+ if (self.hoverState == 'in') self.show()
112
+ }, self.options.delay.show)
113
+ }
114
+
115
+ Tooltip.prototype.leave = function (obj) {
116
+ var self = obj instanceof this.constructor ?
117
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
118
+
119
+ clearTimeout(self.timeout)
120
+
121
+ self.hoverState = 'out'
122
+
123
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
124
+
125
+ self.timeout = setTimeout(function () {
126
+ if (self.hoverState == 'out') self.hide()
127
+ }, self.options.delay.hide)
128
+ }
129
+
130
+ Tooltip.prototype.show = function () {
131
+ var e = $.Event('show.bs.' + this.type)
132
+
133
+ if (this.hasContent() && this.enabled) {
134
+ this.$element.trigger(e)
135
+
136
+ if (e.isDefaultPrevented()) return
137
+ var that = this;
138
+
139
+ var $tip = this.tip()
140
+
141
+ this.setContent()
142
+
143
+ if (this.options.animation) $tip.addClass('fade')
144
+
145
+ var placement = typeof this.options.placement == 'function' ?
146
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
147
+ this.options.placement
148
+
149
+ var autoToken = /\s?auto?\s?/i
150
+ var autoPlace = autoToken.test(placement)
151
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
152
+
153
+ $tip
154
+ .detach()
155
+ .css({ top: 0, left: 0, display: 'block' })
156
+ .addClass(placement)
157
+
158
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
159
+
160
+ var pos = this.getPosition()
161
+ var actualWidth = $tip[0].offsetWidth
162
+ var actualHeight = $tip[0].offsetHeight
163
+
164
+ if (autoPlace) {
165
+ var orgPlacement = placement
166
+ var $parent = this.$element.parent()
167
+ var parentDim = this.getPosition($parent)
168
+
169
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' :
170
+ placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' :
171
+ placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' :
172
+ placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' :
173
+ placement
174
+
175
+ $tip
176
+ .removeClass(orgPlacement)
177
+ .addClass(placement)
178
+ }
179
+
180
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
181
+
182
+ this.applyPlacement(calculatedOffset, placement)
183
+ this.hoverState = null
184
+
185
+ var complete = function() {
186
+ that.$element.trigger('shown.bs.' + that.type)
187
+ }
188
+
189
+ $.support.transition && this.$tip.hasClass('fade') ?
190
+ $tip
191
+ .one($.support.transition.end, complete)
192
+ .emulateTransitionEnd(150) :
193
+ complete()
194
+ }
195
+ }
196
+
197
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
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
+ offset.top = offset.top + height - actualHeight
232
+ }
233
+
234
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
235
+
236
+ if (delta.left) offset.left += delta.left
237
+ else offset.top += delta.top
238
+
239
+ var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
240
+ var arrowPosition = delta.left ? 'left' : 'top'
241
+ var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
242
+
243
+ $tip.offset(offset)
244
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
245
+ }
246
+
247
+ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
248
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
249
+ }
250
+
251
+ Tooltip.prototype.setContent = function () {
252
+ var $tip = this.tip()
253
+ var title = this.getTitle()
254
+
255
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
256
+ $tip.removeClass('fade in top bottom left right')
257
+ }
258
+
259
+ Tooltip.prototype.hide = function () {
260
+ var that = this
261
+ var $tip = this.tip()
262
+ var e = $.Event('hide.bs.' + this.type)
263
+
264
+ function complete() {
265
+ if (that.hoverState != 'in') $tip.detach()
266
+ that.$element.trigger('hidden.bs.' + that.type)
267
+ }
268
+
269
+ this.$element.trigger(e)
270
+
271
+ if (e.isDefaultPrevented()) return
272
+
273
+ $tip.removeClass('in')
274
+
275
+ $.support.transition && this.$tip.hasClass('fade') ?
276
+ $tip
277
+ .one($.support.transition.end, complete)
278
+ .emulateTransitionEnd(150) :
279
+ complete()
280
+
281
+ this.hoverState = null
282
+
283
+ return this
284
+ }
285
+
286
+ Tooltip.prototype.fixTitle = function () {
287
+ var $e = this.$element
288
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
289
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
290
+ }
291
+ }
292
+
293
+ Tooltip.prototype.hasContent = function () {
294
+ return this.getTitle()
295
+ }
296
+
297
+ Tooltip.prototype.getPosition = function ($element) {
298
+ $element = $element || this.$element
299
+ var el = $element[0]
300
+ var isBody = el.tagName == 'BODY'
301
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
302
+ scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
303
+ width: isBody ? $(window).width() : $element.outerWidth(),
304
+ height: isBody ? $(window).height() : $element.outerHeight()
305
+ }, isBody ? {top: 0, left: 0} : $element.offset())
306
+ }
307
+
308
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
309
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
310
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
311
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
312
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
313
+
314
+ }
315
+
316
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
317
+ var delta = { top: 0, left: 0 }
318
+ if (!this.$viewport) return delta
319
+
320
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
321
+ var viewportDimensions = this.getPosition(this.$viewport)
322
+
323
+ if (/right|left/.test(placement)) {
324
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
325
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
326
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
327
+ delta.top = viewportDimensions.top - topEdgeOffset
328
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
329
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
330
+ }
331
+ } else {
332
+ var leftEdgeOffset = pos.left - viewportPadding
333
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
334
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
335
+ delta.left = viewportDimensions.left - leftEdgeOffset
336
+ } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
337
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
338
+ }
339
+ }
340
+
341
+ return delta
342
+ }
343
+
344
+ Tooltip.prototype.getTitle = function () {
345
+ var title
346
+ var $e = this.$element
347
+ var o = this.options
348
+
349
+ title = $e.attr('data-original-title')
350
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
351
+
352
+ return title
353
+ }
354
+
355
+ Tooltip.prototype.tip = function () {
356
+ return this.$tip = this.$tip || $(this.options.template)
357
+ }
358
+
359
+ Tooltip.prototype.arrow = function () {
360
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
361
+ }
362
+
363
+ Tooltip.prototype.validate = function () {
364
+ if (!this.$element[0].parentNode) {
365
+ this.hide()
366
+ this.$element = null
367
+ this.options = null
368
+ }
369
+ }
370
+
371
+ Tooltip.prototype.enable = function () {
372
+ this.enabled = true
373
+ }
374
+
375
+ Tooltip.prototype.disable = function () {
376
+ this.enabled = false
377
+ }
378
+
379
+ Tooltip.prototype.toggleEnabled = function () {
380
+ this.enabled = !this.enabled
381
+ }
382
+
383
+ Tooltip.prototype.toggle = function (e) {
384
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
385
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
386
+ }
387
+
388
+ Tooltip.prototype.destroy = function () {
389
+ clearTimeout(this.timeout)
390
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
391
+ }
392
+
393
+
394
+ // TOOLTIP PLUGIN DEFINITION
395
+ // =========================
396
+
397
+ var old = $.fn.tooltip
398
+
399
+ $.fn.tooltip = function (option) {
400
+ return this.each(function () {
401
+ var $this = $(this)
402
+ var data = $this.data('bs.tooltip')
403
+ var options = typeof option == 'object' && option
404
+
405
+ if (!data && option == 'destroy') return
406
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
407
+ if (typeof option == 'string') data[option]()
408
+ })
409
+ }
410
+
411
+ $.fn.tooltip.Constructor = Tooltip
412
+
413
+
414
+ // TOOLTIP NO CONFLICT
415
+ // ===================
416
+
417
+ $.fn.tooltip.noConflict = function () {
418
+ $.fn.tooltip = old
419
+ return this
420
+ }
421
+
422
+ }(jQuery);