/[projects]/misc/horsensspejder-web/jquery/jquery-ui-1.10.3/ui/jquery.ui.position.js
ViewVC logotype

Contents of /misc/horsensspejder-web/jquery/jquery-ui-1.10.3/ui/jquery.ui.position.js

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20