|  | @@ -0,0 +1,1769 @@
 | 
	
		
			
				|  |  | +/*! jQuery UI - v1.12.1 - 2021-06-03
 | 
	
		
			
				|  |  | +* http://jqueryui.com
 | 
	
		
			
				|  |  | +* Includes: widget.js, keycode.js, unique-id.js, widgets/tabs.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 Keycode 1.12.1
 | 
	
		
			
				|  |  | + * http://jqueryui.com
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Copyright jQuery Foundation and other contributors
 | 
	
		
			
				|  |  | + * Released under the MIT license.
 | 
	
		
			
				|  |  | + * http://jquery.org/license
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//>>label: Keycode
 | 
	
		
			
				|  |  | +//>>group: Core
 | 
	
		
			
				|  |  | +//>>description: Provide keycodes as keynames
 | 
	
		
			
				|  |  | +//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var keycode = $.ui.keyCode = {
 | 
	
		
			
				|  |  | +	BACKSPACE: 8,
 | 
	
		
			
				|  |  | +	COMMA: 188,
 | 
	
		
			
				|  |  | +	DELETE: 46,
 | 
	
		
			
				|  |  | +	DOWN: 40,
 | 
	
		
			
				|  |  | +	END: 35,
 | 
	
		
			
				|  |  | +	ENTER: 13,
 | 
	
		
			
				|  |  | +	ESCAPE: 27,
 | 
	
		
			
				|  |  | +	HOME: 36,
 | 
	
		
			
				|  |  | +	LEFT: 37,
 | 
	
		
			
				|  |  | +	PAGE_DOWN: 34,
 | 
	
		
			
				|  |  | +	PAGE_UP: 33,
 | 
	
		
			
				|  |  | +	PERIOD: 190,
 | 
	
		
			
				|  |  | +	RIGHT: 39,
 | 
	
		
			
				|  |  | +	SPACE: 32,
 | 
	
		
			
				|  |  | +	TAB: 9,
 | 
	
		
			
				|  |  | +	UP: 38
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*!
 | 
	
		
			
				|  |  | + * jQuery UI Unique ID 1.12.1
 | 
	
		
			
				|  |  | + * http://jqueryui.com
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Copyright jQuery Foundation and other contributors
 | 
	
		
			
				|  |  | + * Released under the MIT license.
 | 
	
		
			
				|  |  | + * http://jquery.org/license
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//>>label: uniqueId
 | 
	
		
			
				|  |  | +//>>group: Core
 | 
	
		
			
				|  |  | +//>>description: Functions to generate and remove uniqueId's
 | 
	
		
			
				|  |  | +//>>docs: http://api.jqueryui.com/uniqueId/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var uniqueId = $.fn.extend( {
 | 
	
		
			
				|  |  | +	uniqueId: ( function() {
 | 
	
		
			
				|  |  | +		var uuid = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return function() {
 | 
	
		
			
				|  |  | +			return this.each( function() {
 | 
	
		
			
				|  |  | +				if ( !this.id ) {
 | 
	
		
			
				|  |  | +					this.id = "ui-id-" + ( ++uuid );
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +		};
 | 
	
		
			
				|  |  | +	} )(),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	removeUniqueId: function() {
 | 
	
		
			
				|  |  | +		return this.each( function() {
 | 
	
		
			
				|  |  | +			if ( /^ui-id-\d+$/.test( this.id ) ) {
 | 
	
		
			
				|  |  | +				$( this ).removeAttr( "id" );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Internal use only
 | 
	
		
			
				|  |  | +var escapeSelector = $.ui.escapeSelector = ( function() {
 | 
	
		
			
				|  |  | +	var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
 | 
	
		
			
				|  |  | +	return function( selector ) {
 | 
	
		
			
				|  |  | +		return selector.replace( selectorEscape, "\\$1" );
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +} )();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var safeActiveElement = $.ui.safeActiveElement = function( document ) {
 | 
	
		
			
				|  |  | +	var activeElement;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Support: IE 9 only
 | 
	
		
			
				|  |  | +	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
 | 
	
		
			
				|  |  | +	try {
 | 
	
		
			
				|  |  | +		activeElement = document.activeElement;
 | 
	
		
			
				|  |  | +	} catch ( error ) {
 | 
	
		
			
				|  |  | +		activeElement = document.body;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Support: IE 9 - 11 only
 | 
	
		
			
				|  |  | +	// IE may return null instead of an element
 | 
	
		
			
				|  |  | +	// Interestingly, this only seems to occur when NOT in an iframe
 | 
	
		
			
				|  |  | +	if ( !activeElement ) {
 | 
	
		
			
				|  |  | +		activeElement = document.body;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Support: IE 11 only
 | 
	
		
			
				|  |  | +	// IE11 returns a seemingly empty object in some cases when accessing
 | 
	
		
			
				|  |  | +	// document.activeElement from an <iframe>
 | 
	
		
			
				|  |  | +	if ( !activeElement.nodeName ) {
 | 
	
		
			
				|  |  | +		activeElement = document.body;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return activeElement;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*!
 | 
	
		
			
				|  |  | + * jQuery UI Tabs 1.12.1
 | 
	
		
			
				|  |  | + * http://jqueryui.com
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Copyright jQuery Foundation and other contributors
 | 
	
		
			
				|  |  | + * Released under the MIT license.
 | 
	
		
			
				|  |  | + * http://jquery.org/license
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//>>label: Tabs
 | 
	
		
			
				|  |  | +//>>group: Widgets
 | 
	
		
			
				|  |  | +//>>description: Transforms a set of container elements into a tab structure.
 | 
	
		
			
				|  |  | +//>>docs: http://api.jqueryui.com/tabs/
 | 
	
		
			
				|  |  | +//>>demos: http://jqueryui.com/tabs/
 | 
	
		
			
				|  |  | +//>>css.structure: ../../themes/base/core.css
 | 
	
		
			
				|  |  | +//>>css.structure: ../../themes/base/tabs.css
 | 
	
		
			
				|  |  | +//>>css.theme: ../../themes/base/theme.css
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +$.widget( "ui.tabs", {
 | 
	
		
			
				|  |  | +	version: "1.12.1",
 | 
	
		
			
				|  |  | +	delay: 300,
 | 
	
		
			
				|  |  | +	options: {
 | 
	
		
			
				|  |  | +		active: null,
 | 
	
		
			
				|  |  | +		classes: {
 | 
	
		
			
				|  |  | +			"ui-tabs": "ui-corner-all",
 | 
	
		
			
				|  |  | +			"ui-tabs-nav": "ui-corner-all",
 | 
	
		
			
				|  |  | +			"ui-tabs-panel": "ui-corner-bottom",
 | 
	
		
			
				|  |  | +			"ui-tabs-tab": "ui-corner-top"
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  | +		collapsible: false,
 | 
	
		
			
				|  |  | +		event: "click",
 | 
	
		
			
				|  |  | +		heightStyle: "content",
 | 
	
		
			
				|  |  | +		hide: null,
 | 
	
		
			
				|  |  | +		show: null,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Callbacks
 | 
	
		
			
				|  |  | +		activate: null,
 | 
	
		
			
				|  |  | +		beforeActivate: null,
 | 
	
		
			
				|  |  | +		beforeLoad: null,
 | 
	
		
			
				|  |  | +		load: null
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_isLocal: ( function() {
 | 
	
		
			
				|  |  | +		var rhash = /#.*$/;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return function( anchor ) {
 | 
	
		
			
				|  |  | +			var anchorUrl, locationUrl;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			anchorUrl = anchor.href.replace( rhash, "" );
 | 
	
		
			
				|  |  | +			locationUrl = location.href.replace( rhash, "" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				anchorUrl = decodeURIComponent( anchorUrl );
 | 
	
		
			
				|  |  | +			} catch ( error ) {}
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				locationUrl = decodeURIComponent( locationUrl );
 | 
	
		
			
				|  |  | +			} catch ( error ) {}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			return anchor.hash.length > 1 && anchorUrl === locationUrl;
 | 
	
		
			
				|  |  | +		};
 | 
	
		
			
				|  |  | +	} )(),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_create: function() {
 | 
	
		
			
				|  |  | +		var that = this,
 | 
	
		
			
				|  |  | +			options = this.options;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.running = false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
 | 
	
		
			
				|  |  | +		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._processTabs();
 | 
	
		
			
				|  |  | +		options.active = this._initialActive();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Take disabling tabs via class attribute from HTML
 | 
	
		
			
				|  |  | +		// into account and update option properly.
 | 
	
		
			
				|  |  | +		if ( $.isArray( options.disabled ) ) {
 | 
	
		
			
				|  |  | +			options.disabled = $.unique( options.disabled.concat(
 | 
	
		
			
				|  |  | +				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
 | 
	
		
			
				|  |  | +					return that.tabs.index( li );
 | 
	
		
			
				|  |  | +				} )
 | 
	
		
			
				|  |  | +			) ).sort();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Check for length avoids error when initializing empty list
 | 
	
		
			
				|  |  | +		if ( this.options.active !== false && this.anchors.length ) {
 | 
	
		
			
				|  |  | +			this.active = this._findActive( options.active );
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			this.active = $();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._refresh();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( this.active.length ) {
 | 
	
		
			
				|  |  | +			this.load( options.active );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_initialActive: function() {
 | 
	
		
			
				|  |  | +		var active = this.options.active,
 | 
	
		
			
				|  |  | +			collapsible = this.options.collapsible,
 | 
	
		
			
				|  |  | +			locationHash = location.hash.substring( 1 );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( active === null ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// check the fragment identifier in the URL
 | 
	
		
			
				|  |  | +			if ( locationHash ) {
 | 
	
		
			
				|  |  | +				this.tabs.each( function( i, tab ) {
 | 
	
		
			
				|  |  | +					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
 | 
	
		
			
				|  |  | +						active = i;
 | 
	
		
			
				|  |  | +						return false;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Check for a tab marked active via a class
 | 
	
		
			
				|  |  | +			if ( active === null ) {
 | 
	
		
			
				|  |  | +				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// No active tab, set to false
 | 
	
		
			
				|  |  | +			if ( active === null || active === -1 ) {
 | 
	
		
			
				|  |  | +				active = this.tabs.length ? 0 : false;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Handle numbers: negative, out of range
 | 
	
		
			
				|  |  | +		if ( active !== false ) {
 | 
	
		
			
				|  |  | +			active = this.tabs.index( this.tabs.eq( active ) );
 | 
	
		
			
				|  |  | +			if ( active === -1 ) {
 | 
	
		
			
				|  |  | +				active = collapsible ? false : 0;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Don't allow collapsible: false and active: false
 | 
	
		
			
				|  |  | +		if ( !collapsible && active === false && this.anchors.length ) {
 | 
	
		
			
				|  |  | +			active = 0;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return active;
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_getCreateEventData: function() {
 | 
	
		
			
				|  |  | +		return {
 | 
	
		
			
				|  |  | +			tab: this.active,
 | 
	
		
			
				|  |  | +			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
 | 
	
		
			
				|  |  | +		};
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_tabKeydown: function( event ) {
 | 
	
		
			
				|  |  | +		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
 | 
	
		
			
				|  |  | +			selectedIndex = this.tabs.index( focusedTab ),
 | 
	
		
			
				|  |  | +			goingForward = true;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( this._handlePageNav( event ) ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		switch ( event.keyCode ) {
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.RIGHT:
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.DOWN:
 | 
	
		
			
				|  |  | +			selectedIndex++;
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.UP:
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.LEFT:
 | 
	
		
			
				|  |  | +			goingForward = false;
 | 
	
		
			
				|  |  | +			selectedIndex--;
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.END:
 | 
	
		
			
				|  |  | +			selectedIndex = this.anchors.length - 1;
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.HOME:
 | 
	
		
			
				|  |  | +			selectedIndex = 0;
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.SPACE:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Activate only, no collapsing
 | 
	
		
			
				|  |  | +			event.preventDefault();
 | 
	
		
			
				|  |  | +			clearTimeout( this.activating );
 | 
	
		
			
				|  |  | +			this._activate( selectedIndex );
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		case $.ui.keyCode.ENTER:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Toggle (cancel delayed activation, allow collapsing)
 | 
	
		
			
				|  |  | +			event.preventDefault();
 | 
	
		
			
				|  |  | +			clearTimeout( this.activating );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Determine if we should collapse or activate
 | 
	
		
			
				|  |  | +			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		default:
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Focus the appropriate tab, based on which key was pressed
 | 
	
		
			
				|  |  | +		event.preventDefault();
 | 
	
		
			
				|  |  | +		clearTimeout( this.activating );
 | 
	
		
			
				|  |  | +		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Navigating with control/command key will prevent automatic activation
 | 
	
		
			
				|  |  | +		if ( !event.ctrlKey && !event.metaKey ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Update aria-selected immediately so that AT think the tab is already selected.
 | 
	
		
			
				|  |  | +			// Otherwise AT may confuse the user by stating that they need to activate the tab,
 | 
	
		
			
				|  |  | +			// but the tab will already be activated by the time the announcement finishes.
 | 
	
		
			
				|  |  | +			focusedTab.attr( "aria-selected", "false" );
 | 
	
		
			
				|  |  | +			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			this.activating = this._delay( function() {
 | 
	
		
			
				|  |  | +				this.option( "active", selectedIndex );
 | 
	
		
			
				|  |  | +			}, this.delay );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_panelKeydown: function( event ) {
 | 
	
		
			
				|  |  | +		if ( this._handlePageNav( event ) ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Ctrl+up moves focus to the current tab
 | 
	
		
			
				|  |  | +		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
 | 
	
		
			
				|  |  | +			event.preventDefault();
 | 
	
		
			
				|  |  | +			this.active.trigger( "focus" );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Alt+page up/down moves focus to the previous/next tab (and activates)
 | 
	
		
			
				|  |  | +	_handlePageNav: function( event ) {
 | 
	
		
			
				|  |  | +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
 | 
	
		
			
				|  |  | +			this._activate( this._focusNextTab( this.options.active - 1, false ) );
 | 
	
		
			
				|  |  | +			return true;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
 | 
	
		
			
				|  |  | +			this._activate( this._focusNextTab( this.options.active + 1, true ) );
 | 
	
		
			
				|  |  | +			return true;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_findNextTab: function( index, goingForward ) {
 | 
	
		
			
				|  |  | +		var lastTabIndex = this.tabs.length - 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		function constrain() {
 | 
	
		
			
				|  |  | +			if ( index > lastTabIndex ) {
 | 
	
		
			
				|  |  | +				index = 0;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if ( index < 0 ) {
 | 
	
		
			
				|  |  | +				index = lastTabIndex;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			return index;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
 | 
	
		
			
				|  |  | +			index = goingForward ? index + 1 : index - 1;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return index;
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_focusNextTab: function( index, goingForward ) {
 | 
	
		
			
				|  |  | +		index = this._findNextTab( index, goingForward );
 | 
	
		
			
				|  |  | +		this.tabs.eq( index ).trigger( "focus" );
 | 
	
		
			
				|  |  | +		return index;
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_setOption: function( key, value ) {
 | 
	
		
			
				|  |  | +		if ( key === "active" ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// _activate() will handle invalid values and update this.options
 | 
	
		
			
				|  |  | +			this._activate( value );
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._super( key, value );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( key === "collapsible" ) {
 | 
	
		
			
				|  |  | +			this._toggleClass( "ui-tabs-collapsible", null, value );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Setting collapsible: false while collapsed; open first panel
 | 
	
		
			
				|  |  | +			if ( !value && this.options.active === false ) {
 | 
	
		
			
				|  |  | +				this._activate( 0 );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( key === "event" ) {
 | 
	
		
			
				|  |  | +			this._setupEvents( value );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( key === "heightStyle" ) {
 | 
	
		
			
				|  |  | +			this._setupHeightStyle( value );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_sanitizeSelector: function( hash ) {
 | 
	
		
			
				|  |  | +		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	refresh: function() {
 | 
	
		
			
				|  |  | +		var options = this.options,
 | 
	
		
			
				|  |  | +			lis = this.tablist.children( ":has(a[href])" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Get disabled tabs from class attribute from HTML
 | 
	
		
			
				|  |  | +		// this will get converted to a boolean if needed in _refresh()
 | 
	
		
			
				|  |  | +		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
 | 
	
		
			
				|  |  | +			return lis.index( tab );
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._processTabs();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Was collapsed or no tabs
 | 
	
		
			
				|  |  | +		if ( options.active === false || !this.anchors.length ) {
 | 
	
		
			
				|  |  | +			options.active = false;
 | 
	
		
			
				|  |  | +			this.active = $();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// was active, but active tab is gone
 | 
	
		
			
				|  |  | +		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// all remaining tabs are disabled
 | 
	
		
			
				|  |  | +			if ( this.tabs.length === options.disabled.length ) {
 | 
	
		
			
				|  |  | +				options.active = false;
 | 
	
		
			
				|  |  | +				this.active = $();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// activate previous tab
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// was active, active tab still exists
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// make sure active index is correct
 | 
	
		
			
				|  |  | +			options.active = this.tabs.index( this.active );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._refresh();
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_refresh: function() {
 | 
	
		
			
				|  |  | +		this._setOptionDisabled( this.options.disabled );
 | 
	
		
			
				|  |  | +		this._setupEvents( this.options.event );
 | 
	
		
			
				|  |  | +		this._setupHeightStyle( this.options.heightStyle );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.tabs.not( this.active ).attr( {
 | 
	
		
			
				|  |  | +			"aria-selected": "false",
 | 
	
		
			
				|  |  | +			"aria-expanded": "false",
 | 
	
		
			
				|  |  | +			tabIndex: -1
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +		this.panels.not( this._getPanelForTab( this.active ) )
 | 
	
		
			
				|  |  | +			.hide()
 | 
	
		
			
				|  |  | +			.attr( {
 | 
	
		
			
				|  |  | +				"aria-hidden": "true"
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Make sure one tab is in the tab order
 | 
	
		
			
				|  |  | +		if ( !this.active.length ) {
 | 
	
		
			
				|  |  | +			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			this.active
 | 
	
		
			
				|  |  | +				.attr( {
 | 
	
		
			
				|  |  | +					"aria-selected": "true",
 | 
	
		
			
				|  |  | +					"aria-expanded": "true",
 | 
	
		
			
				|  |  | +					tabIndex: 0
 | 
	
		
			
				|  |  | +				} );
 | 
	
		
			
				|  |  | +			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
 | 
	
		
			
				|  |  | +			this._getPanelForTab( this.active )
 | 
	
		
			
				|  |  | +				.show()
 | 
	
		
			
				|  |  | +				.attr( {
 | 
	
		
			
				|  |  | +					"aria-hidden": "false"
 | 
	
		
			
				|  |  | +				} );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_processTabs: function() {
 | 
	
		
			
				|  |  | +		var that = this,
 | 
	
		
			
				|  |  | +			prevTabs = this.tabs,
 | 
	
		
			
				|  |  | +			prevAnchors = this.anchors,
 | 
	
		
			
				|  |  | +			prevPanels = this.panels;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.tablist = this._getList().attr( "role", "tablist" );
 | 
	
		
			
				|  |  | +		this._addClass( this.tablist, "ui-tabs-nav",
 | 
	
		
			
				|  |  | +			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Prevent users from focusing disabled tabs via click
 | 
	
		
			
				|  |  | +		this.tablist
 | 
	
		
			
				|  |  | +			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
 | 
	
		
			
				|  |  | +				if ( $( this ).is( ".ui-state-disabled" ) ) {
 | 
	
		
			
				|  |  | +					event.preventDefault();
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			} )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Support: IE <9
 | 
	
		
			
				|  |  | +			// Preventing the default action in mousedown doesn't prevent IE
 | 
	
		
			
				|  |  | +			// from focusing the element, so if the anchor gets focused, blur.
 | 
	
		
			
				|  |  | +			// We don't have to worry about focusing the previously focused
 | 
	
		
			
				|  |  | +			// element since clicking on a non-focusable element should focus
 | 
	
		
			
				|  |  | +			// the body anyway.
 | 
	
		
			
				|  |  | +			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
 | 
	
		
			
				|  |  | +				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
 | 
	
		
			
				|  |  | +					this.blur();
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.tabs = this.tablist.find( "> li:has(a[href])" )
 | 
	
		
			
				|  |  | +			.attr( {
 | 
	
		
			
				|  |  | +				role: "tab",
 | 
	
		
			
				|  |  | +				tabIndex: -1
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.anchors = this.tabs.map( function() {
 | 
	
		
			
				|  |  | +			return $( "a", this )[ 0 ];
 | 
	
		
			
				|  |  | +		} )
 | 
	
		
			
				|  |  | +			.attr( {
 | 
	
		
			
				|  |  | +				role: "presentation",
 | 
	
		
			
				|  |  | +				tabIndex: -1
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +		this._addClass( this.anchors, "ui-tabs-anchor" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.panels = $();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.anchors.each( function( i, anchor ) {
 | 
	
		
			
				|  |  | +			var selector, panel, panelId,
 | 
	
		
			
				|  |  | +				anchorId = $( anchor ).uniqueId().attr( "id" ),
 | 
	
		
			
				|  |  | +				tab = $( anchor ).closest( "li" ),
 | 
	
		
			
				|  |  | +				originalAriaControls = tab.attr( "aria-controls" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Inline tab
 | 
	
		
			
				|  |  | +			if ( that._isLocal( anchor ) ) {
 | 
	
		
			
				|  |  | +				selector = anchor.hash;
 | 
	
		
			
				|  |  | +				panelId = selector.substring( 1 );
 | 
	
		
			
				|  |  | +				panel = that.element.find( that._sanitizeSelector( selector ) );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// remote tab
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// If the tab doesn't already have aria-controls,
 | 
	
		
			
				|  |  | +				// generate an id by using a throw-away element
 | 
	
		
			
				|  |  | +				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
 | 
	
		
			
				|  |  | +				selector = "#" + panelId;
 | 
	
		
			
				|  |  | +				panel = that.element.find( selector );
 | 
	
		
			
				|  |  | +				if ( !panel.length ) {
 | 
	
		
			
				|  |  | +					panel = that._createPanel( panelId );
 | 
	
		
			
				|  |  | +					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				panel.attr( "aria-live", "polite" );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			if ( panel.length ) {
 | 
	
		
			
				|  |  | +				that.panels = that.panels.add( panel );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if ( originalAriaControls ) {
 | 
	
		
			
				|  |  | +				tab.data( "ui-tabs-aria-controls", originalAriaControls );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			tab.attr( {
 | 
	
		
			
				|  |  | +				"aria-controls": panelId,
 | 
	
		
			
				|  |  | +				"aria-labelledby": anchorId
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +			panel.attr( "aria-labelledby", anchorId );
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.panels.attr( "role", "tabpanel" );
 | 
	
		
			
				|  |  | +		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Avoid memory leaks (#10056)
 | 
	
		
			
				|  |  | +		if ( prevTabs ) {
 | 
	
		
			
				|  |  | +			this._off( prevTabs.not( this.tabs ) );
 | 
	
		
			
				|  |  | +			this._off( prevAnchors.not( this.anchors ) );
 | 
	
		
			
				|  |  | +			this._off( prevPanels.not( this.panels ) );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Allow overriding how to find the list for rare usage scenarios (#7715)
 | 
	
		
			
				|  |  | +	_getList: function() {
 | 
	
		
			
				|  |  | +		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_createPanel: function( id ) {
 | 
	
		
			
				|  |  | +		return $( "<div>" )
 | 
	
		
			
				|  |  | +			.attr( "id", id )
 | 
	
		
			
				|  |  | +			.data( "ui-tabs-destroy", true );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_setOptionDisabled: function( disabled ) {
 | 
	
		
			
				|  |  | +		var currentItem, li, i;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( $.isArray( disabled ) ) {
 | 
	
		
			
				|  |  | +			if ( !disabled.length ) {
 | 
	
		
			
				|  |  | +				disabled = false;
 | 
	
		
			
				|  |  | +			} else if ( disabled.length === this.anchors.length ) {
 | 
	
		
			
				|  |  | +				disabled = true;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Disable tabs
 | 
	
		
			
				|  |  | +		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
 | 
	
		
			
				|  |  | +			currentItem = $( li );
 | 
	
		
			
				|  |  | +			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
 | 
	
		
			
				|  |  | +				currentItem.attr( "aria-disabled", "true" );
 | 
	
		
			
				|  |  | +				this._addClass( currentItem, null, "ui-state-disabled" );
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				currentItem.removeAttr( "aria-disabled" );
 | 
	
		
			
				|  |  | +				this._removeClass( currentItem, null, "ui-state-disabled" );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.options.disabled = disabled;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
 | 
	
		
			
				|  |  | +			disabled === true );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_setupEvents: function( event ) {
 | 
	
		
			
				|  |  | +		var events = {};
 | 
	
		
			
				|  |  | +		if ( event ) {
 | 
	
		
			
				|  |  | +			$.each( event.split( " " ), function( index, eventName ) {
 | 
	
		
			
				|  |  | +				events[ eventName ] = "_eventHandler";
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Always prevent the default action, even when disabled
 | 
	
		
			
				|  |  | +		this._on( true, this.anchors, {
 | 
	
		
			
				|  |  | +			click: function( event ) {
 | 
	
		
			
				|  |  | +				event.preventDefault();
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +		this._on( this.anchors, events );
 | 
	
		
			
				|  |  | +		this._on( this.tabs, { keydown: "_tabKeydown" } );
 | 
	
		
			
				|  |  | +		this._on( this.panels, { keydown: "_panelKeydown" } );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this._focusable( this.tabs );
 | 
	
		
			
				|  |  | +		this._hoverable( this.tabs );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_setupHeightStyle: function( heightStyle ) {
 | 
	
		
			
				|  |  | +		var maxHeight,
 | 
	
		
			
				|  |  | +			parent = this.element.parent();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( heightStyle === "fill" ) {
 | 
	
		
			
				|  |  | +			maxHeight = parent.height();
 | 
	
		
			
				|  |  | +			maxHeight -= this.element.outerHeight() - this.element.height();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			this.element.siblings( ":visible" ).each( function() {
 | 
	
		
			
				|  |  | +				var elem = $( this ),
 | 
	
		
			
				|  |  | +					position = elem.css( "position" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				if ( position === "absolute" || position === "fixed" ) {
 | 
	
		
			
				|  |  | +					return;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				maxHeight -= elem.outerHeight( true );
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			this.element.children().not( this.panels ).each( function() {
 | 
	
		
			
				|  |  | +				maxHeight -= $( this ).outerHeight( true );
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			this.panels.each( function() {
 | 
	
		
			
				|  |  | +				$( this ).height( Math.max( 0, maxHeight -
 | 
	
		
			
				|  |  | +					$( this ).innerHeight() + $( this ).height() ) );
 | 
	
		
			
				|  |  | +			} )
 | 
	
		
			
				|  |  | +				.css( "overflow", "auto" );
 | 
	
		
			
				|  |  | +		} else if ( heightStyle === "auto" ) {
 | 
	
		
			
				|  |  | +			maxHeight = 0;
 | 
	
		
			
				|  |  | +			this.panels.each( function() {
 | 
	
		
			
				|  |  | +				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
 | 
	
		
			
				|  |  | +			} ).height( maxHeight );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_eventHandler: function( event ) {
 | 
	
		
			
				|  |  | +		var options = this.options,
 | 
	
		
			
				|  |  | +			active = this.active,
 | 
	
		
			
				|  |  | +			anchor = $( event.currentTarget ),
 | 
	
		
			
				|  |  | +			tab = anchor.closest( "li" ),
 | 
	
		
			
				|  |  | +			clickedIsActive = tab[ 0 ] === active[ 0 ],
 | 
	
		
			
				|  |  | +			collapsing = clickedIsActive && options.collapsible,
 | 
	
		
			
				|  |  | +			toShow = collapsing ? $() : this._getPanelForTab( tab ),
 | 
	
		
			
				|  |  | +			toHide = !active.length ? $() : this._getPanelForTab( active ),
 | 
	
		
			
				|  |  | +			eventData = {
 | 
	
		
			
				|  |  | +				oldTab: active,
 | 
	
		
			
				|  |  | +				oldPanel: toHide,
 | 
	
		
			
				|  |  | +				newTab: collapsing ? $() : tab,
 | 
	
		
			
				|  |  | +				newPanel: toShow
 | 
	
		
			
				|  |  | +			};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		event.preventDefault();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( tab.hasClass( "ui-state-disabled" ) ||
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// tab is already loading
 | 
	
		
			
				|  |  | +				tab.hasClass( "ui-tabs-loading" ) ||
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// can't switch durning an animation
 | 
	
		
			
				|  |  | +				this.running ||
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// click on active header, but not collapsible
 | 
	
		
			
				|  |  | +				( clickedIsActive && !options.collapsible ) ||
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// allow canceling activation
 | 
	
		
			
				|  |  | +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		options.active = collapsing ? false : this.tabs.index( tab );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.active = clickedIsActive ? $() : tab;
 | 
	
		
			
				|  |  | +		if ( this.xhr ) {
 | 
	
		
			
				|  |  | +			this.xhr.abort();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( !toHide.length && !toShow.length ) {
 | 
	
		
			
				|  |  | +			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( toShow.length ) {
 | 
	
		
			
				|  |  | +			this.load( this.tabs.index( tab ), event );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		this._toggle( event, eventData );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Handles show/hide for selecting tabs
 | 
	
		
			
				|  |  | +	_toggle: function( event, eventData ) {
 | 
	
		
			
				|  |  | +		var that = this,
 | 
	
		
			
				|  |  | +			toShow = eventData.newPanel,
 | 
	
		
			
				|  |  | +			toHide = eventData.oldPanel;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.running = true;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		function complete() {
 | 
	
		
			
				|  |  | +			that.running = false;
 | 
	
		
			
				|  |  | +			that._trigger( "activate", event, eventData );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		function show() {
 | 
	
		
			
				|  |  | +			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			if ( toShow.length && that.options.show ) {
 | 
	
		
			
				|  |  | +				that._show( toShow, that.options.show, complete );
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				toShow.show();
 | 
	
		
			
				|  |  | +				complete();
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Start out by hiding, then showing, then completing
 | 
	
		
			
				|  |  | +		if ( toHide.length && this.options.hide ) {
 | 
	
		
			
				|  |  | +			this._hide( toHide, this.options.hide, function() {
 | 
	
		
			
				|  |  | +				that._removeClass( eventData.oldTab.closest( "li" ),
 | 
	
		
			
				|  |  | +					"ui-tabs-active", "ui-state-active" );
 | 
	
		
			
				|  |  | +				show();
 | 
	
		
			
				|  |  | +			} );
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			this._removeClass( eventData.oldTab.closest( "li" ),
 | 
	
		
			
				|  |  | +				"ui-tabs-active", "ui-state-active" );
 | 
	
		
			
				|  |  | +			toHide.hide();
 | 
	
		
			
				|  |  | +			show();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		toHide.attr( "aria-hidden", "true" );
 | 
	
		
			
				|  |  | +		eventData.oldTab.attr( {
 | 
	
		
			
				|  |  | +			"aria-selected": "false",
 | 
	
		
			
				|  |  | +			"aria-expanded": "false"
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// If we're switching tabs, remove the old tab from the tab order.
 | 
	
		
			
				|  |  | +		// If we're opening from collapsed state, remove the previous tab from the tab order.
 | 
	
		
			
				|  |  | +		// If we're collapsing, then keep the collapsing tab in the tab order.
 | 
	
		
			
				|  |  | +		if ( toShow.length && toHide.length ) {
 | 
	
		
			
				|  |  | +			eventData.oldTab.attr( "tabIndex", -1 );
 | 
	
		
			
				|  |  | +		} else if ( toShow.length ) {
 | 
	
		
			
				|  |  | +			this.tabs.filter( function() {
 | 
	
		
			
				|  |  | +				return $( this ).attr( "tabIndex" ) === 0;
 | 
	
		
			
				|  |  | +			} )
 | 
	
		
			
				|  |  | +				.attr( "tabIndex", -1 );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		toShow.attr( "aria-hidden", "false" );
 | 
	
		
			
				|  |  | +		eventData.newTab.attr( {
 | 
	
		
			
				|  |  | +			"aria-selected": "true",
 | 
	
		
			
				|  |  | +			"aria-expanded": "true",
 | 
	
		
			
				|  |  | +			tabIndex: 0
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_activate: function( index ) {
 | 
	
		
			
				|  |  | +		var anchor,
 | 
	
		
			
				|  |  | +			active = this._findActive( index );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Trying to activate the already active panel
 | 
	
		
			
				|  |  | +		if ( active[ 0 ] === this.active[ 0 ] ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Trying to collapse, simulate a click on the current active header
 | 
	
		
			
				|  |  | +		if ( !active.length ) {
 | 
	
		
			
				|  |  | +			active = this.active;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
 | 
	
		
			
				|  |  | +		this._eventHandler( {
 | 
	
		
			
				|  |  | +			target: anchor,
 | 
	
		
			
				|  |  | +			currentTarget: anchor,
 | 
	
		
			
				|  |  | +			preventDefault: $.noop
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_findActive: function( index ) {
 | 
	
		
			
				|  |  | +		return index === false ? $() : this.tabs.eq( index );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_getIndex: function( index ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// meta-function to give users option to provide a href string instead of a numerical index.
 | 
	
		
			
				|  |  | +		if ( typeof index === "string" ) {
 | 
	
		
			
				|  |  | +			index = this.anchors.index( this.anchors.filter( "[href$='" +
 | 
	
		
			
				|  |  | +				$.ui.escapeSelector( index ) + "']" ) );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return index;
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_destroy: function() {
 | 
	
		
			
				|  |  | +		if ( this.xhr ) {
 | 
	
		
			
				|  |  | +			this.xhr.abort();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.tablist
 | 
	
		
			
				|  |  | +			.removeAttr( "role" )
 | 
	
		
			
				|  |  | +			.off( this.eventNamespace );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.anchors
 | 
	
		
			
				|  |  | +			.removeAttr( "role tabIndex" )
 | 
	
		
			
				|  |  | +			.removeUniqueId();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.tabs.add( this.panels ).each( function() {
 | 
	
		
			
				|  |  | +			if ( $.data( this, "ui-tabs-destroy" ) ) {
 | 
	
		
			
				|  |  | +				$( this ).remove();
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				$( this ).removeAttr( "role tabIndex " +
 | 
	
		
			
				|  |  | +					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.tabs.each( function() {
 | 
	
		
			
				|  |  | +			var li = $( this ),
 | 
	
		
			
				|  |  | +				prev = li.data( "ui-tabs-aria-controls" );
 | 
	
		
			
				|  |  | +			if ( prev ) {
 | 
	
		
			
				|  |  | +				li
 | 
	
		
			
				|  |  | +					.attr( "aria-controls", prev )
 | 
	
		
			
				|  |  | +					.removeData( "ui-tabs-aria-controls" );
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				li.removeAttr( "aria-controls" );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.panels.show();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( this.options.heightStyle !== "content" ) {
 | 
	
		
			
				|  |  | +			this.panels.css( "height", "" );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	enable: function( index ) {
 | 
	
		
			
				|  |  | +		var disabled = this.options.disabled;
 | 
	
		
			
				|  |  | +		if ( disabled === false ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( index === undefined ) {
 | 
	
		
			
				|  |  | +			disabled = false;
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			index = this._getIndex( index );
 | 
	
		
			
				|  |  | +			if ( $.isArray( disabled ) ) {
 | 
	
		
			
				|  |  | +				disabled = $.map( disabled, function( num ) {
 | 
	
		
			
				|  |  | +					return num !== index ? num : null;
 | 
	
		
			
				|  |  | +				} );
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				disabled = $.map( this.tabs, function( li, num ) {
 | 
	
		
			
				|  |  | +					return num !== index ? num : null;
 | 
	
		
			
				|  |  | +				} );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		this._setOptionDisabled( disabled );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	disable: function( index ) {
 | 
	
		
			
				|  |  | +		var disabled = this.options.disabled;
 | 
	
		
			
				|  |  | +		if ( disabled === true ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if ( index === undefined ) {
 | 
	
		
			
				|  |  | +			disabled = true;
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			index = this._getIndex( index );
 | 
	
		
			
				|  |  | +			if ( $.inArray( index, disabled ) !== -1 ) {
 | 
	
		
			
				|  |  | +				return;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if ( $.isArray( disabled ) ) {
 | 
	
		
			
				|  |  | +				disabled = $.merge( [ index ], disabled ).sort();
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				disabled = [ index ];
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		this._setOptionDisabled( disabled );
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	load: function( index, event ) {
 | 
	
		
			
				|  |  | +		index = this._getIndex( index );
 | 
	
		
			
				|  |  | +		var that = this,
 | 
	
		
			
				|  |  | +			tab = this.tabs.eq( index ),
 | 
	
		
			
				|  |  | +			anchor = tab.find( ".ui-tabs-anchor" ),
 | 
	
		
			
				|  |  | +			panel = this._getPanelForTab( tab ),
 | 
	
		
			
				|  |  | +			eventData = {
 | 
	
		
			
				|  |  | +				tab: tab,
 | 
	
		
			
				|  |  | +				panel: panel
 | 
	
		
			
				|  |  | +			},
 | 
	
		
			
				|  |  | +			complete = function( jqXHR, status ) {
 | 
	
		
			
				|  |  | +				if ( status === "abort" ) {
 | 
	
		
			
				|  |  | +					that.panels.stop( false, true );
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				that._removeClass( tab, "ui-tabs-loading" );
 | 
	
		
			
				|  |  | +				panel.removeAttr( "aria-busy" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				if ( jqXHR === that.xhr ) {
 | 
	
		
			
				|  |  | +					delete that.xhr;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Not remote
 | 
	
		
			
				|  |  | +		if ( this._isLocal( anchor[ 0 ] ) ) {
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Support: jQuery <1.8
 | 
	
		
			
				|  |  | +		// jQuery <1.8 returns false if the request is canceled in beforeSend,
 | 
	
		
			
				|  |  | +		// but as of 1.8, $.ajax() always returns a jqXHR object.
 | 
	
		
			
				|  |  | +		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
 | 
	
		
			
				|  |  | +			this._addClass( tab, "ui-tabs-loading" );
 | 
	
		
			
				|  |  | +			panel.attr( "aria-busy", "true" );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			this.xhr
 | 
	
		
			
				|  |  | +				.done( function( response, status, jqXHR ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					// support: jQuery <1.8
 | 
	
		
			
				|  |  | +					// http://bugs.jquery.com/ticket/11778
 | 
	
		
			
				|  |  | +					setTimeout( function() {
 | 
	
		
			
				|  |  | +						panel.html( response );
 | 
	
		
			
				|  |  | +						that._trigger( "load", event, eventData );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +						complete( jqXHR, status );
 | 
	
		
			
				|  |  | +					}, 1 );
 | 
	
		
			
				|  |  | +				} )
 | 
	
		
			
				|  |  | +				.fail( function( jqXHR, status ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					// support: jQuery <1.8
 | 
	
		
			
				|  |  | +					// http://bugs.jquery.com/ticket/11778
 | 
	
		
			
				|  |  | +					setTimeout( function() {
 | 
	
		
			
				|  |  | +						complete( jqXHR, status );
 | 
	
		
			
				|  |  | +					}, 1 );
 | 
	
		
			
				|  |  | +				} );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_ajaxSettings: function( anchor, event, eventData ) {
 | 
	
		
			
				|  |  | +		var that = this;
 | 
	
		
			
				|  |  | +		return {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Support: IE <11 only
 | 
	
		
			
				|  |  | +			// Strip any hash that exists to prevent errors with the Ajax request
 | 
	
		
			
				|  |  | +			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
 | 
	
		
			
				|  |  | +			beforeSend: function( jqXHR, settings ) {
 | 
	
		
			
				|  |  | +				return that._trigger( "beforeLoad", event,
 | 
	
		
			
				|  |  | +					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		};
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_getPanelForTab: function( tab ) {
 | 
	
		
			
				|  |  | +		var id = $( tab ).attr( "aria-controls" );
 | 
	
		
			
				|  |  | +		return this.element.find( this._sanitizeSelector( "#" + id ) );
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +} );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// DEPRECATED
 | 
	
		
			
				|  |  | +// TODO: Switch return back to widget declaration at top of file when this is removed
 | 
	
		
			
				|  |  | +if ( $.uiBackCompat !== false ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Backcompat for ui-tab class (now ui-tabs-tab)
 | 
	
		
			
				|  |  | +	$.widget( "ui.tabs", $.ui.tabs, {
 | 
	
		
			
				|  |  | +		_processTabs: function() {
 | 
	
		
			
				|  |  | +			this._superApply( arguments );
 | 
	
		
			
				|  |  | +			this._addClass( this.tabs, "ui-tab" );
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	} );
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var widgetsTabs = $.ui.tabs;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}));
 |