source: trunk/themes/default/js/ui/jquery.ui.position.js @ 9559

Last change on this file since 9559 was 9559, checked in by patdenice, 13 years ago

Update jQuery UI to 1.8.10.
Improve jquery ui management in template class.

File size: 7.2 KB
Line 
1/*
2 * jQuery UI Position 1.8.10
3 *
4 * Copyright 2011, 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 = Math.round( position.left );
126                position.top = Math.round( 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 ));
Note: See TracBrowser for help on using the repository browser.