--- /dev/null
+/*! jQuery UI - v1.12.1+0b7246b6eeadfa9e2696e22f3230f6452f8129dc - 2020-02-20
+ * http://jqueryui.com
+ * Includes: widget.js
+ * Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+/* global define, require */
+/* eslint-disable no-param-reassign, new-cap, jsdoc/require-jsdoc */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS
+ factory(require('jquery'));
+ } else {
+ // Browser globals
+ factory(window.jQuery);
+ }
+})(function ($) {
+ ('use strict');
+
+ $.ui = $.ui || {};
+
+ $.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/
+
+ // Support: jQuery 1.9.x or older
+ // $.expr[ ":" ] is deprecated.
+ if (!$.expr.pseudos) {
+ $.expr.pseudos = $.expr[':'];
+ }
+
+ // Support: jQuery 1.11.x or older
+ // $.unique has been renamed to $.uniqueSort
+ if (!$.uniqueSort) {
+ $.uniqueSort = $.unique;
+ }
+
+ var widgetUuid = 0;
+ var widgetHasOwnProperty = Array.prototype.hasOwnProperty;
+ var widgetSlice = Array.prototype.slice;
+
+ $.cleanData = (function (orig) {
+ return function (elems) {
+ var events, elem, i;
+ // eslint-disable-next-line eqeqeq
+ for (i = 0; (elem = elems[i]) != null; i++) {
+ // Only trigger remove when necessary to save time
+ events = $._data(elem, 'events');
+ if (events && events.remove) {
+ $(elem).triggerHandler('remove');
+ }
+ }
+ 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.pseudos[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 (
+ widgetHasOwnProperty.call(input[inputIndex], 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 bindRemoveEvent() {
+ options.element.each(function (_, element) {
+ var isTracked = $.map(that.classesElementLookup, function (elements) {
+ return elements;
+ }).some(function (elements) {
+ return elements.is(element);
+ });
+
+ if (!isTracked) {
+ that._on($(element), {
+ remove: '_untrackClassesElement'
+ });
+ }
+ });
+ }
+
+ function processClassString(classes, checkOption) {
+ var current, i;
+ for (i = 0; i < classes.length; i++) {
+ current = that.classesElementLookup[classes[i]] || $();
+ if (options.add) {
+ bindRemoveEvent();
+ current = $(
+ $.uniqueSort(current.get().concat(options.element.get()))
+ );
+ } else {
+ current = $(current.not(options.element).get());
+ }
+ that.classesElementLookup[classes[i]] = current;
+ full.push(classes[i]);
+ if (checkOption && options.classes[classes[i]]) {
+ full.push(options.classes[classes[i]]);
+ }
+ }
+ }
+
+ if (options.keys) {
+ processClassString(options.keys.match(/\S+/g) || [], true);
+ }
+ if (options.extra) {
+ processClassString(options.extra.match(/\S+/g) || []);
+ }
+
+ return full.join(' ');
+ },
+
+ _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());
+ }
+ });
+
+ this._off($(event.target));
+ },
+
+ _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);
+
+ // 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) {
+ var instance = this;
+ function handlerProxy() {
+ return (
+ typeof handler === 'string' ? instance[handler] : handler
+ ).apply(instance, arguments);
+ }
+ 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();
+ });
+ }
+ };
+ });
+});