| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 | /*! jQuery UI - v1.12.1 - 2016-09-16 * http://jqueryui.com * Includes: position.js * Copyright jQuery Foundation and other contributors; Licensed MIT */(function( factory ) {    if ( typeof define === "function" && define.amd ) {        // AMD. Register as an anonymous module.        define([ "jquery" ], factory );    } else {        // Browser globals        factory( jQuery );    }}(function( $ ) {    $.ui = $.ui || {};    var version = $.ui.version = "1.12.1";    /*!     * jQuery UI Position 1.12.1     * http://jqueryui.com     *     * Copyright jQuery Foundation and other contributors     * Released under the MIT license.     * http://jquery.org/license     *     * http://api.jqueryui.com/position/     *///>>label: Position//>>group: Core//>>description: Positions elements relative to other elements.//>>docs: http://api.jqueryui.com/position///>>demos: http://jqueryui.com/position/    ( function() {        var cachedScrollbarWidth,            max = Math.max,            abs = Math.abs,            rhorizontal = /left|center|right/,            rvertical = /top|center|bottom/,            roffset = /[\+\-]\d+(\.[\d]+)?%?/,            rposition = /^\w+/,            rpercent = /%$/,            _position = $.fn.position;        function getOffsets( offsets, width, height ) {            return [                parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),                parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )            ];        }        function parseCss( element, property ) {            return parseInt( $.css( element, property ), 10 ) || 0;        }        function getDimensions( elem ) {            var raw = elem[ 0 ];            if ( raw.nodeType === 9 ) {                return {                    width: elem.width(),                    height: elem.height(),                    offset: { top: 0, left: 0 }                };            }            if ( $.isWindow( raw ) ) {                return {                    width: elem.width(),                    height: elem.height(),                    offset: { top: elem.scrollTop(), left: elem.scrollLeft() }                };            }            if ( raw.preventDefault ) {                return {                    width: 0,                    height: 0,                    offset: { top: raw.pageY, left: raw.pageX }                };            }            return {                width: elem.outerWidth(),                height: elem.outerHeight(),                offset: elem.offset()            };        }        $.position = {            scrollbarWidth: function() {                if ( cachedScrollbarWidth !== undefined ) {                    return cachedScrollbarWidth;                }                var w1, w2,                    div = $( "<div " +                        "style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +                        "<div style='height:100px;width:auto;'></div></div>" ),                    innerDiv = div.children()[ 0 ];                $( "body" ).append( div );                w1 = innerDiv.offsetWidth;                div.css( "overflow", "scroll" );                w2 = innerDiv.offsetWidth;                if ( w1 === w2 ) {                    w2 = div[ 0 ].clientWidth;                }                div.remove();                return ( cachedScrollbarWidth = w1 - w2 );            },            getScrollInfo: function( within ) {                var overflowX = within.isWindow || within.isDocument ? "" :                        within.element.css( "overflow-x" ),                    overflowY = within.isWindow || within.isDocument ? "" :                        within.element.css( "overflow-y" ),                    hasOverflowX = overflowX === "scroll" ||                        ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),                    hasOverflowY = overflowY === "scroll" ||                        ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );                return {                    width: hasOverflowY ? $.position.scrollbarWidth() : 0,                    height: hasOverflowX ? $.position.scrollbarWidth() : 0                };            },            getWithinInfo: function( element ) {                var withinElement = $( element || window ),                    isWindow = $.isWindow( withinElement[ 0 ] ),                    isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,                    hasOffset = !isWindow && !isDocument;                return {                    element: withinElement,                    isWindow: isWindow,                    isDocument: isDocument,                    offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },                    scrollLeft: withinElement.scrollLeft(),                    scrollTop: withinElement.scrollTop(),                    width: withinElement.outerWidth(),                    height: withinElement.outerHeight()                };            }        };        $.fn.position = function( options ) {            if ( !options || !options.of ) {                return _position.apply( this, arguments );            }            // Make a copy, we don't want to modify arguments            options = $.extend( {}, options );            var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,                target = $( options.of ),                within = $.position.getWithinInfo( options.within ),                scrollInfo = $.position.getScrollInfo( within ),                collision = ( options.collision || "flip" ).split( " " ),                offsets = {};            dimensions = getDimensions( target );            if ( target[ 0 ].preventDefault ) {                // Force left top to allow flipping                options.at = "left top";            }            targetWidth = dimensions.width;            targetHeight = dimensions.height;            targetOffset = dimensions.offset;            // Clone to reuse original targetOffset later            basePosition = $.extend( {}, targetOffset );            // Force my and at to have valid horizontal and vertical positions            // if a value is missing or invalid, it will be converted to center            $.each( [ "my", "at" ], function() {                var pos = ( options[ this ] || "" ).split( " " ),                    horizontalOffset,                    verticalOffset;                if ( pos.length === 1 ) {                    pos = rhorizontal.test( pos[ 0 ] ) ?                        pos.concat( [ "center" ] ) :                        rvertical.test( pos[ 0 ] ) ?                            [ "center" ].concat( pos ) :                            [ "center", "center" ];                }                pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";                pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";                // Calculate offsets                horizontalOffset = roffset.exec( pos[ 0 ] );                verticalOffset = roffset.exec( pos[ 1 ] );                offsets[ this ] = [                    horizontalOffset ? horizontalOffset[ 0 ] : 0,                    verticalOffset ? verticalOffset[ 0 ] : 0                ];                // Reduce to just the positions without the offsets                options[ this ] = [                    rposition.exec( pos[ 0 ] )[ 0 ],                    rposition.exec( pos[ 1 ] )[ 0 ]                ];            } );            // Normalize collision option            if ( collision.length === 1 ) {                collision[ 1 ] = collision[ 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;            }            atOffset = getOffsets( offsets.at, targetWidth, targetHeight );            basePosition.left += atOffset[ 0 ];            basePosition.top += atOffset[ 1 ];            return this.each( function() {                var collisionPosition, using,                    elem = $( this ),                    elemWidth = elem.outerWidth(),                    elemHeight = elem.outerHeight(),                    marginLeft = parseCss( this, "marginLeft" ),                    marginTop = parseCss( this, "marginTop" ),                    collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +                        scrollInfo.width,                    collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +                        scrollInfo.height,                    position = $.extend( {}, basePosition ),                    myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );                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;                }                position.left += myOffset[ 0 ];                position.top += myOffset[ 1 ];                collisionPosition = {                    marginLeft: marginLeft,                    marginTop: 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: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],                            my: options.my,                            at: options.at,                            within: within,                            elem: elem                        } );                    }                } );                if ( options.using ) {                    // Adds feedback as second argument to using callback, if present                    using = function( props ) {                        var left = targetOffset.left - position.left,                            right = left + targetWidth - elemWidth,                            top = targetOffset.top - position.top,                            bottom = top + targetHeight - elemHeight,                            feedback = {                                target: {                                    element: target,                                    left: targetOffset.left,                                    top: targetOffset.top,                                    width: targetWidth,                                    height: targetHeight                                },                                element: {                                    element: elem,                                    left: position.left,                                    top: position.top,                                    width: elemWidth,                                    height: elemHeight                                },                                horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",                                vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"                            };                        if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {                            feedback.horizontal = "center";                        }                        if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {                            feedback.vertical = "middle";                        }                        if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {                            feedback.important = "horizontal";                        } else {                            feedback.important = "vertical";                        }                        options.using.call( this, props, feedback );                    };                }                elem.offset( $.extend( position, { using: using } ) );            } );        };        $.ui.position = {            fit: {                left: function( position, data ) {                    var within = data.within,                        withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,                        outerWidth = within.width,                        collisionPosLeft = position.left - data.collisionPosition.marginLeft,                        overLeft = withinOffset - collisionPosLeft,                        overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,                        newOverRight;                    // Element is wider than within                    if ( data.collisionWidth > outerWidth ) {                        // Element is initially over the left side of within                        if ( overLeft > 0 && overRight <= 0 ) {                            newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -                                withinOffset;                            position.left += overLeft - newOverRight;                            // Element is initially over right side of within                        } else if ( overRight > 0 && overLeft <= 0 ) {                            position.left = withinOffset;                            // Element is initially over both left and right sides of within                        } else {                            if ( overLeft > overRight ) {                                position.left = withinOffset + outerWidth - data.collisionWidth;                            } else {                                position.left = withinOffset;                            }                        }                        // Too far left -> align with left edge                    } else if ( overLeft > 0 ) {                        position.left += overLeft;                        // Too far right -> align with right edge                    } else if ( overRight > 0 ) {                        position.left -= overRight;                        // Adjust based on position and margin                    } else {                        position.left = max( position.left - collisionPosLeft, position.left );                    }                },                top: function( position, data ) {                    var within = data.within,                        withinOffset = within.isWindow ? within.scrollTop : within.offset.top,                        outerHeight = data.within.height,                        collisionPosTop = position.top - data.collisionPosition.marginTop,                        overTop = withinOffset - collisionPosTop,                        overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,                        newOverBottom;                    // Element is taller than within                    if ( data.collisionHeight > outerHeight ) {                        // Element is initially over the top of within                        if ( overTop > 0 && overBottom <= 0 ) {                            newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -                                withinOffset;                            position.top += overTop - newOverBottom;                            // Element is initially over bottom of within                        } else if ( overBottom > 0 && overTop <= 0 ) {                            position.top = withinOffset;                            // Element is initially over both top and bottom of within                        } else {                            if ( overTop > overBottom ) {                                position.top = withinOffset + outerHeight - data.collisionHeight;                            } else {                                position.top = withinOffset;                            }                        }                        // Too far up -> align with top                    } else if ( overTop > 0 ) {                        position.top += overTop;                        // Too far down -> align with bottom edge                    } else if ( overBottom > 0 ) {                        position.top -= overBottom;                        // Adjust based on position and margin                    } else {                        position.top = max( position.top - collisionPosTop, position.top );                    }                }            },            flip: {                left: function( position, data ) {                    var within = data.within,                        withinOffset = within.offset.left + within.scrollLeft,                        outerWidth = within.width,                        offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,                        collisionPosLeft = position.left - data.collisionPosition.marginLeft,                        overLeft = collisionPosLeft - offsetLeft,                        overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,                        myOffset = data.my[ 0 ] === "left" ?                            -data.elemWidth :                            data.my[ 0 ] === "right" ?                                data.elemWidth :                                0,                        atOffset = data.at[ 0 ] === "left" ?                            data.targetWidth :                            data.at[ 0 ] === "right" ?                                -data.targetWidth :                                0,                        offset = -2 * data.offset[ 0 ],                        newOverRight,                        newOverLeft;                    if ( overLeft < 0 ) {                        newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -                            outerWidth - withinOffset;                        if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {                            position.left += myOffset + atOffset + offset;                        }                    } else if ( overRight > 0 ) {                        newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +                            atOffset + offset - offsetLeft;                        if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {                            position.left += myOffset + atOffset + offset;                        }                    }                },                top: function( position, data ) {                    var within = data.within,                        withinOffset = within.offset.top + within.scrollTop,                        outerHeight = within.height,                        offsetTop = within.isWindow ? within.scrollTop : within.offset.top,                        collisionPosTop = position.top - data.collisionPosition.marginTop,                        overTop = collisionPosTop - offsetTop,                        overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,                        top = data.my[ 1 ] === "top",                        myOffset = top ?                            -data.elemHeight :                            data.my[ 1 ] === "bottom" ?                                data.elemHeight :                                0,                        atOffset = data.at[ 1 ] === "top" ?                            data.targetHeight :                            data.at[ 1 ] === "bottom" ?                                -data.targetHeight :                                0,                        offset = -2 * data.offset[ 1 ],                        newOverTop,                        newOverBottom;                    if ( overTop < 0 ) {                        newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -                            outerHeight - withinOffset;                        if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {                            position.top += myOffset + atOffset + offset;                        }                    } else if ( overBottom > 0 ) {                        newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +                            offset - offsetTop;                        if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {                            position.top += myOffset + atOffset + offset;                        }                    }                }            },            flipfit: {                left: function() {                    $.ui.position.flip.left.apply( this, arguments );                    $.ui.position.fit.left.apply( this, arguments );                },                top: function() {                    $.ui.position.flip.top.apply( this, arguments );                    $.ui.position.fit.top.apply( this, arguments );                }            }        };    } )();    var position = $.ui.position;}));
 |