Project

General

Profile

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

    
14
var 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
218
if ( !$.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 ));
(25-25/32)