Upgraded to jQuery 1.12
authorAlexander Ebert <ebert@woltlab.com>
Sat, 16 Jul 2016 11:59:30 +0000 (13:59 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sat, 16 Jul 2016 15:05:04 +0000 (17:05 +0200)
wcfsetup/install/files/js/3rdParty/jquery-ui.js
wcfsetup/install/files/js/3rdParty/jquery-ui.min.js

index c3e8b7ea398a9dc1c674d9f35fa33e2b9bbae029..f416e6d5f712883545b1692d8398629e3fd332e9 100644 (file)
@@ -1,7 +1,7 @@
-/*! jQuery UI - v1.11.4 - 2015-06-18
+/*! jQuery UI - v1.12.0 - 2016-07-16
 * http://jqueryui.com
-* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+* Includes: widget.js, position.js, data.js, form-reset-mixin.js, keycode.js, scroll-parent.js, widgets/draggable.js, widgets/droppable.js, widgets/sortable.js, widgets/datepicker.js, widgets/mouse.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
 
 (function( factory ) {
        if ( typeof define === "function" && define.amd ) {
                factory( jQuery );
        }
 }(function( $ ) {
-/*!
- * jQuery UI Core 1.11.4
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/ui-core/
- */
 
-
-// $.ui might exist from components with no dependencies, e.g., $.ui.position
 $.ui = $.ui || {};
 
-$.extend( $.ui, {
-       version: "1.11.4",
-
-       keyCode: {
-               BACKSPACE: 8,
-               COMMA: 188,
-               DELETE: 46,
-               DOWN: 40,
-               END: 35,
-               ENTER: 13,
-               ESCAPE: 27,
-               HOME: 36,
-               LEFT: 37,
-               PAGE_DOWN: 34,
-               PAGE_UP: 33,
-               PERIOD: 190,
-               RIGHT: 39,
-               SPACE: 32,
-               TAB: 9,
-               UP: 38
-       }
-});
-
-// plugins
-$.fn.extend({
-       scrollParent: function( includeHidden ) {
-               var position = this.css( "position" ),
-                       excludeStaticParent = position === "absolute",
-                       overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
-                       scrollParent = this.parents().filter( function() {
-                               var parent = $( this );
-                               if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
-                                       return false;
-                               }
-                               return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
-                       }).eq( 0 );
-
-               return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
-       },
-
-       uniqueId: (function() {
-               var uuid = 0;
-
-               return function() {
-                       return this.each(function() {
-                               if ( !this.id ) {
-                                       this.id = "ui-id-" + ( ++uuid );
-                               }
-                       });
-               };
-       })(),
-
-       removeUniqueId: function() {
-               return this.each(function() {
-                       if ( /^ui-id-\d+$/.test( this.id ) ) {
-                               $( this ).removeAttr( "id" );
-                       }
-               });
-       }
-});
-
-// selectors
-function focusable( element, isTabIndexNotNaN ) {
-       var map, mapName, img,
-               nodeName = element.nodeName.toLowerCase();
-       if ( "area" === nodeName ) {
-               map = element.parentNode;
-               mapName = map.name;
-               if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
-                       return false;
-               }
-               img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
-               return !!img && visible( img );
-       }
-       return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
-               !element.disabled :
-               "a" === nodeName ?
-                       element.href || isTabIndexNotNaN :
-                       isTabIndexNotNaN) &&
-               // the element and all of its ancestors must be visible
-               visible( element );
-}
-
-function visible( element ) {
-       return $.expr.filters.visible( element ) &&
-               !$( element ).parents().addBack().filter(function() {
-                       return $.css( this, "visibility" ) === "hidden";
-               }).length;
-}
-
-$.extend( $.expr[ ":" ], {
-       data: $.expr.createPseudo ?
-               $.expr.createPseudo(function( dataName ) {
-                       return function( elem ) {
-                               return !!$.data( elem, dataName );
-                       };
-               }) :
-               // support: jQuery <1.8
-               function( elem, i, match ) {
-                       return !!$.data( elem, match[ 3 ] );
-               },
-
-       focusable: function( element ) {
-               return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
-       },
-
-       tabbable: function( element ) {
-               var tabIndex = $.attr( element, "tabindex" ),
-                       isTabIndexNaN = isNaN( tabIndex );
-               return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
-       }
-});
-
-// support: jQuery <1.8
-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
-       $.each( [ "Width", "Height" ], function( i, name ) {
-               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-                       type = name.toLowerCase(),
-                       orig = {
-                               innerWidth: $.fn.innerWidth,
-                               innerHeight: $.fn.innerHeight,
-                               outerWidth: $.fn.outerWidth,
-                               outerHeight: $.fn.outerHeight
-                       };
-
-               function reduce( elem, size, border, margin ) {
-                       $.each( side, function() {
-                               size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
-                               if ( border ) {
-                                       size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
-                               }
-                               if ( margin ) {
-                                       size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
-                               }
-                       });
-                       return size;
-               }
-
-               $.fn[ "inner" + name ] = function( size ) {
-                       if ( size === undefined ) {
-                               return orig[ "inner" + name ].call( this );
-                       }
-
-                       return this.each(function() {
-                               $( this ).css( type, reduce( this, size ) + "px" );
-                       });
-               };
-
-               $.fn[ "outer" + name] = function( size, margin ) {
-                       if ( typeof size !== "number" ) {
-                               return orig[ "outer" + name ].call( this, size );
-                       }
-
-                       return this.each(function() {
-                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
-                       });
-               };
-       });
-}
-
-// support: jQuery <1.8
-if ( !$.fn.addBack ) {
-       $.fn.addBack = function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter( selector )
-               );
-       };
-}
-
-// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
-if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
-       $.fn.removeData = (function( removeData ) {
-               return function( key ) {
-                       if ( arguments.length ) {
-                               return removeData.call( this, $.camelCase( key ) );
-                       } else {
-                               return removeData.call( this );
-                       }
-               };
-       })( $.fn.removeData );
-}
-
-// deprecated
-$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
-
-$.fn.extend({
-       focus: (function( orig ) {
-               return function( delay, fn ) {
-                       return typeof delay === "number" ?
-                               this.each(function() {
-                                       var elem = this;
-                                       setTimeout(function() {
-                                               $( elem ).focus();
-                                               if ( fn ) {
-                                                       fn.call( elem );
-                                               }
-                                       }, delay );
-                               }) :
-                               orig.apply( this, arguments );
-               };
-       })( $.fn.focus ),
-
-       disableSelection: (function() {
-               var eventType = "onselectstart" in document.createElement( "div" ) ?
-                       "selectstart" :
-                       "mousedown";
-
-               return function() {
-                       return this.bind( eventType + ".ui-disableSelection", function( event ) {
-                               event.preventDefault();
-                       });
-               };
-       })(),
-
-       enableSelection: function() {
-               return this.unbind( ".ui-disableSelection" );
-       },
-
-       zIndex: function( zIndex ) {
-               if ( zIndex !== undefined ) {
-                       return this.css( "zIndex", zIndex );
-               }
-
-               if ( this.length ) {
-                       var elem = $( this[ 0 ] ), position, value;
-                       while ( elem.length && elem[ 0 ] !== document ) {
-                               // Ignore z-index if position is set to a value where z-index is ignored by the browser
-                               // This makes behavior of this function consistent across browsers
-                               // WebKit always returns auto if the element is positioned
-                               position = elem.css( "position" );
-                               if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-                                       // IE returns 0 when zIndex is not specified
-                                       // other browsers return a string
-                                       // we ignore the case of nested elements with an explicit value of 0
-                                       // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
-                                       value = parseInt( elem.css( "zIndex" ), 10 );
-                                       if ( !isNaN( value ) && value !== 0 ) {
-                                               return value;
-                                       }
-                               }
-                               elem = elem.parent();
-                       }
-               }
-
-               return 0;
-       }
-});
-
-// $.ui.plugin is deprecated. Use $.widget() extensions instead.
-$.ui.plugin = {
-       add: function( module, option, set ) {
-               var i,
-                       proto = $.ui[ module ].prototype;
-               for ( i in set ) {
-                       proto.plugins[ i ] = proto.plugins[ i ] || [];
-                       proto.plugins[ i ].push( [ option, set[ i ] ] );
-               }
-       },
-       call: function( instance, name, args, allowDisconnected ) {
-               var i,
-                       set = instance.plugins[ name ];
-
-               if ( !set ) {
-                       return;
-               }
-
-               if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
-                       return;
-               }
-
-               for ( i = 0; i < set.length; i++ ) {
-                       if ( instance.options[ set[ i ][ 0 ] ] ) {
-                               set[ i ][ 1 ].apply( instance.element, args );
-                       }
-               }
-       }
-};
+var version = $.ui.version = "1.12.0";
 
 
 /*!
- * jQuery UI Widget 1.11.4
+ * jQuery UI Widget 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/jQuery.widget/
  */
 
+//>>label: Widget
+//>>group: Core
+//>>description: Provides a factory for creating stateful widgets with a common API.
+//>>docs: http://api.jqueryui.com/jQuery.widget/
+//>>demos: http://jqueryui.com/widget/
+
+
 
-var widget_uuid = 0,
-       widget_slice = Array.prototype.slice;
+var widgetUuid = 0;
+var widgetSlice = Array.prototype.slice;
 
-$.cleanData = (function( orig ) {
+$.cleanData = ( function( orig ) {
        return function( elems ) {
                var events, elem, i;
-               for ( i = 0; (elem = elems[i]) != null; i++ ) {
+               for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
                        try {
 
                                // Only trigger remove when necessary to save time
@@ -335,29 +52,34 @@ $.cleanData = (function( orig ) {
                                        $( elem ).triggerHandler( "remove" );
                                }
 
-                       // http://bugs.jquery.com/ticket/8235
+                       // Http://bugs.jquery.com/ticket/8235
                        } catch ( e ) {}
                }
                orig( elems );
        };
-})( $.cleanData );
+} )( $.cleanData );
 
 $.widget = function( name, base, prototype ) {
-       var fullName, existingConstructor, constructor, basePrototype,
-               // proxiedPrototype allows the provided prototype to remain unmodified
-               // so that it can be used as a mixin for multiple widgets (#8876)
-               proxiedPrototype = {},
-               namespace = name.split( "." )[ 0 ];
+       var existingConstructor, constructor, basePrototype;
 
+       // ProxiedPrototype allows the provided prototype to remain unmodified
+       // so that it can be used as a mixin for multiple widgets (#8876)
+       var proxiedPrototype = {};
+
+       var namespace = name.split( "." )[ 0 ];
        name = name.split( "." )[ 1 ];
-       fullName = namespace + "-" + name;
+       var fullName = namespace + "-" + name;
 
        if ( !prototype ) {
                prototype = base;
                base = $.Widget;
        }
 
-       // create selector for plugin
+       if ( $.isArray( prototype ) ) {
+               prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
+       }
+
+       // Create selector for plugin
        $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
                return !!$.data( elem, fullName );
        };
@@ -365,30 +87,35 @@ $.widget = function( name, base, prototype ) {
        $[ namespace ] = $[ namespace ] || {};
        existingConstructor = $[ namespace ][ name ];
        constructor = $[ namespace ][ name ] = function( options, element ) {
-               // allow instantiation without "new" keyword
+
+               // Allow instantiation without "new" keyword
                if ( !this._createWidget ) {
                        return new constructor( options, element );
                }
 
-               // allow instantiation without initializing for simple inheritance
+               // Allow instantiation without initializing for simple inheritance
                // must use "new" keyword (the code above always passes args)
                if ( arguments.length ) {
                        this._createWidget( options, element );
                }
        };
-       // extend with the existing constructor to carry over any static properties
+
+       // Extend with the existing constructor to carry over any static properties
        $.extend( constructor, existingConstructor, {
                version: prototype.version,
-               // copy the object used to create the prototype in case we need to
+
+               // Copy the object used to create the prototype in case we need to
                // redefine the widget later
                _proto: $.extend( {}, prototype ),
-               // track widgets that inherit from this widget in case this widget is
+
+               // Track widgets that inherit from this widget in case this widget is
                // redefined after a widget inherits from it
                _childConstructors: []
-       });
+       } );
 
        basePrototype = new base();
-       // we need to make the options hash a property directly on the new instance
+
+       // We need to make the options hash a property directly on the new instance
        // otherwise we'll modify the options hash on the prototype that we're
        // inheriting from
        basePrototype.options = $.widget.extend( {}, basePrototype.options );
@@ -397,17 +124,19 @@ $.widget = function( name, base, prototype ) {
                        proxiedPrototype[ prop ] = value;
                        return;
                }
-               proxiedPrototype[ prop ] = (function() {
-                       var _super = function() {
-                                       return base.prototype[ prop ].apply( this, arguments );
-                               },
-                               _superApply = function( args ) {
-                                       return base.prototype[ prop ].apply( this, args );
-                               };
+               proxiedPrototype[ prop ] = ( function() {
+                       function _super() {
+                               return base.prototype[ prop ].apply( this, arguments );
+                       }
+
+                       function _superApply( args ) {
+                               return base.prototype[ prop ].apply( this, args );
+                       }
+
                        return function() {
-                               var __super = this._super,
-                                       __superApply = this._superApply,
-                                       returnValue;
+                               var __super = this._super;
+                               var __superApply = this._superApply;
+                               var returnValue;
 
                                this._super = _super;
                                this._superApply = _superApply;
@@ -419,19 +148,20 @@ $.widget = function( name, base, prototype ) {
 
                                return returnValue;
                        };
-               })();
-       });
+               } )();
+       } );
        constructor.prototype = $.widget.extend( basePrototype, {
+
                // TODO: remove support for widgetEventPrefix
                // always use the name + a colon as the prefix, e.g., draggable:start
                // don't prefix for widgets that aren't DOM-based
-               widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
+               widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
        }, proxiedPrototype, {
                constructor: constructor,
                namespace: namespace,
                widgetName: name,
                widgetFullName: fullName
-       });
+       } );
 
        // If this widget is being redefined then we need to find all widgets that
        // are inheriting from it and redefine all of them so that they inherit from
@@ -441,11 +171,13 @@ $.widget = function( name, base, prototype ) {
                $.each( existingConstructor._childConstructors, function( i, child ) {
                        var childPrototype = child.prototype;
 
-                       // redefine the child widget using the same prototype that was
+                       // Redefine the child widget using the same prototype that was
                        // originally used, but inherit from the new version of the base
-                       $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
-               });
-               // remove the list of existing child constructors from the old constructor
+                       $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
+                               child._proto );
+               } );
+
+               // Remove the list of existing child constructors from the old constructor
                // so the old child constructors can be garbage collected
                delete existingConstructor._childConstructors;
        } else {
@@ -458,21 +190,25 @@ $.widget = function( name, base, prototype ) {
 };
 
 $.widget.extend = function( target ) {
-       var input = widget_slice.call( arguments, 1 ),
-               inputIndex = 0,
-               inputLength = input.length,
-               key,
-               value;
+       var input = widgetSlice.call( arguments, 1 );
+       var inputIndex = 0;
+       var inputLength = input.length;
+       var key;
+       var value;
+
        for ( ; inputIndex < inputLength; inputIndex++ ) {
                for ( key in input[ inputIndex ] ) {
                        value = input[ inputIndex ][ key ];
                        if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+
                                // Clone objects
                                if ( $.isPlainObject( value ) ) {
                                        target[ key ] = $.isPlainObject( target[ key ] ) ?
                                                $.widget.extend( {}, target[ key ], value ) :
+
                                                // Don't extend strings, arrays, etc. with objects
                                                $.widget.extend( {}, value );
+
                                // Copy everything else by reference
                                } else {
                                        target[ key ] = value;
@@ -486,41 +222,48 @@ $.widget.extend = function( target ) {
 $.widget.bridge = function( name, object ) {
        var fullName = object.prototype.widgetFullName || name;
        $.fn[ name ] = function( options ) {
-               var isMethodCall = typeof options === "string",
-                       args = widget_slice.call( arguments, 1 ),
-                       returnValue = this;
+               var isMethodCall = typeof options === "string";
+               var args = widgetSlice.call( arguments, 1 );
+               var returnValue = this;
 
                if ( isMethodCall ) {
-                       this.each(function() {
-                               var methodValue,
-                                       instance = $.data( this, fullName );
+                       this.each( function() {
+                               var methodValue;
+                               var instance = $.data( this, fullName );
+
                                if ( options === "instance" ) {
                                        returnValue = instance;
                                        return false;
                                }
+
                                if ( !instance ) {
-                                       return $.error( "cannot call methods on " + name + " prior to initialization; " +
+                                       return $.error( "cannot call methods on " + name +
+                                               " prior to initialization; " +
                                                "attempted to call method '" + options + "'" );
                                }
-                               if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
-                                       return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+
+                               if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
+                                       return $.error( "no such method '" + options + "' for " + name +
+                                               " widget instance" );
                                }
+
                                methodValue = instance[ options ].apply( instance, args );
+
                                if ( methodValue !== instance && methodValue !== undefined ) {
                                        returnValue = methodValue && methodValue.jquery ?
                                                returnValue.pushStack( methodValue.get() ) :
                                                methodValue;
                                        return false;
                                }
-                       });
+                       } );
                } else {
 
                        // Allow multiple hashes to be passed on init
                        if ( args.length ) {
-                               options = $.widget.extend.apply( null, [ options ].concat(args) );
+                               options = $.widget.extend.apply( null, [ options ].concat( args ) );
                        }
 
-                       this.each(function() {
+                       this.each( function() {
                                var instance = $.data( this, fullName );
                                if ( instance ) {
                                        instance.option( options || {} );
@@ -530,7 +273,7 @@ $.widget.bridge = function( name, object ) {
                                } else {
                                        $.data( this, fullName, new object( options, this ) );
                                }
-                       });
+                       } );
                }
 
                return returnValue;
@@ -544,21 +287,25 @@ $.Widget.prototype = {
        widgetName: "widget",
        widgetEventPrefix: "",
        defaultElement: "<div>",
+
        options: {
+               classes: {},
                disabled: false,
 
-               // callbacks
+               // Callbacks
                create: null
        },
+
        _createWidget: function( options, element ) {
                element = $( element || this.defaultElement || this )[ 0 ];
                this.element = $( element );
-               this.uuid = widget_uuid++;
+               this.uuid = widgetUuid++;
                this.eventNamespace = "." + this.widgetName + this.uuid;
 
                this.bindings = $();
                this.hoverable = $();
                this.focusable = $();
+               this.classesElementLookup = {};
 
                if ( element !== this ) {
                        $.data( element, this.widgetFullName, this );
@@ -568,13 +315,15 @@ $.Widget.prototype = {
                                                this.destroy();
                                        }
                                }
-                       });
+                       } );
                        this.document = $( element.style ?
-                               // element within the document
+
+                               // Element within the document
                                element.ownerDocument :
-                               // element is window or document
+
+                               // Element is window or document
                                element.document || element );
-                       this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+                       this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
                }
 
                this.options = $.widget.extend( {},
@@ -583,36 +332,46 @@ $.Widget.prototype = {
                        options );
 
                this._create();
+
+               if ( this.options.disabled ) {
+                       this._setOptionDisabled( this.options.disabled );
+               }
+
                this._trigger( "create", null, this._getCreateEventData() );
                this._init();
        },
-       _getCreateOptions: $.noop,
+
+       _getCreateOptions: function() {
+               return {};
+       },
+
        _getCreateEventData: $.noop,
+
        _create: $.noop,
+
        _init: $.noop,
 
        destroy: function() {
+               var that = this;
+
                this._destroy();
-               // we can probably remove the unbind calls in 2.0
+               $.each( this.classesElementLookup, function( key, value ) {
+                       that._removeClass( value, key );
+               } );
+
+               // We can probably remove the unbind calls in 2.0
                // all event bindings should go through this._on()
                this.element
-                       .unbind( this.eventNamespace )
-                       .removeData( this.widgetFullName )
-                       // support: jquery <1.6.3
-                       // http://bugs.jquery.com/ticket/9413
-                       .removeData( $.camelCase( this.widgetFullName ) );
+                       .off( this.eventNamespace )
+                       .removeData( this.widgetFullName );
                this.widget()
-                       .unbind( this.eventNamespace )
-                       .removeAttr( "aria-disabled" )
-                       .removeClass(
-                               this.widgetFullName + "-disabled " +
-                               "ui-state-disabled" );
+                       .off( this.eventNamespace )
+                       .removeAttr( "aria-disabled" );
 
-               // clean up events and states
-               this.bindings.unbind( this.eventNamespace );
-               this.hoverable.removeClass( "ui-state-hover" );
-               this.focusable.removeClass( "ui-state-focus" );
+               // Clean up events and states
+               this.bindings.off( this.eventNamespace );
        },
+
        _destroy: $.noop,
 
        widget: function() {
@@ -620,18 +379,20 @@ $.Widget.prototype = {
        },
 
        option: function( key, value ) {
-               var options = key,
-                       parts,
-                       curOption,
-                       i;
+               var options = key;
+               var parts;
+               var curOption;
+               var i;
 
                if ( arguments.length === 0 ) {
-                       // don't return a reference to the internal hash
+
+                       // Don't return a reference to the internal hash
                        return $.widget.extend( {}, this.options );
                }
 
                if ( typeof key === "string" ) {
-                       // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+
+                       // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
                        options = {};
                        parts = key.split( "." );
                        key = parts.shift();
@@ -658,6 +419,7 @@ $.Widget.prototype = {
 
                return this;
        },
+
        _setOptions: function( options ) {
                var key;
 
@@ -667,42 +429,139 @@ $.Widget.prototype = {
 
                return this;
        },
+
        _setOption: function( key, value ) {
+               if ( key === "classes" ) {
+                       this._setOptionClasses( value );
+               }
+
                this.options[ key ] = value;
 
                if ( key === "disabled" ) {
-                       this.widget()
-                               .toggleClass( this.widgetFullName + "-disabled", !!value );
+                       this._setOptionDisabled( value );
+               }
+
+               return this;
+       },
 
-                       // If the widget is becoming disabled, then nothing is interactive
-                       if ( value ) {
-                               this.hoverable.removeClass( "ui-state-hover" );
-                               this.focusable.removeClass( "ui-state-focus" );
+       _setOptionClasses: function( value ) {
+               var classKey, elements, currentElements;
+
+               for ( classKey in value ) {
+                       currentElements = this.classesElementLookup[ classKey ];
+                       if ( value[ classKey ] === this.options.classes[ classKey ] ||
+                                       !currentElements ||
+                                       !currentElements.length ) {
+                               continue;
                        }
+
+                       // We are doing this to create a new jQuery object because the _removeClass() call
+                       // on the next line is going to destroy the reference to the current elements being
+                       // tracked. We need to save a copy of this collection so that we can add the new classes
+                       // below.
+                       elements = $( currentElements.get() );
+                       this._removeClass( currentElements, classKey );
+
+                       // We don't use _addClass() here, because that uses this.options.classes
+                       // for generating the string of classes. We want to use the value passed in from
+                       // _setOption(), this is the new value of the classes option which was passed to
+                       // _setOption(). We pass this value directly to _classes().
+                       elements.addClass( this._classes( {
+                               element: elements,
+                               keys: classKey,
+                               classes: value,
+                               add: true
+                       } ) );
                }
+       },
 
-               return this;
+       _setOptionDisabled: function( value ) {
+               this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
+
+               // If the widget is becoming disabled, then nothing is interactive
+               if ( value ) {
+                       this._removeClass( this.hoverable, null, "ui-state-hover" );
+                       this._removeClass( this.focusable, null, "ui-state-focus" );
+               }
        },
 
        enable: function() {
-               return this._setOptions({ disabled: false });
+               return this._setOptions( { disabled: false } );
        },
+
        disable: function() {
-               return this._setOptions({ disabled: true });
+               return this._setOptions( { disabled: true } );
+       },
+
+       _classes: function( options ) {
+               var full = [];
+               var that = this;
+
+               options = $.extend( {
+                       element: this.element,
+                       classes: this.options.classes || {}
+               }, options );
+
+               function processClassString( classes, checkOption ) {
+                       var current, i;
+                       for ( i = 0; i < classes.length; i++ ) {
+                               current = that.classesElementLookup[ classes[ i ] ] || $();
+                               if ( options.add ) {
+                                       current = $( $.unique( current.get().concat( options.element.get() ) ) );
+                               } else {
+                                       current = $( current.not( options.element ).get() );
+                               }
+                               that.classesElementLookup[ classes[ i ] ] = current;
+                               full.push( classes[ i ] );
+                               if ( checkOption && options.classes[ classes[ i ] ] ) {
+                                       full.push( options.classes[ classes[ i ] ] );
+                               }
+                       }
+               }
+
+               if ( options.keys ) {
+                       processClassString( options.keys.match( /\S+/g ) || [], true );
+               }
+               if ( options.extra ) {
+                       processClassString( options.extra.match( /\S+/g ) || [] );
+               }
+
+               return full.join( " " );
+       },
+
+       _removeClass: function( element, keys, extra ) {
+               return this._toggleClass( element, keys, extra, false );
+       },
+
+       _addClass: function( element, keys, extra ) {
+               return this._toggleClass( element, keys, extra, true );
+       },
+
+       _toggleClass: function( element, keys, extra, add ) {
+               add = ( typeof add === "boolean" ) ? add : extra;
+               var shift = ( typeof element === "string" || element === null ),
+                       options = {
+                               extra: shift ? keys : extra,
+                               keys: shift ? element : keys,
+                               element: shift ? this.element : element,
+                               add: add
+                       };
+               options.element.toggleClass( this._classes( options ), add );
+               return this;
        },
 
        _on: function( suppressDisabledCheck, element, handlers ) {
-               var delegateElement,
-                       instance = this;
+               var delegateElement;
+               var instance = this;
 
-               // no suppressDisabledCheck flag, shuffle arguments
+               // No suppressDisabledCheck flag, shuffle arguments
                if ( typeof suppressDisabledCheck !== "boolean" ) {
                        handlers = element;
                        element = suppressDisabledCheck;
                        suppressDisabledCheck = false;
                }
 
-               // no element argument, shuffle and use this.element
+               // No element argument, shuffle and use this.element
                if ( !handlers ) {
                        handlers = element;
                        element = this.element;
@@ -714,39 +573,41 @@ $.Widget.prototype = {
 
                $.each( handlers, function( event, handler ) {
                        function handlerProxy() {
-                               // allow widgets to customize the disabled handling
+
+                               // Allow widgets to customize the disabled handling
                                // - disabled as an array instead of boolean
                                // - disabled class as method for disabling individual parts
                                if ( !suppressDisabledCheck &&
                                                ( instance.options.disabled === true ||
-                                                       $( this ).hasClass( "ui-state-disabled" ) ) ) {
+                                               $( this ).hasClass( "ui-state-disabled" ) ) ) {
                                        return;
                                }
                                return ( typeof handler === "string" ? instance[ handler ] : handler )
                                        .apply( instance, arguments );
                        }
 
-                       // copy the guid so direct unbinding works
+                       // Copy the guid so direct unbinding works
                        if ( typeof handler !== "string" ) {
                                handlerProxy.guid = handler.guid =
                                        handler.guid || handlerProxy.guid || $.guid++;
                        }
 
-                       var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
-                               eventName = match[1] + instance.eventNamespace,
-                               selector = match[2];
+                       var match = event.match( /^([\w:-]*)\s*(.*)$/ );
+                       var eventName = match[ 1 ] + instance.eventNamespace;
+                       var selector = match[ 2 ];
+
                        if ( selector ) {
-                               delegateElement.delegate( selector, eventName, handlerProxy );
+                               delegateElement.on( eventName, selector, handlerProxy );
                        } else {
-                               element.bind( eventName, handlerProxy );
+                               element.on( eventName, handlerProxy );
                        }
-               });
+               } );
        },
 
        _off: function( element, eventName ) {
-               eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
+               eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
                        this.eventNamespace;
-               element.unbind( eventName ).undelegate( eventName );
+               element.off( eventName ).off( eventName );
 
                // Clear the stack to avoid memory leaks (#10056)
                this.bindings = $( this.bindings.not( element ).get() );
@@ -767,40 +628,41 @@ $.Widget.prototype = {
                this.hoverable = this.hoverable.add( element );
                this._on( element, {
                        mouseenter: function( event ) {
-                               $( event.currentTarget ).addClass( "ui-state-hover" );
+                               this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
                        },
                        mouseleave: function( event ) {
-                               $( event.currentTarget ).removeClass( "ui-state-hover" );
+                               this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
                        }
-               });
+               } );
        },
 
        _focusable: function( element ) {
                this.focusable = this.focusable.add( element );
                this._on( element, {
                        focusin: function( event ) {
-                               $( event.currentTarget ).addClass( "ui-state-focus" );
+                               this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
                        },
                        focusout: function( event ) {
-                               $( event.currentTarget ).removeClass( "ui-state-focus" );
+                               this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
                        }
-               });
+               } );
        },
 
        _trigger: function( type, event, data ) {
-               var prop, orig,
-                       callback = this.options[ type ];
+               var prop, orig;
+               var callback = this.options[ type ];
 
                data = data || {};
                event = $.Event( event );
                event.type = ( type === this.widgetEventPrefix ?
                        type :
                        this.widgetEventPrefix + type ).toLowerCase();
-               // the original event may come from any element
+
+               // The original event may come from any element
                // so we need to reset the target on the new event
                event.target = this.element[ 0 ];
 
-               // copy original event properties over to the new event
+               // Copy original event properties over to the new event
                orig = event.originalEvent;
                if ( orig ) {
                        for ( prop in orig ) {
@@ -812,7 +674,7 @@ $.Widget.prototype = {
 
                this.element.trigger( event, data );
                return !( $.isFunction( callback ) &&
-                       callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+                       callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
                        event.isDefaultPrevented() );
        }
 };
@@ -822,265 +684,108 @@ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
                if ( typeof options === "string" ) {
                        options = { effect: options };
                }
-               var hasOptions,
-                       effectName = !options ?
-                               method :
-                               options === true || typeof options === "number" ?
-                                       defaultEffect :
-                                       options.effect || defaultEffect;
+
+               var hasOptions;
+               var effectName = !options ?
+                       method :
+                       options === true || typeof options === "number" ?
+                               defaultEffect :
+                               options.effect || defaultEffect;
+
                options = options || {};
                if ( typeof options === "number" ) {
                        options = { duration: options };
                }
+
                hasOptions = !$.isEmptyObject( options );
                options.complete = callback;
+
                if ( options.delay ) {
                        element.delay( options.delay );
                }
+
                if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
                        element[ method ]( options );
                } else if ( effectName !== method && element[ effectName ] ) {
                        element[ effectName ]( options.duration, options.easing, callback );
                } else {
-                       element.queue(function( next ) {
+                       element.queue( function( next ) {
                                $( this )[ method ]();
                                if ( callback ) {
                                        callback.call( element[ 0 ] );
                                }
                                next();
-                       });
+                       } );
                }
        };
-});
+} );
 
 var widget = $.widget;
 
 
 /*!
- * jQuery UI Mouse 1.11.4
+ * jQuery UI Position 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://api.jqueryui.com/mouse/
+ * 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/
 
-var mouseHandled = false;
-$( document ).mouseup( function() {
-       mouseHandled = false;
-});
-
-var mouse = $.widget("ui.mouse", {
-       version: "1.11.4",
-       options: {
-               cancel: "input,textarea,button,select,option",
-               distance: 1,
-               delay: 0
-       },
-       _mouseInit: function() {
-               var that = this;
-
-               this.element
-                       .bind("mousedown." + this.widgetName, function(event) {
-                               return that._mouseDown(event);
-                       })
-                       .bind("click." + this.widgetName, function(event) {
-                               if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
-                                       $.removeData(event.target, that.widgetName + ".preventClickEvent");
-                                       event.stopImmediatePropagation();
-                                       return false;
-                               }
-                       });
-
-               this.started = false;
-       },
 
-       // TODO: make sure destroying one instance of mouse doesn't mess with
-       // other instances of mouse
-       _mouseDestroy: function() {
-               this.element.unbind("." + this.widgetName);
-               if ( this._mouseMoveDelegate ) {
-                       this.document
-                               .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
-                               .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
-               }
-       },
+( function() {
+var cachedScrollbarWidth, supportsOffsetFractions,
+       max = Math.max,
+       abs = Math.abs,
+       round = Math.round,
+       rhorizontal = /left|center|right/,
+       rvertical = /top|center|bottom/,
+       roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+       rposition = /^\w+/,
+       rpercent = /%$/,
+       _position = $.fn.position;
 
-       _mouseDown: function(event) {
-               // don't let more than one widget handle mouseStart
-               if ( mouseHandled ) {
-                       return;
-               }
+// Support: IE <=9 only
+supportsOffsetFractions = function() {
+       var element = $( "<div>" )
+                       .css( "position", "absolute" )
+                       .appendTo( "body" )
+                       .offset( {
+                               top: 1.5,
+                               left: 1.5
+                       } ),
+               support = element.offset().top === 1.5;
+
+       element.remove();
+
+       supportsOffsetFractions = function() {
+               return support;
+       };
 
-               this._mouseMoved = false;
+       return support;
+};
 
-               // we may have missed mouseup (out of window)
-               (this._mouseStarted && this._mouseUp(event));
+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 )
+       ];
+}
 
-               this._mouseDownEvent = event;
-
-               var that = this,
-                       btnIsLeft = (event.which === 1),
-                       // event.target.nodeName works around a bug in IE 8 with
-                       // disabled inputs (#7620)
-                       elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
-               if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
-                       return true;
-               }
-
-               this.mouseDelayMet = !this.options.delay;
-               if (!this.mouseDelayMet) {
-                       this._mouseDelayTimer = setTimeout(function() {
-                               that.mouseDelayMet = true;
-                       }, this.options.delay);
-               }
-
-               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-                       this._mouseStarted = (this._mouseStart(event) !== false);
-                       if (!this._mouseStarted) {
-                               event.preventDefault();
-                               return true;
-                       }
-               }
-
-               // Click event may never have fired (Gecko & Opera)
-               if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
-                       $.removeData(event.target, this.widgetName + ".preventClickEvent");
-               }
-
-               // these delegates are required to keep context
-               this._mouseMoveDelegate = function(event) {
-                       return that._mouseMove(event);
-               };
-               this._mouseUpDelegate = function(event) {
-                       return that._mouseUp(event);
-               };
-
-               this.document
-                       .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
-                       .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
-               event.preventDefault();
-
-               mouseHandled = true;
-               return true;
-       },
-
-       _mouseMove: function(event) {
-               // Only check for mouseups outside the document if you've moved inside the document
-               // at least once. This prevents the firing of mouseup in the case of IE<9, which will
-               // fire a mousemove event if content is placed under the cursor. See #7778
-               // Support: IE <9
-               if ( this._mouseMoved ) {
-                       // IE mouseup check - mouseup happened when mouse was out of window
-                       if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
-                               return this._mouseUp(event);
-
-                       // Iframe mouseup check - mouseup occurred in another document
-                       } else if ( !event.which ) {
-                               return this._mouseUp( event );
-                       }
-               }
-
-               if ( event.which || event.button ) {
-                       this._mouseMoved = true;
-               }
-
-               if (this._mouseStarted) {
-                       this._mouseDrag(event);
-                       return event.preventDefault();
-               }
-
-               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-                       this._mouseStarted =
-                               (this._mouseStart(this._mouseDownEvent, event) !== false);
-                       (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
-               }
-
-               return !this._mouseStarted;
-       },
-
-       _mouseUp: function(event) {
-               this.document
-                       .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
-                       .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
-               if (this._mouseStarted) {
-                       this._mouseStarted = false;
-
-                       if (event.target === this._mouseDownEvent.target) {
-                               $.data(event.target, this.widgetName + ".preventClickEvent", true);
-                       }
-
-                       this._mouseStop(event);
-               }
-
-               mouseHandled = false;
-               return false;
-       },
-
-       _mouseDistanceMet: function(event) {
-               return (Math.max(
-                               Math.abs(this._mouseDownEvent.pageX - event.pageX),
-                               Math.abs(this._mouseDownEvent.pageY - event.pageY)
-                       ) >= this.options.distance
-               );
-       },
-
-       _mouseDelayMet: function(/* event */) {
-               return this.mouseDelayMet;
-       },
-
-       // These are placeholder methods, to be overriden by extending plugin
-       _mouseStart: function(/* event */) {},
-       _mouseDrag: function(/* event */) {},
-       _mouseStop: function(/* event */) {},
-       _mouseCapture: function(/* event */) { return true; }
-});
-
-
-/*!
- * jQuery UI Position 1.11.4
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/position/
- */
-
-(function() {
-
-$.ui = $.ui || {};
-
-var cachedScrollbarWidth, supportsOffsetFractions,
-       max = Math.max,
-       abs = Math.abs,
-       round = Math.round,
-       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 parseCss( element, property ) {
+       return parseInt( $.css( element, property ), 10 ) || 0;
+}
 
 function getDimensions( elem ) {
-       var raw = elem[0];
+       var raw = elem[ 0 ];
        if ( raw.nodeType === 9 ) {
                return {
                        width: elem.width(),
@@ -1115,8 +820,10 @@ $.position = {
                        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];
+                       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;
@@ -1125,12 +832,12 @@ $.position = {
                w2 = innerDiv.offsetWidth;
 
                if ( w1 === w2 ) {
-                       w2 = div[0].clientWidth;
+                       w2 = div[ 0 ].clientWidth;
                }
 
                div.remove();
 
-               return (cachedScrollbarWidth = w1 - w2);
+               return ( cachedScrollbarWidth = w1 - w2 );
        },
        getScrollInfo: function( within ) {
                var overflowX = within.isWindow || within.isDocument ? "" :
@@ -1138,9 +845,9 @@ $.position = {
                        overflowY = within.isWindow || within.isDocument ? "" :
                                within.element.css( "overflow-y" ),
                        hasOverflowX = overflowX === "scroll" ||
-                               ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
+                               ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
                        hasOverflowY = overflowY === "scroll" ||
-                               ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
+                               ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
                return {
                        width: hasOverflowY ? $.position.scrollbarWidth() : 0,
                        height: hasOverflowX ? $.position.scrollbarWidth() : 0
@@ -1148,20 +855,18 @@ $.position = {
        },
        getWithinInfo: function( element ) {
                var withinElement = $( element || window ),
-                       isWindow = $.isWindow( withinElement[0] ),
-                       isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
+                       isWindow = $.isWindow( withinElement[ 0 ] ),
+                       isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
+                       hasOffset = !isWindow && !isDocument;
                return {
                        element: withinElement,
                        isWindow: isWindow,
                        isDocument: isDocument,
-                       offset: withinElement.offset() || { left: 0, top: 0 },
+                       offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
                        scrollLeft: withinElement.scrollLeft(),
                        scrollTop: withinElement.scrollTop(),
-
-                       // support: jQuery 1.6.x
-                       // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
-                       width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
-                       height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
+                       width: withinElement.outerWidth(),
+                       height: withinElement.outerHeight()
                };
        }
 };
@@ -1171,7 +876,7 @@ $.fn.position = function( options ) {
                return _position.apply( this, arguments );
        }
 
-       // make a copy, we don't want to modify arguments
+       // Make a copy, we don't want to modify arguments
        options = $.extend( {}, options );
 
        var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
@@ -1182,24 +887,26 @@ $.fn.position = function( options ) {
                offsets = {};
 
        dimensions = getDimensions( target );
-       if ( target[0].preventDefault ) {
-               // force left top to allow flipping
+       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
+
+       // Clone to reuse original targetOffset later
        basePosition = $.extend( {}, targetOffset );
 
-       // force my and at to have valid horizontal and vertical positions
+       // 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) {
+               if ( pos.length === 1 ) {
                        pos = rhorizontal.test( pos[ 0 ] ) ?
                                pos.concat( [ "center" ] ) :
                                rvertical.test( pos[ 0 ] ) ?
@@ -1209,7 +916,7 @@ $.fn.position = function( options ) {
                pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
                pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
 
-               // calculate offsets
+               // Calculate offsets
                horizontalOffset = roffset.exec( pos[ 0 ] );
                verticalOffset = roffset.exec( pos[ 1 ] );
                offsets[ this ] = [
@@ -1217,14 +924,14 @@ $.fn.position = function( options ) {
                        verticalOffset ? verticalOffset[ 0 ] : 0
                ];
 
-               // reduce to just the positions without the offsets
+               // Reduce to just the positions without the offsets
                options[ this ] = [
                        rposition.exec( pos[ 0 ] )[ 0 ],
                        rposition.exec( pos[ 1 ] )[ 0 ]
                ];
-       });
+       } );
 
-       // normalize collision option
+       // Normalize collision option
        if ( collision.length === 1 ) {
                collision[ 1 ] = collision[ 0 ];
        }
@@ -1245,15 +952,17 @@ $.fn.position = function( options ) {
        basePosition.left += atOffset[ 0 ];
        basePosition.top += atOffset[ 1 ];
 
-       return this.each(function() {
+       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,
+                       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() );
 
@@ -1272,8 +981,8 @@ $.fn.position = function( options ) {
                position.left += myOffset[ 0 ];
                position.top += myOffset[ 1 ];
 
-               // if the browser doesn't support fractions, then round for consistent results
-               if ( !supportsOffsetFractions ) {
+               // If the browser doesn't support fractions, then round for consistent results
+               if ( !supportsOffsetFractions() ) {
                        position.left = round( position.left );
                        position.top = round( position.top );
                }
@@ -1298,12 +1007,13 @@ $.fn.position = function( options ) {
                                        at: options.at,
                                        within: within,
                                        elem: elem
-                               });
+                               } );
                        }
-               });
+               } );
 
                if ( options.using ) {
-                       // adds feedback as second argument to using callback, if present
+
+                       // Adds feedback as second argument to using callback, if present
                        using = function( props ) {
                                var left = targetOffset.left - position.left,
                                        right = left + targetWidth - elemWidth,
@@ -1343,7 +1053,7 @@ $.fn.position = function( options ) {
                }
 
                elem.offset( $.extend( position, { using: using } ) );
-       });
+       } );
 };
 
 $.ui.position = {
@@ -1357,16 +1067,20 @@ $.ui.position = {
                                overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
                                newOverRight;
 
-                       // element is wider than within
+                       // Element is wider than within
                        if ( data.collisionWidth > outerWidth ) {
-                               // element is initially over the left side of within
+
+                               // Element is initially over the left side of within
                                if ( overLeft > 0 && overRight <= 0 ) {
-                                       newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
+                                       newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
+                                               withinOffset;
                                        position.left += overLeft - newOverRight;
-                               // element is initially over right side of within
+
+                               // 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
+
+                               // Element is initially over both left and right sides of within
                                } else {
                                        if ( overLeft > overRight ) {
                                                position.left = withinOffset + outerWidth - data.collisionWidth;
@@ -1374,13 +1088,16 @@ $.ui.position = {
                                                position.left = withinOffset;
                                        }
                                }
-                       // too far left -> align with left edge
+
+                       // Too far left -> align with left edge
                        } else if ( overLeft > 0 ) {
                                position.left += overLeft;
-                       // too far right -> align with right edge
+
+                       // Too far right -> align with right edge
                        } else if ( overRight > 0 ) {
                                position.left -= overRight;
-                       // adjust based on position and margin
+
+                       // Adjust based on position and margin
                        } else {
                                position.left = max( position.left - collisionPosLeft, position.left );
                        }
@@ -1394,16 +1111,20 @@ $.ui.position = {
                                overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
                                newOverBottom;
 
-                       // element is taller than within
+                       // Element is taller than within
                        if ( data.collisionHeight > outerHeight ) {
-                               // element is initially over the top of within
+
+                               // Element is initially over the top of within
                                if ( overTop > 0 && overBottom <= 0 ) {
-                                       newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
+                                       newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
+                                               withinOffset;
                                        position.top += overTop - newOverBottom;
-                               // element is initially over bottom of within
+
+                               // 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
+
+                               // Element is initially over both top and bottom of within
                                } else {
                                        if ( overTop > overBottom ) {
                                                position.top = withinOffset + outerHeight - data.collisionHeight;
@@ -1411,13 +1132,16 @@ $.ui.position = {
                                                position.top = withinOffset;
                                        }
                                }
-                       // too far up -> align with top
+
+                       // Too far up -> align with top
                        } else if ( overTop > 0 ) {
                                position.top += overTop;
-                       // too far down -> align with bottom edge
+
+                       // Too far down -> align with bottom edge
                        } else if ( overBottom > 0 ) {
                                position.top -= overBottom;
-                       // adjust based on position and margin
+
+                       // Adjust based on position and margin
                        } else {
                                position.top = max( position.top - collisionPosTop, position.top );
                        }
@@ -1447,12 +1171,14 @@ $.ui.position = {
                                newOverLeft;
 
                        if ( overLeft < 0 ) {
-                               newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
+                               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;
+                               newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
+                                       atOffset + offset - offsetLeft;
                                if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
                                        position.left += myOffset + atOffset + offset;
                                }
@@ -1481,12 +1207,14 @@ $.ui.position = {
                                newOverTop,
                                newOverBottom;
                        if ( overTop < 0 ) {
-                               newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
+                               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;
+                               newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
+                                       offset - offsetTop;
                                if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
                                        position.top += myOffset + atOffset + offset;
                                }
@@ -1505,208 +1233,629 @@ $.ui.position = {
        }
 };
 
-// fraction support test
-(function() {
-       var testElement, testElementParent, testElementStyle, offsetLeft, i,
-               body = document.getElementsByTagName( "body" )[ 0 ],
-               div = document.createElement( "div" );
-
-       //Create a "fake body" for testing based on method used in jQuery.support
-       testElement = document.createElement( body ? "div" : "body" );
-       testElementStyle = {
-               visibility: "hidden",
-               width: 0,
-               height: 0,
-               border: 0,
-               margin: 0,
-               background: "none"
-       };
-       if ( body ) {
-               $.extend( testElementStyle, {
-                       position: "absolute",
-                       left: "-1000px",
-                       top: "-1000px"
-               });
-       }
-       for ( i in testElementStyle ) {
-               testElement.style[ i ] = testElementStyle[ i ];
-       }
-       testElement.appendChild( div );
-       testElementParent = body || document.documentElement;
-       testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
-       div.style.cssText = "position: absolute; left: 10.7432222px;";
-
-       offsetLeft = $( div ).offset().left;
-       supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
-
-       testElement.innerHTML = "";
-       testElementParent.removeChild( testElement );
-})();
-
-})();
+} )();
 
 var position = $.ui.position;
 
 
 /*!
- * jQuery UI Draggable 1.11.4
+ * jQuery UI :data 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/draggable/
  */
 
+//>>label: :data Selector
+//>>group: Core
+//>>description: Selects elements which have data stored under the specified key.
+//>>docs: http://api.jqueryui.com/data-selector/
 
-$.widget("ui.draggable", $.ui.mouse, {
-       version: "1.11.4",
-       widgetEventPrefix: "drag",
-       options: {
-               addClasses: true,
-               appendTo: "parent",
-               axis: false,
-               connectToSortable: false,
-               containment: false,
-               cursor: "auto",
-               cursorAt: false,
-               grid: false,
-               handle: false,
-               helper: "original",
-               iframeFix: false,
-               opacity: false,
-               refreshPositions: false,
-               revert: false,
-               revertDuration: 500,
-               scope: "default",
-               scroll: true,
-               scrollSensitivity: 20,
-               scrollSpeed: 20,
-               snap: false,
-               snapMode: "both",
-               snapTolerance: 20,
-               stack: false,
-               zIndex: false,
 
-               // callbacks
-               drag: null,
-               start: null,
-               stop: null
-       },
-       _create: function() {
+var data = $.extend( $.expr[ ":" ], {
+       data: $.expr.createPseudo ?
+               $.expr.createPseudo( function( dataName ) {
+                       return function( elem ) {
+                               return !!$.data( elem, dataName );
+                       };
+               } ) :
 
-               if ( this.options.helper === "original" ) {
-                       this._setPositionRelative();
-               }
-               if (this.options.addClasses){
-                       this.element.addClass("ui-draggable");
-               }
-               if (this.options.disabled){
-                       this.element.addClass("ui-draggable-disabled");
+               // Support: jQuery <1.8
+               function( elem, i, match ) {
+                       return !!$.data( elem, match[ 3 ] );
                }
-               this._setHandleClassName();
+);
 
-               this._mouseInit();
-       },
 
-       _setOption: function( key, value ) {
-               this._super( key, value );
-               if ( key === "handle" ) {
-                       this._removeHandleClassName();
-                       this._setHandleClassName();
-               }
-       },
 
-       _destroy: function() {
-               if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
-                       this.destroyOnClear = true;
-                       return;
-               }
-               this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
-               this._removeHandleClassName();
-               this._mouseDestroy();
-       },
+// Support: IE8 Only
+// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
+// with a string, so we need to find the proper form.
+var form = $.fn.form = function() {
+       return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
+};
 
-       _mouseCapture: function(event) {
-               var o = this.options;
 
-               this._blurActiveElement( event );
+/*!
+ * jQuery UI Form Reset Mixin 1.12.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
 
-               // among others, prevent a drag on a resizable-handle
-               if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
-                       return false;
-               }
+//>>label: Form Reset Mixin
+//>>group: Core
+//>>description: Refresh input widgets when their form is reset
+//>>docs: http://api.jqueryui.com/form-reset-mixin/
 
-               //Quit if we're not on a valid handle
-               this.handle = this._getHandle(event);
-               if (!this.handle) {
-                       return false;
-               }
 
-               this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
 
-               return true;
+var formResetMixin = $.ui.formResetMixin = {
+       _formResetHandler: function() {
+               var form = $( this );
 
+               // Wait for the form reset to actually happen before refreshing
+               setTimeout( function() {
+                       var instances = form.data( "ui-form-reset-instances" );
+                       $.each( instances, function() {
+                               this.refresh();
+                       } );
+               } );
        },
 
-       _blockFrames: function( selector ) {
-               this.iframeBlocks = this.document.find( selector ).map(function() {
-                       var iframe = $( this );
+       _bindFormResetHandler: function() {
+               this.form = this.element.form();
+               if ( !this.form.length ) {
+                       return;
+               }
 
-                       return $( "<div>" )
-                               .css( "position", "absolute" )
-                               .appendTo( iframe.parent() )
-                               .outerWidth( iframe.outerWidth() )
-                               .outerHeight( iframe.outerHeight() )
-                               .offset( iframe.offset() )[ 0 ];
-               });
-       },
+               var instances = this.form.data( "ui-form-reset-instances" ) || [];
+               if ( !instances.length ) {
 
-       _unblockFrames: function() {
-               if ( this.iframeBlocks ) {
-                       this.iframeBlocks.remove();
-                       delete this.iframeBlocks;
+                       // We don't use _on() here because we use a single event handler per form
+                       this.form.on( "reset.ui-form-reset", this._formResetHandler );
                }
+               instances.push( this );
+               this.form.data( "ui-form-reset-instances", instances );
        },
 
-       _blurActiveElement: function( event ) {
-               var document = this.document[ 0 ];
-
-               // Only need to blur if the event occurred on the draggable itself, see #10527
-               if ( !this.handleElement.is( event.target ) ) {
+       _unbindFormResetHandler: function() {
+               if ( !this.form.length ) {
                        return;
                }
 
-               // support: IE9
-               // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
-               try {
+               var instances = this.form.data( "ui-form-reset-instances" );
+               instances.splice( $.inArray( this, instances ), 1 );
+               if ( instances.length ) {
+                       this.form.data( "ui-form-reset-instances", instances );
+               } else {
+                       this.form
+                               .removeData( "ui-form-reset-instances" )
+                               .off( "reset.ui-form-reset" );
+               }
+       }
+};
 
-                       // Support: IE9, IE10
-                       // If the <body> is blurred, IE will switch windows, see #9520
-                       if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
 
-                               // Blur any element that currently has focus, see #4261
-                               $( document.activeElement ).blur();
-                       }
-               } catch ( error ) {}
-       },
+/*!
+ * jQuery UI Keycode 1.12.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
 
-       _mouseStart: function(event) {
+//>>label: Keycode
+//>>group: Core
+//>>description: Provide keycodes as keynames
+//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
+
+
+var keycode = $.ui.keyCode = {
+       BACKSPACE: 8,
+       COMMA: 188,
+       DELETE: 46,
+       DOWN: 40,
+       END: 35,
+       ENTER: 13,
+       ESCAPE: 27,
+       HOME: 36,
+       LEFT: 37,
+       PAGE_DOWN: 34,
+       PAGE_UP: 33,
+       PERIOD: 190,
+       RIGHT: 39,
+       SPACE: 32,
+       TAB: 9,
+       UP: 38
+};
 
-               var o = this.options;
 
-               //Create and append the visible helper
-               this.helper = this._createHelper(event);
+/*!
+ * jQuery UI Scroll Parent 1.12.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
 
-               this.helper.addClass("ui-draggable-dragging");
+//>>label: scrollParent
+//>>group: Core
+//>>description: Get the closest ancestor element that is scrollable.
+//>>docs: http://api.jqueryui.com/scrollParent/
 
-               //Cache the helper size
-               this._cacheHelperProportions();
+
+
+var scrollParent = $.fn.scrollParent = function( includeHidden ) {
+       var position = this.css( "position" ),
+               excludeStaticParent = position === "absolute",
+               overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
+               scrollParent = this.parents().filter( function() {
+                       var parent = $( this );
+                       if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
+                               return false;
+                       }
+                       return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
+                               parent.css( "overflow-x" ) );
+               } ).eq( 0 );
+
+       return position === "fixed" || !scrollParent.length ?
+               $( this[ 0 ].ownerDocument || document ) :
+               scrollParent;
+};
+
+
+
+
+// This file is deprecated
+var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+
+/*!
+ * jQuery UI Mouse 1.12.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Mouse
+//>>group: Widgets
+//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
+//>>docs: http://api.jqueryui.com/mouse/
+
+
+
+var mouseHandled = false;
+$( document ).on( "mouseup", function() {
+       mouseHandled = false;
+} );
+
+var widgetsMouse = $.widget( "ui.mouse", {
+       version: "1.12.0",
+       options: {
+               cancel: "input, textarea, button, select, option",
+               distance: 1,
+               delay: 0
+       },
+       _mouseInit: function() {
+               var that = this;
+
+               this.element
+                       .on( "mousedown." + this.widgetName, function( event ) {
+                               return that._mouseDown( event );
+                       } )
+                       .on( "click." + this.widgetName, function( event ) {
+                               if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
+                                       $.removeData( event.target, that.widgetName + ".preventClickEvent" );
+                                       event.stopImmediatePropagation();
+                                       return false;
+                               }
+                       } );
+
+               this.started = false;
+       },
+
+       // TODO: make sure destroying one instance of mouse doesn't mess with
+       // other instances of mouse
+       _mouseDestroy: function() {
+               this.element.off( "." + this.widgetName );
+               if ( this._mouseMoveDelegate ) {
+                       this.document
+                               .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+                               .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
+               }
+       },
+
+       _mouseDown: function( event ) {
+
+               // don't let more than one widget handle mouseStart
+               if ( mouseHandled ) {
+                       return;
+               }
+
+               this._mouseMoved = false;
+
+               // We may have missed mouseup (out of window)
+               ( this._mouseStarted && this._mouseUp( event ) );
+
+               this._mouseDownEvent = event;
+
+               var that = this,
+                       btnIsLeft = ( event.which === 1 ),
+
+                       // event.target.nodeName works around a bug in IE 8 with
+                       // disabled inputs (#7620)
+                       elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
+                               $( event.target ).closest( this.options.cancel ).length : false );
+               if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
+                       return true;
+               }
+
+               this.mouseDelayMet = !this.options.delay;
+               if ( !this.mouseDelayMet ) {
+                       this._mouseDelayTimer = setTimeout( function() {
+                               that.mouseDelayMet = true;
+                       }, this.options.delay );
+               }
+
+               if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
+                       this._mouseStarted = ( this._mouseStart( event ) !== false );
+                       if ( !this._mouseStarted ) {
+                               event.preventDefault();
+                               return true;
+                       }
+               }
+
+               // Click event may never have fired (Gecko & Opera)
+               if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
+                       $.removeData( event.target, this.widgetName + ".preventClickEvent" );
+               }
+
+               // These delegates are required to keep context
+               this._mouseMoveDelegate = function( event ) {
+                       return that._mouseMove( event );
+               };
+               this._mouseUpDelegate = function( event ) {
+                       return that._mouseUp( event );
+               };
+
+               this.document
+                       .on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+                       .on( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+               event.preventDefault();
+
+               mouseHandled = true;
+               return true;
+       },
+
+       _mouseMove: function( event ) {
+
+               // Only check for mouseups outside the document if you've moved inside the document
+               // at least once. This prevents the firing of mouseup in the case of IE<9, which will
+               // fire a mousemove event if content is placed under the cursor. See #7778
+               // Support: IE <9
+               if ( this._mouseMoved ) {
+
+                       // IE mouseup check - mouseup happened when mouse was out of window
+                       if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
+                                       !event.button ) {
+                               return this._mouseUp( event );
+
+                       // Iframe mouseup check - mouseup occurred in another document
+                       } else if ( !event.which ) {
+
+                               // Support: Safari <=8 - 9
+                               // Safari sets which to 0 if you press any of the following keys
+                               // during a drag (#14461)
+                               if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
+                                               event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
+                                       this.ignoreMissingWhich = true;
+                               } else if ( !this.ignoreMissingWhich ) {
+                                       return this._mouseUp( event );
+                               }
+                       }
+               }
+
+               if ( event.which || event.button ) {
+                       this._mouseMoved = true;
+               }
+
+               if ( this._mouseStarted ) {
+                       this._mouseDrag( event );
+                       return event.preventDefault();
+               }
+
+               if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
+                       this._mouseStarted =
+                               ( this._mouseStart( this._mouseDownEvent, event ) !== false );
+                       ( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
+               }
+
+               return !this._mouseStarted;
+       },
+
+       _mouseUp: function( event ) {
+               this.document
+                       .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+                       .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+               if ( this._mouseStarted ) {
+                       this._mouseStarted = false;
+
+                       if ( event.target === this._mouseDownEvent.target ) {
+                               $.data( event.target, this.widgetName + ".preventClickEvent", true );
+                       }
+
+                       this._mouseStop( event );
+               }
+
+               if ( this._mouseDelayTimer ) {
+                       clearTimeout( this._mouseDelayTimer );
+                       delete this._mouseDelayTimer;
+               }
+
+               this.ignoreMissingWhich = false;
+               mouseHandled = false;
+               event.preventDefault();
+       },
+
+       _mouseDistanceMet: function( event ) {
+               return ( Math.max(
+                               Math.abs( this._mouseDownEvent.pageX - event.pageX ),
+                               Math.abs( this._mouseDownEvent.pageY - event.pageY )
+                       ) >= this.options.distance
+               );
+       },
+
+       _mouseDelayMet: function( /* event */ ) {
+               return this.mouseDelayMet;
+       },
+
+       // These are placeholder methods, to be overriden by extending plugin
+       _mouseStart: function( /* event */ ) {},
+       _mouseDrag: function( /* event */ ) {},
+       _mouseStop: function( /* event */ ) {},
+       _mouseCapture: function( /* event */ ) { return true; }
+} );
+
+
+
+
+// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+var plugin = $.ui.plugin = {
+       add: function( module, option, set ) {
+               var i,
+                       proto = $.ui[ module ].prototype;
+               for ( i in set ) {
+                       proto.plugins[ i ] = proto.plugins[ i ] || [];
+                       proto.plugins[ i ].push( [ option, set[ i ] ] );
+               }
+       },
+       call: function( instance, name, args, allowDisconnected ) {
+               var i,
+                       set = instance.plugins[ name ];
+
+               if ( !set ) {
+                       return;
+               }
+
+               if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
+                               instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+                       return;
+               }
+
+               for ( i = 0; i < set.length; i++ ) {
+                       if ( instance.options[ set[ i ][ 0 ] ] ) {
+                               set[ i ][ 1 ].apply( instance.element, args );
+                       }
+               }
+       }
+};
+
+
+
+var safeActiveElement = $.ui.safeActiveElement = function( document ) {
+       var activeElement;
+
+       // Support: IE 9 only
+       // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
+       try {
+               activeElement = document.activeElement;
+       } catch ( error ) {
+               activeElement = document.body;
+       }
+
+       // Support: IE 9 - 11 only
+       // IE may return null instead of an element
+       // Interestingly, this only seems to occur when NOT in an iframe
+       if ( !activeElement ) {
+               activeElement = document.body;
+       }
+
+       // Support: IE 11 only
+       // IE11 returns a seemingly empty object in some cases when accessing
+       // document.activeElement from an <iframe>
+       if ( !activeElement.nodeName ) {
+               activeElement = document.body;
+       }
+
+       return activeElement;
+};
+
+
+
+var safeBlur = $.ui.safeBlur = function( element ) {
+
+       // Support: IE9 - 10 only
+       // If the <body> is blurred, IE will switch windows, see #9420
+       if ( element && element.nodeName.toLowerCase() !== "body" ) {
+               $( element ).trigger( "blur" );
+       }
+};
+
+
+/*!
+ * jQuery UI Draggable 1.12.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Draggable
+//>>group: Interactions
+//>>description: Enables dragging functionality for any element.
+//>>docs: http://api.jqueryui.com/draggable/
+//>>demos: http://jqueryui.com/draggable/
+//>>css.structure: ../../themes/base/draggable.css
+
+
+
+$.widget( "ui.draggable", $.ui.mouse, {
+       version: "1.12.0",
+       widgetEventPrefix: "drag",
+       options: {
+               addClasses: true,
+               appendTo: "parent",
+               axis: false,
+               connectToSortable: false,
+               containment: false,
+               cursor: "auto",
+               cursorAt: false,
+               grid: false,
+               handle: false,
+               helper: "original",
+               iframeFix: false,
+               opacity: false,
+               refreshPositions: false,
+               revert: false,
+               revertDuration: 500,
+               scope: "default",
+               scroll: true,
+               scrollSensitivity: 20,
+               scrollSpeed: 20,
+               snap: false,
+               snapMode: "both",
+               snapTolerance: 20,
+               stack: false,
+               zIndex: false,
+
+               // Callbacks
+               drag: null,
+               start: null,
+               stop: null
+       },
+       _create: function() {
+
+               if ( this.options.helper === "original" ) {
+                       this._setPositionRelative();
+               }
+               if ( this.options.addClasses ) {
+                       this._addClass( "ui-draggable" );
+               }
+               this._setHandleClassName();
+
+               this._mouseInit();
+       },
+
+       _setOption: function( key, value ) {
+               this._super( key, value );
+               if ( key === "handle" ) {
+                       this._removeHandleClassName();
+                       this._setHandleClassName();
+               }
+       },
+
+       _destroy: function() {
+               if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
+                       this.destroyOnClear = true;
+                       return;
+               }
+               this._removeHandleClassName();
+               this._mouseDestroy();
+       },
+
+       _mouseCapture: function( event ) {
+               var o = this.options;
+
+               this._blurActiveElement( event );
+
+               // Among others, prevent a drag on a resizable-handle
+               if ( this.helper || o.disabled ||
+                               $( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
+                       return false;
+               }
+
+               //Quit if we're not on a valid handle
+               this.handle = this._getHandle( event );
+               if ( !this.handle ) {
+                       return false;
+               }
+
+               this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
+
+               return true;
+
+       },
+
+       _blockFrames: function( selector ) {
+               this.iframeBlocks = this.document.find( selector ).map( function() {
+                       var iframe = $( this );
+
+                       return $( "<div>" )
+                               .css( "position", "absolute" )
+                               .appendTo( iframe.parent() )
+                               .outerWidth( iframe.outerWidth() )
+                               .outerHeight( iframe.outerHeight() )
+                               .offset( iframe.offset() )[ 0 ];
+               } );
+       },
+
+       _unblockFrames: function() {
+               if ( this.iframeBlocks ) {
+                       this.iframeBlocks.remove();
+                       delete this.iframeBlocks;
+               }
+       },
+
+       _blurActiveElement: function( event ) {
+               var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
+                       target = $( event.target );
+
+               // Only blur if the event occurred on an element that is:
+               // 1) within the draggable handle
+               // 2) but not within the currently focused element
+               // See #10527, #12472
+               if ( this._getHandle( event ) && target.closest( activeElement ).length ) {
+                       return;
+               }
+
+               // Blur any element that currently has focus, see #4261
+               $.ui.safeBlur( activeElement );
+       },
+
+       _mouseStart: function( event ) {
+
+               var o = this.options;
+
+               //Create and append the visible helper
+               this.helper = this._createHelper( event );
+
+               this._addClass( this.helper, "ui-draggable-dragging" );
+
+               //Cache the helper size
+               this._cacheHelperProportions();
 
                //If ddmanager is used for droppables, set the global draggable
-               if ($.ui.ddmanager) {
+               if ( $.ui.ddmanager ) {
                        $.ui.ddmanager.current = this;
                }
 
@@ -1722,9 +1871,9 @@ $.widget("ui.draggable", $.ui.mouse, {
                this.cssPosition = this.helper.css( "position" );
                this.scrollParent = this.helper.scrollParent( true );
                this.offsetParent = this.helper.offsetParent();
-               this.hasFixedAncestor = this.helper.parents().filter(function() {
+               this.hasFixedAncestor = this.helper.parents().filter( function() {
                                return $( this ).css( "position" ) === "fixed";
-                       }).length > 0;
+                       } ).length > 0;
 
                //The element's absolute position on the page minus margins
                this.positionAbs = this.element.offset();
@@ -1736,13 +1885,13 @@ $.widget("ui.draggable", $.ui.mouse, {
                this.originalPageY = event.pageY;
 
                //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
-               (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+               ( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
 
                //Set a containment if given in the options
                this._setContainment();
 
                //Trigger event + callbacks
-               if (this._trigger("start", event) === false) {
+               if ( this._trigger( "start", event ) === false ) {
                        this._clear();
                        return false;
                }
@@ -1751,19 +1900,18 @@ $.widget("ui.draggable", $.ui.mouse, {
                this._cacheHelperProportions();
 
                //Prepare the droppable offsets
-               if ($.ui.ddmanager && !o.dropBehaviour) {
-                       $.ui.ddmanager.prepareOffsets(this, event);
+               if ( $.ui.ddmanager && !o.dropBehaviour ) {
+                       $.ui.ddmanager.prepareOffsets( this, event );
                }
 
-               // Reset helper's right/bottom css if they're set and set explicit width/height instead
-               // as this prevents resizing of elements with right/bottom set (see #7772)
-               this._normalizeRightBottom();
+               // Execute the drag once - this causes the helper not to be visible before getting its
+               // correct position
+               this._mouseDrag( event, true );
 
-               this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-
-               //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+               // If the ddmanager is used for droppables, inform the manager that dragging has started
+               // (see #5003)
                if ( $.ui.ddmanager ) {
-                       $.ui.ddmanager.dragStart(this, event);
+                       $.ui.ddmanager.dragStart( this, event );
                }
 
                return true;
@@ -1784,7 +1932,8 @@ $.widget("ui.draggable", $.ui.mouse, {
                };
        },
 
-       _mouseDrag: function(event, noPropagation) {
+       _mouseDrag: function( event, noPropagation ) {
+
                // reset any necessary cached properties (see #5009)
                if ( this.hasFixedAncestor ) {
                        this.offset.parent = this._getParentOffset();
@@ -1792,13 +1941,13 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                //Compute the helpers position
                this.position = this._generatePosition( event, true );
-               this.positionAbs = this._convertPositionTo("absolute");
+               this.positionAbs = this._convertPositionTo( "absolute" );
 
                //Call plugins and callbacks and use the resulting position if something is returned
-               if (!noPropagation) {
+               if ( !noPropagation ) {
                        var ui = this._uiHash();
-                       if (this._trigger("drag", event, ui) === false) {
-                               this._mouseUp({});
+                       if ( this._trigger( "drag", event, ui ) === false ) {
+                               this._mouseUp( new $.Event( "mouseup", event ) );
                                return false;
                        }
                        this.position = ui.position;
@@ -1807,36 +1956,44 @@ $.widget("ui.draggable", $.ui.mouse, {
                this.helper[ 0 ].style.left = this.position.left + "px";
                this.helper[ 0 ].style.top = this.position.top + "px";
 
-               if ($.ui.ddmanager) {
-                       $.ui.ddmanager.drag(this, event);
+               if ( $.ui.ddmanager ) {
+                       $.ui.ddmanager.drag( this, event );
                }
 
                return false;
        },
 
-       _mouseStop: function(event) {
+       _mouseStop: function( event ) {
 
                //If we are using droppables, inform the manager about the drop
                var that = this,
                        dropped = false;
-               if ($.ui.ddmanager && !this.options.dropBehaviour) {
-                       dropped = $.ui.ddmanager.drop(this, event);
+               if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
+                       dropped = $.ui.ddmanager.drop( this, event );
                }
 
                //if a drop comes from outside (a sortable)
-               if (this.dropped) {
+               if ( this.dropped ) {
                        dropped = this.dropped;
                        this.dropped = false;
                }
 
-               if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
-                       $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
-                               if (that._trigger("stop", event) !== false) {
-                                       that._clear();
+               if ( ( this.options.revert === "invalid" && !dropped ) ||
+                               ( this.options.revert === "valid" && dropped ) ||
+                               this.options.revert === true || ( $.isFunction( this.options.revert ) &&
+                               this.options.revert.call( this.element, dropped ) )
+               ) {
+                       $( this.helper ).animate(
+                               this.originalPosition,
+                               parseInt( this.options.revertDuration, 10 ),
+                               function() {
+                                       if ( that._trigger( "stop", event ) !== false ) {
+                                               that._clear();
+                                       }
                                }
-                       });
+                       );
                } else {
-                       if (this._trigger("stop", event) !== false) {
+                       if ( this._trigger( "stop", event ) !== false ) {
                                this._clear();
                        }
                }
@@ -1847,24 +2004,27 @@ $.widget("ui.draggable", $.ui.mouse, {
        _mouseUp: function( event ) {
                this._unblockFrames();
 
-               //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+               // If the ddmanager is used for droppables, inform the manager that dragging has stopped
+               // (see #5003)
                if ( $.ui.ddmanager ) {
-                       $.ui.ddmanager.dragStop(this, event);
+                       $.ui.ddmanager.dragStop( this, event );
                }
 
                // Only need to focus if the event occurred on the draggable itself, see #10527
                if ( this.handleElement.is( event.target ) ) {
-                       // The interaction is over; whether or not the click resulted in a drag, focus the element
-                       this.element.focus();
+
+                       // The interaction is over; whether or not the click resulted in a drag,
+                       // focus the element
+                       this.element.trigger( "focus" );
                }
 
-               return $.ui.mouse.prototype._mouseUp.call(this, event);
+               return $.ui.mouse.prototype._mouseUp.call( this, event );
        },
 
        cancel: function() {
 
-               if (this.helper.is(".ui-draggable-dragging")) {
-                       this._mouseUp({});
+               if ( this.helper.is( ".ui-draggable-dragging" ) ) {
+                       this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
                } else {
                        this._clear();
                }
@@ -1873,7 +2033,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 
        },
 
-       _getHandle: function(event) {
+       _getHandle: function( event ) {
                return this.options.handle ?
                        !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
                        true;
@@ -1882,14 +2042,14 @@ $.widget("ui.draggable", $.ui.mouse, {
        _setHandleClassName: function() {
                this.handleElement = this.options.handle ?
                        this.element.find( this.options.handle ) : this.element;
-               this.handleElement.addClass( "ui-draggable-handle" );
+               this._addClass( this.handleElement, "ui-draggable-handle" );
        },
 
        _removeHandleClassName: function() {
-               this.handleElement.removeClass( "ui-draggable-handle" );
+               this._removeClass( this.handleElement, "ui-draggable-handle" );
        },
 
-       _createHelper: function(event) {
+       _createHelper: function( event ) {
 
                var o = this.options,
                        helperIsFunction = $.isFunction( o.helper ),
@@ -1899,19 +2059,22 @@ $.widget("ui.draggable", $.ui.mouse, {
                                        this.element.clone().removeAttr( "id" ) :
                                        this.element );
 
-               if (!helper.parents("body").length) {
-                       helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
+               if ( !helper.parents( "body" ).length ) {
+                       helper.appendTo( ( o.appendTo === "parent" ?
+                               this.element[ 0 ].parentNode :
+                               o.appendTo ) );
                }
 
-               // http://bugs.jqueryui.com/ticket/9446
+               // Http://bugs.jqueryui.com/ticket/9446
                // a helper function can return the original element
                // which wouldn't have been set to relative in _create
                if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
                        this._setPositionRelative();
                }
 
-               if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
-                       helper.css("position", "absolute");
+               if ( helper[ 0 ] !== this.element[ 0 ] &&
+                               !( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
+                       helper.css( "position", "absolute" );
                }
 
                return helper;
@@ -1924,23 +2087,23 @@ $.widget("ui.draggable", $.ui.mouse, {
                }
        },
 
-       _adjustOffsetFromHelper: function(obj) {
-               if (typeof obj === "string") {
-                       obj = obj.split(" ");
+       _adjustOffsetFromHelper: function( obj ) {
+               if ( typeof obj === "string" ) {
+                       obj = obj.split( " " );
                }
-               if ($.isArray(obj)) {
-                       obj = { left: +obj[0], top: +obj[1] || 0 };
+               if ( $.isArray( obj ) ) {
+                       obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
                }
-               if ("left" in obj) {
+               if ( "left" in obj ) {
                        this.offset.click.left = obj.left + this.margins.left;
                }
-               if ("right" in obj) {
+               if ( "right" in obj ) {
                        this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
                }
-               if ("top" in obj) {
+               if ( "top" in obj ) {
                        this.offset.click.top = obj.top + this.margins.top;
                }
-               if ("bottom" in obj) {
+               if ( "bottom" in obj ) {
                        this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
                }
        },
@@ -1955,11 +2118,15 @@ $.widget("ui.draggable", $.ui.mouse, {
                var po = this.offsetParent.offset(),
                        document = this.document[ 0 ];
 
-               // This is a special case where we need to modify a offset calculated on start, since the following happened:
-               // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-               //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+               // This is a special case where we need to modify a offset calculated on start, since the
+               // following happened:
+               // 1. The position of the helper is absolute, so it's position is calculated based on the
+               // next positioned parent
+               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
+               // the document, which means that the scroll is included in the initial calculation of the
+               // offset of the parent, and never recalculated upon drag
+               if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
+                               $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
                        po.left += this.scrollParent.scrollLeft();
                        po.top += this.scrollParent.scrollTop();
                }
@@ -1969,8 +2136,8 @@ $.widget("ui.draggable", $.ui.mouse, {
                }
 
                return {
-                       top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
-                       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
+                       top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
+                       left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
                };
 
        },
@@ -1984,18 +2151,20 @@ $.widget("ui.draggable", $.ui.mouse, {
                        scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
 
                return {
-                       top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
-                       left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
+                       top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
+                               ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
+                       left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
+                               ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
                };
 
        },
 
        _cacheMargins: function() {
                this.margins = {
-                       left: (parseInt(this.element.css("marginLeft"), 10) || 0),
-                       top: (parseInt(this.element.css("marginTop"), 10) || 0),
-                       right: (parseInt(this.element.css("marginRight"), 10) || 0),
-                       bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
+                       left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
+                       top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
+                       right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
+                       bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
                };
        },
 
@@ -2023,18 +2192,22 @@ $.widget("ui.draggable", $.ui.mouse, {
                        this.containment = [
                                $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
                                $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
-                               $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
-                               $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
+                               $( window ).scrollLeft() + $( window ).width() -
+                                       this.helperProportions.width - this.margins.left,
+                               $( window ).scrollTop() +
+                                       ( $( window ).height() || document.body.parentNode.scrollHeight ) -
+                                       this.helperProportions.height - this.margins.top
                        ];
                        return;
                }
 
-               if ( o.containment === "document") {
+               if ( o.containment === "document" ) {
                        this.containment = [
                                0,
                                0,
                                $( document ).width() - this.helperProportions.width - this.margins.left,
-                               ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
+                               ( $( document ).height() || document.body.parentNode.scrollHeight ) -
+                                       this.helperProportions.height - this.margins.top
                        ];
                        return;
                }
@@ -2058,8 +2231,10 @@ $.widget("ui.draggable", $.ui.mouse, {
                isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
 
                this.containment = [
-                       ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
-                       ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
+                       ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
+                               ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
+                       ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
+                               ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
                        ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
                                ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
                                ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
@@ -2076,9 +2251,9 @@ $.widget("ui.draggable", $.ui.mouse, {
                this.relativeContainer = c;
        },
 
-       _convertPositionTo: function(d, pos) {
+       _convertPositionTo: function( d, pos ) {
 
-               if (!pos) {
+               if ( !pos ) {
                        pos = this.position;
                }
 
@@ -2087,16 +2262,32 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                return {
                        top: (
-                               pos.top +                                                                                                                               // The absolute mouse position
-                               this.offset.relative.top * mod +                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.top * mod -                                                                          // The offsetParent's offset without borders (offset + border)
-                               ( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
+
+                               // The absolute mouse position
+                               pos.top +
+
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.top * mod +
+
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.top * mod -
+                               ( ( this.cssPosition === "fixed" ?
+                                       -this.offset.scroll.top :
+                                       ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
                        ),
                        left: (
-                               pos.left +                                                                                                                              // The absolute mouse position
-                               this.offset.relative.left * mod +                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.left * mod   -                                                                               // The offsetParent's offset without borders (offset + border)
-                               ( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
+
+                               // The absolute mouse position
+                               pos.left +
+
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.left * mod +
+
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.left * mod   -
+                               ( ( this.cssPosition === "fixed" ?
+                                       -this.offset.scroll.left :
+                                       ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
                        )
                };
 
@@ -2126,7 +2317,7 @@ $.widget("ui.draggable", $.ui.mouse, {
                // If we are not dragging yet, we won't check for options
                if ( constrainPosition ) {
                        if ( this.containment ) {
-                               if ( this.relativeContainer ){
+                               if ( this.relativeContainer ) {
                                        co = this.relativeContainer.offset();
                                        containment = [
                                                this.containment[ 0 ] + co.left,
@@ -2138,27 +2329,40 @@ $.widget("ui.draggable", $.ui.mouse, {
                                        containment = this.containment;
                                }
 
-                               if (event.pageX - this.offset.click.left < containment[0]) {
-                                       pageX = containment[0] + this.offset.click.left;
+                               if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
+                                       pageX = containment[ 0 ] + this.offset.click.left;
                                }
-                               if (event.pageY - this.offset.click.top < containment[1]) {
-                                       pageY = containment[1] + this.offset.click.top;
+                               if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
+                                       pageY = containment[ 1 ] + this.offset.click.top;
                                }
-                               if (event.pageX - this.offset.click.left > containment[2]) {
-                                       pageX = containment[2] + this.offset.click.left;
+                               if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
+                                       pageX = containment[ 2 ] + this.offset.click.left;
                                }
-                               if (event.pageY - this.offset.click.top > containment[3]) {
-                                       pageY = containment[3] + this.offset.click.top;
+                               if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
+                                       pageY = containment[ 3 ] + this.offset.click.top;
                                }
                        }
 
-                       if (o.grid) {
-                               //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
-                               top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
-                               pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+                       if ( o.grid ) {
+
+                               //Check for grid elements set to 0 to prevent divide by 0 error causing invalid
+                               // argument errors in IE (see ticket #6950)
+                               top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
+                                       this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
+                               pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
+                                       top - this.offset.click.top > containment[ 3 ] ) ?
+                                               top :
+                                               ( ( top - this.offset.click.top >= containment[ 1 ] ) ?
+                                                       top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
 
-                               left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
-                               pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+                               left = o.grid[ 0 ] ? this.originalPageX +
+                                       Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
+                                       this.originalPageX;
+                               pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
+                                       left - this.offset.click.left > containment[ 2 ] ) ?
+                                               left :
+                                               ( ( left - this.offset.click.left >= containment[ 0 ] ) ?
+                                                       left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
                        }
 
                        if ( o.axis === "y" ) {
@@ -2172,26 +2376,46 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                return {
                        top: (
-                               pageY -                                                                                                                                 // The absolute mouse position
-                               this.offset.click.top   -                                                                                               // Click offset (relative to the element)
-                               this.offset.relative.top -                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.top +                                                                                                // The offsetParent's offset without borders (offset + border)
-                               ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
+
+                               // The absolute mouse position
+                               pageY -
+
+                               // Click offset (relative to the element)
+                               this.offset.click.top -
+
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.top -
+
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.top +
+                               ( this.cssPosition === "fixed" ?
+                                       -this.offset.scroll.top :
+                                       ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
                        ),
                        left: (
-                               pageX -                                                                                                                                 // The absolute mouse position
-                               this.offset.click.left -                                                                                                // Click offset (relative to the element)
-                               this.offset.relative.left -                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.left +                                                                                               // The offsetParent's offset without borders (offset + border)
-                               ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
+
+                               // The absolute mouse position
+                               pageX -
+
+                               // Click offset (relative to the element)
+                               this.offset.click.left -
+
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.left -
+
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.left +
+                               ( this.cssPosition === "fixed" ?
+                                       -this.offset.scroll.left :
+                                       ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
                        )
                };
 
        },
 
        _clear: function() {
-               this.helper.removeClass("ui-draggable-dragging");
-               if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
+               this._removeClass( this.helper, "ui-draggable-dragging" );
+               if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
                        this.helper.remove();
                }
                this.helper = null;
@@ -2201,17 +2425,6 @@ $.widget("ui.draggable", $.ui.mouse, {
                }
        },
 
-       _normalizeRightBottom: function() {
-               if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
-                       this.helper.width( this.helper.width() );
-                       this.helper.css( "right", "auto" );
-               }
-               if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
-                       this.helper.height( this.helper.height() );
-                       this.helper.css( "bottom", "auto" );
-               }
-       },
-
        // From now on bulk stuff - mainly helpers
 
        _trigger: function( type, event, ui ) {
@@ -2237,33 +2450,33 @@ $.widget("ui.draggable", $.ui.mouse, {
                };
        }
 
-});
+} );
 
 $.ui.plugin.add( "draggable", "connectToSortable", {
        start: function( event, ui, draggable ) {
                var uiSortable = $.extend( {}, ui, {
                        item: draggable.element
-               });
+               } );
 
                draggable.sortables = [];
-               $( draggable.options.connectToSortable ).each(function() {
+               $( draggable.options.connectToSortable ).each( function() {
                        var sortable = $( this ).sortable( "instance" );
 
                        if ( sortable && !sortable.options.disabled ) {
                                draggable.sortables.push( sortable );
 
-                               // refreshPositions is called at drag start to refresh the containerCache
+                               // RefreshPositions is called at drag start to refresh the containerCache
                                // which is used in drag. This ensures it's initialized and synchronized
                                // with any changes that might have happened on the page since initialization.
                                sortable.refreshPositions();
-                               sortable._trigger("activate", event, uiSortable);
+                               sortable._trigger( "activate", event, uiSortable );
                        }
-               });
+               } );
        },
        stop: function( event, ui, draggable ) {
                var uiSortable = $.extend( {}, ui, {
                        item: draggable.element
-               });
+               } );
 
                draggable.cancelHelperRemoval = false;
 
@@ -2286,12 +2499,13 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
                                        left: sortable.placeholder.css( "left" )
                                };
 
-                               sortable._mouseStop(event);
+                               sortable._mouseStop( event );
 
                                // Once drag has ended, the sortable should return to using
                                // its original helper, not the shared helper from draggable
                                sortable.options.helper = sortable.options._helper;
                        } else {
+
                                // Prevent this Sortable from removing the helper.
                                // However, don't set the draggable to remove the helper
                                // either as another connected Sortable may yet handle the removal.
@@ -2299,7 +2513,7 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
 
                                sortable._trigger( "deactivate", event, uiSortable );
                        }
-               });
+               } );
        },
        drag: function( event, ui, draggable ) {
                $.each( draggable.sortables, function() {
@@ -2315,6 +2529,7 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
                                innermostIntersecting = true;
 
                                $.each( draggable.sortables, function() {
+
                                        // Copy over variables that sortable's _intersectsWith uses
                                        this.positionAbs = draggable.positionAbs;
                                        this.helperProportions = draggable.helperProportions;
@@ -2327,10 +2542,11 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
                                        }
 
                                        return innermostIntersecting;
-                               });
+                               } );
                        }
 
                        if ( innermostIntersecting ) {
+
                                // If it intersects, we use a little isOver variable and set it once,
                                // so that the move-in stuff gets fired only once.
                                if ( !sortable.isOver ) {
@@ -2375,21 +2591,23 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
                                        // adding to one sortable changes the location of the other sortables (#9675)
                                        $.each( draggable.sortables, function() {
                                                this.refreshPositions();
-                                       });
+                                       } );
 
-                                       // hack so receive/update callbacks work (mostly)
+                                       // Hack so receive/update callbacks work (mostly)
                                        draggable.currentItem = draggable.element;
                                        sortable.fromOutside = draggable;
                                }
 
                                if ( sortable.currentItem ) {
                                        sortable._mouseDrag( event );
+
                                        // Copy the sortable's position because the draggable's can potentially reflect
                                        // a relative position, while sortable is always absolute, which the dragged
                                        // element has now become. (#8809)
                                        ui.position = sortable.position;
                                }
                        } else {
+
                                // If it doesn't intersect with the sortable, and it intersected before,
                                // we fake the drag stop of the sortable, but make sure it doesn't remove
                                // the helper by using cancelHelperRemoval.
@@ -2406,7 +2624,7 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
                                        sortable._trigger( "out", event, sortable._uiHash( sortable ) );
                                        sortable._mouseStop( event, true );
 
-                                       // restore sortable behaviors that were modfied
+                                       // Restore sortable behaviors that were modfied
                                        // when the draggable entered the sortable area (#9481)
                                        sortable.options.revert = sortable.options._revert;
                                        sortable.options.helper = sortable.options._helper;
@@ -2430,55 +2648,56 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
                                        // from one sortable changes the location of other sortables (#9675)
                                        $.each( draggable.sortables, function() {
                                                this.refreshPositions();
-                                       });
+                                       } );
                                }
                        }
-               });
+               } );
        }
-});
+} );
 
-$.ui.plugin.add("draggable", "cursor", {
+$.ui.plugin.add( "draggable", "cursor", {
        start: function( event, ui, instance ) {
                var t = $( "body" ),
                        o = instance.options;
 
-               if (t.css("cursor")) {
-                       o._cursor = t.css("cursor");
+               if ( t.css( "cursor" ) ) {
+                       o._cursor = t.css( "cursor" );
                }
-               t.css("cursor", o.cursor);
+               t.css( "cursor", o.cursor );
        },
        stop: function( event, ui, instance ) {
                var o = instance.options;
-               if (o._cursor) {
-                       $("body").css("cursor", o._cursor);
+               if ( o._cursor ) {
+                       $( "body" ).css( "cursor", o._cursor );
                }
        }
-});
+} );
 
-$.ui.plugin.add("draggable", "opacity", {
+$.ui.plugin.add( "draggable", "opacity", {
        start: function( event, ui, instance ) {
                var t = $( ui.helper ),
                        o = instance.options;
-               if (t.css("opacity")) {
-                       o._opacity = t.css("opacity");
+               if ( t.css( "opacity" ) ) {
+                       o._opacity = t.css( "opacity" );
                }
-               t.css("opacity", o.opacity);
+               t.css( "opacity", o.opacity );
        },
        stop: function( event, ui, instance ) {
                var o = instance.options;
-               if (o._opacity) {
-                       $(ui.helper).css("opacity", o._opacity);
+               if ( o._opacity ) {
+                       $( ui.helper ).css( "opacity", o._opacity );
                }
        }
-});
+} );
 
-$.ui.plugin.add("draggable", "scroll", {
+$.ui.plugin.add( "draggable", "scroll", {
        start: function( event, ui, i ) {
                if ( !i.scrollParentNotHidden ) {
                        i.scrollParentNotHidden = i.helper.scrollParent( false );
                }
 
-               if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
+               if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
+                               i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
                        i.overflowOffset = i.scrollParentNotHidden.offset();
                }
        },
@@ -2491,7 +2710,8 @@ $.ui.plugin.add("draggable", "scroll", {
 
                if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
                        if ( !o.axis || o.axis !== "x" ) {
-                               if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
+                               if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
+                                               o.scrollSensitivity ) {
                                        scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
                                } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
                                        scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
@@ -2499,7 +2719,8 @@ $.ui.plugin.add("draggable", "scroll", {
                        }
 
                        if ( !o.axis || o.axis !== "y" ) {
-                               if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
+                               if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
+                                               o.scrollSensitivity ) {
                                        scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
                                } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
                                        scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
@@ -2508,49 +2729,56 @@ $.ui.plugin.add("draggable", "scroll", {
 
                } else {
 
-                       if (!o.axis || o.axis !== "x") {
-                               if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
-                                       scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-                               } else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
-                                       scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+                       if ( !o.axis || o.axis !== "x" ) {
+                               if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
+                                       scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
+                               } else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
+                                               o.scrollSensitivity ) {
+                                       scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
                                }
                        }
 
-                       if (!o.axis || o.axis !== "y") {
-                               if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
-                                       scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-                               } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
-                                       scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+                       if ( !o.axis || o.axis !== "y" ) {
+                               if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
+                                       scrolled = $( document ).scrollLeft(
+                                               $( document ).scrollLeft() - o.scrollSpeed
+                                       );
+                               } else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
+                                               o.scrollSensitivity ) {
+                                       scrolled = $( document ).scrollLeft(
+                                               $( document ).scrollLeft() + o.scrollSpeed
+                                       );
                                }
                        }
 
                }
 
-               if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
-                       $.ui.ddmanager.prepareOffsets(i, event);
+               if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
+                       $.ui.ddmanager.prepareOffsets( i, event );
                }
 
        }
-});
+} );
 
-$.ui.plugin.add("draggable", "snap", {
+$.ui.plugin.add( "draggable", "snap", {
        start: function( event, ui, i ) {
 
                var o = i.options;
 
                i.snapElements = [];
 
-               $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
-                       var $t = $(this),
-                               $o = $t.offset();
-                       if (this !== i.element[0]) {
-                               i.snapElements.push({
-                                       item: this,
-                                       width: $t.outerWidth(), height: $t.outerHeight(),
-                                       top: $o.top, left: $o.left
-                               });
-                       }
-               });
+               $( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
+                       .each( function() {
+                               var $t = $( this ),
+                                       $o = $t.offset();
+                               if ( this !== i.element[ 0 ] ) {
+                                       i.snapElements.push( {
+                                               item: this,
+                                               width: $t.outerWidth(), height: $t.outerHeight(),
+                                               top: $o.top, left: $o.left
+                                       } );
+                               }
+                       } );
 
        },
        drag: function( event, ui, inst ) {
@@ -2561,136 +2789,177 @@ $.ui.plugin.add("draggable", "snap", {
                        x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
                        y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
 
-               for (i = inst.snapElements.length - 1; i >= 0; i--){
-
-                       l = inst.snapElements[i].left - inst.margins.left;
-                       r = l + inst.snapElements[i].width;
-                       t = inst.snapElements[i].top - inst.margins.top;
-                       b = t + inst.snapElements[i].height;
-
-                       if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
-                               if (inst.snapElements[i].snapping) {
-                                       (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+               for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
+
+                       l = inst.snapElements[ i ].left - inst.margins.left;
+                       r = l + inst.snapElements[ i ].width;
+                       t = inst.snapElements[ i ].top - inst.margins.top;
+                       b = t + inst.snapElements[ i ].height;
+
+                       if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
+                                       !$.contains( inst.snapElements[ i ].item.ownerDocument,
+                                       inst.snapElements[ i ].item ) ) {
+                               if ( inst.snapElements[ i ].snapping ) {
+                                       ( inst.options.snap.release &&
+                                               inst.options.snap.release.call(
+                                                       inst.element,
+                                                       event,
+                                                       $.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
+                                               ) );
                                }
-                               inst.snapElements[i].snapping = false;
+                               inst.snapElements[ i ].snapping = false;
                                continue;
                        }
 
-                       if (o.snapMode !== "inner") {
-                               ts = Math.abs(t - y2) <= d;
-                               bs = Math.abs(b - y1) <= d;
-                               ls = Math.abs(l - x2) <= d;
-                               rs = Math.abs(r - x1) <= d;
-                               if (ts) {
-                                       ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
+                       if ( o.snapMode !== "inner" ) {
+                               ts = Math.abs( t - y2 ) <= d;
+                               bs = Math.abs( b - y1 ) <= d;
+                               ls = Math.abs( l - x2 ) <= d;
+                               rs = Math.abs( r - x1 ) <= d;
+                               if ( ts ) {
+                                       ui.position.top = inst._convertPositionTo( "relative", {
+                                               top: t - inst.helperProportions.height,
+                                               left: 0
+                                       } ).top;
                                }
-                               if (bs) {
-                                       ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
+                               if ( bs ) {
+                                       ui.position.top = inst._convertPositionTo( "relative", {
+                                               top: b,
+                                               left: 0
+                                       } ).top;
                                }
-                               if (ls) {
-                                       ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
+                               if ( ls ) {
+                                       ui.position.left = inst._convertPositionTo( "relative", {
+                                               top: 0,
+                                               left: l - inst.helperProportions.width
+                                       } ).left;
                                }
-                               if (rs) {
-                                       ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
+                               if ( rs ) {
+                                       ui.position.left = inst._convertPositionTo( "relative", {
+                                               top: 0,
+                                               left: r
+                                       } ).left;
                                }
                        }
 
-                       first = (ts || bs || ls || rs);
+                       first = ( ts || bs || ls || rs );
 
-                       if (o.snapMode !== "outer") {
-                               ts = Math.abs(t - y1) <= d;
-                               bs = Math.abs(b - y2) <= d;
-                               ls = Math.abs(l - x1) <= d;
-                               rs = Math.abs(r - x2) <= d;
-                               if (ts) {
-                                       ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
+                       if ( o.snapMode !== "outer" ) {
+                               ts = Math.abs( t - y1 ) <= d;
+                               bs = Math.abs( b - y2 ) <= d;
+                               ls = Math.abs( l - x1 ) <= d;
+                               rs = Math.abs( r - x2 ) <= d;
+                               if ( ts ) {
+                                       ui.position.top = inst._convertPositionTo( "relative", {
+                                               top: t,
+                                               left: 0
+                                       } ).top;
                                }
-                               if (bs) {
-                                       ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
+                               if ( bs ) {
+                                       ui.position.top = inst._convertPositionTo( "relative", {
+                                               top: b - inst.helperProportions.height,
+                                               left: 0
+                                       } ).top;
                                }
-                               if (ls) {
-                                       ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
+                               if ( ls ) {
+                                       ui.position.left = inst._convertPositionTo( "relative", {
+                                               top: 0,
+                                               left: l
+                                       } ).left;
                                }
-                               if (rs) {
-                                       ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
+                               if ( rs ) {
+                                       ui.position.left = inst._convertPositionTo( "relative", {
+                                               top: 0,
+                                               left: r - inst.helperProportions.width
+                                       } ).left;
                                }
                        }
 
-                       if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
-                               (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+                       if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
+                               ( inst.options.snap.snap &&
+                                       inst.options.snap.snap.call(
+                                               inst.element,
+                                               event,
+                                               $.extend( inst._uiHash(), {
+                                                       snapItem: inst.snapElements[ i ].item
+                                               } ) ) );
                        }
-                       inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+                       inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
 
                }
 
        }
-});
+} );
 
-$.ui.plugin.add("draggable", "stack", {
+$.ui.plugin.add( "draggable", "stack", {
        start: function( event, ui, instance ) {
                var min,
                        o = instance.options,
-                       group = $.makeArray($(o.stack)).sort(function(a, b) {
-                               return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
-                       });
-
-               if (!group.length) { return; }
-
-               min = parseInt($(group[0]).css("zIndex"), 10) || 0;
-               $(group).each(function(i) {
-                       $(this).css("zIndex", min + i);
-               });
-               this.css("zIndex", (min + group.length));
+                       group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
+                               return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
+                                       ( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
+                       } );
+
+               if ( !group.length ) { return; }
+
+               min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
+               $( group ).each( function( i ) {
+                       $( this ).css( "zIndex", min + i );
+               } );
+               this.css( "zIndex", ( min + group.length ) );
        }
-});
+} );
 
-$.ui.plugin.add("draggable", "zIndex", {
+$.ui.plugin.add( "draggable", "zIndex", {
        start: function( event, ui, instance ) {
                var t = $( ui.helper ),
                        o = instance.options;
 
-               if (t.css("zIndex")) {
-                       o._zIndex = t.css("zIndex");
+               if ( t.css( "zIndex" ) ) {
+                       o._zIndex = t.css( "zIndex" );
                }
-               t.css("zIndex", o.zIndex);
+               t.css( "zIndex", o.zIndex );
        },
        stop: function( event, ui, instance ) {
                var o = instance.options;
 
-               if (o._zIndex) {
-                       $(ui.helper).css("zIndex", o._zIndex);
+               if ( o._zIndex ) {
+                       $( ui.helper ).css( "zIndex", o._zIndex );
                }
        }
-});
+} );
 
-var draggable = $.ui.draggable;
+var widgetsDraggable = $.ui.draggable;
 
 
 /*!
- * jQuery UI Droppable 1.11.4
+ * jQuery UI Droppable 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/droppable/
  */
 
+//>>label: Droppable
+//>>group: Interactions
+//>>description: Enables drop targets for draggable elements.
+//>>docs: http://api.jqueryui.com/droppable/
+//>>demos: http://jqueryui.com/droppable/
+
+
 
 $.widget( "ui.droppable", {
-       version: "1.11.4",
+       version: "1.12.0",
        widgetEventPrefix: "drop",
        options: {
                accept: "*",
-               activeClass: false,
                addClasses: true,
                greedy: false,
-               hoverClass: false,
                scope: "default",
                tolerance: "intersect",
 
-               // callbacks
+               // Callbacks
                activate: null,
                deactivate: null,
                drop: null,
@@ -2712,9 +2981,11 @@ $.widget( "ui.droppable", {
 
                this.proportions = function( /* valueToWrite */ ) {
                        if ( arguments.length ) {
+
                                // Store the droppable's proportions
                                proportions = arguments[ 0 ];
                        } else {
+
                                // Retrieve or derive the droppable's proportions
                                return proportions ?
                                        proportions :
@@ -2727,11 +2998,12 @@ $.widget( "ui.droppable", {
 
                this._addToManager( o.scope );
 
-               o.addClasses && this.element.addClass( "ui-droppable" );
+               o.addClasses && this._addClass( "ui-droppable" );
 
        },
 
        _addToManager: function( scope ) {
+
                // Add the reference and positions to the manager
                $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
                $.ui.ddmanager.droppables[ scope ].push( this );
@@ -2750,8 +3022,6 @@ $.widget( "ui.droppable", {
                var drop = $.ui.ddmanager.droppables[ this.options.scope ];
 
                this._splice( drop );
-
-               this.element.removeClass( "ui-droppable ui-droppable-disabled" );
        },
 
        _setOption: function( key, value ) {
@@ -2772,20 +3042,18 @@ $.widget( "ui.droppable", {
 
        _activate: function( event ) {
                var draggable = $.ui.ddmanager.current;
-               if ( this.options.activeClass ) {
-                       this.element.addClass( this.options.activeClass );
-               }
-               if ( draggable ){
+
+               this._addActiveClass();
+               if ( draggable ) {
                        this._trigger( "activate", event, this.ui( draggable ) );
                }
        },
 
        _deactivate: function( event ) {
                var draggable = $.ui.ddmanager.current;
-               if ( this.options.activeClass ) {
-                       this.element.removeClass( this.options.activeClass );
-               }
-               if ( draggable ){
+
+               this._removeActiveClass();
+               if ( draggable ) {
                        this._trigger( "deactivate", event, this.ui( draggable ) );
                }
        },
@@ -2795,14 +3063,14 @@ $.widget( "ui.droppable", {
                var draggable = $.ui.ddmanager.current;
 
                // Bail if draggable and droppable are same element
-               if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
+               if ( !draggable || ( draggable.currentItem ||
+                               draggable.element )[ 0 ] === this.element[ 0 ] ) {
                        return;
                }
 
-               if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
-                       if ( this.options.hoverClass ) {
-                               this.element.addClass( this.options.hoverClass );
-                       }
+               if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
+                               draggable.element ) ) ) {
+                       this._addHoverClass();
                        this._trigger( "over", event, this.ui( draggable ) );
                }
 
@@ -2813,14 +3081,14 @@ $.widget( "ui.droppable", {
                var draggable = $.ui.ddmanager.current;
 
                // Bail if draggable and droppable are same element
-               if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
+               if ( !draggable || ( draggable.currentItem ||
+                               draggable.element )[ 0 ] === this.element[ 0 ] ) {
                        return;
                }
 
-               if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
-                       if ( this.options.hoverClass ) {
-                               this.element.removeClass( this.options.hoverClass );
-                       }
+               if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
+                               draggable.element ) ) ) {
+                       this._removeHoverClass();
                        this._trigger( "out", event, this.ui( draggable ) );
                }
 
@@ -2832,31 +3100,41 @@ $.widget( "ui.droppable", {
                        childrenIntersection = false;
 
                // Bail if draggable and droppable are same element
-               if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
+               if ( !draggable || ( draggable.currentItem ||
+                               draggable.element )[ 0 ] === this.element[ 0 ] ) {
                        return false;
                }
 
-               this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
-                       var inst = $( this ).droppable( "instance" );
-                       if (
-                               inst.options.greedy &&
-                               !inst.options.disabled &&
-                               inst.options.scope === draggable.options.scope &&
-                               inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
-                               $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
-                       ) { childrenIntersection = true; return false; }
-               });
+               this.element
+                       .find( ":data(ui-droppable)" )
+                       .not( ".ui-draggable-dragging" )
+                       .each( function() {
+                               var inst = $( this ).droppable( "instance" );
+                               if (
+                                       inst.options.greedy &&
+                                       !inst.options.disabled &&
+                                       inst.options.scope === draggable.options.scope &&
+                                       inst.accept.call(
+                                               inst.element[ 0 ], ( draggable.currentItem || draggable.element )
+                                       ) &&
+                                       intersect(
+                                               draggable,
+                                               $.extend( inst, { offset: inst.element.offset() } ),
+                                               inst.options.tolerance, event
+                                       )
+                               ) {
+                                       childrenIntersection = true;
+                                       return false; }
+                       } );
                if ( childrenIntersection ) {
                        return false;
                }
 
-               if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
-                       if ( this.options.activeClass ) {
-                               this.element.removeClass( this.options.activeClass );
-                       }
-                       if ( this.options.hoverClass ) {
-                               this.element.removeClass( this.options.hoverClass );
-                       }
+               if ( this.accept.call( this.element[ 0 ],
+                               ( draggable.currentItem || draggable.element ) ) ) {
+                       this._removeActiveClass();
+                       this._removeHoverClass();
+
                        this._trigger( "drop", event, this.ui( draggable ) );
                        return this.element;
                }
@@ -2872,11 +3150,28 @@ $.widget( "ui.droppable", {
                        position: c.position,
                        offset: c.positionAbs
                };
-       }
+       },
+
+       // Extension points just to make backcompat sane and avoid duplicating logic
+       // TODO: Remove in 1.13 along with call to it below
+       _addHoverClass: function() {
+               this._addClass( "ui-droppable-hover" );
+       },
+
+       _removeHoverClass: function() {
+               this._removeClass( "ui-droppable-hover" );
+       },
+
+       _addActiveClass: function() {
+               this._addClass( "ui-droppable-active" );
+       },
 
-});
+       _removeActiveClass: function() {
+               this._removeClass( "ui-droppable-active" );
+       }
+} );
 
-$.ui.intersect = (function() {
+var intersect = $.ui.intersect = ( function() {
        function isOverAxis( x, reference, size ) {
                return ( x >= reference ) && ( x < ( reference + size ) );
        }
@@ -2887,8 +3182,10 @@ $.ui.intersect = (function() {
                        return false;
                }
 
-               var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
-                       y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
+               var x1 = ( draggable.positionAbs ||
+                               draggable.position.absolute ).left + draggable.margins.left,
+                       y1 = ( draggable.positionAbs ||
+                               draggable.position.absolute ).top + draggable.margins.top,
                        x2 = x1 + draggable.helperProportions.width,
                        y2 = y1 + draggable.helperProportions.height,
                        l = droppable.offset.left,
@@ -2905,7 +3202,8 @@ $.ui.intersect = (function() {
                                t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
                                y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
                case "pointer":
-                       return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
+                       return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
+                               isOverAxis( event.pageX, l, droppable.proportions().width );
                case "touch":
                        return (
                                ( y1 >= t && y1 <= b ) || // Top edge touching
@@ -2920,7 +3218,7 @@ $.ui.intersect = (function() {
                        return false;
                }
        };
-})();
+} )();
 
 /*
        This manager tracks offsets of draggables and droppables
@@ -2938,7 +3236,8 @@ $.ui.ddmanager = {
                droppablesLoop: for ( i = 0; i < m.length; i++ ) {
 
                        // No disabled and non-accepted
-                       if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
+                       if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
+                                       ( t.currentItem || t.element ) ) ) ) {
                                continue;
                        }
 
@@ -2961,7 +3260,10 @@ $.ui.ddmanager = {
                        }
 
                        m[ i ].offset = m[ i ].element.offset();
-                       m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
+                       m[ i ].proportions( {
+                               width: m[ i ].element[ 0 ].offsetWidth,
+                               height: m[ i ].element[ 0 ].offsetHeight
+                       } );
 
                }
 
@@ -2969,37 +3271,43 @@ $.ui.ddmanager = {
        drop: function( draggable, event ) {
 
                var dropped = false;
+
                // Create a copy of the droppables in case the list changes during the drop (#9116)
                $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
 
                        if ( !this.options ) {
                                return;
                        }
-                       if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
+                       if ( !this.options.disabled && this.visible &&
+                                       intersect( draggable, this, this.options.tolerance, event ) ) {
                                dropped = this._drop.call( this, event ) || dropped;
                        }
 
-                       if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+                       if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
+                                       ( draggable.currentItem || draggable.element ) ) ) {
                                this.isout = true;
                                this.isover = false;
                                this._deactivate.call( this, event );
                        }
 
-               });
+               } );
                return dropped;
 
        },
        dragStart: function( draggable, event ) {
-               // Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
-               draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
+
+               // Listen for scrolling so that if the dragging causes scrolling the position of the
+               // droppables can be recalculated (see #5003)
+               draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
                        if ( !draggable.options.refreshPositions ) {
                                $.ui.ddmanager.prepareOffsets( draggable, event );
                        }
-               });
+               } );
        },
        drag: function( draggable, event ) {
 
-               // If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+               // If you have a highly dynamic page, you might try this option. It renders positions
+               // every time you move the mouse.
                if ( draggable.options.refreshPositions ) {
                        $.ui.ddmanager.prepareOffsets( draggable, event );
                }
@@ -3012,18 +3320,21 @@ $.ui.ddmanager = {
                        }
 
                        var parentInstance, scope, parent,
-                               intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
-                               c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
+                               intersects = intersect( draggable, this, this.options.tolerance, event ),
+                               c = !intersects && this.isover ?
+                                       "isout" :
+                                       ( intersects && !this.isover ? "isover" : null );
                        if ( !c ) {
                                return;
                        }
 
                        if ( this.options.greedy ) {
+
                                // find droppable parents with same scope
                                scope = this.options.scope;
-                               parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
+                               parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
                                        return $( this ).droppable( "instance" ).options.scope === scope;
-                               });
+                               } );
 
                                if ( parent.length ) {
                                        parentInstance = $( parent[ 0 ] ).droppable( "instance" );
@@ -3031,7 +3342,7 @@ $.ui.ddmanager = {
                                }
                        }
 
-                       // we just moved into a greedy child
+                       // We just moved into a greedy child
                        if ( parentInstance && c === "isover" ) {
                                parentInstance.isover = false;
                                parentInstance.isout = true;
@@ -3039,2752 +3350,3733 @@ $.ui.ddmanager = {
                        }
 
                        this[ c ] = true;
-                       this[c === "isout" ? "isover" : "isout"] = false;
-                       this[c === "isover" ? "_over" : "_out"].call( this, event );
+                       this[ c === "isout" ? "isover" : "isout" ] = false;
+                       this[ c === "isover" ? "_over" : "_out" ].call( this, event );
 
-                       // we just moved out of a greedy child
+                       // We just moved out of a greedy child
                        if ( parentInstance && c === "isout" ) {
                                parentInstance.isout = false;
                                parentInstance.isover = true;
                                parentInstance._over.call( parentInstance, event );
                        }
-               });
+               } );
 
        },
        dragStop: function( draggable, event ) {
-               draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
-               // Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+               draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
+
+               // Call prepareOffsets one final time since IE does not fire return scroll events when
+               // overflow was caused by drag (see #5003)
                if ( !draggable.options.refreshPositions ) {
                        $.ui.ddmanager.prepareOffsets( draggable, event );
                }
        }
 };
 
-var droppable = $.ui.droppable;
+// DEPRECATED
+// TODO: switch return back to widget declaration at top of file when this is removed
+if ( $.uiBackCompat !== false ) {
+
+       // Backcompat for activeClass and hoverClass options
+       $.widget( "ui.droppable", $.ui.droppable, {
+               options: {
+                       hoverClass: false,
+                       activeClass: false
+               },
+               _addActiveClass: function() {
+                       this._super();
+                       if ( this.options.activeClass ) {
+                               this.element.addClass( this.options.activeClass );
+                       }
+               },
+               _removeActiveClass: function() {
+                       this._super();
+                       if ( this.options.activeClass ) {
+                               this.element.removeClass( this.options.activeClass );
+                       }
+               },
+               _addHoverClass: function() {
+                       this._super();
+                       if ( this.options.hoverClass ) {
+                               this.element.addClass( this.options.hoverClass );
+                       }
+               },
+               _removeHoverClass: function() {
+                       this._super();
+                       if ( this.options.hoverClass ) {
+                               this.element.removeClass( this.options.hoverClass );
+                       }
+               }
+       } );
+}
+
+var widgetsDroppable = $.ui.droppable;
 
 
 /*!
- * jQuery UI Resizable 1.11.4
+ * jQuery UI Sortable 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/resizable/
  */
 
+//>>label: Sortable
+//>>group: Interactions
+//>>description: Enables items in a list to be sorted using the mouse.
+//>>docs: http://api.jqueryui.com/sortable/
+//>>demos: http://jqueryui.com/sortable/
+//>>css.structure: ../../themes/base/sortable.css
+
 
-$.widget("ui.resizable", $.ui.mouse, {
-       version: "1.11.4",
-       widgetEventPrefix: "resize",
+
+var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
+       version: "1.12.0",
+       widgetEventPrefix: "sort",
+       ready: false,
        options: {
-               alsoResize: false,
-               animate: false,
-               animateDuration: "slow",
-               animateEasing: "swing",
-               aspectRatio: false,
-               autoHide: false,
+               appendTo: "parent",
+               axis: false,
+               connectWith: false,
                containment: false,
-               ghost: false,
+               cursor: "auto",
+               cursorAt: false,
+               dropOnEmpty: true,
+               forcePlaceholderSize: false,
+               forceHelperSize: false,
                grid: false,
-               handles: "e,s,se",
-               helper: false,
-               maxHeight: null,
-               maxWidth: null,
-               minHeight: 10,
-               minWidth: 10,
-               // See #7960
-               zIndex: 90,
-
-               // callbacks
-               resize: null,
+               handle: false,
+               helper: "original",
+               items: "> *",
+               opacity: false,
+               placeholder: false,
+               revert: false,
+               scroll: true,
+               scrollSensitivity: 20,
+               scrollSpeed: 20,
+               scope: "default",
+               tolerance: "intersect",
+               zIndex: 1000,
+
+               // Callbacks
+               activate: null,
+               beforeStop: null,
+               change: null,
+               deactivate: null,
+               out: null,
+               over: null,
+               receive: null,
+               remove: null,
+               sort: null,
                start: null,
-               stop: null
+               stop: null,
+               update: null
        },
 
-       _num: function( value ) {
-               return parseInt( value, 10 ) || 0;
+       _isOverAxis: function( x, reference, size ) {
+               return ( x >= reference ) && ( x < ( reference + size ) );
        },
 
-       _isNumber: function( value ) {
-               return !isNaN( parseInt( value, 10 ) );
+       _isFloating: function( item ) {
+               return ( /left|right/ ).test( item.css( "float" ) ) ||
+                       ( /inline|table-cell/ ).test( item.css( "display" ) );
        },
 
-       _hasScroll: function( el, a ) {
+       _create: function() {
+               this.containerCache = {};
+               this._addClass( "ui-sortable" );
 
-               if ( $( el ).css( "overflow" ) === "hidden") {
-                       return false;
-               }
+               //Get the items
+               this.refresh();
 
-               var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
-                       has = false;
+               //Let's determine the parent's offset
+               this.offset = this.element.offset();
 
-               if ( el[ scroll ] > 0 ) {
-                       return true;
-               }
+               //Initialize mouse events for interaction
+               this._mouseInit();
+
+               this._setHandleClassName();
+
+               //We're ready to go
+               this.ready = true;
 
-               // TODO: determine which cases actually cause this to happen
-               // if the element doesn't have the scroll set, see if it's possible to
-               // set the scroll
-               el[ scroll ] = 1;
-               has = ( el[ scroll ] > 0 );
-               el[ scroll ] = 0;
-               return has;
        },
 
-       _create: function() {
+       _setOption: function( key, value ) {
+               this._super( key, value );
 
-               var n, i, handle, axis, hname,
-                       that = this,
-                       o = this.options;
-               this.element.addClass("ui-resizable");
-
-               $.extend(this, {
-                       _aspectRatio: !!(o.aspectRatio),
-                       aspectRatio: o.aspectRatio,
-                       originalElement: this.element,
-                       _proportionallyResizeElements: [],
-                       _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
-               });
-
-               // Wrap the element if it cannot hold child nodes
-               if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
-
-                       this.element.wrap(
-                               $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
-                                       position: this.element.css("position"),
-                                       width: this.element.outerWidth(),
-                                       height: this.element.outerHeight(),
-                                       top: this.element.css("top"),
-                                       left: this.element.css("left")
-                               })
-                       );
+               if ( key === "handle" ) {
+                       this._setHandleClassName();
+               }
+       },
 
-                       this.element = this.element.parent().data(
-                               "ui-resizable", this.element.resizable( "instance" )
+       _setHandleClassName: function() {
+               var that = this;
+               this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
+               $.each( this.items, function() {
+                       that._addClass(
+                               this.instance.options.handle ?
+                                       this.item.find( this.instance.options.handle ) :
+                                       this.item,
+                               "ui-sortable-handle"
                        );
+               } );
+       },
 
-                       this.elementIsWrapper = true;
-
-                       this.element.css({
-                               marginLeft: this.originalElement.css("marginLeft"),
-                               marginTop: this.originalElement.css("marginTop"),
-                               marginRight: this.originalElement.css("marginRight"),
-                               marginBottom: this.originalElement.css("marginBottom")
-                       });
-                       this.originalElement.css({
-                               marginLeft: 0,
-                               marginTop: 0,
-                               marginRight: 0,
-                               marginBottom: 0
-                       });
-                       // support: Safari
-                       // Prevent Safari textarea resize
-                       this.originalResizeStyle = this.originalElement.css("resize");
-                       this.originalElement.css("resize", "none");
-
-                       this._proportionallyResizeElements.push( this.originalElement.css({
-                               position: "static",
-                               zoom: 1,
-                               display: "block"
-                       }) );
-
-                       // support: IE9
-                       // avoid IE jump (hard set the margin)
-                       this.originalElement.css({ margin: this.originalElement.css("margin") });
-
-                       this._proportionallyResize();
-               }
-
-               this.handles = o.handles ||
-                       ( !$(".ui-resizable-handle", this.element).length ?
-                               "e,s,se" : {
-                                       n: ".ui-resizable-n",
-                                       e: ".ui-resizable-e",
-                                       s: ".ui-resizable-s",
-                                       w: ".ui-resizable-w",
-                                       se: ".ui-resizable-se",
-                                       sw: ".ui-resizable-sw",
-                                       ne: ".ui-resizable-ne",
-                                       nw: ".ui-resizable-nw"
-                               } );
-
-               this._handles = $();
-               if ( this.handles.constructor === String ) {
+       _destroy: function() {
+               this._mouseDestroy();
 
-                       if ( this.handles === "all") {
-                               this.handles = "n,e,s,w,se,sw,ne,nw";
-                       }
+               for ( var i = this.items.length - 1; i >= 0; i-- ) {
+                       this.items[ i ].item.removeData( this.widgetName + "-item" );
+               }
 
-                       n = this.handles.split(",");
-                       this.handles = {};
+               return this;
+       },
 
-                       for (i = 0; i < n.length; i++) {
+       _mouseCapture: function( event, overrideHandle ) {
+               var currentItem = null,
+                       validHandle = false,
+                       that = this;
 
-                               handle = $.trim(n[i]);
-                               hname = "ui-resizable-" + handle;
-                               axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
+               if ( this.reverting ) {
+                       return false;
+               }
 
-                               axis.css({ zIndex: o.zIndex });
+               if ( this.options.disabled || this.options.type === "static" ) {
+                       return false;
+               }
 
-                               // TODO : What's going on here?
-                               if ("se" === handle) {
-                                       axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
-                               }
+               //We have to refresh the items data once first
+               this._refreshItems( event );
 
-                               this.handles[handle] = ".ui-resizable-" + handle;
-                               this.element.append(axis);
+               //Find out if the clicked node (or one of its parents) is a actual item in this.items
+               $( event.target ).parents().each( function() {
+                       if ( $.data( this, that.widgetName + "-item" ) === that ) {
+                               currentItem = $( this );
+                               return false;
                        }
+               } );
+               if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
+                       currentItem = $( event.target );
+               }
 
+               if ( !currentItem ) {
+                       return false;
+               }
+               if ( this.options.handle && !overrideHandle ) {
+                       $( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
+                               if ( this === event.target ) {
+                                       validHandle = true;
+                               }
+                       } );
+                       if ( !validHandle ) {
+                               return false;
+                       }
                }
 
-               this._renderAxis = function(target) {
+               this.currentItem = currentItem;
+               this._removeCurrentsFromItems();
+               return true;
 
-                       var i, axis, padPos, padWrapper;
+       },
 
-                       target = target || this.element;
+       _mouseStart: function( event, overrideHandle, noActivation ) {
 
-                       for (i in this.handles) {
+               var i, body,
+                       o = this.options;
 
-                               if (this.handles[i].constructor === String) {
-                                       this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
-                               } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
-                                       this.handles[ i ] = $( this.handles[ i ] );
-                                       this._on( this.handles[ i ], { "mousedown": that._mouseDown });
-                               }
+               this.currentContainer = this;
 
-                               if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
+               //We only need to call refreshPositions, because the refreshItems call has been moved to
+               // mouseCapture
+               this.refreshPositions();
 
-                                       axis = $(this.handles[i], this.element);
+               //Create and append the visible helper
+               this.helper = this._createHelper( event );
 
-                                       padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+               //Cache the helper size
+               this._cacheHelperProportions();
 
-                                       padPos = [ "padding",
-                                               /ne|nw|n/.test(i) ? "Top" :
-                                               /se|sw|s/.test(i) ? "Bottom" :
-                                               /^e$/.test(i) ? "Right" : "Left" ].join("");
+               /*
+                * - Position generation -
+                * This block generates everything position related - it's the core of draggables.
+                */
 
-                                       target.css(padPos, padWrapper);
+               //Cache the margins of the original element
+               this._cacheMargins();
 
-                                       this._proportionallyResize();
-                               }
+               //Get the next scrolling parent
+               this.scrollParent = this.helper.scrollParent();
 
-                               this._handles = this._handles.add( this.handles[ i ] );
-                       }
+               //The element's absolute position on the page minus margins
+               this.offset = this.currentItem.offset();
+               this.offset = {
+                       top: this.offset.top - this.margins.top,
+                       left: this.offset.left - this.margins.left
                };
 
-               // TODO: make renderAxis a prototype function
-               this._renderAxis(this.element);
-
-               this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
-               this._handles.disableSelection();
-
-               this._handles.mouseover(function() {
-                       if (!that.resizing) {
-                               if (this.className) {
-                                       axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
-                               }
-                               that.axis = axis && axis[1] ? axis[1] : "se";
-                       }
-               });
-
-               if (o.autoHide) {
-                       this._handles.hide();
-                       $(this.element)
-                               .addClass("ui-resizable-autohide")
-                               .mouseenter(function() {
-                                       if (o.disabled) {
-                                               return;
-                                       }
-                                       $(this).removeClass("ui-resizable-autohide");
-                                       that._handles.show();
-                               })
-                               .mouseleave(function() {
-                                       if (o.disabled) {
-                                               return;
-                                       }
-                                       if (!that.resizing) {
-                                               $(this).addClass("ui-resizable-autohide");
-                                               that._handles.hide();
-                                       }
-                               });
-               }
-
-               this._mouseInit();
-       },
+               $.extend( this.offset, {
+                       click: { //Where the click happened, relative to the element
+                               left: event.pageX - this.offset.left,
+                               top: event.pageY - this.offset.top
+                       },
+                       parent: this._getParentOffset(),
 
-       _destroy: function() {
+                       // This is a relative to absolute position minus the actual position calculation -
+                       // only used for relative positioned helper
+                       relative: this._getRelativeOffset()
+               } );
 
-               this._mouseDestroy();
+               // Only after we got the offset, we can change the helper's position to absolute
+               // TODO: Still need to figure out a way to make relative sorting possible
+               this.helper.css( "position", "absolute" );
+               this.cssPosition = this.helper.css( "position" );
 
-               var wrapper,
-                       _destroy = function(exp) {
-                               $(exp)
-                                       .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
-                                       .removeData("resizable")
-                                       .removeData("ui-resizable")
-                                       .unbind(".resizable")
-                                       .find(".ui-resizable-handle")
-                                               .remove();
-                       };
+               //Generate the original position
+               this.originalPosition = this._generatePosition( event );
+               this.originalPageX = event.pageX;
+               this.originalPageY = event.pageY;
 
-               // TODO: Unwrap at same DOM position
-               if (this.elementIsWrapper) {
-                       _destroy(this.element);
-                       wrapper = this.element;
-                       this.originalElement.css({
-                               position: wrapper.css("position"),
-                               width: wrapper.outerWidth(),
-                               height: wrapper.outerHeight(),
-                               top: wrapper.css("top"),
-                               left: wrapper.css("left")
-                       }).insertAfter( wrapper );
-                       wrapper.remove();
-               }
+               //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+               ( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
 
-               this.originalElement.css("resize", this.originalResizeStyle);
-               _destroy(this.originalElement);
+               //Cache the former DOM position
+               this.domPosition = {
+                       prev: this.currentItem.prev()[ 0 ],
+                       parent: this.currentItem.parent()[ 0 ]
+               };
 
-               return this;
-       },
+               // If the helper is not the original, hide the original so it's not playing any role during
+               // the drag, won't cause anything bad this way
+               if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+                       this.currentItem.hide();
+               }
 
-       _mouseCapture: function(event) {
-               var i, handle,
-                       capture = false;
+               //Create the placeholder
+               this._createPlaceholder();
 
-               for (i in this.handles) {
-                       handle = $(this.handles[i])[0];
-                       if (handle === event.target || $.contains(handle, event.target)) {
-                               capture = true;
-                       }
+               //Set a containment if given in the options
+               if ( o.containment ) {
+                       this._setContainment();
                }
 
-               return !this.options.disabled && capture;
-       },
-
-       _mouseStart: function(event) {
+               if ( o.cursor && o.cursor !== "auto" ) { // cursor option
+                       body = this.document.find( "body" );
 
-               var curleft, curtop, cursor,
-                       o = this.options,
-                       el = this.element;
+                       // Support: IE
+                       this.storedCursor = body.css( "cursor" );
+                       body.css( "cursor", o.cursor );
 
-               this.resizing = true;
+                       this.storedStylesheet =
+                               $( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
+               }
 
-               this._renderProxy();
+               if ( o.opacity ) { // opacity option
+                       if ( this.helper.css( "opacity" ) ) {
+                               this._storedOpacity = this.helper.css( "opacity" );
+                       }
+                       this.helper.css( "opacity", o.opacity );
+               }
 
-               curleft = this._num(this.helper.css("left"));
-               curtop = this._num(this.helper.css("top"));
+               if ( o.zIndex ) { // zIndex option
+                       if ( this.helper.css( "zIndex" ) ) {
+                               this._storedZIndex = this.helper.css( "zIndex" );
+                       }
+                       this.helper.css( "zIndex", o.zIndex );
+               }
 
-               if (o.containment) {
-                       curleft += $(o.containment).scrollLeft() || 0;
-                       curtop += $(o.containment).scrollTop() || 0;
+               //Prepare scrolling
+               if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+                               this.scrollParent[ 0 ].tagName !== "HTML" ) {
+                       this.overflowOffset = this.scrollParent.offset();
                }
 
-               this.offset = this.helper.offset();
-               this.position = { left: curleft, top: curtop };
+               //Call callbacks
+               this._trigger( "start", event, this._uiHash() );
 
-               this.size = this._helper ? {
-                               width: this.helper.width(),
-                               height: this.helper.height()
-                       } : {
-                               width: el.width(),
-                               height: el.height()
-                       };
+               //Recache the helper size
+               if ( !this._preserveHelperProportions ) {
+                       this._cacheHelperProportions();
+               }
 
-               this.originalSize = this._helper ? {
-                               width: el.outerWidth(),
-                               height: el.outerHeight()
-                       } : {
-                               width: el.width(),
-                               height: el.height()
-                       };
+               //Post "activate" events to possible containers
+               if ( !noActivation ) {
+                       for ( i = this.containers.length - 1; i >= 0; i-- ) {
+                               this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
+                       }
+               }
 
-               this.sizeDiff = {
-                       width: el.outerWidth() - el.width(),
-                       height: el.outerHeight() - el.height()
-               };
+               //Prepare possible droppables
+               if ( $.ui.ddmanager ) {
+                       $.ui.ddmanager.current = this;
+               }
 
-               this.originalPosition = { left: curleft, top: curtop };
-               this.originalMousePosition = { left: event.pageX, top: event.pageY };
+               if ( $.ui.ddmanager && !o.dropBehaviour ) {
+                       $.ui.ddmanager.prepareOffsets( this, event );
+               }
 
-               this.aspectRatio = (typeof o.aspectRatio === "number") ?
-                       o.aspectRatio :
-                       ((this.originalSize.width / this.originalSize.height) || 1);
+               this.dragging = true;
 
-               cursor = $(".ui-resizable-" + this.axis).css("cursor");
-               $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
+               this._addClass( this.helper, "ui-sortable-helper" );
 
-               el.addClass("ui-resizable-resizing");
-               this._propagate("start", event);
+               // Execute the drag once - this causes the helper not to be visiblebefore getting its
+               // correct position
+               this._mouseDrag( event );
                return true;
-       },
 
-       _mouseDrag: function(event) {
+       },
 
-               var data, props,
-                       smp = this.originalMousePosition,
-                       a = this.axis,
-                       dx = (event.pageX - smp.left) || 0,
-                       dy = (event.pageY - smp.top) || 0,
-                       trigger = this._change[a];
+       _mouseDrag: function( event ) {
+               var i, item, itemElement, intersection,
+                       o = this.options,
+                       scrolled = false;
 
-               this._updatePrevProperties();
+               //Compute the helpers position
+               this.position = this._generatePosition( event );
+               this.positionAbs = this._convertPositionTo( "absolute" );
 
-               if (!trigger) {
-                       return false;
+               if ( !this.lastPositionAbs ) {
+                       this.lastPositionAbs = this.positionAbs;
                }
 
-               data = trigger.apply(this, [ event, dx, dy ]);
-
-               this._updateVirtualBoundaries(event.shiftKey);
-               if (this._aspectRatio || event.shiftKey) {
-                       data = this._updateRatio(data, event);
-               }
+               //Do scrolling
+               if ( this.options.scroll ) {
+                       if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+                                       this.scrollParent[ 0 ].tagName !== "HTML" ) {
+
+                               if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
+                                               event.pageY < o.scrollSensitivity ) {
+                                       this.scrollParent[ 0 ].scrollTop =
+                                               scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
+                               } else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
+                                       this.scrollParent[ 0 ].scrollTop =
+                                               scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
+                               }
 
-               data = this._respectSize(data, event);
+                               if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
+                                               event.pageX < o.scrollSensitivity ) {
+                                       this.scrollParent[ 0 ].scrollLeft = scrolled =
+                                               this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
+                               } else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
+                                       this.scrollParent[ 0 ].scrollLeft = scrolled =
+                                               this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
+                               }
 
-               this._updateCache(data);
+                       } else {
 
-               this._propagate("resize", event);
+                               if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
+                                       scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
+                               } else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
+                                               o.scrollSensitivity ) {
+                                       scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
+                               }
 
-               props = this._applyChanges();
+                               if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
+                                       scrolled = this.document.scrollLeft(
+                                               this.document.scrollLeft() - o.scrollSpeed
+                                       );
+                               } else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
+                                               o.scrollSensitivity ) {
+                                       scrolled = this.document.scrollLeft(
+                                               this.document.scrollLeft() + o.scrollSpeed
+                                       );
+                               }
 
-               if ( !this._helper && this._proportionallyResizeElements.length ) {
-                       this._proportionallyResize();
-               }
+                       }
 
-               if ( !$.isEmptyObject( props ) ) {
-                       this._updatePrevProperties();
-                       this._trigger( "resize", event, this.ui() );
-                       this._applyChanges();
+                       if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
+                               $.ui.ddmanager.prepareOffsets( this, event );
+                       }
                }
 
-               return false;
-       },
+               //Regenerate the absolute position used for position checks
+               this.positionAbs = this._convertPositionTo( "absolute" );
 
-       _mouseStop: function(event) {
+               //Set the helper position
+               if ( !this.options.axis || this.options.axis !== "y" ) {
+                       this.helper[ 0 ].style.left = this.position.left + "px";
+               }
+               if ( !this.options.axis || this.options.axis !== "x" ) {
+                       this.helper[ 0 ].style.top = this.position.top + "px";
+               }
 
-               this.resizing = false;
-               var pr, ista, soffseth, soffsetw, s, left, top,
-                       o = this.options, that = this;
+               //Rearrange
+               for ( i = this.items.length - 1; i >= 0; i-- ) {
 
-               if (this._helper) {
+                       //Cache variables and intersection, continue if no intersection
+                       item = this.items[ i ];
+                       itemElement = item.item[ 0 ];
+                       intersection = this._intersectsWithPointer( item );
+                       if ( !intersection ) {
+                               continue;
+                       }
 
-                       pr = this._proportionallyResizeElements;
-                       ista = pr.length && (/textarea/i).test(pr[0].nodeName);
-                       soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
-                       soffsetw = ista ? 0 : that.sizeDiff.width;
+                       // Only put the placeholder inside the current Container, skip all
+                       // items from other containers. This works because when moving
+                       // an item from one container to another the
+                       // currentContainer is switched before the placeholder is moved.
+                       //
+                       // Without this, moving items in "sub-sortables" can cause
+                       // the placeholder to jitter between the outer and inner container.
+                       if ( item.instance !== this.currentContainer ) {
+                               continue;
+                       }
 
-                       s = {
-                               width: (that.helper.width()  - soffsetw),
-                               height: (that.helper.height() - soffseth)
-                       };
-                       left = (parseInt(that.element.css("left"), 10) +
-                               (that.position.left - that.originalPosition.left)) || null;
-                       top = (parseInt(that.element.css("top"), 10) +
-                               (that.position.top - that.originalPosition.top)) || null;
+                       // Cannot intersect with itself
+                       // no useless actions that have been done before
+                       // no action if the item moved is the parent of the item checked
+                       if ( itemElement !== this.currentItem[ 0 ] &&
+                               this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
+                               !$.contains( this.placeholder[ 0 ], itemElement ) &&
+                               ( this.options.type === "semi-dynamic" ?
+                                       !$.contains( this.element[ 0 ], itemElement ) :
+                                       true
+                               )
+                       ) {
 
-                       if (!o.animate) {
-                               this.element.css($.extend(s, { top: top, left: left }));
-                       }
+                               this.direction = intersection === 1 ? "down" : "up";
 
-                       that.helper.height(that.size.height);
-                       that.helper.width(that.size.width);
+                               if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
+                                       this._rearrange( event, item );
+                               } else {
+                                       break;
+                               }
 
-                       if (this._helper && !o.animate) {
-                               this._proportionallyResize();
+                               this._trigger( "change", event, this._uiHash() );
+                               break;
                        }
                }
 
-               $("body").css("cursor", "auto");
-
-               this.element.removeClass("ui-resizable-resizing");
-
-               this._propagate("stop", event);
+               //Post events to containers
+               this._contactContainers( event );
 
-               if (this._helper) {
-                       this.helper.remove();
+               //Interconnect with droppables
+               if ( $.ui.ddmanager ) {
+                       $.ui.ddmanager.drag( this, event );
                }
 
-               return false;
+               //Call callbacks
+               this._trigger( "sort", event, this._uiHash() );
 
-       },
+               this.lastPositionAbs = this.positionAbs;
+               return false;
 
-       _updatePrevProperties: function() {
-               this.prevPosition = {
-                       top: this.position.top,
-                       left: this.position.left
-               };
-               this.prevSize = {
-                       width: this.size.width,
-                       height: this.size.height
-               };
        },
 
-       _applyChanges: function() {
-               var props = {};
+       _mouseStop: function( event, noPropagation ) {
 
-               if ( this.position.top !== this.prevPosition.top ) {
-                       props.top = this.position.top + "px";
-               }
-               if ( this.position.left !== this.prevPosition.left ) {
-                       props.left = this.position.left + "px";
-               }
-               if ( this.size.width !== this.prevSize.width ) {
-                       props.width = this.size.width + "px";
-               }
-               if ( this.size.height !== this.prevSize.height ) {
-                       props.height = this.size.height + "px";
+               if ( !event ) {
+                       return;
                }
 
-               this.helper.css( props );
-
-               return props;
-       },
-
-       _updateVirtualBoundaries: function(forceAspectRatio) {
-               var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
-                       o = this.options;
-
-               b = {
-                       minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
-                       maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
-                       minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
-                       maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
-               };
+               //If we are using droppables, inform the manager about the drop
+               if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
+                       $.ui.ddmanager.drop( this, event );
+               }
 
-               if (this._aspectRatio || forceAspectRatio) {
-                       pMinWidth = b.minHeight * this.aspectRatio;
-                       pMinHeight = b.minWidth / this.aspectRatio;
-                       pMaxWidth = b.maxHeight * this.aspectRatio;
-                       pMaxHeight = b.maxWidth / this.aspectRatio;
+               if ( this.options.revert ) {
+                       var that = this,
+                               cur = this.placeholder.offset(),
+                               axis = this.options.axis,
+                               animation = {};
 
-                       if (pMinWidth > b.minWidth) {
-                               b.minWidth = pMinWidth;
-                       }
-                       if (pMinHeight > b.minHeight) {
-                               b.minHeight = pMinHeight;
-                       }
-                       if (pMaxWidth < b.maxWidth) {
-                               b.maxWidth = pMaxWidth;
+                       if ( !axis || axis === "x" ) {
+                               animation.left = cur.left - this.offset.parent.left - this.margins.left +
+                                       ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
+                                               0 :
+                                               this.offsetParent[ 0 ].scrollLeft
+                                       );
                        }
-                       if (pMaxHeight < b.maxHeight) {
-                               b.maxHeight = pMaxHeight;
+                       if ( !axis || axis === "y" ) {
+                               animation.top = cur.top - this.offset.parent.top - this.margins.top +
+                                       ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
+                                               0 :
+                                               this.offsetParent[ 0 ].scrollTop
+                                       );
                        }
+                       this.reverting = true;
+                       $( this.helper ).animate(
+                               animation,
+                               parseInt( this.options.revert, 10 ) || 500,
+                               function() {
+                                       that._clear( event );
+                               }
+                       );
+               } else {
+                       this._clear( event, noPropagation );
                }
-               this._vBoundaries = b;
-       },
-
-       _updateCache: function(data) {
-               this.offset = this.helper.offset();
-               if (this._isNumber(data.left)) {
-                       this.position.left = data.left;
-               }
-               if (this._isNumber(data.top)) {
-                       this.position.top = data.top;
-               }
-               if (this._isNumber(data.height)) {
-                       this.size.height = data.height;
-               }
-               if (this._isNumber(data.width)) {
-                       this.size.width = data.width;
-               }
-       },
 
-       _updateRatio: function( data ) {
+               return false;
 
-               var cpos = this.position,
-                       csize = this.size,
-                       a = this.axis;
+       },
 
-               if (this._isNumber(data.height)) {
-                       data.width = (data.height * this.aspectRatio);
-               } else if (this._isNumber(data.width)) {
-                       data.height = (data.width / this.aspectRatio);
-               }
+       cancel: function() {
 
-               if (a === "sw") {
-                       data.left = cpos.left + (csize.width - data.width);
-                       data.top = null;
-               }
-               if (a === "nw") {
-                       data.top = cpos.top + (csize.height - data.height);
-                       data.left = cpos.left + (csize.width - data.width);
-               }
+               if ( this.dragging ) {
 
-               return data;
-       },
+                       this._mouseUp( { target: null } );
 
-       _respectSize: function( data ) {
+                       if ( this.options.helper === "original" ) {
+                               this.currentItem.css( this._storedCSS );
+                               this._removeClass( this.currentItem, "ui-sortable-helper" );
+                       } else {
+                               this.currentItem.show();
+                       }
 
-               var o = this._vBoundaries,
-                       a = this.axis,
-                       ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
-                       ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
-                       isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
-                       isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
-                       dw = this.originalPosition.left + this.originalSize.width,
-                       dh = this.position.top + this.size.height,
-                       cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
-               if (isminw) {
-                       data.width = o.minWidth;
-               }
-               if (isminh) {
-                       data.height = o.minHeight;
-               }
-               if (ismaxw) {
-                       data.width = o.maxWidth;
-               }
-               if (ismaxh) {
-                       data.height = o.maxHeight;
-               }
+                       //Post deactivating events to containers
+                       for ( var i = this.containers.length - 1; i >= 0; i-- ) {
+                               this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
+                               if ( this.containers[ i ].containerCache.over ) {
+                                       this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
+                                       this.containers[ i ].containerCache.over = 0;
+                               }
+                       }
 
-               if (isminw && cw) {
-                       data.left = dw - o.minWidth;
-               }
-               if (ismaxw && cw) {
-                       data.left = dw - o.maxWidth;
-               }
-               if (isminh && ch) {
-                       data.top = dh - o.minHeight;
-               }
-               if (ismaxh && ch) {
-                       data.top = dh - o.maxHeight;
                }
 
-               // Fixing jump error on top/left - bug #2330
-               if (!data.width && !data.height && !data.left && data.top) {
-                       data.top = null;
-               } else if (!data.width && !data.height && !data.top && data.left) {
-                       data.left = null;
-               }
+               if ( this.placeholder ) {
 
-               return data;
-       },
+                       //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
+                       // it unbinds ALL events from the original node!
+                       if ( this.placeholder[ 0 ].parentNode ) {
+                               this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
+                       }
+                       if ( this.options.helper !== "original" && this.helper &&
+                                       this.helper[ 0 ].parentNode ) {
+                               this.helper.remove();
+                       }
 
-       _getPaddingPlusBorderDimensions: function( element ) {
-               var i = 0,
-                       widths = [],
-                       borders = [
-                               element.css( "borderTopWidth" ),
-                               element.css( "borderRightWidth" ),
-                               element.css( "borderBottomWidth" ),
-                               element.css( "borderLeftWidth" )
-                       ],
-                       paddings = [
-                               element.css( "paddingTop" ),
-                               element.css( "paddingRight" ),
-                               element.css( "paddingBottom" ),
-                               element.css( "paddingLeft" )
-                       ];
+                       $.extend( this, {
+                               helper: null,
+                               dragging: false,
+                               reverting: false,
+                               _noFinalSort: null
+                       } );
 
-               for ( ; i < 4; i++ ) {
-                       widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
-                       widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
+                       if ( this.domPosition.prev ) {
+                               $( this.domPosition.prev ).after( this.currentItem );
+                       } else {
+                               $( this.domPosition.parent ).prepend( this.currentItem );
+                       }
                }
 
-               return {
-                       height: widths[ 0 ] + widths[ 2 ],
-                       width: widths[ 1 ] + widths[ 3 ]
-               };
-       },
-
-       _proportionallyResize: function() {
-
-               if (!this._proportionallyResizeElements.length) {
-                       return;
-               }
+               return this;
 
-               var prel,
-                       i = 0,
-                       element = this.helper || this.element;
+       },
 
-               for ( ; i < this._proportionallyResizeElements.length; i++) {
+       serialize: function( o ) {
 
-                       prel = this._proportionallyResizeElements[i];
+               var items = this._getItemsAsjQuery( o && o.connected ),
+                       str = [];
+               o = o || {};
 
-                       // TODO: Seems like a bug to cache this.outerDimensions
-                       // considering that we are in a loop.
-                       if (!this.outerDimensions) {
-                               this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
+               $( items ).each( function() {
+                       var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
+                               .match( o.expression || ( /(.+)[\-=_](.+)/ ) );
+                       if ( res ) {
+                               str.push(
+                                       ( o.key || res[ 1 ] + "[]" ) +
+                                       "=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
                        }
+               } );
 
-                       prel.css({
-                               height: (element.height() - this.outerDimensions.height) || 0,
-                               width: (element.width() - this.outerDimensions.width) || 0
-                       });
-
+               if ( !str.length && o.key ) {
+                       str.push( o.key + "=" );
                }
 
+               return str.join( "&" );
+
        },
 
-       _renderProxy: function() {
+       toArray: function( o ) {
+
+               var items = this._getItemsAsjQuery( o && o.connected ),
+                       ret = [];
 
-               var el = this.element, o = this.options;
-               this.elementOffset = el.offset();
+               o = o || {};
 
-               if (this._helper) {
+               items.each( function() {
+                       ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
+               } );
+               return ret;
 
-                       this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
+       },
 
-                       this.helper.addClass(this._helper).css({
-                               width: this.element.outerWidth() - 1,
-                               height: this.element.outerHeight() - 1,
-                               position: "absolute",
-                               left: this.elementOffset.left + "px",
-                               top: this.elementOffset.top + "px",
-                               zIndex: ++o.zIndex //TODO: Don't modify option
-                       });
+       /* Be careful with the following core functions */
+       _intersectsWith: function( item ) {
 
-                       this.helper
-                               .appendTo("body")
-                               .disableSelection();
+               var x1 = this.positionAbs.left,
+                       x2 = x1 + this.helperProportions.width,
+                       y1 = this.positionAbs.top,
+                       y2 = y1 + this.helperProportions.height,
+                       l = item.left,
+                       r = l + item.width,
+                       t = item.top,
+                       b = t + item.height,
+                       dyClick = this.offset.click.top,
+                       dxClick = this.offset.click.left,
+                       isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
+                               ( y1 + dyClick ) < b ),
+                       isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
+                               ( x1 + dxClick ) < r ),
+                       isOverElement = isOverElementHeight && isOverElementWidth;
 
+               if ( this.options.tolerance === "pointer" ||
+                       this.options.forcePointerForContainers ||
+                       ( this.options.tolerance !== "pointer" &&
+                               this.helperProportions[ this.floating ? "width" : "height" ] >
+                               item[ this.floating ? "width" : "height" ] )
+               ) {
+                       return isOverElement;
                } else {
-                       this.helper = this.element;
-               }
 
-       },
+                       return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
+                               x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
+                               t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
+                               y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
 
-       _change: {
-               e: function(event, dx) {
-                       return { width: this.originalSize.width + dx };
-               },
-               w: function(event, dx) {
-                       var cs = this.originalSize, sp = this.originalPosition;
-                       return { left: sp.left + dx, width: cs.width - dx };
-               },
-               n: function(event, dx, dy) {
-                       var cs = this.originalSize, sp = this.originalPosition;
-                       return { top: sp.top + dy, height: cs.height - dy };
-               },
-               s: function(event, dx, dy) {
-                       return { height: this.originalSize.height + dy };
-               },
-               se: function(event, dx, dy) {
-                       return $.extend(this._change.s.apply(this, arguments),
-                               this._change.e.apply(this, [ event, dx, dy ]));
-               },
-               sw: function(event, dx, dy) {
-                       return $.extend(this._change.s.apply(this, arguments),
-                               this._change.w.apply(this, [ event, dx, dy ]));
-               },
-               ne: function(event, dx, dy) {
-                       return $.extend(this._change.n.apply(this, arguments),
-                               this._change.e.apply(this, [ event, dx, dy ]));
-               },
-               nw: function(event, dx, dy) {
-                       return $.extend(this._change.n.apply(this, arguments),
-                               this._change.w.apply(this, [ event, dx, dy ]));
                }
        },
 
-       _propagate: function(n, event) {
-               $.ui.plugin.call(this, n, [ event, this.ui() ]);
-               (n !== "resize" && this._trigger(n, event, this.ui()));
-       },
-
-       plugins: {},
-
-       ui: function() {
-               return {
-                       originalElement: this.originalElement,
-                       element: this.element,
-                       helper: this.helper,
-                       position: this.position,
-                       size: this.size,
-                       originalSize: this.originalSize,
-                       originalPosition: this.originalPosition
-               };
-       }
-
-});
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add("resizable", "animate", {
-
-       stop: function( event ) {
-               var that = $(this).resizable( "instance" ),
-                       o = that.options,
-                       pr = that._proportionallyResizeElements,
-                       ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                       soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
-                       soffsetw = ista ? 0 : that.sizeDiff.width,
-                       style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
-                       left = (parseInt(that.element.css("left"), 10) +
-                               (that.position.left - that.originalPosition.left)) || null,
-                       top = (parseInt(that.element.css("top"), 10) +
-                               (that.position.top - that.originalPosition.top)) || null;
-
-               that.element.animate(
-                       $.extend(style, top && left ? { top: top, left: left } : {}), {
-                               duration: o.animateDuration,
-                               easing: o.animateEasing,
-                               step: function() {
-
-                                       var data = {
-                                               width: parseInt(that.element.css("width"), 10),
-                                               height: parseInt(that.element.css("height"), 10),
-                                               top: parseInt(that.element.css("top"), 10),
-                                               left: parseInt(that.element.css("left"), 10)
-                                       };
+       _intersectsWithPointer: function( item ) {
+               var verticalDirection, horizontalDirection,
+                       isOverElementHeight = ( this.options.axis === "x" ) ||
+                               this._isOverAxis(
+                                       this.positionAbs.top + this.offset.click.top, item.top, item.height ),
+                       isOverElementWidth = ( this.options.axis === "y" ) ||
+                               this._isOverAxis(
+                                       this.positionAbs.left + this.offset.click.left, item.left, item.width ),
+                       isOverElement = isOverElementHeight && isOverElementWidth;
 
-                                       if (pr && pr.length) {
-                                               $(pr[0]).css({ width: data.width, height: data.height });
-                                       }
+               if ( !isOverElement ) {
+                       return false;
+               }
 
-                                       // propagating resize, and updating values for each animation step
-                                       that._updateCache(data);
-                                       that._propagate("resize", event);
+               verticalDirection = this._getDragVerticalDirection();
+               horizontalDirection = this._getDragHorizontalDirection();
 
-                               }
-                       }
-               );
-       }
+               return this.floating ?
+                       ( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
+                       : ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
 
-});
+       },
 
-$.ui.plugin.add( "resizable", "containment", {
+       _intersectsWithSides: function( item ) {
 
-       start: function() {
-               var element, p, co, ch, cw, width, height,
-                       that = $( this ).resizable( "instance" ),
-                       o = that.options,
-                       el = that.element,
-                       oc = o.containment,
-                       ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
+               var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
+                               this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
+                       isOverRightHalf = this._isOverAxis( this.positionAbs.left +
+                               this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
+                       verticalDirection = this._getDragVerticalDirection(),
+                       horizontalDirection = this._getDragHorizontalDirection();
 
-               if ( !ce ) {
-                       return;
+               if ( this.floating && horizontalDirection ) {
+                       return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
+                               ( horizontalDirection === "left" && !isOverRightHalf ) );
+               } else {
+                       return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
+                               ( verticalDirection === "up" && !isOverBottomHalf ) );
                }
 
-               that.containerElement = $( ce );
+       },
 
-               if ( /document/.test( oc ) || oc === document ) {
-                       that.containerOffset = {
-                               left: 0,
-                               top: 0
-                       };
-                       that.containerPosition = {
-                               left: 0,
-                               top: 0
-                       };
+       _getDragVerticalDirection: function() {
+               var delta = this.positionAbs.top - this.lastPositionAbs.top;
+               return delta !== 0 && ( delta > 0 ? "down" : "up" );
+       },
 
-                       that.parentData = {
-                               element: $( document ),
-                               left: 0,
-                               top: 0,
-                               width: $( document ).width(),
-                               height: $( document ).height() || document.body.parentNode.scrollHeight
-                       };
-               } else {
-                       element = $( ce );
-                       p = [];
-                       $([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
-                               p[ i ] = that._num( element.css( "padding" + name ) );
-                       });
-
-                       that.containerOffset = element.offset();
-                       that.containerPosition = element.position();
-                       that.containerSize = {
-                               height: ( element.innerHeight() - p[ 3 ] ),
-                               width: ( element.innerWidth() - p[ 1 ] )
-                       };
+       _getDragHorizontalDirection: function() {
+               var delta = this.positionAbs.left - this.lastPositionAbs.left;
+               return delta !== 0 && ( delta > 0 ? "right" : "left" );
+       },
 
-                       co = that.containerOffset;
-                       ch = that.containerSize.height;
-                       cw = that.containerSize.width;
-                       width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
-                       height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
-
-                       that.parentData = {
-                               element: ce,
-                               left: co.left,
-                               top: co.top,
-                               width: width,
-                               height: height
-                       };
-               }
+       refresh: function( event ) {
+               this._refreshItems( event );
+               this._setHandleClassName();
+               this.refreshPositions();
+               return this;
        },
 
-       resize: function( event ) {
-               var woset, hoset, isParent, isOffsetRelative,
-                       that = $( this ).resizable( "instance" ),
-                       o = that.options,
-                       co = that.containerOffset,
-                       cp = that.position,
-                       pRatio = that._aspectRatio || event.shiftKey,
-                       cop = {
-                               top: 0,
-                               left: 0
-                       },
-                       ce = that.containerElement,
-                       continueResize = true;
+       _connectWith: function() {
+               var options = this.options;
+               return options.connectWith.constructor === String ?
+                       [ options.connectWith ] :
+                       options.connectWith;
+       },
 
-               if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
-                       cop = co;
-               }
+       _getItemsAsjQuery: function( connected ) {
 
-               if ( cp.left < ( that._helper ? co.left : 0 ) ) {
-                       that.size.width = that.size.width +
-                               ( that._helper ?
-                                       ( that.position.left - co.left ) :
-                                       ( that.position.left - cop.left ) );
+               var i, j, cur, inst,
+                       items = [],
+                       queries = [],
+                       connectWith = this._connectWith();
 
-                       if ( pRatio ) {
-                               that.size.height = that.size.width / that.aspectRatio;
-                               continueResize = false;
+               if ( connectWith && connected ) {
+                       for ( i = connectWith.length - 1; i >= 0; i-- ) {
+                               cur = $( connectWith[ i ], this.document[ 0 ] );
+                               for ( j = cur.length - 1; j >= 0; j-- ) {
+                                       inst = $.data( cur[ j ], this.widgetFullName );
+                                       if ( inst && inst !== this && !inst.options.disabled ) {
+                                               queries.push( [ $.isFunction( inst.options.items ) ?
+                                                       inst.options.items.call( inst.element ) :
+                                                       $( inst.options.items, inst.element )
+                                                               .not( ".ui-sortable-helper" )
+                                                               .not( ".ui-sortable-placeholder" ), inst ] );
+                                       }
+                               }
                        }
-                       that.position.left = o.helper ? co.left : 0;
                }
 
-               if ( cp.top < ( that._helper ? co.top : 0 ) ) {
-                       that.size.height = that.size.height +
-                               ( that._helper ?
-                                       ( that.position.top - co.top ) :
-                                       that.position.top );
+               queries.push( [ $.isFunction( this.options.items ) ?
+                       this.options.items
+                               .call( this.element, null, { options: this.options, item: this.currentItem } ) :
+                       $( this.options.items, this.element )
+                               .not( ".ui-sortable-helper" )
+                               .not( ".ui-sortable-placeholder" ), this ] );
 
-                       if ( pRatio ) {
-                               that.size.width = that.size.height * that.aspectRatio;
-                               continueResize = false;
-                       }
-                       that.position.top = that._helper ? co.top : 0;
+               function addItems() {
+                       items.push( this );
                }
-
-               isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
-               isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
-
-               if ( isParent && isOffsetRelative ) {
-                       that.offset.left = that.parentData.left + that.position.left;
-                       that.offset.top = that.parentData.top + that.position.top;
-               } else {
-                       that.offset.left = that.element.offset().left;
-                       that.offset.top = that.element.offset().top;
+               for ( i = queries.length - 1; i >= 0; i-- ) {
+                       queries[ i ][ 0 ].each( addItems );
                }
 
-               woset = Math.abs( that.sizeDiff.width +
-                       (that._helper ?
-                               that.offset.left - cop.left :
-                               (that.offset.left - co.left)) );
+               return $( items );
 
-               hoset = Math.abs( that.sizeDiff.height +
-                       (that._helper ?
-                               that.offset.top - cop.top :
-                               (that.offset.top - co.top)) );
+       },
 
-               if ( woset + that.size.width >= that.parentData.width ) {
-                       that.size.width = that.parentData.width - woset;
-                       if ( pRatio ) {
-                               that.size.height = that.size.width / that.aspectRatio;
-                               continueResize = false;
-                       }
-               }
+       _removeCurrentsFromItems: function() {
 
-               if ( hoset + that.size.height >= that.parentData.height ) {
-                       that.size.height = that.parentData.height - hoset;
-                       if ( pRatio ) {
-                               that.size.width = that.size.height * that.aspectRatio;
-                               continueResize = false;
+               var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
+
+               this.items = $.grep( this.items, function( item ) {
+                       for ( var j = 0; j < list.length; j++ ) {
+                               if ( list[ j ] === item.item[ 0 ] ) {
+                                       return false;
+                               }
                        }
-               }
+                       return true;
+               } );
 
-               if ( !continueResize ) {
-                       that.position.left = that.prevPosition.left;
-                       that.position.top = that.prevPosition.top;
-                       that.size.width = that.prevSize.width;
-                       that.size.height = that.prevSize.height;
-               }
        },
 
-       stop: function() {
-               var that = $( this ).resizable( "instance" ),
-                       o = that.options,
-                       co = that.containerOffset,
-                       cop = that.containerPosition,
-                       ce = that.containerElement,
-                       helper = $( that.helper ),
-                       ho = helper.offset(),
-                       w = helper.outerWidth() - that.sizeDiff.width,
-                       h = helper.outerHeight() - that.sizeDiff.height;
+       _refreshItems: function( event ) {
 
-               if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
-                       $( this ).css({
-                               left: ho.left - cop.left - co.left,
-                               width: w,
-                               height: h
-                       });
-               }
+               this.items = [];
+               this.containers = [ this ];
 
-               if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
-                       $( this ).css({
-                               left: ho.left - cop.left - co.left,
-                               width: w,
-                               height: h
-                       });
-               }
-       }
-});
+               var i, j, cur, inst, targetData, _queries, item, queriesLength,
+                       items = this.items,
+                       queries = [ [ $.isFunction( this.options.items ) ?
+                               this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
+                               $( this.options.items, this.element ), this ] ],
+                       connectWith = this._connectWith();
 
-$.ui.plugin.add("resizable", "alsoResize", {
+               //Shouldn't be run the first time through due to massive slow-down
+               if ( connectWith && this.ready ) {
+                       for ( i = connectWith.length - 1; i >= 0; i-- ) {
+                               cur = $( connectWith[ i ], this.document[ 0 ] );
+                               for ( j = cur.length - 1; j >= 0; j-- ) {
+                                       inst = $.data( cur[ j ], this.widgetFullName );
+                                       if ( inst && inst !== this && !inst.options.disabled ) {
+                                               queries.push( [ $.isFunction( inst.options.items ) ?
+                                                       inst.options.items
+                                                               .call( inst.element[ 0 ], event, { item: this.currentItem } ) :
+                                                       $( inst.options.items, inst.element ), inst ] );
+                                               this.containers.push( inst );
+                                       }
+                               }
+                       }
+               }
 
-       start: function() {
-               var that = $(this).resizable( "instance" ),
-                       o = that.options;
+               for ( i = queries.length - 1; i >= 0; i-- ) {
+                       targetData = queries[ i ][ 1 ];
+                       _queries = queries[ i ][ 0 ];
 
-               $(o.alsoResize).each(function() {
-                       var el = $(this);
-                       el.data("ui-resizable-alsoresize", {
-                               width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
-                               left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
-                       });
-               });
-       },
-
-       resize: function(event, ui) {
-               var that = $(this).resizable( "instance" ),
-                       o = that.options,
-                       os = that.originalSize,
-                       op = that.originalPosition,
-                       delta = {
-                               height: (that.size.height - os.height) || 0,
-                               width: (that.size.width - os.width) || 0,
-                               top: (that.position.top - op.top) || 0,
-                               left: (that.position.left - op.left) || 0
-                       };
+                       for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
+                               item = $( _queries[ j ] );
 
-                       $(o.alsoResize).each(function() {
-                               var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
-                                       css = el.parents(ui.originalElement[0]).length ?
-                                                       [ "width", "height" ] :
-                                                       [ "width", "height", "top", "left" ];
+                               // Data for target checking (mouse manager)
+                               item.data( this.widgetName + "-item", targetData );
 
-                               $.each(css, function(i, prop) {
-                                       var sum = (start[prop] || 0) + (delta[prop] || 0);
-                                       if (sum && sum >= 0) {
-                                               style[prop] = sum || null;
-                                       }
-                               });
+                               items.push( {
+                                       item: item,
+                                       instance: targetData,
+                                       width: 0, height: 0,
+                                       left: 0, top: 0
+                               } );
+                       }
+               }
 
-                               el.css(style);
-                       });
        },
 
-       stop: function() {
-               $(this).removeData("resizable-alsoresize");
-       }
-});
+       refreshPositions: function( fast ) {
 
-$.ui.plugin.add("resizable", "ghost", {
+               // Determine whether items are being displayed horizontally
+               this.floating = this.items.length ?
+                       this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
+                       false;
 
-       start: function() {
+               //This has to be redone because due to the item being moved out/into the offsetParent,
+               // the offsetParent's position will change
+               if ( this.offsetParent && this.helper ) {
+                       this.offset.parent = this._getParentOffset();
+               }
 
-               var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
+               var i, item, t, p;
 
-               that.ghost = that.originalElement.clone();
-               that.ghost
-                       .css({
-                               opacity: 0.25,
-                               display: "block",
-                               position: "relative",
-                               height: cs.height,
-                               width: cs.width,
-                               margin: 0,
-                               left: 0,
-                               top: 0
-                       })
-                       .addClass("ui-resizable-ghost")
-                       .addClass(typeof o.ghost === "string" ? o.ghost : "");
+               for ( i = this.items.length - 1; i >= 0; i-- ) {
+                       item = this.items[ i ];
 
-               that.ghost.appendTo(that.helper);
+                       //We ignore calculating positions of all connected containers when we're not over them
+                       if ( item.instance !== this.currentContainer && this.currentContainer &&
+                                       item.item[ 0 ] !== this.currentItem[ 0 ] ) {
+                               continue;
+                       }
 
-       },
+                       t = this.options.toleranceElement ?
+                               $( this.options.toleranceElement, item.item ) :
+                               item.item;
 
-       resize: function() {
-               var that = $(this).resizable( "instance" );
-               if (that.ghost) {
-                       that.ghost.css({
-                               position: "relative",
-                               height: that.size.height,
-                               width: that.size.width
-                       });
-               }
-       },
+                       if ( !fast ) {
+                               item.width = t.outerWidth();
+                               item.height = t.outerHeight();
+                       }
 
-       stop: function() {
-               var that = $(this).resizable( "instance" );
-               if (that.ghost && that.helper) {
-                       that.helper.get(0).removeChild(that.ghost.get(0));
+                       p = t.offset();
+                       item.left = p.left;
+                       item.top = p.top;
                }
-       }
 
-});
-
-$.ui.plugin.add("resizable", "grid", {
-
-       resize: function() {
-               var outerDimensions,
-                       that = $(this).resizable( "instance" ),
-                       o = that.options,
-                       cs = that.size,
-                       os = that.originalSize,
-                       op = that.originalPosition,
-                       a = that.axis,
-                       grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
-                       gridX = (grid[0] || 1),
-                       gridY = (grid[1] || 1),
-                       ox = Math.round((cs.width - os.width) / gridX) * gridX,
-                       oy = Math.round((cs.height - os.height) / gridY) * gridY,
-                       newWidth = os.width + ox,
-                       newHeight = os.height + oy,
-                       isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
-                       isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
-                       isMinWidth = o.minWidth && (o.minWidth > newWidth),
-                       isMinHeight = o.minHeight && (o.minHeight > newHeight);
-
-               o.grid = grid;
-
-               if (isMinWidth) {
-                       newWidth += gridX;
-               }
-               if (isMinHeight) {
-                       newHeight += gridY;
-               }
-               if (isMaxWidth) {
-                       newWidth -= gridX;
-               }
-               if (isMaxHeight) {
-                       newHeight -= gridY;
-               }
-
-               if (/^(se|s|e)$/.test(a)) {
-                       that.size.width = newWidth;
-                       that.size.height = newHeight;
-               } else if (/^(ne)$/.test(a)) {
-                       that.size.width = newWidth;
-                       that.size.height = newHeight;
-                       that.position.top = op.top - oy;
-               } else if (/^(sw)$/.test(a)) {
-                       that.size.width = newWidth;
-                       that.size.height = newHeight;
-                       that.position.left = op.left - ox;
+               if ( this.options.custom && this.options.custom.refreshContainers ) {
+                       this.options.custom.refreshContainers.call( this );
                } else {
-                       if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
-                               outerDimensions = that._getPaddingPlusBorderDimensions( this );
-                       }
-
-                       if ( newHeight - gridY > 0 ) {
-                               that.size.height = newHeight;
-                               that.position.top = op.top - oy;
-                       } else {
-                               newHeight = gridY - outerDimensions.height;
-                               that.size.height = newHeight;
-                               that.position.top = op.top + os.height - newHeight;
-                       }
-                       if ( newWidth - gridX > 0 ) {
-                               that.size.width = newWidth;
-                               that.position.left = op.left - ox;
-                       } else {
-                               newWidth = gridX - outerDimensions.width;
-                               that.size.width = newWidth;
-                               that.position.left = op.left + os.width - newWidth;
+                       for ( i = this.containers.length - 1; i >= 0; i-- ) {
+                               p = this.containers[ i ].element.offset();
+                               this.containers[ i ].containerCache.left = p.left;
+                               this.containers[ i ].containerCache.top = p.top;
+                               this.containers[ i ].containerCache.width =
+                                       this.containers[ i ].element.outerWidth();
+                               this.containers[ i ].containerCache.height =
+                                       this.containers[ i ].element.outerHeight();
                        }
                }
-       }
 
-});
+               return this;
+       },
 
-var resizable = $.ui.resizable;
+       _createPlaceholder: function( that ) {
+               that = that || this;
+               var className,
+                       o = that.options;
 
+               if ( !o.placeholder || o.placeholder.constructor === String ) {
+                       className = o.placeholder;
+                       o.placeholder = {
+                               element: function() {
 
-/*!
- * jQuery UI Selectable 1.11.4
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/selectable/
- */
+                                       var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
+                                               element = $( "<" + nodeName + ">", that.document[ 0 ] );
 
+                                               that._addClass( element, "ui-sortable-placeholder",
+                                                               className || that.currentItem[ 0 ].className )
+                                                       ._removeClass( element, "ui-sortable-helper" );
 
-var selectable = $.widget("ui.selectable", $.ui.mouse, {
-       version: "1.11.4",
-       options: {
-               appendTo: "body",
-               autoRefresh: true,
-               distance: 0,
-               filter: "*",
-               tolerance: "touch",
-
-               // callbacks
-               selected: null,
-               selecting: null,
-               start: null,
-               stop: null,
-               unselected: null,
-               unselecting: null
-       },
-       _create: function() {
-               var selectees,
-                       that = this;
+                                       if ( nodeName === "tbody" ) {
+                                               that._createTrPlaceholder(
+                                                       that.currentItem.find( "tr" ).eq( 0 ),
+                                                       $( "<tr>", that.document[ 0 ] ).appendTo( element )
+                                               );
+                                       } else if ( nodeName === "tr" ) {
+                                               that._createTrPlaceholder( that.currentItem, element );
+                                       } else if ( nodeName === "img" ) {
+                                               element.attr( "src", that.currentItem.attr( "src" ) );
+                                       }
 
-               this.element.addClass("ui-selectable");
-
-               this.dragged = false;
-
-               // cache selectee children based on filter
-               this.refresh = function() {
-                       selectees = $(that.options.filter, that.element[0]);
-                       selectees.addClass("ui-selectee");
-                       selectees.each(function() {
-                               var $this = $(this),
-                                       pos = $this.offset();
-                               $.data(this, "selectable-item", {
-                                       element: this,
-                                       $element: $this,
-                                       left: pos.left,
-                                       top: pos.top,
-                                       right: pos.left + $this.outerWidth(),
-                                       bottom: pos.top + $this.outerHeight(),
-                                       startselected: false,
-                                       selected: $this.hasClass("ui-selected"),
-                                       selecting: $this.hasClass("ui-selecting"),
-                                       unselecting: $this.hasClass("ui-unselecting")
-                               });
-                       });
-               };
-               this.refresh();
+                                       if ( !className ) {
+                                               element.css( "visibility", "hidden" );
+                                       }
 
-               this.selectees = selectees.addClass("ui-selectee");
+                                       return element;
+                               },
+                               update: function( container, p ) {
 
-               this._mouseInit();
+                                       // 1. If a className is set as 'placeholder option, we don't force sizes -
+                                       // the class is responsible for that
+                                       // 2. The option 'forcePlaceholderSize can be enabled to force it even if a
+                                       // class name is specified
+                                       if ( className && !o.forcePlaceholderSize ) {
+                                               return;
+                                       }
 
-               this.helper = $("<div class='ui-selectable-helper'></div>");
-       },
+                                       //If the element doesn't have a actual height by itself (without styles coming
+                                       // from a stylesheet), it receives the inline height from the dragged item
+                                       if ( !p.height() ) {
+                                               p.height(
+                                                       that.currentItem.innerHeight() -
+                                                       parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
+                                                       parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
+                                       }
+                                       if ( !p.width() ) {
+                                               p.width(
+                                                       that.currentItem.innerWidth() -
+                                                       parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
+                                                       parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
+                                       }
+                               }
+                       };
+               }
 
-       _destroy: function() {
-               this.selectees
-                       .removeClass("ui-selectee")
-                       .removeData("selectable-item");
-               this.element
-                       .removeClass("ui-selectable ui-selectable-disabled");
-               this._mouseDestroy();
-       },
+               //Create the placeholder
+               that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
 
-       _mouseStart: function(event) {
-               var that = this,
-                       options = this.options;
+               //Append it after the actual current item
+               that.currentItem.after( that.placeholder );
 
-               this.opos = [ event.pageX, event.pageY ];
+               //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+               o.placeholder.update( that, that.placeholder );
 
-               if (this.options.disabled) {
-                       return;
-               }
+       },
 
-               this.selectees = $(options.filter, this.element[0]);
-
-               this._trigger("start", event);
-
-               $(options.appendTo).append(this.helper);
-               // position helper (lasso)
-               this.helper.css({
-                       "left": event.pageX,
-                       "top": event.pageY,
-                       "width": 0,
-                       "height": 0
-               });
-
-               if (options.autoRefresh) {
-                       this.refresh();
-               }
-
-               this.selectees.filter(".ui-selected").each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       selectee.startselected = true;
-                       if (!event.metaKey && !event.ctrlKey) {
-                               selectee.$element.removeClass("ui-selected");
-                               selectee.selected = false;
-                               selectee.$element.addClass("ui-unselecting");
-                               selectee.unselecting = true;
-                               // selectable UNSELECTING callback
-                               that._trigger("unselecting", event, {
-                                       unselecting: selectee.element
-                               });
-                       }
-               });
-
-               $(event.target).parents().addBack().each(function() {
-                       var doSelect,
-                               selectee = $.data(this, "selectable-item");
-                       if (selectee) {
-                               doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
-                               selectee.$element
-                                       .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
-                                       .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
-                               selectee.unselecting = !doSelect;
-                               selectee.selecting = doSelect;
-                               selectee.selected = doSelect;
-                               // selectable (UN)SELECTING callback
-                               if (doSelect) {
-                                       that._trigger("selecting", event, {
-                                               selecting: selectee.element
-                                       });
-                               } else {
-                                       that._trigger("unselecting", event, {
-                                               unselecting: selectee.element
-                                       });
-                               }
-                               return false;
-                       }
-               });
+       _createTrPlaceholder: function( sourceTr, targetTr ) {
+               var that = this;
 
+               sourceTr.children().each( function() {
+                       $( "<td>&#160;</td>", that.document[ 0 ] )
+                               .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
+                               .appendTo( targetTr );
+               } );
        },
 
-       _mouseDrag: function(event) {
+       _contactContainers: function( event ) {
+               var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
+                       floating, axis,
+                       innermostContainer = null,
+                       innermostIndex = null;
 
-               this.dragged = true;
+               // Get innermost container that intersects with item
+               for ( i = this.containers.length - 1; i >= 0; i-- ) {
 
-               if (this.options.disabled) {
-                       return;
-               }
+                       // Never consider a container that's located within the item itself
+                       if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
+                               continue;
+                       }
+
+                       if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
 
-               var tmp,
-                       that = this,
-                       options = this.options,
-                       x1 = this.opos[0],
-                       y1 = this.opos[1],
-                       x2 = event.pageX,
-                       y2 = event.pageY;
+                               // If we've already found a container and it's more "inner" than this, then continue
+                               if ( innermostContainer &&
+                                               $.contains(
+                                                       this.containers[ i ].element[ 0 ],
+                                                       innermostContainer.element[ 0 ] ) ) {
+                                       continue;
+                               }
 
-               if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
-               if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
-               this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
+                               innermostContainer = this.containers[ i ];
+                               innermostIndex = i;
 
-               this.selectees.each(function() {
-                       var selectee = $.data(this, "selectable-item"),
-                               hit = false;
+                       } else {
 
-                       //prevent helper from being selected if appendTo: selectable
-                       if (!selectee || selectee.element === that.element[0]) {
-                               return;
+                               // container doesn't intersect. trigger "out" event if necessary
+                               if ( this.containers[ i ].containerCache.over ) {
+                                       this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
+                                       this.containers[ i ].containerCache.over = 0;
+                               }
                        }
 
-                       if (options.tolerance === "touch") {
-                               hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
-                       } else if (options.tolerance === "fit") {
-                               hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+               }
+
+               // If no intersecting containers found, return
+               if ( !innermostContainer ) {
+                       return;
+               }
+
+               // Move the item into the container if it's not there already
+               if ( this.containers.length === 1 ) {
+                       if ( !this.containers[ innermostIndex ].containerCache.over ) {
+                               this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
+                               this.containers[ innermostIndex ].containerCache.over = 1;
                        }
+               } else {
 
-                       if (hit) {
-                               // SELECT
-                               if (selectee.selected) {
-                                       selectee.$element.removeClass("ui-selected");
-                                       selectee.selected = false;
-                               }
-                               if (selectee.unselecting) {
-                                       selectee.$element.removeClass("ui-unselecting");
-                                       selectee.unselecting = false;
+                       // When entering a new container, we will find the item with the least distance and
+                       // append our item near it
+                       dist = 10000;
+                       itemWithLeastDistance = null;
+                       floating = innermostContainer.floating || this._isFloating( this.currentItem );
+                       posProperty = floating ? "left" : "top";
+                       sizeProperty = floating ? "width" : "height";
+                       axis = floating ? "pageX" : "pageY";
+
+                       for ( j = this.items.length - 1; j >= 0; j-- ) {
+                               if ( !$.contains(
+                                               this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
+                               ) {
+                                       continue;
                                }
-                               if (!selectee.selecting) {
-                                       selectee.$element.addClass("ui-selecting");
-                                       selectee.selecting = true;
-                                       // selectable SELECTING callback
-                                       that._trigger("selecting", event, {
-                                               selecting: selectee.element
-                                       });
+                               if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
+                                       continue;
                                }
-                       } else {
-                               // UNSELECT
-                               if (selectee.selecting) {
-                                       if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
-                                               selectee.$element.removeClass("ui-selecting");
-                                               selectee.selecting = false;
-                                               selectee.$element.addClass("ui-selected");
-                                               selectee.selected = true;
-                                       } else {
-                                               selectee.$element.removeClass("ui-selecting");
-                                               selectee.selecting = false;
-                                               if (selectee.startselected) {
-                                                       selectee.$element.addClass("ui-unselecting");
-                                                       selectee.unselecting = true;
-                                               }
-                                               // selectable UNSELECTING callback
-                                               that._trigger("unselecting", event, {
-                                                       unselecting: selectee.element
-                                               });
-                                       }
+
+                               cur = this.items[ j ].item.offset()[ posProperty ];
+                               nearBottom = false;
+                               if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
+                                       nearBottom = true;
                                }
-                               if (selectee.selected) {
-                                       if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
-                                               selectee.$element.removeClass("ui-selected");
-                                               selectee.selected = false;
-
-                                               selectee.$element.addClass("ui-unselecting");
-                                               selectee.unselecting = true;
-                                               // selectable UNSELECTING callback
-                                               that._trigger("unselecting", event, {
-                                                       unselecting: selectee.element
-                                               });
-                                       }
+
+                               if ( Math.abs( event[ axis ] - cur ) < dist ) {
+                                       dist = Math.abs( event[ axis ] - cur );
+                                       itemWithLeastDistance = this.items[ j ];
+                                       this.direction = nearBottom ? "up" : "down";
                                }
                        }
-               });
 
-               return false;
-       },
+                       //Check if dropOnEmpty is enabled
+                       if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
+                               return;
+                       }
 
-       _mouseStop: function(event) {
-               var that = this;
+                       if ( this.currentContainer === this.containers[ innermostIndex ] ) {
+                               if ( !this.currentContainer.containerCache.over ) {
+                                       this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
+                                       this.currentContainer.containerCache.over = 1;
+                               }
+                               return;
+                       }
 
-               this.dragged = false;
-
-               $(".ui-unselecting", this.element[0]).each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       selectee.$element.removeClass("ui-unselecting");
-                       selectee.unselecting = false;
-                       selectee.startselected = false;
-                       that._trigger("unselected", event, {
-                               unselected: selectee.element
-                       });
-               });
-               $(".ui-selecting", this.element[0]).each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
-                       selectee.selecting = false;
-                       selectee.selected = true;
-                       selectee.startselected = true;
-                       that._trigger("selected", event, {
-                               selected: selectee.element
-                       });
-               });
-               this._trigger("stop", event);
-
-               this.helper.remove();
+                       itemWithLeastDistance ?
+                               this._rearrange( event, itemWithLeastDistance, null, true ) :
+                               this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
+                       this._trigger( "change", event, this._uiHash() );
+                       this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
+                       this.currentContainer = this.containers[ innermostIndex ];
 
-               return false;
-       }
+                       //Update the placeholder
+                       this.options.placeholder.update( this.currentContainer, this.placeholder );
 
-});
+                       this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
+                       this.containers[ innermostIndex ].containerCache.over = 1;
+               }
 
+       },
 
-/*!
- * jQuery UI Sortable 1.11.4
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/sortable/
- */
+       _createHelper: function( event ) {
 
+               var o = this.options,
+                       helper = $.isFunction( o.helper ) ?
+                               $( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
+                               ( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
 
-var sortable = $.widget("ui.sortable", $.ui.mouse, {
-       version: "1.11.4",
-       widgetEventPrefix: "sort",
-       ready: false,
-       options: {
-               appendTo: "parent",
-               axis: false,
-               connectWith: false,
-               containment: false,
-               cursor: "auto",
-               cursorAt: false,
-               dropOnEmpty: true,
-               forcePlaceholderSize: false,
-               forceHelperSize: false,
-               grid: false,
-               handle: false,
-               helper: "original",
-               items: "> *",
-               opacity: false,
-               placeholder: false,
-               revert: false,
-               scroll: true,
-               scrollSensitivity: 20,
-               scrollSpeed: 20,
-               scope: "default",
-               tolerance: "intersect",
-               zIndex: 1000,
+               //Add the helper to the DOM if that didn't happen already
+               if ( !helper.parents( "body" ).length ) {
+                       $( o.appendTo !== "parent" ?
+                               o.appendTo :
+                               this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
+               }
+
+               if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
+                       this._storedCSS = {
+                               width: this.currentItem[ 0 ].style.width,
+                               height: this.currentItem[ 0 ].style.height,
+                               position: this.currentItem.css( "position" ),
+                               top: this.currentItem.css( "top" ),
+                               left: this.currentItem.css( "left" )
+                       };
+               }
 
-               // callbacks
-               activate: null,
-               beforeStop: null,
-               change: null,
-               deactivate: null,
-               out: null,
-               over: null,
-               receive: null,
-               remove: null,
-               sort: null,
-               start: null,
-               stop: null,
-               update: null
-       },
+               if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
+                       helper.width( this.currentItem.width() );
+               }
+               if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
+                       helper.height( this.currentItem.height() );
+               }
+
+               return helper;
 
-       _isOverAxis: function( x, reference, size ) {
-               return ( x >= reference ) && ( x < ( reference + size ) );
        },
 
-       _isFloating: function( item ) {
-               return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
+       _adjustOffsetFromHelper: function( obj ) {
+               if ( typeof obj === "string" ) {
+                       obj = obj.split( " " );
+               }
+               if ( $.isArray( obj ) ) {
+                       obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
+               }
+               if ( "left" in obj ) {
+                       this.offset.click.left = obj.left + this.margins.left;
+               }
+               if ( "right" in obj ) {
+                       this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+               }
+               if ( "top" in obj ) {
+                       this.offset.click.top = obj.top + this.margins.top;
+               }
+               if ( "bottom" in obj ) {
+                       this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+               }
        },
 
-       _create: function() {
-               this.containerCache = {};
-               this.element.addClass("ui-sortable");
-
-               //Get the items
-               this.refresh();
+       _getParentOffset: function() {
 
-               //Let's determine the parent's offset
-               this.offset = this.element.offset();
+               //Get the offsetParent and cache its position
+               this.offsetParent = this.helper.offsetParent();
+               var po = this.offsetParent.offset();
 
-               //Initialize mouse events for interaction
-               this._mouseInit();
+               // This is a special case where we need to modify a offset calculated on start, since the
+               // following happened:
+               // 1. The position of the helper is absolute, so it's position is calculated based on the
+               // next positioned parent
+               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
+               // the document, which means that the scroll is included in the initial calculation of the
+               // offset of the parent, and never recalculated upon drag
+               if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+                               $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
+                       po.left += this.scrollParent.scrollLeft();
+                       po.top += this.scrollParent.scrollTop();
+               }
 
-               this._setHandleClassName();
+               // This needs to be actually done for all browsers, since pageX/pageY includes this
+               // information with an ugly IE fix
+               if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
+                               ( this.offsetParent[ 0 ].tagName &&
+                               this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
+                       po = { top: 0, left: 0 };
+               }
 
-               //We're ready to go
-               this.ready = true;
+               return {
+                       top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
+                       left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
+               };
 
        },
 
-       _setOption: function( key, value ) {
-               this._super( key, value );
+       _getRelativeOffset: function() {
 
-               if ( key === "handle" ) {
-                       this._setHandleClassName();
+               if ( this.cssPosition === "relative" ) {
+                       var p = this.currentItem.position();
+                       return {
+                               top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
+                                       this.scrollParent.scrollTop(),
+                               left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
+                                       this.scrollParent.scrollLeft()
+                       };
+               } else {
+                       return { top: 0, left: 0 };
                }
+
        },
 
-       _setHandleClassName: function() {
-               this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
-               $.each( this.items, function() {
-                       ( this.instance.options.handle ?
-                               this.item.find( this.instance.options.handle ) : this.item )
-                               .addClass( "ui-sortable-handle" );
-               });
+       _cacheMargins: function() {
+               this.margins = {
+                       left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
+                       top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
+               };
        },
 
-       _destroy: function() {
-               this.element
-                       .removeClass( "ui-sortable ui-sortable-disabled" )
-                       .find( ".ui-sortable-handle" )
-                               .removeClass( "ui-sortable-handle" );
-               this._mouseDestroy();
+       _cacheHelperProportions: function() {
+               this.helperProportions = {
+                       width: this.helper.outerWidth(),
+                       height: this.helper.outerHeight()
+               };
+       },
 
-               for ( var i = this.items.length - 1; i >= 0; i-- ) {
-                       this.items[i].item.removeData(this.widgetName + "-item");
+       _setContainment: function() {
+
+               var ce, co, over,
+                       o = this.options;
+               if ( o.containment === "parent" ) {
+                       o.containment = this.helper[ 0 ].parentNode;
+               }
+               if ( o.containment === "document" || o.containment === "window" ) {
+                       this.containment = [
+                               0 - this.offset.relative.left - this.offset.parent.left,
+                               0 - this.offset.relative.top - this.offset.parent.top,
+                               o.containment === "document" ?
+                                       this.document.width() :
+                                       this.window.width() - this.helperProportions.width - this.margins.left,
+                               ( o.containment === "document" ?
+                                       ( this.document.height() || document.body.parentNode.scrollHeight ) :
+                                       this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
+                               ) - this.helperProportions.height - this.margins.top
+                       ];
+               }
+
+               if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
+                       ce = $( o.containment )[ 0 ];
+                       co = $( o.containment ).offset();
+                       over = ( $( ce ).css( "overflow" ) !== "hidden" );
+
+                       this.containment = [
+                               co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
+                                       ( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
+                               co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
+                                       ( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
+                               co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
+                                       ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
+                                       ( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
+                                       this.helperProportions.width - this.margins.left,
+                               co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
+                                       ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
+                                       ( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
+                                       this.helperProportions.height - this.margins.top
+                       ];
                }
 
-               return this;
        },
 
-       _mouseCapture: function(event, overrideHandle) {
-               var currentItem = null,
-                       validHandle = false,
-                       that = this;
+       _convertPositionTo: function( d, pos ) {
 
-               if (this.reverting) {
-                       return false;
+               if ( !pos ) {
+                       pos = this.position;
                }
+               var mod = d === "absolute" ? 1 : -1,
+                       scroll = this.cssPosition === "absolute" &&
+                               !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+                               $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
+                                       this.offsetParent :
+                                       this.scrollParent,
+                       scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
 
-               if(this.options.disabled || this.options.type === "static") {
-                       return false;
-               }
+               return {
+                       top: (
 
-               //We have to refresh the items data once first
-               this._refreshItems(event);
+                               // The absolute mouse position
+                               pos.top +
 
-               //Find out if the clicked node (or one of its parents) is a actual item in this.items
-               $(event.target).parents().each(function() {
-                       if($.data(this, that.widgetName + "-item") === that) {
-                               currentItem = $(this);
-                               return false;
-                       }
-               });
-               if($.data(event.target, that.widgetName + "-item") === that) {
-                       currentItem = $(event.target);
-               }
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.top * mod +
 
-               if(!currentItem) {
-                       return false;
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.top * mod -
+                               ( ( this.cssPosition === "fixed" ?
+                                       -this.scrollParent.scrollTop() :
+                                       ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
+                       ),
+                       left: (
+
+                               // The absolute mouse position
+                               pos.left +
+
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.left * mod +
+
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.left * mod   -
+                               ( ( this.cssPosition === "fixed" ?
+                                       -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
+                                       scroll.scrollLeft() ) * mod )
+                       )
+               };
+
+       },
+
+       _generatePosition: function( event ) {
+
+               var top, left,
+                       o = this.options,
+                       pageX = event.pageX,
+                       pageY = event.pageY,
+                       scroll = this.cssPosition === "absolute" &&
+                               !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+                               $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
+                                       this.offsetParent :
+                                       this.scrollParent,
+                               scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
+
+               // This is another very weird special case that only happens for relative elements:
+               // 1. If the css position is relative
+               // 2. and the scroll parent is the document or similar to the offset parent
+               // we have to refresh the relative offset during the scroll so there are no jumps
+               if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+                               this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
+                       this.offset.relative = this._getRelativeOffset();
                }
-               if(this.options.handle && !overrideHandle) {
-                       $(this.options.handle, currentItem).find("*").addBack().each(function() {
-                               if(this === event.target) {
-                                       validHandle = true;
+
+               /*
+                * - Position constraining -
+                * Constrain the position to a mix of grid, containment.
+                */
+
+               if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
+
+                       if ( this.containment ) {
+                               if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
+                                       pageX = this.containment[ 0 ] + this.offset.click.left;
+                               }
+                               if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
+                                       pageY = this.containment[ 1 ] + this.offset.click.top;
+                               }
+                               if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
+                                       pageX = this.containment[ 2 ] + this.offset.click.left;
+                               }
+                               if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
+                                       pageY = this.containment[ 3 ] + this.offset.click.top;
                                }
-                       });
-                       if(!validHandle) {
-                               return false;
                        }
-               }
 
-               this.currentItem = currentItem;
-               this._removeCurrentsFromItems();
-               return true;
+                       if ( o.grid ) {
+                               top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
+                                       o.grid[ 1 ] ) * o.grid[ 1 ];
+                               pageY = this.containment ?
+                                       ( ( top - this.offset.click.top >= this.containment[ 1 ] &&
+                                               top - this.offset.click.top <= this.containment[ 3 ] ) ?
+                                                       top :
+                                                       ( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
+                                                               top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
+                                                               top;
 
-       },
+                               left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
+                                       o.grid[ 0 ] ) * o.grid[ 0 ];
+                               pageX = this.containment ?
+                                       ( ( left - this.offset.click.left >= this.containment[ 0 ] &&
+                                               left - this.offset.click.left <= this.containment[ 2 ] ) ?
+                                                       left :
+                                                       ( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
+                                                               left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
+                                                               left;
+                       }
 
-       _mouseStart: function(event, overrideHandle, noActivation) {
+               }
 
-               var i, body,
-                       o = this.options;
+               return {
+                       top: (
 
-               this.currentContainer = this;
+                               // The absolute mouse position
+                               pageY -
 
-               //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
-               this.refreshPositions();
+                               // Click offset (relative to the element)
+                               this.offset.click.top -
 
-               //Create and append the visible helper
-               this.helper = this._createHelper(event);
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.top -
 
-               //Cache the helper size
-               this._cacheHelperProportions();
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.top +
+                               ( ( this.cssPosition === "fixed" ?
+                                       -this.scrollParent.scrollTop() :
+                                       ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
+                       ),
+                       left: (
 
-               /*
-                * - Position generation -
-                * This block generates everything position related - it's the core of draggables.
-                */
+                               // The absolute mouse position
+                               pageX -
 
-               //Cache the margins of the original element
-               this._cacheMargins();
+                               // Click offset (relative to the element)
+                               this.offset.click.left -
 
-               //Get the next scrolling parent
-               this.scrollParent = this.helper.scrollParent();
+                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               this.offset.relative.left -
 
-               //The element's absolute position on the page minus margins
-               this.offset = this.currentItem.offset();
-               this.offset = {
-                       top: this.offset.top - this.margins.top,
-                       left: this.offset.left - this.margins.left
+                               // The offsetParent's offset without borders (offset + border)
+                               this.offset.parent.left +
+                               ( ( this.cssPosition === "fixed" ?
+                                       -this.scrollParent.scrollLeft() :
+                                       scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
+                       )
                };
 
-               $.extend(this.offset, {
-                       click: { //Where the click happened, relative to the element
-                               left: event.pageX - this.offset.left,
-                               top: event.pageY - this.offset.top
-                       },
-                       parent: this._getParentOffset(),
-                       relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-               });
+       },
 
-               // Only after we got the offset, we can change the helper's position to absolute
-               // TODO: Still need to figure out a way to make relative sorting possible
-               this.helper.css("position", "absolute");
-               this.cssPosition = this.helper.css("position");
+       _rearrange: function( event, i, a, hardRefresh ) {
 
-               //Generate the original position
-               this.originalPosition = this._generatePosition(event);
-               this.originalPageX = event.pageX;
-               this.originalPageY = event.pageY;
+               a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
+                       i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
+                               ( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
 
-               //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
-               (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+               //Various things done here to improve the performance:
+               // 1. we create a setTimeout, that calls refreshPositions
+               // 2. on the instance, we have a counter variable, that get's higher after every append
+               // 3. on the local scope, we copy the counter variable, and check in the timeout,
+               // if it's still the same
+               // 4. this lets only the last addition to the timeout stack through
+               this.counter = this.counter ? ++this.counter : 1;
+               var counter = this.counter;
 
-               //Cache the former DOM position
-               this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+               this._delay( function() {
+                       if ( counter === this.counter ) {
 
-               //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
-               if(this.helper[0] !== this.currentItem[0]) {
-                       this.currentItem.hide();
-               }
+                               //Precompute after each DOM insertion, NOT on mousemove
+                               this.refreshPositions( !hardRefresh );
+                       }
+               } );
 
-               //Create the placeholder
-               this._createPlaceholder();
+       },
 
-               //Set a containment if given in the options
-               if(o.containment) {
-                       this._setContainment();
-               }
+       _clear: function( event, noPropagation ) {
 
-               if( o.cursor && o.cursor !== "auto" ) { // cursor option
-                       body = this.document.find( "body" );
+               this.reverting = false;
 
-                       // support: IE
-                       this.storedCursor = body.css( "cursor" );
-                       body.css( "cursor", o.cursor );
+               // We delay all events that have to be triggered to after the point where the placeholder
+               // has been removed and everything else normalized again
+               var i,
+                       delayedTriggers = [];
 
-                       this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
+               // We first have to update the dom position of the actual currentItem
+               // Note: don't do it if the current item is already removed (by a user), or it gets
+               // reappended (see #4088)
+               if ( !this._noFinalSort && this.currentItem.parent().length ) {
+                       this.placeholder.before( this.currentItem );
                }
+               this._noFinalSort = null;
 
-               if(o.opacity) { // opacity option
-                       if (this.helper.css("opacity")) {
-                               this._storedOpacity = this.helper.css("opacity");
+               if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
+                       for ( i in this._storedCSS ) {
+                               if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
+                                       this._storedCSS[ i ] = "";
+                               }
                        }
-                       this.helper.css("opacity", o.opacity);
+                       this.currentItem.css( this._storedCSS );
+                       this._removeClass( this.currentItem, "ui-sortable-helper" );
+               } else {
+                       this.currentItem.show();
                }
 
-               if(o.zIndex) { // zIndex option
-                       if (this.helper.css("zIndex")) {
-                               this._storedZIndex = this.helper.css("zIndex");
-                       }
-                       this.helper.css("zIndex", o.zIndex);
+               if ( this.fromOutside && !noPropagation ) {
+                       delayedTriggers.push( function( event ) {
+                               this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
+                       } );
                }
+               if ( ( this.fromOutside ||
+                               this.domPosition.prev !==
+                               this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
+                               this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
 
-               //Prepare scrolling
-               if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
-                       this.overflowOffset = this.scrollParent.offset();
+                       // Trigger update callback if the DOM position has changed
+                       delayedTriggers.push( function( event ) {
+                               this._trigger( "update", event, this._uiHash() );
+                       } );
                }
 
-               //Call callbacks
-               this._trigger("start", event, this._uiHash());
-
-               //Recache the helper size
-               if(!this._preserveHelperProportions) {
-                       this._cacheHelperProportions();
+               // Check if the items Container has Changed and trigger appropriate
+               // events.
+               if ( this !== this.currentContainer ) {
+                       if ( !noPropagation ) {
+                               delayedTriggers.push( function( event ) {
+                                       this._trigger( "remove", event, this._uiHash() );
+                               } );
+                               delayedTriggers.push( ( function( c ) {
+                                       return function( event ) {
+                                               c._trigger( "receive", event, this._uiHash( this ) );
+                                       };
+                               } ).call( this, this.currentContainer ) );
+                               delayedTriggers.push( ( function( c ) {
+                                       return function( event ) {
+                                               c._trigger( "update", event, this._uiHash( this ) );
+                                       };
+                               } ).call( this, this.currentContainer ) );
+                       }
                }
 
-
-               //Post "activate" events to possible containers
-               if( !noActivation ) {
-                       for ( i = this.containers.length - 1; i >= 0; i-- ) {
-                               this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
+               //Post events to containers
+               function delayEvent( type, instance, container ) {
+                       return function( event ) {
+                               container._trigger( type, event, instance._uiHash( instance ) );
+                       };
+               }
+               for ( i = this.containers.length - 1; i >= 0; i-- ) {
+                       if ( !noPropagation ) {
+                               delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
+                       }
+                       if ( this.containers[ i ].containerCache.over ) {
+                               delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
+                               this.containers[ i ].containerCache.over = 0;
                        }
                }
 
-               //Prepare possible droppables
-               if($.ui.ddmanager) {
-                       $.ui.ddmanager.current = this;
+               //Do what was originally in plugins
+               if ( this.storedCursor ) {
+                       this.document.find( "body" ).css( "cursor", this.storedCursor );
+                       this.storedStylesheet.remove();
                }
-
-               if ($.ui.ddmanager && !o.dropBehaviour) {
-                       $.ui.ddmanager.prepareOffsets(this, event);
+               if ( this._storedOpacity ) {
+                       this.helper.css( "opacity", this._storedOpacity );
+               }
+               if ( this._storedZIndex ) {
+                       this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
                }
 
-               this.dragging = true;
-
-               this.helper.addClass("ui-sortable-helper");
-               this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-               return true;
-
-       },
+               this.dragging = false;
 
-       _mouseDrag: function(event) {
-               var i, item, itemElement, intersection,
-                       o = this.options,
-                       scrolled = false;
+               if ( !noPropagation ) {
+                       this._trigger( "beforeStop", event, this._uiHash() );
+               }
 
-               //Compute the helpers position
-               this.position = this._generatePosition(event);
-               this.positionAbs = this._convertPositionTo("absolute");
+               //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
+               // it unbinds ALL events from the original node!
+               this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
 
-               if (!this.lastPositionAbs) {
-                       this.lastPositionAbs = this.positionAbs;
+               if ( !this.cancelHelperRemoval ) {
+                       if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+                               this.helper.remove();
+                       }
+                       this.helper = null;
                }
 
-               //Do scrolling
-               if(this.options.scroll) {
-                       if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
+               if ( !noPropagation ) {
+                       for ( i = 0; i < delayedTriggers.length; i++ ) {
 
-                               if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
-                                       this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
-                               } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
-                                       this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
-                               }
+                               // Trigger all delayed events
+                               delayedTriggers[ i ].call( this, event );
+                       }
+                       this._trigger( "stop", event, this._uiHash() );
+               }
 
-                               if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
-                                       this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
-                               } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
-                                       this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
-                               }
+               this.fromOutside = false;
+               return !this.cancelHelperRemoval;
 
-                       } else {
+       },
 
-                               if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
-                                       scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
-                               } else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
-                                       scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
-                               }
+       _trigger: function() {
+               if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
+                       this.cancel();
+               }
+       },
 
-                               if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
-                                       scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
-                               } else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
-                                       scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
-                               }
+       _uiHash: function( _inst ) {
+               var inst = _inst || this;
+               return {
+                       helper: inst.helper,
+                       placeholder: inst.placeholder || $( [] ),
+                       position: inst.position,
+                       originalPosition: inst.originalPosition,
+                       offset: inst.positionAbs,
+                       item: inst.currentItem,
+                       sender: _inst ? _inst.element : null
+               };
+       }
 
-                       }
+} );
 
-                       if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
-                               $.ui.ddmanager.prepareOffsets(this, event);
-                       }
-               }
 
-               //Regenerate the absolute position used for position checks
-               this.positionAbs = this._convertPositionTo("absolute");
+// jscs:disable maximumLineLength
+/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
+/*!
+ * jQuery UI Datepicker 1.12.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
 
-               //Set the helper position
-               if(!this.options.axis || this.options.axis !== "y") {
-                       this.helper[0].style.left = this.position.left+"px";
-               }
-               if(!this.options.axis || this.options.axis !== "x") {
-                       this.helper[0].style.top = this.position.top+"px";
-               }
+//>>label: Datepicker
+//>>group: Widgets
+//>>description: Displays a calendar from an input or inline for selecting dates.
+//>>docs: http://api.jqueryui.com/datepicker/
+//>>demos: http://jqueryui.com/datepicker/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/datepicker.css
+//>>css.theme: ../../themes/base/theme.css
 
-               //Rearrange
-               for (i = this.items.length - 1; i >= 0; i--) {
 
-                       //Cache variables and intersection, continue if no intersection
-                       item = this.items[i];
-                       itemElement = item.item[0];
-                       intersection = this._intersectsWithPointer(item);
-                       if (!intersection) {
-                               continue;
-                       }
 
-                       // Only put the placeholder inside the current Container, skip all
-                       // items from other containers. This works because when moving
-                       // an item from one container to another the
-                       // currentContainer is switched before the placeholder is moved.
-                       //
-                       // Without this, moving items in "sub-sortables" can cause
-                       // the placeholder to jitter between the outer and inner container.
-                       if (item.instance !== this.currentContainer) {
-                               continue;
-                       }
+$.extend( $.ui, { datepicker: { version: "1.12.0" } } );
 
-                       // cannot intersect with itself
-                       // no useless actions that have been done before
-                       // no action if the item moved is the parent of the item checked
-                       if (itemElement !== this.currentItem[0] &&
-                               this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
-                               !$.contains(this.placeholder[0], itemElement) &&
-                               (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
-                       ) {
+var datepicker_instActive;
 
-                               this.direction = intersection === 1 ? "down" : "up";
+function datepicker_getZindex( elem ) {
+       var position, value;
+       while ( elem.length && elem[ 0 ] !== document ) {
 
-                               if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
-                                       this._rearrange(event, item);
-                               } else {
-                                       break;
-                               }
+               // Ignore z-index if position is set to a value where z-index is ignored by the browser
+               // This makes behavior of this function consistent across browsers
+               // WebKit always returns auto if the element is positioned
+               position = elem.css( "position" );
+               if ( position === "absolute" || position === "relative" || position === "fixed" ) {
 
-                               this._trigger("change", event, this._uiHash());
-                               break;
+                       // IE returns 0 when zIndex is not specified
+                       // other browsers return a string
+                       // we ignore the case of nested elements with an explicit value of 0
+                       // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+                       value = parseInt( elem.css( "zIndex" ), 10 );
+                       if ( !isNaN( value ) && value !== 0 ) {
+                               return value;
                        }
                }
+               elem = elem.parent();
+       }
 
-               //Post events to containers
-               this._contactContainers(event);
-
-               //Interconnect with droppables
-               if($.ui.ddmanager) {
-                       $.ui.ddmanager.drag(this, event);
-               }
+       return 0;
+}
+/* Date picker manager.
+   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+   Settings for (groups of) date pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Datepicker() {
+       this._curInst = null; // The current instance in use
+       this._keyEvent = false; // If the last event was a key event
+       this._disabledInputs = []; // List of date picker inputs that have been disabled
+       this._datepickerShowing = false; // True if the popup picker is showing , false if not
+       this._inDialog = false; // True if showing within a "dialog", false if not
+       this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
+       this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
+       this._appendClass = "ui-datepicker-append"; // The name of the append marker class
+       this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
+       this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
+       this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
+       this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
+       this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
+       this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
+       this.regional = []; // Available regional settings, indexed by language code
+       this.regional[ "" ] = { // Default regional settings
+               closeText: "Done", // Display text for close link
+               prevText: "Prev", // Display text for previous month link
+               nextText: "Next", // Display text for next month link
+               currentText: "Today", // Display text for current month link
+               monthNames: [ "January","February","March","April","May","June",
+                       "July","August","September","October","November","December" ], // Names of months for drop-down and formatting
+               monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
+               dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
+               dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
+               dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
+               weekHeader: "Wk", // Column header for week of the year
+               dateFormat: "mm/dd/yy", // See format options on parseDate
+               firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+               isRTL: false, // True if right-to-left language, false if left-to-right
+               showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+               yearSuffix: "" // Additional text to append to the year in the month headers
+       };
+       this._defaults = { // Global defaults for all the date picker instances
+               showOn: "focus", // "focus" for popup on focus,
+                       // "button" for trigger button, or "both" for either
+               showAnim: "fadeIn", // Name of jQuery animation for popup
+               showOptions: {}, // Options for enhanced animations
+               defaultDate: null, // Used when field is blank: actual date,
+                       // +/-number for offset from today, null for today
+               appendText: "", // Display text following the input box, e.g. showing the format
+               buttonText: "...", // Text for trigger button
+               buttonImage: "", // URL for trigger button image
+               buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+               hideIfNoPrevNext: false, // True to hide next/previous month links
+                       // if not applicable, false to just disable them
+               navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+               gotoCurrent: false, // True if today link goes back to current selection instead
+               changeMonth: false, // True if month can be selected directly, false if only prev/next
+               changeYear: false, // True if year can be selected directly, false if only prev/next
+               yearRange: "c-10:c+10", // Range of years to display in drop-down,
+                       // either relative to today's year (-nn:+nn), relative to currently displayed year
+                       // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+               showOtherMonths: false, // True to show dates in other months, false to leave blank
+               selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+               showWeek: false, // True to show week of the year, false to not show it
+               calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+                       // takes a Date and returns the number of the week for it
+               shortYearCutoff: "+10", // Short year values < this are in the current century,
+                       // > this are in the previous century,
+                       // string value starting with "+" for current year + value
+               minDate: null, // The earliest selectable date, or null for no limit
+               maxDate: null, // The latest selectable date, or null for no limit
+               duration: "fast", // Duration of display/closure
+               beforeShowDay: null, // Function that takes a date and returns an array with
+                       // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
+                       // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+               beforeShow: null, // Function that takes an input field and
+                       // returns a set of custom settings for the date picker
+               onSelect: null, // Define a callback function when a date is selected
+               onChangeMonthYear: null, // Define a callback function when the month or year is changed
+               onClose: null, // Define a callback function when the datepicker is closed
+               numberOfMonths: 1, // Number of months to show at a time
+               showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+               stepMonths: 1, // Number of months to step back/forward
+               stepBigMonths: 12, // Number of months to step back/forward for the big links
+               altField: "", // Selector for an alternate field to store selected dates into
+               altFormat: "", // The date format to use for the alternate field
+               constrainInput: true, // The input is constrained by the current date format
+               showButtonPanel: false, // True to show button panel, false to not show it
+               autoSize: false, // True to size the input for the date format, false to leave as is
+               disabled: false // The initial disabled state
+       };
+       $.extend( this._defaults, this.regional[ "" ] );
+       this.regional.en = $.extend( true, {}, this.regional[ "" ] );
+       this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
+       this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
+}
 
-               //Call callbacks
-               this._trigger("sort", event, this._uiHash());
+$.extend( Datepicker.prototype, {
+       /* Class name added to elements to indicate already configured with a date picker. */
+       markerClassName: "hasDatepicker",
 
-               this.lastPositionAbs = this.positionAbs;
-               return false;
+       //Keep track of the maximum number of rows displayed (see #7043)
+       maxRows: 4,
 
+       // TODO rename to "widget" when switching to widget factory
+       _widgetDatepicker: function() {
+               return this.dpDiv;
        },
 
-       _mouseStop: function(event, noPropagation) {
+       /* Override the default settings for all instances of the date picker.
+        * @param  settings  object - the new settings to use as defaults (anonymous object)
+        * @return the manager object
+        */
+       setDefaults: function( settings ) {
+               datepicker_extendRemove( this._defaults, settings || {} );
+               return this;
+       },
 
-               if(!event) {
+       /* Attach the date picker to a jQuery selection.
+        * @param  target       element - the target input field or division or span
+        * @param  settings  object - the new settings to use for this date picker instance (anonymous)
+        */
+       _attachDatepicker: function( target, settings ) {
+               var nodeName, inline, inst;
+               nodeName = target.nodeName.toLowerCase();
+               inline = ( nodeName === "div" || nodeName === "span" );
+               if ( !target.id ) {
+                       this.uuid += 1;
+                       target.id = "dp" + this.uuid;
+               }
+               inst = this._newInst( $( target ), inline );
+               inst.settings = $.extend( {}, settings || {} );
+               if ( nodeName === "input" ) {
+                       this._connectDatepicker( target, inst );
+               } else if ( inline ) {
+                       this._inlineDatepicker( target, inst );
+               }
+       },
+
+       /* Create a new instance object. */
+       _newInst: function( target, inline ) {
+               var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
+               return { id: id, input: target, // associated target
+                       selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+                       drawMonth: 0, drawYear: 0, // month being drawn
+                       inline: inline, // is datepicker inline or not
+                       dpDiv: ( !inline ? this.dpDiv : // presentation div
+                       datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
+       },
+
+       /* Attach the date picker to an input field. */
+       _connectDatepicker: function( target, inst ) {
+               var input = $( target );
+               inst.append = $( [] );
+               inst.trigger = $( [] );
+               if ( input.hasClass( this.markerClassName ) ) {
                        return;
                }
+               this._attachments( input, inst );
+               input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
+                       on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
+               this._autoSize( inst );
+               $.data( target, "datepicker", inst );
 
-               //If we are using droppables, inform the manager about the drop
-               if ($.ui.ddmanager && !this.options.dropBehaviour) {
-                       $.ui.ddmanager.drop(this, event);
-               }
-
-               if(this.options.revert) {
-                       var that = this,
-                               cur = this.placeholder.offset(),
-                               axis = this.options.axis,
-                               animation = {};
-
-                       if ( !axis || axis === "x" ) {
-                               animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
-                       }
-                       if ( !axis || axis === "y" ) {
-                               animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
-                       }
-                       this.reverting = true;
-                       $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
-                               that._clear(event);
-                       });
-               } else {
-                       this._clear(event, noPropagation);
+               //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+               if ( inst.settings.disabled ) {
+                       this._disableDatepicker( target );
                }
-
-               return false;
-
        },
 
-       cancel: function() {
+       /* Make attachments based on settings. */
+       _attachments: function( input, inst ) {
+               var showOn, buttonText, buttonImage,
+                       appendText = this._get( inst, "appendText" ),
+                       isRTL = this._get( inst, "isRTL" );
 
-               if(this.dragging) {
+               if ( inst.append ) {
+                       inst.append.remove();
+               }
+               if ( appendText ) {
+                       inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
+                       input[ isRTL ? "before" : "after" ]( inst.append );
+               }
 
-                       this._mouseUp({ target: null });
+               input.off( "focus", this._showDatepicker );
 
-                       if(this.options.helper === "original") {
-                               this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-                       } else {
-                               this.currentItem.show();
-                       }
+               if ( inst.trigger ) {
+                       inst.trigger.remove();
+               }
 
-                       //Post deactivating events to containers
-                       for (var i = this.containers.length - 1; i >= 0; i--){
-                               this.containers[i]._trigger("deactivate", null, this._uiHash(this));
-                               if(this.containers[i].containerCache.over) {
-                                       this.containers[i]._trigger("out", null, this._uiHash(this));
-                                       this.containers[i].containerCache.over = 0;
+               showOn = this._get( inst, "showOn" );
+               if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
+                       input.on( "focus", this._showDatepicker );
+               }
+               if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
+                       buttonText = this._get( inst, "buttonText" );
+                       buttonImage = this._get( inst, "buttonImage" );
+                       inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
+                               $( "<img/>" ).addClass( this._triggerClass ).
+                                       attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
+                               $( "<button type='button'></button>" ).addClass( this._triggerClass ).
+                                       html( !buttonImage ? buttonText : $( "<img/>" ).attr(
+                                       { src:buttonImage, alt:buttonText, title:buttonText } ) ) );
+                       input[ isRTL ? "before" : "after" ]( inst.trigger );
+                       inst.trigger.on( "click", function() {
+                               if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
+                                       $.datepicker._hideDatepicker();
+                               } else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
+                                       $.datepicker._hideDatepicker();
+                                       $.datepicker._showDatepicker( input[ 0 ] );
+                               } else {
+                                       $.datepicker._showDatepicker( input[ 0 ] );
                                }
-                       }
-
+                               return false;
+                       } );
                }
+       },
 
-               if (this.placeholder) {
-                       //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-                       if(this.placeholder[0].parentNode) {
-                               this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-                       }
-                       if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
-                               this.helper.remove();
-                       }
-
-                       $.extend(this, {
-                               helper: null,
-                               dragging: false,
-                               reverting: false,
-                               _noFinalSort: null
-                       });
+       /* Apply the maximum length for the date format. */
+       _autoSize: function( inst ) {
+               if ( this._get( inst, "autoSize" ) && !inst.inline ) {
+                       var findMax, max, maxI, i,
+                               date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
+                               dateFormat = this._get( inst, "dateFormat" );
 
-                       if(this.domPosition.prev) {
-                               $(this.domPosition.prev).after(this.currentItem);
-                       } else {
-                               $(this.domPosition.parent).prepend(this.currentItem);
+                       if ( dateFormat.match( /[DM]/ ) ) {
+                               findMax = function( names ) {
+                                       max = 0;
+                                       maxI = 0;
+                                       for ( i = 0; i < names.length; i++ ) {
+                                               if ( names[ i ].length > max ) {
+                                                       max = names[ i ].length;
+                                                       maxI = i;
+                                               }
+                                       }
+                                       return maxI;
+                               };
+                               date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
+                                       "monthNames" : "monthNamesShort" ) ) ) );
+                               date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
+                                       "dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
                        }
+                       inst.input.attr( "size", this._formatDate( inst, date ).length );
                }
+       },
 
+       /* Attach an inline date picker to a div. */
+       _inlineDatepicker: function( target, inst ) {
+               var divSpan = $( target );
+               if ( divSpan.hasClass( this.markerClassName ) ) {
+                       return;
+               }
+               divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
+               $.data( target, "datepicker", inst );
+               this._setDate( inst, this._getDefaultDate( inst ), true );
+               this._updateDatepicker( inst );
+               this._updateAlternate( inst );
+
+               //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+               if ( inst.settings.disabled ) {
+                       this._disableDatepicker( target );
+               }
+
+               // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+               // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+               inst.dpDiv.css( "display", "block" );
+       },
+
+       /* Pop-up the date picker in a "dialog" box.
+        * @param  input element - ignored
+        * @param  date string or Date - the initial date to display
+        * @param  onSelect  function - the function to call when a date is selected
+        * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
+        * @param  pos int[2] - coordinates for the dialog's position within the screen or
+        *                                      event - with x/y coordinates or
+        *                                      leave empty for default (screen centre)
+        * @return the manager object
+        */
+       _dialogDatepicker: function( input, date, onSelect, settings, pos ) {
+               var id, browserWidth, browserHeight, scrollX, scrollY,
+                       inst = this._dialogInst; // internal instance
+
+               if ( !inst ) {
+                       this.uuid += 1;
+                       id = "dp" + this.uuid;
+                       this._dialogInput = $( "<input type='text' id='" + id +
+                               "' style='position: absolute; top: -100px; width: 0px;'/>" );
+                       this._dialogInput.on( "keydown", this._doKeyDown );
+                       $( "body" ).append( this._dialogInput );
+                       inst = this._dialogInst = this._newInst( this._dialogInput, false );
+                       inst.settings = {};
+                       $.data( this._dialogInput[ 0 ], "datepicker", inst );
+               }
+               datepicker_extendRemove( inst.settings, settings || {} );
+               date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
+               this._dialogInput.val( date );
+
+               this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
+               if ( !this._pos ) {
+                       browserWidth = document.documentElement.clientWidth;
+                       browserHeight = document.documentElement.clientHeight;
+                       scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+                       scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+                       this._pos = // should use actual width/height below
+                               [ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
+               }
+
+               // Move input on screen for focus, but hidden behind dialog
+               this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
+               inst.settings.onSelect = onSelect;
+               this._inDialog = true;
+               this.dpDiv.addClass( this._dialogClass );
+               this._showDatepicker( this._dialogInput[ 0 ] );
+               if ( $.blockUI ) {
+                       $.blockUI( this.dpDiv );
+               }
+               $.data( this._dialogInput[ 0 ], "datepicker", inst );
                return this;
-
        },
 
-       serialize: function(o) {
-
-               var items = this._getItemsAsjQuery(o && o.connected),
-                       str = [];
-               o = o || {};
-
-               $(items).each(function() {
-                       var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
-                       if (res) {
-                               str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
-                       }
-               });
+       /* Detach a datepicker from its control.
+        * @param  target       element - the target input field or division or span
+        */
+       _destroyDatepicker: function( target ) {
+               var nodeName,
+                       $target = $( target ),
+                       inst = $.data( target, "datepicker" );
 
-               if(!str.length && o.key) {
-                       str.push(o.key + "=");
+               if ( !$target.hasClass( this.markerClassName ) ) {
+                       return;
                }
 
-               return str.join("&");
+               nodeName = target.nodeName.toLowerCase();
+               $.removeData( target, "datepicker" );
+               if ( nodeName === "input" ) {
+                       inst.append.remove();
+                       inst.trigger.remove();
+                       $target.removeClass( this.markerClassName ).
+                               off( "focus", this._showDatepicker ).
+                               off( "keydown", this._doKeyDown ).
+                               off( "keypress", this._doKeyPress ).
+                               off( "keyup", this._doKeyUp );
+               } else if ( nodeName === "div" || nodeName === "span" ) {
+                       $target.removeClass( this.markerClassName ).empty();
+               }
 
+               if ( datepicker_instActive === inst ) {
+                       datepicker_instActive = null;
+               }
        },
 
-       toArray: function(o) {
-
-               var items = this._getItemsAsjQuery(o && o.connected),
-                       ret = [];
-
-               o = o || {};
+       /* Enable the date picker to a jQuery selection.
+        * @param  target       element - the target input field or division or span
+        */
+       _enableDatepicker: function( target ) {
+               var nodeName, inline,
+                       $target = $( target ),
+                       inst = $.data( target, "datepicker" );
 
-               items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
-               return ret;
+               if ( !$target.hasClass( this.markerClassName ) ) {
+                       return;
+               }
 
+               nodeName = target.nodeName.toLowerCase();
+               if ( nodeName === "input" ) {
+                       target.disabled = false;
+                       inst.trigger.filter( "button" ).
+                               each( function() { this.disabled = false; } ).end().
+                               filter( "img" ).css( { opacity: "1.0", cursor: "" } );
+               } else if ( nodeName === "div" || nodeName === "span" ) {
+                       inline = $target.children( "." + this._inlineClass );
+                       inline.children().removeClass( "ui-state-disabled" );
+                       inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
+                               prop( "disabled", false );
+               }
+               this._disabledInputs = $.map( this._disabledInputs,
+                       function( value ) { return ( value === target ? null : value ); } ); // delete entry
        },
 
-       /* Be careful with the following core functions */
-       _intersectsWith: function(item) {
-
-               var x1 = this.positionAbs.left,
-                       x2 = x1 + this.helperProportions.width,
-                       y1 = this.positionAbs.top,
-                       y2 = y1 + this.helperProportions.height,
-                       l = item.left,
-                       r = l + item.width,
-                       t = item.top,
-                       b = t + item.height,
-                       dyClick = this.offset.click.top,
-                       dxClick = this.offset.click.left,
-                       isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
-                       isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
-                       isOverElement = isOverElementHeight && isOverElementWidth;
-
-               if ( this.options.tolerance === "pointer" ||
-                       this.options.forcePointerForContainers ||
-                       (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
-               ) {
-                       return isOverElement;
-               } else {
+       /* Disable the date picker to a jQuery selection.
+        * @param  target       element - the target input field or division or span
+        */
+       _disableDatepicker: function( target ) {
+               var nodeName, inline,
+                       $target = $( target ),
+                       inst = $.data( target, "datepicker" );
 
-                       return (l < x1 + (this.helperProportions.width / 2) && // Right Half
-                               x2 - (this.helperProportions.width / 2) < r && // Left Half
-                               t < y1 + (this.helperProportions.height / 2) && // Bottom Half
-                               y2 - (this.helperProportions.height / 2) < b ); // Top Half
+               if ( !$target.hasClass( this.markerClassName ) ) {
+                       return;
+               }
 
+               nodeName = target.nodeName.toLowerCase();
+               if ( nodeName === "input" ) {
+                       target.disabled = true;
+                       inst.trigger.filter( "button" ).
+                               each( function() { this.disabled = true; } ).end().
+                               filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
+               } else if ( nodeName === "div" || nodeName === "span" ) {
+                       inline = $target.children( "." + this._inlineClass );
+                       inline.children().addClass( "ui-state-disabled" );
+                       inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
+                               prop( "disabled", true );
+               }
+               this._disabledInputs = $.map( this._disabledInputs,
+                       function( value ) { return ( value === target ? null : value ); } ); // delete entry
+               this._disabledInputs[ this._disabledInputs.length ] = target;
+       },
+
+       /* Is the first field in a jQuery collection disabled as a datepicker?
+        * @param  target       element - the target input field or division or span
+        * @return boolean - true if disabled, false if enabled
+        */
+       _isDisabledDatepicker: function( target ) {
+               if ( !target ) {
+                       return false;
+               }
+               for ( var i = 0; i < this._disabledInputs.length; i++ ) {
+                       if ( this._disabledInputs[ i ] === target ) {
+                               return true;
+                       }
                }
+               return false;
        },
 
-       _intersectsWithPointer: function(item) {
+       /* Retrieve the instance data for the target control.
+        * @param  target  element - the target input field or division or span
+        * @return  object - the associated instance data
+        * @throws  error if a jQuery problem getting data
+        */
+       _getInst: function( target ) {
+               try {
+                       return $.data( target, "datepicker" );
+               }
+               catch ( err ) {
+                       throw "Missing instance data for this datepicker";
+               }
+       },
 
-               var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
-                       isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
-                       isOverElement = isOverElementHeight && isOverElementWidth,
-                       verticalDirection = this._getDragVerticalDirection(),
-                       horizontalDirection = this._getDragHorizontalDirection();
+       /* Update or retrieve the settings for a date picker attached to an input field or division.
+        * @param  target  element - the target input field or division or span
+        * @param  name object - the new settings to update or
+        *                              string - the name of the setting to change or retrieve,
+        *                              when retrieving also "all" for all instance settings or
+        *                              "defaults" for all global defaults
+        * @param  value   any - the new value for the setting
+        *                              (omit if above is an object or to retrieve a value)
+        */
+       _optionDatepicker: function( target, name, value ) {
+               var settings, date, minDate, maxDate,
+                       inst = this._getInst( target );
 
-               if (!isOverElement) {
-                       return false;
+               if ( arguments.length === 2 && typeof name === "string" ) {
+                       return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
+                               ( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
+                               this._get( inst, name ) ) : null ) );
                }
 
-               return this.floating ?
-                       ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
-                       : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
-
-       },
+               settings = name || {};
+               if ( typeof name === "string" ) {
+                       settings = {};
+                       settings[ name ] = value;
+               }
 
-       _intersectsWithSides: function(item) {
+               if ( inst ) {
+                       if ( this._curInst === inst ) {
+                               this._hideDatepicker();
+                       }
 
-               var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
-                       isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
-                       verticalDirection = this._getDragVerticalDirection(),
-                       horizontalDirection = this._getDragHorizontalDirection();
+                       date = this._getDateDatepicker( target, true );
+                       minDate = this._getMinMaxDate( inst, "min" );
+                       maxDate = this._getMinMaxDate( inst, "max" );
+                       datepicker_extendRemove( inst.settings, settings );
 
-               if (this.floating && horizontalDirection) {
-                       return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
-               } else {
-                       return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
+                       // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+                       if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
+                               inst.settings.minDate = this._formatDate( inst, minDate );
+                       }
+                       if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
+                               inst.settings.maxDate = this._formatDate( inst, maxDate );
+                       }
+                       if ( "disabled" in settings ) {
+                               if ( settings.disabled ) {
+                                       this._disableDatepicker( target );
+                               } else {
+                                       this._enableDatepicker( target );
+                               }
+                       }
+                       this._attachments( $( target ), inst );
+                       this._autoSize( inst );
+                       this._setDate( inst, date );
+                       this._updateAlternate( inst );
+                       this._updateDatepicker( inst );
                }
-
        },
 
-       _getDragVerticalDirection: function() {
-               var delta = this.positionAbs.top - this.lastPositionAbs.top;
-               return delta !== 0 && (delta > 0 ? "down" : "up");
+       // Change method deprecated
+       _changeDatepicker: function( target, name, value ) {
+               this._optionDatepicker( target, name, value );
        },
 
-       _getDragHorizontalDirection: function() {
-               var delta = this.positionAbs.left - this.lastPositionAbs.left;
-               return delta !== 0 && (delta > 0 ? "right" : "left");
+       /* Redraw the date picker attached to an input field or division.
+        * @param  target  element - the target input field or division or span
+        */
+       _refreshDatepicker: function( target ) {
+               var inst = this._getInst( target );
+               if ( inst ) {
+                       this._updateDatepicker( inst );
+               }
        },
 
-       refresh: function(event) {
-               this._refreshItems(event);
-               this._setHandleClassName();
-               this.refreshPositions();
-               return this;
+       /* Set the dates for a jQuery selection.
+        * @param  target element - the target input field or division or span
+        * @param  date Date - the new date
+        */
+       _setDateDatepicker: function( target, date ) {
+               var inst = this._getInst( target );
+               if ( inst ) {
+                       this._setDate( inst, date );
+                       this._updateDatepicker( inst );
+                       this._updateAlternate( inst );
+               }
        },
 
-       _connectWith: function() {
-               var options = this.options;
-               return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
+       /* Get the date(s) for the first entry in a jQuery selection.
+        * @param  target element - the target input field or division or span
+        * @param  noDefault boolean - true if no default date is to be used
+        * @return Date - the current date
+        */
+       _getDateDatepicker: function( target, noDefault ) {
+               var inst = this._getInst( target );
+               if ( inst && !inst.inline ) {
+                       this._setDateFromField( inst, noDefault );
+               }
+               return ( inst ? this._getDate( inst ) : null );
        },
 
-       _getItemsAsjQuery: function(connected) {
+       /* Handle keystrokes. */
+       _doKeyDown: function( event ) {
+               var onSelect, dateStr, sel,
+                       inst = $.datepicker._getInst( event.target ),
+                       handled = true,
+                       isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
 
-               var i, j, cur, inst,
-                       items = [],
-                       queries = [],
-                       connectWith = this._connectWith();
-
-               if(connectWith && connected) {
-                       for (i = connectWith.length - 1; i >= 0; i--){
-                               cur = $(connectWith[i], this.document[0]);
-                               for ( j = cur.length - 1; j >= 0; j--){
-                                       inst = $.data(cur[j], this.widgetFullName);
-                                       if(inst && inst !== this && !inst.options.disabled) {
-                                               queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
-                                       }
-                               }
-                       }
-               }
+               inst._keyEvent = true;
+               if ( $.datepicker._datepickerShowing ) {
+                       switch ( event.keyCode ) {
+                               case 9: $.datepicker._hideDatepicker();
+                                               handled = false;
+                                               break; // hide on tab out
+                               case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
+                                                                       $.datepicker._currentClass + ")", inst.dpDiv );
+                                               if ( sel[ 0 ] ) {
+                                                       $.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
+                                               }
 
-               queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
+                                               onSelect = $.datepicker._get( inst, "onSelect" );
+                                               if ( onSelect ) {
+                                                       dateStr = $.datepicker._formatDate( inst );
 
-               function addItems() {
-                       items.push( this );
-               }
-               for (i = queries.length - 1; i >= 0; i--){
-                       queries[i][0].each( addItems );
-               }
+                                                       // Trigger custom callback
+                                                       onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
+                                               } else {
+                                                       $.datepicker._hideDatepicker();
+                                               }
 
-               return $(items);
+                                               return false; // don't submit the form
+                               case 27: $.datepicker._hideDatepicker();
+                                               break; // hide on escape
+                               case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+                                                       -$.datepicker._get( inst, "stepBigMonths" ) :
+                                                       -$.datepicker._get( inst, "stepMonths" ) ), "M" );
+                                               break; // previous month/year on page up/+ ctrl
+                               case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+                                                       +$.datepicker._get( inst, "stepBigMonths" ) :
+                                                       +$.datepicker._get( inst, "stepMonths" ) ), "M" );
+                                               break; // next month/year on page down/+ ctrl
+                               case 35: if ( event.ctrlKey || event.metaKey ) {
+                                                       $.datepicker._clearDate( event.target );
+                                               }
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // clear on ctrl or command +end
+                               case 36: if ( event.ctrlKey || event.metaKey ) {
+                                                       $.datepicker._gotoToday( event.target );
+                                               }
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // current on ctrl or command +home
+                               case 37: if ( event.ctrlKey || event.metaKey ) {
+                                                       $.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
+                                               }
+                                               handled = event.ctrlKey || event.metaKey;
 
-       },
+                                               // -1 day on ctrl or command +left
+                                               if ( event.originalEvent.altKey ) {
+                                                       $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+                                                               -$.datepicker._get( inst, "stepBigMonths" ) :
+                                                               -$.datepicker._get( inst, "stepMonths" ) ), "M" );
+                                               }
 
-       _removeCurrentsFromItems: function() {
+                                               // next month/year on alt +left on Mac
+                                               break;
+                               case 38: if ( event.ctrlKey || event.metaKey ) {
+                                                       $.datepicker._adjustDate( event.target, -7, "D" );
+                                               }
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // -1 week on ctrl or command +up
+                               case 39: if ( event.ctrlKey || event.metaKey ) {
+                                                       $.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
+                                               }
+                                               handled = event.ctrlKey || event.metaKey;
 
-               var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
+                                               // +1 day on ctrl or command +right
+                                               if ( event.originalEvent.altKey ) {
+                                                       $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+                                                               +$.datepicker._get( inst, "stepBigMonths" ) :
+                                                               +$.datepicker._get( inst, "stepMonths" ) ), "M" );
+                                               }
 
-               this.items = $.grep(this.items, function (item) {
-                       for (var j=0; j < list.length; j++) {
-                               if(list[j] === item.item[0]) {
-                                       return false;
-                               }
+                                               // next month/year on alt +right
+                                               break;
+                               case 40: if ( event.ctrlKey || event.metaKey ) {
+                                                       $.datepicker._adjustDate( event.target, +7, "D" );
+                                               }
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // +1 week on ctrl or command +down
+                               default: handled = false;
                        }
-                       return true;
-               });
+               } else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
+                       $.datepicker._showDatepicker( this );
+               } else {
+                       handled = false;
+               }
 
+               if ( handled ) {
+                       event.preventDefault();
+                       event.stopPropagation();
+               }
        },
 
-       _refreshItems: function(event) {
+       /* Filter entered characters - based on date format. */
+       _doKeyPress: function( event ) {
+               var chars, chr,
+                       inst = $.datepicker._getInst( event.target );
 
-               this.items = [];
-               this.containers = [this];
+               if ( $.datepicker._get( inst, "constrainInput" ) ) {
+                       chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
+                       chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
+                       return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
+               }
+       },
 
-               var i, j, cur, inst, targetData, _queries, item, queriesLength,
-                       items = this.items,
-                       queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
-                       connectWith = this._connectWith();
+       /* Synchronise manual entry and field/alternate field. */
+       _doKeyUp: function( event ) {
+               var date,
+                       inst = $.datepicker._getInst( event.target );
 
-               if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
-                       for (i = connectWith.length - 1; i >= 0; i--){
-                               cur = $(connectWith[i], this.document[0]);
-                               for (j = cur.length - 1; j >= 0; j--){
-                                       inst = $.data(cur[j], this.widgetFullName);
-                                       if(inst && inst !== this && !inst.options.disabled) {
-                                               queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
-                                               this.containers.push(inst);
-                                       }
+               if ( inst.input.val() !== inst.lastVal ) {
+                       try {
+                               date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
+                                       ( inst.input ? inst.input.val() : null ),
+                                       $.datepicker._getFormatConfig( inst ) );
+
+                               if ( date ) { // only if valid
+                                       $.datepicker._setDateFromField( inst );
+                                       $.datepicker._updateAlternate( inst );
+                                       $.datepicker._updateDatepicker( inst );
                                }
                        }
-               }
-
-               for (i = queries.length - 1; i >= 0; i--) {
-                       targetData = queries[i][1];
-                       _queries = queries[i][0];
-
-                       for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
-                               item = $(_queries[j]);
-
-                               item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
-
-                               items.push({
-                                       item: item,
-                                       instance: targetData,
-                                       width: 0, height: 0,
-                                       left: 0, top: 0
-                               });
+                       catch ( err ) {
                        }
                }
-
+               return true;
        },
 
-       refreshPositions: function(fast) {
-
-               // Determine whether items are being displayed horizontally
-               this.floating = this.items.length ?
-                       this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
-                       false;
-
-               //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
-               if(this.offsetParent && this.helper) {
-                       this.offset.parent = this._getParentOffset();
+       /* Pop-up the date picker for a given input field.
+        * If false returned from beforeShow event handler do not show.
+        * @param  input  element - the input field attached to the date picker or
+        *                                      event - if triggered by focus
+        */
+       _showDatepicker: function( input ) {
+               input = input.target || input;
+               if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
+                       input = $( "input", input.parentNode )[ 0 ];
                }
 
-               var i, item, t, p;
-
-               for (i = this.items.length - 1; i >= 0; i--){
-                       item = this.items[i];
-
-                       //We ignore calculating positions of all connected containers when we're not over them
-                       if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
-                               continue;
-                       }
+               if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
+                       return;
+               }
 
-                       t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+               var inst, beforeShow, beforeShowSettings, isFixed,
+                       offset, showAnim, duration;
 
-                       if (!fast) {
-                               item.width = t.outerWidth();
-                               item.height = t.outerHeight();
+               inst = $.datepicker._getInst( input );
+               if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
+                       $.datepicker._curInst.dpDiv.stop( true, true );
+                       if ( inst && $.datepicker._datepickerShowing ) {
+                               $.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
                        }
+               }
 
-                       p = t.offset();
-                       item.left = p.left;
-                       item.top = p.top;
+               beforeShow = $.datepicker._get( inst, "beforeShow" );
+               beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
+               if ( beforeShowSettings === false ) {
+                       return;
                }
+               datepicker_extendRemove( inst.settings, beforeShowSettings );
 
-               if(this.options.custom && this.options.custom.refreshContainers) {
-                       this.options.custom.refreshContainers.call(this);
-               } else {
-                       for (i = this.containers.length - 1; i >= 0; i--){
-                               p = this.containers[i].element.offset();
-                               this.containers[i].containerCache.left = p.left;
-                               this.containers[i].containerCache.top = p.top;
-                               this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
-                               this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
-                       }
+               inst.lastVal = null;
+               $.datepicker._lastInput = input;
+               $.datepicker._setDateFromField( inst );
+
+               if ( $.datepicker._inDialog ) { // hide cursor
+                       input.value = "";
+               }
+               if ( !$.datepicker._pos ) { // position below input
+                       $.datepicker._pos = $.datepicker._findPos( input );
+                       $.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
                }
 
-               return this;
-       },
+               isFixed = false;
+               $( input ).parents().each( function() {
+                       isFixed |= $( this ).css( "position" ) === "fixed";
+                       return !isFixed;
+               } );
 
-       _createPlaceholder: function(that) {
-               that = that || this;
-               var className,
-                       o = that.options;
+               offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
+               $.datepicker._pos = null;
 
-               if(!o.placeholder || o.placeholder.constructor === String) {
-                       className = o.placeholder;
-                       o.placeholder = {
-                               element: function() {
+               //to avoid flashes on Firefox
+               inst.dpDiv.empty();
 
-                                       var nodeName = that.currentItem[0].nodeName.toLowerCase(),
-                                               element = $( "<" + nodeName + ">", that.document[0] )
-                                                       .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
-                                                       .removeClass("ui-sortable-helper");
+               // determine sizing offscreen
+               inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
+               $.datepicker._updateDatepicker( inst );
 
-                                       if ( nodeName === "tbody" ) {
-                                               that._createTrPlaceholder(
-                                                       that.currentItem.find( "tr" ).eq( 0 ),
-                                                       $( "<tr>", that.document[ 0 ] ).appendTo( element )
-                                               );
-                                       } else if ( nodeName === "tr" ) {
-                                               that._createTrPlaceholder( that.currentItem, element );
-                                       } else if ( nodeName === "img" ) {
-                                               element.attr( "src", that.currentItem.attr( "src" ) );
-                                       }
+               // fix width for dynamic number of date pickers
+               // and adjust position before showing
+               offset = $.datepicker._checkOffset( inst, offset, isFixed );
+               inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
+                       "static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
+                       left: offset.left + "px", top: offset.top + "px" } );
 
-                                       if ( !className ) {
-                                               element.css( "visibility", "hidden" );
-                                       }
+               if ( !inst.inline ) {
+                       showAnim = $.datepicker._get( inst, "showAnim" );
+                       duration = $.datepicker._get( inst, "duration" );
+                       inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
+                       $.datepicker._datepickerShowing = true;
 
-                                       return element;
-                               },
-                               update: function(container, p) {
+                       if ( $.effects && $.effects.effect[ showAnim ] ) {
+                               inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
+                       } else {
+                               inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
+                       }
 
-                                       // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
-                                       // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
-                                       if(className && !o.forcePlaceholderSize) {
-                                               return;
-                                       }
+                       if ( $.datepicker._shouldFocusInput( inst ) ) {
+                               inst.input.trigger( "focus" );
+                       }
 
-                                       //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
-                                       if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
-                                       if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
-                               }
-                       };
+                       $.datepicker._curInst = inst;
                }
+       },
 
-               //Create the placeholder
-               that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
+       /* Generate the date picker content. */
+       _updateDatepicker: function( inst ) {
+               this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+               datepicker_instActive = inst; // for delegate hover events
+               inst.dpDiv.empty().append( this._generateHTML( inst ) );
+               this._attachHandlers( inst );
 
-               //Append it after the actual current item
-               that.currentItem.after(that.placeholder);
+               var origyearshtml,
+                       numMonths = this._getNumberOfMonths( inst ),
+                       cols = numMonths[ 1 ],
+                       width = 17,
+                       activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
 
-               //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-               o.placeholder.update(that, that.placeholder);
+               if ( activeCell.length > 0 ) {
+                       datepicker_handleMouseover.apply( activeCell.get( 0 ) );
+               }
 
-       },
+               inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
+               if ( cols > 1 ) {
+                       inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
+               }
+               inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
+                       "Class" ]( "ui-datepicker-multi" );
+               inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
+                       "Class" ]( "ui-datepicker-rtl" );
 
-       _createTrPlaceholder: function( sourceTr, targetTr ) {
-               var that = this;
+               if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
+                       inst.input.trigger( "focus" );
+               }
 
-               sourceTr.children().each(function() {
-                       $( "<td>&#160;</td>", that.document[ 0 ] )
-                               .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
-                               .appendTo( targetTr );
-               });
-       },
+               // Deffered render of the years select (to avoid flashes on Firefox)
+               if ( inst.yearshtml ) {
+                       origyearshtml = inst.yearshtml;
+                       setTimeout( function() {
 
-       _contactContainers: function(event) {
-               var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
-                       innermostContainer = null,
-                       innermostIndex = null;
+                               //assure that inst.yearshtml didn't change.
+                               if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
+                                       inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
+                               }
+                               origyearshtml = inst.yearshtml = null;
+                       }, 0 );
+               }
+       },
 
-               // get innermost container that intersects with item
-               for (i = this.containers.length - 1; i >= 0; i--) {
+       // #6694 - don't focus the input if it's already focused
+       // this breaks the change event in IE
+       // Support: IE and jQuery <1.9
+       _shouldFocusInput: function( inst ) {
+               return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
+       },
 
-                       // never consider a container that's located within the item itself
-                       if($.contains(this.currentItem[0], this.containers[i].element[0])) {
-                               continue;
-                       }
+       /* Check positioning to remain on screen. */
+       _checkOffset: function( inst, offset, isFixed ) {
+               var dpWidth = inst.dpDiv.outerWidth(),
+                       dpHeight = inst.dpDiv.outerHeight(),
+                       inputWidth = inst.input ? inst.input.outerWidth() : 0,
+                       inputHeight = inst.input ? inst.input.outerHeight() : 0,
+                       viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
+                       viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
 
-                       if(this._intersectsWith(this.containers[i].containerCache)) {
+               offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
+               offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
+               offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
 
-                               // if we've already found a container and it's more "inner" than this, then continue
-                               if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
-                                       continue;
-                               }
+               // Now check if datepicker is showing outside window viewport - move to a better place if so.
+               offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
+                       Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
+               offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
+                       Math.abs( dpHeight + inputHeight ) : 0 );
 
-                               innermostContainer = this.containers[i];
-                               innermostIndex = i;
+               return offset;
+       },
 
-                       } else {
-                               // container doesn't intersect. trigger "out" event if necessary
-                               if(this.containers[i].containerCache.over) {
-                                       this.containers[i]._trigger("out", event, this._uiHash(this));
-                                       this.containers[i].containerCache.over = 0;
-                               }
-                       }
+       /* Find an object's position on the screen. */
+       _findPos: function( obj ) {
+               var position,
+                       inst = this._getInst( obj ),
+                       isRTL = this._get( inst, "isRTL" );
 
+               while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
+                       obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
                }
 
-               // if no intersecting containers found, return
-               if(!innermostContainer) {
-                       return;
-               }
+               position = $( obj ).offset();
+               return [ position.left, position.top ];
+       },
 
-               // move the item into the container if it's not there already
-               if(this.containers.length === 1) {
-                       if (!this.containers[innermostIndex].containerCache.over) {
-                               this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-                               this.containers[innermostIndex].containerCache.over = 1;
-                       }
-               } else {
+       /* Hide the date picker from view.
+        * @param  input  element - the input field attached to the date picker
+        */
+       _hideDatepicker: function( input ) {
+               var showAnim, duration, postProcess, onClose,
+                       inst = this._curInst;
 
-                       //When entering a new container, we will find the item with the least distance and append our item near it
-                       dist = 10000;
-                       itemWithLeastDistance = null;
-                       floating = innermostContainer.floating || this._isFloating(this.currentItem);
-                       posProperty = floating ? "left" : "top";
-                       sizeProperty = floating ? "width" : "height";
-                       axis = floating ? "clientX" : "clientY";
+               if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
+                       return;
+               }
 
-                       for (j = this.items.length - 1; j >= 0; j--) {
-                               if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
-                                       continue;
-                               }
-                               if(this.items[j].item[0] === this.currentItem[0]) {
-                                       continue;
-                               }
+               if ( this._datepickerShowing ) {
+                       showAnim = this._get( inst, "showAnim" );
+                       duration = this._get( inst, "duration" );
+                       postProcess = function() {
+                               $.datepicker._tidyDialog( inst );
+                       };
 
-                               cur = this.items[j].item.offset()[posProperty];
-                               nearBottom = false;
-                               if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
-                                       nearBottom = true;
-                               }
+                       // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+                       if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
+                               inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
+                       } else {
+                               inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
+                                       ( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
+                       }
 
-                               if ( Math.abs( event[ axis ] - cur ) < dist ) {
-                                       dist = Math.abs( event[ axis ] - cur );
-                                       itemWithLeastDistance = this.items[ j ];
-                                       this.direction = nearBottom ? "up": "down";
-                               }
+                       if ( !showAnim ) {
+                               postProcess();
                        }
+                       this._datepickerShowing = false;
 
-                       //Check if dropOnEmpty is enabled
-                       if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
-                               return;
+                       onClose = this._get( inst, "onClose" );
+                       if ( onClose ) {
+                               onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
                        }
 
-                       if(this.currentContainer === this.containers[innermostIndex]) {
-                               if ( !this.currentContainer.containerCache.over ) {
-                                       this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
-                                       this.currentContainer.containerCache.over = 1;
+                       this._lastInput = null;
+                       if ( this._inDialog ) {
+                               this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
+                               if ( $.blockUI ) {
+                                       $.unblockUI();
+                                       $( "body" ).append( this.dpDiv );
                                }
-                               return;
                        }
+                       this._inDialog = false;
+               }
+       },
 
-                       itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
-                       this._trigger("change", event, this._uiHash());
-                       this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
-                       this.currentContainer = this.containers[innermostIndex];
-
-                       //Update the placeholder
-                       this.options.placeholder.update(this.currentContainer, this.placeholder);
+       /* Tidy up after a dialog display. */
+       _tidyDialog: function( inst ) {
+               inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
+       },
 
-                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-                       this.containers[innermostIndex].containerCache.over = 1;
+       /* Close date picker if clicked elsewhere. */
+       _checkExternalClick: function( event ) {
+               if ( !$.datepicker._curInst ) {
+                       return;
                }
 
+               var $target = $( event.target ),
+                       inst = $.datepicker._getInst( $target[ 0 ] );
 
+               if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
+                               $target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
+                               !$target.hasClass( $.datepicker.markerClassName ) &&
+                               !$target.closest( "." + $.datepicker._triggerClass ).length &&
+                               $.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
+                       ( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
+                               $.datepicker._hideDatepicker();
+               }
        },
 
-       _createHelper: function(event) {
-
-               var o = this.options,
-                       helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
+       /* Adjust one of the date sub-fields. */
+       _adjustDate: function( id, offset, period ) {
+               var target = $( id ),
+                       inst = this._getInst( target[ 0 ] );
 
-               //Add the helper to the DOM if that didn't happen already
-               if(!helper.parents("body").length) {
-                       $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+               if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
+                       return;
                }
+               this._adjustInstDate( inst, offset +
+                       ( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
+                       period );
+               this._updateDatepicker( inst );
+       },
 
-               if(helper[0] === this.currentItem[0]) {
-                       this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
-               }
+       /* Action for current link. */
+       _gotoToday: function( id ) {
+               var date,
+                       target = $( id ),
+                       inst = this._getInst( target[ 0 ] );
 
-               if(!helper[0].style.width || o.forceHelperSize) {
-                       helper.width(this.currentItem.width());
-               }
-               if(!helper[0].style.height || o.forceHelperSize) {
-                       helper.height(this.currentItem.height());
+               if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
+                       inst.selectedDay = inst.currentDay;
+                       inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+                       inst.drawYear = inst.selectedYear = inst.currentYear;
+               } else {
+                       date = new Date();
+                       inst.selectedDay = date.getDate();
+                       inst.drawMonth = inst.selectedMonth = date.getMonth();
+                       inst.drawYear = inst.selectedYear = date.getFullYear();
                }
+               this._notifyChange( inst );
+               this._adjustDate( target );
+       },
 
-               return helper;
+       /* Action for selecting a new month/year. */
+       _selectMonthYear: function( id, select, period ) {
+               var target = $( id ),
+                       inst = this._getInst( target[ 0 ] );
+
+               inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
+               inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
+                       parseInt( select.options[ select.selectedIndex ].value, 10 );
 
+               this._notifyChange( inst );
+               this._adjustDate( target );
        },
 
-       _adjustOffsetFromHelper: function(obj) {
-               if (typeof obj === "string") {
-                       obj = obj.split(" ");
-               }
-               if ($.isArray(obj)) {
-                       obj = {left: +obj[0], top: +obj[1] || 0};
-               }
-               if ("left" in obj) {
-                       this.offset.click.left = obj.left + this.margins.left;
-               }
-               if ("right" in obj) {
-                       this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-               }
-               if ("top" in obj) {
-                       this.offset.click.top = obj.top + this.margins.top;
-               }
-               if ("bottom" in obj) {
-                       this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+       /* Action for selecting a day. */
+       _selectDay: function( id, month, year, td ) {
+               var inst,
+                       target = $( id );
+
+               if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
+                       return;
                }
-       },
 
-       _getParentOffset: function() {
+               inst = this._getInst( target[ 0 ] );
+               inst.selectedDay = inst.currentDay = $( "a", td ).html();
+               inst.selectedMonth = inst.currentMonth = month;
+               inst.selectedYear = inst.currentYear = year;
+               this._selectDate( id, this._formatDate( inst,
+                       inst.currentDay, inst.currentMonth, inst.currentYear ) );
+       },
 
+       /* Erase the input field and hide the date picker. */
+       _clearDate: function( id ) {
+               var target = $( id );
+               this._selectDate( target, "" );
+       },
 
-               //Get the offsetParent and cache its position
-               this.offsetParent = this.helper.offsetParent();
-               var po = this.offsetParent.offset();
+       /* Update the input field with the selected date. */
+       _selectDate: function( id, dateStr ) {
+               var onSelect,
+                       target = $( id ),
+                       inst = this._getInst( target[ 0 ] );
 
-               // This is a special case where we need to modify a offset calculated on start, since the following happened:
-               // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-               //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
-                       po.left += this.scrollParent.scrollLeft();
-                       po.top += this.scrollParent.scrollTop();
+               dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
+               if ( inst.input ) {
+                       inst.input.val( dateStr );
                }
+               this._updateAlternate( inst );
 
-               // This needs to be actually done for all browsers, since pageX/pageY includes this information
-               // with an ugly IE fix
-               if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
-                       po = { top: 0, left: 0 };
+               onSelect = this._get( inst, "onSelect" );
+               if ( onSelect ) {
+                       onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
+               } else if ( inst.input ) {
+                       inst.input.trigger( "change" ); // fire the change event
                }
 
-               return {
-                       top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-                       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-               };
+               if ( inst.inline ) {
+                       this._updateDatepicker( inst );
+               } else {
+                       this._hideDatepicker();
+                       this._lastInput = inst.input[ 0 ];
+                       if ( typeof( inst.input[ 0 ] ) !== "object" ) {
+                               inst.input.trigger( "focus" ); // restore focus
+                       }
+                       this._lastInput = null;
+               }
+       },
+
+       /* Update any alternate field to synchronise with the main field. */
+       _updateAlternate: function( inst ) {
+               var altFormat, date, dateStr,
+                       altField = this._get( inst, "altField" );
+
+               if ( altField ) { // update alternate field too
+                       altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
+                       date = this._getDate( inst );
+                       dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
+                       $( altField ).val( dateStr );
+               }
+       },
+
+       /* Set as beforeShowDay function to prevent selection of weekends.
+        * @param  date  Date - the date to customise
+        * @return [boolean, string] - is this date selectable?, what is its CSS class?
+        */
+       noWeekends: function( date ) {
+               var day = date.getDay();
+               return [ ( day > 0 && day < 6 ), "" ];
+       },
+
+       /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+        * @param  date  Date - the date to get the week for
+        * @return  number - the number of the week within the year that contains this date
+        */
+       iso8601Week: function( date ) {
+               var time,
+                       checkDate = new Date( date.getTime() );
+
+               // Find Thursday of this week starting on Monday
+               checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
+
+               time = checkDate.getTime();
+               checkDate.setMonth( 0 ); // Compare with Jan 1
+               checkDate.setDate( 1 );
+               return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
+       },
+
+       /* Parse a string value into a date object.
+        * See formatDate below for the possible formats.
+        *
+        * @param  format string - the expected format of the date
+        * @param  value string - the date in the above format
+        * @param  settings Object - attributes include:
+        *                                      shortYearCutoff  number - the cutoff year for determining the century (optional)
+        *                                      dayNamesShort   string[7] - abbreviated names of the days from Sunday (optional)
+        *                                      dayNames                string[7] - names of the days from Sunday (optional)
+        *                                      monthNamesShort string[12] - abbreviated names of the months (optional)
+        *                                      monthNames              string[12] - names of the months (optional)
+        * @return  Date - the extracted date value or null if value is blank
+        */
+       parseDate: function( format, value, settings ) {
+               if ( format == null || value == null ) {
+                       throw "Invalid arguments";
+               }
+
+               value = ( typeof value === "object" ? value.toString() : value + "" );
+               if ( value === "" ) {
+                       return null;
+               }
+
+               var iFormat, dim, extra,
+                       iValue = 0,
+                       shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
+                       shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
+                               new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
+                       dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
+                       dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
+                       monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
+                       monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
+                       year = -1,
+                       month = -1,
+                       day = -1,
+                       doy = -1,
+                       literal = false,
+                       date,
+
+                       // Check whether a format character is doubled
+                       lookAhead = function( match ) {
+                               var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
+                               if ( matches ) {
+                                       iFormat++;
+                               }
+                               return matches;
+                       },
 
-       },
+                       // Extract a number from the string value
+                       getNumber = function( match ) {
+                               var isDoubled = lookAhead( match ),
+                                       size = ( match === "@" ? 14 : ( match === "!" ? 20 :
+                                       ( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
+                                       minSize = ( match === "y" ? size : 1 ),
+                                       digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
+                                       num = value.substring( iValue ).match( digits );
+                               if ( !num ) {
+                                       throw "Missing number at position " + iValue;
+                               }
+                               iValue += num[ 0 ].length;
+                               return parseInt( num[ 0 ], 10 );
+                       },
 
-       _getRelativeOffset: function() {
+                       // Extract a name from the string value and convert to an index
+                       getName = function( match, shortNames, longNames ) {
+                               var index = -1,
+                                       names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
+                                               return [ [ k, v ] ];
+                                       } ).sort( function( a, b ) {
+                                               return -( a[ 1 ].length - b[ 1 ].length );
+                                       } );
+
+                               $.each( names, function( i, pair ) {
+                                       var name = pair[ 1 ];
+                                       if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
+                                               index = pair[ 0 ];
+                                               iValue += name.length;
+                                               return false;
+                                       }
+                               } );
+                               if ( index !== -1 ) {
+                                       return index + 1;
+                               } else {
+                                       throw "Unknown name at position " + iValue;
+                               }
+                       },
 
-               if(this.cssPosition === "relative") {
-                       var p = this.currentItem.position();
-                       return {
-                               top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-                               left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+                       // Confirm that a literal character matches the string value
+                       checkLiteral = function() {
+                               if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
+                                       throw "Unexpected literal at position " + iValue;
+                               }
+                               iValue++;
                        };
-               } else {
-                       return { top: 0, left: 0 };
+
+               for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
+                       if ( literal ) {
+                               if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
+                                       literal = false;
+                               } else {
+                                       checkLiteral();
+                               }
+                       } else {
+                               switch ( format.charAt( iFormat ) ) {
+                                       case "d":
+                                               day = getNumber( "d" );
+                                               break;
+                                       case "D":
+                                               getName( "D", dayNamesShort, dayNames );
+                                               break;
+                                       case "o":
+                                               doy = getNumber( "o" );
+                                               break;
+                                       case "m":
+                                               month = getNumber( "m" );
+                                               break;
+                                       case "M":
+                                               month = getName( "M", monthNamesShort, monthNames );
+                                               break;
+                                       case "y":
+                                               year = getNumber( "y" );
+                                               break;
+                                       case "@":
+                                               date = new Date( getNumber( "@" ) );
+                                               year = date.getFullYear();
+                                               month = date.getMonth() + 1;
+                                               day = date.getDate();
+                                               break;
+                                       case "!":
+                                               date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
+                                               year = date.getFullYear();
+                                               month = date.getMonth() + 1;
+                                               day = date.getDate();
+                                               break;
+                                       case "'":
+                                               if ( lookAhead( "'" ) ) {
+                                                       checkLiteral();
+                                               } else {
+                                                       literal = true;
+                                               }
+                                               break;
+                                       default:
+                                               checkLiteral();
+                               }
+                       }
                }
 
-       },
+               if ( iValue < value.length ) {
+                       extra = value.substr( iValue );
+                       if ( !/^\s+/.test( extra ) ) {
+                               throw "Extra/unparsed characters found in date: " + extra;
+                       }
+               }
 
-       _cacheMargins: function() {
-               this.margins = {
-                       left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
-                       top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
-               };
-       },
+               if ( year === -1 ) {
+                       year = new Date().getFullYear();
+               } else if ( year < 100 ) {
+                       year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+                               ( year <= shortYearCutoff ? 0 : -100 );
+               }
 
-       _cacheHelperProportions: function() {
-               this.helperProportions = {
-                       width: this.helper.outerWidth(),
-                       height: this.helper.outerHeight()
-               };
-       },
+               if ( doy > -1 ) {
+                       month = 1;
+                       day = doy;
+                       do {
+                               dim = this._getDaysInMonth( year, month - 1 );
+                               if ( day <= dim ) {
+                                       break;
+                               }
+                               month++;
+                               day -= dim;
+                       } while ( true );
+               }
+
+               date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
+               if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
+                       throw "Invalid date"; // E.g. 31/02/00
+               }
+               return date;
+       },
+
+       /* Standard date formats. */
+       ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
+       COOKIE: "D, dd M yy",
+       ISO_8601: "yy-mm-dd",
+       RFC_822: "D, d M y",
+       RFC_850: "DD, dd-M-y",
+       RFC_1036: "D, d M y",
+       RFC_1123: "D, d M yy",
+       RFC_2822: "D, d M yy",
+       RSS: "D, d M y", // RFC 822
+       TICKS: "!",
+       TIMESTAMP: "@",
+       W3C: "yy-mm-dd", // ISO 8601
+
+       _ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
+               Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
+
+       /* Format a date object into a string value.
+        * The format can be combinations of the following:
+        * d  - day of month (no leading zero)
+        * dd - day of month (two digit)
+        * o  - day of year (no leading zeros)
+        * oo - day of year (three digit)
+        * D  - day name short
+        * DD - day name long
+        * m  - month of year (no leading zero)
+        * mm - month of year (two digit)
+        * M  - month name short
+        * MM - month name long
+        * y  - year (two digit)
+        * yy - year (four digit)
+        * @ - Unix timestamp (ms since 01/01/1970)
+        * ! - Windows ticks (100ns since 01/01/0001)
+        * "..." - literal text
+        * '' - single quote
+        *
+        * @param  format string - the desired format of the date
+        * @param  date Date - the date value to format
+        * @param  settings Object - attributes include:
+        *                                      dayNamesShort   string[7] - abbreviated names of the days from Sunday (optional)
+        *                                      dayNames                string[7] - names of the days from Sunday (optional)
+        *                                      monthNamesShort string[12] - abbreviated names of the months (optional)
+        *                                      monthNames              string[12] - names of the months (optional)
+        * @return  string - the date in the above format
+        */
+       formatDate: function( format, date, settings ) {
+               if ( !date ) {
+                       return "";
+               }
+
+               var iFormat,
+                       dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
+                       dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
+                       monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
+                       monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
+
+                       // Check whether a format character is doubled
+                       lookAhead = function( match ) {
+                               var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
+                               if ( matches ) {
+                                       iFormat++;
+                               }
+                               return matches;
+                       },
 
-       _setContainment: function() {
+                       // Format a number, with leading zero if necessary
+                       formatNumber = function( match, value, len ) {
+                               var num = "" + value;
+                               if ( lookAhead( match ) ) {
+                                       while ( num.length < len ) {
+                                               num = "0" + num;
+                                       }
+                               }
+                               return num;
+                       },
 
-               var ce, co, over,
-                       o = this.options;
-               if(o.containment === "parent") {
-                       o.containment = this.helper[0].parentNode;
-               }
-               if(o.containment === "document" || o.containment === "window") {
-                       this.containment = [
-                               0 - this.offset.relative.left - this.offset.parent.left,
-                               0 - this.offset.relative.top - this.offset.parent.top,
-                               o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
-                               (o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
-                       ];
+                       // Format a name, short or long as requested
+                       formatName = function( match, value, shortNames, longNames ) {
+                               return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
+                       },
+                       output = "",
+                       literal = false;
+
+               if ( date ) {
+                       for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
+                               if ( literal ) {
+                                       if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
+                                               literal = false;
+                                       } else {
+                                               output += format.charAt( iFormat );
+                                       }
+                               } else {
+                                       switch ( format.charAt( iFormat ) ) {
+                                               case "d":
+                                                       output += formatNumber( "d", date.getDate(), 2 );
+                                                       break;
+                                               case "D":
+                                                       output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
+                                                       break;
+                                               case "o":
+                                                       output += formatNumber( "o",
+                                                               Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
+                                                       break;
+                                               case "m":
+                                                       output += formatNumber( "m", date.getMonth() + 1, 2 );
+                                                       break;
+                                               case "M":
+                                                       output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
+                                                       break;
+                                               case "y":
+                                                       output += ( lookAhead( "y" ) ? date.getFullYear() :
+                                                               ( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
+                                                       break;
+                                               case "@":
+                                                       output += date.getTime();
+                                                       break;
+                                               case "!":
+                                                       output += date.getTime() * 10000 + this._ticksTo1970;
+                                                       break;
+                                               case "'":
+                                                       if ( lookAhead( "'" ) ) {
+                                                               output += "'";
+                                                       } else {
+                                                               literal = true;
+                                                       }
+                                                       break;
+                                               default:
+                                                       output += format.charAt( iFormat );
+                                       }
+                               }
+                       }
                }
+               return output;
+       },
 
-               if(!(/^(document|window|parent)$/).test(o.containment)) {
-                       ce = $(o.containment)[0];
-                       co = $(o.containment).offset();
-                       over = ($(ce).css("overflow") !== "hidden");
+       /* Extract all possible characters from the date format. */
+       _possibleChars: function( format ) {
+               var iFormat,
+                       chars = "",
+                       literal = false,
 
-                       this.containment = [
-                               co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
-                               co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
-                               co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
-                               co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
-                       ];
+                       // Check whether a format character is doubled
+                       lookAhead = function( match ) {
+                               var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
+                               if ( matches ) {
+                                       iFormat++;
+                               }
+                               return matches;
+                       };
+
+               for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
+                       if ( literal ) {
+                               if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
+                                       literal = false;
+                               } else {
+                                       chars += format.charAt( iFormat );
+                               }
+                       } else {
+                               switch ( format.charAt( iFormat ) ) {
+                                       case "d": case "m": case "y": case "@":
+                                               chars += "0123456789";
+                                               break;
+                                       case "D": case "M":
+                                               return null; // Accept anything
+                                       case "'":
+                                               if ( lookAhead( "'" ) ) {
+                                                       chars += "'";
+                                               } else {
+                                                       literal = true;
+                                               }
+                                               break;
+                                       default:
+                                               chars += format.charAt( iFormat );
+                               }
+                       }
                }
+               return chars;
+       },
 
+       /* Get a setting value, defaulting if necessary. */
+       _get: function( inst, name ) {
+               return inst.settings[ name ] !== undefined ?
+                       inst.settings[ name ] : this._defaults[ name ];
        },
 
-       _convertPositionTo: function(d, pos) {
+       /* Parse existing date and initialise date picker. */
+       _setDateFromField: function( inst, noDefault ) {
+               if ( inst.input.val() === inst.lastVal ) {
+                       return;
+               }
+
+               var dateFormat = this._get( inst, "dateFormat" ),
+                       dates = inst.lastVal = inst.input ? inst.input.val() : null,
+                       defaultDate = this._getDefaultDate( inst ),
+                       date = defaultDate,
+                       settings = this._getFormatConfig( inst );
 
-               if(!pos) {
-                       pos = this.position;
+               try {
+                       date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
+               } catch ( event ) {
+                       dates = ( noDefault ? "" : dates );
+               }
+               inst.selectedDay = date.getDate();
+               inst.drawMonth = inst.selectedMonth = date.getMonth();
+               inst.drawYear = inst.selectedYear = date.getFullYear();
+               inst.currentDay = ( dates ? date.getDate() : 0 );
+               inst.currentMonth = ( dates ? date.getMonth() : 0 );
+               inst.currentYear = ( dates ? date.getFullYear() : 0 );
+               this._adjustInstDate( inst );
+       },
+
+       /* Retrieve the default date shown on opening. */
+       _getDefaultDate: function( inst ) {
+               return this._restrictMinMax( inst,
+                       this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
+       },
+
+       /* A date may be specified as an exact value or a relative one. */
+       _determineDate: function( inst, date, defaultDate ) {
+               var offsetNumeric = function( offset ) {
+                               var date = new Date();
+                               date.setDate( date.getDate() + offset );
+                               return date;
+                       },
+                       offsetString = function( offset ) {
+                               try {
+                                       return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
+                                               offset, $.datepicker._getFormatConfig( inst ) );
+                               }
+                               catch ( e ) {
+
+                                       // Ignore
+                               }
+
+                               var date = ( offset.toLowerCase().match( /^c/ ) ?
+                                       $.datepicker._getDate( inst ) : null ) || new Date(),
+                                       year = date.getFullYear(),
+                                       month = date.getMonth(),
+                                       day = date.getDate(),
+                                       pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
+                                       matches = pattern.exec( offset );
+
+                               while ( matches ) {
+                                       switch ( matches[ 2 ] || "d" ) {
+                                               case "d" : case "D" :
+                                                       day += parseInt( matches[ 1 ], 10 ); break;
+                                               case "w" : case "W" :
+                                                       day += parseInt( matches[ 1 ], 10 ) * 7; break;
+                                               case "m" : case "M" :
+                                                       month += parseInt( matches[ 1 ], 10 );
+                                                       day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
+                                                       break;
+                                               case "y": case "Y" :
+                                                       year += parseInt( matches[ 1 ], 10 );
+                                                       day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
+                                                       break;
+                                       }
+                                       matches = pattern.exec( offset );
+                               }
+                               return new Date( year, month, day );
+                       },
+                       newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
+                               ( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
+
+               newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
+               if ( newDate ) {
+                       newDate.setHours( 0 );
+                       newDate.setMinutes( 0 );
+                       newDate.setSeconds( 0 );
+                       newDate.setMilliseconds( 0 );
+               }
+               return this._daylightSavingAdjust( newDate );
+       },
+
+       /* Handle switch to/from daylight saving.
+        * Hours may be non-zero on daylight saving cut-over:
+        * > 12 when midnight changeover, but then cannot generate
+        * midnight datetime, so jump to 1AM, otherwise reset.
+        * @param  date  (Date) the date to check
+        * @return  (Date) the corrected date
+        */
+       _daylightSavingAdjust: function( date ) {
+               if ( !date ) {
+                       return null;
+               }
+               date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
+               return date;
+       },
+
+       /* Set the date(s) directly. */
+       _setDate: function( inst, date, noChange ) {
+               var clear = !date,
+                       origMonth = inst.selectedMonth,
+                       origYear = inst.selectedYear,
+                       newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
+
+               inst.selectedDay = inst.currentDay = newDate.getDate();
+               inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+               inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+               if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
+                       this._notifyChange( inst );
+               }
+               this._adjustInstDate( inst );
+               if ( inst.input ) {
+                       inst.input.val( clear ? "" : this._formatDate( inst ) );
+               }
+       },
+
+       /* Retrieve the date(s) directly. */
+       _getDate: function( inst ) {
+               var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
+                       this._daylightSavingAdjust( new Date(
+                       inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
+                       return startDate;
+       },
+
+       /* Attach the onxxx handlers.  These are declared statically so
+        * they work with static code transformers like Caja.
+        */
+       _attachHandlers: function( inst ) {
+               var stepMonths = this._get( inst, "stepMonths" ),
+                       id = "#" + inst.id.replace( /\\\\/g, "\\" );
+               inst.dpDiv.find( "[data-handler]" ).map( function() {
+                       var handler = {
+                               prev: function() {
+                                       $.datepicker._adjustDate( id, -stepMonths, "M" );
+                               },
+                               next: function() {
+                                       $.datepicker._adjustDate( id, +stepMonths, "M" );
+                               },
+                               hide: function() {
+                                       $.datepicker._hideDatepicker();
+                               },
+                               today: function() {
+                                       $.datepicker._gotoToday( id );
+                               },
+                               selectDay: function() {
+                                       $.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
+                                       return false;
+                               },
+                               selectMonth: function() {
+                                       $.datepicker._selectMonthYear( id, this, "M" );
+                                       return false;
+                               },
+                               selectYear: function() {
+                                       $.datepicker._selectMonthYear( id, this, "Y" );
+                                       return false;
+                               }
+                       };
+                       $( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
+               } );
+       },
+
+       /* Generate the HTML for the current state of the date picker. */
+       _generateHTML: function( inst ) {
+               var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
+                       controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
+                       monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
+                       selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
+                       cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
+                       printDate, dRow, tbody, daySettings, otherMonth, unselectable,
+                       tempDate = new Date(),
+                       today = this._daylightSavingAdjust(
+                               new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
+                       isRTL = this._get( inst, "isRTL" ),
+                       showButtonPanel = this._get( inst, "showButtonPanel" ),
+                       hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
+                       navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
+                       numMonths = this._getNumberOfMonths( inst ),
+                       showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
+                       stepMonths = this._get( inst, "stepMonths" ),
+                       isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
+                       currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
+                               new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
+                       minDate = this._getMinMaxDate( inst, "min" ),
+                       maxDate = this._getMinMaxDate( inst, "max" ),
+                       drawMonth = inst.drawMonth - showCurrentAtPos,
+                       drawYear = inst.drawYear;
+
+               if ( drawMonth < 0 ) {
+                       drawMonth += 12;
+                       drawYear--;
+               }
+               if ( maxDate ) {
+                       maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
+                               maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
+                       maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
+                       while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
+                               drawMonth--;
+                               if ( drawMonth < 0 ) {
+                                       drawMonth = 11;
+                                       drawYear--;
+                               }
+                       }
+               }
+               inst.drawMonth = drawMonth;
+               inst.drawYear = drawYear;
+
+               prevText = this._get( inst, "prevText" );
+               prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
+                       this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
+                       this._getFormatConfig( inst ) ) );
+
+               prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
+                       "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
+                       " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
+                       ( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
+
+               nextText = this._get( inst, "nextText" );
+               nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
+                       this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
+                       this._getFormatConfig( inst ) ) );
+
+               next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
+                       "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
+                       " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
+                       ( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
+
+               currentText = this._get( inst, "currentText" );
+               gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
+               currentText = ( !navigationAsDateFormat ? currentText :
+                       this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
+
+               controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
+                       this._get( inst, "closeText" ) + "</button>" : "" );
+
+               buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
+                       ( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
+                       ">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
+
+               firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
+               firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
+
+               showWeek = this._get( inst, "showWeek" );
+               dayNames = this._get( inst, "dayNames" );
+               dayNamesMin = this._get( inst, "dayNamesMin" );
+               monthNames = this._get( inst, "monthNames" );
+               monthNamesShort = this._get( inst, "monthNamesShort" );
+               beforeShowDay = this._get( inst, "beforeShowDay" );
+               showOtherMonths = this._get( inst, "showOtherMonths" );
+               selectOtherMonths = this._get( inst, "selectOtherMonths" );
+               defaultDate = this._getDefaultDate( inst );
+               html = "";
+
+               for ( row = 0; row < numMonths[ 0 ]; row++ ) {
+                       group = "";
+                       this.maxRows = 4;
+                       for ( col = 0; col < numMonths[ 1 ]; col++ ) {
+                               selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
+                               cornerClass = " ui-corner-all";
+                               calender = "";
+                               if ( isMultiMonth ) {
+                                       calender += "<div class='ui-datepicker-group";
+                                       if ( numMonths[ 1 ] > 1 ) {
+                                               switch ( col ) {
+                                                       case 0: calender += " ui-datepicker-group-first";
+                                                               cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
+                                                       case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
+                                                               cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
+                                                       default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
+                                               }
+                                       }
+                                       calender += "'>";
+                               }
+                               calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
+                                       ( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
+                                       ( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
+                                       this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
+                                       row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
+                                       "</div><table class='ui-datepicker-calendar'><thead>" +
+                                       "<tr>";
+                               thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
+                               for ( dow = 0; dow < 7; dow++ ) { // days of the week
+                                       day = ( dow + firstDay ) % 7;
+                                       thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
+                                               "<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
+                               }
+                               calender += thead + "</tr></thead><tbody>";
+                               daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
+                               if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
+                                       inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
+                               }
+                               leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
+                               curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
+                               numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
+                               this.maxRows = numRows;
+                               printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
+                               for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
+                                       calender += "<tr>";
+                                       tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
+                                               this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
+                                       for ( dow = 0; dow < 7; dow++ ) { // create date picker days
+                                               daySettings = ( beforeShowDay ?
+                                                       beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
+                                               otherMonth = ( printDate.getMonth() !== drawMonth );
+                                               unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
+                                                       ( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
+                                               tbody += "<td class='" +
+                                                       ( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
+                                                       ( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
+                                                       ( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
+                                                       ( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
+
+                                                       // or defaultDate is current printedDate and defaultDate is selectedDate
+                                                       " " + this._dayOverClass : "" ) + // highlight selected day
+                                                       ( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
+                                                       ( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
+                                                       ( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
+                                                       ( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
+                                                       ( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
+                                                       ( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
+                                                       ( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
+                                                       ( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
+                                                       ( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
+                                                       ( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
+                                                       ( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
+                                                       "' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
+                                               printDate.setDate( printDate.getDate() + 1 );
+                                               printDate = this._daylightSavingAdjust( printDate );
+                                       }
+                                       calender += tbody + "</tr>";
+                               }
+                               drawMonth++;
+                               if ( drawMonth > 11 ) {
+                                       drawMonth = 0;
+                                       drawYear++;
+                               }
+                               calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
+                                                       ( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
+                               group += calender;
+                       }
+                       html += group;
                }
-               var mod = d === "absolute" ? 1 : -1,
-                       scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
-                       scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-               return {
-                       top: (
-                               pos.top +                                                                                                                               // The absolute mouse position
-                               this.offset.relative.top * mod +                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.top * mod -                                                                                  // The offsetParent's offset without borders (offset + border)
-                               ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
-                       ),
-                       left: (
-                               pos.left +                                                                                                                              // The absolute mouse position
-                               this.offset.relative.left * mod +                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.left * mod   -                                                                               // The offsetParent's offset without borders (offset + border)
-                               ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
-                       )
-               };
-
+               html += buttonPanel;
+               inst._keyEvent = false;
+               return html;
        },
 
-       _generatePosition: function(event) {
+       /* Generate the month and year header. */
+       _generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
+                       secondary, monthNames, monthNamesShort ) {
 
-               var top, left,
-                       o = this.options,
-                       pageX = event.pageX,
-                       pageY = event.pageY,
-                       scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
+                       changeMonth = this._get( inst, "changeMonth" ),
+                       changeYear = this._get( inst, "changeYear" ),
+                       showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
+                       html = "<div class='ui-datepicker-title'>",
+                       monthHtml = "";
 
-               // This is another very weird special case that only happens for relative elements:
-               // 1. If the css position is relative
-               // 2. and the scroll parent is the document or similar to the offset parent
-               // we have to refresh the relative offset during the scroll so there are no jumps
-               if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
-                       this.offset.relative = this._getRelativeOffset();
+               // Month selection
+               if ( secondary || !changeMonth ) {
+                       monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
+               } else {
+                       inMinYear = ( minDate && minDate.getFullYear() === drawYear );
+                       inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
+                       monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
+                       for ( month = 0; month < 12; month++ ) {
+                               if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
+                                       monthHtml += "<option value='" + month + "'" +
+                                               ( month === drawMonth ? " selected='selected'" : "" ) +
+                                               ">" + monthNamesShort[ month ] + "</option>";
+                               }
+                       }
+                       monthHtml += "</select>";
                }
 
-               /*
-                * - Position constraining -
-                * Constrain the position to a mix of grid, containment.
-                */
+               if ( !showMonthAfterYear ) {
+                       html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
+               }
 
-               if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+               // Year selection
+               if ( !inst.yearshtml ) {
+                       inst.yearshtml = "";
+                       if ( secondary || !changeYear ) {
+                               html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
+                       } else {
 
-                       if(this.containment) {
-                               if(event.pageX - this.offset.click.left < this.containment[0]) {
-                                       pageX = this.containment[0] + this.offset.click.left;
-                               }
-                               if(event.pageY - this.offset.click.top < this.containment[1]) {
-                                       pageY = this.containment[1] + this.offset.click.top;
-                               }
-                               if(event.pageX - this.offset.click.left > this.containment[2]) {
-                                       pageX = this.containment[2] + this.offset.click.left;
-                               }
-                               if(event.pageY - this.offset.click.top > this.containment[3]) {
-                                       pageY = this.containment[3] + this.offset.click.top;
+                               // determine range of years to display
+                               years = this._get( inst, "yearRange" ).split( ":" );
+                               thisYear = new Date().getFullYear();
+                               determineYear = function( value ) {
+                                       var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
+                                               ( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
+                                               parseInt( value, 10 ) ) );
+                                       return ( isNaN( year ) ? thisYear : year );
+                               };
+                               year = determineYear( years[ 0 ] );
+                               endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
+                               year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
+                               endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
+                               inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
+                               for ( ; year <= endYear; year++ ) {
+                                       inst.yearshtml += "<option value='" + year + "'" +
+                                               ( year === drawYear ? " selected='selected'" : "" ) +
+                                               ">" + year + "</option>";
                                }
-                       }
+                               inst.yearshtml += "</select>";
 
-                       if(o.grid) {
-                               top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
-                               pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
-                               left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
-                               pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+                               html += inst.yearshtml;
+                               inst.yearshtml = null;
                        }
+               }
 
+               html += this._get( inst, "yearSuffix" );
+               if ( showMonthAfterYear ) {
+                       html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
                }
+               html += "</div>"; // Close datepicker_header
+               return html;
+       },
 
-               return {
-                       top: (
-                               pageY -                                                                                                                         // The absolute mouse position
-                               this.offset.click.top -                                                                                                 // Click offset (relative to the element)
-                               this.offset.relative.top        -                                                                                       // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.top +                                                                                                // The offsetParent's offset without borders (offset + border)
-                               ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
-                       ),
-                       left: (
-                               pageX -                                                                                                                         // The absolute mouse position
-                               this.offset.click.left -                                                                                                // Click offset (relative to the element)
-                               this.offset.relative.left       -                                                                                       // Only for relative positioned nodes: Relative offset from element to offset parent
-                               this.offset.parent.left +                                                                                               // The offsetParent's offset without borders (offset + border)
-                               ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
-                       )
-               };
+       /* Adjust one of the date sub-fields. */
+       _adjustInstDate: function( inst, offset, period ) {
+               var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
+                       month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
+                       day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
+                       date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
 
+               inst.selectedDay = date.getDate();
+               inst.drawMonth = inst.selectedMonth = date.getMonth();
+               inst.drawYear = inst.selectedYear = date.getFullYear();
+               if ( period === "M" || period === "Y" ) {
+                       this._notifyChange( inst );
+               }
        },
 
-       _rearrange: function(event, i, a, hardRefresh) {
+       /* Ensure a date is within any min/max bounds. */
+       _restrictMinMax: function( inst, date ) {
+               var minDate = this._getMinMaxDate( inst, "min" ),
+                       maxDate = this._getMinMaxDate( inst, "max" ),
+                       newDate = ( minDate && date < minDate ? minDate : date );
+               return ( maxDate && newDate > maxDate ? maxDate : newDate );
+       },
 
-               a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
+       /* Notify change of month/year. */
+       _notifyChange: function( inst ) {
+               var onChange = this._get( inst, "onChangeMonthYear" );
+               if ( onChange ) {
+                       onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
+                               [ inst.selectedYear, inst.selectedMonth + 1, inst ] );
+               }
+       },
 
-               //Various things done here to improve the performance:
-               // 1. we create a setTimeout, that calls refreshPositions
-               // 2. on the instance, we have a counter variable, that get's higher after every append
-               // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
-               // 4. this lets only the last addition to the timeout stack through
-               this.counter = this.counter ? ++this.counter : 1;
-               var counter = this.counter;
+       /* Determine the number of months to show. */
+       _getNumberOfMonths: function( inst ) {
+               var numMonths = this._get( inst, "numberOfMonths" );
+               return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
+       },
 
-               this._delay(function() {
-                       if(counter === this.counter) {
-                               this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
-                       }
-               });
+       /* Determine the current maximum date - ensure no time components are set. */
+       _getMinMaxDate: function( inst, minMax ) {
+               return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
+       },
 
+       /* Find the number of days in a given month. */
+       _getDaysInMonth: function( year, month ) {
+               return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
        },
 
-       _clear: function(event, noPropagation) {
+       /* Find the day of the week of the first of a month. */
+       _getFirstDayOfMonth: function( year, month ) {
+               return new Date( year, month, 1 ).getDay();
+       },
 
-               this.reverting = false;
-               // We delay all events that have to be triggered to after the point where the placeholder has been removed and
-               // everything else normalized again
-               var i,
-                       delayedTriggers = [];
+       /* Determines if we should allow a "next/prev" month display change. */
+       _canAdjustMonth: function( inst, offset, curYear, curMonth ) {
+               var numMonths = this._getNumberOfMonths( inst ),
+                       date = this._daylightSavingAdjust( new Date( curYear,
+                       curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
 
-               // We first have to update the dom position of the actual currentItem
-               // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
-               if(!this._noFinalSort && this.currentItem.parent().length) {
-                       this.placeholder.before(this.currentItem);
+               if ( offset < 0 ) {
+                       date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
                }
-               this._noFinalSort = null;
+               return this._isInRange( inst, date );
+       },
 
-               if(this.helper[0] === this.currentItem[0]) {
-                       for(i in this._storedCSS) {
-                               if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
-                                       this._storedCSS[i] = "";
+       /* Is the given date in the accepted range? */
+       _isInRange: function( inst, date ) {
+               var yearSplit, currentYear,
+                       minDate = this._getMinMaxDate( inst, "min" ),
+                       maxDate = this._getMinMaxDate( inst, "max" ),
+                       minYear = null,
+                       maxYear = null,
+                       years = this._get( inst, "yearRange" );
+                       if ( years ) {
+                               yearSplit = years.split( ":" );
+                               currentYear = new Date().getFullYear();
+                               minYear = parseInt( yearSplit[ 0 ], 10 );
+                               maxYear = parseInt( yearSplit[ 1 ], 10 );
+                               if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
+                                       minYear += currentYear;
+                               }
+                               if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
+                                       maxYear += currentYear;
                                }
                        }
-                       this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-               } else {
-                       this.currentItem.show();
-               }
-
-               if(this.fromOutside && !noPropagation) {
-                       delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
-               }
-               if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
-                       delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
-               }
-
-               // Check if the items Container has Changed and trigger appropriate
-               // events.
-               if (this !== this.currentContainer) {
-                       if(!noPropagation) {
-                               delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
-                               delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
-                               delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
-                       }
-               }
 
+               return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
+                       ( !maxDate || date.getTime() <= maxDate.getTime() ) &&
+                       ( !minYear || date.getFullYear() >= minYear ) &&
+                       ( !maxYear || date.getFullYear() <= maxYear ) );
+       },
 
-               //Post events to containers
-               function delayEvent( type, instance, container ) {
-                       return function( event ) {
-                               container._trigger( type, event, instance._uiHash( instance ) );
-                       };
-               }
-               for (i = this.containers.length - 1; i >= 0; i--){
-                       if (!noPropagation) {
-                               delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
-                       }
-                       if(this.containers[i].containerCache.over) {
-                               delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
-                               this.containers[i].containerCache.over = 0;
-                       }
-               }
+       /* Provide the configuration settings for formatting/parsing. */
+       _getFormatConfig: function( inst ) {
+               var shortYearCutoff = this._get( inst, "shortYearCutoff" );
+               shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
+                       new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
+               return { shortYearCutoff: shortYearCutoff,
+                       dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
+                       monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
+       },
 
-               //Do what was originally in plugins
-               if ( this.storedCursor ) {
-                       this.document.find( "body" ).css( "cursor", this.storedCursor );
-                       this.storedStylesheet.remove();
-               }
-               if(this._storedOpacity) {
-                       this.helper.css("opacity", this._storedOpacity);
-               }
-               if(this._storedZIndex) {
-                       this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
+       /* Format the given date for display. */
+       _formatDate: function( inst, day, month, year ) {
+               if ( !day ) {
+                       inst.currentDay = inst.selectedDay;
+                       inst.currentMonth = inst.selectedMonth;
+                       inst.currentYear = inst.selectedYear;
                }
+               var date = ( day ? ( typeof day === "object" ? day :
+                       this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
+                       this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
+               return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
+       }
+} );
 
-               this.dragging = false;
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */
+function datepicker_bindHover( dpDiv ) {
+       var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
+       return dpDiv.on( "mouseout", selector, function() {
+                       $( this ).removeClass( "ui-state-hover" );
+                       if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
+                               $( this ).removeClass( "ui-datepicker-prev-hover" );
+                       }
+                       if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
+                               $( this ).removeClass( "ui-datepicker-next-hover" );
+                       }
+               } )
+               .on( "mouseover", selector, datepicker_handleMouseover );
+}
 
-               if(!noPropagation) {
-                       this._trigger("beforeStop", event, this._uiHash());
+function datepicker_handleMouseover() {
+       if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
+               $( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
+               $( this ).addClass( "ui-state-hover" );
+               if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
+                       $( this ).addClass( "ui-datepicker-prev-hover" );
                }
-
-               //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-               this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-
-               if ( !this.cancelHelperRemoval ) {
-                       if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
-                               this.helper.remove();
-                       }
-                       this.helper = null;
+               if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
+                       $( this ).addClass( "ui-datepicker-next-hover" );
                }
+       }
+}
 
-               if(!noPropagation) {
-                       for (i=0; i < delayedTriggers.length; i++) {
-                               delayedTriggers[i].call(this, event);
-                       } //Trigger all delayed events
-                       this._trigger("stop", event, this._uiHash());
+/* jQuery extend now ignores nulls! */
+function datepicker_extendRemove( target, props ) {
+       $.extend( target, props );
+       for ( var name in props ) {
+               if ( props[ name ] == null ) {
+                       target[ name ] = props[ name ];
                }
+       }
+       return target;
+}
 
-               this.fromOutside = false;
-               return !this.cancelHelperRemoval;
+/* Invoke the datepicker functionality.
+   @param  options  string - a command, optionally followed by additional parameters or
+                                       Object - settings for attaching new datepicker functionality
+   @return  jQuery object */
+$.fn.datepicker = function( options ) {
 
-       },
+       /* Verify an empty collection wasn't passed - Fixes #6976 */
+       if ( !this.length ) {
+               return this;
+       }
 
-       _trigger: function() {
-               if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
-                       this.cancel();
-               }
-       },
+       /* Initialise the date picker. */
+       if ( !$.datepicker.initialized ) {
+               $( document ).on( "mousedown", $.datepicker._checkExternalClick );
+               $.datepicker.initialized = true;
+       }
 
-       _uiHash: function(_inst) {
-               var inst = _inst || this;
-               return {
-                       helper: inst.helper,
-                       placeholder: inst.placeholder || $([]),
-                       position: inst.position,
-                       originalPosition: inst.originalPosition,
-                       offset: inst.positionAbs,
-                       item: inst.currentItem,
-                       sender: _inst ? _inst.element : null
-               };
+       /* Append datepicker main container to body if not exist. */
+       if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
+               $( "body" ).append( $.datepicker.dpDiv );
        }
 
-});
+       var otherArgs = Array.prototype.slice.call( arguments, 1 );
+       if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
+               return $.datepicker[ "_" + options + "Datepicker" ].
+                       apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
+       }
+       if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
+               return $.datepicker[ "_" + options + "Datepicker" ].
+                       apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
+       }
+       return this.each( function() {
+               typeof options === "string" ?
+                       $.datepicker[ "_" + options + "Datepicker" ].
+                               apply( $.datepicker, [ this ].concat( otherArgs ) ) :
+                       $.datepicker._attachDatepicker( this, options );
+       } );
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.12.0";
+
+var widgetsDatepicker = $.datepicker;
 
 
 /*!
- * jQuery UI Effects 1.11.4
+ * jQuery UI Effects 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/effects-core/
  */
 
+//>>label: Effects Core
+//>>group: Effects
+// jscs:disable maximumLineLength
+//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
+// jscs:enable maximumLineLength
+//>>docs: http://api.jqueryui.com/category/effects-core/
+//>>demos: http://jqueryui.com/effect/
+
+
 
 var dataSpace = "ui-effects-",
+       dataSpaceStyle = "ui-effects-style",
+       dataSpaceAnimated = "ui-effects-animated",
 
        // Create a local jQuery because jQuery Color relies on it and the
        // global may not exist with AMD and a custom build (#10199)
@@ -5804,13 +7096,15 @@ $.effects = {
  *
  * Date: Wed Jan 16 08:47:09 2013 -0600
  */
-(function( jQuery, undefined ) {
+( function( jQuery, undefined ) {
 
-       var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
+       var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
+               "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
 
-       // plusequals test for += 100 -= 100
+       // Plusequals test for += 100 -= 100
        rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
-       // a set of RE's that can match strings and generate color tuples.
+
+       // A set of RE's that can match strings and generate color tuples.
        stringParsers = [ {
                        re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
                        parse: function( execResult ) {
@@ -5832,7 +7126,8 @@ $.effects = {
                                ];
                        }
                }, {
-                       // this regex ignores A-F because it's compared against an already lowercased string
+
+                       // This regex ignores A-F because it's compared against an already lowercased string
                        re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
                        parse: function( execResult ) {
                                return [
@@ -5842,7 +7137,8 @@ $.effects = {
                                ];
                        }
                }, {
-                       // this regex ignores A-F because it's compared against an already lowercased string
+
+                       // This regex ignores A-F because it's compared against an already lowercased string
                        re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
                        parse: function( execResult ) {
                                return [
@@ -5864,7 +7160,7 @@ $.effects = {
                        }
                } ],
 
-       // jQuery.Color( )
+       // JQuery.Color( )
        color = jQuery.Color = function( color, green, blue, alpha ) {
                return new jQuery.Color.fn.parse( color, green, blue, alpha );
        },
@@ -5918,20 +7214,20 @@ $.effects = {
        },
        support = color.support = {},
 
-       // element for support tests
+       // Element for support tests
        supportElem = jQuery( "<p>" )[ 0 ],
 
-       // colors = jQuery.Color.names
+       // Colors = jQuery.Color.names
        colors,
 
-       // local aliases of functions called often
+       // Local aliases of functions called often
        each = jQuery.each;
 
-// determine rgba support immediately
+// Determine rgba support immediately
 supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
 support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
 
-// define cache name and alpha properties
+// Define cache name and alpha properties
 // for rgba and hsla spaces
 each( spaces, function( spaceName, space ) {
        space.cache = "_" + spaceName;
@@ -5940,13 +7236,13 @@ each( spaces, function( spaceName, space ) {
                type: "percent",
                def: 1
        };
-});
+} );
 
 function clamp( value, prop, allowEmpty ) {
        var type = propTypes[ prop.type ] || {};
 
        if ( value == null ) {
-               return (allowEmpty || !prop.def) ? null : prop.def;
+               return ( allowEmpty || !prop.def ) ? null : prop.def;
        }
 
        // ~~ is an short way of doing floor for positive numbers
@@ -5959,12 +7255,13 @@ function clamp( value, prop, allowEmpty ) {
        }
 
        if ( type.mod ) {
-               // we add mod before modding to make sure that negatives values
+
+               // We add mod before modding to make sure that negatives values
                // get converted properly: -10 -> 350
-               return (value + type.mod) % type.mod;
+               return ( value + type.mod ) % type.mod;
        }
 
-       // for now all property types without mod have min and max
+       // For now all property types without mod have min and max
        return 0 > value ? 0 : type.max < value ? type.max : value;
 }
 
@@ -5983,20 +7280,20 @@ function stringParse( string ) {
                if ( values ) {
                        parsed = inst[ spaceName ]( values );
 
-                       // if this was an rgba parse the assignment might happen twice
+                       // If this was an rgba parse the assignment might happen twice
                        // oh well....
                        inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
                        rgba = inst._rgba = parsed._rgba;
 
-                       // exit each( stringParsers ) here because we matched
+                       // Exit each( stringParsers ) here because we matched
                        return false;
                }
-       });
+       } );
 
        // Found a stringParser that handled it
        if ( rgba.length ) {
 
-               // if this came from a parsed string, force "transparent" when alpha is 0
+               // If this came from a parsed string, force "transparent" when alpha is 0
                // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
                if ( rgba.join() === "0,0,0,0" ) {
                        jQuery.extend( rgba, colors.transparent );
@@ -6004,7 +7301,7 @@ function stringParse( string ) {
                return inst;
        }
 
-       // named colors
+       // Named colors
        return colors[ string ];
 }
 
@@ -6023,7 +7320,7 @@ color.fn = jQuery.extend( color.prototype, {
                        type = jQuery.type( red ),
                        rgba = this._rgba = [];
 
-               // more than 1 argument specified - assume ( red, green, blue, alpha )
+               // More than 1 argument specified - assume ( red, green, blue, alpha )
                if ( green !== undefined ) {
                        red = [ red, green, blue, alpha ];
                        type = "array";
@@ -6036,7 +7333,7 @@ color.fn = jQuery.extend( color.prototype, {
                if ( type === "array" ) {
                        each( spaces.rgba.props, function( key, prop ) {
                                rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
-                       });
+                       } );
                        return this;
                }
 
@@ -6046,16 +7343,16 @@ color.fn = jQuery.extend( color.prototype, {
                                        if ( red[ space.cache ] ) {
                                                inst[ space.cache ] = red[ space.cache ].slice();
                                        }
-                               });
+                               } );
                        } else {
                                each( spaces, function( spaceName, space ) {
                                        var cache = space.cache;
                                        each( space.props, function( key, prop ) {
 
-                                               // if the cache doesn't exist, and we know how to convert
+                                               // If the cache doesn't exist, and we know how to convert
                                                if ( !inst[ cache ] && space.to ) {
 
-                                                       // if the value was null, we don't need to copy it
+                                                       // If the value was null, we don't need to copy it
                                                        // if the key was alpha, we don't need to copy it either
                                                        if ( key === "alpha" || red[ key ] == null ) {
                                                                return;
@@ -6063,20 +7360,22 @@ color.fn = jQuery.extend( color.prototype, {
                                                        inst[ cache ] = space.to( inst._rgba );
                                                }
 
-                                               // this is the only case where we allow nulls for ALL properties.
+                                               // This is the only case where we allow nulls for ALL properties.
                                                // call clamp with alwaysAllowEmpty
                                                inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
-                                       });
+                                       } );
+
+                                       // Everything defined but alpha?
+                                       if ( inst[ cache ] &&
+                                                       jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
 
-                                       // everything defined but alpha?
-                                       if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
-                                               // use the default of 1
+                                               // Use the default of 1
                                                inst[ cache ][ 3 ] = 1;
                                                if ( space.from ) {
                                                        inst._rgba = space.from( inst[ cache ] );
                                                }
                                        }
-                               });
+                               } );
                        }
                        return this;
                }
@@ -6089,17 +7388,17 @@ color.fn = jQuery.extend( color.prototype, {
                each( spaces, function( _, space ) {
                        var localCache,
                                isCache = is[ space.cache ];
-                       if (isCache) {
+                       if ( isCache ) {
                                localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
                                each( space.props, function( _, prop ) {
                                        if ( isCache[ prop.idx ] != null ) {
                                                same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
                                                return same;
                                        }
-                               });
+                               } );
                        }
                        return same;
-               });
+               } );
                return same;
        },
        _space: function() {
@@ -6109,7 +7408,7 @@ color.fn = jQuery.extend( color.prototype, {
                        if ( inst[ space.cache ] ) {
                                used.push( spaceName );
                        }
-               });
+               } );
                return used.pop();
        },
        transition: function( other, distance ) {
@@ -6127,11 +7426,12 @@ color.fn = jQuery.extend( color.prototype, {
                                endValue = end[ index ],
                                type = propTypes[ prop.type ] || {};
 
-                       // if null, don't override start value
+                       // If null, don't override start value
                        if ( endValue === null ) {
                                return;
                        }
-                       // if null - use end
+
+                       // If null - use end
                        if ( startValue === null ) {
                                result[ index ] = endValue;
                        } else {
@@ -6144,11 +7444,12 @@ color.fn = jQuery.extend( color.prototype, {
                                }
                                result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
                        }
-               });
+               } );
                return this[ spaceName ]( result );
        },
        blend: function( opaque ) {
-               // if we are already opaque - return ourself
+
+               // If we are already opaque - return ourself
                if ( this._rgba[ 3 ] === 1 ) {
                        return this;
                }
@@ -6159,13 +7460,13 @@ color.fn = jQuery.extend( color.prototype, {
 
                return color( jQuery.map( rgb, function( v, i ) {
                        return ( 1 - a ) * blend[ i ] + a * v;
-               }));
+               } ) );
        },
        toRgbaString: function() {
                var prefix = "rgba(",
                        rgba = jQuery.map( this._rgba, function( v, i ) {
                                return v == null ? ( i > 2 ? 1 : 0 ) : v;
-                       });
+                       } );
 
                if ( rgba[ 3 ] === 1 ) {
                        rgba.pop();
@@ -6181,12 +7482,12 @@ color.fn = jQuery.extend( color.prototype, {
                                        v = i > 2 ? 1 : 0;
                                }
 
-                               // catch 1 and 2
+                               // Catch 1 and 2
                                if ( i && i < 3 ) {
                                        v = Math.round( v * 100 ) + "%";
                                }
                                return v;
-                       });
+                       } );
 
                if ( hsla[ 3 ] === 1 ) {
                        hsla.pop();
@@ -6204,18 +7505,18 @@ color.fn = jQuery.extend( color.prototype, {
 
                return "#" + jQuery.map( rgba, function( v ) {
 
-                       // default to 0 when nulls exist
+                       // Default to 0 when nulls exist
                        v = ( v || 0 ).toString( 16 );
                        return v.length === 1 ? "0" + v : v;
-               }).join("");
+               } ).join( "" );
        },
        toString: function() {
                return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
        }
-});
+} );
 color.fn.parse.prototype = color.fn;
 
-// hsla conversions adapted from:
+// Hsla conversions adapted from:
 // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
 
 function hue2rgb( p, q, h ) {
@@ -6223,7 +7524,7 @@ function hue2rgb( p, q, h ) {
        if ( h * 6 < 1 ) {
                return p + ( q - p ) * h * 6;
        }
-       if ( h * 2 < 1) {
+       if ( h * 2 < 1 ) {
                return q;
        }
        if ( h * 3 < 2 ) {
@@ -6257,7 +7558,7 @@ spaces.hsla.to = function( rgba ) {
                h = ( 60 * ( r - g ) / diff ) + 240;
        }
 
-       // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
+       // Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
        // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
        if ( diff === 0 ) {
                s = 0;
@@ -6266,7 +7567,7 @@ spaces.hsla.to = function( rgba ) {
        } else {
                s = diff / ( 2 - add );
        }
-       return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
+       return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
 };
 
 spaces.hsla.from = function( hsla ) {
@@ -6294,10 +7595,10 @@ each( spaces, function( spaceName, space ) {
                to = space.to,
                from = space.from;
 
-       // makes rgba() and hsla()
+       // Makes rgba() and hsla()
        color.fn[ spaceName ] = function( value ) {
 
-               // generate a cache for this space if it doesn't exist
+               // Generate a cache for this space if it doesn't exist
                if ( to && !this[ cache ] ) {
                        this[ cache ] = to( this._rgba );
                }
@@ -6316,7 +7617,7 @@ each( spaces, function( spaceName, space ) {
                                val = local[ prop.idx ];
                        }
                        local[ prop.idx ] = clamp( val, prop );
-               });
+               } );
 
                if ( from ) {
                        ret = color( from( local ) );
@@ -6327,9 +7628,10 @@ each( spaces, function( spaceName, space ) {
                }
        };
 
-       // makes red() green() blue() alpha() hue() saturation() lightness()
+       // Makes red() green() blue() alpha() hue() saturation() lightness()
        each( props, function( key, prop ) {
-               // alpha is included in more than one space
+
+               // Alpha is included in more than one space
                if ( color.fn[ key ] ) {
                        return;
                }
@@ -6360,10 +7662,10 @@ each( spaces, function( spaceName, space ) {
                        local[ prop.idx ] = value;
                        return this[ fn ]( local );
                };
-       });
-});
+       } );
+} );
 
-// add cssHook and .fx.step function for each named hook.
+// Add cssHook and .fx.step function for each named hook.
 // accept a space separated string of properties
 color.hook = function( hook ) {
        var hooks = hook.split( " " );
@@ -6373,12 +7675,13 @@ color.hook = function( hook ) {
                                var parsed, curElem,
                                        backgroundColor = "";
 
-                               if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
+                               if ( value !== "transparent" && ( jQuery.type( value ) !== "string" ||
+                                               ( parsed = stringParse( value ) ) ) ) {
                                        value = color( parsed || value );
                                        if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
                                                curElem = hook === "backgroundColor" ? elem.parentNode : elem;
                                                while (
-                                                       (backgroundColor === "" || backgroundColor === "transparent") &&
+                                                       ( backgroundColor === "" || backgroundColor === "transparent" ) &&
                                                        curElem && curElem.style
                                                ) {
                                                        try {
@@ -6398,7 +7701,9 @@ color.hook = function( hook ) {
                                try {
                                        elem.style[ hook ] = value;
                                } catch ( e ) {
-                                       // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
+
+                                       // Wrapped to prevent IE from throwing errors on "invalid" values like
+                                       // 'auto' or 'inherit'
                                }
                        }
                };
@@ -6410,7 +7715,7 @@ color.hook = function( hook ) {
                        }
                        jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
                };
-       });
+       } );
 
 };
 
@@ -6422,7 +7727,7 @@ jQuery.cssHooks.borderColor = {
 
                each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
                        expanded[ "border" + part + "Color" ] = value;
-               });
+               } );
                return expanded;
        }
 };
@@ -6431,6 +7736,7 @@ jQuery.cssHooks.borderColor = {
 // Usage of any of the other color names requires adding yourself or including
 // jquery.color.svg-names.js.
 colors = jQuery.Color.names = {
+
        // 4.1. Basic color keywords
        aqua: "#00ffff",
        black: "#000000",
@@ -6455,12 +7761,12 @@ colors = jQuery.Color.names = {
        _default: "#ffffff"
 };
 
-})( jQuery );
+} )( jQuery );
 
 /******************************************************************************/
 /****************************** CLASS ANIMATIONS ******************************/
 /******************************************************************************/
-(function() {
+( function() {
 
 var classAnimationActions = [ "add", "remove", "toggle" ],
        shorthandStyles = {
@@ -6475,14 +7781,17 @@ var classAnimationActions = [ "add", "remove", "toggle" ],
                padding: 1
        };
 
-$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
-       $.fx.step[ prop ] = function( fx ) {
-               if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
-                       jQuery.style( fx.elem, prop, fx.end );
-                       fx.setAttr = true;
-               }
-       };
-});
+$.each(
+       [ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
+       function( _, prop ) {
+               $.fx.step[ prop ] = function( fx ) {
+                       if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
+                               jQuery.style( fx.elem, prop, fx.end );
+                               fx.setAttr = true;
+                       }
+               };
+       }
+);
 
 function getElementStyles( elem ) {
        var key, len,
@@ -6499,7 +7808,8 @@ function getElementStyles( elem ) {
                                styles[ $.camelCase( key ) ] = style[ key ];
                        }
                }
-       // support: Opera, IE <9
+
+       // Support: Opera, IE <9
        } else {
                for ( key in style ) {
                        if ( typeof style[ key ] === "string" ) {
@@ -6529,7 +7839,7 @@ function styleDifference( oldStyle, newStyle ) {
        return diff;
 }
 
-// support: jQuery <1.8
+// Support: jQuery <1.8
 if ( !$.fn.addBack ) {
        $.fn.addBack = function( selector ) {
                return this.add( selector == null ?
@@ -6547,275 +7857,448 @@ $.effects.animateClass = function( value, duration, easing, callback ) {
                        applyClassChange,
                        allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
 
-               // map the animated objects to store the original styles.
-               allAnimations = allAnimations.map(function() {
+               // Map the animated objects to store the original styles.
+               allAnimations = allAnimations.map( function() {
                        var el = $( this );
                        return {
                                el: el,
                                start: getElementStyles( this )
                        };
-               });
+               } );
 
-               // apply class change
+               // Apply class change
                applyClassChange = function() {
-                       $.each( classAnimationActions, function(i, action) {
+                       $.each( classAnimationActions, function( i, action ) {
                                if ( value[ action ] ) {
                                        animated[ action + "Class" ]( value[ action ] );
                                }
-                       });
+                       } );
                };
                applyClassChange();
 
-               // map all animated objects again - calculate new styles and diff
-               allAnimations = allAnimations.map(function() {
+               // Map all animated objects again - calculate new styles and diff
+               allAnimations = allAnimations.map( function() {
                        this.end = getElementStyles( this.el[ 0 ] );
                        this.diff = styleDifference( this.start, this.end );
                        return this;
-               });
+               } );
 
-               // apply original class
+               // Apply original class
                animated.attr( "class", baseClass );
 
-               // map all animated objects again - this time collecting a promise
-               allAnimations = allAnimations.map(function() {
+               // Map all animated objects again - this time collecting a promise
+               allAnimations = allAnimations.map( function() {
                        var styleInfo = this,
                                dfd = $.Deferred(),
-                               opts = $.extend({}, o, {
+                               opts = $.extend( {}, o, {
                                        queue: false,
                                        complete: function() {
                                                dfd.resolve( styleInfo );
                                        }
-                               });
+                               } );
 
                        this.el.animate( this.diff, opts );
                        return dfd.promise();
-               });
+               } );
 
-               // once all animations have completed:
-               $.when.apply( $, allAnimations.get() ).done(function() {
+               // Once all animations have completed:
+               $.when.apply( $, allAnimations.get() ).done( function() {
 
-                       // set the final class
+                       // Set the final class
                        applyClassChange();
 
-                       // for each animated element,
+                       // For each animated element,
                        // clear all css properties that were animated
                        $.each( arguments, function() {
                                var el = this.el;
-                               $.each( this.diff, function(key) {
+                               $.each( this.diff, function( key ) {
                                        el.css( key, "" );
-                               });
-                       });
+                               } );
+                       } );
 
-                       // this is guarnteed to be there if you use jQuery.speed()
+                       // This is guarnteed to be there if you use jQuery.speed()
                        // it also handles dequeuing the next anim...
                        o.complete.call( animated[ 0 ] );
-               });
-       });
+               } );
+       } );
 };
 
-$.fn.extend({
-       addClass: (function( orig ) {
+$.fn.extend( {
+       addClass: ( function( orig ) {
                return function( classNames, speed, easing, callback ) {
                        return speed ?
                                $.effects.animateClass.call( this,
                                        { add: classNames }, speed, easing, callback ) :
                                orig.apply( this, arguments );
                };
-       })( $.fn.addClass ),
+       } )( $.fn.addClass ),
 
-       removeClass: (function( orig ) {
+       removeClass: ( function( orig ) {
                return function( classNames, speed, easing, callback ) {
                        return arguments.length > 1 ?
                                $.effects.animateClass.call( this,
                                        { remove: classNames }, speed, easing, callback ) :
                                orig.apply( this, arguments );
                };
-       })( $.fn.removeClass ),
+       } )( $.fn.removeClass ),
 
-       toggleClass: (function( orig ) {
+       toggleClass: ( function( orig ) {
                return function( classNames, force, speed, easing, callback ) {
                        if ( typeof force === "boolean" || force === undefined ) {
                                if ( !speed ) {
-                                       // without speed parameter
+
+                                       // Without speed parameter
                                        return orig.apply( this, arguments );
                                } else {
                                        return $.effects.animateClass.call( this,
-                                               (force ? { add: classNames } : { remove: classNames }),
+                                               ( force ? { add: classNames } : { remove: classNames } ),
                                                speed, easing, callback );
                                }
                        } else {
-                               // without force parameter
+
+                               // Without force parameter
                                return $.effects.animateClass.call( this,
                                        { toggle: classNames }, force, speed, easing );
                        }
                };
-       })( $.fn.toggleClass ),
+       } )( $.fn.toggleClass ),
 
-       switchClass: function( remove, add, speed, easing, callback) {
+       switchClass: function( remove, add, speed, easing, callback ) {
                return $.effects.animateClass.call( this, {
                        add: add,
                        remove: remove
                }, speed, easing, callback );
        }
-});
+} );
 
-})();
+} )();
 
 /******************************************************************************/
 /*********************************** EFFECTS **********************************/
 /******************************************************************************/
 
-(function() {
+( function() {
 
-$.extend( $.effects, {
-       version: "1.11.4",
+if ( $.expr && $.expr.filters && $.expr.filters.animated ) {
+       $.expr.filters.animated = ( function( orig ) {
+               return function( elem ) {
+                       return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
+               };
+       } )( $.expr.filters.animated );
+}
 
-       // Saves a set of properties in a data storage
-       save: function( element, set ) {
-               for ( var i = 0; i < set.length; i++ ) {
-                       if ( set[ i ] !== null ) {
-                               element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+if ( $.uiBackCompat !== false ) {
+       $.extend( $.effects, {
+
+               // Saves a set of properties in a data storage
+               save: function( element, set ) {
+                       var i = 0, length = set.length;
+                       for ( ; i < length; i++ ) {
+                               if ( set[ i ] !== null ) {
+                                       element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+                               }
                        }
-               }
-       },
+               },
 
-       // Restores a set of previously saved properties from a data storage
-       restore: function( element, set ) {
-               var val, i;
-               for ( i = 0; i < set.length; i++ ) {
-                       if ( set[ i ] !== null ) {
-                               val = element.data( dataSpace + set[ i ] );
-                               // support: jQuery 1.6.2
-                               // http://bugs.jquery.com/ticket/9917
-                               // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
-                               // We can't differentiate between "" and 0 here, so we just assume
-                               // empty string since it's likely to be a more common value...
-                               if ( val === undefined ) {
-                                       val = "";
+               // Restores a set of previously saved properties from a data storage
+               restore: function( element, set ) {
+                       var val, i = 0, length = set.length;
+                       for ( ; i < length; i++ ) {
+                               if ( set[ i ] !== null ) {
+                                       val = element.data( dataSpace + set[ i ] );
+                                       element.css( set[ i ], val );
+                               }
+                       }
+               },
+
+               setMode: function( el, mode ) {
+                       if ( mode === "toggle" ) {
+                               mode = el.is( ":hidden" ) ? "show" : "hide";
+                       }
+                       return mode;
+               },
+
+               // Wraps the element around a wrapper that copies position properties
+               createWrapper: function( element ) {
+
+                       // If the element is already wrapped, return it
+                       if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+                               return element.parent();
+                       }
+
+                       // Wrap the element
+                       var props = {
+                                       width: element.outerWidth( true ),
+                                       height: element.outerHeight( true ),
+                                       "float": element.css( "float" )
+                               },
+                               wrapper = $( "<div></div>" )
+                                       .addClass( "ui-effects-wrapper" )
+                                       .css( {
+                                               fontSize: "100%",
+                                               background: "transparent",
+                                               border: "none",
+                                               margin: 0,
+                                               padding: 0
+                                       } ),
+
+                               // Store the size in case width/height are defined in % - Fixes #5245
+                               size = {
+                                       width: element.width(),
+                                       height: element.height()
+                               },
+                               active = document.activeElement;
+
+                       // Support: Firefox
+                       // Firefox incorrectly exposes anonymous content
+                       // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+                       try {
+                               active.id;
+                       } catch ( e ) {
+                               active = document.body;
+                       }
+
+                       element.wrap( wrapper );
+
+                       // Fixes #7595 - Elements lose focus when wrapped.
+                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                               $( active ).trigger( "focus" );
+                       }
+
+                       // Hotfix for jQuery 1.4 since some change in wrap() seems to actually
+                       // lose the reference to the wrapped element
+                       wrapper = element.parent();
+
+                       // Transfer positioning properties to the wrapper
+                       if ( element.css( "position" ) === "static" ) {
+                               wrapper.css( { position: "relative" } );
+                               element.css( { position: "relative" } );
+                       } else {
+                               $.extend( props, {
+                                       position: element.css( "position" ),
+                                       zIndex: element.css( "z-index" )
+                               } );
+                               $.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
+                                       props[ pos ] = element.css( pos );
+                                       if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
+                                               props[ pos ] = "auto";
+                                       }
+                               } );
+                               element.css( {
+                                       position: "relative",
+                                       top: 0,
+                                       left: 0,
+                                       right: "auto",
+                                       bottom: "auto"
+                               } );
+                       }
+                       element.css( size );
+
+                       return wrapper.css( props ).show();
+               },
+
+               removeWrapper: function( element ) {
+                       var active = document.activeElement;
+
+                       if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+                               element.parent().replaceWith( element );
+
+                               // Fixes #7595 - Elements lose focus when wrapped.
+                               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                                       $( active ).trigger( "focus" );
                                }
-                               element.css( set[ i ], val );
                        }
+
+                       return element;
+               }
+       } );
+}
+
+$.extend( $.effects, {
+       version: "1.12.0",
+
+       define: function( name, mode, effect ) {
+               if ( !effect ) {
+                       effect = mode;
+                       mode = "effect";
+               }
+
+               $.effects.effect[ name ] = effect;
+               $.effects.effect[ name ].mode = mode;
+
+               return effect;
+       },
+
+       scaledDimensions: function( element, percent, direction ) {
+               if ( percent === 0 ) {
+                       return {
+                               height: 0,
+                               width: 0,
+                               outerHeight: 0,
+                               outerWidth: 0
+                       };
+               }
+
+               var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
+                       y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
+
+               return {
+                       height: element.height() * y,
+                       width: element.width() * x,
+                       outerHeight: element.outerHeight() * y,
+                       outerWidth: element.outerWidth() * x
+               };
+
+       },
+
+       clipToBox: function( animation ) {
+               return {
+                       width: animation.clip.right - animation.clip.left,
+                       height: animation.clip.bottom - animation.clip.top,
+                       left: animation.clip.left,
+                       top: animation.clip.top
+               };
+       },
+
+       // Injects recently queued functions to be first in line (after "inprogress")
+       unshift: function( element, queueLength, count ) {
+               var queue = element.queue();
+
+               if ( queueLength > 1 ) {
+                       queue.splice.apply( queue,
+                               [ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
                }
+               element.dequeue();
+       },
+
+       saveStyle: function( element ) {
+               element.data( dataSpaceStyle, element[ 0 ].style.cssText );
+       },
+
+       restoreStyle: function( element ) {
+               element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
+               element.removeData( dataSpaceStyle );
        },
 
-       setMode: function( el, mode ) {
-               if (mode === "toggle") {
-                       mode = el.is( ":hidden" ) ? "show" : "hide";
+       mode: function( element, mode ) {
+               var hidden = element.is( ":hidden" );
+
+               if ( mode === "toggle" ) {
+                       mode = hidden ? "show" : "hide";
+               }
+               if ( hidden ? mode === "hide" : mode === "show" ) {
+                       mode = "none";
                }
                return mode;
        },
 
        // Translates a [top,left] array into a baseline value
-       // this should be a little more flexible in the future to handle a string & hash
        getBaseline: function( origin, original ) {
                var y, x;
+
                switch ( origin[ 0 ] ) {
-                       case "top": y = 0; break;
-                       case "middle": y = 0.5; break;
-                       case "bottom": y = 1; break;
-                       default: y = origin[ 0 ] / original.height;
+               case "top":
+                       y = 0;
+                       break;
+               case "middle":
+                       y = 0.5;
+                       break;
+               case "bottom":
+                       y = 1;
+                       break;
+               default:
+                       y = origin[ 0 ] / original.height;
                }
+
                switch ( origin[ 1 ] ) {
-                       case "left": x = 0; break;
-                       case "center": x = 0.5; break;
-                       case "right": x = 1; break;
-                       default: x = origin[ 1 ] / original.width;
+               case "left":
+                       x = 0;
+                       break;
+               case "center":
+                       x = 0.5;
+                       break;
+               case "right":
+                       x = 1;
+                       break;
+               default:
+                       x = origin[ 1 ] / original.width;
                }
+
                return {
                        x: x,
                        y: y
                };
        },
 
-       // Wraps the element around a wrapper that copies position properties
-       createWrapper: function( element ) {
-
-               // if the element is already wrapped, return it
-               if ( element.parent().is( ".ui-effects-wrapper" )) {
-                       return element.parent();
-               }
-
-               // wrap the element
-               var props = {
-                               width: element.outerWidth(true),
-                               height: element.outerHeight(true),
+       // Creates a placeholder element so that the original element can be made absolute
+       createPlaceholder: function( element ) {
+               var placeholder,
+                       cssPosition = element.css( "position" ),
+                       position = element.position();
+
+               // Lock in margins first to account for form elements, which
+               // will change margin if you explicitly set height
+               // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
+               // Support: Safari
+               element.css( {
+                       marginTop: element.css( "marginTop" ),
+                       marginBottom: element.css( "marginBottom" ),
+                       marginLeft: element.css( "marginLeft" ),
+                       marginRight: element.css( "marginRight" )
+               } )
+               .outerWidth( element.outerWidth() )
+               .outerHeight( element.outerHeight() );
+
+               if ( /^(static|relative)/.test( cssPosition ) ) {
+                       cssPosition = "absolute";
+
+                       placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
+
+                               // Convert inline to inline block to account for inline elements
+                               // that turn to inline block based on content (like img)
+                               display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
+                                       "inline-block" :
+                                       "block",
+                               visibility: "hidden",
+
+                               // Margins need to be set to account for margin collapse
+                               marginTop: element.css( "marginTop" ),
+                               marginBottom: element.css( "marginBottom" ),
+                               marginLeft: element.css( "marginLeft" ),
+                               marginRight: element.css( "marginRight" ),
                                "float": element.css( "float" )
-                       },
-                       wrapper = $( "<div></div>" )
-                               .addClass( "ui-effects-wrapper" )
-                               .css({
-                                       fontSize: "100%",
-                                       background: "transparent",
-                                       border: "none",
-                                       margin: 0,
-                                       padding: 0
-                               }),
-                       // Store the size in case width/height are defined in % - Fixes #5245
-                       size = {
-                               width: element.width(),
-                               height: element.height()
-                       },
-                       active = document.activeElement;
-
-               // support: Firefox
-               // Firefox incorrectly exposes anonymous content
-               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-               try {
-                       active.id;
-               } catch ( e ) {
-                       active = document.body;
-               }
+                       } )
+                       .outerWidth( element.outerWidth() )
+                       .outerHeight( element.outerHeight() )
+                       .addClass( "ui-effects-placeholder" );
 
-               element.wrap( wrapper );
-
-               // Fixes #7595 - Elements lose focus when wrapped.
-               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                       $( active ).focus();
+                       element.data( dataSpace + "placeholder", placeholder );
                }
 
-               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
-
-               // transfer positioning properties to the wrapper
-               if ( element.css( "position" ) === "static" ) {
-                       wrapper.css({ position: "relative" });
-                       element.css({ position: "relative" });
-               } else {
-                       $.extend( props, {
-                               position: element.css( "position" ),
-                               zIndex: element.css( "z-index" )
-                       });
-                       $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
-                               props[ pos ] = element.css( pos );
-                               if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
-                                       props[ pos ] = "auto";
-                               }
-                       });
-                       element.css({
-                               position: "relative",
-                               top: 0,
-                               left: 0,
-                               right: "auto",
-                               bottom: "auto"
-                       });
-               }
-               element.css(size);
+               element.css( {
+                       position: cssPosition,
+                       left: position.left,
+                       top: position.top
+               } );
 
-               return wrapper.css( props ).show();
+               return placeholder;
        },
 
-       removeWrapper: function( element ) {
-               var active = document.activeElement;
-
-               if ( element.parent().is( ".ui-effects-wrapper" ) ) {
-                       element.parent().replaceWith( element );
+       removePlaceholder: function( element ) {
+               var dataKey = dataSpace + "placeholder",
+                               placeholder = element.data( dataKey );
 
-                       // Fixes #7595 - Elements lose focus when wrapped.
-                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                               $( active ).focus();
-                       }
+               if ( placeholder ) {
+                       placeholder.remove();
+                       element.removeData( dataKey );
                }
+       },
 
-               return element;
+       // Removes a placeholder if it exists and restores
+       // properties that were modified during placeholder creation
+       cleanUp: function( element ) {
+               $.effects.restoreStyle( element );
+               $.effects.removePlaceholder( element );
        },
 
        setTransition: function( element, list, factor, value ) {
@@ -6825,49 +8308,49 @@ $.extend( $.effects, {
                        if ( unit[ 0 ] > 0 ) {
                                value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
                        }
-               });
+               } );
                return value;
        }
-});
+} );
 
-// return an effect options object for the given parameters:
+// Return an effect options object for the given parameters:
 function _normalizeArguments( effect, options, speed, callback ) {
 
-       // allow passing all options as the first parameter
+       // Allow passing all options as the first parameter
        if ( $.isPlainObject( effect ) ) {
                options = effect;
                effect = effect.effect;
        }
 
-       // convert to an object
+       // Convert to an object
        effect = { effect: effect };
 
-       // catch (effect, null, ...)
+       // Catch (effect, null, ...)
        if ( options == null ) {
                options = {};
        }
 
-       // catch (effect, callback)
+       // Catch (effect, callback)
        if ( $.isFunction( options ) ) {
                callback = options;
                speed = null;
                options = {};
        }
 
-       // catch (effect, speed, ?)
+       // Catch (effect, speed, ?)
        if ( typeof options === "number" || $.fx.speeds[ options ] ) {
                callback = speed;
                speed = options;
                options = {};
        }
 
-       // catch (effect, options, callback)
+       // Catch (effect, options, callback)
        if ( $.isFunction( speed ) ) {
                callback = speed;
                speed = null;
        }
 
-       // add options to effect
+       // Add options to effect
        if ( options ) {
                $.extend( effect, options );
        }
@@ -6884,6 +8367,7 @@ function _normalizeArguments( effect, options, speed, callback ) {
 }
 
 function standardAnimationOption( option ) {
+
        // Valid standard speeds (nothing, number, named speed)
        if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
                return true;
@@ -6908,54 +8392,116 @@ function standardAnimationOption( option ) {
        return false;
 }
 
-$.fn.extend({
+$.fn.extend( {
        effect: function( /* effect, options, speed, callback */ ) {
                var args = _normalizeArguments.apply( this, arguments ),
-                       mode = args.mode,
+                       effectMethod = $.effects.effect[ args.effect ],
+                       defaultMode = effectMethod.mode,
                        queue = args.queue,
-                       effectMethod = $.effects.effect[ args.effect ];
+                       queueName = queue || "fx",
+                       complete = args.complete,
+                       mode = args.mode,
+                       modes = [],
+                       prefilter = function( next ) {
+                               var el = $( this ),
+                                       normalizedMode = $.effects.mode( el, mode ) || defaultMode;
+
+                               // Sentinel for duck-punching the :animated psuedo-selector
+                               el.data( dataSpaceAnimated, true );
+
+                               // Save effect mode for later use,
+                               // we can't just call $.effects.mode again later,
+                               // as the .show() below destroys the initial state
+                               modes.push( normalizedMode );
+
+                               // See $.uiBackCompat inside of run() for removal of defaultMode in 1.13
+                               if ( defaultMode && ( normalizedMode === "show" ||
+                                               ( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
+                                       el.show();
+                               }
+
+                               if ( !defaultMode || normalizedMode !== "none" ) {
+                                       $.effects.saveStyle( el );
+                               }
+
+                               if ( $.isFunction( next ) ) {
+                                       next();
+                               }
+                       };
 
                if ( $.fx.off || !effectMethod ) {
-                       // delegate to the original method (e.g., .show()) if possible
+
+                       // Delegate to the original method (e.g., .show()) if possible
                        if ( mode ) {
-                               return this[ mode ]( args.duration, args.complete );
+                               return this[ mode ]( args.duration, complete );
                        } else {
                                return this.each( function() {
-                                       if ( args.complete ) {
-                                               args.complete.call( this );
+                                       if ( complete ) {
+                                               complete.call( this );
                                        }
-                               });
+                               } );
                        }
                }
 
                function run( next ) {
-                       var elem = $( this ),
-                               complete = args.complete,
-                               mode = args.mode;
+                       var elem = $( this );
+
+                       function cleanup() {
+                               elem.removeData( dataSpaceAnimated );
+
+                               $.effects.cleanUp( elem );
+
+                               if ( args.mode === "hide" ) {
+                                       elem.hide();
+                               }
+
+                               done();
+                       }
 
                        function done() {
                                if ( $.isFunction( complete ) ) {
-                                       complete.call( elem[0] );
+                                       complete.call( elem[ 0 ] );
                                }
+
                                if ( $.isFunction( next ) ) {
                                        next();
                                }
                        }
 
-                       // If the element already has the correct final state, delegate to
-                       // the core methods so the internal tracking of "olddisplay" works.
-                       if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-                               elem[ mode ]();
-                               done();
+                       // Override mode option on a per element basis,
+                       // as toggle can be either show or hide depending on element state
+                       args.mode = modes.shift();
+
+                       if ( $.uiBackCompat !== false && !defaultMode ) {
+                               if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
+
+                                       // Call the core method to track "olddisplay" properly
+                                       elem[ mode ]();
+                                       done();
+                               } else {
+                                       effectMethod.call( elem[ 0 ], args, done );
+                               }
                        } else {
-                               effectMethod.call( elem[0], args, done );
+                               if ( args.mode === "none" ) {
+
+                                       // Call the core method to track "olddisplay" properly
+                                       elem[ mode ]();
+                                       done();
+                               } else {
+                                       effectMethod.call( elem[ 0 ], args, cleanup );
+                               }
                        }
                }
 
-               return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
+               // Run prefilter on all elements first to ensure that
+               // any showing or hiding happens before placeholder creation,
+               // which ensures that any layout changes are correctly captured.
+               return queue === false ?
+                       this.each( prefilter ).each( run ) :
+                       this.queue( queueName, prefilter ).queue( queueName, run );
        },
 
-       show: (function( orig ) {
+       show: ( function( orig ) {
                return function( option ) {
                        if ( standardAnimationOption( option ) ) {
                                return orig.apply( this, arguments );
@@ -6965,9 +8511,9 @@ $.fn.extend({
                                return this.effect.call( this, args );
                        }
                };
-       })( $.fn.show ),
+       } )( $.fn.show ),
 
-       hide: (function( orig ) {
+       hide: ( function( orig ) {
                return function( option ) {
                        if ( standardAnimationOption( option ) ) {
                                return orig.apply( this, arguments );
@@ -6977,9 +8523,9 @@ $.fn.extend({
                                return this.effect.call( this, args );
                        }
                };
-       })( $.fn.hide ),
+       } )( $.fn.hide ),
 
-       toggle: (function( orig ) {
+       toggle: ( function( orig ) {
                return function( option ) {
                        if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
                                return orig.apply( this, arguments );
@@ -6989,10 +8535,9 @@ $.fn.extend({
                                return this.effect.call( this, args );
                        }
                };
-       })( $.fn.toggle ),
+       } )( $.fn.toggle ),
 
-       // helper functions
-       cssUnit: function(key) {
+       cssUnit: function( key ) {
                var style = this.css( key ),
                        val = [];
 
@@ -7000,20 +8545,92 @@ $.fn.extend({
                        if ( style.indexOf( unit ) > 0 ) {
                                val = [ parseFloat( style ), unit ];
                        }
-               });
+               } );
                return val;
+       },
+
+       cssClip: function( clipObj ) {
+               if ( clipObj ) {
+                       return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
+                               clipObj.bottom + "px " + clipObj.left + "px)" );
+               }
+               return parseClip( this.css( "clip" ), this );
+       },
+
+       transfer: function( options, done ) {
+               var element = $( this ),
+                       target = $( options.to ),
+                       targetFixed = target.css( "position" ) === "fixed",
+                       body = $( "body" ),
+                       fixTop = targetFixed ? body.scrollTop() : 0,
+                       fixLeft = targetFixed ? body.scrollLeft() : 0,
+                       endPosition = target.offset(),
+                       animation = {
+                               top: endPosition.top - fixTop,
+                               left: endPosition.left - fixLeft,
+                               height: target.innerHeight(),
+                               width: target.innerWidth()
+                       },
+                       startPosition = element.offset(),
+                       transfer = $( "<div class='ui-effects-transfer'></div>" )
+                               .appendTo( "body" )
+                               .addClass( options.className )
+                               .css( {
+                                       top: startPosition.top - fixTop,
+                                       left: startPosition.left - fixLeft,
+                                       height: element.innerHeight(),
+                                       width: element.innerWidth(),
+                                       position: targetFixed ? "fixed" : "absolute"
+                               } )
+                               .animate( animation, options.duration, options.easing, function() {
+                                       transfer.remove();
+                                       if ( $.isFunction( done ) ) {
+                                               done();
+                                       }
+                               } );
+       }
+} );
+
+function parseClip( str, element ) {
+               var outerWidth = element.outerWidth(),
+                       outerHeight = element.outerHeight(),
+                       clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
+                       values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
+
+               return {
+                       top: parseFloat( values[ 1 ] ) || 0,
+                       right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
+                       bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
+                       left: parseFloat( values[ 4 ] ) || 0
+               };
+}
+
+$.fx.step.clip = function( fx ) {
+       if ( !fx.clipInit ) {
+               fx.start = $( fx.elem ).cssClip();
+               if ( typeof fx.end === "string" ) {
+                       fx.end = parseClip( fx.end, fx.elem );
+               }
+               fx.clipInit = true;
        }
-});
 
-})();
+       $( fx.elem ).cssClip( {
+               top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
+               right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
+               bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
+               left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
+       } );
+};
+
+} )();
 
 /******************************************************************************/
 /*********************************** EASING ***********************************/
 /******************************************************************************/
 
-(function() {
+( function() {
 
-// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
+// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
 
 var baseEasings = {};
 
@@ -7021,7 +8638,7 @@ $.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
        baseEasings[ name ] = function( p ) {
                return Math.pow( p, i + 2 );
        };
-});
+} );
 
 $.extend( baseEasings, {
        Sine: function( p ) {
@@ -7032,7 +8649,7 @@ $.extend( baseEasings, {
        },
        Elastic: function( p ) {
                return p === 0 || p === 1 ? p :
-                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+                       -Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
        },
        Back: function( p ) {
                return p * p * ( 3 * p - 2 );
@@ -7044,7 +8661,7 @@ $.extend( baseEasings, {
                while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
                return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        }
-});
+} );
 
 $.each( baseEasings, function( name, easeIn ) {
        $.easing[ "easeIn" + name ] = easeIn;
@@ -7056,168 +8673,146 @@ $.each( baseEasings, function( name, easeIn ) {
                        easeIn( p * 2 ) / 2 :
                        1 - easeIn( p * -2 + 2 ) / 2;
        };
-});
+} );
 
-})();
+} )();
 
 var effect = $.effects;
 
 
 /*!
- * jQuery UI Effects Blind 1.11.4
+ * jQuery UI Effects Blind 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/blind-effect/
  */
 
+//>>label: Blind Effect
+//>>group: Effects
+//>>description: Blinds the element.
+//>>docs: http://api.jqueryui.com/blind-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectBlind = $.effects.effect.blind = function( o, done ) {
-       // Create element
-       var el = $( this ),
-               rvertical = /up|down|vertical/,
-               rpositivemotion = /up|left|vertical|horizontal/,
-               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-               mode = $.effects.setMode( el, o.mode || "hide" ),
-               direction = o.direction || "up",
-               vertical = rvertical.test( direction ),
-               ref = vertical ? "height" : "width",
-               ref2 = vertical ? "top" : "left",
-               motion = rpositivemotion.test( direction ),
-               animation = {},
-               show = mode === "show",
-               wrapper, distance, margin;
 
-       // if already wrapped, the wrapper's properties are my property. #6245
-       if ( el.parent().is( ".ui-effects-wrapper" ) ) {
-               $.effects.save( el.parent(), props );
-       } else {
-               $.effects.save( el, props );
-       }
-       el.show();
-       wrapper = $.effects.createWrapper( el ).css({
-               overflow: "hidden"
-       });
-
-       distance = wrapper[ ref ]();
-       margin = parseFloat( wrapper.css( ref2 ) ) || 0;
-
-       animation[ ref ] = show ? distance : 0;
-       if ( !motion ) {
-               el
-                       .css( vertical ? "bottom" : "right", 0 )
-                       .css( vertical ? "top" : "left", "auto" )
-                       .css({ position: "absolute" });
-
-               animation[ ref2 ] = show ? margin : distance + margin;
-       }
 
-       // start at 0 if we are showing
-       if ( show ) {
-               wrapper.css( ref, 0 );
-               if ( !motion ) {
-                       wrapper.css( ref2, margin + distance );
+var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
+       var map = {
+                       up: [ "bottom", "top" ],
+                       vertical: [ "bottom", "top" ],
+                       down: [ "top", "bottom" ],
+                       left: [ "right", "left" ],
+                       horizontal: [ "right", "left" ],
+                       right: [ "left", "right" ]
+               },
+               element = $( this ),
+               direction = options.direction || "up",
+               start = element.cssClip(),
+               animate = { clip: $.extend( {}, start ) },
+               placeholder = $.effects.createPlaceholder( element );
+
+       animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
+
+       if ( options.mode === "show" ) {
+               element.cssClip( animate.clip );
+               if ( placeholder ) {
+                       placeholder.css( $.effects.clipToBox( animate ) );
                }
+
+               animate.clip = start;
        }
 
-       // Animate
-       wrapper.animate( animation, {
-               duration: o.duration,
-               easing: o.easing,
+       if ( placeholder ) {
+               placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
+       }
+
+       element.animate( animate, {
                queue: false,
-               complete: function() {
-                       if ( mode === "hide" ) {
-                               el.hide();
-                       }
-                       $.effects.restore( el, props );
-                       $.effects.removeWrapper( el );
-                       done();
-               }
-       });
-};
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
+} );
 
 
 /*!
- * jQuery UI Effects Bounce 1.11.4
+ * jQuery UI Effects Bounce 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/bounce-effect/
  */
 
+//>>label: Bounce Effect
+//>>group: Effects
+//>>description: Bounces an element horizontally or vertically n times.
+//>>docs: http://api.jqueryui.com/bounce-effect/
+//>>demos: http://jqueryui.com/effect/
+
 
-var effectBounce = $.effects.effect.bounce = function( o, done ) {
-       var el = $( this ),
-               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
 
-               // defaults:
-               mode = $.effects.setMode( el, o.mode || "effect" ),
+var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
+       var upAnim, downAnim, refValue,
+               element = $( this ),
+
+               // Defaults:
+               mode = options.mode,
                hide = mode === "hide",
                show = mode === "show",
-               direction = o.direction || "up",
-               distance = o.distance,
-               times = o.times || 5,
+               direction = options.direction || "up",
+               distance = options.distance,
+               times = options.times || 5,
 
-               // number of internal animations
+               // Number of internal animations
                anims = times * 2 + ( show || hide ? 1 : 0 ),
-               speed = o.duration / anims,
-               easing = o.easing,
+               speed = options.duration / anims,
+               easing = options.easing,
 
-               // utility:
+               // Utility:
                ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
                motion = ( direction === "up" || direction === "left" ),
-               i,
-               upAnim,
-               downAnim,
+               i = 0,
 
-               // we will need to re-assemble the queue to stack our animations in place
-               queue = el.queue(),
-               queuelen = queue.length;
+               queuelen = element.queue().length;
 
-       // Avoid touching opacity to prevent clearType and PNG issues in IE
-       if ( show || hide ) {
-               props.push( "opacity" );
-       }
+       $.effects.createPlaceholder( element );
 
-       $.effects.save( el, props );
-       el.show();
-       $.effects.createWrapper( el ); // Create Wrapper
+       refValue = element.css( ref );
 
-       // default distance for the BIGGEST bounce is the outer Distance / 3
+       // Default distance for the BIGGEST bounce is the outer Distance / 3
        if ( !distance ) {
-               distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
+               distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
        }
 
        if ( show ) {
                downAnim = { opacity: 1 };
-               downAnim[ ref ] = 0;
+               downAnim[ ref ] = refValue;
 
-               // if we are showing, force opacity 0 and set the initial position
+               // If we are showing, force opacity 0 and set the initial position
                // then do the "first" animation
-               el.css( "opacity", 0 )
+               element
+                       .css( "opacity", 0 )
                        .css( ref, motion ? -distance * 2 : distance * 2 )
                        .animate( downAnim, speed, easing );
        }
 
-       // start at the smallest distance if we are hiding
+       // Start at the smallest distance if we are hiding
        if ( hide ) {
                distance = distance / Math.pow( 2, times - 1 );
        }
 
        downAnim = {};
-       downAnim[ ref ] = 0;
+       downAnim[ ref ] = refValue;
+
        // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
-       for ( i = 0; i < times; i++ ) {
+       for ( ; i < times; i++ ) {
                upAnim = {};
                upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
 
-               el.animate( upAnim, speed, easing )
+               element
+                       .animate( upAnim, speed, easing )
                        .animate( downAnim, speed, easing );
 
                distance = hide ? distance * 2 : distance / 2;
@@ -7228,186 +8823,158 @@ var effectBounce = $.effects.effect.bounce = function( o, done ) {
                upAnim = { opacity: 0 };
                upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
 
-               el.animate( upAnim, speed, easing );
+               element.animate( upAnim, speed, easing );
        }
 
-       el.queue(function() {
-               if ( hide ) {
-                       el.hide();
-               }
-               $.effects.restore( el, props );
-               $.effects.removeWrapper( el );
-               done();
-       });
-
-       // inject all the animations we just queued to be first in line (after "inprogress")
-       if ( queuelen > 1) {
-               queue.splice.apply( queue,
-                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
-       }
-       el.dequeue();
+       element.queue( done );
 
-};
+       $.effects.unshift( element, queuelen, anims + 1 );
+} );
 
 
 /*!
- * jQuery UI Effects Clip 1.11.4
+ * jQuery UI Effects Clip 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/clip-effect/
  */
 
+//>>label: Clip Effect
+//>>group: Effects
+//>>description: Clips the element on and off like an old TV.
+//>>docs: http://api.jqueryui.com/clip-effect/
+//>>demos: http://jqueryui.com/effect/
+
+
+
+var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
+       var start,
+               animate = {},
+               element = $( this ),
+               direction = options.direction || "vertical",
+               both = direction === "both",
+               horizontal = both || direction === "horizontal",
+               vertical = both || direction === "vertical";
+
+       start = element.cssClip();
+       animate.clip = {
+               top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
+               right: horizontal ? ( start.right - start.left ) / 2 : start.right,
+               bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
+               left: horizontal ? ( start.right - start.left ) / 2 : start.left
+       };
 
-var effectClip = $.effects.effect.clip = function( o, done ) {
-       // Create element
-       var el = $( this ),
-               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-               mode = $.effects.setMode( el, o.mode || "hide" ),
-               show = mode === "show",
-               direction = o.direction || "vertical",
-               vert = direction === "vertical",
-               size = vert ? "height" : "width",
-               position = vert ? "top" : "left",
-               animation = {},
-               wrapper, animate, distance;
-
-       // Save & Show
-       $.effects.save( el, props );
-       el.show();
-
-       // Create Wrapper
-       wrapper = $.effects.createWrapper( el ).css({
-               overflow: "hidden"
-       });
-       animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
-       distance = animate[ size ]();
+       $.effects.createPlaceholder( element );
 
-       // Shift
-       if ( show ) {
-               animate.css( size, 0 );
-               animate.css( position, distance / 2 );
+       if ( options.mode === "show" ) {
+               element.cssClip( animate.clip );
+               animate.clip = start;
        }
 
-       // Create Animation Object:
-       animation[ size ] = show ? distance : 0;
-       animation[ position ] = show ? 0 : distance / 2;
-
-       // Animate
-       animate.animate( animation, {
+       element.animate( animate, {
                queue: false,
-               duration: o.duration,
-               easing: o.easing,
-               complete: function() {
-                       if ( !show ) {
-                               el.hide();
-                       }
-                       $.effects.restore( el, props );
-                       $.effects.removeWrapper( el );
-                       done();
-               }
-       });
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
 
-};
+} );
 
 
 /*!
- * jQuery UI Effects Drop 1.11.4
+ * jQuery UI Effects Drop 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/drop-effect/
  */
 
+//>>label: Drop Effect
+//>>group: Effects
+//>>description: Moves an element in one direction and hides it at the same time.
+//>>docs: http://api.jqueryui.com/drop-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectDrop = $.effects.effect.drop = function( o, done ) {
 
-       var el = $( this ),
-               props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
-               mode = $.effects.setMode( el, o.mode || "hide" ),
+
+var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
+
+       var distance,
+               element = $( this ),
+               mode = options.mode,
                show = mode === "show",
-               direction = o.direction || "left",
+               direction = options.direction || "left",
                ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-               motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
+               motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
+               oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
                animation = {
-                       opacity: show ? 1 : 0
-               },
-               distance;
+                       opacity: 0
+               };
+
+       $.effects.createPlaceholder( element );
 
-       // Adjust
-       $.effects.save( el, props );
-       el.show();
-       $.effects.createWrapper( el );
+       distance = options.distance ||
+               element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
 
-       distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
+       animation[ ref ] = motion + distance;
 
        if ( show ) {
-               el
-                       .css( "opacity", 0 )
-                       .css( ref, motion === "pos" ? -distance : distance );
-       }
+               element.css( animation );
 
-       // Animation
-       animation[ ref ] = ( show ?
-               ( motion === "pos" ? "+=" : "-=" ) :
-               ( motion === "pos" ? "-=" : "+=" ) ) +
-               distance;
+               animation[ ref ] = oppositeMotion + distance;
+               animation.opacity = 1;
+       }
 
        // Animate
-       el.animate( animation, {
+       element.animate( animation, {
                queue: false,
-               duration: o.duration,
-               easing: o.easing,
-               complete: function() {
-                       if ( mode === "hide" ) {
-                               el.hide();
-                       }
-                       $.effects.restore( el, props );
-                       $.effects.removeWrapper( el );
-                       done();
-               }
-       });
-};
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
+} );
 
 
 /*!
- * jQuery UI Effects Explode 1.11.4
+ * jQuery UI Effects Explode 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/explode-effect/
  */
 
+//>>label: Explode Effect
+//>>group: Effects
+// jscs:disable maximumLineLength
+//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
+// jscs:enable maximumLineLength
+//>>docs: http://api.jqueryui.com/explode-effect/
+//>>demos: http://jqueryui.com/effect/
+
 
-var effectExplode = $.effects.effect.explode = function( o, done ) {
 
-       var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
+var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
+
+       var i, j, left, top, mx, my,
+               rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
                cells = rows,
-               el = $( this ),
-               mode = $.effects.setMode( el, o.mode || "hide" ),
+               element = $( this ),
+               mode = options.mode,
                show = mode === "show",
 
-               // show and then visibility:hidden the element before calculating offset
-               offset = el.show().css( "visibility", "hidden" ).offset(),
-
-               // width and height of a piece
-               width = Math.ceil( el.outerWidth() / cells ),
-               height = Math.ceil( el.outerHeight() / rows ),
-               pieces = [],
+               // Show and then visibility:hidden the element before calculating offset
+               offset = element.show().css( "visibility", "hidden" ).offset(),
 
-               // loop
-               i, j, left, top, mx, my;
+               // Width and height of a piece
+               width = Math.ceil( element.outerWidth() / cells ),
+               height = Math.ceil( element.outerHeight() / rows ),
+               pieces = [];
 
-       // children animate complete:
+       // Children animate complete:
        function childComplete() {
                pieces.push( this );
                if ( pieces.length === rows * cells ) {
@@ -7415,277 +8982,266 @@ var effectExplode = $.effects.effect.explode = function( o, done ) {
                }
        }
 
-       // clone the element for each row and cell.
-       for ( i = 0; i < rows ; i++ ) { // ===>
+       // Clone the element for each row and cell.
+       for ( i = 0; i < rows; i++ ) { // ===>
                top = offset.top + i * height;
-               my = i - ( rows - 1 ) / 2 ;
+               my = i - ( rows - 1 ) / 2;
 
-               for ( j = 0; j < cells ; j++ ) { // |||
+               for ( j = 0; j < cells; j++ ) { // |||
                        left = offset.left + j * width;
-                       mx = j - ( cells - 1 ) / 2 ;
+                       mx = j - ( cells - 1 ) / 2;
 
                        // Create a clone of the now hidden main element that will be absolute positioned
                        // within a wrapper div off the -left and -top equal to size of our pieces
-                       el
+                       element
                                .clone()
                                .appendTo( "body" )
                                .wrap( "<div></div>" )
-                               .css({
+                               .css( {
                                        position: "absolute",
                                        visibility: "visible",
                                        left: -j * width,
                                        top: -i * height
-                               })
+                               } )
 
-                       // select the wrapper - make it overflow: hidden and absolute positioned based on
-                       // where the original was located +left and +top equal to the size of pieces
+                               // Select the wrapper - make it overflow: hidden and absolute positioned based on
+                               // where the original was located +left and +top equal to the size of pieces
                                .parent()
-                               .addClass( "ui-effects-explode" )
-                               .css({
-                                       position: "absolute",
-                                       overflow: "hidden",
-                                       width: width,
-                                       height: height,
-                                       left: left + ( show ? mx * width : 0 ),
-                                       top: top + ( show ? my * height : 0 ),
-                                       opacity: show ? 0 : 1
-                               }).animate({
-                                       left: left + ( show ? 0 : mx * width ),
-                                       top: top + ( show ? 0 : my * height ),
-                                       opacity: show ? 1 : 0
-                               }, o.duration || 500, o.easing, childComplete );
+                                       .addClass( "ui-effects-explode" )
+                                       .css( {
+                                               position: "absolute",
+                                               overflow: "hidden",
+                                               width: width,
+                                               height: height,
+                                               left: left + ( show ? mx * width : 0 ),
+                                               top: top + ( show ? my * height : 0 ),
+                                               opacity: show ? 0 : 1
+                                       } )
+                                       .animate( {
+                                               left: left + ( show ? 0 : mx * width ),
+                                               top: top + ( show ? 0 : my * height ),
+                                               opacity: show ? 1 : 0
+                                       }, options.duration || 500, options.easing, childComplete );
                }
        }
 
        function animComplete() {
-               el.css({
+               element.css( {
                        visibility: "visible"
-               });
+               } );
                $( pieces ).remove();
-               if ( !show ) {
-                       el.hide();
-               }
                done();
        }
-};
+} );
 
 
 /*!
- * jQuery UI Effects Fade 1.11.4
+ * jQuery UI Effects Fade 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/fade-effect/
  */
 
+//>>label: Fade Effect
+//>>group: Effects
+//>>description: Fades the element.
+//>>docs: http://api.jqueryui.com/fade-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectFade = $.effects.effect.fade = function( o, done ) {
-       var el = $( this ),
-               mode = $.effects.setMode( el, o.mode || "toggle" );
 
-       el.animate({
-               opacity: mode
-       }, {
-               queue: false,
-               duration: o.duration,
-               easing: o.easing,
-               complete: done
-       });
-};
+
+var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
+       var show = options.mode === "show";
+
+       $( this )
+               .css( "opacity", show ? 0 : 1 )
+               .animate( {
+                       opacity: show ? 1 : 0
+               }, {
+                       queue: false,
+                       duration: options.duration,
+                       easing: options.easing,
+                       complete: done
+               } );
+} );
 
 
 /*!
- * jQuery UI Effects Fold 1.11.4
+ * jQuery UI Effects Fold 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/fold-effect/
  */
 
+//>>label: Fold Effect
+//>>group: Effects
+//>>description: Folds an element first horizontally and then vertically.
+//>>docs: http://api.jqueryui.com/fold-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectFold = $.effects.effect.fold = function( o, done ) {
+
+
+var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
 
        // Create element
-       var el = $( this ),
-               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-               mode = $.effects.setMode( el, o.mode || "hide" ),
+       var element = $( this ),
+               mode = options.mode,
                show = mode === "show",
                hide = mode === "hide",
-               size = o.size || 15,
+               size = options.size || 15,
                percent = /([0-9]+)%/.exec( size ),
-               horizFirst = !!o.horizFirst,
-               widthFirst = show !== horizFirst,
-               ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
-               duration = o.duration / 2,
-               wrapper, distance,
-               animation1 = {},
-               animation2 = {};
+               horizFirst = !!options.horizFirst,
+               ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
+               duration = options.duration / 2,
 
-       $.effects.save( el, props );
-       el.show();
+               placeholder = $.effects.createPlaceholder( element ),
 
-       // Create Wrapper
-       wrapper = $.effects.createWrapper( el ).css({
-               overflow: "hidden"
-       });
-       distance = widthFirst ?
-               [ wrapper.width(), wrapper.height() ] :
-               [ wrapper.height(), wrapper.width() ];
+               start = element.cssClip(),
+               animation1 = { clip: $.extend( {}, start ) },
+               animation2 = { clip: $.extend( {}, start ) },
+
+               distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
+
+               queuelen = element.queue().length;
 
        if ( percent ) {
                size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
        }
+       animation1.clip[ ref[ 0 ] ] = size;
+       animation2.clip[ ref[ 0 ] ] = size;
+       animation2.clip[ ref[ 1 ] ] = 0;
+
        if ( show ) {
-               wrapper.css( horizFirst ? {
-                       height: 0,
-                       width: size
-               } : {
-                       height: size,
-                       width: 0
-               });
-       }
+               element.cssClip( animation2.clip );
+               if ( placeholder ) {
+                       placeholder.css( $.effects.clipToBox( animation2 ) );
+               }
 
-       // Animation
-       animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
-       animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
+               animation2.clip = start;
+       }
 
        // Animate
-       wrapper
-               .animate( animation1, duration, o.easing )
-               .animate( animation2, duration, o.easing, function() {
-                       if ( hide ) {
-                               el.hide();
-                       }
-                       $.effects.restore( el, props );
-                       $.effects.removeWrapper( el );
-                       done();
-               });
+       element
+               .queue( function( next ) {
+                       if ( placeholder ) {
+                               placeholder
+                                       .animate( $.effects.clipToBox( animation1 ), duration, options.easing )
+                                       .animate( $.effects.clipToBox( animation2 ), duration, options.easing );
+                       }
 
-};
+                       next();
+               } )
+               .animate( animation1, duration, options.easing )
+               .animate( animation2, duration, options.easing )
+               .queue( done );
+
+       $.effects.unshift( element, queuelen, 4 );
+} );
 
 
 /*!
- * jQuery UI Effects Highlight 1.11.4
+ * jQuery UI Effects Highlight 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/highlight-effect/
  */
 
+//>>label: Highlight Effect
+//>>group: Effects
+//>>description: Highlights the background of an element in a defined color for a custom duration.
+//>>docs: http://api.jqueryui.com/highlight-effect/
+//>>demos: http://jqueryui.com/effect/
+
 
-var effectHighlight = $.effects.effect.highlight = function( o, done ) {
-       var elem = $( this ),
-               props = [ "backgroundImage", "backgroundColor", "opacity" ],
-               mode = $.effects.setMode( elem, o.mode || "show" ),
+
+var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
+       var element = $( this ),
                animation = {
-                       backgroundColor: elem.css( "backgroundColor" )
+                       backgroundColor: element.css( "backgroundColor" )
                };
 
-       if (mode === "hide") {
+       if ( options.mode === "hide" ) {
                animation.opacity = 0;
        }
 
-       $.effects.save( elem, props );
+       $.effects.saveStyle( element );
 
-       elem
-               .show()
-               .css({
+       element
+               .css( {
                        backgroundImage: "none",
-                       backgroundColor: o.color || "#ffff99"
-               })
+                       backgroundColor: options.color || "#ffff99"
+               } )
                .animate( animation, {
                        queue: false,
-                       duration: o.duration,
-                       easing: o.easing,
-                       complete: function() {
-                               if ( mode === "hide" ) {
-                                       elem.hide();
-                               }
-                               $.effects.restore( elem, props );
-                               done();
-                       }
-               });
-};
+                       duration: options.duration,
+                       easing: options.easing,
+                       complete: done
+               } );
+} );
 
 
 /*!
- * jQuery UI Effects Size 1.11.4
+ * jQuery UI Effects Size 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/size-effect/
  */
 
+//>>label: Size Effect
+//>>group: Effects
+//>>description: Resize an element to a specified width and height.
+//>>docs: http://api.jqueryui.com/size-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectSize = $.effects.effect.size = function( o, done ) {
 
-       // Create element
-       var original, baseline, factor,
-               el = $( this ),
-               props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
 
-               // Always restore
-               props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
+var effectsEffectSize = $.effects.define( "size", function( options, done ) {
+
+       // Create element
+       var baseline, factor, temp,
+               element = $( this ),
 
                // Copy for children
-               props2 = [ "width", "height", "overflow" ],
                cProps = [ "fontSize" ],
                vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
                hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
 
                // Set options
-               mode = $.effects.setMode( el, o.mode || "effect" ),
-               restore = o.restore || mode !== "effect",
-               scale = o.scale || "both",
-               origin = o.origin || [ "middle", "center" ],
-               position = el.css( "position" ),
-               props = restore ? props0 : props1,
-               zero = {
-                       height: 0,
-                       width: 0,
-                       outerHeight: 0,
-                       outerWidth: 0
-               };
+               mode = options.mode,
+               restore = mode !== "effect",
+               scale = options.scale || "both",
+               origin = options.origin || [ "middle", "center" ],
+               position = element.css( "position" ),
+               pos = element.position(),
+               original = $.effects.scaledDimensions( element ),
+               from = options.from || original,
+               to = options.to || $.effects.scaledDimensions( element, 0 );
+
+       $.effects.createPlaceholder( element );
 
        if ( mode === "show" ) {
-               el.show();
-       }
-       original = {
-               height: el.height(),
-               width: el.width(),
-               outerHeight: el.outerHeight(),
-               outerWidth: el.outerWidth()
-       };
-
-       if ( o.mode === "toggle" && mode === "show" ) {
-               el.from = o.to || zero;
-               el.to = o.from || original;
-       } else {
-               el.from = o.from || ( mode === "show" ? zero : original );
-               el.to = o.to || ( mode === "hide" ? zero : original );
+               temp = from;
+               from = to;
+               to = temp;
        }
 
        // Set scaling factor
        factor = {
                from: {
-                       y: el.from.height / original.height,
-                       x: el.from.width / original.width
+                       y: from.height / original.height,
+                       x: from.width / original.width
                },
                to: {
-                       y: el.to.height / original.height,
-                       x: el.to.width / original.width
+                       y: to.height / original.height,
+                       x: to.width / original.width
                }
        };
 
@@ -7694,16 +9250,14 @@ var effectSize = $.effects.effect.size = function( o, done ) {
 
                // Vertical props scaling
                if ( factor.from.y !== factor.to.y ) {
-                       props = props.concat( vProps );
-                       el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
-                       el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
+                       from = $.effects.setTransition( element, vProps, factor.from.y, from );
+                       to = $.effects.setTransition( element, vProps, factor.to.y, to );
                }
 
                // Horizontal props scaling
                if ( factor.from.x !== factor.to.x ) {
-                       props = props.concat( hProps );
-                       el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
-                       el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
+                       from = $.effects.setTransition( element, hProps, factor.from.x, from );
+                       to = $.effects.setTransition( element, hProps, factor.to.x, to );
                }
        }
 
@@ -7712,348 +9266,256 @@ var effectSize = $.effects.effect.size = function( o, done ) {
 
                // Vertical props scaling
                if ( factor.from.y !== factor.to.y ) {
-                       props = props.concat( cProps ).concat( props2 );
-                       el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
-                       el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
+                       from = $.effects.setTransition( element, cProps, factor.from.y, from );
+                       to = $.effects.setTransition( element, cProps, factor.to.y, to );
                }
        }
 
-       $.effects.save( el, props );
-       el.show();
-       $.effects.createWrapper( el );
-       el.css( "overflow", "hidden" ).css( el.from );
-
-       // Adjust
-       if (origin) { // Calculate baseline shifts
+       // Adjust the position properties based on the provided origin points
+       if ( origin ) {
                baseline = $.effects.getBaseline( origin, original );
-               el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
-               el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
-               el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
-               el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
+               from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
+               from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
+               to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
+               to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
        }
-       el.css( el.from ); // set top & left
+       element.css( from );
 
-       // Animate
-       if ( scale === "content" || scale === "both" ) { // Scale the children
+       // Animate the children if desired
+       if ( scale === "content" || scale === "both" ) {
 
-               // Add margins/font-size
-               vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
-               hProps = hProps.concat([ "marginLeft", "marginRight" ]);
-               props2 = props0.concat(vProps).concat(hProps);
+               vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
+               hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
 
-               el.find( "*[width]" ).each( function() {
+               // Only animate children with width attributes specified
+               // TODO: is this right? should we include anything with css width specified as well
+               element.find( "*[width]" ).each( function() {
                        var child = $( this ),
-                               c_original = {
-                                       height: child.height(),
-                                       width: child.width(),
-                                       outerHeight: child.outerHeight(),
-                                       outerWidth: child.outerWidth()
+                               childOriginal = $.effects.scaledDimensions( child ),
+                               childFrom = {
+                                       height: childOriginal.height * factor.from.y,
+                                       width: childOriginal.width * factor.from.x,
+                                       outerHeight: childOriginal.outerHeight * factor.from.y,
+                                       outerWidth: childOriginal.outerWidth * factor.from.x
+                               },
+                               childTo = {
+                                       height: childOriginal.height * factor.to.y,
+                                       width: childOriginal.width * factor.to.x,
+                                       outerHeight: childOriginal.height * factor.to.y,
+                                       outerWidth: childOriginal.width * factor.to.x
                                };
-                       if (restore) {
-                               $.effects.save(child, props2);
-                       }
-
-                       child.from = {
-                               height: c_original.height * factor.from.y,
-                               width: c_original.width * factor.from.x,
-                               outerHeight: c_original.outerHeight * factor.from.y,
-                               outerWidth: c_original.outerWidth * factor.from.x
-                       };
-                       child.to = {
-                               height: c_original.height * factor.to.y,
-                               width: c_original.width * factor.to.x,
-                               outerHeight: c_original.height * factor.to.y,
-                               outerWidth: c_original.width * factor.to.x
-                       };
 
                        // Vertical props scaling
                        if ( factor.from.y !== factor.to.y ) {
-                               child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
-                               child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
+                               childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
+                               childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
                        }
 
                        // Horizontal props scaling
                        if ( factor.from.x !== factor.to.x ) {
-                               child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
-                               child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
+                               childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
+                               childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
+                       }
+
+                       if ( restore ) {
+                               $.effects.saveStyle( child );
                        }
 
                        // Animate children
-                       child.css( child.from );
-                       child.animate( child.to, o.duration, o.easing, function() {
+                       child.css( childFrom );
+                       child.animate( childTo, options.duration, options.easing, function() {
 
                                // Restore children
                                if ( restore ) {
-                                       $.effects.restore( child, props2 );
+                                       $.effects.restoreStyle( child );
                                }
-                       });
-               });
+                       } );
+               } );
        }
 
        // Animate
-       el.animate( el.to, {
+       element.animate( to, {
                queue: false,
-               duration: o.duration,
-               easing: o.easing,
+               duration: options.duration,
+               easing: options.easing,
                complete: function() {
-                       if ( el.to.opacity === 0 ) {
-                               el.css( "opacity", el.from.opacity );
-                       }
-                       if ( mode === "hide" ) {
-                               el.hide();
+
+                       var offset = element.offset();
+
+                       if ( to.opacity === 0 ) {
+                               element.css( "opacity", from.opacity );
                        }
-                       $.effects.restore( el, props );
-                       if ( !restore ) {
 
-                               // we need to calculate our new positioning based on the scaling
-                               if ( position === "static" ) {
-                                       el.css({
-                                               position: "relative",
-                                               top: el.to.top,
-                                               left: el.to.left
-                                       });
-                               } else {
-                                       $.each([ "top", "left" ], function( idx, pos ) {
-                                               el.css( pos, function( _, str ) {
-                                                       var val = parseInt( str, 10 ),
-                                                               toRef = idx ? el.to.left : el.to.top;
-
-                                                       // if original was "auto", recalculate the new value from wrapper
-                                                       if ( str === "auto" ) {
-                                                               return toRef + "px";
-                                                       }
+                       if ( !restore ) {
+                               element
+                                       .css( "position", position === "static" ? "relative" : position )
+                                       .offset( offset );
 
-                                                       return val + toRef + "px";
-                                               });
-                                       });
-                               }
+                               // Need to save style here so that automatic style restoration
+                               // doesn't restore to the original styles from before the animation.
+                               $.effects.saveStyle( element );
                        }
 
-                       $.effects.removeWrapper( el );
                        done();
                }
-       });
+       } );
 
-};
+} );
 
 
 /*!
- * jQuery UI Effects Scale 1.11.4
+ * jQuery UI Effects Scale 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/scale-effect/
  */
 
+//>>label: Scale Effect
+//>>group: Effects
+//>>description: Grows or shrinks an element and its content.
+//>>docs: http://api.jqueryui.com/scale-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectScale = $.effects.effect.scale = function( o, done ) {
 
-       // Create element
-       var el = $( this ),
-               options = $.extend( true, {}, o ),
-               mode = $.effects.setMode( el, o.mode || "effect" ),
-               percent = parseInt( o.percent, 10 ) ||
-                       ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
-               direction = o.direction || "both",
-               origin = o.origin,
-               original = {
-                       height: el.height(),
-                       width: el.width(),
-                       outerHeight: el.outerHeight(),
-                       outerWidth: el.outerWidth()
-               },
-               factor = {
-                       y: direction !== "horizontal" ? (percent / 100) : 1,
-                       x: direction !== "vertical" ? (percent / 100) : 1
-               };
 
-       // We are going to pass this effect to the size effect:
-       options.effect = "size";
-       options.queue = false;
-       options.complete = done;
+var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
 
-       // Set default origin and restore for show/hide
-       if ( mode !== "effect" ) {
-               options.origin = origin || [ "middle", "center" ];
-               options.restore = true;
-       }
+       // Create element
+       var el = $( this ),
+               mode = options.mode,
+               percent = parseInt( options.percent, 10 ) ||
+                       ( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
 
-       options.from = o.from || ( mode === "show" ? {
-               height: 0,
-               width: 0,
-               outerHeight: 0,
-               outerWidth: 0
-       } : original );
-       options.to = {
-               height: original.height * factor.y,
-               width: original.width * factor.x,
-               outerHeight: original.outerHeight * factor.y,
-               outerWidth: original.outerWidth * factor.x
-       };
+               newOptions = $.extend( true, {
+                       from: $.effects.scaledDimensions( el ),
+                       to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
+                       origin: options.origin || [ "middle", "center" ]
+               }, options );
 
        // Fade option to support puff
        if ( options.fade ) {
-               if ( mode === "show" ) {
-                       options.from.opacity = 0;
-                       options.to.opacity = 1;
-               }
-               if ( mode === "hide" ) {
-                       options.from.opacity = 1;
-                       options.to.opacity = 0;
-               }
+               newOptions.from.opacity = 1;
+               newOptions.to.opacity = 0;
        }
 
-       // Animate
-       el.effect( options );
-
-};
+       $.effects.effect.size.call( this, newOptions, done );
+} );
 
 
 /*!
- * jQuery UI Effects Puff 1.11.4
+ * jQuery UI Effects Puff 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/puff-effect/
  */
 
+//>>label: Puff Effect
+//>>group: Effects
+//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
+//>>docs: http://api.jqueryui.com/puff-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectPuff = $.effects.effect.puff = function( o, done ) {
-       var elem = $( this ),
-               mode = $.effects.setMode( elem, o.mode || "hide" ),
-               hide = mode === "hide",
-               percent = parseInt( o.percent, 10 ) || 150,
-               factor = percent / 100,
-               original = {
-                       height: elem.height(),
-                       width: elem.width(),
-                       outerHeight: elem.outerHeight(),
-                       outerWidth: elem.outerWidth()
-               };
 
-       $.extend( o, {
-               effect: "scale",
-               queue: false,
+
+var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
+       var newOptions = $.extend( true, {}, options, {
                fade: true,
-               mode: mode,
-               complete: done,
-               percent: hide ? percent : 100,
-               from: hide ?
-                       original :
-                       {
-                               height: original.height * factor,
-                               width: original.width * factor,
-                               outerHeight: original.outerHeight * factor,
-                               outerWidth: original.outerWidth * factor
-                       }
-       });
-
-       elem.effect( o );
-};
+               percent: parseInt( options.percent, 10 ) || 150
+       } );
+
+       $.effects.effect.scale.call( this, newOptions, done );
+} );
 
 
 /*!
- * jQuery UI Effects Pulsate 1.11.4
+ * jQuery UI Effects Pulsate 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/pulsate-effect/
  */
 
+//>>label: Pulsate Effect
+//>>group: Effects
+//>>description: Pulsates an element n times by changing the opacity to zero and back.
+//>>docs: http://api.jqueryui.com/pulsate-effect/
+//>>demos: http://jqueryui.com/effect/
+
+
 
-var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
-       var elem = $( this ),
-               mode = $.effects.setMode( elem, o.mode || "show" ),
+var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
+       var element = $( this ),
+               mode = options.mode,
                show = mode === "show",
                hide = mode === "hide",
-               showhide = ( show || mode === "hide" ),
+               showhide = show || hide,
 
-               // showing or hiding leaves of the "last" animation
-               anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
-               duration = o.duration / anims,
+               // Showing or hiding leaves off the "last" animation
+               anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
+               duration = options.duration / anims,
                animateTo = 0,
-               queue = elem.queue(),
-               queuelen = queue.length,
-               i;
+               i = 1,
+               queuelen = element.queue().length;
 
-       if ( show || !elem.is(":visible")) {
-               elem.css( "opacity", 0 ).show();
+       if ( show || !element.is( ":visible" ) ) {
+               element.css( "opacity", 0 ).show();
                animateTo = 1;
        }
 
-       // anims - 1 opacity "toggles"
-       for ( i = 1; i < anims; i++ ) {
-               elem.animate({
-                       opacity: animateTo
-               }, duration, o.easing );
+       // Anims - 1 opacity "toggles"
+       for ( ; i < anims; i++ ) {
+               element.animate( { opacity: animateTo }, duration, options.easing );
                animateTo = 1 - animateTo;
        }
 
-       elem.animate({
-               opacity: animateTo
-       }, duration, o.easing);
+       element.animate( { opacity: animateTo }, duration, options.easing );
 
-       elem.queue(function() {
-               if ( hide ) {
-                       elem.hide();
-               }
-               done();
-       });
+       element.queue( done );
 
-       // We just queued up "anims" animations, we need to put them next in the queue
-       if ( queuelen > 1 ) {
-               queue.splice.apply( queue,
-                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
-       }
-       elem.dequeue();
-};
+       $.effects.unshift( element, queuelen, anims + 1 );
+} );
 
 
 /*!
- * jQuery UI Effects Shake 1.11.4
+ * jQuery UI Effects Shake 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/shake-effect/
  */
 
+//>>label: Shake Effect
+//>>group: Effects
+//>>description: Shakes an element horizontally or vertically n times.
+//>>docs: http://api.jqueryui.com/shake-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectShake = $.effects.effect.shake = function( o, done ) {
 
-       var el = $( this ),
-               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-               mode = $.effects.setMode( el, o.mode || "effect" ),
-               direction = o.direction || "left",
-               distance = o.distance || 20,
-               times = o.times || 3,
+
+var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
+
+       var i = 1,
+               element = $( this ),
+               direction = options.direction || "left",
+               distance = options.distance || 20,
+               times = options.times || 3,
                anims = times * 2 + 1,
-               speed = Math.round( o.duration / anims ),
-               ref = (direction === "up" || direction === "down") ? "top" : "left",
-               positiveMotion = (direction === "up" || direction === "left"),
+               speed = Math.round( options.duration / anims ),
+               ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+               positiveMotion = ( direction === "up" || direction === "left" ),
                animation = {},
                animation1 = {},
                animation2 = {},
-               i,
 
-               // we will need to re-assemble the queue to stack our animations in place
-               queue = el.queue(),
-               queuelen = queue.length;
+               queuelen = element.queue().length;
 
-       $.effects.save( el, props );
-       el.show();
-       $.effects.createWrapper( el );
+       $.effects.createPlaceholder( element );
 
        // Animation
        animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
@@ -8061,137 +9523,111 @@ var effectShake = $.effects.effect.shake = function( o, done ) {
        animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
 
        // Animate
-       el.animate( animation, speed, o.easing );
+       element.animate( animation, speed, options.easing );
 
        // Shakes
-       for ( i = 1; i < times; i++ ) {
-               el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
+       for ( ; i < times; i++ ) {
+               element
+                       .animate( animation1, speed, options.easing )
+                       .animate( animation2, speed, options.easing );
        }
-       el
-               .animate( animation1, speed, o.easing )
-               .animate( animation, speed / 2, o.easing )
-               .queue(function() {
-                       if ( mode === "hide" ) {
-                               el.hide();
-                       }
-                       $.effects.restore( el, props );
-                       $.effects.removeWrapper( el );
-                       done();
-               });
 
-       // inject all the animations we just queued to be first in line (after "inprogress")
-       if ( queuelen > 1) {
-               queue.splice.apply( queue,
-                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
-       }
-       el.dequeue();
+       element
+               .animate( animation1, speed, options.easing )
+               .animate( animation, speed / 2, options.easing )
+               .queue( done );
 
-};
+       $.effects.unshift( element, queuelen, anims + 1 );
+} );
 
 
 /*!
- * jQuery UI Effects Slide 1.11.4
+ * jQuery UI Effects Slide 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/slide-effect/
  */
 
+//>>label: Slide Effect
+//>>group: Effects
+//>>description: Slides an element in and out of the viewport.
+//>>docs: http://api.jqueryui.com/slide-effect/
+//>>demos: http://jqueryui.com/effect/
 
-var effectSlide = $.effects.effect.slide = function( o, done ) {
 
-       // Create element
-       var el = $( this ),
-               props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
-               mode = $.effects.setMode( el, o.mode || "show" ),
-               show = mode === "show",
-               direction = o.direction || "left",
-               ref = (direction === "up" || direction === "down") ? "top" : "left",
-               positiveMotion = (direction === "up" || direction === "left"),
-               distance,
+
+var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
+       var startClip, startRef,
+               element = $( this ),
+               map = {
+                       up: [ "bottom", "top" ],
+                       down: [ "top", "bottom" ],
+                       left: [ "right", "left" ],
+                       right: [ "left", "right" ]
+               },
+               mode = options.mode,
+               direction = options.direction || "left",
+               ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+               positiveMotion = ( direction === "up" || direction === "left" ),
+               distance = options.distance ||
+                       element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
                animation = {};
 
-       // Adjust
-       $.effects.save( el, props );
-       el.show();
-       distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
+       $.effects.createPlaceholder( element );
 
-       $.effects.createWrapper( el ).css({
-               overflow: "hidden"
-       });
+       startClip = element.cssClip();
+       startRef = element.position()[ ref ];
 
-       if ( show ) {
-               el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
-       }
+       // Define hide animation
+       animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
+       animation.clip = element.cssClip();
+       animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
 
-       // Animation
-       animation[ ref ] = ( show ?
-               ( positiveMotion ? "+=" : "-=") :
-               ( positiveMotion ? "-=" : "+=")) +
-               distance;
+       // Reverse the animation if we're showing
+       if ( mode === "show" ) {
+               element.cssClip( animation.clip );
+               element.css( ref, animation[ ref ] );
+               animation.clip = startClip;
+               animation[ ref ] = startRef;
+       }
 
-       // Animate
-       el.animate( animation, {
+       // Actually animate
+       element.animate( animation, {
                queue: false,
-               duration: o.duration,
-               easing: o.easing,
-               complete: function() {
-                       if ( mode === "hide" ) {
-                               el.hide();
-                       }
-                       $.effects.restore( el, props );
-                       $.effects.removeWrapper( el );
-                       done();
-               }
-       });
-};
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
+} );
 
 
 /*!
- * jQuery UI Effects Transfer 1.11.4
+ * jQuery UI Effects Transfer 1.12.0
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license.
  * http://jquery.org/license
- *
- * http://api.jqueryui.com/transfer-effect/
  */
 
+//>>label: Transfer Effect
+//>>group: Effects
+//>>description: Displays a transfer effect from one element to another.
+//>>docs: http://api.jqueryui.com/transfer-effect/
+//>>demos: http://jqueryui.com/effect/
+
+
+
+var effect;
+if ( $.uiBackCompat !== false ) {
+       effect = $.effects.define( "transfer", function( options, done ) {
+               $( this ).transfer( options, done );
+       } );
+}
+var effectsEffectTransfer = effect;
 
-var effectTransfer = $.effects.effect.transfer = function( o, done ) {
-       var elem = $( this ),
-               target = $( o.to ),
-               targetFixed = target.css( "position" ) === "fixed",
-               body = $("body"),
-               fixTop = targetFixed ? body.scrollTop() : 0,
-               fixLeft = targetFixed ? body.scrollLeft() : 0,
-               endPosition = target.offset(),
-               animation = {
-                       top: endPosition.top - fixTop,
-                       left: endPosition.left - fixLeft,
-                       height: target.innerHeight(),
-                       width: target.innerWidth()
-               },
-               startPosition = elem.offset(),
-               transfer = $( "<div class='ui-effects-transfer'></div>" )
-                       .appendTo( document.body )
-                       .addClass( o.className )
-                       .css({
-                               top: startPosition.top - fixTop,
-                               left: startPosition.left - fixLeft,
-                               height: elem.innerHeight(),
-                               width: elem.innerWidth(),
-                               position: targetFixed ? "fixed" : "absolute"
-                       })
-                       .animate( animation, o.duration, o.easing, function() {
-                               transfer.remove();
-                               done();
-                       });
-};
 
 
 
index 8b2ec88993e23db2eaea317389148db86e12b2e5..90015d5dd7c018eccd570c44d120d9683215ba94 100644 (file)
@@ -1,9 +1,9 @@
-/*! jQuery UI - v1.11.4 - 2015-06-18
+/*! jQuery UI - v1.12.0 - 2016-07-16
 * http://jqueryui.com
-* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+* Includes: widget.js, position.js, data.js, form-reset-mixin.js, keycode.js, scroll-parent.js, widgets/draggable.js, widgets/droppable.js, widgets/sortable.js, widgets/datepicker.js, widgets/mouse.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
 
-(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var s=0,n=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,a=n.call(arguments,1),o=0,r=a.length;r>o;o++)for(i in a[o])s=a[o][i],a[o].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(a){var o="string"==typeof a,r=n.call(arguments,1),h=this;return o?this.each(function(){var i,n=e.data(this,s);return"instance"===a?(h=n,!1):n?e.isFunction(n[a])&&"_"!==a.charAt(0)?(i=n[a].apply(n,r),i!==n&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+a+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+a+"'")}):(r.length&&(a=e.widget.extend.apply(null,[a].concat(r))),this.each(function(){var t=e.data(this,s);t?(t.option(a||{}),t._init&&t._init()):e.data(this,s,new i(a,this))})),h}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var a=!1;e(document).mouseup(function(){a=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!a){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),a=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),a=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,N=e.extend({},y),M=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?N.left-=d:"center"===n.my[0]&&(N.left-=d/2),"bottom"===n.my[1]?N.top-=c:"center"===n.my[1]&&(N.top-=c/2),N.left+=M[0],N.top+=M[1],a||(N.left=h(N.left),N.top=h(N.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](N,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+M[0],p[1]+M[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-N.left,i=t+m-d,s=v.top-N.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:N.left,top:N.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(N,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n
-})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;
-i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}});var o="ui-effects-",r=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))
-}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(r),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(r.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(o+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(o+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}});
\ No newline at end of file
+(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function i(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=s(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function s(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,n)}function n(){t.datepicker._isDisabledDatepicker(c.inline?c.dpDiv.parent()[0]:c.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function o(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}t.ui=t.ui||{},t.ui.version="1.12.0";var a=0,r=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=r.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=r.call(arguments,1),h=this;return o?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(h=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=a++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o,a=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;o=function(){var e=t("<div>").css("position","absolute").appendTo("body").offset({top:1.5,left:1.5}),i=1.5===e.offset().top;return e.remove(),o=function(){return i},i},t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=t.extend({},n);var p,g,m,_,v,b,y=t(n.of),w=t.position.getWithinInfo(n.within),k=t.position.getScrollInfo(w),x=(n.collision||"flip").split(" "),C={};return b=s(y),y[0].preventDefault&&(n.at="left top"),g=b.width,m=b.height,_=b.offset,v=t.extend({},_),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):c.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=c.test(i[1])?i[1]:"center",t=u.exec(i[0]),e=u.exec(i[1]),C[this]=[t?t[0]:0,e?e[0]:0],n[this]=[d.exec(i[0])[0],d.exec(i[1])[0]]}),1===x.length&&(x[1]=x[0]),"right"===n.at[0]?v.left+=g:"center"===n.at[0]&&(v.left+=g/2),"bottom"===n.at[1]?v.top+=m:"center"===n.at[1]&&(v.top+=m/2),p=e(C.at,g,m),v.left+=p[0],v.top+=p[1],this.each(function(){var s,l,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=u+f+i(this,"marginRight")+k.width,I=d+b+i(this,"marginBottom")+k.height,T=t.extend({},v),P=e(C.my,c.outerWidth(),c.outerHeight());"right"===n.my[0]?T.left-=u:"center"===n.my[0]&&(T.left-=u/2),"bottom"===n.my[1]?T.top-=d:"center"===n.my[1]&&(T.top-=d/2),T.left+=P[0],T.top+=P[1],o()||(T.left=h(T.left),T.top=h(T.top)),s={marginLeft:f,marginTop:b},t.each(["left","top"],function(e,i){t.ui.position[x[e]]&&t.ui.position[x[e]][i](T,{targetWidth:g,targetHeight:m,elemWidth:u,elemHeight:d,collisionPosition:s,collisionWidth:D,collisionHeight:I,offset:[p[0]+P[0],p[1]+P[1]],my:n.my,at:n.at,within:w,elem:c})}),n.using&&(l=function(t){var e=_.left-T.left,i=e+g-u,s=_.top-T.top,o=s+m-d,h={target:{element:y,left:_.left,top:_.top,width:g,height:m},element:{element:c,left:T.left,top:T.top,width:u,height:d},horizontal:0>i?"left":e>0?"right":"center",vertical:0>o?"top":s>0?"bottom":"middle"};u>g&&g>r(e+i)&&(h.horizontal="center"),d>m&&m>r(s+o)&&(h.vertical="middle"),h.important=a(r(e),r(i))>a(r(s),r(o))?"horizontal":"vertical",n.using.call(this,t,h)}),c.offset(t.extend(T,{using:l}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,o=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-o-n;e.collisionWidth>o?h>0&&0>=l?(i=t.left+h+e.collisionWidth-o-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+o-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=a(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,o=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-o-n;e.collisionHeight>o?h>0&&0>=l?(i=t.top+h+e.collisionHeight-o-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+o-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=a(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,a=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-a-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-a-o,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,a=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-a-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-a-o,(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var h=!1;t(document).on("mouseup",function(){h=!1}),t.widget("ui.mouse",{version:"1.12.0",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!h){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),h=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,h=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.0",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this._blurActiveElement(e),this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);this._getHandle(e)&&s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),h=t.pageX,l=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
+},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY<n.scrollSensitivity?a.scrollTop=o=a.scrollTop+n.scrollSpeed:e.pageY-s.overflowOffset.top<n.scrollSensitivity&&(a.scrollTop=o=a.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+a.offsetWidth-e.pageX<n.scrollSensitivity?a.scrollLeft=o=a.scrollLeft+n.scrollSpeed:e.pageX-s.overflowOffset.left<n.scrollSensitivity&&(a.scrollLeft=o=a.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(e.pageY-t(r).scrollTop()<n.scrollSensitivity?o=t(r).scrollTop(t(r).scrollTop()-n.scrollSpeed):t(window).height()-(e.pageY-t(r).scrollTop())<n.scrollSensitivity&&(o=t(r).scrollTop(t(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(e.pageX-t(r).scrollLeft()<n.scrollSensitivity?o=t(r).scrollLeft(t(r).scrollLeft()-n.scrollSpeed):t(window).width()-(e.pageX-t(r).scrollLeft())<n.scrollSensitivity&&(o=t(r).scrollLeft(t(r).scrollLeft()+n.scrollSpeed)))),o!==!1&&t.ui.ddmanager&&!n.dropBehaviour&&t.ui.ddmanager.prepareOffsets(s,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,s){var n=s.options;s.snapElements=[],t(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var e=t(this),i=e.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,s){var n,o,a,r,h,l,c,u,d,p,f=s.options,g=f.snapTolerance,m=i.offset.left,_=m+s.helperProportions.width,v=i.offset.top,b=v+s.helperProportions.height;for(d=s.snapElements.length-1;d>=0;d--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(h-_),r=g>=Math.abs(l-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(h-m),r=g>=Math.abs(l-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.0",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&l(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var l=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&l(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=l(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.sortable",t.ui.mouse,{version:"1.12.0",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-this.document.scrollTop()<a.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-a.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<a.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+a.scrollSpeed)),e.pageX-this.document.scrollLeft()<a.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-a.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<a.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("<tr>",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t("<td>&#160;</td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}
+},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.extend(t.ui,{datepicker:{version:"1.12.0"}});var c;t.extend(i.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return o(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var n=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?s(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(i),t.data(e,"datepicker",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.off("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.on("focus",this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,a){var r,h,l,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+r+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),o(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+c,l/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),c===n&&(c=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,a,r,h,l=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):l?"all"===i?t.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),o(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(i){if(i=i.target||i,"input"!==i.nodeName.toLowerCase()&&(i=t("input",i.parentNode)[0]),!t.datepicker._isDisabledDatepicker(i)&&t.datepicker._lastInput!==i){var s,n,a,r,h,l,c;s=t.datepicker._getInst(i),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),a=n?n.apply(i,[i,s]):{},a!==!1&&(o(s.settings,a),s.lastVal=null,t.datepicker._lastInput=i,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(i.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(i),t.datepicker._pos[1]+=i.offsetHeight),r=!1,t(i).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),h={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),h=t.datepicker._checkOffset(s,h,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),s.inline||(l=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",e(t(i))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[l]?s.dpDiv.show(l,t.datepicker._get(s,"showOptions"),c):s.dpDiv[l||"show"](l?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))}},_updateDatepicker:function(e){this.maxRows=4,c=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),o=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&n.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),o>1&&e.dpDiv.addClass("ui-datepicker-multi-"+o).css("width",a*o+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(h).match(o);if(!a)throw"Missing number at position "+h;return h+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],h+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+h},x=function(){if(i.charAt(h)!==e.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>h&&(a=i.substr(h),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,T,P,M,S,H,z,O,A,N,W,E,F,L,R=new Date,Y=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),B=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),X=this._get(t,"stepMonths"),$=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=Q&&Q>e?Q:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-X,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"e":"w")+"'>"+i+"</span></a>":q?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+X,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"w":"e")+"'>"+n+"</span></a>":q?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:Y,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(B?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(B?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",T="",$){if(T+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:T+=" ui-datepicker-group-first",I=" ui-corner-"+(B?"right":"left");
+break;case U[1]-1:T+=" ui-datepicker-group-last",I=" ui-corner-"+(B?"left":"right");break;default:T+=" ui-datepicker-group-middle",I=""}T+="'>"}for(T+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?B?o:s:"")+(/all|right/.test(I)&&0===k?B?s:o:"")+this._generateMonthYearHeader(t,Z,te,Q,J,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",P=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,P+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(T+=P+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),H=(this._getFirstDayOfMonth(te,Z)-c+7)%7,z=Math.ceil((H+S)/7),O=$?this.maxRows>z?this.maxRows:z:z,this.maxRows=O,A=this._daylightSavingAdjust(new Date(te,Z,1-H)),N=0;O>N;N++){for(T+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(A)+"</td>":"",w=0;7>w;w++)E=m?m.apply(t.input?t.input[0]:null,[A]):[!0,""],F=A.getMonth()!==Z,L=F&&!v||!E[0]||Q&&Q>A||J&&A>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(A.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===A.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+E[1]+(A.getTime()===G.getTime()?" "+this._currentClass:"")+(A.getTime()===Y.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!E[2]?"":" title='"+E[2].replace(/'/g,"&#39;")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+A.getMonth()+"' data-year='"+A.getFullYear()+"'")+">"+(F&&!_?"&#xa0;":L?"<span class='ui-state-default'>"+A.getDate()+"</span>":"<a class='ui-state-default"+(A.getTime()===Y.getTime()?" ui-state-highlight":"")+(A.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+A.getDate()+"</a>")+"</td>",A.setDate(A.getDate()+1),A=this._daylightSavingAdjust(A);T+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),T+="</tbody></table>"+($?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=T}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!_)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new i,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.0",t.datepicker;var u="ui-effects-",d="ui-effects-style",p="ui-effects-animated",f=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(f),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(f.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(p)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(u+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(u+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.0",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(d,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(d)||"",t.removeData(d)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(u+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=u+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(p),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(p,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var g=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var g;t.uiBackCompat!==!1&&(g=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)}))});
\ No newline at end of file