active_frontend 13.3.0 → 14.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.fasterer.yml +19 -0
  4. data/.reek +27 -0
  5. data/.rubocop.yml +38 -0
  6. data/.scss-lint.yml +27 -0
  7. data/Rakefile +1 -1
  8. data/active_frontend.gemspec +21 -18
  9. data/app/.DS_Store +0 -0
  10. data/app/assets/.DS_Store +0 -0
  11. data/app/assets/fonts/.DS_Store +0 -0
  12. data/app/assets/fonts/dripicons/.DS_Store +0 -0
  13. data/app/assets/fonts/dripicons/dripicons.woff +0 -0
  14. data/app/assets/fonts/fakt-pro/.DS_Store +0 -0
  15. data/app/assets/fonts/fakt-pro/fakt-pro-bold.woff +0 -0
  16. data/app/assets/fonts/fakt-pro/fakt-pro-normal.woff +0 -0
  17. data/app/assets/fonts/fakt-pro/fakt-pro-semibold.woff +0 -0
  18. data/app/assets/fonts/fakt-pro/fakt-pro-semilight.woff +0 -0
  19. data/app/assets/fonts/fakt-soft-pro/.DS_Store +0 -0
  20. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-bold.woff +0 -0
  21. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-normal.woff +0 -0
  22. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-semibold.woff +0 -0
  23. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-semilight.woff +0 -0
  24. data/app/assets/images/.DS_Store +0 -0
  25. data/app/assets/images/.keep +0 -0
  26. data/app/assets/images/placeholders/.DS_Store +0 -0
  27. data/app/assets/images/placeholders/camera-large.png +0 -0
  28. data/app/assets/images/placeholders/camera-small.png +0 -0
  29. data/app/assets/images/placeholders/camera.png +0 -0
  30. data/app/assets/images/placeholders/document-large.png +0 -0
  31. data/app/assets/images/placeholders/document-small.png +0 -0
  32. data/app/assets/images/placeholders/document.png +0 -0
  33. data/app/assets/images/placeholders/photo-large.png +0 -0
  34. data/app/assets/images/placeholders/{picture-small.png → photo-small.png} +0 -0
  35. data/app/assets/images/placeholders/photo.png +0 -0
  36. data/app/assets/images/placeholders/store-large.png +0 -0
  37. data/app/assets/images/placeholders/store-small.png +0 -0
  38. data/app/assets/images/placeholders/store.png +0 -0
  39. data/app/assets/images/placeholders/user-large.png +0 -0
  40. data/app/assets/images/placeholders/user-small.png +0 -0
  41. data/app/assets/images/placeholders/user.png +0 -0
  42. data/app/helpers/active_frontend_helper.rb +22 -37
  43. data/lib/.DS_Store +0 -0
  44. data/lib/active_frontend.rb +3 -4
  45. data/lib/active_frontend/.DS_Store +0 -0
  46. data/lib/active_frontend/version.rb +1 -1
  47. data/lib/generators/active_frontend/install_generator.rb +3 -3
  48. data/lib/generators/active_frontend/templates/install.js +35 -30
  49. data/lib/generators/active_frontend/templates/install.scss +55 -58
  50. data/vendor/.DS_Store +0 -0
  51. data/vendor/assets/.DS_Store +0 -0
  52. data/vendor/assets/javascripts/.DS_Store +0 -0
  53. data/vendor/assets/javascripts/active_frontend.js +35 -30
  54. data/vendor/assets/javascripts/base/_affix.js +170 -0
  55. data/vendor/assets/javascripts/base/_alert.js +80 -0
  56. data/vendor/assets/javascripts/base/_animation.js +106 -0
  57. data/vendor/assets/javascripts/base/_button.js +123 -0
  58. data/vendor/assets/javascripts/base/_carousel.js +237 -0
  59. data/vendor/assets/javascripts/base/_collapse.js +200 -0
  60. data/vendor/assets/javascripts/base/_colorpicker.js +147 -0
  61. data/vendor/assets/javascripts/base/_datepicker.js +1411 -0
  62. data/vendor/assets/javascripts/base/_dropdown.js +154 -0
  63. data/vendor/assets/javascripts/base/_filepicker.js +235 -0
  64. data/vendor/assets/javascripts/base/_hoverdown.js +116 -0
  65. data/vendor/assets/javascripts/base/_layout.js +126 -0
  66. data/vendor/assets/javascripts/base/_list.js +103 -0
  67. data/vendor/assets/javascripts/{_modal.js → base/_modal.js} +170 -167
  68. data/vendor/assets/javascripts/base/_popover.js +101 -0
  69. data/vendor/assets/javascripts/base/_scrollspy.js +161 -0
  70. data/vendor/assets/javascripts/base/_switch.js +160 -0
  71. data/vendor/assets/javascripts/base/_tab.js +139 -0
  72. data/vendor/assets/javascripts/base/_table.js +224 -0
  73. data/vendor/assets/javascripts/base/_timeago.js +270 -0
  74. data/vendor/assets/javascripts/base/_timepicker.js +541 -0
  75. data/vendor/assets/javascripts/base/_tooltip.js +525 -0
  76. data/vendor/assets/javascripts/base/_tour.js +268 -0
  77. data/vendor/assets/javascripts/base/_transition.js +52 -0
  78. data/vendor/assets/javascripts/base/_typeahead.js +362 -0
  79. data/vendor/assets/javascripts/extensions/_calendar.js +4709 -0
  80. data/vendor/assets/javascripts/extensions/_chart.js +9371 -0
  81. data/vendor/assets/javascripts/extensions/_map.js +2153 -0
  82. data/vendor/assets/stylesheets/.DS_Store +0 -0
  83. data/vendor/assets/stylesheets/{_mixin.scss → _utility.scss} +96 -10
  84. data/vendor/assets/stylesheets/_variable.scss +201 -19
  85. data/vendor/assets/stylesheets/active_frontend.scss +55 -58
  86. data/vendor/assets/stylesheets/blocks/_anchor.scss +15 -0
  87. data/vendor/assets/stylesheets/blocks/_button.scss +278 -0
  88. data/vendor/assets/stylesheets/blocks/_code.scss +144 -0
  89. data/vendor/assets/stylesheets/blocks/_common.scss +127 -0
  90. data/vendor/assets/stylesheets/blocks/_form.scss +508 -0
  91. data/vendor/assets/stylesheets/blocks/_icon.scss +359 -0
  92. data/vendor/assets/stylesheets/blocks/_list.scss +76 -0
  93. data/vendor/assets/stylesheets/blocks/_multimedia.scss +62 -0
  94. data/vendor/assets/stylesheets/blocks/_reset.scss +179 -0
  95. data/vendor/assets/stylesheets/blocks/_table.scss +211 -0
  96. data/vendor/assets/stylesheets/blocks/_typography.scss +204 -0
  97. data/vendor/assets/stylesheets/components/_ad.scss +78 -0
  98. data/vendor/assets/stylesheets/components/_affix.scss +14 -0
  99. data/vendor/assets/stylesheets/components/_alert.scss +50 -0
  100. data/vendor/assets/stylesheets/components/_animation.scss +1670 -0
  101. data/vendor/assets/stylesheets/components/_breadcrumb.scss +17 -0
  102. data/vendor/assets/stylesheets/components/_calendar.scss +213 -0
  103. data/vendor/assets/stylesheets/components/_card.scss +30 -0
  104. data/vendor/assets/stylesheets/components/_carousel.scss +135 -0
  105. data/vendor/assets/stylesheets/components/_chart.scss +10 -0
  106. data/vendor/assets/stylesheets/components/_collapse.scss +17 -0
  107. data/vendor/assets/stylesheets/components/_colorpicker.scss +38 -0
  108. data/vendor/assets/stylesheets/components/_datepicker.scss +80 -0
  109. data/vendor/assets/stylesheets/components/_dropmenu.scss +151 -0
  110. data/vendor/assets/stylesheets/components/_footer.scss +11 -0
  111. data/vendor/assets/stylesheets/components/_grid.scss +144 -0
  112. data/vendor/assets/stylesheets/components/_header.scss +99 -0
  113. data/vendor/assets/stylesheets/components/_label_and_badge.scss +57 -0
  114. data/vendor/assets/stylesheets/components/_layout.scss +63 -0
  115. data/vendor/assets/stylesheets/components/_map.scss +14 -0
  116. data/vendor/assets/stylesheets/components/_milestone.scss +49 -0
  117. data/vendor/assets/stylesheets/components/_missive.scss +40 -0
  118. data/vendor/assets/stylesheets/components/_modal.scss +126 -0
  119. data/vendor/assets/stylesheets/components/_nav_and_tab.scss +202 -0
  120. data/vendor/assets/stylesheets/components/_navbar.scss +66 -0
  121. data/vendor/assets/stylesheets/components/_pagination.scss +79 -0
  122. data/vendor/assets/stylesheets/components/_placeholder.scss +23 -0
  123. data/vendor/assets/stylesheets/components/_popover.scss +167 -0
  124. data/vendor/assets/stylesheets/components/_progress.scss +62 -0
  125. data/vendor/assets/stylesheets/components/_sidebar.scss +74 -0
  126. data/vendor/assets/stylesheets/components/_spinner.scss +83 -0
  127. data/vendor/assets/stylesheets/components/_switch.scss +150 -0
  128. data/vendor/assets/stylesheets/components/_timepicker.scss +30 -0
  129. data/vendor/assets/stylesheets/components/_tooltip.scss +93 -0
  130. data/vendor/assets/stylesheets/components/_transition.scss +12 -0
  131. data/vendor/assets/stylesheets/components/_typeahead.scss +18 -0
  132. metadata +150 -94
  133. data/app/assets/fonts/gotham/gotham-bold.woff +0 -0
  134. data/app/assets/fonts/gotham/gotham-book.woff +0 -0
  135. data/app/assets/fonts/gotham/gotham-light.woff +0 -0
  136. data/app/assets/fonts/gotham/gotham-medium.woff +0 -0
  137. data/app/assets/fonts/gotham/gotham-rounded-bold.woff +0 -0
  138. data/app/assets/fonts/gotham/gotham-rounded-book.woff +0 -0
  139. data/app/assets/fonts/gotham/gotham-rounded-light.woff +0 -0
  140. data/app/assets/fonts/gotham/gotham-rounded-medium.woff +0 -0
  141. data/app/assets/images/placeholders/archive-large.png +0 -0
  142. data/app/assets/images/placeholders/archive-small.png +0 -0
  143. data/app/assets/images/placeholders/archive.png +0 -0
  144. data/app/assets/images/placeholders/picture-large.png +0 -0
  145. data/app/assets/images/placeholders/picture.png +0 -0
  146. data/vendor/assets/javascripts/_affix.js +0 -153
  147. data/vendor/assets/javascripts/_alert.js +0 -85
  148. data/vendor/assets/javascripts/_animation.js +0 -103
  149. data/vendor/assets/javascripts/_button.js +0 -107
  150. data/vendor/assets/javascripts/_carousel.js +0 -228
  151. data/vendor/assets/javascripts/_chart.js +0 -3742
  152. data/vendor/assets/javascripts/_collapse.js +0 -202
  153. data/vendor/assets/javascripts/_color_picker.js +0 -108
  154. data/vendor/assets/javascripts/_date_picker.js +0 -1650
  155. data/vendor/assets/javascripts/_dropdown.js +0 -156
  156. data/vendor/assets/javascripts/_file_input.js +0 -71
  157. data/vendor/assets/javascripts/_hoverdown.js +0 -109
  158. data/vendor/assets/javascripts/_inputmask.js +0 -341
  159. data/vendor/assets/javascripts/_loader.js +0 -361
  160. data/vendor/assets/javascripts/_map.js +0 -2401
  161. data/vendor/assets/javascripts/_popover.js +0 -99
  162. data/vendor/assets/javascripts/_scrollspy.js +0 -163
  163. data/vendor/assets/javascripts/_slider.js +0 -1572
  164. data/vendor/assets/javascripts/_sort.js +0 -1432
  165. data/vendor/assets/javascripts/_swoggle.js +0 -415
  166. data/vendor/assets/javascripts/_tab.js +0 -146
  167. data/vendor/assets/javascripts/_tablespy.js +0 -1883
  168. data/vendor/assets/javascripts/_time_ago.js +0 -206
  169. data/vendor/assets/javascripts/_time_picker.js +0 -1088
  170. data/vendor/assets/javascripts/_tooltip.js +0 -504
  171. data/vendor/assets/javascripts/_transition.js +0 -50
  172. data/vendor/assets/javascripts/_typeahead.js +0 -366
  173. data/vendor/assets/stylesheets/_ad.scss +0 -63
  174. data/vendor/assets/stylesheets/_affix.scss +0 -14
  175. data/vendor/assets/stylesheets/_alert.scss +0 -114
  176. data/vendor/assets/stylesheets/_animation.scss +0 -1370
  177. data/vendor/assets/stylesheets/_breadcrumb.scss +0 -100
  178. data/vendor/assets/stylesheets/_button.scss +0 -386
  179. data/vendor/assets/stylesheets/_canvas.scss +0 -182
  180. data/vendor/assets/stylesheets/_carousel.scss +0 -158
  181. data/vendor/assets/stylesheets/_chart.scss +0 -15
  182. data/vendor/assets/stylesheets/_code.scss +0 -150
  183. data/vendor/assets/stylesheets/_collapse.scss +0 -14
  184. data/vendor/assets/stylesheets/_color.scss +0 -55
  185. data/vendor/assets/stylesheets/_colorpicker.scss +0 -63
  186. data/vendor/assets/stylesheets/_datepicker.scss +0 -122
  187. data/vendor/assets/stylesheets/_dropdown.scss +0 -248
  188. data/vendor/assets/stylesheets/_footer.scss +0 -71
  189. data/vendor/assets/stylesheets/_form.scss +0 -661
  190. data/vendor/assets/stylesheets/_grid.scss +0 -184
  191. data/vendor/assets/stylesheets/_header.scss +0 -156
  192. data/vendor/assets/stylesheets/_icon.scss +0 -362
  193. data/vendor/assets/stylesheets/_image.scss +0 -33
  194. data/vendor/assets/stylesheets/_label_and_badge.scss +0 -104
  195. data/vendor/assets/stylesheets/_link.scss +0 -55
  196. data/vendor/assets/stylesheets/_list.scss +0 -122
  197. data/vendor/assets/stylesheets/_loader.scss +0 -71
  198. data/vendor/assets/stylesheets/_map.scss +0 -44
  199. data/vendor/assets/stylesheets/_missive.scss +0 -74
  200. data/vendor/assets/stylesheets/_modal.scss +0 -204
  201. data/vendor/assets/stylesheets/_nav_and_tab.scss +0 -230
  202. data/vendor/assets/stylesheets/_navbar.scss +0 -73
  203. data/vendor/assets/stylesheets/_pagination.scss +0 -79
  204. data/vendor/assets/stylesheets/_panel.scss +0 -80
  205. data/vendor/assets/stylesheets/_placeholder.scss +0 -63
  206. data/vendor/assets/stylesheets/_popover.scss +0 -128
  207. data/vendor/assets/stylesheets/_progress.scss +0 -86
  208. data/vendor/assets/stylesheets/_reset.scss +0 -140
  209. data/vendor/assets/stylesheets/_sidebar.scss +0 -148
  210. data/vendor/assets/stylesheets/_slider.scss +0 -151
  211. data/vendor/assets/stylesheets/_spinner.scss +0 -572
  212. data/vendor/assets/stylesheets/_subheader.scss +0 -112
  213. data/vendor/assets/stylesheets/_swoggle.scss +0 -120
  214. data/vendor/assets/stylesheets/_table.scss +0 -210
  215. data/vendor/assets/stylesheets/_timepicker.scss +0 -77
  216. data/vendor/assets/stylesheets/_toolbar.scss +0 -130
  217. data/vendor/assets/stylesheets/_tooltip.scss +0 -105
  218. data/vendor/assets/stylesheets/_transition.scss +0 -11
  219. data/vendor/assets/stylesheets/_trunk.scss +0 -147
  220. data/vendor/assets/stylesheets/_typeahead.scss +0 -18
  221. data/vendor/assets/stylesheets/_typography.scss +0 -233
@@ -0,0 +1,525 @@
1
+ +function ($) {
2
+ 'use strict';
3
+
4
+ // TOOLTIP PUBLIC CLASS DEFINITION
5
+ // ===============================
6
+
7
+ var Tooltip = function (element, options) {
8
+ this.type = null;
9
+ this.options = null;
10
+
11
+ this.enabled = null;
12
+ this.timeout = null;
13
+ this.hoverState = null;
14
+ this.$element = null;
15
+ this.inState = null;
16
+
17
+ this.init('tooltip', element, options);
18
+ };
19
+
20
+ Tooltip.VERSION = '1.0.0';
21
+ Tooltip.TRANSITION_DURATION = 150;
22
+ Tooltip.DEFAULTS = {
23
+ animation: true,
24
+ container: false,
25
+ delay: 0,
26
+ html: true,
27
+ placement: 'top',
28
+ selector: false,
29
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
30
+ title: '',
31
+ trigger: 'hover focus',
32
+ viewport: {
33
+ selector: 'body',
34
+ padding: 0
35
+ }
36
+ };
37
+
38
+ Tooltip.prototype.constructor = Tooltip;
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
+ this.inState = { click: false, hover: false, focus: false };
46
+ this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ?
47
+ this.options.viewport.call(this, this.$element) :
48
+ (this.options.viewport.selector || this.options.viewport));
49
+
50
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
51
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!');
52
+ }
53
+
54
+ var triggers = this.options.trigger.split(' ');
55
+
56
+ for (var i = triggers.length; i--;) {
57
+ var trigger = triggers[i];
58
+
59
+ if (trigger === 'click') {
60
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this));
61
+ } else if (trigger != 'manual') {
62
+ var eventIn = trigger === 'hover' ? 'mouseenter' : 'focusin';
63
+ var eventOut = trigger === 'hover' ? 'mouseleave' : 'focusout';
64
+
65
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this));
66
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this));
67
+ }
68
+ }
69
+
70
+ this.options.selector ?
71
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
72
+ this.fixTitle();
73
+ };
74
+
75
+ Tooltip.prototype.getDefaults = function () {
76
+ return Tooltip.DEFAULTS;
77
+ };
78
+
79
+ Tooltip.prototype.getOptions = function (options) {
80
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options);
81
+
82
+ if (options.delay && typeof options.delay === 'number') {
83
+ options.delay = {
84
+ show: options.delay,
85
+ hide: options.delay
86
+ };
87
+ }
88
+
89
+ return options;
90
+ };
91
+
92
+ Tooltip.prototype.getDelegateOptions = function () {
93
+ var options = {};
94
+ var defaults = this.getDefaults();
95
+
96
+ this._options && $.each(this._options, function (key, value) {
97
+ if (defaults[key] != value) {
98
+ options[key] = value;
99
+ }
100
+ });
101
+
102
+ return options;
103
+ };
104
+
105
+ Tooltip.prototype.enter = function (obj) {
106
+ var self = obj instanceof this.constructor ?
107
+ obj : $(obj.currentTarget).data('bs.' + this.type);
108
+
109
+ if (!self) {
110
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions());
111
+ $(obj.currentTarget).data('bs.' + this.type, self);
112
+ }
113
+ if (obj instanceof $.Event) {
114
+ self.inState[obj.type === 'focusin' ? 'focus' : 'hover'] = true;
115
+ }
116
+ if (self.tip().hasClass('in') || self.hoverState === 'in') {
117
+ self.hoverState = 'in';
118
+ return;
119
+ }
120
+
121
+ clearTimeout(self.timeout);
122
+
123
+ self.hoverState = 'in';
124
+
125
+ if (!self.options.delay || !self.options.delay.show) return self.show();
126
+
127
+ self.timeout = setTimeout(function () {
128
+ if (self.hoverState === 'in') self.show();
129
+ }, self.options.delay.show);
130
+ };
131
+
132
+ Tooltip.prototype.isInStateTrue = function () {
133
+ for (var key in this.inState) {
134
+ if (this.inState[key]) return true;
135
+ }
136
+
137
+ return false;
138
+ };
139
+
140
+ Tooltip.prototype.leave = function (obj) {
141
+ var self = obj instanceof this.constructor ?
142
+ obj : $(obj.currentTarget).data('bs.' + this.type);
143
+
144
+ if (!self) {
145
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions());
146
+ $(obj.currentTarget).data('bs.' + this.type, self);
147
+ }
148
+ if (obj instanceof $.Event) {
149
+ self.inState[obj.type === 'focusout' ? 'focus' : 'hover'] = false;
150
+ }
151
+ if (self.isInStateTrue()) return;
152
+
153
+ clearTimeout(self.timeout);
154
+
155
+ self.hoverState = 'out';
156
+
157
+ if (!self.options.delay || !self.options.delay.hide) return self.hide();
158
+
159
+ self.timeout = setTimeout(function () {
160
+ if (self.hoverState === 'out') self.hide();
161
+ }, self.options.delay.hide);
162
+ };
163
+
164
+ Tooltip.prototype.show = function () {
165
+ var e = $.Event('show.bs.' + this.type);
166
+
167
+ if (this.hasContent() && this.enabled) {
168
+ this.$element.trigger(e);
169
+
170
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]);
171
+
172
+ if (e.isDefaultPrevented() || !inDom) return;
173
+
174
+ var that = this;
175
+ var $tip = this.tip();
176
+ var tipId = this.getUID(this.type);
177
+
178
+ this.setContent();
179
+ $tip.attr('id', tipId);
180
+ this.$element.attr('aria-describedby', tipId);
181
+
182
+ if (this.options.animation) $tip.addClass('fade');
183
+
184
+ var placement = typeof this.options.placement === 'function' ?
185
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
186
+ this.options.placement;
187
+ var autoToken = /\s?auto?\s?/i;
188
+ var autoPlace = autoToken.test(placement);
189
+
190
+ if (autoPlace) {
191
+ placement = placement.replace(autoToken, '') || 'top';
192
+ }
193
+
194
+ $tip.detach()
195
+ .css({ top: 0, left: 0, display: 'block' })
196
+ .addClass(placement)
197
+ .data('bs.' + this.type, this);
198
+
199
+ this.options.container ?
200
+ $tip.appendTo(this.options.container) :
201
+ $tip.insertAfter(this.$element);
202
+ this.$element.trigger('inserted.bs.' + this.type);
203
+
204
+ var pos = this.getPosition();
205
+ var actualWidth = $tip[0].offsetWidth;
206
+ var actualHeight = $tip[0].offsetHeight;
207
+
208
+ if (autoPlace) {
209
+ var orgPlacement = placement;
210
+ var viewportDim = this.getPosition(this.$viewport);
211
+
212
+ placement = placement === 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
213
+ placement === 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
214
+ placement === 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
215
+ placement === 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
216
+ placement;
217
+
218
+ $tip.removeClass(orgPlacement)
219
+ .addClass(placement);
220
+ }
221
+
222
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight);
223
+
224
+ this.applyPlacement(calculatedOffset, placement);
225
+
226
+ var complete = function () {
227
+ var prevHoverState = that.hoverState;
228
+
229
+ that.$element.trigger('shown.bs.' + that.type);
230
+ that.hoverState = null;
231
+
232
+ if (prevHoverState === 'out') that.leave(that);
233
+ };
234
+
235
+ $.support.transition && this.$tip.hasClass('fade') ?
236
+ $tip.one('bsTransitionEnd', complete)
237
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
238
+ complete();
239
+ }
240
+ };
241
+
242
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
243
+ var $tip = this.tip();
244
+ var width = $tip[0].offsetWidth;
245
+ var height = $tip[0].offsetHeight;
246
+ var marginTop = parseInt($tip.css('margin-top'), 10);
247
+ var marginLeft = parseInt($tip.css('margin-left'), 10);
248
+
249
+ if (isNaN(marginTop)) marginTop = 0;
250
+ if (isNaN(marginLeft)) marginLeft = 0;
251
+
252
+ offset.top += marginTop;
253
+ offset.left += marginLeft;
254
+
255
+ $.offset.setOffset($tip[0], $.extend({
256
+ using: function (props) {
257
+ $tip.css({
258
+ top: Math.round(props.top),
259
+ left: Math.round(props.left)
260
+ });
261
+ }
262
+ }, offset), 0);
263
+
264
+ $tip.addClass('in');
265
+
266
+ var actualWidth = $tip[0].offsetWidth;
267
+ var actualHeight = $tip[0].offsetHeight;
268
+
269
+ if (placement === 'top' && actualHeight != height) {
270
+ offset.top = offset.top + height - actualHeight;
271
+ }
272
+
273
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight);
274
+
275
+ if (delta.left) {
276
+ offset.left += delta.left;
277
+ } else {
278
+ offset.top += delta.top;
279
+ }
280
+
281
+ var isVertical = /top|bottom/.test(placement);
282
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight;
283
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight';
284
+
285
+ $tip.offset(offset);
286
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical);
287
+ };
288
+
289
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
290
+ this.arrow()
291
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
292
+ .css(isVertical ? 'top' : 'left', '');
293
+ };
294
+
295
+ Tooltip.prototype.setContent = function () {
296
+ var $tip = this.tip();
297
+ var title = this.getTitle();
298
+
299
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title);
300
+ $tip.removeClass('fade in top bottom left right');
301
+ };
302
+
303
+ Tooltip.prototype.hide = function (callback) {
304
+ var that = this;
305
+ var $tip = $(this.$tip);
306
+ var e = $.Event('hide.bs.' + this.type);
307
+
308
+ function complete() {
309
+ if (that.hoverState !== 'in') $tip.detach();
310
+
311
+ that.$element
312
+ .removeAttr('aria-describedby')
313
+ .trigger('hidden.bs.' + that.type);
314
+
315
+ callback && callback();
316
+ }
317
+
318
+ this.$element.trigger(e);
319
+
320
+ if (e.isDefaultPrevented()) return;
321
+
322
+ $tip.removeClass('in');
323
+
324
+ $.support.transition && $tip.hasClass('fade') ?
325
+ $tip.one('bsTransitionEnd', complete)
326
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
327
+ complete();
328
+
329
+ this.hoverState = null;
330
+
331
+ return this;
332
+ };
333
+
334
+ Tooltip.prototype.fixTitle = function () {
335
+ var $e = this.$element;
336
+
337
+ if ($e.attr('title') || typeof $e.attr('data-original-title') !== 'string') {
338
+ $e.attr('data-original-title', $e.attr('title') || '')
339
+ .attr('title', '');
340
+ }
341
+ };
342
+
343
+ Tooltip.prototype.hasContent = function () {
344
+ return this.getTitle();
345
+ };
346
+
347
+ Tooltip.prototype.getPosition = function ($element) {
348
+ $element = $element || this.$element;
349
+
350
+ var el = $element[0];
351
+ var isBody = el.tagName === 'BODY';
352
+ var elRect = el.getBoundingClientRect();
353
+
354
+ if (elRect.width === null) {
355
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top });
356
+ }
357
+
358
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset();
359
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() };
360
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null;
361
+
362
+ return $.extend({}, elRect, scroll, outerDims, elOffset);
363
+ };
364
+
365
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
366
+ return placement === 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
367
+ placement === 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
368
+ placement === 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
369
+ /* placement === 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width };
370
+
371
+ };
372
+
373
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
374
+ var delta = { top: 0, left: 0 };
375
+
376
+ if (!this.$viewport) return delta;
377
+
378
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0;
379
+ var viewportDimensions = this.getPosition(this.$viewport);
380
+
381
+ if (/right|left/.test(placement)) {
382
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll;
383
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight;
384
+
385
+ if (topEdgeOffset < viewportDimensions.top) {
386
+ delta.top = viewportDimensions.top - topEdgeOffset;
387
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) {
388
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset;
389
+ }
390
+ } else {
391
+ var leftEdgeOffset = pos.left - viewportPadding;
392
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth;
393
+
394
+ if (leftEdgeOffset < viewportDimensions.left) {
395
+ delta.left = viewportDimensions.left - leftEdgeOffset;
396
+ } else if (rightEdgeOffset > viewportDimensions.right) {
397
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset;
398
+ }
399
+ }
400
+
401
+ return delta;
402
+ };
403
+
404
+ Tooltip.prototype.getTitle = function () {
405
+ var title;
406
+ var $e = this.$element;
407
+ var o = this.options;
408
+
409
+ title = $e.attr('data-original-title') ||
410
+ (typeof o.title === 'function' ? o.title.call($e[0]) : o.title);
411
+
412
+ return title;
413
+ };
414
+
415
+ Tooltip.prototype.getUID = function (prefix) {
416
+ do prefix += ~~(Math.random() * 1000000);
417
+ while (document.getElementById(prefix));
418
+ return prefix;
419
+ };
420
+
421
+ Tooltip.prototype.tip = function () {
422
+ if (!this.$tip) {
423
+ this.$tip = $(this.options.template);
424
+
425
+ if (this.$tip.length != 1) {
426
+ throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!');
427
+ }
428
+ }
429
+
430
+ return this.$tip;
431
+ };
432
+
433
+ Tooltip.prototype.arrow = function () {
434
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'));
435
+ };
436
+
437
+ Tooltip.prototype.enable = function () {
438
+ this.enabled = true;
439
+ };
440
+
441
+ Tooltip.prototype.disable = function () {
442
+ this.enabled = false;
443
+ };
444
+
445
+ Tooltip.prototype.toggleEnabled = function () {
446
+ this.enabled = !this.enabled;
447
+ };
448
+
449
+ Tooltip.prototype.toggle = function (e) {
450
+ var self = this;
451
+
452
+ if (e) {
453
+ self = $(e.currentTarget).data('bs.' + this.type);
454
+
455
+ if (!self) {
456
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions());
457
+ $(e.currentTarget).data('bs.' + this.type, self);
458
+ }
459
+ }
460
+
461
+ if (e) {
462
+ self.inState.click = !self.inState.click;
463
+ self.isInStateTrue() ?
464
+ self.enter(self) :
465
+ self.leave(self);
466
+ } else {
467
+ self.tip().hasClass('in') ?
468
+ self.leave(self) :
469
+ self.enter(self);
470
+ }
471
+ };
472
+
473
+ Tooltip.prototype.destroy = function () {
474
+ var that = this;
475
+
476
+ clearTimeout(this.timeout);
477
+ this.hide(function () {
478
+ that.$element.off('.' + that.type).removeData('bs.' + that.type);
479
+
480
+ if (that.$tip) that.$tip.detach();
481
+
482
+ that.$tip = null;
483
+ that.$arrow = null;
484
+ that.$viewport = null;
485
+ });
486
+ };
487
+
488
+ // TOOLTIP PLUGIN DEFINITION
489
+ // =========================
490
+
491
+ function Plugin(option) {
492
+ return this.each(function () {
493
+ var $this = $(this);
494
+ var data = $this.data('bs.tooltip');
495
+ var options = typeof option === 'object' && option;
496
+
497
+ if (!data && /destroy|hide/.test(option)) return;
498
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)));
499
+ if (typeof option === 'string') data[option]();
500
+ });
501
+ }
502
+
503
+ var old = $.fn.tooltip;
504
+
505
+ $.fn.tooltip = Plugin;
506
+ $.fn.tooltip.Constructor = Tooltip;
507
+
508
+ // TOOLTIP NO CONFLICT
509
+ // ===================
510
+
511
+ $.fn.tooltip.noConflict = function () {
512
+ $.fn.tooltip = old;
513
+ return this;
514
+ };
515
+
516
+ // TOOLTIP DATA-API
517
+ // ================
518
+
519
+ $(document).on('hover.bs.tooltip.data-api', '[data-toggle="tooltip"]', function (e) {
520
+ var $this = $(this);
521
+ if ($this.data('tooltip')) return;
522
+ Plugin.call($this, $this.data());
523
+ });
524
+
525
+ }(jQuery);