Blame | Last modification | View Log | RSS feed
/** jQuery UI Position 1.8.5** Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)* Dual licensed under the MIT or GPL Version 2 licenses.* http://jquery.org/license** http://docs.jquery.com/UI/Position*/(function( $, undefined ) {$.ui = $.ui || {};var horizontalPositions = /left|center|right/,verticalPositions = /top|center|bottom/,center = "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 ),targetElem = target[0],collision = ( options.collision || "flip" ).split( " " ),offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],targetWidth,targetHeight,basePosition;if ( targetElem.nodeType === 9 ) {targetWidth = target.width();targetHeight = target.height();basePosition = { top: 0, left: 0 };} else if ( targetElem.scrollTo && targetElem.document ) {targetWidth = target.width();targetHeight = target.height();basePosition = { top: target.scrollTop(), left: target.scrollLeft() };} else if ( targetElem.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( [center] ) :verticalPositions.test( pos[0] ) ?[ center ].concat( pos ) :[ center, center ];}pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;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] === center ) {basePosition.left += targetWidth / 2;}if ( options.at[1] === "bottom" ) {basePosition.top += targetHeight;} else if ( options.at[1] === center ) {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(),marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,collisionWidth = elemWidth + marginLeft +parseInt( $.curCSS( this, "marginRight", true ) ) || 0,collisionHeight = elemHeight + marginTop +parseInt( $.curCSS( this, "marginBottom", true ) ) || 0,position = $.extend( {}, basePosition ),collisionPosition;if ( options.my[0] === "right" ) {position.left -= elemWidth;} else if ( options.my[0] === center ) {position.left -= elemWidth / 2;}if ( options.my[1] === "bottom" ) {position.top -= elemHeight;} else if ( options.my[1] === center ) {position.top -= elemHeight / 2;}// prevent fractions (see #5280)position.left = parseInt( position.left );position.top = parseInt( position.top );collisionPosition = {left: position.left - marginLeft,top: position.top - marginTop};$.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,collisionPosition: collisionPosition,collisionWidth: collisionWidth,collisionHeight: collisionHeight,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 = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );},top: function( position, data ) {var win = $( window ),over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );}},flip: {left: function( position, data ) {if ( data.at[0] === center ) {return;}var win = $( window ),over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),myOffset = data.my[ 0 ] === "left" ?-data.elemWidth :data.my[ 0 ] === "right" ?data.elemWidth :0,atOffset = data.at[ 0 ] === "left" ?data.targetWidth :-data.targetWidth,offset = -2 * data.offset[ 0 ];position.left += data.collisionPosition.left < 0 ?myOffset + atOffset + offset :over > 0 ?myOffset + atOffset + offset :0;},top: function( position, data ) {if ( data.at[1] === center ) {return;}var win = $( window ),over = data.collisionPosition.top + data.collisionHeight - 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 += data.collisionPosition.top < 0 ?myOffset + atOffset + 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 ));