PluginProbe
weForms – Easy Drag & Drop Contact Form Builder For WordPress / 1.2.1
weForms – Easy Drag & Drop Contact Form Builder For WordPress v1.2.1
1.6.7 1.6.8 1.6.9 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.18 1.6.19 1.6.2 1.6.20 1.6.21 1.6.22 1.6.23 1.6.24 1.6.25 1.6.26 1.6.27 1.6.28 1.6.3 1.6.4 1.6.5 1.6.6 All 74 releases
weforms / assets / wpuf / vendor / tooltip / tooltip.js

tooltip.js in weForms – Easy Drag & Drop Contact Form Builder For WordPress 1.2.1, at assets/wpuf/vendor/tooltip/tooltip.js

581 lines 18.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ========================================================================
2 * Bootstrap: transition.js v3.3.7
3 * http://getbootstrap.com/javascript/#transitions
4 * ========================================================================
5 * Copyright 2011-2016 Twitter, Inc.
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 * ======================================================================== */
8
9
10 +function ($) {
11 'use strict';
12
13 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
14 // ============================================================
15
16 function transitionEnd() {
17 var el = document.createElement('bootstrap')
18
19 var transEndEventNames = {
20 WebkitTransition : 'webkitTransitionEnd',
21 MozTransition : 'transitionend',
22 OTransition : 'oTransitionEnd otransitionend',
23 transition : 'transitionend'
24 }
25
26 for (var name in transEndEventNames) {
27 if (el.style[name] !== undefined) {
28 return { end: transEndEventNames[name] }
29 }
30 }
31
32 return false // explicit for ie8 ( ._.)
33 }
34
35 // http://blog.alexmaccaw.com/css-transitions
36 $.fn.emulateTransitionEnd = function (duration) {
37 var called = false
38 var $el = this
39 $(this).one('bsTransitionEnd', function () { called = true })
40 var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
41 setTimeout(callback, duration)
42 return this
43 }
44
45 $(function () {
46 $.support.transition = transitionEnd()
47
48 if (!$.support.transition) return
49
50 $.event.special.bsTransitionEnd = {
51 bindType: $.support.transition.end,
52 delegateType: $.support.transition.end,
53 handle: function (e) {
54 if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
55 }
56 }
57 })
58
59 }(jQuery);
60
61 /* ========================================================================
62 * Bootstrap: tooltip.js v3.3.7
63 * http://getbootstrap.com/javascript/#tooltip
64 * Inspired by the original jQuery.tipsy by Jason Frame
65 * ========================================================================
66 * Copyright 2011-2016 Twitter, Inc.
67 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
68 * ======================================================================== */
69
70
71 +function ($) {
72 'use strict';
73
74 // TOOLTIP PUBLIC CLASS DEFINITION
75 // ===============================
76
77 var Tooltip = function (element, options) {
78 this.type = null
79 this.options = null
80 this.enabled = null
81 this.timeout = null
82 this.hoverState = null
83 this.$element = null
84 this.inState = null
85
86 this.init('tooltip', element, options)
87 }
88
89 Tooltip.VERSION = '3.3.7'
90
91 Tooltip.TRANSITION_DURATION = 150
92
93 Tooltip.DEFAULTS = {
94 animation: true,
95 placement: 'top',
96 selector: false,
97 template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
98 trigger: 'hover focus',
99 title: '',
100 delay: 0,
101 html: false,
102 container: false,
103 viewport: {
104 selector: 'body',
105 padding: 0
106 }
107 }
108
109 Tooltip.prototype.init = function (type, element, options) {
110 this.enabled = true
111 this.type = type
112 this.$element = $(element)
113 this.options = this.getOptions(options)
114 this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
115 this.inState = { click: false, hover: false, focus: false }
116
117 if (this.$element[0] instanceof document.constructor && !this.options.selector) {
118 throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
119 }
120
121 var triggers = this.options.trigger.split(' ')
122
123 for (var i = triggers.length; i--;) {
124 var trigger = triggers[i]
125
126 if (trigger == 'click') {
127 this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
128 } else if (trigger != 'manual') {
129 var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
130 var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
131
132 this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
133 this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
134 }
135 }
136
137 this.options.selector ?
138 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
139 this.fixTitle()
140 }
141
142 Tooltip.prototype.getDefaults = function () {
143 return Tooltip.DEFAULTS
144 }
145
146 Tooltip.prototype.getOptions = function (options) {
147 options = $.extend({}, this.getDefaults(), this.$element.data(), options)
148
149 if (options.delay && typeof options.delay == 'number') {
150 options.delay = {
151 show: options.delay,
152 hide: options.delay
153 }
154 }
155
156 return options
157 }
158
159 Tooltip.prototype.getDelegateOptions = function () {
160 var options = {}
161 var defaults = this.getDefaults()
162
163 this._options && $.each(this._options, function (key, value) {
164 if (defaults[key] != value) options[key] = value
165 })
166
167 return options
168 }
169
170 Tooltip.prototype.enter = function (obj) {
171 var self = obj instanceof this.constructor ?
172 obj : $(obj.currentTarget).data('bs.' + this.type)
173
174 if (!self) {
175 self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
176 $(obj.currentTarget).data('bs.' + this.type, self)
177 }
178
179 if (obj instanceof $.Event) {
180 self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
181 }
182
183 if (self.tip().hasClass('in') || self.hoverState == 'in') {
184 self.hoverState = 'in'
185 return
186 }
187
188 clearTimeout(self.timeout)
189
190 self.hoverState = 'in'
191
192 if (!self.options.delay || !self.options.delay.show) return self.show()
193
194 self.timeout = setTimeout(function () {
195 if (self.hoverState == 'in') self.show()
196 }, self.options.delay.show)
197 }
198
199 Tooltip.prototype.isInStateTrue = function () {
200 for (var key in this.inState) {
201 if (this.inState[key]) return true
202 }
203
204 return false
205 }
206
207 Tooltip.prototype.leave = function (obj) {
208 var self = obj instanceof this.constructor ?
209 obj : $(obj.currentTarget).data('bs.' + this.type)
210
211 if (!self) {
212 self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
213 $(obj.currentTarget).data('bs.' + this.type, self)
214 }
215
216 if (obj instanceof $.Event) {
217 self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
218 }
219
220 if (self.isInStateTrue()) return
221
222 clearTimeout(self.timeout)
223
224 self.hoverState = 'out'
225
226 if (!self.options.delay || !self.options.delay.hide) return self.hide()
227
228 self.timeout = setTimeout(function () {
229 if (self.hoverState == 'out') self.hide()
230 }, self.options.delay.hide)
231 }
232
233 Tooltip.prototype.show = function () {
234 var e = $.Event('show.bs.' + this.type)
235
236 if (this.hasContent() && this.enabled) {
237 this.$element.trigger(e)
238
239 var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
240 if (e.isDefaultPrevented() || !inDom) return
241 var that = this
242
243 var $tip = this.tip()
244
245 var tipId = this.getUID(this.type)
246
247 this.setContent()
248 $tip.attr('id', tipId)
249 this.$element.attr('aria-describedby', tipId)
250
251 if (this.options.animation) $tip.addClass('fade')
252
253 var placement = typeof this.options.placement == 'function' ?
254 this.options.placement.call(this, $tip[0], this.$element[0]) :
255 this.options.placement
256
257 var autoToken = /\s?auto?\s?/i
258 var autoPlace = autoToken.test(placement)
259 if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
260
261 $tip
262 .detach()
263 .css({ top: 0, left: 0, display: 'block' })
264 .addClass(placement)
265 .data('bs.' + this.type, this)
266
267 this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
268 this.$element.trigger('inserted.bs.' + this.type)
269
270 var pos = this.getPosition()
271 var actualWidth = $tip[0].offsetWidth
272 var actualHeight = $tip[0].offsetHeight
273
274 if (autoPlace) {
275 var orgPlacement = placement
276 var viewportDim = this.getPosition(this.$viewport)
277
278 placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
279 placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
280 placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
281 placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
282 placement
283
284 $tip
285 .removeClass(orgPlacement)
286 .addClass(placement)
287 }
288
289 var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
290
291 this.applyPlacement(calculatedOffset, placement)
292
293 var complete = function () {
294 var prevHoverState = that.hoverState
295 that.$element.trigger('shown.bs.' + that.type)
296 that.hoverState = null
297
298 if (prevHoverState == 'out') that.leave(that)
299 }
300
301 $.support.transition && this.$tip.hasClass('fade') ?
302 $tip
303 .one('bsTransitionEnd', complete)
304 .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
305 complete()
306 }
307 }
308
309 Tooltip.prototype.applyPlacement = function (offset, placement) {
310 var $tip = this.tip()
311 var width = $tip[0].offsetWidth
312 var height = $tip[0].offsetHeight
313
314 // manually read margins because getBoundingClientRect includes difference
315 var marginTop = parseInt($tip.css('margin-top'), 10)
316 var marginLeft = parseInt($tip.css('margin-left'), 10)
317
318 // we must check for NaN for ie 8/9
319 if (isNaN(marginTop)) marginTop = 0
320 if (isNaN(marginLeft)) marginLeft = 0
321
322 offset.top += marginTop
323 offset.left += marginLeft
324
325 // $.fn.offset doesn't round pixel values
326 // so we use setOffset directly with our own function B-0
327 $.offset.setOffset($tip[0], $.extend({
328 using: function (props) {
329 $tip.css({
330 top: Math.round(props.top),
331 left: Math.round(props.left)
332 })
333 }
334 }, offset), 0)
335
336 $tip.addClass('in')
337
338 // check to see if placing tip in new offset caused the tip to resize itself
339 var actualWidth = $tip[0].offsetWidth
340 var actualHeight = $tip[0].offsetHeight
341
342 if (placement == 'top' && actualHeight != height) {
343 offset.top = offset.top + height - actualHeight
344 }
345
346 var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
347
348 if (delta.left) offset.left += delta.left
349 else offset.top += delta.top
350
351 var isVertical = /top|bottom/.test(placement)
352 var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
353 var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
354
355 $tip.offset(offset)
356 this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
357 }
358
359 Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
360 this.arrow()
361 .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
362 .css(isVertical ? 'top' : 'left', '')
363 }
364
365 Tooltip.prototype.setContent = function () {
366 var $tip = this.tip()
367 var title = this.getTitle()
368
369 $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
370 $tip.removeClass('fade in top bottom left right')
371 }
372
373 Tooltip.prototype.hide = function (callback) {
374 var that = this
375 var $tip = $(this.$tip)
376 var e = $.Event('hide.bs.' + this.type)
377
378 function complete() {
379 if (that.hoverState != 'in') $tip.detach()
380 if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
381 that.$element
382 .removeAttr('aria-describedby')
383 .trigger('hidden.bs.' + that.type)
384 }
385 callback && callback()
386 }
387
388 this.$element.trigger(e)
389
390 if (e.isDefaultPrevented()) return
391
392 $tip.removeClass('in')
393
394 $.support.transition && $tip.hasClass('fade') ?
395 $tip
396 .one('bsTransitionEnd', complete)
397 .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
398 complete()
399
400 this.hoverState = null
401
402 return this
403 }
404
405 Tooltip.prototype.fixTitle = function () {
406 var $e = this.$element
407 if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
408 $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
409 }
410 }
411
412 Tooltip.prototype.hasContent = function () {
413 return this.getTitle()
414 }
415
416 Tooltip.prototype.getPosition = function ($element) {
417 $element = $element || this.$element
418
419 var el = $element[0]
420 var isBody = el.tagName == 'BODY'
421
422 var elRect = el.getBoundingClientRect()
423 if (elRect.width == null) {
424 // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
425 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
426 }
427 var isSvg = window.SVGElement && el instanceof window.SVGElement
428 // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
429 // See https://github.com/twbs/bootstrap/issues/20280
430 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
431 var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
432 var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
433
434 return $.extend({}, elRect, scroll, outerDims, elOffset)
435 }
436
437 Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
438 return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
439 placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
440 placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
441 /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
442
443 }
444
445 Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
446 var delta = { top: 0, left: 0 }
447 if (!this.$viewport) return delta
448
449 var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
450 var viewportDimensions = this.getPosition(this.$viewport)
451
452 if (/right|left/.test(placement)) {
453 var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
454 var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
455 if (topEdgeOffset < viewportDimensions.top) { // top overflow
456 delta.top = viewportDimensions.top - topEdgeOffset
457 } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
458 delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
459 }
460 } else {
461 var leftEdgeOffset = pos.left - viewportPadding
462 var rightEdgeOffset = pos.left + viewportPadding + actualWidth
463 if (leftEdgeOffset < viewportDimensions.left) { // left overflow
464 delta.left = viewportDimensions.left - leftEdgeOffset
465 } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
466 delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
467 }
468 }
469
470 return delta
471 }
472
473 Tooltip.prototype.getTitle = function () {
474 var title
475 var $e = this.$element
476 var o = this.options
477
478 title = $e.attr('data-original-title')
479 || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
480
481 return title
482 }
483
484 Tooltip.prototype.getUID = function (prefix) {
485 do prefix += ~~(Math.random() * 1000000)
486 while (document.getElementById(prefix))
487 return prefix
488 }
489
490 Tooltip.prototype.tip = function () {
491 if (!this.$tip) {
492 this.$tip = $(this.options.template)
493 if (this.$tip.length != 1) {
494 throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
495 }
496 }
497 return this.$tip
498 }
499
500 Tooltip.prototype.arrow = function () {
501 return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
502 }
503
504 Tooltip.prototype.enable = function () {
505 this.enabled = true
506 }
507
508 Tooltip.prototype.disable = function () {
509 this.enabled = false
510 }
511
512 Tooltip.prototype.toggleEnabled = function () {
513 this.enabled = !this.enabled
514 }
515
516 Tooltip.prototype.toggle = function (e) {
517 var self = this
518 if (e) {
519 self = $(e.currentTarget).data('bs.' + this.type)
520 if (!self) {
521 self = new this.constructor(e.currentTarget, this.getDelegateOptions())
522 $(e.currentTarget).data('bs.' + this.type, self)
523 }
524 }
525
526 if (e) {
527 self.inState.click = !self.inState.click
528 if (self.isInStateTrue()) self.enter(self)
529 else self.leave(self)
530 } else {
531 self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
532 }
533 }
534
535 Tooltip.prototype.destroy = function () {
536 var that = this
537 clearTimeout(this.timeout)
538 this.hide(function () {
539 that.$element.off('.' + that.type).removeData('bs.' + that.type)
540 if (that.$tip) {
541 that.$tip.detach()
542 }
543 that.$tip = null
544 that.$arrow = null
545 that.$viewport = null
546 that.$element = null
547 })
548 }
549
550
551 // TOOLTIP PLUGIN DEFINITION
552 // =========================
553
554 function Plugin(option) {
555 return this.each(function () {
556 var $this = $(this)
557 var data = $this.data('bs.tooltip')
558 var options = typeof option == 'object' && option
559
560 if (!data && /destroy|hide/.test(option)) return
561 if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
562 if (typeof option == 'string') data[option]()
563 })
564 }
565
566 var old = $.fn.tooltip
567
568 $.fn.tooltip = Plugin
569 $.fn.tooltip.Constructor = Tooltip
570
571
572 // TOOLTIP NO CONFLICT
573 // ===================
574
575 $.fn.tooltip.noConflict = function () {
576 $.fn.tooltip = old
577 return this
578 }
579
580 }(jQuery);
581