annotate src/main/webapp/imageServer/resources/js/jquery-ui-1.10.4/ui/jquery.ui.position.js @ 205:f719d73383db

Merge iiif_diva branch 964846688a95cc9b0af5ade832b8d34ae4a4bc21
author Robert Casties <casties@mpiwg-berlin.mpg.de>
date Mon, 08 Jul 2019 17:55:14 +0200
parents 764f47286679
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
jurzua
parents:
diff changeset
1 /*!
jurzua
parents:
diff changeset
2 * jQuery UI Position 1.10.4
jurzua
parents:
diff changeset
3 * http://jqueryui.com
jurzua
parents:
diff changeset
4 *
jurzua
parents:
diff changeset
5 * Copyright 2014 jQuery Foundation and other contributors
jurzua
parents:
diff changeset
6 * Released under the MIT license.
jurzua
parents:
diff changeset
7 * http://jquery.org/license
jurzua
parents:
diff changeset
8 *
jurzua
parents:
diff changeset
9 * http://api.jqueryui.com/position/
jurzua
parents:
diff changeset
10 */
jurzua
parents:
diff changeset
11 (function( $, undefined ) {
jurzua
parents:
diff changeset
12
jurzua
parents:
diff changeset
13 $.ui = $.ui || {};
jurzua
parents:
diff changeset
14
jurzua
parents:
diff changeset
15 var cachedScrollbarWidth,
jurzua
parents:
diff changeset
16 max = Math.max,
jurzua
parents:
diff changeset
17 abs = Math.abs,
jurzua
parents:
diff changeset
18 round = Math.round,
jurzua
parents:
diff changeset
19 rhorizontal = /left|center|right/,
jurzua
parents:
diff changeset
20 rvertical = /top|center|bottom/,
jurzua
parents:
diff changeset
21 roffset = /[\+\-]\d+(\.[\d]+)?%?/,
jurzua
parents:
diff changeset
22 rposition = /^\w+/,
jurzua
parents:
diff changeset
23 rpercent = /%$/,
jurzua
parents:
diff changeset
24 _position = $.fn.position;
jurzua
parents:
diff changeset
25
jurzua
parents:
diff changeset
26 function getOffsets( offsets, width, height ) {
jurzua
parents:
diff changeset
27 return [
jurzua
parents:
diff changeset
28 parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
jurzua
parents:
diff changeset
29 parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
jurzua
parents:
diff changeset
30 ];
jurzua
parents:
diff changeset
31 }
jurzua
parents:
diff changeset
32
jurzua
parents:
diff changeset
33 function parseCss( element, property ) {
jurzua
parents:
diff changeset
34 return parseInt( $.css( element, property ), 10 ) || 0;
jurzua
parents:
diff changeset
35 }
jurzua
parents:
diff changeset
36
jurzua
parents:
diff changeset
37 function getDimensions( elem ) {
jurzua
parents:
diff changeset
38 var raw = elem[0];
jurzua
parents:
diff changeset
39 if ( raw.nodeType === 9 ) {
jurzua
parents:
diff changeset
40 return {
jurzua
parents:
diff changeset
41 width: elem.width(),
jurzua
parents:
diff changeset
42 height: elem.height(),
jurzua
parents:
diff changeset
43 offset: { top: 0, left: 0 }
jurzua
parents:
diff changeset
44 };
jurzua
parents:
diff changeset
45 }
jurzua
parents:
diff changeset
46 if ( $.isWindow( raw ) ) {
jurzua
parents:
diff changeset
47 return {
jurzua
parents:
diff changeset
48 width: elem.width(),
jurzua
parents:
diff changeset
49 height: elem.height(),
jurzua
parents:
diff changeset
50 offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
jurzua
parents:
diff changeset
51 };
jurzua
parents:
diff changeset
52 }
jurzua
parents:
diff changeset
53 if ( raw.preventDefault ) {
jurzua
parents:
diff changeset
54 return {
jurzua
parents:
diff changeset
55 width: 0,
jurzua
parents:
diff changeset
56 height: 0,
jurzua
parents:
diff changeset
57 offset: { top: raw.pageY, left: raw.pageX }
jurzua
parents:
diff changeset
58 };
jurzua
parents:
diff changeset
59 }
jurzua
parents:
diff changeset
60 return {
jurzua
parents:
diff changeset
61 width: elem.outerWidth(),
jurzua
parents:
diff changeset
62 height: elem.outerHeight(),
jurzua
parents:
diff changeset
63 offset: elem.offset()
jurzua
parents:
diff changeset
64 };
jurzua
parents:
diff changeset
65 }
jurzua
parents:
diff changeset
66
jurzua
parents:
diff changeset
67 $.position = {
jurzua
parents:
diff changeset
68 scrollbarWidth: function() {
jurzua
parents:
diff changeset
69 if ( cachedScrollbarWidth !== undefined ) {
jurzua
parents:
diff changeset
70 return cachedScrollbarWidth;
jurzua
parents:
diff changeset
71 }
jurzua
parents:
diff changeset
72 var w1, w2,
jurzua
parents:
diff changeset
73 div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
jurzua
parents:
diff changeset
74 innerDiv = div.children()[0];
jurzua
parents:
diff changeset
75
jurzua
parents:
diff changeset
76 $( "body" ).append( div );
jurzua
parents:
diff changeset
77 w1 = innerDiv.offsetWidth;
jurzua
parents:
diff changeset
78 div.css( "overflow", "scroll" );
jurzua
parents:
diff changeset
79
jurzua
parents:
diff changeset
80 w2 = innerDiv.offsetWidth;
jurzua
parents:
diff changeset
81
jurzua
parents:
diff changeset
82 if ( w1 === w2 ) {
jurzua
parents:
diff changeset
83 w2 = div[0].clientWidth;
jurzua
parents:
diff changeset
84 }
jurzua
parents:
diff changeset
85
jurzua
parents:
diff changeset
86 div.remove();
jurzua
parents:
diff changeset
87
jurzua
parents:
diff changeset
88 return (cachedScrollbarWidth = w1 - w2);
jurzua
parents:
diff changeset
89 },
jurzua
parents:
diff changeset
90 getScrollInfo: function( within ) {
jurzua
parents:
diff changeset
91 var overflowX = within.isWindow || within.isDocument ? "" :
jurzua
parents:
diff changeset
92 within.element.css( "overflow-x" ),
jurzua
parents:
diff changeset
93 overflowY = within.isWindow || within.isDocument ? "" :
jurzua
parents:
diff changeset
94 within.element.css( "overflow-y" ),
jurzua
parents:
diff changeset
95 hasOverflowX = overflowX === "scroll" ||
jurzua
parents:
diff changeset
96 ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
jurzua
parents:
diff changeset
97 hasOverflowY = overflowY === "scroll" ||
jurzua
parents:
diff changeset
98 ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
jurzua
parents:
diff changeset
99 return {
jurzua
parents:
diff changeset
100 width: hasOverflowY ? $.position.scrollbarWidth() : 0,
jurzua
parents:
diff changeset
101 height: hasOverflowX ? $.position.scrollbarWidth() : 0
jurzua
parents:
diff changeset
102 };
jurzua
parents:
diff changeset
103 },
jurzua
parents:
diff changeset
104 getWithinInfo: function( element ) {
jurzua
parents:
diff changeset
105 var withinElement = $( element || window ),
jurzua
parents:
diff changeset
106 isWindow = $.isWindow( withinElement[0] ),
jurzua
parents:
diff changeset
107 isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
jurzua
parents:
diff changeset
108 return {
jurzua
parents:
diff changeset
109 element: withinElement,
jurzua
parents:
diff changeset
110 isWindow: isWindow,
jurzua
parents:
diff changeset
111 isDocument: isDocument,
jurzua
parents:
diff changeset
112 offset: withinElement.offset() || { left: 0, top: 0 },
jurzua
parents:
diff changeset
113 scrollLeft: withinElement.scrollLeft(),
jurzua
parents:
diff changeset
114 scrollTop: withinElement.scrollTop(),
jurzua
parents:
diff changeset
115 width: isWindow ? withinElement.width() : withinElement.outerWidth(),
jurzua
parents:
diff changeset
116 height: isWindow ? withinElement.height() : withinElement.outerHeight()
jurzua
parents:
diff changeset
117 };
jurzua
parents:
diff changeset
118 }
jurzua
parents:
diff changeset
119 };
jurzua
parents:
diff changeset
120
jurzua
parents:
diff changeset
121 $.fn.position = function( options ) {
jurzua
parents:
diff changeset
122 if ( !options || !options.of ) {
jurzua
parents:
diff changeset
123 return _position.apply( this, arguments );
jurzua
parents:
diff changeset
124 }
jurzua
parents:
diff changeset
125
jurzua
parents:
diff changeset
126 // make a copy, we don't want to modify arguments
jurzua
parents:
diff changeset
127 options = $.extend( {}, options );
jurzua
parents:
diff changeset
128
jurzua
parents:
diff changeset
129 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
jurzua
parents:
diff changeset
130 target = $( options.of ),
jurzua
parents:
diff changeset
131 within = $.position.getWithinInfo( options.within ),
jurzua
parents:
diff changeset
132 scrollInfo = $.position.getScrollInfo( within ),
jurzua
parents:
diff changeset
133 collision = ( options.collision || "flip" ).split( " " ),
jurzua
parents:
diff changeset
134 offsets = {};
jurzua
parents:
diff changeset
135
jurzua
parents:
diff changeset
136 dimensions = getDimensions( target );
jurzua
parents:
diff changeset
137 if ( target[0].preventDefault ) {
jurzua
parents:
diff changeset
138 // force left top to allow flipping
jurzua
parents:
diff changeset
139 options.at = "left top";
jurzua
parents:
diff changeset
140 }
jurzua
parents:
diff changeset
141 targetWidth = dimensions.width;
jurzua
parents:
diff changeset
142 targetHeight = dimensions.height;
jurzua
parents:
diff changeset
143 targetOffset = dimensions.offset;
jurzua
parents:
diff changeset
144 // clone to reuse original targetOffset later
jurzua
parents:
diff changeset
145 basePosition = $.extend( {}, targetOffset );
jurzua
parents:
diff changeset
146
jurzua
parents:
diff changeset
147 // force my and at to have valid horizontal and vertical positions
jurzua
parents:
diff changeset
148 // if a value is missing or invalid, it will be converted to center
jurzua
parents:
diff changeset
149 $.each( [ "my", "at" ], function() {
jurzua
parents:
diff changeset
150 var pos = ( options[ this ] || "" ).split( " " ),
jurzua
parents:
diff changeset
151 horizontalOffset,
jurzua
parents:
diff changeset
152 verticalOffset;
jurzua
parents:
diff changeset
153
jurzua
parents:
diff changeset
154 if ( pos.length === 1) {
jurzua
parents:
diff changeset
155 pos = rhorizontal.test( pos[ 0 ] ) ?
jurzua
parents:
diff changeset
156 pos.concat( [ "center" ] ) :
jurzua
parents:
diff changeset
157 rvertical.test( pos[ 0 ] ) ?
jurzua
parents:
diff changeset
158 [ "center" ].concat( pos ) :
jurzua
parents:
diff changeset
159 [ "center", "center" ];
jurzua
parents:
diff changeset
160 }
jurzua
parents:
diff changeset
161 pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
jurzua
parents:
diff changeset
162 pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
jurzua
parents:
diff changeset
163
jurzua
parents:
diff changeset
164 // calculate offsets
jurzua
parents:
diff changeset
165 horizontalOffset = roffset.exec( pos[ 0 ] );
jurzua
parents:
diff changeset
166 verticalOffset = roffset.exec( pos[ 1 ] );
jurzua
parents:
diff changeset
167 offsets[ this ] = [
jurzua
parents:
diff changeset
168 horizontalOffset ? horizontalOffset[ 0 ] : 0,
jurzua
parents:
diff changeset
169 verticalOffset ? verticalOffset[ 0 ] : 0
jurzua
parents:
diff changeset
170 ];
jurzua
parents:
diff changeset
171
jurzua
parents:
diff changeset
172 // reduce to just the positions without the offsets
jurzua
parents:
diff changeset
173 options[ this ] = [
jurzua
parents:
diff changeset
174 rposition.exec( pos[ 0 ] )[ 0 ],
jurzua
parents:
diff changeset
175 rposition.exec( pos[ 1 ] )[ 0 ]
jurzua
parents:
diff changeset
176 ];
jurzua
parents:
diff changeset
177 });
jurzua
parents:
diff changeset
178
jurzua
parents:
diff changeset
179 // normalize collision option
jurzua
parents:
diff changeset
180 if ( collision.length === 1 ) {
jurzua
parents:
diff changeset
181 collision[ 1 ] = collision[ 0 ];
jurzua
parents:
diff changeset
182 }
jurzua
parents:
diff changeset
183
jurzua
parents:
diff changeset
184 if ( options.at[ 0 ] === "right" ) {
jurzua
parents:
diff changeset
185 basePosition.left += targetWidth;
jurzua
parents:
diff changeset
186 } else if ( options.at[ 0 ] === "center" ) {
jurzua
parents:
diff changeset
187 basePosition.left += targetWidth / 2;
jurzua
parents:
diff changeset
188 }
jurzua
parents:
diff changeset
189
jurzua
parents:
diff changeset
190 if ( options.at[ 1 ] === "bottom" ) {
jurzua
parents:
diff changeset
191 basePosition.top += targetHeight;
jurzua
parents:
diff changeset
192 } else if ( options.at[ 1 ] === "center" ) {
jurzua
parents:
diff changeset
193 basePosition.top += targetHeight / 2;
jurzua
parents:
diff changeset
194 }
jurzua
parents:
diff changeset
195
jurzua
parents:
diff changeset
196 atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
jurzua
parents:
diff changeset
197 basePosition.left += atOffset[ 0 ];
jurzua
parents:
diff changeset
198 basePosition.top += atOffset[ 1 ];
jurzua
parents:
diff changeset
199
jurzua
parents:
diff changeset
200 return this.each(function() {
jurzua
parents:
diff changeset
201 var collisionPosition, using,
jurzua
parents:
diff changeset
202 elem = $( this ),
jurzua
parents:
diff changeset
203 elemWidth = elem.outerWidth(),
jurzua
parents:
diff changeset
204 elemHeight = elem.outerHeight(),
jurzua
parents:
diff changeset
205 marginLeft = parseCss( this, "marginLeft" ),
jurzua
parents:
diff changeset
206 marginTop = parseCss( this, "marginTop" ),
jurzua
parents:
diff changeset
207 collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
jurzua
parents:
diff changeset
208 collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
jurzua
parents:
diff changeset
209 position = $.extend( {}, basePosition ),
jurzua
parents:
diff changeset
210 myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
jurzua
parents:
diff changeset
211
jurzua
parents:
diff changeset
212 if ( options.my[ 0 ] === "right" ) {
jurzua
parents:
diff changeset
213 position.left -= elemWidth;
jurzua
parents:
diff changeset
214 } else if ( options.my[ 0 ] === "center" ) {
jurzua
parents:
diff changeset
215 position.left -= elemWidth / 2;
jurzua
parents:
diff changeset
216 }
jurzua
parents:
diff changeset
217
jurzua
parents:
diff changeset
218 if ( options.my[ 1 ] === "bottom" ) {
jurzua
parents:
diff changeset
219 position.top -= elemHeight;
jurzua
parents:
diff changeset
220 } else if ( options.my[ 1 ] === "center" ) {
jurzua
parents:
diff changeset
221 position.top -= elemHeight / 2;
jurzua
parents:
diff changeset
222 }
jurzua
parents:
diff changeset
223
jurzua
parents:
diff changeset
224 position.left += myOffset[ 0 ];
jurzua
parents:
diff changeset
225 position.top += myOffset[ 1 ];
jurzua
parents:
diff changeset
226
jurzua
parents:
diff changeset
227 // if the browser doesn't support fractions, then round for consistent results
jurzua
parents:
diff changeset
228 if ( !$.support.offsetFractions ) {
jurzua
parents:
diff changeset
229 position.left = round( position.left );
jurzua
parents:
diff changeset
230 position.top = round( position.top );
jurzua
parents:
diff changeset
231 }
jurzua
parents:
diff changeset
232
jurzua
parents:
diff changeset
233 collisionPosition = {
jurzua
parents:
diff changeset
234 marginLeft: marginLeft,
jurzua
parents:
diff changeset
235 marginTop: marginTop
jurzua
parents:
diff changeset
236 };
jurzua
parents:
diff changeset
237
jurzua
parents:
diff changeset
238 $.each( [ "left", "top" ], function( i, dir ) {
jurzua
parents:
diff changeset
239 if ( $.ui.position[ collision[ i ] ] ) {
jurzua
parents:
diff changeset
240 $.ui.position[ collision[ i ] ][ dir ]( position, {
jurzua
parents:
diff changeset
241 targetWidth: targetWidth,
jurzua
parents:
diff changeset
242 targetHeight: targetHeight,
jurzua
parents:
diff changeset
243 elemWidth: elemWidth,
jurzua
parents:
diff changeset
244 elemHeight: elemHeight,
jurzua
parents:
diff changeset
245 collisionPosition: collisionPosition,
jurzua
parents:
diff changeset
246 collisionWidth: collisionWidth,
jurzua
parents:
diff changeset
247 collisionHeight: collisionHeight,
jurzua
parents:
diff changeset
248 offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
jurzua
parents:
diff changeset
249 my: options.my,
jurzua
parents:
diff changeset
250 at: options.at,
jurzua
parents:
diff changeset
251 within: within,
jurzua
parents:
diff changeset
252 elem : elem
jurzua
parents:
diff changeset
253 });
jurzua
parents:
diff changeset
254 }
jurzua
parents:
diff changeset
255 });
jurzua
parents:
diff changeset
256
jurzua
parents:
diff changeset
257 if ( options.using ) {
jurzua
parents:
diff changeset
258 // adds feedback as second argument to using callback, if present
jurzua
parents:
diff changeset
259 using = function( props ) {
jurzua
parents:
diff changeset
260 var left = targetOffset.left - position.left,
jurzua
parents:
diff changeset
261 right = left + targetWidth - elemWidth,
jurzua
parents:
diff changeset
262 top = targetOffset.top - position.top,
jurzua
parents:
diff changeset
263 bottom = top + targetHeight - elemHeight,
jurzua
parents:
diff changeset
264 feedback = {
jurzua
parents:
diff changeset
265 target: {
jurzua
parents:
diff changeset
266 element: target,
jurzua
parents:
diff changeset
267 left: targetOffset.left,
jurzua
parents:
diff changeset
268 top: targetOffset.top,
jurzua
parents:
diff changeset
269 width: targetWidth,
jurzua
parents:
diff changeset
270 height: targetHeight
jurzua
parents:
diff changeset
271 },
jurzua
parents:
diff changeset
272 element: {
jurzua
parents:
diff changeset
273 element: elem,
jurzua
parents:
diff changeset
274 left: position.left,
jurzua
parents:
diff changeset
275 top: position.top,
jurzua
parents:
diff changeset
276 width: elemWidth,
jurzua
parents:
diff changeset
277 height: elemHeight
jurzua
parents:
diff changeset
278 },
jurzua
parents:
diff changeset
279 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
jurzua
parents:
diff changeset
280 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
jurzua
parents:
diff changeset
281 };
jurzua
parents:
diff changeset
282 if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
jurzua
parents:
diff changeset
283 feedback.horizontal = "center";
jurzua
parents:
diff changeset
284 }
jurzua
parents:
diff changeset
285 if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
jurzua
parents:
diff changeset
286 feedback.vertical = "middle";
jurzua
parents:
diff changeset
287 }
jurzua
parents:
diff changeset
288 if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
jurzua
parents:
diff changeset
289 feedback.important = "horizontal";
jurzua
parents:
diff changeset
290 } else {
jurzua
parents:
diff changeset
291 feedback.important = "vertical";
jurzua
parents:
diff changeset
292 }
jurzua
parents:
diff changeset
293 options.using.call( this, props, feedback );
jurzua
parents:
diff changeset
294 };
jurzua
parents:
diff changeset
295 }
jurzua
parents:
diff changeset
296
jurzua
parents:
diff changeset
297 elem.offset( $.extend( position, { using: using } ) );
jurzua
parents:
diff changeset
298 });
jurzua
parents:
diff changeset
299 };
jurzua
parents:
diff changeset
300
jurzua
parents:
diff changeset
301 $.ui.position = {
jurzua
parents:
diff changeset
302 fit: {
jurzua
parents:
diff changeset
303 left: function( position, data ) {
jurzua
parents:
diff changeset
304 var within = data.within,
jurzua
parents:
diff changeset
305 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
jurzua
parents:
diff changeset
306 outerWidth = within.width,
jurzua
parents:
diff changeset
307 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
jurzua
parents:
diff changeset
308 overLeft = withinOffset - collisionPosLeft,
jurzua
parents:
diff changeset
309 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
jurzua
parents:
diff changeset
310 newOverRight;
jurzua
parents:
diff changeset
311
jurzua
parents:
diff changeset
312 // element is wider than within
jurzua
parents:
diff changeset
313 if ( data.collisionWidth > outerWidth ) {
jurzua
parents:
diff changeset
314 // element is initially over the left side of within
jurzua
parents:
diff changeset
315 if ( overLeft > 0 && overRight <= 0 ) {
jurzua
parents:
diff changeset
316 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
jurzua
parents:
diff changeset
317 position.left += overLeft - newOverRight;
jurzua
parents:
diff changeset
318 // element is initially over right side of within
jurzua
parents:
diff changeset
319 } else if ( overRight > 0 && overLeft <= 0 ) {
jurzua
parents:
diff changeset
320 position.left = withinOffset;
jurzua
parents:
diff changeset
321 // element is initially over both left and right sides of within
jurzua
parents:
diff changeset
322 } else {
jurzua
parents:
diff changeset
323 if ( overLeft > overRight ) {
jurzua
parents:
diff changeset
324 position.left = withinOffset + outerWidth - data.collisionWidth;
jurzua
parents:
diff changeset
325 } else {
jurzua
parents:
diff changeset
326 position.left = withinOffset;
jurzua
parents:
diff changeset
327 }
jurzua
parents:
diff changeset
328 }
jurzua
parents:
diff changeset
329 // too far left -> align with left edge
jurzua
parents:
diff changeset
330 } else if ( overLeft > 0 ) {
jurzua
parents:
diff changeset
331 position.left += overLeft;
jurzua
parents:
diff changeset
332 // too far right -> align with right edge
jurzua
parents:
diff changeset
333 } else if ( overRight > 0 ) {
jurzua
parents:
diff changeset
334 position.left -= overRight;
jurzua
parents:
diff changeset
335 // adjust based on position and margin
jurzua
parents:
diff changeset
336 } else {
jurzua
parents:
diff changeset
337 position.left = max( position.left - collisionPosLeft, position.left );
jurzua
parents:
diff changeset
338 }
jurzua
parents:
diff changeset
339 },
jurzua
parents:
diff changeset
340 top: function( position, data ) {
jurzua
parents:
diff changeset
341 var within = data.within,
jurzua
parents:
diff changeset
342 withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
jurzua
parents:
diff changeset
343 outerHeight = data.within.height,
jurzua
parents:
diff changeset
344 collisionPosTop = position.top - data.collisionPosition.marginTop,
jurzua
parents:
diff changeset
345 overTop = withinOffset - collisionPosTop,
jurzua
parents:
diff changeset
346 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
jurzua
parents:
diff changeset
347 newOverBottom;
jurzua
parents:
diff changeset
348
jurzua
parents:
diff changeset
349 // element is taller than within
jurzua
parents:
diff changeset
350 if ( data.collisionHeight > outerHeight ) {
jurzua
parents:
diff changeset
351 // element is initially over the top of within
jurzua
parents:
diff changeset
352 if ( overTop > 0 && overBottom <= 0 ) {
jurzua
parents:
diff changeset
353 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
jurzua
parents:
diff changeset
354 position.top += overTop - newOverBottom;
jurzua
parents:
diff changeset
355 // element is initially over bottom of within
jurzua
parents:
diff changeset
356 } else if ( overBottom > 0 && overTop <= 0 ) {
jurzua
parents:
diff changeset
357 position.top = withinOffset;
jurzua
parents:
diff changeset
358 // element is initially over both top and bottom of within
jurzua
parents:
diff changeset
359 } else {
jurzua
parents:
diff changeset
360 if ( overTop > overBottom ) {
jurzua
parents:
diff changeset
361 position.top = withinOffset + outerHeight - data.collisionHeight;
jurzua
parents:
diff changeset
362 } else {
jurzua
parents:
diff changeset
363 position.top = withinOffset;
jurzua
parents:
diff changeset
364 }
jurzua
parents:
diff changeset
365 }
jurzua
parents:
diff changeset
366 // too far up -> align with top
jurzua
parents:
diff changeset
367 } else if ( overTop > 0 ) {
jurzua
parents:
diff changeset
368 position.top += overTop;
jurzua
parents:
diff changeset
369 // too far down -> align with bottom edge
jurzua
parents:
diff changeset
370 } else if ( overBottom > 0 ) {
jurzua
parents:
diff changeset
371 position.top -= overBottom;
jurzua
parents:
diff changeset
372 // adjust based on position and margin
jurzua
parents:
diff changeset
373 } else {
jurzua
parents:
diff changeset
374 position.top = max( position.top - collisionPosTop, position.top );
jurzua
parents:
diff changeset
375 }
jurzua
parents:
diff changeset
376 }
jurzua
parents:
diff changeset
377 },
jurzua
parents:
diff changeset
378 flip: {
jurzua
parents:
diff changeset
379 left: function( position, data ) {
jurzua
parents:
diff changeset
380 var within = data.within,
jurzua
parents:
diff changeset
381 withinOffset = within.offset.left + within.scrollLeft,
jurzua
parents:
diff changeset
382 outerWidth = within.width,
jurzua
parents:
diff changeset
383 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
jurzua
parents:
diff changeset
384 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
jurzua
parents:
diff changeset
385 overLeft = collisionPosLeft - offsetLeft,
jurzua
parents:
diff changeset
386 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
jurzua
parents:
diff changeset
387 myOffset = data.my[ 0 ] === "left" ?
jurzua
parents:
diff changeset
388 -data.elemWidth :
jurzua
parents:
diff changeset
389 data.my[ 0 ] === "right" ?
jurzua
parents:
diff changeset
390 data.elemWidth :
jurzua
parents:
diff changeset
391 0,
jurzua
parents:
diff changeset
392 atOffset = data.at[ 0 ] === "left" ?
jurzua
parents:
diff changeset
393 data.targetWidth :
jurzua
parents:
diff changeset
394 data.at[ 0 ] === "right" ?
jurzua
parents:
diff changeset
395 -data.targetWidth :
jurzua
parents:
diff changeset
396 0,
jurzua
parents:
diff changeset
397 offset = -2 * data.offset[ 0 ],
jurzua
parents:
diff changeset
398 newOverRight,
jurzua
parents:
diff changeset
399 newOverLeft;
jurzua
parents:
diff changeset
400
jurzua
parents:
diff changeset
401 if ( overLeft < 0 ) {
jurzua
parents:
diff changeset
402 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
jurzua
parents:
diff changeset
403 if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
jurzua
parents:
diff changeset
404 position.left += myOffset + atOffset + offset;
jurzua
parents:
diff changeset
405 }
jurzua
parents:
diff changeset
406 }
jurzua
parents:
diff changeset
407 else if ( overRight > 0 ) {
jurzua
parents:
diff changeset
408 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
jurzua
parents:
diff changeset
409 if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
jurzua
parents:
diff changeset
410 position.left += myOffset + atOffset + offset;
jurzua
parents:
diff changeset
411 }
jurzua
parents:
diff changeset
412 }
jurzua
parents:
diff changeset
413 },
jurzua
parents:
diff changeset
414 top: function( position, data ) {
jurzua
parents:
diff changeset
415 var within = data.within,
jurzua
parents:
diff changeset
416 withinOffset = within.offset.top + within.scrollTop,
jurzua
parents:
diff changeset
417 outerHeight = within.height,
jurzua
parents:
diff changeset
418 offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
jurzua
parents:
diff changeset
419 collisionPosTop = position.top - data.collisionPosition.marginTop,
jurzua
parents:
diff changeset
420 overTop = collisionPosTop - offsetTop,
jurzua
parents:
diff changeset
421 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
jurzua
parents:
diff changeset
422 top = data.my[ 1 ] === "top",
jurzua
parents:
diff changeset
423 myOffset = top ?
jurzua
parents:
diff changeset
424 -data.elemHeight :
jurzua
parents:
diff changeset
425 data.my[ 1 ] === "bottom" ?
jurzua
parents:
diff changeset
426 data.elemHeight :
jurzua
parents:
diff changeset
427 0,
jurzua
parents:
diff changeset
428 atOffset = data.at[ 1 ] === "top" ?
jurzua
parents:
diff changeset
429 data.targetHeight :
jurzua
parents:
diff changeset
430 data.at[ 1 ] === "bottom" ?
jurzua
parents:
diff changeset
431 -data.targetHeight :
jurzua
parents:
diff changeset
432 0,
jurzua
parents:
diff changeset
433 offset = -2 * data.offset[ 1 ],
jurzua
parents:
diff changeset
434 newOverTop,
jurzua
parents:
diff changeset
435 newOverBottom;
jurzua
parents:
diff changeset
436 if ( overTop < 0 ) {
jurzua
parents:
diff changeset
437 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
jurzua
parents:
diff changeset
438 if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
jurzua
parents:
diff changeset
439 position.top += myOffset + atOffset + offset;
jurzua
parents:
diff changeset
440 }
jurzua
parents:
diff changeset
441 }
jurzua
parents:
diff changeset
442 else if ( overBottom > 0 ) {
jurzua
parents:
diff changeset
443 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
jurzua
parents:
diff changeset
444 if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
jurzua
parents:
diff changeset
445 position.top += myOffset + atOffset + offset;
jurzua
parents:
diff changeset
446 }
jurzua
parents:
diff changeset
447 }
jurzua
parents:
diff changeset
448 }
jurzua
parents:
diff changeset
449 },
jurzua
parents:
diff changeset
450 flipfit: {
jurzua
parents:
diff changeset
451 left: function() {
jurzua
parents:
diff changeset
452 $.ui.position.flip.left.apply( this, arguments );
jurzua
parents:
diff changeset
453 $.ui.position.fit.left.apply( this, arguments );
jurzua
parents:
diff changeset
454 },
jurzua
parents:
diff changeset
455 top: function() {
jurzua
parents:
diff changeset
456 $.ui.position.flip.top.apply( this, arguments );
jurzua
parents:
diff changeset
457 $.ui.position.fit.top.apply( this, arguments );
jurzua
parents:
diff changeset
458 }
jurzua
parents:
diff changeset
459 }
jurzua
parents:
diff changeset
460 };
jurzua
parents:
diff changeset
461
jurzua
parents:
diff changeset
462 // fraction support test
jurzua
parents:
diff changeset
463 (function () {
jurzua
parents:
diff changeset
464 var testElement, testElementParent, testElementStyle, offsetLeft, i,
jurzua
parents:
diff changeset
465 body = document.getElementsByTagName( "body" )[ 0 ],
jurzua
parents:
diff changeset
466 div = document.createElement( "div" );
jurzua
parents:
diff changeset
467
jurzua
parents:
diff changeset
468 //Create a "fake body" for testing based on method used in jQuery.support
jurzua
parents:
diff changeset
469 testElement = document.createElement( body ? "div" : "body" );
jurzua
parents:
diff changeset
470 testElementStyle = {
jurzua
parents:
diff changeset
471 visibility: "hidden",
jurzua
parents:
diff changeset
472 width: 0,
jurzua
parents:
diff changeset
473 height: 0,
jurzua
parents:
diff changeset
474 border: 0,
jurzua
parents:
diff changeset
475 margin: 0,
jurzua
parents:
diff changeset
476 background: "none"
jurzua
parents:
diff changeset
477 };
jurzua
parents:
diff changeset
478 if ( body ) {
jurzua
parents:
diff changeset
479 $.extend( testElementStyle, {
jurzua
parents:
diff changeset
480 position: "absolute",
jurzua
parents:
diff changeset
481 left: "-1000px",
jurzua
parents:
diff changeset
482 top: "-1000px"
jurzua
parents:
diff changeset
483 });
jurzua
parents:
diff changeset
484 }
jurzua
parents:
diff changeset
485 for ( i in testElementStyle ) {
jurzua
parents:
diff changeset
486 testElement.style[ i ] = testElementStyle[ i ];
jurzua
parents:
diff changeset
487 }
jurzua
parents:
diff changeset
488 testElement.appendChild( div );
jurzua
parents:
diff changeset
489 testElementParent = body || document.documentElement;
jurzua
parents:
diff changeset
490 testElementParent.insertBefore( testElement, testElementParent.firstChild );
jurzua
parents:
diff changeset
491
jurzua
parents:
diff changeset
492 div.style.cssText = "position: absolute; left: 10.7432222px;";
jurzua
parents:
diff changeset
493
jurzua
parents:
diff changeset
494 offsetLeft = $( div ).offset().left;
jurzua
parents:
diff changeset
495 $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
jurzua
parents:
diff changeset
496
jurzua
parents:
diff changeset
497 testElement.innerHTML = "";
jurzua
parents:
diff changeset
498 testElementParent.removeChild( testElement );
jurzua
parents:
diff changeset
499 })();
jurzua
parents:
diff changeset
500
jurzua
parents:
diff changeset
501 }( jQuery ) );