PageSourceSearch

https://bigbluehat.com/js/jquery/jquery.ui.position.js

js bigbluehat.com collected 2026-10-02 06:36:41 UTC 7,333 bytes, 252 lines download raw bytes

1/*
2 * jQuery UI Position 1.8.6
3 *
4 * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
5 * Dual licensed under the MIT or GPL Version 2 licenses.
6 * http://jquery.org/license
7 *
8 * http://docs.jquery.com/UI/Position
9 */
10(function( $, undefined ) {
11
12$.ui = $.ui || {};
13
14var horizontalPositions = /left|center|right/,
15	verticalPositions = /top|center|bottom/,
16	center = "center",
17	_position = $.fn.position,
18	_offset = $.fn.offset;
19
20$.fn.position = function( options ) {
21	if ( !options || !options.of ) {
22		return _position.apply( this, arguments );
23	}
24
25	// make a copy, we don't want to modify arguments
26	options = $.extend( {}, options );
27
28	var target = $( options.of ),
29		targetElem = target[0],
30		collision = ( options.collision || "flip" ).split( " " ),
31		offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
32		targetWidth,
33		targetHeight,
34		basePosition;
35
36	if ( targetElem.nodeType === 9 ) {
37		targetWidth = target.width();
38		targetHeight = target.height();
39		basePosition = { top: 0, left: 0 };
40	// TODO: use $.isWindow() in 1.9
41	} else if ( targetElem.setTimeout ) {
42		targetWidth = target.width();
43		targetHeight = target.height();
44		basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
45	} else if ( targetElem.preventDefault ) {
46		// force left top to allow flipping
47		options.at = "left top";
48		targetWidth = targetHeight = 0;
49		basePosition = { top: options.of.pageY, left: options.of.pageX };
50	} else {
51		targetWidth = target.outerWidth();
52		targetHeight = target.outerHeight();
53		basePosition = target.offset();
54	}
55
56	// force my and at to have valid horizontal and veritcal positions
57	// if a value is missing or invalid, it will be converted to center 
58	$.each( [ "my", "at" ], function() {
59		var pos = ( options[this] || "" ).split( " " );
60		if ( pos.length === 1) {
61			pos = horizontalPositions.test( pos[0] ) ?
62				pos.concat( [center] ) :
63				verticalPositions.test( pos[0] ) ?
64					[ center ].concat( pos ) :
65					[ center, center ];
66		}
67		pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
68		pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
69		options[ this ] = pos;
70	});
71
72	// normalize collision option
73	if ( collision.length === 1 ) {
74		collision[ 1 ] = collision[ 0 ];
75	}
76
77	// normalize offset option
78	offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
79	if ( offset.length === 1 ) {
80		offset[ 1 ] = offset[ 0 ];
81	}
82	offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
83
84	if ( options.at[0] === "right" ) {
85		basePosition.left += targetWidth;
86	} else if (options.at[0] === center ) {
87		basePosition.left += targetWidth / 2;
88	}
89
90	if ( options.at[1] === "bottom" ) {
91		basePosition.top += targetHeight;
92	} else if ( options.at[1] === center ) {
93		basePosition.top += targetHeight / 2;
94	}
95
96	basePosition.left += offset[ 0 ];
97	basePosition.top += offset[ 1 ];
98
99	return this.each(function() {
100		var elem = $( this ),
101			elemWidth = elem.outerWidth(),
102			elemHeight = elem.outerHeight(),
103			marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
104			marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
105			collisionWidth = elemWidth + marginLeft +
106				parseInt( $.curCSS( this, "marginRight", true ) ) || 0,
107			collisionHeight = elemHeight + marginTop +
108				parseInt( $.curCSS( this, "marginBottom", true ) ) || 0,
109			position = $.extend( {}, basePosition ),
110			collisionPosition;
111
112		if ( options.my[0] === "right" ) {
113			position.left -= elemWidth;
114		} else if ( options.my[0] === center ) {
115			position.left -= elemWidth / 2;
116		}
117
118		if ( options.my[1] === "bottom" ) {
119			position.top -= elemHeight;
120		} else if ( options.my[1] === center ) {
121			position.top -= elemHeight / 2;
122		}
123
124		// prevent fractions (see #5280)
125		position.left = parseInt( position.left );
126		position.top = parseInt( position.top );
127
128		collisionPosition = {
129			left: position.left - marginLeft,
130			top: position.top - marginTop
131		};
132
133		$.each( [ "left", "top" ], function( i, dir ) {
134			if ( $.ui.position[ collision[i] ] ) {
135				$.ui.position[ collision[i] ][ dir ]( position, {
136					targetWidth: targetWidth,
137					targetHeight: targetHeight,
138					elemWidth: elemWidth,
139					elemHeight: elemHeight,
140					collisionPosition: collisionPosition,
141					collisionWidth: collisionWidth,
142					collisionHeight: collisionHeight,
143					offset: offset,
144					my: options.my,
145					at: options.at
146				});
147			}
148		});
149
150		if ( $.fn.bgiframe ) {
151			elem.bgiframe();
152		}
153		elem.offset( $.extend( position, { using: options.using } ) );
154	});
155};
156
157$.ui.position = {
158	fit: {
159		left: function( position, data ) {
160			var win = $( window ),
161				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
162			position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
163		},
164		top: function( position, data ) {
165			var win = $( window ),
166				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
167			position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
168		}
169	},
170
171	flip: {
172		left: function( position, data ) {
173			if ( data.at[0] === center ) {
174				return;
175			}
176			var win = $( window ),
177				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
178				myOffset = data.my[ 0 ] === "left" ?
179					-data.elemWidth :
180					data.my[ 0 ] === "right" ?
181						data.elemWidth :
182						0,
183				atOffset = data.at[ 0 ] === "left" ?
184					data.targetWidth :
185					-data.targetWidth,
186				offset = -2 * data.offset[ 0 ];
187			position.left += data.collisionPosition.left < 0 ?
188				myOffset + atOffset + offset :
189				over > 0 ?
190					myOffset + atOffset + offset :
191					0;
192		},
193		top: function( position, data ) {
194			if ( data.at[1] === center ) {
195				return;
196			}
197			var win = $( window ),
198				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
199				myOffset = data.my[ 1 ] === "top" ?
200					-data.elemHeight :
201					data.my[ 1 ] === "bottom" ?
202						data.elemHeight :
203						0,
204				atOffset = data.at[ 1 ] === "top" ?
205					data.targetHeight :
206					-data.targetHeight,
207				offset = -2 * data.offset[ 1 ];
208			position.top += data.collisionPosition.top < 0 ?
209				myOffset + atOffset + offset :
210				over > 0 ?
211					myOffset + atOffset + offset :
212					0;
213		}
214	}
215};
216
217// offset setter from jQuery 1.4
218if ( !$.offset.setOffset ) {
219	$.offset.setOffset = function( elem, options ) {
220		// set position first, in-case top/left are set even on static elem
221		if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
222			elem.style.position = "relative";
223		}
224		var curElem   = $( elem ),
225			curOffset = curElem.offset(),
226			curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
227			curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
228			props     = {
229				top:  (options.top  - curOffset.top)  + curTop,
230				left: (options.left - curOffset.left) + curLeft
231			};
232		
233		if ( 'using' in options ) {
234			options.using.call( elem, props );
235		} else {
236			curElem.css( props );
237		}
238	};
239
240	$.fn.offset = function( options ) {
241		var elem = this[ 0 ];
242		if ( !elem || !elem.ownerDocument ) { return null; }
243		if ( options ) { 
244			return this.each(function() {
245				$.offset.setOffset( this, options );
246			});
247		}
248		return _offset.call( this );
249	};
250}
251
252}( 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.