Rev 162 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/** jQuery UI Position 1.8.1** Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)* Dual licensed under the MIT (MIT-LICENSE.txt)* and GPL (GPL-LICENSE.txt) licenses.** http://docs.jquery.com/UI/Position*/(function( $ ) {$.ui = $.ui || {};var horizontalPositions = /left|center|right/,horizontalDefault = "center",verticalPositions = /top|center|bottom/,verticalDefault = "center",_position = $.fn.position,_offset = $.fn.offset;$.fn.position = function( options ) {if ( !options || !options.of ) {return _position.apply( this, arguments );}// make a copy, we don't want to modify argumentsoptions = $.extend( {}, options );var target = $( options.of ),collision = ( options.collision || "flip" ).split( " " ),offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],targetWidth,targetHeight,basePosition;if ( options.of.nodeType === 9 ) {targetWidth = target.width();targetHeight = target.height();basePosition = { top: 0, left: 0 };} else if ( options.of.scrollTo && options.of.document ) {targetWidth = target.width();targetHeight = target.height();basePosition = { top: target.scrollTop(), left: target.scrollLeft() };} else if ( options.of.preventDefault ) {// force left top to allow flippingoptions.at = "left top";targetWidth = targetHeight = 0;basePosition = { top: options.of.pageY, left: options.of.pageX };} else {targetWidth = target.outerWidth();targetHeight = target.outerHeight();basePosition = target.offset();}// force my and at to have valid horizontal and veritcal positions// if a value is missing or invalid, it will be converted to center$.each( [ "my", "at" ], function() {var pos = ( options[this] || "" ).split( " " );if ( pos.length === 1) {pos = horizontalPositions.test( pos[0] ) ?pos.concat( [verticalDefault] ) :verticalPositions.test( pos[0] ) ?[ horizontalDefault ].concat( pos ) :[ horizontalDefault, verticalDefault ];}pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : horizontalDefault;pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : verticalDefault;options[ this ] = pos;});// normalize collision optionif ( collision.length === 1 ) {collision[ 1 ] = collision[ 0 ];}// normalize offset optionoffset[ 0 ] = parseInt( offset[0], 10 ) || 0;if ( offset.length === 1 ) {offset[ 1 ] = offset[ 0 ];}offset[ 1 ] = parseInt( offset[1], 10 ) || 0;if ( options.at[0] === "right" ) {basePosition.left += targetWidth;} else if (options.at[0] === horizontalDefault ) {basePosition.left += targetWidth / 2;}if ( options.at[1] === "bottom" ) {basePosition.top += targetHeight;} else if ( options.at[1] === verticalDefault ) {basePosition.top += targetHeight / 2;}basePosition.left += offset[ 0 ];basePosition.top += offset[ 1 ];return this.each(function() {var elem = $( this ),elemWidth = elem.outerWidth(),elemHeight = elem.outerHeight(),position = $.extend( {}, basePosition );if ( options.my[0] === "right" ) {position.left -= elemWidth;} else if ( options.my[0] === horizontalDefault ) {position.left -= elemWidth / 2;}if ( options.my[1] === "bottom" ) {position.top -= elemHeight;} else if ( options.my[1] === verticalDefault ) {position.top -= elemHeight / 2;}// prevent fractions (see #5280)position.left = parseInt( position.left );position.top = parseInt( position.top );$.each( [ "left", "top" ], function( i, dir ) {if ( $.ui.position[ collision[i] ] ) {$.ui.position[ collision[i] ][ dir ]( position, {targetWidth: targetWidth,targetHeight: targetHeight,elemWidth: elemWidth,elemHeight: elemHeight,offset: offset,my: options.my,at: options.at});}});if ( $.fn.bgiframe ) {elem.bgiframe();}elem.offset( $.extend( position, { using: options.using } ) );});};$.ui.position = {fit: {left: function( position, data ) {var win = $( window ),over = position.left + data.elemWidth - win.width() - win.scrollLeft();position.left = over > 0 ? position.left - over : Math.max( 0, position.left );},top: function( position, data ) {var win = $( window ),over = position.top + data.elemHeight - win.height() - win.scrollTop();position.top = over > 0 ? position.top - over : Math.max( 0, position.top );}},flip: {left: function( position, data ) {if ( data.at[0] === "center" ) {return;}var win = $( window ),over = position.left + data.elemWidth - win.width() - win.scrollLeft(),myOffset = data.my[ 0 ] === "left" ?-data.elemWidth :data.my[ 0 ] === "right" ?data.elemWidth :0,offset = -2 * data.offset[ 0 ];position.left += position.left < 0 ?myOffset + data.targetWidth + offset :over > 0 ?myOffset - data.targetWidth + offset :0;},top: function( position, data ) {if ( data.at[1] === "center" ) {return;}var win = $( window ),over = position.top + data.elemHeight - win.height() - win.scrollTop(),myOffset = data.my[ 1 ] === "top" ?-data.elemHeight :data.my[ 1 ] === "bottom" ?data.elemHeight :0,atOffset = data.at[ 1 ] === "top" ?data.targetHeight :-data.targetHeight,offset = -2 * data.offset[ 1 ];position.top += position.top < 0 ?myOffset + data.targetHeight + offset :over > 0 ?myOffset + atOffset + offset :0;}}};// offset setter from jQuery 1.4if ( !$.offset.setOffset ) {$.offset.setOffset = function( elem, options ) {// set position first, in-case top/left are set even on static elemif ( /static/.test( $.curCSS( elem, "position" ) ) ) {elem.style.position = "relative";}var curElem = $( elem ),curOffset = curElem.offset(),curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,props = {top: (options.top - curOffset.top) + curTop,left: (options.left - curOffset.left) + curLeft};if ( 'using' in options ) {options.using.call( elem, props );} else {curElem.css( props );}};$.fn.offset = function( options ) {var elem = this[ 0 ];if ( !elem || !elem.ownerDocument ) { return null; }if ( options ) {return this.each(function() {$.offset.setOffset( this, options );});}return _offset.call( this );};}}( jQuery ));