PageSourceSearch

https://www.zigotours.com/assets/bootstrap/sb-admin/js/ui/jquery.ui.tooltip.js

js zigotours.com collected 2026-10-06 17:28:54 UTC 10,822 bytes, 402 lines download raw bytes

vendor: 10,822 bytes, lines 1-402
1/*!
2 * jQuery UI Tooltip 1.10.4
3 * http://jqueryui.com
4 *
5 * Copyright 2014 jQuery Foundation and other contributors
6 * Released under the MIT license.
7 * http://jquery.org/license
8 *
9 * http://api.jqueryui.com/tooltip/
10 *
11 * Depends:
12 *	jquery.ui.core.js
13 *	jquery.ui.widget.js
14 *	jquery.ui.position.js
15 */
16(function( $ ) {
17
18var increments = 0;
19
20function addDescribedBy( elem, id ) {
21	var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
22	describedby.push( id );
23	elem
24		.data( "ui-tooltip-id", id )
25		.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
26}
27
28function removeDescribedBy( elem ) {
29	var id = elem.data( "ui-tooltip-id" ),
30		describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
31		index = $.inArray( id, describedby );
32	if ( index !== -1 ) {
33		describedby.splice( index, 1 );
34	}
35
36	elem.removeData( "ui-tooltip-id" );
37	describedby = $.trim( describedby.join( " " ) );
38	if ( describedby ) {
39		elem.attr( "aria-describedby", describedby );
40	} else {
41		elem.removeAttr( "aria-describedby" );
42	}
43}
44
45$.widget( "ui.tooltip", {
46	version: "1.10.4",
47	options: {
48		content: function() {
49			// support: IE<9, Opera in jQuery <1.7
50			// .text() can't accept undefined, so coerce to a string
51			var title = $( this ).attr( "title" ) || "";
52			// Escape title, since we're going from an attribute to raw HTML
53			return $( "<a>" ).text( title ).html();
54		},
55		hide: true,
56		// Disabled elements have inconsistent behavior across browsers (#8661)
57		items: "[title]:not([disabled])",
58		position: {
59			my: "left top+15",
60			at: "left bottom",
61			collision: "flipfit flip"
62		},
63		show: true,
64		tooltipClass: null,
65		track: false,
66
67		// callbacks
68		close: null,
69		open: null
70	},
71
72	_create: function() {
73		this._on({
74			mouseover: "open",
75			focusin: "open"
76		});
77
78		// IDs of generated tooltips, needed for destroy
79		this.tooltips = {};
80		// IDs of parent tooltips where we removed the title attribute
81		this.parents = {};
82
83		if ( this.options.disabled ) {
84			this._disable();
85		}
86	},
87
88	_setOption: function( key, value ) {
89		var that = this;
90
91		if ( key === "disabled" ) {
92			this[ value ? "_disable" : "_enable" ]();
93			this.options[ key ] = value;
94			// disable element style changes
95			return;
96		}
97
98		this._super( key, value );
99
100		if ( key === "content" ) {
101			$.each( this.tooltips, function( id, element ) {
102				that._updateContent( element );
103			});
104		}
105	},
106
107	_disable: function() {
108		var that = this;
109
110		// close open tooltips
111		$.each( this.tooltips, function( id, element ) {
112			var event = $.Event( "blur" );
113			event.target = event.currentTarget = element[0];
114			that.close( event, true );
115		});
116
117		// remove title attributes to prevent native tooltips
118		this.element.find( this.options.items ).addBack().each(function() {
119			var element = $( this );
120			if ( element.is( "[title]" ) ) {
121				element
122					.data( "ui-tooltip-title", element.attr( "title" ) )
123					.attr( "title", "" );
124			}
125		});
126	},
127
128	_enable: function() {
129		// restore title attributes
130		this.element.find( this.options.items ).addBack().each(function() {
131			var element = $( this );
132			if ( element.data( "ui-tooltip-title" ) ) {
133				element.attr( "title", element.data( "ui-tooltip-title" ) );
134			}
135		});
136	},
137
138	open: function( event ) {
139		var that = this,
140			target = $( event ? event.target : this.element )
141				// we need closest here due to mouseover bubbling,
142				// but always pointing at the same event target
143				.closest( this.options.items );
144
145		// No element to show a tooltip for or the tooltip is already open
146		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
147			return;
148		}
149
150		if ( target.attr( "title" ) ) {
151			target.data( "ui-tooltip-title", target.attr( "title" ) );
152		}
153
154		target.data( "ui-tooltip-open", true );
155
156		// kill parent tooltips, custom or native, for hover
157		if ( event && event.type === "mouseover" ) {
158			target.parents().each(function() {
159				var parent = $( this ),
160					blurEvent;
161				if ( parent.data( "ui-tooltip-open" ) ) {
162					blurEvent = $.Event( "blur" );
163					blurEvent.target = blurEvent.currentTarget = this;
164					that.close( blurEvent, true );
165				}
166				if ( parent.attr( "title" ) ) {
167					parent.uniqueId();
168					that.parents[ this.id ] = {
169						element: this,
170						title: parent.attr( "title" )
171					};
172					parent.attr( "title", "" );
173				}
174			});
175		}
176
177		this._updateContent( target, event );
178	},
179
180	_updateContent: function( target, event ) {
181		var content,
182			contentOption = this.options.content,
183			that = this,
184			eventType = event ? event.type : null;
185
186		if ( typeof contentOption === "string" ) {
187			return this._open( event, target, contentOption );
188		}
189
190		content = contentOption.call( target[0], function( response ) {
191			// ignore async response if tooltip was closed already
192			if ( !target.data( "ui-tooltip-open" ) ) {
193				return;
194			}
195			// IE may instantly serve a cached response for ajax requests
196			// delay this call to _open so the other call to _open runs first
197			that._delay(function() {
198				// jQuery creates a special event for focusin when it doesn't
199				// exist natively. To improve performance, the native event
200				// object is reused and the type is changed. Therefore, we can't
201				// rely on the type being correct after the event finished
202				// bubbling, so we set it back to the previous value. (#8740)
203				if ( event ) {
204					event.type = eventType;
205				}
206				this._open( event, target, response );
207			});
208		});
209		if ( content ) {
210			this._open( event, target, content );
211		}
212	},
213
214	_open: function( event, target, content ) {
215		var tooltip, events, delayedShow,
216			positionOption = $.extend( {}, this.options.position );
217
218		if ( !content ) {
219			return;
220		}
221
222		// Content can be updated multiple times. If the tooltip already
223		// exists, then just update the content and bail.
224		tooltip = this._find( target );
225		if ( tooltip.length ) {
226			tooltip.find( ".ui-tooltip-content" ).html( content );
227			return;
228		}
229
230		// if we have a title, clear it to prevent the native tooltip
231		// we have to check first to avoid defining a title if none exists
232		// (we don't want to cause an element to start matching [title])
233		//
234		// We use removeAttr only for key events, to allow IE to export the correct
235		// accessible attributes. For mouse events, set to empty string to avoid
236		// native tooltip showing up (happens only when removing inside mouseover).
237		if ( target.is( "[title]" ) ) {
238			if ( event && event.type === "mouseover" ) {
239				target.attr( "title", "" );
240			} else {
241				target.removeAttr( "title" );
242			}
243		}
244
245		tooltip = this._tooltip( target );
246		addDescribedBy( target, tooltip.attr( "id" ) );
247		tooltip.find( ".ui-tooltip-content" ).html( content );
248
249		function position( event ) {
250			positionOption.of = event;
251			if ( tooltip.is( ":hidden" ) ) {
252				return;
253			}
254			tooltip.position( positionOption );
255		}
256		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
257			this._on( this.document, {
258				mousemove: position
259			});
260			// trigger once to override element-relative positioning
261			position( event );
262		} else {
263			tooltip.position( $.extend({
264				of: target
265			}, this.options.position ) );
266		}
267
268		tooltip.hide();
269
270		this._show( tooltip, this.options.show );
271		// Handle tracking tooltips that are shown with a delay (#8644). As soon
272		// as the tooltip is visible, position the tooltip using the most recent
273		// event.
274		if ( this.options.show && this.options.show.delay ) {
275			delayedShow = this.delayedShow = setInterval(function() {
276				if ( tooltip.is( ":visible" ) ) {
277					position( positionOption.of );
278					clearInterval( delayedShow );
279				}
280			}, $.fx.interval );
281		}
282
283		this._trigger( "open", event, { tooltip: tooltip } );
284
285		events = {
286			keyup: function( event ) {
287				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
288					var fakeEvent = $.Event(event);
289					fakeEvent.currentTarget = target[0];
290					this.close( fakeEvent, true );
291				}
292			},
293			remove: function() {
294				this._removeTooltip( tooltip );
295			}
296		};
297		if ( !event || event.type === "mouseover" ) {
298			events.mouseleave = "close";
299		}
300		if ( !event || event.type === "focusin" ) {
301			events.focusout = "close";
302		}
303		this._on( true, target, events );
304	},
305
306	close: function( event ) {
307		var that = this,
308			target = $( event ? event.currentTarget : this.element ),
309			tooltip = this._find( target );
310
311		// disabling closes the tooltip, so we need to track when we're closing
312		// to avoid an infinite loop in case the tooltip becomes disabled on close
313		if ( this.closing ) {
314			return;
315		}
316
317		// Clear the interval for delayed tracking tooltips
318		clearInterval( this.delayedShow );
319
320		// only set title if we had one before (see comment in _open())
321		if ( target.data( "ui-tooltip-title" ) ) {
322			target.attr( "title", target.data( "ui-tooltip-title" ) );
323		}
324
325		removeDescribedBy( target );
326
327		tooltip.stop( true );
328		this._hide( tooltip, this.options.hide, function() {
329			that._removeTooltip( $( this ) );
330		});
331
332		target.removeData( "ui-tooltip-open" );
333		this._off( target, "mouseleave focusout keyup" );
334		// Remove 'remove' binding only on delegated targets
335		if ( target[0] !== this.element[0] ) {
336			this._off( target, "remove" );
337		}
338		this._off( this.document, "mousemove" );
339
340		if ( event && event.type === "mouseleave" ) {
341			$.each( this.parents, function( id, parent ) {
342				$( parent.element ).attr( "title", parent.title );
343				delete that.parents[ id ];
344			});
345		}
346
347		this.closing = true;
348		this._trigger( "close", event, { tooltip: tooltip } );
349		this.closing = false;
350	},
351
352	_tooltip: function( element ) {
353		var id = "ui-tooltip-" + increments++,
354			tooltip = $( "<div>" )
355				.attr({
356					id: id,
357					role: "tooltip"
358				})
359				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
360					( this.options.tooltipClass || "" ) );
361		$( "<div>" )
362			.addClass( "ui-tooltip-content" )
363			.appendTo( tooltip );
364		tooltip.appendTo( this.document[0].body );
365		this.tooltips[ id ] = element;
366		return tooltip;
367	},
368
369	_find: function( target ) {
370		var id = target.data( "ui-tooltip-id" );
371		return id ? $( "#" + id ) : $();
372	},
373
374	_removeTooltip: function( tooltip ) {
375		tooltip.remove();
376		delete this.tooltips[ tooltip.attr( "id" ) ];
377	},
378
379	_destroy: function() {
380		var that = this;
381
382		// close open tooltips
383		$.each( this.tooltips, function( id, element ) {
384			// Delegate to close method to handle common cleanup
385			var event = $.Event( "blur" );
386			event.target = event.currentTarget = element[0];
387			that.close( event, true );
388
389			// Remove immediately; destroying an open tooltip doesn't use the
390			// hide animation
391			$( "#" + id ).remove();
392
393			// Restore the title
394			if ( element.data( "ui-tooltip-title" ) ) {
395				element.attr( "title", element.data( "ui-tooltip-title" ) );
396				element.removeData( "ui-tooltip-title" );
397			}
398		});
399	}
400});
401
402}( jQuery ) );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.