http://git-wip-us.apache.org/repos/asf/logging-log4j-audit/blob/7ccfa3aa/log4j-catalog/log4j-catalog-editor/src/main/resources/static/js/jquery-ui-1.12.1/jquery-ui.js
----------------------------------------------------------------------
diff --git 
a/log4j-catalog/log4j-catalog-editor/src/main/resources/static/js/jquery-ui-1.12.1/jquery-ui.js
 
b/log4j-catalog/log4j-catalog-editor/src/main/resources/static/js/jquery-ui-1.12.1/jquery-ui.js
new file mode 100644
index 0000000..0213552
--- /dev/null
+++ 
b/log4j-catalog/log4j-catalog-editor/src/main/resources/static/js/jquery-ui-1.12.1/jquery-ui.js
@@ -0,0 +1,18706 @@
+/*! jQuery UI - v1.12.1 - 2016-09-14
+* http://jqueryui.com
+* Includes: widget.js, position.js, data.js, disable-selection.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, 
focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, 
scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, 
widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, 
widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, 
widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, 
widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, 
widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, 
widgets/spinner.js, widgets/tabs.js, widgets/toolt
 ip.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function( factory ) {
+       if ( typeof define === "function" && define.amd ) {
+
+               // AMD. Register as an anonymous module.
+               define([ "jquery" ], factory );
+       } else {
+
+               // Browser globals
+               factory( jQuery );
+       }
+}(function( $ ) {
+
+$.ui = $.ui || {};
+
+var version = $.ui.version = "1.12.1";
+
+
+/*!
+ * jQuery UI Widget 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>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 widgetUuid = 0;
+var widgetSlice = Array.prototype.slice;
+
+$.cleanData = ( function( orig ) {
+       return function( elems ) {
+               var events, elem, i;
+               for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
+                       try {
+
+                               // Only trigger remove when necessary to save 
time
+                               events = $._data( elem, "events" );
+                               if ( events && events.remove ) {
+                                       $( elem ).triggerHandler( "remove" );
+                               }
+
+                       // Http://bugs.jquery.com/ticket/8235
+                       } catch ( e ) {}
+               }
+               orig( elems );
+       };
+} )( $.cleanData );
+
+$.widget = function( name, base, prototype ) {
+       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 ];
+       var fullName = namespace + "-" + name;
+
+       if ( !prototype ) {
+               prototype = base;
+               base = $.Widget;
+       }
+
+       if ( $.isArray( prototype ) ) {
+               prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
+       }
+
+       // Create selector for plugin
+       $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+               return !!$.data( elem, fullName );
+       };
+
+       $[ namespace ] = $[ namespace ] || {};
+       existingConstructor = $[ namespace ][ name ];
+       constructor = $[ namespace ][ name ] = function( options, element ) {
+
+               // Allow instantiation without "new" keyword
+               if ( !this._createWidget ) {
+                       return new constructor( options, element );
+               }
+
+               // 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( constructor, existingConstructor, {
+               version: prototype.version,
+
+               // 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
+               // 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
+       // otherwise we'll modify the options hash on the prototype that we're
+       // inheriting from
+       basePrototype.options = $.widget.extend( {}, basePrototype.options );
+       $.each( prototype, function( prop, value ) {
+               if ( !$.isFunction( value ) ) {
+                       proxiedPrototype[ prop ] = value;
+                       return;
+               }
+               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;
+                               var __superApply = this._superApply;
+                               var returnValue;
+
+                               this._super = _super;
+                               this._superApply = _superApply;
+
+                               returnValue = value.apply( this, arguments );
+
+                               this._super = __super;
+                               this._superApply = __superApply;
+
+                               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
+       }, 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
+       // the new version of this widget. We're essentially trying to replace 
one
+       // level in the prototype chain.
+       if ( existingConstructor ) {
+               $.each( existingConstructor._childConstructors, function( i, 
child ) {
+                       var childPrototype = child.prototype;
+
+                       // 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
+               // so the old child constructors can be garbage collected
+               delete existingConstructor._childConstructors;
+       } else {
+               base._childConstructors.push( constructor );
+       }
+
+       $.widget.bridge( name, constructor );
+
+       return constructor;
+};
+
+$.widget.extend = function( target ) {
+       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;
+                               }
+                       }
+               }
+       }
+       return target;
+};
+
+$.widget.bridge = function( name, object ) {
+       var fullName = object.prototype.widgetFullName || name;
+       $.fn[ name ] = function( options ) {
+               var isMethodCall = typeof options === "string";
+               var args = widgetSlice.call( arguments, 1 );
+               var returnValue = this;
+
+               if ( isMethodCall ) {
+
+                       // If this is an empty collection, we need to have the 
instance method
+                       // return undefined instead of the jQuery instance
+                       if ( !this.length && options === "instance" ) {
+                               returnValue = undefined;
+                       } else {
+                               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; " +
+                                                       "attempted to call 
method '" + options + "'" );
+                                       }
+
+                                       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 ) );
+                       }
+
+                       this.each( function() {
+                               var instance = $.data( this, fullName );
+                               if ( instance ) {
+                                       instance.option( options || {} );
+                                       if ( instance._init ) {
+                                               instance._init();
+                                       }
+                               } else {
+                                       $.data( this, fullName, new object( 
options, this ) );
+                               }
+                       } );
+               }
+
+               return returnValue;
+       };
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+       widgetName: "widget",
+       widgetEventPrefix: "",
+       defaultElement: "<div>",
+
+       options: {
+               classes: {},
+               disabled: false,
+
+               // Callbacks
+               create: null
+       },
+
+       _createWidget: function( options, element ) {
+               element = $( element || this.defaultElement || this )[ 0 ];
+               this.element = $( element );
+               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 );
+                       this._on( true, this.element, {
+                               remove: function( event ) {
+                                       if ( event.target === element ) {
+                                               this.destroy();
+                                       }
+                               }
+                       } );
+                       this.document = $( element.style ?
+
+                               // Element within the document
+                               element.ownerDocument :
+
+                               // Element is window or document
+                               element.document || element );
+                       this.window = $( this.document[ 0 ].defaultView || 
this.document[ 0 ].parentWindow );
+               }
+
+               this.options = $.widget.extend( {},
+                       this.options,
+                       this._getCreateOptions(),
+                       options );
+
+               this._create();
+
+               if ( this.options.disabled ) {
+                       this._setOptionDisabled( this.options.disabled );
+               }
+
+               this._trigger( "create", null, this._getCreateEventData() );
+               this._init();
+       },
+
+       _getCreateOptions: function() {
+               return {};
+       },
+
+       _getCreateEventData: $.noop,
+
+       _create: $.noop,
+
+       _init: $.noop,
+
+       destroy: function() {
+               var that = this;
+
+               this._destroy();
+               $.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
+                       .off( this.eventNamespace )
+                       .removeData( this.widgetFullName );
+               this.widget()
+                       .off( this.eventNamespace )
+                       .removeAttr( "aria-disabled" );
+
+               // Clean up events and states
+               this.bindings.off( this.eventNamespace );
+       },
+
+       _destroy: $.noop,
+
+       widget: function() {
+               return this.element;
+       },
+
+       option: function( key, value ) {
+               var options = key;
+               var parts;
+               var curOption;
+               var i;
+
+               if ( arguments.length === 0 ) {
+
+                       // 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: 
___ } }
+                       options = {};
+                       parts = key.split( "." );
+                       key = parts.shift();
+                       if ( parts.length ) {
+                               curOption = options[ key ] = $.widget.extend( 
{}, this.options[ key ] );
+                               for ( i = 0; i < parts.length - 1; i++ ) {
+                                       curOption[ parts[ i ] ] = curOption[ 
parts[ i ] ] || {};
+                                       curOption = curOption[ parts[ i ] ];
+                               }
+                               key = parts.pop();
+                               if ( arguments.length === 1 ) {
+                                       return curOption[ key ] === undefined ? 
null : curOption[ key ];
+                               }
+                               curOption[ key ] = value;
+                       } else {
+                               if ( arguments.length === 1 ) {
+                                       return this.options[ key ] === 
undefined ? null : this.options[ key ];
+                               }
+                               options[ key ] = value;
+                       }
+               }
+
+               this._setOptions( options );
+
+               return this;
+       },
+
+       _setOptions: function( options ) {
+               var key;
+
+               for ( key in options ) {
+                       this._setOption( key, options[ key ] );
+               }
+
+               return this;
+       },
+
+       _setOption: function( key, value ) {
+               if ( key === "classes" ) {
+                       this._setOptionClasses( value );
+               }
+
+               this.options[ key ] = value;
+
+               if ( key === "disabled" ) {
+                       this._setOptionDisabled( value );
+               }
+
+               return this;
+       },
+
+       _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
+                       } ) );
+               }
+       },
+
+       _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 } );
+       },
+
+       disable: function() {
+               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 
] ] );
+                               }
+                       }
+               }
+
+               this._on( options.element, {
+                       "remove": "_untrackClassesElement"
+               } );
+
+               if ( options.keys ) {
+                       processClassString( options.keys.match( /\S+/g ) || [], 
true );
+               }
+               if ( options.extra ) {
+                       processClassString( options.extra.match( /\S+/g ) || [] 
);
+               }
+
+               return full.join( " " );
+       },
+
+       _untrackClassesElement: function( event ) {
+               var that = this;
+               $.each( that.classesElementLookup, function( key, value ) {
+                       if ( $.inArray( event.target, value ) !== -1 ) {
+                               that.classesElementLookup[ key ] = $( 
value.not( event.target ).get() );
+                       }
+               } );
+       },
+
+       _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;
+               var instance = this;
+
+               // No suppressDisabledCheck flag, shuffle arguments
+               if ( typeof suppressDisabledCheck !== "boolean" ) {
+                       handlers = element;
+                       element = suppressDisabledCheck;
+                       suppressDisabledCheck = false;
+               }
+
+               // No element argument, shuffle and use this.element
+               if ( !handlers ) {
+                       handlers = element;
+                       element = this.element;
+                       delegateElement = this.widget();
+               } else {
+                       element = delegateElement = $( element );
+                       this.bindings = this.bindings.add( element );
+               }
+
+               $.each( handlers, function( event, handler ) {
+                       function handlerProxy() {
+
+                               // 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" ) ) ) {
+                                       return;
+                               }
+                               return ( typeof handler === "string" ? 
instance[ handler ] : handler )
+                                       .apply( instance, arguments );
+                       }
+
+                       // 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*(.*)$/ );
+                       var eventName = match[ 1 ] + instance.eventNamespace;
+                       var selector = match[ 2 ];
+
+                       if ( selector ) {
+                               delegateElement.on( eventName, selector, 
handlerProxy );
+                       } else {
+                               element.on( eventName, handlerProxy );
+                       }
+               } );
+       },
+
+       _off: function( element, eventName ) {
+               eventName = ( eventName || "" ).split( " " ).join( 
this.eventNamespace + " " ) +
+                       this.eventNamespace;
+               element.off( eventName ).off( eventName );
+
+               // Clear the stack to avoid memory leaks (#10056)
+               this.bindings = $( this.bindings.not( element ).get() );
+               this.focusable = $( this.focusable.not( element ).get() );
+               this.hoverable = $( this.hoverable.not( element ).get() );
+       },
+
+       _delay: function( handler, delay ) {
+               function handlerProxy() {
+                       return ( typeof handler === "string" ? instance[ 
handler ] : handler )
+                               .apply( instance, arguments );
+               }
+               var instance = this;
+               return setTimeout( handlerProxy, delay || 0 );
+       },
+
+       _hoverable: function( element ) {
+               this.hoverable = this.hoverable.add( element );
+               this._on( element, {
+                       mouseenter: function( event ) {
+                               this._addClass( $( event.currentTarget ), null, 
"ui-state-hover" );
+                       },
+                       mouseleave: function( event ) {
+                               this._removeClass( $( event.currentTarget ), 
null, "ui-state-hover" );
+                       }
+               } );
+       },
+
+       _focusable: function( element ) {
+               this.focusable = this.focusable.add( element );
+               this._on( element, {
+                       focusin: function( event ) {
+                               this._addClass( $( event.currentTarget ), null, 
"ui-state-focus" );
+                       },
+                       focusout: function( event ) {
+                               this._removeClass( $( event.currentTarget ), 
null, "ui-state-focus" );
+                       }
+               } );
+       },
+
+       _trigger: function( type, event, data ) {
+               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
+               // 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
+               orig = event.originalEvent;
+               if ( orig ) {
+                       for ( prop in orig ) {
+                               if ( !( prop in event ) ) {
+                                       event[ prop ] = orig[ prop ];
+                               }
+                       }
+               }
+
+               this.element.trigger( event, data );
+               return !( $.isFunction( callback ) &&
+                       callback.apply( this.element[ 0 ], [ event ].concat( 
data ) ) === false ||
+                       event.isDefaultPrevented() );
+       }
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) 
{
+       $.Widget.prototype[ "_" + method ] = function( element, options, 
callback ) {
+               if ( typeof options === "string" ) {
+                       options = { effect: options };
+               }
+
+               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 ) {
+                               $( this )[ method ]();
+                               if ( callback ) {
+                                       callback.call( element[ 0 ] );
+                               }
+                               next();
+                       } );
+               }
+       };
+} );
+
+var widget = $.widget;
+
+
+/*!
+ * jQuery UI Position 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/position/
+ */
+
+//>>label: Position
+//>>group: Core
+//>>description: Positions elements relative to other elements.
+//>>docs: http://api.jqueryui.com/position/
+//>>demos: http://jqueryui.com/position/
+
+
+( function() {
+var cachedScrollbarWidth,
+       max = Math.max,
+       abs = Math.abs,
+       rhorizontal = /left|center|right/,
+       rvertical = /top|center|bottom/,
+       roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+       rposition = /^\w+/,
+       rpercent = /%$/,
+       _position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+       return [
+               parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? 
width / 100 : 1 ),
+               parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? 
height / 100 : 1 )
+       ];
+}
+
+function parseCss( element, property ) {
+       return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function getDimensions( elem ) {
+       var raw = elem[ 0 ];
+       if ( raw.nodeType === 9 ) {
+               return {
+                       width: elem.width(),
+                       height: elem.height(),
+                       offset: { top: 0, left: 0 }
+               };
+       }
+       if ( $.isWindow( raw ) ) {
+               return {
+                       width: elem.width(),
+                       height: elem.height(),
+                       offset: { top: elem.scrollTop(), left: 
elem.scrollLeft() }
+               };
+       }
+       if ( raw.preventDefault ) {
+               return {
+                       width: 0,
+                       height: 0,
+                       offset: { top: raw.pageY, left: raw.pageX }
+               };
+       }
+       return {
+               width: elem.outerWidth(),
+               height: elem.outerHeight(),
+               offset: elem.offset()
+       };
+}
+
+$.position = {
+       scrollbarWidth: function() {
+               if ( cachedScrollbarWidth !== undefined ) {
+                       return cachedScrollbarWidth;
+               }
+               var w1, w2,
+                       div = $( "<div " +
+                               
"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>"
 +
+                               "<div 
style='height:100px;width:auto;'></div></div>" ),
+                       innerDiv = div.children()[ 0 ];
+
+               $( "body" ).append( div );
+               w1 = innerDiv.offsetWidth;
+               div.css( "overflow", "scroll" );
+
+               w2 = innerDiv.offsetWidth;
+
+               if ( w1 === w2 ) {
+                       w2 = div[ 0 ].clientWidth;
+               }
+
+               div.remove();
+
+               return ( cachedScrollbarWidth = w1 - w2 );
+       },
+       getScrollInfo: function( within ) {
+               var overflowX = within.isWindow || within.isDocument ? "" :
+                               within.element.css( "overflow-x" ),
+                       overflowY = within.isWindow || within.isDocument ? "" :
+                               within.element.css( "overflow-y" ),
+                       hasOverflowX = overflowX === "scroll" ||
+                               ( overflowX === "auto" && within.width < 
within.element[ 0 ].scrollWidth ),
+                       hasOverflowY = overflowY === "scroll" ||
+                               ( overflowY === "auto" && within.height < 
within.element[ 0 ].scrollHeight );
+               return {
+                       width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+                       height: hasOverflowX ? $.position.scrollbarWidth() : 0
+               };
+       },
+       getWithinInfo: function( element ) {
+               var withinElement = $( element || window ),
+                       isWindow = $.isWindow( withinElement[ 0 ] ),
+                       isDocument = !!withinElement[ 0 ] && withinElement[ 0 
].nodeType === 9,
+                       hasOffset = !isWindow && !isDocument;
+               return {
+                       element: withinElement,
+                       isWindow: isWindow,
+                       isDocument: isDocument,
+                       offset: hasOffset ? $( element ).offset() : { left: 0, 
top: 0 },
+                       scrollLeft: withinElement.scrollLeft(),
+                       scrollTop: withinElement.scrollTop(),
+                       width: withinElement.outerWidth(),
+                       height: withinElement.outerHeight()
+               };
+       }
+};
+
+$.fn.position = function( options ) {
+       if ( !options || !options.of ) {
+               return _position.apply( this, arguments );
+       }
+
+       // Make a copy, we don't want to modify arguments
+       options = $.extend( {}, options );
+
+       var atOffset, targetWidth, targetHeight, targetOffset, basePosition, 
dimensions,
+               target = $( options.of ),
+               within = $.position.getWithinInfo( options.within ),
+               scrollInfo = $.position.getScrollInfo( within ),
+               collision = ( options.collision || "flip" ).split( " " ),
+               offsets = {};
+
+       dimensions = getDimensions( target );
+       if ( target[ 0 ].preventDefault ) {
+
+               // Force left top to allow flipping
+               options.at = "left top";
+       }
+       targetWidth = dimensions.width;
+       targetHeight = dimensions.height;
+       targetOffset = dimensions.offset;
+
+       // Clone to reuse original targetOffset later
+       basePosition = $.extend( {}, targetOffset );
+
+       // Force my and at to have valid horizontal and vertical positions
+       // if a value is missing or invalid, it will be converted to center
+       $.each( [ "my", "at" ], function() {
+               var pos = ( options[ this ] || "" ).split( " " ),
+                       horizontalOffset,
+                       verticalOffset;
+
+               if ( pos.length === 1 ) {
+                       pos = rhorizontal.test( pos[ 0 ] ) ?
+                               pos.concat( [ "center" ] ) :
+                               rvertical.test( pos[ 0 ] ) ?
+                                       [ "center" ].concat( pos ) :
+                                       [ "center", "center" ];
+               }
+               pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+               pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+               // Calculate offsets
+               horizontalOffset = roffset.exec( pos[ 0 ] );
+               verticalOffset = roffset.exec( pos[ 1 ] );
+               offsets[ this ] = [
+                       horizontalOffset ? horizontalOffset[ 0 ] : 0,
+                       verticalOffset ? verticalOffset[ 0 ] : 0
+               ];
+
+               // Reduce to just the positions without the offsets
+               options[ this ] = [
+                       rposition.exec( pos[ 0 ] )[ 0 ],
+                       rposition.exec( pos[ 1 ] )[ 0 ]
+               ];
+       } );
+
+       // Normalize collision option
+       if ( collision.length === 1 ) {
+               collision[ 1 ] = collision[ 0 ];
+       }
+
+       if ( options.at[ 0 ] === "right" ) {
+               basePosition.left += targetWidth;
+       } else if ( options.at[ 0 ] === "center" ) {
+               basePosition.left += targetWidth / 2;
+       }
+
+       if ( options.at[ 1 ] === "bottom" ) {
+               basePosition.top += targetHeight;
+       } else if ( options.at[ 1 ] === "center" ) {
+               basePosition.top += targetHeight / 2;
+       }
+
+       atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+       basePosition.left += atOffset[ 0 ];
+       basePosition.top += atOffset[ 1 ];
+
+       return this.each( function() {
+               var collisionPosition, using,
+                       elem = $( this ),
+                       elemWidth = elem.outerWidth(),
+                       elemHeight = elem.outerHeight(),
+                       marginLeft = parseCss( this, "marginLeft" ),
+                       marginTop = parseCss( this, "marginTop" ),
+                       collisionWidth = elemWidth + marginLeft + parseCss( 
this, "marginRight" ) +
+                               scrollInfo.width,
+                       collisionHeight = elemHeight + marginTop + parseCss( 
this, "marginBottom" ) +
+                               scrollInfo.height,
+                       position = $.extend( {}, basePosition ),
+                       myOffset = getOffsets( offsets.my, elem.outerWidth(), 
elem.outerHeight() );
+
+               if ( options.my[ 0 ] === "right" ) {
+                       position.left -= elemWidth;
+               } else if ( options.my[ 0 ] === "center" ) {
+                       position.left -= elemWidth / 2;
+               }
+
+               if ( options.my[ 1 ] === "bottom" ) {
+                       position.top -= elemHeight;
+               } else if ( options.my[ 1 ] === "center" ) {
+                       position.top -= elemHeight / 2;
+               }
+
+               position.left += myOffset[ 0 ];
+               position.top += myOffset[ 1 ];
+
+               collisionPosition = {
+                       marginLeft: marginLeft,
+                       marginTop: marginTop
+               };
+
+               $.each( [ "left", "top" ], function( i, dir ) {
+                       if ( $.ui.position[ collision[ i ] ] ) {
+                               $.ui.position[ collision[ i ] ][ dir ]( 
position, {
+                                       targetWidth: targetWidth,
+                                       targetHeight: targetHeight,
+                                       elemWidth: elemWidth,
+                                       elemHeight: elemHeight,
+                                       collisionPosition: collisionPosition,
+                                       collisionWidth: collisionWidth,
+                                       collisionHeight: collisionHeight,
+                                       offset: [ atOffset[ 0 ] + myOffset[ 0 
], atOffset [ 1 ] + myOffset[ 1 ] ],
+                                       my: options.my,
+                                       at: options.at,
+                                       within: within,
+                                       elem: elem
+                               } );
+                       }
+               } );
+
+               if ( options.using ) {
+
+                       // Adds feedback as second argument to using callback, 
if present
+                       using = function( props ) {
+                               var left = targetOffset.left - position.left,
+                                       right = left + targetWidth - elemWidth,
+                                       top = targetOffset.top - position.top,
+                                       bottom = top + targetHeight - 
elemHeight,
+                                       feedback = {
+                                               target: {
+                                                       element: target,
+                                                       left: targetOffset.left,
+                                                       top: targetOffset.top,
+                                                       width: targetWidth,
+                                                       height: targetHeight
+                                               },
+                                               element: {
+                                                       element: elem,
+                                                       left: position.left,
+                                                       top: position.top,
+                                                       width: elemWidth,
+                                                       height: elemHeight
+                                               },
+                                               horizontal: right < 0 ? "left" 
: left > 0 ? "right" : "center",
+                                               vertical: bottom < 0 ? "top" : 
top > 0 ? "bottom" : "middle"
+                                       };
+                               if ( targetWidth < elemWidth && abs( left + 
right ) < targetWidth ) {
+                                       feedback.horizontal = "center";
+                               }
+                               if ( targetHeight < elemHeight && abs( top + 
bottom ) < targetHeight ) {
+                                       feedback.vertical = "middle";
+                               }
+                               if ( max( abs( left ), abs( right ) ) > max( 
abs( top ), abs( bottom ) ) ) {
+                                       feedback.important = "horizontal";
+                               } else {
+                                       feedback.important = "vertical";
+                               }
+                               options.using.call( this, props, feedback );
+                       };
+               }
+
+               elem.offset( $.extend( position, { using: using } ) );
+       } );
+};
+
+$.ui.position = {
+       fit: {
+               left: function( position, data ) {
+                       var within = data.within,
+                               withinOffset = within.isWindow ? 
within.scrollLeft : within.offset.left,
+                               outerWidth = within.width,
+                               collisionPosLeft = position.left - 
data.collisionPosition.marginLeft,
+                               overLeft = withinOffset - collisionPosLeft,
+                               overRight = collisionPosLeft + 
data.collisionWidth - outerWidth - withinOffset,
+                               newOverRight;
+
+                       // Element is wider than within
+                       if ( data.collisionWidth > outerWidth ) {
+
+                               // Element is initially over the left side of 
within
+                               if ( overLeft > 0 && overRight <= 0 ) {
+                                       newOverRight = position.left + overLeft 
+ data.collisionWidth - outerWidth -
+                                               withinOffset;
+                                       position.left += overLeft - 
newOverRight;
+
+                               // Element is initially over right side of 
within
+                               } else if ( overRight > 0 && overLeft <= 0 ) {
+                                       position.left = withinOffset;
+
+                               // Element is initially over both left and 
right sides of within
+                               } else {
+                                       if ( overLeft > overRight ) {
+                                               position.left = withinOffset + 
outerWidth - data.collisionWidth;
+                                       } else {
+                                               position.left = withinOffset;
+                                       }
+                               }
+
+                       // Too far left -> align with left edge
+                       } else if ( overLeft > 0 ) {
+                               position.left += overLeft;
+
+                       // Too far right -> align with right edge
+                       } else if ( overRight > 0 ) {
+                               position.left -= overRight;
+
+                       // Adjust based on position and margin
+                       } else {
+                               position.left = max( position.left - 
collisionPosLeft, position.left );
+                       }
+               },
+               top: function( position, data ) {
+                       var within = data.within,
+                               withinOffset = within.isWindow ? 
within.scrollTop : within.offset.top,
+                               outerHeight = data.within.height,
+                               collisionPosTop = position.top - 
data.collisionPosition.marginTop,
+                               overTop = withinOffset - collisionPosTop,
+                               overBottom = collisionPosTop + 
data.collisionHeight - outerHeight - withinOffset,
+                               newOverBottom;
+
+                       // Element is taller than within
+                       if ( data.collisionHeight > outerHeight ) {
+
+                               // Element is initially over the top of within
+                               if ( overTop > 0 && overBottom <= 0 ) {
+                                       newOverBottom = position.top + overTop 
+ data.collisionHeight - outerHeight -
+                                               withinOffset;
+                                       position.top += overTop - newOverBottom;
+
+                               // Element is initially over bottom of within
+                               } else if ( overBottom > 0 && overTop <= 0 ) {
+                                       position.top = withinOffset;
+
+                               // Element is initially over both top and 
bottom of within
+                               } else {
+                                       if ( overTop > overBottom ) {
+                                               position.top = withinOffset + 
outerHeight - data.collisionHeight;
+                                       } else {
+                                               position.top = withinOffset;
+                                       }
+                               }
+
+                       // Too far up -> align with top
+                       } else if ( overTop > 0 ) {
+                               position.top += overTop;
+
+                       // Too far down -> align with bottom edge
+                       } else if ( overBottom > 0 ) {
+                               position.top -= overBottom;
+
+                       // Adjust based on position and margin
+                       } else {
+                               position.top = max( position.top - 
collisionPosTop, position.top );
+                       }
+               }
+       },
+       flip: {
+               left: function( position, data ) {
+                       var within = data.within,
+                               withinOffset = within.offset.left + 
within.scrollLeft,
+                               outerWidth = within.width,
+                               offsetLeft = within.isWindow ? 
within.scrollLeft : within.offset.left,
+                               collisionPosLeft = position.left - 
data.collisionPosition.marginLeft,
+                               overLeft = collisionPosLeft - offsetLeft,
+                               overRight = collisionPosLeft + 
data.collisionWidth - outerWidth - offsetLeft,
+                               myOffset = data.my[ 0 ] === "left" ?
+                                       -data.elemWidth :
+                                       data.my[ 0 ] === "right" ?
+                                               data.elemWidth :
+                                               0,
+                               atOffset = data.at[ 0 ] === "left" ?
+                                       data.targetWidth :
+                                       data.at[ 0 ] === "right" ?
+                                               -data.targetWidth :
+                                               0,
+                               offset = -2 * data.offset[ 0 ],
+                               newOverRight,
+                               newOverLeft;
+
+                       if ( overLeft < 0 ) {
+                               newOverRight = position.left + myOffset + 
atOffset + offset + data.collisionWidth -
+                                       outerWidth - withinOffset;
+                               if ( newOverRight < 0 || newOverRight < abs( 
overLeft ) ) {
+                                       position.left += myOffset + atOffset + 
offset;
+                               }
+                       } else if ( overRight > 0 ) {
+                               newOverLeft = position.left - 
data.collisionPosition.marginLeft + myOffset +
+                                       atOffset + offset - offsetLeft;
+                               if ( newOverLeft > 0 || abs( newOverLeft ) < 
overRight ) {
+                                       position.left += myOffset + atOffset + 
offset;
+                               }
+                       }
+               },
+               top: function( position, data ) {
+                       var within = data.within,
+                               withinOffset = within.offset.top + 
within.scrollTop,
+                               outerHeight = within.height,
+                               offsetTop = within.isWindow ? within.scrollTop 
: within.offset.top,
+                               collisionPosTop = position.top - 
data.collisionPosition.marginTop,
+                               overTop = collisionPosTop - offsetTop,
+                               overBottom = collisionPosTop + 
data.collisionHeight - outerHeight - offsetTop,
+                               top = data.my[ 1 ] === "top",
+                               myOffset = top ?
+                                       -data.elemHeight :
+                                       data.my[ 1 ] === "bottom" ?
+                                               data.elemHeight :
+                                               0,
+                               atOffset = data.at[ 1 ] === "top" ?
+                                       data.targetHeight :
+                                       data.at[ 1 ] === "bottom" ?
+                                               -data.targetHeight :
+                                               0,
+                               offset = -2 * data.offset[ 1 ],
+                               newOverTop,
+                               newOverBottom;
+                       if ( overTop < 0 ) {
+                               newOverBottom = position.top + myOffset + 
atOffset + offset + data.collisionHeight -
+                                       outerHeight - withinOffset;
+                               if ( newOverBottom < 0 || newOverBottom < abs( 
overTop ) ) {
+                                       position.top += myOffset + atOffset + 
offset;
+                               }
+                       } else if ( overBottom > 0 ) {
+                               newOverTop = position.top - 
data.collisionPosition.marginTop + myOffset + atOffset +
+                                       offset - offsetTop;
+                               if ( newOverTop > 0 || abs( newOverTop ) < 
overBottom ) {
+                                       position.top += myOffset + atOffset + 
offset;
+                               }
+                       }
+               }
+       },
+       flipfit: {
+               left: function() {
+                       $.ui.position.flip.left.apply( this, arguments );
+                       $.ui.position.fit.left.apply( this, arguments );
+               },
+               top: function() {
+                       $.ui.position.flip.top.apply( this, arguments );
+                       $.ui.position.fit.top.apply( this, arguments );
+               }
+       }
+};
+
+} )();
+
+var position = $.ui.position;
+
+
+/*!
+ * jQuery UI :data 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: :data Selector
+//>>group: Core
+//>>description: Selects elements which have data stored under the specified 
key.
+//>>docs: http://api.jqueryui.com/data-selector/
+
+
+var data = $.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 ] );
+               }
+} );
+
+/*!
+ * jQuery UI Disable Selection 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: disableSelection
+//>>group: Core
+//>>description: Disable selection of text content within the set of matched 
elements.
+//>>docs: http://api.jqueryui.com/disableSelection/
+
+// This file is deprecated
+
+
+var disableSelection = $.fn.extend( {
+       disableSelection: ( function() {
+               var eventType = "onselectstart" in document.createElement( 
"div" ) ?
+                       "selectstart" :
+                       "mousedown";
+
+               return function() {
+                       return this.on( eventType + ".ui-disableSelection", 
function( event ) {
+                               event.preventDefault();
+                       } );
+               };
+       } )(),
+
+       enableSelection: function() {
+               return this.off( ".ui-disableSelection" );
+       }
+} );
+
+
+/*!
+ * jQuery UI Effects 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>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)
+       jQuery = $;
+
+$.effects = {
+       effect: {}
+};
+
+/*!
+ * jQuery Color Animations v2.1.2
+ * https://github.com/jquery/jquery-color
+ *
+ * Copyright 2014 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * Date: Wed Jan 16 08:47:09 2013 -0600
+ */
+( function( jQuery, undefined ) {
+
+       var stepHooks = "backgroundColor borderBottomColor borderLeftColor 
borderRightColor " +
+               "borderTopColor color columnRuleColor outlineColor 
textDecorationColor textEmphasisColor",
+
+       // Plusequals test for += 100 -= 100
+       rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
+
+       // 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 ) {
+                               return [
+                                       execResult[ 1 ],
+                                       execResult[ 2 ],
+                                       execResult[ 3 ],
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }, {
+                       re: 
/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ] * 2.55,
+                                       execResult[ 2 ] * 2.55,
+                                       execResult[ 3 ] * 2.55,
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }, {
+
+                       // 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 [
+                                       parseInt( execResult[ 1 ], 16 ),
+                                       parseInt( execResult[ 2 ], 16 ),
+                                       parseInt( execResult[ 3 ], 16 )
+                               ];
+                       }
+               }, {
+
+                       // 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 [
+                                       parseInt( execResult[ 1 ] + execResult[ 
1 ], 16 ),
+                                       parseInt( execResult[ 2 ] + execResult[ 
2 ], 16 ),
+                                       parseInt( execResult[ 3 ] + execResult[ 
3 ], 16 )
+                               ];
+                       }
+               }, {
+                       re: 
/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+                       space: "hsla",
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ],
+                                       execResult[ 2 ] / 100,
+                                       execResult[ 3 ] / 100,
+                                       execResult[ 4 ]
+                               ];
+                       }
+               } ],
+
+       // JQuery.Color( )
+       color = jQuery.Color = function( color, green, blue, alpha ) {
+               return new jQuery.Color.fn.parse( color, green, blue, alpha );
+       },
+       spaces = {
+               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"
+                               }
+                       }
+               }
+       },
+       propTypes = {
+               "byte": {
+                       floor: true,
+                       max: 255
+               },
+               "percent": {
+                       max: 1
+               },
+               "degrees": {
+                       mod: 360,
+                       floor: true
+               }
+       },
+       support = color.support = {},
+
+       // Element for support tests
+       supportElem = jQuery( "<p>" )[ 0 ],
+
+       // Colors = jQuery.Color.names
+       colors,
+
+       // Local aliases of functions called often
+       each = jQuery.each;
+
+// 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
+// for rgba and hsla spaces
+each( spaces, function( spaceName, space ) {
+       space.cache = "_" + spaceName;
+       space.props.alpha = {
+               idx: 3,
+               type: "percent",
+               def: 1
+       };
+} );
+
+function clamp( value, prop, allowEmpty ) {
+       var type = propTypes[ prop.type ] || {};
+
+       if ( value == null ) {
+               return ( allowEmpty || !prop.def ) ? null : prop.def;
+       }
+
+       // ~~ is an short way of doing floor for positive numbers
+       value = type.floor ? ~~value : parseFloat( value );
+
+       // IE will pass in empty strings as value for alpha,
+       // which will hit this case
+       if ( isNaN( value ) ) {
+               return prop.def;
+       }
+
+       if ( type.mod ) {
+
+               // We add mod before modding to make sure that negatives values
+               // get converted properly: -10 -> 350
+               return ( value + type.mod ) % type.mod;
+       }
+
+       // For now all property types without mod have min and max
+       return 0 > value ? 0 : type.max < value ? type.max : value;
+}
+
+function stringParse( string ) {
+       var inst = color(),
+               rgba = inst._rgba = [];
+
+       string = string.toLowerCase();
+
+       each( stringParsers, function( i, parser ) {
+               var parsed,
+                       match = parser.re.exec( string ),
+                       values = match && parser.parse( match ),
+                       spaceName = parser.space || "rgba";
+
+               if ( values ) {
+                       parsed = inst[ spaceName ]( values );
+
+                       // 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
+                       return false;
+               }
+       } );
+
+       // Found a stringParser that handled it
+       if ( rgba.length ) {
+
+               // 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 );
+               }
+               return inst;
+       }
+
+       // Named colors
+       return colors[ string ];
+}
+
+color.fn = jQuery.extend( color.prototype, {
+       parse: function( red, green, blue, alpha ) {
+               if ( red === undefined ) {
+                       this._rgba = [ null, null, null, null ];
+                       return this;
+               }
+               if ( red.jquery || red.nodeType ) {
+                       red = jQuery( red ).css( green );
+                       green = undefined;
+               }
+
+               var inst = this,
+                       type = jQuery.type( red ),
+                       rgba = this._rgba = [];
+
+               // More than 1 argument specified - assume ( red, green, blue, 
alpha )
+               if ( green !== undefined ) {
+                       red = [ red, green, blue, alpha ];
+                       type = "array";
+               }
+
+               if ( type === "string" ) {
+                       return this.parse( stringParse( red ) || 
colors._default );
+               }
+
+               if ( type === "array" ) {
+                       each( spaces.rgba.props, function( key, prop ) {
+                               rgba[ prop.idx ] = clamp( red[ prop.idx ], prop 
);
+                       } );
+                       return this;
+               }
+
+               if ( type === "object" ) {
+                       if ( red instanceof color ) {
+                               each( spaces, function( spaceName, space ) {
+                                       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 ( !inst[ cache ] && space.to 
) {
+
+                                                       // 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;
+                                                       }
+                                                       inst[ cache ] = 
space.to( inst._rgba );
+                                               }
+
+                                               // 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 ) {
+
+                                               // Use the default of 1
+                                               inst[ cache ][ 3 ] = 1;
+                                               if ( space.from ) {
+                                                       inst._rgba = 
space.from( inst[ cache ] );
+                                               }
+                                       }
+                               } );
+                       }
+                       return this;
+               }
+       },
+       is: function( compare ) {
+               var is = color( compare ),
+                       same = true,
+                       inst = this;
+
+               each( spaces, function( _, space ) {
+                       var localCache,
+                               isCache = is[ space.cache ];
+                       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() {
+               var used = [],
+                       inst = this;
+               each( spaces, function( spaceName, space ) {
+                       if ( inst[ space.cache ] ) {
+                               used.push( spaceName );
+                       }
+               } );
+               return used.pop();
+       },
+       transition: function( other, distance ) {
+               var end = color( other ),
+                       spaceName = end._space(),
+                       space = spaces[ spaceName ],
+                       startColor = this.alpha() === 0 ? color( "transparent" 
) : this,
+                       start = startColor[ space.cache ] || space.to( 
startColor._rgba ),
+                       result = start.slice();
+
+               end = end[ space.cache ];
+               each( space.props, function( key, prop ) {
+                       var index = prop.idx,
+                               startValue = start[ index ],
+                               endValue = end[ index ],
+                               type = propTypes[ prop.type ] || {};
+
+                       // If null, don't override start value
+                       if ( endValue === null ) {
+                               return;
+                       }
+
+                       // If null - use end
+                       if ( startValue === null ) {
+                               result[ index ] = endValue;
+                       } else {
+                               if ( type.mod ) {
+                                       if ( endValue - startValue > type.mod / 
2 ) {
+                                               startValue += type.mod;
+                                       } else if ( startValue - endValue > 
type.mod / 2 ) {
+                                               startValue -= type.mod;
+                                       }
+                               }
+                               result[ index ] = clamp( ( endValue - 
startValue ) * distance + startValue, prop );
+                       }
+               } );
+               return this[ spaceName ]( result );
+       },
+       blend: function( opaque ) {
+
+               // If we are already opaque - return ourself
+               if ( this._rgba[ 3 ] === 1 ) {
+                       return this;
+               }
+
+               var rgb = this._rgba.slice(),
+                       a = rgb.pop(),
+                       blend = color( opaque )._rgba;
+
+               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();
+                       prefix = "rgb(";
+               }
+
+               return prefix + rgba.join() + ")";
+       },
+       toHslaString: function() {
+               var prefix = "hsla(",
+                       hsla = jQuery.map( this.hsla(), function( v, i ) {
+                               if ( v == null ) {
+                                       v = i > 2 ? 1 : 0;
+                               }
+
+                               // Catch 1 and 2
+                               if ( i && i < 3 ) {
+                                       v = Math.round( v * 100 ) + "%";
+                               }
+                               return v;
+                       } );
+
+               if ( hsla[ 3 ] === 1 ) {
+                       hsla.pop();
+                       prefix = "hsl(";
+               }
+               return prefix + hsla.join() + ")";
+       },
+       toHexString: function( includeAlpha ) {
+               var rgba = this._rgba.slice(),
+                       alpha = rgba.pop();
+
+               if ( includeAlpha ) {
+                       rgba.push( ~~( alpha * 255 ) );
+               }
+
+               return "#" + jQuery.map( rgba, function( v ) {
+
+                       // Default to 0 when nulls exist
+                       v = ( v || 0 ).toString( 16 );
+                       return v.length === 1 ? "0" + v : v;
+               } ).join( "" );
+       },
+       toString: function() {
+               return this._rgba[ 3 ] === 0 ? "transparent" : 
this.toRgbaString();
+       }
+} );
+color.fn.parse.prototype = color.fn;
+
+// 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 ) {
+       h = ( h + 1 ) % 1;
+       if ( h * 6 < 1 ) {
+               return p + ( q - p ) * h * 6;
+       }
+       if ( h * 2 < 1 ) {
+               return q;
+       }
+       if ( h * 3 < 2 ) {
+               return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
+       }
+       return p;
+}
+
+spaces.hsla.to = function( rgba ) {
+       if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
+               return [ null, null, null, rgba[ 3 ] ];
+       }
+       var r = rgba[ 0 ] / 255,
+               g = rgba[ 1 ] / 255,
+               b = rgba[ 2 ] / 255,
+               a = rgba[ 3 ],
+               max = Math.max( r, g, b ),
+               min = Math.min( r, g, b ),
+               diff = max - min,
+               add = max + min,
+               l = add * 0.5,
+               h, s;
+
+       if ( min === max ) {
+               h = 0;
+       } else if ( r === max ) {
+               h = ( 60 * ( g - b ) / diff ) + 360;
+       } else if ( g === max ) {
+               h = ( 60 * ( b - r ) / diff ) + 120;
+       } else {
+               h = ( 60 * ( r - g ) / diff ) + 240;
+       }
+
+       // 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;
+       } else if ( l <= 0.5 ) {
+               s = diff / add;
+       } else {
+               s = diff / ( 2 - add );
+       }
+       return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
+};
+
+spaces.hsla.from = function( hsla ) {
+       if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
+               return [ null, null, null, hsla[ 3 ] ];
+       }
+       var h = hsla[ 0 ] / 360,
+               s = hsla[ 1 ],
+               l = hsla[ 2 ],
+               a = hsla[ 3 ],
+               q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
+               p = 2 * l - q;
+
+       return [
+               Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
+               Math.round( hue2rgb( p, q, h ) * 255 ),
+               Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
+               a
+       ];
+};
+
+each( spaces, function( spaceName, space ) {
+       var props = space.props,
+               cache = space.cache,
+               to = space.to,
+               from = space.from;
+
+       // Makes rgba() and hsla()
+       color.fn[ spaceName ] = function( value ) {
+
+               // Generate a cache for this space if it doesn't exist
+               if ( to && !this[ cache ] ) {
+                       this[ cache ] = to( this._rgba );
+               }
+               if ( value === undefined ) {
+                       return this[ cache ].slice();
+               }
+
+               var ret,
+                       type = jQuery.type( value ),
+                       arr = ( type === "array" || type === "object" ) ? value 
: arguments,
+                       local = this[ cache ].slice();
+
+               each( props, function( key, prop ) {
+                       var val = arr[ type === "object" ? key : prop.idx ];
+                       if ( val == null ) {
+                               val = local[ prop.idx ];
+                       }
+                       local[ prop.idx ] = clamp( val, prop );
+               } );
+
+               if ( from ) {
+                       ret = color( from( local ) );
+                       ret[ cache ] = local;
+                       return ret;
+               } else {
+                       return color( local );
+               }
+       };
+
+       // Makes red() green() blue() alpha() hue() saturation() lightness()
+       each( props, function( key, prop ) {
+
+               // Alpha is included in more than one space
+               if ( color.fn[ key ] ) {
+                       return;
+               }
+               color.fn[ key ] = function( value ) {
+                       var vtype = jQuery.type( value ),
+                               fn = ( key === "alpha" ? ( this._hsla ? "hsla" 
: "rgba" ) : spaceName ),
+                               local = this[ fn ](),
+                               cur = local[ prop.idx ],
+                               match;
+
+                       if ( vtype === "undefined" ) {
+                               return cur;
+                       }
+
+                       if ( vtype === "function" ) {
+                               value = value.call( this, cur );
+                               vtype = jQuery.type( value );
+                       }
+                       if ( value == null && prop.empty ) {
+                               return this;
+                       }
+                       if ( vtype === "string" ) {
+                               match = rplusequals.exec( value );
+                               if ( match ) {
+                                       value = cur + parseFloat( match[ 2 ] ) 
* ( match[ 1 ] === "+" ? 1 : -1 );
+                               }
+                       }
+                       local[ prop.idx ] = value;
+                       return this[ fn ]( local );
+               };
+       } );
+} );
+
+// 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( " " );
+       each( hooks, function( i, hook ) {
+               jQuery.cssHooks[ hook ] = {
+                       set: function( elem, value ) {
+                               var parsed, curElem,
+                                       backgroundColor = "";
+
+                               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" ) &&
+                                                       curElem && curElem.style
+                                               ) {
+                                                       try {
+                                                               backgroundColor 
= jQuery.css( curElem, "backgroundColor" );
+                                                               curElem = 
curElem.parentNode;
+                                                       } catch ( e ) {
+                                                       }
+                                               }
+
+                                               value = value.blend( 
backgroundColor && backgroundColor !== "transparent" ?
+                                                       backgroundColor :
+                                                       "_default" );
+                                       }
+
+                                       value = value.toRgbaString();
+                               }
+                               try {
+                                       elem.style[ hook ] = value;
+                               } catch ( e ) {
+
+                                       // Wrapped to prevent IE from throwing 
errors on "invalid" values like
+                                       // 'auto' or 'inherit'
+                               }
+                       }
+               };
+               jQuery.fx.step[ hook ] = function( fx ) {
+                       if ( !fx.colorInit ) {
+                               fx.start = color( fx.elem, hook );
+                               fx.end = color( fx.end );
+                               fx.colorInit = true;
+                       }
+                       jQuery.cssHooks[ hook ].set( fx.elem, 
fx.start.transition( fx.end, fx.pos ) );
+               };
+       } );
+
+};
+
+color.hook( stepHooks );
+
+jQuery.cssHooks.borderColor = {
+       expand: function( value ) {
+               var expanded = {};
+
+               each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) 
{
+                       expanded[ "border" + part + "Color" ] = value;
+               } );
+               return expanded;
+       }
+};
+
+// Basic color names only.
+// 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",
+       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",
+
+       // 4.2.3. "transparent" color keyword
+       transparent: [ null, null, null, 0 ],
+
+       _default: "#ffffff"
+};
+
+} )( jQuery );
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS 
******************************/
+/******************************************************************************/
+( function() {
+
+var classAnimationActions = [ "add", "remove", "toggle" ],
+       shorthandStyles = {
+               border: 1,
+               borderBottom: 1,
+               borderColor: 1,
+               borderLeft: 1,
+               borderRight: 1,
+               borderTop: 1,
+               borderWidth: 1,
+               margin: 1,
+               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;
+                       }
+               };
+       }
+);
+
+function getElementStyles( elem ) {
+       var key, len,
+               style = elem.ownerDocument.defaultView ?
+                       elem.ownerDocument.defaultView.getComputedStyle( elem, 
null ) :
+                       elem.currentStyle,
+               styles = {};
+
+       if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
+               len = style.length;
+               while ( len-- ) {
+                       key = style[ len ];
+                       if ( typeof style[ key ] === "string" ) {
+                               styles[ $.camelCase( key ) ] = style[ key ];
+                       }
+               }
+
+       // Support: Opera, IE <9
+       } else {
+               for ( key in style ) {
+                       if ( typeof style[ key ] === "string" ) {
+                               styles[ key ] = style[ key ];
+                       }
+               }
+       }
+
+       return styles;
+}
+
+function styleDifference( oldStyle, newStyle ) {
+       var diff = {},
+               name, value;
+
+       for ( name in newStyle ) {
+               value = newStyle[ name ];
+               if ( oldStyle[ name ] !== value ) {
+                       if ( !shorthandStyles[ name ] ) {
+                               if ( $.fx.step[ name ] || !isNaN( parseFloat( 
value ) ) ) {
+                                       diff[ name ] = value;
+                               }
+                       }
+               }
+       }
+
+       return diff;
+}
+
+// Support: jQuery <1.8
+if ( !$.fn.addBack ) {
+       $.fn.addBack = function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter( selector )
+               );
+       };
+}
+
+$.effects.animateClass = function( value, duration, easing, callback ) {
+       var o = $.speed( duration, easing, callback );
+
+       return this.queue( function() {
+               var animated = $( this ),
+                       baseClass = animated.attr( "class" ) || "",
+                       applyClassChange,
+                       allAnimations = o.children ? animated.find( "*" 
).addBack() : animated;
+
+               // 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
+               applyClassChange = function() {
+                       $.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() {
+                       this.end = getElementStyles( this.el[ 0 ] );
+                       this.diff = styleDifference( this.start, this.end );
+                       return this;
+               } );
+
+               // Apply original class
+               animated.attr( "class", baseClass );
+
+               // Map all animated objects again - this time collecting a 
promise
+               allAnimations = allAnimations.map( function() {
+                       var styleInfo = this,
+                               dfd = $.Deferred(),
+                               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() {
+
+                       // Set the final class
+                       applyClassChange();
+
+                       // For each animated element,
+                       // clear all css properties that were animated
+                       $.each( arguments, function() {
+                               var el = this.el;
+                               $.each( this.diff, function( key ) {
+                                       el.css( key, "" );
+                               } );
+                       } );
+
+                       // 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 ) {
+               return function( classNames, speed, easing, callback ) {
+                       return speed ?
+                               $.effects.animateClass.call( this,
+                                       { add: classNames }, speed, easing, 
callback ) :
+                               orig.apply( this, arguments );
+               };
+       } )( $.fn.addClass ),
+
+       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 ),
+
+       toggleClass: ( function( orig ) {
+               return function( classNames, force, speed, easing, callback ) {
+                       if ( typeof force === "boolean" || force === undefined 
) {
+                               if ( !speed ) {
+
+                                       // Without speed parameter
+                                       return orig.apply( this, arguments );
+                               } else {
+                                       return $.effects.animateClass.call( 
this,
+                                               ( force ? { add: classNames } : 
{ remove: classNames } ),
+                                               speed, easing, callback );
+                               }
+                       } else {
+
+                               // Without force parameter
+                               return $.effects.animateClass.call( this,
+                                       { toggle: classNames }, force, speed, 
easing );
+                       }
+               };
+       } )( $.fn.toggleClass ),
+
+       switchClass: function( remove, add, speed, easing, callback ) {
+               return $.effects.animateClass.call( this, {
+                       add: add,
+                       remove: remove
+               }, speed, easing, callback );
+       }
+} );
+
+} )();
+
+/******************************************************************************/
+/*********************************** EFFECTS 
**********************************/
+/******************************************************************************/
+
+( function() {
+
+if ( $.expr && $.expr.filters && $.expr.filters.animated ) {
+       $.expr.filters.animated = ( function( orig ) {
+               return function( elem ) {
+                       return !!$( elem ).data( dataSpaceAnimated ) || orig( 
elem );
+               };
+       } )( $.expr.filters.animated );
+}
+
+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 = 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" );
+                               }
+                       }
+
+                       return element;
+               }
+       } );
+}
+
+$.extend( $.effects, {
+       version: "1.12.1",
+
+       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 );
+       },
+
+       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
+       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;
+               }
+
+               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;
+               }
+
+               return {
+                       x: x,
+                       y: y
+               };
+       },
+
+       // 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" )
+                       } )
+                       .outerWidth( element.outerWidth() )
+                       .outerHeight( element.outerHeight() )
+                       .addClass( "ui-effects-placeholder" );
+
+                       element.data( dataSpace + "placeholder", placeholder );
+               }
+
+               element.css( {
+                       position: cssPosition,
+                       left: position.left,
+                       top: position.top
+               } );
+
+               return placeholder;
+       },
+
+       removePlaceholder: function( element ) {
+               var dataKey = dataSpace + "placeholder",
+                               placeholder = element.data( dataKey );
+
+               if ( placeholder ) {
+                       placeholder.remove();
+                       element.removeData( dataKey );
+               }
+       },
+
+       // 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 ) {
+               value = value || {};
+               $.each( list, function( i, x ) {
+                       var unit = element.cssUnit( x );
+                       if ( unit[ 0 ] > 0 ) {
+                               value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
+                       }
+               } );
+               return value;
+       }
+} );
+
+// Return an effect options object for the given parameters:
+function _normalizeArguments( effect, options, speed, callback ) {
+
+       // Allow passing all options as the first parameter
+       if ( $.isPlainObject( effect ) ) {
+               options = effect;
+               effect = effect.effect;
+       }
+
+       // Convert to an object
+       effect = { effect: effect };
+
+       // Catch (effect, null, ...)
+       if ( options == null ) {
+               options = {};
+       }
+
+       // Catch (effect, callback)
+       if ( $.isFunction( options ) ) {
+               callback = options;
+               speed = null;
+               options = {};
+       }
+
+       // Catch (effect, speed, ?)
+       if ( typeof options === "number" || $.fx.speeds[ options ] ) {
+               callback = speed;
+               speed = options;
+               options = {};
+       }
+
+       // Catch (effect, options, callback)
+       if ( $.isFunction( speed ) ) {
+               callback = speed;
+               speed = null;
+       }
+
+       // Add options to effect
+       if ( options ) {
+               $.extend( effect, options );
+       }
+
+       speed = speed || options.duration;
+       effect.duration = $.fx.off ? 0 :
+               typeof speed === "number" ? speed :
+               speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+               $.fx.speeds._default;
+
+       effect.complete = callback || options.complete;
+
+       return effect;
+}
+
+function standardAnimationOption( option ) {
+
+       // Valid standard speeds (nothing, number, named speed)
+       if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
+               return true;
+       }
+
+       // Invalid strings - treat as "normal" speed
+       if ( typeof option === "string" && !$.effects.effect[ option ] ) {
+               return true;
+       }
+
+       // Complete callback
+       if ( $.isFunction( option ) ) {
+               return true;
+       }
+
+       // Options hash (but not naming an effect)
+       if ( typeof option === "object" && !option.effect ) {
+               return true;
+       }
+
+       // Didn't match any standard API
+       return false;
+}
+
+$.fn.extend( {
+       effect: function( /* effect, options, speed, callback */ ) {
+               var args = _normalizeArguments.apply( this, arguments ),
+                       effectMethod = $.effects.effect[ args.effect ],
+                       defaultMode = effectMethod.mode,
+                       queue = args.queue,
+                       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
+                       if ( mode ) {
+                               return this[ mode ]( args.duration, complete );
+                       } else {
+                               return this.each( function() {
+                                       if ( complete ) {
+                                               complete.call( this );
+                                       }
+                               } );
+                       }
+               }
+
+               function run( next ) {
+                       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 ] );
+                               }
+
+                               if ( $.isFunction( next ) ) {
+                                       next();
+                               }
+                       }
+
+                       // 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 {
+                               if ( args.mode === "none" ) {
+
+                                       // Call the core method to track 
"olddisplay" properly
+                                       elem[ mode ]();
+                                       done();
+                               } else {
+                                       effectMethod.call( elem[ 0 ], args, 
cleanup );
+                               }
+                       }
+               }
+
+               // 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 ) {
+               return function( option ) {
+                       if ( standardAnimationOption( option ) ) {
+                               return orig.apply( this, arguments );
+                       } else {
+                               var args = _normalizeArguments.apply( this, 
arguments );
+                               args.mode = "show";
+                               return this.effect.call( this, args );
+                       }
+               };
+       } )( $.fn.show ),
+
+       hide: ( function( orig ) {
+               return function( option ) {
+                       if ( standardAnimationOption( option ) ) {
+                               return orig.apply( this, arguments );
+                       } else {
+                               var args = _normalizeArguments.apply( this, 
arguments );
+                               args.mode = "hide";
+                               return this.effect.call( this, args );
+                       }
+               };
+       } )( $.fn.hide ),
+
+       toggle: ( function( orig ) {
+               return function( option ) {
+                       if ( standardAnimationOption( option ) || typeof option 
=== "boolean" ) {
+                               return orig.apply( this, arguments );
+                       } else {
+                               var args = _normalizeArguments.apply( this, 
arguments );
+                               args.mode = "toggle";
+                               return this.effect.call( this, args );
+                       }
+               };
+       } )( $.fn.toggle ),
+
+       cssUnit: function( key ) {
+               var style = this.css( key ),
+                       val = [];
+
+               $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
+                       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() {
+
+// Based on easing equations from Robert Penner 
(http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+       baseEasings[ name ] = function( p ) {
+               return Math.pow( p, i + 2 );
+       };
+} );
+
+$.extend( baseEasings, {
+       Sine: function( p ) {
+               return 1 - Math.cos( p * Math.PI / 2 );
+       },
+       Circ: function( p ) {
+               return 1 - Math.sqrt( 1 - p * p );
+       },
+       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 );
+       },
+       Back: function( p ) {
+               return p * p * ( 3 * p - 2 );
+       },
+       Bounce: function( p ) {
+               var pow2,
+                       bounce = 4;
+
+               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;
+       $.easing[ "easeOut" + name ] = function( p ) {
+               return 1 - easeIn( 1 - p );
+       };
+       $.easing[ "easeInOut" + name ] = function( p ) {
+               return p < 0.5 ?
+                       easeIn( p * 2 ) / 2 :
+                       1 - easeIn( p * -2 + 2 ) / 2;
+       };
+} );
+
+} )();
+
+var effect = $.effects;
+
+
+/*!
+ * jQuery UI Effects Blind 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Blind Effect
+//>>group: Effects
+//>>description: Blinds the element.
+//>>docs: http://api.jqueryui.com/blind-effect/
+//>>demos: http://jqueryui.com/effect/
+
+
+
+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;
+       }
+
+       if ( placeholder ) {
+               placeholder.animate( $.effects.clipToBox( animate ), 
options.duration, options.easing );
+       }
+
+       element.animate( animate, {
+               queue: false,
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
+} );
+
+
+/*!
+ * jQuery UI Effects Bounce 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>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 effectsEffectBounce = $.effects.define( "bounce", function( options, done 
) {
+       var upAnim, downAnim, refValue,
+               element = $( this ),
+
+               // Defaults:
+               mode = options.mode,
+               hide = mode === "hide",
+               show = mode === "show",
+               direction = options.direction || "up",
+               distance = options.distance,
+               times = options.times || 5,
+
+               // Number of internal animations
+               anims = times * 2 + ( show || hide ? 1 : 0 ),
+               speed = options.duration / anims,
+               easing = options.easing,
+
+               // Utility:
+               ref = ( direction === "up" || direction === "down" ) ? "top" : 
"left",
+               motion = ( direction === "up" || direction === "left" ),
+               i = 0,
+
+               queuelen = element.queue().length;
+
+       $.effects.createPlaceholder( element );
+
+       refValue = element.css( ref );
+
+       // Default distance for the BIGGEST bounce is the outer Distance / 3
+       if ( !distance ) {
+               distance = element[ ref === "top" ? "outerHeight" : 
"outerWidth" ]() / 3;
+       }
+
+       if ( show ) {
+               downAnim = { opacity: 1 };
+               downAnim[ ref ] = refValue;
+
+               // If we are showing, force opacity 0 and set the initial 
position
+               // then do the "first" animation
+               element
+                       .css( "opacity", 0 )
+                       .css( ref, motion ? -distance * 2 : distance * 2 )
+                       .animate( downAnim, speed, easing );
+       }
+
+       // Start at the smallest distance if we are hiding
+       if ( hide ) {
+               distance = distance / Math.pow( 2, times - 1 );
+       }
+
+       downAnim = {};
+       downAnim[ ref ] = refValue;
+
+       // Bounces up/down/left/right then back to 0 -- times * 2 animations 
happen here
+       for ( ; i < times; i++ ) {
+               upAnim = {};
+               upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+               element
+                       .animate( upAnim, speed, easing )
+                       .animate( downAnim, speed, easing );
+
+               distance = hide ? distance * 2 : distance / 2;
+       }
+
+       // Last Bounce when Hiding
+       if ( hide ) {
+               upAnim = { opacity: 0 };
+               upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+               element.animate( upAnim, speed, easing );
+       }
+
+       element.queue( done );
+
+       $.effects.unshift( element, queuelen, anims + 1 );
+} );
+
+
+/*!
+ * jQuery UI Effects Clip 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>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
+       };
+
+       $.effects.createPlaceholder( element );
+
+       if ( options.mode === "show" ) {
+               element.cssClip( animate.clip );
+               animate.clip = start;
+       }
+
+       element.animate( animate, {
+               queue: false,
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
+
+} );
+
+
+/*!
+ * jQuery UI Effects Drop 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>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 effectsEffectDrop = $.effects.define( "drop", "hide", function( options, 
done ) {
+
+       var distance,
+               element = $( this ),
+               mode = options.mode,
+               show = mode === "show",
+               direction = options.direction || "left",
+               ref = ( direction === "up" || direction === "down" ) ? "top" : 
"left",
+               motion = ( direction === "up" || direction === "left" ) ? "-=" 
: "+=",
+               oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
+               animation = {
+                       opacity: 0
+               };
+
+       $.effects.createPlaceholder( element );
+
+       distance = options.distance ||
+               element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) 
/ 2;
+
+       animation[ ref ] = motion + distance;
+
+       if ( show ) {
+               element.css( animation );
+
+               animation[ ref ] = oppositeMotion + distance;
+               animation.opacity = 1;
+       }
+
+       // Animate
+       element.animate( animation, {
+               queue: false,
+               duration: options.duration,
+               easing: options.easing,
+               complete: done
+       } );
+} );
+
+
+/*!
+ * jQuery UI Effects Explode 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>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 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,
+               element = $( this ),
+               mode = options.mode,
+               show = mode === "show",
+
+               // Show and then visibility:hidden the element before 
calculating offset
+               offset = element.show().css( "visibility", "hidden" ).offset(),
+
+               // Width and height of a piece
+               width = Math.ceil( element.outerWidth() / cells ),
+               height = Math.ceil( element.outerHeight() / rows ),
+               pieces = [];
+
+       // Children animate complete:
+       function childComplete() {
+               pieces.push( this );
+               if ( pieces.length === rows * cells ) {
+                       animComplete();
+               }
+       }
+
+       // Clone the element for each row and cell.
+       for ( i = 0; i < rows; i++ ) { // ===>
+               top = offset.top + i * height;
+               my = i - ( rows - 1 ) / 2;
+
+               for ( j = 0; j < cells; j++ ) { // |||
+                       left = offset.left + j * width;
+                       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
+                       element
+                               .clone()
+                               .appendTo( "body" )
+                               .wrap( "<div><

<TRUNCATED>

Reply via email to