bootstrap-sass 1.4.4 → 2.0.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.

Potentially problematic release.


This version of bootstrap-sass might be problematic. Click here for more details.

Files changed (71) hide show
  1. data/README.md +52 -19
  2. data/lib/bootstrap-sass.rb +24 -6
  3. data/lib/bootstrap-sass/compass_extensions.rb +10 -0
  4. data/lib/bootstrap-sass/config/sass_extentions.rb +14 -0
  5. data/lib/bootstrap-sass/engine.rb +9 -0
  6. data/templates/project/manifest.rb +18 -0
  7. data/templates/project/styles.scss +5 -0
  8. data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
  9. data/vendor/assets/images/glyphicons-halflings.png +0 -0
  10. data/vendor/assets/javascripts/bootstrap-alert.js +91 -0
  11. data/vendor/assets/javascripts/bootstrap-button.js +98 -0
  12. data/vendor/assets/javascripts/bootstrap-carousel.js +154 -0
  13. data/vendor/assets/javascripts/bootstrap-collapse.js +136 -0
  14. data/vendor/assets/javascripts/bootstrap-dropdown.js +58 -21
  15. data/vendor/assets/javascripts/bootstrap-modal.js +63 -114
  16. data/vendor/assets/javascripts/bootstrap-popover.js +38 -33
  17. data/vendor/assets/javascripts/bootstrap-scrollspy.js +62 -44
  18. data/vendor/assets/javascripts/bootstrap-tab.js +130 -0
  19. data/vendor/assets/javascripts/bootstrap-tooltip.js +270 -0
  20. data/vendor/assets/javascripts/bootstrap-transition.js +51 -0
  21. data/vendor/assets/javascripts/bootstrap-typeahead.js +271 -0
  22. data/vendor/assets/javascripts/bootstrap.js +9 -6
  23. data/vendor/assets/stylesheets/_bootstrap-responsive.scss +314 -0
  24. data/vendor/assets/stylesheets/_bootstrap.scss +63 -0
  25. data/vendor/assets/stylesheets/bootstrap/_accordion.scss +28 -0
  26. data/vendor/assets/stylesheets/bootstrap/_alerts.scss +62 -0
  27. data/vendor/assets/stylesheets/bootstrap/_breadcrumbs.scss +22 -0
  28. data/vendor/assets/stylesheets/bootstrap/_button-groups.scss +136 -0
  29. data/vendor/assets/stylesheets/bootstrap/_buttons.scss +149 -0
  30. data/vendor/assets/stylesheets/bootstrap/_carousel.scss +116 -0
  31. data/vendor/assets/stylesheets/bootstrap/_close.scss +18 -0
  32. data/vendor/assets/stylesheets/bootstrap/_code.scss +43 -0
  33. data/vendor/assets/stylesheets/bootstrap/_component-animations.scss +18 -0
  34. data/vendor/assets/stylesheets/bootstrap/_dropdowns.scss +127 -0
  35. data/vendor/assets/stylesheets/bootstrap/_forms.scss +458 -0
  36. data/vendor/assets/stylesheets/bootstrap/_grid.scss +8 -0
  37. data/vendor/assets/stylesheets/bootstrap/_hero-unit.scss +20 -0
  38. data/vendor/assets/stylesheets/bootstrap/_labels.scss +16 -0
  39. data/vendor/assets/stylesheets/bootstrap/_layouts.scss +17 -0
  40. data/vendor/assets/stylesheets/bootstrap/_mixins.scss +479 -0
  41. data/vendor/assets/stylesheets/bootstrap/_modals.scss +72 -0
  42. data/vendor/assets/stylesheets/bootstrap/_navbar.scss +282 -0
  43. data/vendor/assets/stylesheets/bootstrap/_navs.scss +320 -0
  44. data/vendor/assets/stylesheets/bootstrap/_pager.scss +30 -0
  45. data/vendor/assets/stylesheets/bootstrap/_pagination.scss +53 -0
  46. data/vendor/assets/stylesheets/bootstrap/_popovers.scss +49 -0
  47. data/vendor/assets/stylesheets/bootstrap/_progress-bars.scss +95 -0
  48. data/vendor/assets/stylesheets/bootstrap/_reset.scss +105 -0
  49. data/vendor/assets/stylesheets/bootstrap/_scaffolding.scss +29 -0
  50. data/vendor/assets/stylesheets/bootstrap/_sprites.scss +156 -0
  51. data/vendor/assets/stylesheets/bootstrap/_tables.scss +117 -0
  52. data/vendor/assets/stylesheets/bootstrap/_thumbnails.scss +35 -0
  53. data/vendor/assets/stylesheets/bootstrap/_tooltip.scss +35 -0
  54. data/vendor/assets/stylesheets/bootstrap/_type.scss +209 -0
  55. data/vendor/assets/stylesheets/bootstrap/_utilities.scss +23 -0
  56. data/vendor/assets/stylesheets/bootstrap/_variables.scss +99 -0
  57. data/vendor/assets/stylesheets/bootstrap/_wells.scss +17 -0
  58. metadata +68 -20
  59. data/vendor/assets/javascripts/bootstrap-alerts.js +0 -124
  60. data/vendor/assets/javascripts/bootstrap-buttons.js +0 -64
  61. data/vendor/assets/javascripts/bootstrap-tabs.js +0 -80
  62. data/vendor/assets/javascripts/bootstrap-twipsy.js +0 -321
  63. data/vendor/assets/stylesheets/bootstrap.css.scss +0 -25
  64. data/vendor/assets/stylesheets/bootstrap/forms.css.scss +0 -427
  65. data/vendor/assets/stylesheets/bootstrap/mixins.css.scss +0 -216
  66. data/vendor/assets/stylesheets/bootstrap/patterns.css.scss +0 -994
  67. data/vendor/assets/stylesheets/bootstrap/reset.css.scss +0 -142
  68. data/vendor/assets/stylesheets/bootstrap/scaffolding.css.scss +0 -129
  69. data/vendor/assets/stylesheets/bootstrap/tables.css.scss +0 -212
  70. data/vendor/assets/stylesheets/bootstrap/type.css.scss +0 -186
  71. data/vendor/assets/stylesheets/bootstrap/variables.css.scss +0 -51
@@ -1,8 +1,8 @@
1
1
  /* ===========================================================
2
- * bootstrap-popover.js v1.4.0
3
- * http://twitter.github.com/bootstrap/javascript.html#popover
2
+ * bootstrap-popover.js v2.0.0
3
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
4
4
  * ===========================================================
5
- * Copyright 2011 Twitter, Inc.
5
+ * Copyright 2012 Twitter, Inc.
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -23,22 +23,25 @@
23
23
  "use strict"
24
24
 
25
25
  var Popover = function ( element, options ) {
26
- this.$element = $(element)
27
- this.options = options
28
- this.enabled = true
29
- this.fixTitle()
26
+ this.init('popover', element, options)
30
27
  }
31
28
 
32
- /* NOTE: POPOVER EXTENDS BOOTSTRAP-TWIPSY.js
33
- ========================================= */
29
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
30
+ ========================================== */
34
31
 
35
- Popover.prototype = $.extend({}, $.fn.twipsy.Twipsy.prototype, {
32
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
36
33
 
37
- setContent: function () {
34
+ constructor: Popover
35
+
36
+ , setContent: function () {
38
37
  var $tip = this.tip()
39
- $tip.find('.title')[this.options.html ? 'html' : 'text'](this.getTitle())
40
- $tip.find('.content > *')[this.options.html ? 'html' : 'text'](this.getContent())
41
- $tip[0].className = 'popover'
38
+ , title = this.getTitle()
39
+ , content = this.getContent()
40
+
41
+ $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)
42
+ $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)
43
+
44
+ $tip.removeClass('fade top bottom left right in')
42
45
  }
43
46
 
44
47
  , hasContent: function () {
@@ -47,22 +50,20 @@
47
50
 
48
51
  , getContent: function () {
49
52
  var content
50
- , $e = this.$element
51
- , o = this.options
53
+ , $e = this.$element
54
+ , o = this.options
52
55
 
53
- if (typeof this.options.content == 'string') {
54
- content = $e.attr(this.options.content)
55
- } else if (typeof this.options.content == 'function') {
56
- content = this.options.content.call(this.$element[0])
57
- }
56
+ content = $e.attr('data-content')
57
+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
58
+
59
+ content = content.toString().replace(/(^\s*|\s*$)/, "")
58
60
 
59
61
  return content
60
62
  }
61
63
 
62
64
  , tip: function() {
63
65
  if (!this.$tip) {
64
- this.$tip = $('<div class="popover" />')
65
- .html(this.options.template)
66
+ this.$tip = $(this.options.template)
66
67
  }
67
68
  return this.$tip
68
69
  }
@@ -73,18 +74,22 @@
73
74
  /* POPOVER PLUGIN DEFINITION
74
75
  * ======================= */
75
76
 
76
- $.fn.popover = function (options) {
77
- if (typeof options == 'object') options = $.extend({}, $.fn.popover.defaults, options)
78
- $.fn.twipsy.initWith.call(this, options, Popover, 'popover')
79
- return this
77
+ $.fn.popover = function ( option ) {
78
+ return this.each(function () {
79
+ var $this = $(this)
80
+ , data = $this.data('popover')
81
+ , options = typeof option == 'object' && option
82
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
83
+ if (typeof option == 'string') data[option]()
84
+ })
80
85
  }
81
86
 
82
- $.fn.popover.defaults = $.extend({} , $.fn.twipsy.defaults, {
87
+ $.fn.popover.Constructor = Popover
88
+
89
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
83
90
  placement: 'right'
84
- , content: 'data-content'
85
- , template: '<div class="arrow"></div><div class="inner"><h3 class="title"></h3><div class="content"><p></p></div></div>'
91
+ , content: ''
92
+ , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
86
93
  })
87
94
 
88
- $.fn.twipsy.rejectAttrOptions.push( 'content' )
89
-
90
- }( window.jQuery || window.ender );
95
+ }( window.jQuery )
@@ -1,8 +1,8 @@
1
1
  /* =============================================================
2
- * bootstrap-scrollspy.js v1.4.0
2
+ * bootstrap-scrollspy.js v2.0.0
3
3
  * http://twitter.github.com/bootstrap/javascript.html#scrollspy
4
4
  * =============================================================
5
- * Copyright 2011 Twitter, Inc.
5
+ * Copyright 2012 Twitter, Inc.
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -17,38 +17,46 @@
17
17
  * limitations under the License.
18
18
  * ============================================================== */
19
19
 
20
-
21
20
  !function ( $ ) {
22
21
 
23
22
  "use strict"
24
23
 
25
- var $window = $(window)
26
-
27
- function ScrollSpy( topbar, selector ) {
28
- var processScroll = $.proxy(this.processScroll, this)
29
- this.$topbar = $(topbar)
30
- this.selector = selector || 'li > a'
24
+ /* SCROLLSPY CLASS DEFINITION
25
+ * ========================== */
26
+
27
+ function ScrollSpy( element, options) {
28
+ var process = $.proxy(this.process, this)
29
+ , $element = $(element).is('body') ? $(window) : $(element)
30
+ , href
31
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
32
+ this.$scrollElement = $element.on('scroll.scroll.data-api', process)
33
+ this.selector = (this.options.target
34
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
35
+ || '') + ' .nav li > a'
36
+ this.$body = $('body').on('click.scroll.data-api', this.selector, process)
31
37
  this.refresh()
32
- this.$topbar.delegate(this.selector, 'click', processScroll)
33
- $window.scroll(processScroll)
34
- this.processScroll()
38
+ this.process()
35
39
  }
36
40
 
37
41
  ScrollSpy.prototype = {
38
42
 
39
- refresh: function () {
40
- this.targets = this.$topbar.find(this.selector).map(function () {
41
- var href = $(this).attr('href')
42
- return /^#\w/.test(href) && $(href).length ? href : null
43
- })
43
+ constructor: ScrollSpy
44
+
45
+ , refresh: function () {
46
+ this.targets = this.$body
47
+ .find(this.selector)
48
+ .map(function () {
49
+ var href = $(this).attr('href')
50
+ return /^#\w/.test(href) && $(href).length ? href : null
51
+ })
44
52
 
45
53
  this.offsets = $.map(this.targets, function (id) {
46
- return $(id).offset().top
54
+ return $(id).position().top
47
55
  })
48
56
  }
49
57
 
50
- , processScroll: function () {
51
- var scrollTop = $window.scrollTop() + 10
58
+ , process: function () {
59
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
52
60
  , offsets = this.offsets
53
61
  , targets = this.targets
54
62
  , activeTarget = this.activeTarget
@@ -58,50 +66,60 @@
58
66
  activeTarget != targets[i]
59
67
  && scrollTop >= offsets[i]
60
68
  && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
61
- && this.activateButton( targets[i] )
69
+ && this.activate( targets[i] )
62
70
  }
63
71
  }
64
72
 
65
- , activateButton: function (target) {
73
+ , activate: function (target) {
74
+ var active
75
+
66
76
  this.activeTarget = target
67
77
 
68
- this.$topbar
78
+ this.$body
69
79
  .find(this.selector).parent('.active')
70
80
  .removeClass('active')
71
81
 
72
- this.$topbar
82
+ active = this.$body
73
83
  .find(this.selector + '[href="' + target + '"]')
74
84
  .parent('li')
75
85
  .addClass('active')
86
+
87
+ if ( active.parent('.dropdown-menu') ) {
88
+ active.closest('li.dropdown').addClass('active')
89
+ }
76
90
  }
77
91
 
78
92
  }
79
93
 
80
- /* SCROLLSPY PLUGIN DEFINITION
81
- * =========================== */
82
-
83
- $.fn.scrollSpy = function( options ) {
84
- var scrollspy = this.data('scrollspy')
85
94
 
86
- if (!scrollspy) {
87
- return this.each(function () {
88
- $(this).data('scrollspy', new ScrollSpy( this, options ))
89
- })
90
- }
95
+ /* SCROLLSPY PLUGIN DEFINITION
96
+ * =========================== */
91
97
 
92
- if ( options === true ) {
93
- return scrollspy
94
- }
98
+ $.fn.scrollspy = function ( option ) {
99
+ return this.each(function () {
100
+ var $this = $(this)
101
+ , data = $this.data('scrollspy')
102
+ , options = typeof option == 'object' && option
103
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
104
+ if (typeof option == 'string') data[option]()
105
+ })
106
+ }
95
107
 
96
- if ( typeof options == 'string' ) {
97
- scrollspy[options]()
98
- }
108
+ $.fn.scrollspy.Constructor = ScrollSpy
99
109
 
100
- return this
110
+ $.fn.scrollspy.defaults = {
111
+ offset: 10
101
112
  }
102
113
 
103
- $(document).ready(function () {
104
- $('body').scrollSpy('[data-scrollspy] li > a')
114
+
115
+ /* SCROLLSPY DATA-API
116
+ * ================== */
117
+
118
+ $(function () {
119
+ $('[data-spy="scroll"]').each(function () {
120
+ var $spy = $(this)
121
+ $spy.scrollspy($spy.data())
122
+ })
105
123
  })
106
124
 
107
- }( window.jQuery || window.ender );
125
+ }( window.jQuery )
@@ -0,0 +1,130 @@
1
+ /* ========================================================
2
+ * bootstrap-tab.js v2.0.0
3
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
4
+ * ========================================================
5
+ * Copyright 2012 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( $ ){
22
+
23
+ "use strict"
24
+
25
+ /* TAB CLASS DEFINITION
26
+ * ==================== */
27
+
28
+ var Tab = function ( element ) {
29
+ this.element = $(element)
30
+ }
31
+
32
+ Tab.prototype = {
33
+
34
+ constructor: Tab
35
+
36
+ , show: function () {
37
+ var $this = this.element
38
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
39
+ , selector = $this.attr('data-target')
40
+ , previous
41
+ , $target
42
+
43
+ if (!selector) {
44
+ selector = $this.attr('href')
45
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
46
+ }
47
+
48
+ if ( $this.parent('li').hasClass('active') ) return
49
+
50
+ previous = $ul.find('.active a').last()[0]
51
+
52
+ $this.trigger({
53
+ type: 'show'
54
+ , relatedTarget: previous
55
+ })
56
+
57
+ $target = $(selector)
58
+
59
+ this.activate($this.parent('li'), $ul)
60
+ this.activate($target, $target.parent(), function () {
61
+ $this.trigger({
62
+ type: 'shown'
63
+ , relatedTarget: previous
64
+ })
65
+ })
66
+ }
67
+
68
+ , activate: function ( element, container, callback) {
69
+ var $active = container.find('> .active')
70
+ , transition = callback
71
+ && $.support.transition
72
+ && $active.hasClass('fade')
73
+
74
+ function next() {
75
+ $active
76
+ .removeClass('active')
77
+ .find('> .dropdown-menu > .active')
78
+ .removeClass('active')
79
+
80
+ element.addClass('active')
81
+
82
+ if (transition) {
83
+ element[0].offsetWidth // reflow for transition
84
+ element.addClass('in')
85
+ } else {
86
+ element.removeClass('fade')
87
+ }
88
+
89
+ if ( element.parent('.dropdown-menu') ) {
90
+ element.closest('li.dropdown').addClass('active')
91
+ }
92
+
93
+ callback && callback()
94
+ }
95
+
96
+ transition ?
97
+ $active.one($.support.transition.end, next) :
98
+ next()
99
+
100
+ $active.removeClass('in')
101
+ }
102
+ }
103
+
104
+
105
+ /* TAB PLUGIN DEFINITION
106
+ * ===================== */
107
+
108
+ $.fn.tab = function ( option ) {
109
+ return this.each(function () {
110
+ var $this = $(this)
111
+ , data = $this.data('tab')
112
+ if (!data) $this.data('tab', (data = new Tab(this)))
113
+ if (typeof option == 'string') data[option]()
114
+ })
115
+ }
116
+
117
+ $.fn.tab.Constructor = Tab
118
+
119
+
120
+ /* TAB DATA-API
121
+ * ============ */
122
+
123
+ $(function () {
124
+ $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
125
+ e.preventDefault()
126
+ $(this).tab('show')
127
+ })
128
+ })
129
+
130
+ }( window.jQuery )
@@ -0,0 +1,270 @@
1
+ /* ===========================================================
2
+ * bootstrap-tooltip.js v2.0.0
3
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
4
+ * Inspired by the original jQuery.tipsy by Jason Frame
5
+ * ===========================================================
6
+ * Copyright 2012 Twitter, Inc.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ * ========================================================== */
20
+
21
+ !function( $ ) {
22
+
23
+ "use strict"
24
+
25
+ /* TOOLTIP PUBLIC CLASS DEFINITION
26
+ * =============================== */
27
+
28
+ var Tooltip = function ( element, options ) {
29
+ this.init('tooltip', element, options)
30
+ }
31
+
32
+ Tooltip.prototype = {
33
+
34
+ constructor: Tooltip
35
+
36
+ , init: function ( type, element, options ) {
37
+ var eventIn
38
+ , eventOut
39
+
40
+ this.type = type
41
+ this.$element = $(element)
42
+ this.options = this.getOptions(options)
43
+ this.enabled = true
44
+
45
+ if (this.options.trigger != 'manual') {
46
+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
47
+ eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
48
+ this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
49
+ this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
50
+ }
51
+
52
+ this.options.selector ?
53
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
54
+ this.fixTitle()
55
+ }
56
+
57
+ , getOptions: function ( options ) {
58
+ options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
59
+
60
+ if (options.delay && typeof options.delay == 'number') {
61
+ options.delay = {
62
+ show: options.delay
63
+ , hide: options.delay
64
+ }
65
+ }
66
+
67
+ return options
68
+ }
69
+
70
+ , enter: function ( e ) {
71
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
72
+
73
+ if (!self.options.delay || !self.options.delay.show) {
74
+ self.show()
75
+ } else {
76
+ self.hoverState = 'in'
77
+ setTimeout(function() {
78
+ if (self.hoverState == 'in') {
79
+ self.show()
80
+ }
81
+ }, self.options.delay.show)
82
+ }
83
+ }
84
+
85
+ , leave: function ( e ) {
86
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
87
+
88
+ if (!self.options.delay || !self.options.delay.hide) {
89
+ self.hide()
90
+ } else {
91
+ self.hoverState = 'out'
92
+ setTimeout(function() {
93
+ if (self.hoverState == 'out') {
94
+ self.hide()
95
+ }
96
+ }, self.options.delay.hide)
97
+ }
98
+ }
99
+
100
+ , show: function () {
101
+ var $tip
102
+ , inside
103
+ , pos
104
+ , actualWidth
105
+ , actualHeight
106
+ , placement
107
+ , tp
108
+
109
+ if (this.hasContent() && this.enabled) {
110
+ $tip = this.tip()
111
+ this.setContent()
112
+
113
+ if (this.options.animation) {
114
+ $tip.addClass('fade')
115
+ }
116
+
117
+ placement = typeof this.options.placement == 'function' ?
118
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
119
+ this.options.placement
120
+
121
+ inside = /in/.test(placement)
122
+
123
+ $tip
124
+ .remove()
125
+ .css({ top: 0, left: 0, display: 'block' })
126
+ .appendTo(inside ? this.$element : document.body)
127
+
128
+ pos = this.getPosition(inside)
129
+
130
+ actualWidth = $tip[0].offsetWidth
131
+ actualHeight = $tip[0].offsetHeight
132
+
133
+ switch (inside ? placement.split(' ')[1] : placement) {
134
+ case 'bottom':
135
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
136
+ break
137
+ case 'top':
138
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
139
+ break
140
+ case 'left':
141
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
142
+ break
143
+ case 'right':
144
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
145
+ break
146
+ }
147
+
148
+ $tip
149
+ .css(tp)
150
+ .addClass(placement)
151
+ .addClass('in')
152
+ }
153
+ }
154
+
155
+ , setContent: function () {
156
+ var $tip = this.tip()
157
+ $tip.find('.tooltip-inner').html(this.getTitle())
158
+ $tip.removeClass('fade in top bottom left right')
159
+ }
160
+
161
+ , hide: function () {
162
+ var that = this
163
+ , $tip = this.tip()
164
+
165
+ $tip.removeClass('in')
166
+
167
+ function removeWithAnimation() {
168
+ var timeout = setTimeout(function () {
169
+ $tip.off($.support.transition.end).remove()
170
+ }, 500)
171
+
172
+ $tip.one($.support.transition.end, function () {
173
+ clearTimeout(timeout)
174
+ $tip.remove()
175
+ })
176
+ }
177
+
178
+ $.support.transition && this.$tip.hasClass('fade') ?
179
+ removeWithAnimation() :
180
+ $tip.remove()
181
+ }
182
+
183
+ , fixTitle: function () {
184
+ var $e = this.$element
185
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
186
+ $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
187
+ }
188
+ }
189
+
190
+ , hasContent: function () {
191
+ return this.getTitle()
192
+ }
193
+
194
+ , getPosition: function (inside) {
195
+ return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
196
+ width: this.$element[0].offsetWidth
197
+ , height: this.$element[0].offsetHeight
198
+ })
199
+ }
200
+
201
+ , getTitle: function () {
202
+ var title
203
+ , $e = this.$element
204
+ , o = this.options
205
+
206
+ title = $e.attr('data-original-title')
207
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
208
+
209
+ title = title.toString().replace(/(^\s*|\s*$)/, "")
210
+
211
+ return title
212
+ }
213
+
214
+ , tip: function () {
215
+ return this.$tip = this.$tip || $(this.options.template)
216
+ }
217
+
218
+ , validate: function () {
219
+ if (!this.$element[0].parentNode) {
220
+ this.hide()
221
+ this.$element = null
222
+ this.options = null
223
+ }
224
+ }
225
+
226
+ , enable: function () {
227
+ this.enabled = true
228
+ }
229
+
230
+ , disable: function () {
231
+ this.enabled = false
232
+ }
233
+
234
+ , toggleEnabled: function () {
235
+ this.enabled = !this.enabled
236
+ }
237
+
238
+ , toggle: function () {
239
+ this[this.tip().hasClass('in') ? 'hide' : 'show']()
240
+ }
241
+
242
+ }
243
+
244
+
245
+ /* TOOLTIP PLUGIN DEFINITION
246
+ * ========================= */
247
+
248
+ $.fn.tooltip = function ( option ) {
249
+ return this.each(function () {
250
+ var $this = $(this)
251
+ , data = $this.data('tooltip')
252
+ , options = typeof option == 'object' && option
253
+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
254
+ if (typeof option == 'string') data[option]()
255
+ })
256
+ }
257
+
258
+ $.fn.tooltip.Constructor = Tooltip
259
+
260
+ $.fn.tooltip.defaults = {
261
+ animation: true
262
+ , delay: 0
263
+ , selector: false
264
+ , placement: 'top'
265
+ , trigger: 'hover'
266
+ , title: ''
267
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
268
+ }
269
+
270
+ }( window.jQuery )