/*! jQuery UI - v1.14.1 - 2024-10-30
* https://jqueryui.com
* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
* Copyright OpenJS Foundation and other contributors; Licensed MIT */
(function(factory) {
"use strict";
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["jquery"], factory);
} else {
// Browser globals
factory(jQuery);
}
})(function($) {
"use strict";
$.ui = $.ui || {};
var version = $.ui.version = "1.14.1";
/*!
* jQuery UI Widget 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Widget
//>>group: Core
//>>description: Provides a factory for creating stateful widgets with a common API.
//>>docs: https://api.jqueryui.com/jQuery.widget/
//>>demos: https://jqueryui.com/widget/
var widgetUuid = 0;
var widgetHasOwnProperty = Array.prototype.hasOwnProperty;
var widgetSlice = Array.prototype.slice;
$.cleanData = (function(orig) {
return function(elems) {
var events, elem, i;
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];
if (name === "__proto__" || name === "constructor") {
return $.error("Invalid widget name: " + name);
}
var fullName = namespace + "-" + name;
if (!prototype) {
prototype = base;
base = $.Widget;
}
if (Array.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 || !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 (typeof value !== "function") {
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 (typeof instance[options] !== "function" ||
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: "
",
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() {
var nodesToBind = [];
options.element.each(function(_, element) {
var isTracked = $.map(that.classesElementLookup, function(elements) {
return elements;
})
.some(function(elements) {
return elements.is(element);
});
if (!isTracked) {
nodesToBind.push(element);
}
});
that._on($(nodesToBind), {
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) {
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 !(typeof callback === "function" &&
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 };
} else if (options === true) {
options = {};
}
hasOptions = !$.isEmptyObject(options);
options.complete = callback;
if (options.delay) {
element.delay(options.delay);
}
if (hasOptions && $.effects && $.effects.effect[effectName]) {
element[method](options);
} else if (effectName !== method && element[effectName]) {
element[effectName](options.duration, options.easing, callback);
} else {
element.queue(function(next) {
$(this)[method]();
if (callback) {
callback.call(element[0]);
}
next();
});
}
};
});
var widget = $.widget;
/*!
* jQuery UI Position 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*
* https://api.jqueryui.com/position/
*/
//>>label: Position
//>>group: Core
//>>description: Positions elements relative to other elements.
//>>docs: https://api.jqueryui.com/position/
//>>demos: https://jqueryui.com/position/
(function() {
var cachedScrollbarWidth,
max = Math.max,
abs = Math.abs,
rhorizontal = /left|center|right/,
rvertical = /top|center|bottom/,
roffset = /[\+\-]\d+(\.[\d]+)?%?/,
rposition = /^\w+/,
rpercent = /%$/,
_position = $.fn.position;
function getOffsets(offsets, width, height) {
return [
parseFloat(offsets[0]) * (rpercent.test(offsets[0]) ? width / 100 : 1),
parseFloat(offsets[1]) * (rpercent.test(offsets[1]) ? height / 100 : 1)
];
}
function parseCss(element, property) {
return parseInt($.css(element, property), 10) || 0;
}
function isWindow(obj) {
return obj != null && obj === obj.window;
}
function getDimensions(elem) {
var raw = elem[0];
if (raw.nodeType === 9) {
return {
width: elem.width(),
height: elem.height(),
offset: { top: 0, left: 0 }
};
}
if (isWindow(raw)) {
return {
width: elem.width(),
height: elem.height(),
offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
};
}
if (raw.preventDefault) {
return {
width: 0,
height: 0,
offset: { top: raw.pageY, left: raw.pageX }
};
}
return {
width: elem.outerWidth(),
height: elem.outerHeight(),
offset: elem.offset()
};
}
$.position = {
scrollbarWidth: function() {
if (cachedScrollbarWidth !== undefined) {
return cachedScrollbarWidth;
}
var w1, w2,
div = $("
" +
"
"),
innerDiv = div.children()[0];
$("body").append(div);
w1 = innerDiv.offsetWidth;
div.css("overflow", "scroll");
w2 = innerDiv.offsetWidth;
if (w1 === w2) {
w2 = div[0].clientWidth;
}
div.remove();
return (cachedScrollbarWidth = w1 - w2);
},
getScrollInfo: function(within) {
var overflowX = within.isWindow || within.isDocument ? "" :
within.element.css("overflow-x"),
overflowY = within.isWindow || within.isDocument ? "" :
within.element.css("overflow-y"),
hasOverflowX = overflowX === "scroll" ||
(overflowX === "auto" && within.width < within.element[0].scrollWidth),
hasOverflowY = overflowY === "scroll" ||
(overflowY === "auto" && within.height < within.element[0].scrollHeight);
return {
width: hasOverflowY ? $.position.scrollbarWidth() : 0,
height: hasOverflowX ? $.position.scrollbarWidth() : 0
};
},
getWithinInfo: function(element) {
var withinElement = $(element || window),
isElemWindow = isWindow(withinElement[0]),
isDocument = !!withinElement[0] && withinElement[0].nodeType === 9,
hasOffset = !isElemWindow && !isDocument;
return {
element: withinElement,
isWindow: isElemWindow,
isDocument: isDocument,
offset: hasOffset ? $(element).offset() : { left: 0, top: 0 },
scrollLeft: withinElement.scrollLeft(),
scrollTop: withinElement.scrollTop(),
width: withinElement.outerWidth(),
height: withinElement.outerHeight()
};
}
};
$.fn.position = function(options) {
if (!options || !options.of) {
return _position.apply(this, arguments);
}
// Make a copy, we don't want to modify arguments
options = $.extend({}, options);
var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
// Make sure string options are treated as CSS selectors
target = typeof options.of === "string" ?
$(document).find(options.of) :
$(options.of),
within = $.position.getWithinInfo(options.within),
scrollInfo = $.position.getScrollInfo(within),
collision = (options.collision || "flip").split(" "),
offsets = {};
dimensions = getDimensions(target);
if (target[0].preventDefault) {
// Force left top to allow flipping
options.at = "left top";
}
targetWidth = dimensions.width;
targetHeight = dimensions.height;
targetOffset = dimensions.offset;
// Clone to reuse original targetOffset later
basePosition = $.extend({}, targetOffset);
// Force my and at to have valid horizontal and vertical positions
// if a value is missing or invalid, it will be converted to center
$.each(["my", "at"], function() {
var pos = (options[this] || "").split(" "),
horizontalOffset,
verticalOffset;
if (pos.length === 1) {
pos = rhorizontal.test(pos[0]) ?
pos.concat(["center"]) :
rvertical.test(pos[0]) ?
["center"].concat(pos) :
["center", "center"];
}
pos[0] = rhorizontal.test(pos[0]) ? pos[0] : "center";
pos[1] = rvertical.test(pos[1]) ? pos[1] : "center";
// Calculate offsets
horizontalOffset = roffset.exec(pos[0]);
verticalOffset = roffset.exec(pos[1]);
offsets[this] = [
horizontalOffset ? horizontalOffset[0] : 0,
verticalOffset ? verticalOffset[0] : 0
];
// Reduce to just the positions without the offsets
options[this] = [
rposition.exec(pos[0])[0],
rposition.exec(pos[1])[0]
];
});
// Normalize collision option
if (collision.length === 1) {
collision[1] = collision[0];
}
if (options.at[0] === "right") {
basePosition.left += targetWidth;
} else if (options.at[0] === "center") {
basePosition.left += targetWidth / 2;
}
if (options.at[1] === "bottom") {
basePosition.top += targetHeight;
} else if (options.at[1] === "center") {
basePosition.top += targetHeight / 2;
}
atOffset = getOffsets(offsets.at, targetWidth, targetHeight);
basePosition.left += atOffset[0];
basePosition.top += atOffset[1];
return this.each(function() {
var collisionPosition, using,
elem = $(this),
elemWidth = elem.outerWidth(),
elemHeight = elem.outerHeight(),
marginLeft = parseCss(this, "marginLeft"),
marginTop = parseCss(this, "marginTop"),
collisionWidth = elemWidth + marginLeft + parseCss(this, "marginRight") +
scrollInfo.width,
collisionHeight = elemHeight + marginTop + parseCss(this, "marginBottom") +
scrollInfo.height,
position = $.extend({}, basePosition),
myOffset = getOffsets(offsets.my, elem.outerWidth(), elem.outerHeight());
if (options.my[0] === "right") {
position.left -= elemWidth;
} else if (options.my[0] === "center") {
position.left -= elemWidth / 2;
}
if (options.my[1] === "bottom") {
position.top -= elemHeight;
} else if (options.my[1] === "center") {
position.top -= elemHeight / 2;
}
position.left += myOffset[0];
position.top += myOffset[1];
collisionPosition = {
marginLeft: marginLeft,
marginTop: marginTop
};
$.each(["left", "top"], function(i, dir) {
if ($.ui.position[collision[i]]) {
$.ui.position[collision[i]][dir](position, {
targetWidth: targetWidth,
targetHeight: targetHeight,
elemWidth: elemWidth,
elemHeight: elemHeight,
collisionPosition: collisionPosition,
collisionWidth: collisionWidth,
collisionHeight: collisionHeight,
offset: [atOffset[0] + myOffset[0], atOffset[1] + myOffset[1]],
my: options.my,
at: options.at,
within: within,
elem: elem
});
}
});
if (options.using) {
// Adds feedback as second argument to using callback, if present
using = function(props) {
var left = targetOffset.left - position.left,
right = left + targetWidth - elemWidth,
top = targetOffset.top - position.top,
bottom = top + targetHeight - elemHeight,
feedback = {
target: {
element: target,
left: targetOffset.left,
top: targetOffset.top,
width: targetWidth,
height: targetHeight
},
element: {
element: elem,
left: position.left,
top: position.top,
width: elemWidth,
height: elemHeight
},
horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
};
if (targetWidth < elemWidth && abs(left + right) < targetWidth) {
feedback.horizontal = "center";
}
if (targetHeight < elemHeight && abs(top + bottom) < targetHeight) {
feedback.vertical = "middle";
}
if (max(abs(left), abs(right)) > max(abs(top), abs(bottom))) {
feedback.important = "horizontal";
} else {
feedback.important = "vertical";
}
options.using.call(this, props, feedback);
};
}
elem.offset($.extend(position, { using: using }));
});
};
$.ui.position = {
fit: {
left: function(position, data) {
var within = data.within,
withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
outerWidth = within.width,
collisionPosLeft = position.left - data.collisionPosition.marginLeft,
overLeft = withinOffset - collisionPosLeft,
overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
newOverRight;
// Element is wider than within
if (data.collisionWidth > outerWidth) {
// Element is initially over the left side of within
if (overLeft > 0 && overRight <= 0) {
newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
withinOffset;
position.left += overLeft - newOverRight;
// Element is initially over right side of within
} else if (overRight > 0 && overLeft <= 0) {
position.left = withinOffset;
// Element is initially over both left and right sides of within
} else {
if (overLeft > overRight) {
position.left = withinOffset + outerWidth - data.collisionWidth;
} else {
position.left = withinOffset;
}
}
// Too far left -> align with left edge
} else if (overLeft > 0) {
position.left += overLeft;
// Too far right -> align with right edge
} else if (overRight > 0) {
position.left -= overRight;
// Adjust based on position and margin
} else {
position.left = max(position.left - collisionPosLeft, position.left);
}
},
top: function(position, data) {
var within = data.within,
withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
outerHeight = data.within.height,
collisionPosTop = position.top - data.collisionPosition.marginTop,
overTop = withinOffset - collisionPosTop,
overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
newOverBottom;
// Element is taller than within
if (data.collisionHeight > outerHeight) {
// Element is initially over the top of within
if (overTop > 0 && overBottom <= 0) {
newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
withinOffset;
position.top += overTop - newOverBottom;
// Element is initially over bottom of within
} else if (overBottom > 0 && overTop <= 0) {
position.top = withinOffset;
// Element is initially over both top and bottom of within
} else {
if (overTop > overBottom) {
position.top = withinOffset + outerHeight - data.collisionHeight;
} else {
position.top = withinOffset;
}
}
// Too far up -> align with top
} else if (overTop > 0) {
position.top += overTop;
// Too far down -> align with bottom edge
} else if (overBottom > 0) {
position.top -= overBottom;
// Adjust based on position and margin
} else {
position.top = max(position.top - collisionPosTop, position.top);
}
}
},
flip: {
left: function(position, data) {
var within = data.within,
withinOffset = within.offset.left + within.scrollLeft,
outerWidth = within.width,
offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
collisionPosLeft = position.left - data.collisionPosition.marginLeft,
overLeft = collisionPosLeft - offsetLeft,
overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
myOffset = data.my[0] === "left" ?
-data.elemWidth :
data.my[0] === "right" ?
data.elemWidth :
0,
atOffset = data.at[0] === "left" ?
data.targetWidth :
data.at[0] === "right" ?
-data.targetWidth :
0,
offset = -2 * data.offset[0],
newOverRight,
newOverLeft;
if (overLeft < 0) {
newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
outerWidth - withinOffset;
if (newOverRight < 0 || newOverRight < abs(overLeft)) {
position.left += myOffset + atOffset + offset;
}
} else if (overRight > 0) {
newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
atOffset + offset - offsetLeft;
if (newOverLeft > 0 || abs(newOverLeft) < overRight) {
position.left += myOffset + atOffset + offset;
}
}
},
top: function(position, data) {
var within = data.within,
withinOffset = within.offset.top + within.scrollTop,
outerHeight = within.height,
offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
collisionPosTop = position.top - data.collisionPosition.marginTop,
overTop = collisionPosTop - offsetTop,
overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
top = data.my[1] === "top",
myOffset = top ?
-data.elemHeight :
data.my[1] === "bottom" ?
data.elemHeight :
0,
atOffset = data.at[1] === "top" ?
data.targetHeight :
data.at[1] === "bottom" ?
-data.targetHeight :
0,
offset = -2 * data.offset[1],
newOverTop,
newOverBottom;
if (overTop < 0) {
newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
outerHeight - withinOffset;
if (newOverBottom < 0 || newOverBottom < abs(overTop)) {
position.top += myOffset + atOffset + offset;
}
} else if (overBottom > 0) {
newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
offset - offsetTop;
if (newOverTop > 0 || abs(newOverTop) < overBottom) {
position.top += myOffset + atOffset + offset;
}
}
}
},
flipfit: {
left: function() {
$.ui.position.flip.left.apply(this, arguments);
$.ui.position.fit.left.apply(this, arguments);
},
top: function() {
$.ui.position.flip.top.apply(this, arguments);
$.ui.position.fit.top.apply(this, arguments);
}
}
};
})();
var position = $.ui.position;
/*!
* jQuery UI :data 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: :data Selector
//>>group: Core
//>>description: Selects elements which have data stored under the specified key.
//>>docs: https://api.jqueryui.com/data-selector/
var data = $.extend($.expr.pseudos, {
data: $.expr.createPseudo(function(dataName) {
return function(elem) {
return !!$.data(elem, dataName);
};
})
});
/*!
* jQuery UI Disable Selection 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: disableSelection
//>>group: Core
//>>description: Disable selection of text content within the set of matched elements.
//>>docs: https://api.jqueryui.com/disableSelection/
// This file is deprecated
var disableSelection = $.fn.extend({
disableSelection: (function() {
var eventType = "onselectstart" in document.createElement("div") ?
"selectstart" :
"mousedown";
return function() {
return this.on(eventType + ".ui-disableSelection", function(event) {
event.preventDefault();
});
};
})(),
enableSelection: function() {
return this.off(".ui-disableSelection");
}
});
// Create a local jQuery because jQuery Color relies on it and the
// global may not exist with AMD and a custom build (#10199).
// This module is a noop if used as a regular AMD module.
// eslint-disable-next-line no-unused-vars
var jQuery = $;
/*!
* jQuery Color Animations v3.0.0
* https://github.com/jquery/jquery-color
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*
* Date: Wed May 15 16:49:44 2024 +0200
*/
var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
class2type = {},
toString = class2type.toString,
// plusequals test for += 100 -= 100
rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
// a set of RE's that can match strings and generate color tuples.
stringParsers = [{
re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
parse: function(execResult) {
return [
execResult[1],
execResult[2],
execResult[3],
execResult[4]
];
}
}, {
re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
parse: function(execResult) {
return [
execResult[1] * 2.55,
execResult[2] * 2.55,
execResult[3] * 2.55,
execResult[4]
];
}
}, {
// this regex ignores A-F because it's compared against an already lowercased string
re: /#([a-f0-9][2])([a-f0-9][2])([a-f0-9][2])([a-f0-9][2])?/,
parse: function(execResult) {
return [
parseInt(execResult[1], 16),
parseInt(execResult[2], 16),
parseInt(execResult[3], 16),
execResult[4] ?
(parseInt(execResult[4], 16) / 255).toFixed(2) :
1
];
}
}, {
// this regex ignores A-F because it's compared against an already lowercased string
re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,
parse: function(execResult) {
return [
parseInt(execResult[1] + execResult[1], 16),
parseInt(execResult[2] + execResult[2], 16),
parseInt(execResult[3] + execResult[3], 16),
execResult[4] ?
(parseInt(execResult[4] + execResult[4], 16) / 255)
.toFixed(2) :
1
];
}
}, {
re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
space: "hsla",
parse: function(execResult) {
return [
execResult[1],
execResult[2] / 100,
execResult[3] / 100,
execResult[4]
];
}
}],
// jQuery.Color( )
color = jQuery.Color = function(color, green, blue, alpha) {
return new jQuery.Color.fn.parse(color, green, blue, alpha);
},
spaces = {
rgba: {
props: {
red: {
idx: 0,
type: "byte"
},
green: {
idx: 1,
type: "byte"
},
blue: {
idx: 2,
type: "byte"
}
}
},
hsla: {
props: {
hue: {
idx: 0,
type: "degrees"
},
saturation: {
idx: 1,
type: "percent"
},
lightness: {
idx: 2,
type: "percent"
}
}
}
},
propTypes = {
"byte": {
floor: true,
max: 255
},
"percent": {
max: 1
},
"degrees": {
mod: 360,
floor: true
}
},
// colors = jQuery.Color.names
colors,
// local aliases of functions called often
each = jQuery.each;
// define cache name and alpha properties
// for rgba and hsla spaces
each(spaces, function(spaceName, space) {
space.cache = "_" + spaceName;
space.props.alpha = {
idx: 3,
type: "percent",
def: 1
};
});
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
function(_i, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
function getType(obj) {
if (obj == null) {
return obj + "";
}
return typeof obj === "object" ?
class2type[toString.call(obj)] || "object" :
typeof obj;
}
function clamp(value, prop, allowEmpty) {
var type = propTypes[prop.type] || {};
if (value == null) {
return (allowEmpty || !prop.def) ? null : prop.def;
}
// ~~ is an short way of doing floor for positive numbers
value = type.floor ? ~~value : parseFloat(value);
if (type.mod) {
// we add mod before modding to make sure that negatives values
// get converted properly: -10 -> 350
return (value + type.mod) % type.mod;
}
// for now all property types without mod have min and max
return Math.min(type.max, Math.max(0, value));
}
function stringParse(string) {
var inst = color(),
rgba = inst._rgba = [];
string = string.toLowerCase();
each(stringParsers, function(_i, parser) {
var parsed,
match = parser.re.exec(string),
values = match && parser.parse(match),
spaceName = parser.space || "rgba";
if (values) {
parsed = inst[spaceName](values);
// if this was an rgba parse the assignment might happen twice
// oh well....
inst[spaces[spaceName].cache] = parsed[spaces[spaceName].cache];
rgba = inst._rgba = parsed._rgba;
// exit each( stringParsers ) here because we matched
return false;
}
});
// Found a stringParser that handled it
if (rgba.length) {
// if this came from a parsed string, force "transparent" when alpha is 0
// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
if (rgba.join() === "0,0,0,0") {
jQuery.extend(rgba, colors.transparent);
}
return inst;
}
// named colors
return colors[string];
}
color.fn = jQuery.extend(color.prototype, {
parse: function(red, green, blue, alpha) {
if (red === undefined) {
this._rgba = [null, null, null, null];
return this;
}
if (red.jquery || red.nodeType) {
red = jQuery(red).css(green);
green = undefined;
}
var inst = this,
type = getType(red),
rgba = this._rgba = [];
// more than 1 argument specified - assume ( red, green, blue, alpha )
if (green !== undefined) {
red = [red, green, blue, alpha];
type = "array";
}
if (type === "string") {
return this.parse(stringParse(red) || colors._default);
}
if (type === "array") {
each(spaces.rgba.props, function(_key, prop) {
rgba[prop.idx] = clamp(red[prop.idx], prop);
});
return this;
}
if (type === "object") {
if (red instanceof color) {
each(spaces, function(_spaceName, space) {
if (red[space.cache]) {
inst[space.cache] = red[space.cache].slice();
}
});
} else {
each(spaces, function(_spaceName, space) {
var cache = space.cache;
each(space.props, function(key, prop) {
// if the cache doesn't exist, and we know how to convert
if (!inst[cache] && space.to) {
// if the value was null, we don't need to copy it
// if the key was alpha, we don't need to copy it either
if (key === "alpha" || red[key] == null) {
return;
}
inst[cache] = space.to(inst._rgba);
}
// this is the only case where we allow nulls for ALL properties.
// call clamp with alwaysAllowEmpty
inst[cache][prop.idx] = clamp(red[key], prop, true);
});
// everything defined but alpha?
if (inst[cache] && jQuery.inArray(
null,
inst[cache].slice(0, 3)
) < 0) {
// use the default of 1
if (inst[cache][3] == null) {
inst[cache][3] = 1;
}
if (space.from) {
inst._rgba = space.from(inst[cache]);
}
}
});
}
return this;
}
},
is: function(compare) {
var is = color(compare),
same = true,
inst = this;
each(spaces, function(_, space) {
var localCache,
isCache = is[space.cache];
if (isCache) {
localCache = inst[space.cache] || space.to && space.to(inst._rgba) || [];
each(space.props, function(_, prop) {
if (isCache[prop.idx] != null) {
same = (isCache[prop.idx] === localCache[prop.idx]);
return same;
}
});
}
return same;
});
return same;
},
_space: function() {
var used = [],
inst = this;
each(spaces, function(spaceName, space) {
if (inst[space.cache]) {
used.push(spaceName);
}
});
return used.pop();
},
transition: function(other, distance) {
var end = color(other),
spaceName = end._space(),
space = spaces[spaceName],
startColor = this.alpha() === 0 ? color("transparent") : this,
start = startColor[space.cache] || space.to(startColor._rgba),
result = start.slice();
end = end[space.cache];
each(space.props, function(_key, prop) {
var index = prop.idx,
startValue = start[index],
endValue = end[index],
type = propTypes[prop.type] || {};
// if null, don't override start value
if (endValue === null) {
return;
}
// if null - use end
if (startValue === null) {
result[index] = endValue;
} else {
if (type.mod) {
if (endValue - startValue > type.mod / 2) {
startValue += type.mod;
} else if (startValue - endValue > type.mod / 2) {
startValue -= type.mod;
}
}
result[index] = clamp((endValue - startValue) * distance + startValue, prop);
}
});
return this[spaceName](result);
},
blend: function(opaque) {
// if we are already opaque - return ourself
if (this._rgba[3] === 1) {
return this;
}
var rgb = this._rgba.slice(),
a = rgb.pop(),
blend = color(opaque)._rgba;
return color(jQuery.map(rgb, function(v, i) {
return (1 - a) * blend[i] + a * v;
}));
},
toRgbaString: function() {
var prefix = "rgba(",
rgba = jQuery.map(this._rgba, function(v, i) {
if (v != null) {
return v;
}
return i > 2 ? 1 : 0;
});
if (rgba[3] === 1) {
rgba.pop();
prefix = "rgb(";
}
return prefix + rgba.join(", ") + ")";
},
toHslaString: function() {
var prefix = "hsla(",
hsla = jQuery.map(this.hsla(), function(v, i) {
if (v == null) {
v = i > 2 ? 1 : 0;
}
// catch 1 and 2
if (i && i < 3) {
v = Math.round(v * 100) + "%";
}
return v;
});
if (hsla[3] === 1) {
hsla.pop();
prefix = "hsl(";
}
return prefix + hsla.join(", ") + ")";
},
toHexString: function(includeAlpha) {
var rgba = this._rgba.slice(),
alpha = rgba.pop();
if (includeAlpha) {
rgba.push(~~(alpha * 255));
}
return "#" + jQuery.map(rgba, function(v) {
// default to 0 when nulls exist
return ("0" + (v || 0).toString(16)).substr(-2);
}).join("");
},
toString: function() {
return this.toRgbaString();
}
});
color.fn.parse.prototype = color.fn;
// hsla conversions adapted from:
// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
function hue2rgb(p, q, h) {
h = (h + 1) % 1;
if (h * 6 < 1) {
return p + (q - p) * h * 6;
}
if (h * 2 < 1) {
return q;
}
if (h * 3 < 2) {
return p + (q - p) * ((2 / 3) - h) * 6;
}
return p;
}
spaces.hsla.to = function(rgba) {
if (rgba[0] == null || rgba[1] == null || rgba[2] == null) {
return [null, null, null, rgba[3]];
}
var r = rgba[0] / 255,
g = rgba[1] / 255,
b = rgba[2] / 255,
a = rgba[3],
max = Math.max(r, g, b),
min = Math.min(r, g, b),
diff = max - min,
add = max + min,
l = add * 0.5,
h, s;
if (min === max) {
h = 0;
} else if (r === max) {
h = (60 * (g - b) / diff) + 360;
} else if (g === max) {
h = (60 * (b - r) / diff) + 120;
} else {
h = (60 * (r - g) / diff) + 240;
}
// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
if (diff === 0) {
s = 0;
} else if (l <= 0.5) {
s = diff / add;
} else {
s = diff / (2 - add);
}
return [Math.round(h) % 360, s, l, a == null ? 1 : a];
};
spaces.hsla.from = function(hsla) {
if (hsla[0] == null || hsla[1] == null || hsla[2] == null) {
return [null, null, null, hsla[3]];
}
var h = hsla[0] / 360,
s = hsla[1],
l = hsla[2],
a = hsla[3],
q = l <= 0.5 ? l * (1 + s) : l + s - l * s,
p = 2 * l - q;
return [
Math.round(hue2rgb(p, q, h + (1 / 3)) * 255),
Math.round(hue2rgb(p, q, h) * 255),
Math.round(hue2rgb(p, q, h - (1 / 3)) * 255),
a
];
};
each(spaces, function(spaceName, space) {
var props = space.props,
cache = space.cache,
to = space.to,
from = space.from;
// makes rgba() and hsla()
color.fn[spaceName] = function(value) {
// generate a cache for this space if it doesn't exist
if (to && !this[cache]) {
this[cache] = to(this._rgba);
}
if (value === undefined) {
return this[cache].slice();
}
var ret,
type = getType(value),
arr = (type === "array" || type === "object") ? value : arguments,
local = this[cache].slice();
each(props, function(key, prop) {
var val = arr[type === "object" ? key : prop.idx];
if (val == null) {
val = local[prop.idx];
}
local[prop.idx] = clamp(val, prop);
});
if (from) {
ret = color(from(local));
ret[cache] = local;
return ret;
} else {
return color(local);
}
};
// makes red() green() blue() alpha() hue() saturation() lightness()
each(props, function(key, prop) {
// alpha is included in more than one space
if (color.fn[key]) {
return;
}
color.fn[key] = function(value) {
var local, cur, match, fn,
vtype = getType(value);
if (key === "alpha") {
fn = this._hsla ? "hsla" : "rgba";
} else {
fn = spaceName;
}
local = this[fn]();
cur = local[prop.idx];
if (vtype === "undefined") {
return cur;
}
if (vtype === "function") {
value = value.call(this, cur);
vtype = getType(value);
}
if (value == null && prop.empty) {
return this;
}
if (vtype === "string") {
match = rplusequals.exec(value);
if (match) {
value = cur + parseFloat(match[2]) * (match[1] === "+" ? 1 : -1);
}
}
local[prop.idx] = value;
return this[fn](local);
};
});
});
// add cssHook and .fx.step function for each named hook.
// accept a space separated string of properties
color.hook = function(hook) {
var hooks = hook.split(" ");
each(hooks, function(_i, hook) {
jQuery.cssHooks[hook] = {
set: function(elem, value) {
var parsed;
if (value !== "transparent" &&
(getType(value) !== "string" ||
(parsed = stringParse(value)))) {
value = color(parsed || value);
value = value.toRgbaString();
}
elem.style[hook] = value;
}
};
jQuery.fx.step[hook] = function(fx) {
if (!fx.colorInit) {
fx.start = color(fx.elem, hook);
fx.end = color(fx.end);
fx.colorInit = true;
}
jQuery.cssHooks[hook].set(fx.elem, fx.start.transition(fx.end, fx.pos));
};
});
};
color.hook(stepHooks);
jQuery.cssHooks.borderColor = {
expand: function(value) {
var expanded = {};
each(["Top", "Right", "Bottom", "Left"], function(_i, part) {
expanded["border" + part + "Color"] = value;
});
return expanded;
}
};
// Basic color names only.
// Usage of any of the other color names requires adding yourself or including
// jquery.color.svg-names.js.
colors = jQuery.Color.names = {
// 4.1. Basic color keywords
aqua: "#00ffff",
black: "#000000",
blue: "#0000ff",
fuchsia: "#ff00ff",
gray: "#808080",
green: "#008000",
lime: "#00ff00",
maroon: "#800000",
navy: "#000080",
olive: "#808000",
purple: "#800080",
red: "#ff0000",
silver: "#c0c0c0",
teal: "#008080",
white: "#ffffff",
yellow: "#ffff00",
// 4.2.3. "transparent" color keyword
transparent: [null, null, null, 0],
_default: "#ffffff"
};
/*!
* jQuery UI Effects 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Effects Core
//>>group: Effects
/* eslint-disable max-len */
//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
/* eslint-enable max-len */
//>>docs: https://api.jqueryui.com/category/effects-core/
//>>demos: https://jqueryui.com/effect/
var dataSpace = "ui-effects-",
dataSpaceStyle = "ui-effects-style",
dataSpaceAnimated = "ui-effects-animated";
$.effects = {
effect: {}
};
/******************************************************************************/
/****************************** CLASS ANIMATIONS ******************************/
/******************************************************************************/
(function() {
var classAnimationActions = ["add", "remove", "toggle"],
shorthandStyles = {
border: 1,
borderBottom: 1,
borderColor: 1,
borderLeft: 1,
borderRight: 1,
borderTop: 1,
borderWidth: 1,
margin: 1,
padding: 1
};
$.each(
["borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle"],
function(_, prop) {
$.fx.step[prop] = function(fx) {
if (fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr) {
jQuery.style(fx.elem, prop, fx.end);
fx.setAttr = true;
}
};
}
);
function camelCase(string) {
return string.replace(/-([\da-z])/gi, function(all, letter) {
return letter.toUpperCase();
});
}
function getElementStyles(elem) {
var key, len,
style = elem.ownerDocument.defaultView.getComputedStyle(elem),
styles = {};
len = style.length;
while (len--) {
key = style[len];
if (typeof style[key] === "string") {
styles[camelCase(key)] = style[key];
}
}
return styles;
}
function styleDifference(oldStyle, newStyle) {
var diff = {},
name, value;
for (name in newStyle) {
value = newStyle[name];
if (oldStyle[name] !== value) {
if (!shorthandStyles[name]) {
if ($.fx.step[name] || !isNaN(parseFloat(value))) {
diff[name] = value;
}
}
}
}
return diff;
}
$.effects.animateClass = function(value, duration, easing, callback) {
var o = $.speed(duration, easing, callback);
return this.queue(function() {
var animated = $(this),
baseClass = animated.attr("class") || "",
applyClassChange,
allAnimations = o.children ? animated.find("*").addBack() : animated;
// Map the animated objects to store the original styles.
allAnimations = allAnimations.map(function() {
var el = $(this);
return {
el: el,
start: getElementStyles(this)
};
});
// Apply class change
applyClassChange = function() {
$.each(classAnimationActions, function(i, action) {
if (value[action]) {
animated[action + "Class"](value[action]);
}
});
};
applyClassChange();
// Map all animated objects again - calculate new styles and diff
allAnimations = allAnimations.map(function() {
this.end = getElementStyles(this.el[0]);
this.diff = styleDifference(this.start, this.end);
return this;
});
// Apply original class
animated.attr("class", baseClass);
// Map all animated objects again - this time collecting a promise
allAnimations = allAnimations.map(function() {
var styleInfo = this,
dfd = $.Deferred(),
opts = $.extend({}, o, {
queue: false,
complete: function() {
dfd.resolve(styleInfo);
}
});
this.el.animate(this.diff, opts);
return dfd.promise();
});
// Once all animations have completed:
$.when.apply($, allAnimations.get()).done(function() {
// Set the final class
applyClassChange();
// For each animated element,
// clear all css properties that were animated
$.each(arguments, function() {
var el = this.el;
$.each(this.diff, function(key) {
el.css(key, "");
});
});
// This is guarnteed to be there if you use jQuery.speed()
// it also handles dequeuing the next anim...
o.complete.call(animated[0]);
});
});
};
$.fn.extend({
addClass: (function(orig) {
return function(classNames, speed, easing, callback) {
return speed ?
$.effects.animateClass.call(this,
{ add: classNames }, speed, easing, callback) :
orig.apply(this, arguments);
};
})($.fn.addClass),
removeClass: (function(orig) {
return function(classNames, speed, easing, callback) {
return arguments.length > 1 ?
$.effects.animateClass.call(this,
{ remove: classNames }, speed, easing, callback) :
orig.apply(this, arguments);
};
})($.fn.removeClass),
toggleClass: (function(orig) {
return function(classNames, force, speed, easing, callback) {
if (typeof force === "boolean" || force === undefined) {
if (!speed) {
// Without speed parameter
return orig.apply(this, arguments);
} else {
return $.effects.animateClass.call(this,
(force ? { add: classNames } : { remove: classNames }),
speed, easing, callback);
}
} else {
// Without force parameter
return $.effects.animateClass.call(this,
{ toggle: classNames }, force, speed, easing);
}
};
})($.fn.toggleClass),
switchClass: function(remove, add, speed, easing, callback) {
return $.effects.animateClass.call(this, {
add: add,
remove: remove
}, speed, easing, callback);
}
});
})();
/******************************************************************************/
/*********************************** EFFECTS **********************************/
/******************************************************************************/
(function() {
if ($.expr && $.expr.pseudos && $.expr.pseudos.animated) {
$.expr.pseudos.animated = (function(orig) {
return function(elem) {
return !!$(elem).data(dataSpaceAnimated) || orig(elem);
};
})($.expr.pseudos.animated);
}
if ($.uiBackCompat === true) {
$.extend($.effects, {
// Saves a set of properties in a data storage
save: function(element, set) {
var i = 0, length = set.length;
for (; i < length; i++) {
if (set[i] !== null) {
element.data(dataSpace + set[i], element[0].style[set[i]]);
}
}
},
// Restores a set of previously saved properties from a data storage
restore: function(element, set) {
var val, i = 0, length = set.length;
for (; i < length; i++) {
if (set[i] !== null) {
val = element.data(dataSpace + set[i]);
element.css(set[i], val);
}
}
},
setMode: function(el, mode) {
if (mode === "toggle") {
mode = el.is(":hidden") ? "show" : "hide";
}
return mode;
},
// Wraps the element around a wrapper that copies position properties
createWrapper: function(element) {
// If the element is already wrapped, return it
if (element.parent().is(".ui-effects-wrapper")) {
return element.parent();
}
// Wrap the element
var props = {
width: element.outerWidth(true),
height: element.outerHeight(true),
"float": element.css("float")
},
wrapper = $("")
.addClass("ui-effects-wrapper")
.css({
fontSize: "100%",
background: "transparent",
border: "none",
margin: 0,
padding: 0
}),
// Store the size in case width/height are defined in % - Fixes #5245
size = {
width: element.width(),
height: element.height()
},
active = document.activeElement;
// Support: Firefox
// Firefox incorrectly exposes anonymous content
// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
try {
// eslint-disable-next-line no-unused-expressions
active.id;
} catch (e) {
active = document.body;
}
element.wrap(wrapper);
// Fixes #7595 - Elements lose focus when wrapped.
if (element[0] === active || $.contains(element[0], active)) {
$(active).trigger("focus");
}
// Hotfix for jQuery 1.4 since some change in wrap() seems to actually
// lose the reference to the wrapped element
wrapper = element.parent();
// Transfer positioning properties to the wrapper
if (element.css("position") === "static") {
wrapper.css({ position: "relative" });
element.css({ position: "relative" });
} else {
$.extend(props, {
position: element.css("position"),
zIndex: element.css("z-index")
});
$.each(["top", "left", "bottom", "right"], function(i, pos) {
props[pos] = element.css(pos);
if (isNaN(parseInt(props[pos], 10))) {
props[pos] = "auto";
}
});
element.css({
position: "relative",
top: 0,
left: 0,
right: "auto",
bottom: "auto"
});
}
element.css(size);
return wrapper.css(props).show();
},
removeWrapper: function(element) {
var active = document.activeElement;
if (element.parent().is(".ui-effects-wrapper")) {
element.parent().replaceWith(element);
// Fixes #7595 - Elements lose focus when wrapped.
if (element[0] === active || $.contains(element[0], active)) {
$(active).trigger("focus");
}
}
return element;
}
});
}
$.extend($.effects, {
version: "1.14.1",
define: function(name, mode, effect) {
if (!effect) {
effect = mode;
mode = "effect";
}
$.effects.effect[name] = effect;
$.effects.effect[name].mode = mode;
return effect;
},
scaledDimensions: function(element, percent, direction) {
if (percent === 0) {
return {
height: 0,
width: 0,
outerHeight: 0,
outerWidth: 0
};
}
var x = direction !== "horizontal" ? ((percent || 100) / 100) : 1,
y = direction !== "vertical" ? ((percent || 100) / 100) : 1;
return {
height: element.height() * y,
width: element.width() * x,
outerHeight: element.outerHeight() * y,
outerWidth: element.outerWidth() * x
};
},
clipToBox: function(animation) {
return {
width: animation.clip.right - animation.clip.left,
height: animation.clip.bottom - animation.clip.top,
left: animation.clip.left,
top: animation.clip.top
};
},
// Injects recently queued functions to be first in line (after "inprogress")
unshift: function(element, queueLength, count) {
var queue = element.queue();
if (queueLength > 1) {
queue.splice.apply(queue,
[1, 0].concat(queue.splice(queueLength, count)));
}
element.dequeue();
},
saveStyle: function(element) {
element.data(dataSpaceStyle, element[0].style.cssText);
},
restoreStyle: function(element) {
element[0].style.cssText = element.data(dataSpaceStyle) || "";
element.removeData(dataSpaceStyle);
},
mode: function(element, mode) {
var hidden = element.is(":hidden");
if (mode === "toggle") {
mode = hidden ? "show" : "hide";
}
if (hidden ? mode === "hide" : mode === "show") {
mode = "none";
}
return mode;
},
// Translates a [top,left] array into a baseline value
getBaseline: function(origin, original) {
var y, x;
switch (origin[0]) {
case "top":
y = 0;
break;
case "middle":
y = 0.5;
break;
case "bottom":
y = 1;
break;
default:
y = origin[0] / original.height;
}
switch (origin[1]) {
case "left":
x = 0;
break;
case "center":
x = 0.5;
break;
case "right":
x = 1;
break;
default:
x = origin[1] / original.width;
}
return {
x: x,
y: y
};
},
// Creates a placeholder element so that the original element can be made absolute
createPlaceholder: function(element) {
var placeholder,
cssPosition = element.css("position"),
position = element.position();
// Lock in margins first to account for form elements, which
// will change margin if you explicitly set height
// see: https://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
// Support: Safari
element.css({
marginTop: element.css("marginTop"),
marginBottom: element.css("marginBottom"),
marginLeft: element.css("marginLeft"),
marginRight: element.css("marginRight")
})
.outerWidth(element.outerWidth())
.outerHeight(element.outerHeight());
if (/^(static|relative)/.test(cssPosition)) {
cssPosition = "absolute";
placeholder = $("<" + element[0].nodeName + ">").insertAfter(element).css({
// Convert inline to inline block to account for inline elements
// that turn to inline block based on content (like img)
display: /^(inline|ruby)/.test(element.css("display")) ?
"inline-block" :
"block",
visibility: "hidden",
// Margins need to be set to account for margin collapse
marginTop: element.css("marginTop"),
marginBottom: element.css("marginBottom"),
marginLeft: element.css("marginLeft"),
marginRight: element.css("marginRight"),
"float": element.css("float")
})
.outerWidth(element.outerWidth())
.outerHeight(element.outerHeight())
.addClass("ui-effects-placeholder");
element.data(dataSpace + "placeholder", placeholder);
}
element.css({
position: cssPosition,
left: position.left,
top: position.top
});
return placeholder;
},
removePlaceholder: function(element) {
var dataKey = dataSpace + "placeholder",
placeholder = element.data(dataKey);
if (placeholder) {
placeholder.remove();
element.removeData(dataKey);
}
},
// Removes a placeholder if it exists and restores
// properties that were modified during placeholder creation
cleanUp: function(element) {
$.effects.restoreStyle(element);
$.effects.removePlaceholder(element);
},
setTransition: function(element, list, factor, value) {
value = value || {};
$.each(list, function(i, x) {
var unit = element.cssUnit(x);
if (unit[0] > 0) {
value[x] = unit[0] * factor + unit[1];
}
});
return value;
}
});
// Return an effect options object for the given parameters:
function _normalizeArguments(effect, options, speed, callback) {
// Allow passing all options as the first parameter
if ($.isPlainObject(effect)) {
options = effect;
effect = effect.effect;
}
// Convert to an object
effect = { effect: effect };
// Catch (effect, null, ...)
if (options == null) {
options = {};
}
// Catch (effect, callback)
if (typeof options === "function") {
callback = options;
speed = null;
options = {};
}
// Catch (effect, speed, ?)
if (typeof options === "number" || $.fx.speeds[options]) {
callback = speed;
speed = options;
options = {};
}
// Catch (effect, options, callback)
if (typeof speed === "function") {
callback = speed;
speed = null;
}
// Add options to effect
if (options) {
$.extend(effect, options);
}
speed = speed || options.duration;
effect.duration = $.fx.off ? 0 :
typeof speed === "number" ? speed :
speed in $.fx.speeds ? $.fx.speeds[speed] :
$.fx.speeds._default;
effect.complete = callback || options.complete;
return effect;
}
function standardAnimationOption(option) {
// Valid standard speeds (nothing, number, named speed)
if (!option || typeof option === "number" || $.fx.speeds[option]) {
return true;
}
// Invalid strings - treat as "normal" speed
if (typeof option === "string" && !$.effects.effect[option]) {
return true;
}
// Complete callback
if (typeof option === "function") {
return true;
}
// Options hash (but not naming an effect)
if (typeof option === "object" && !option.effect) {
return true;
}
// Didn't match any standard API
return false;
}
$.fn.extend({
effect: function( /* effect, options, speed, callback */) {
var args = _normalizeArguments.apply(this, arguments),
effectMethod = $.effects.effect[args.effect],
defaultMode = effectMethod.mode,
queue = args.queue,
queueName = queue || "fx",
complete = args.complete,
mode = args.mode,
modes = [],
prefilter = function(next) {
var el = $(this),
normalizedMode = $.effects.mode(el, mode) || defaultMode;
// Sentinel for duck-punching the :animated pseudo-selector
el.data(dataSpaceAnimated, true);
// Save effect mode for later use,
// we can't just call $.effects.mode again later,
// as the .show() below destroys the initial state
modes.push(normalizedMode);
// See $.uiBackCompat inside of run() for removal of defaultMode in 1.14
if (defaultMode && (normalizedMode === "show" ||
(normalizedMode === defaultMode && normalizedMode === "hide"))) {
el.show();
}
if (!defaultMode || normalizedMode !== "none") {
$.effects.saveStyle(el);
}
if (typeof next === "function") {
next();
}
};
if ($.fx.off || !effectMethod) {
// Delegate to the original method (e.g., .show()) if possible
if (mode) {
return this[mode](args.duration, complete);
} else {
return this.each(function() {
if (complete) {
complete.call(this);
}
});
}
}
function run(next) {
var elem = $(this);
function cleanup() {
elem.removeData(dataSpaceAnimated);
$.effects.cleanUp(elem);
if (args.mode === "hide") {
elem.hide();
}
done();
}
function done() {
if (typeof complete === "function") {
complete.call(elem[0]);
}
if (typeof next === "function") {
next();
}
}
// Override mode option on a per element basis,
// as toggle can be either show or hide depending on element state
args.mode = modes.shift();
if ($.uiBackCompat === true && !defaultMode) {
if (elem.is(":hidden") ? mode === "hide" : mode === "show") {
// Call the core method to track "olddisplay" properly
elem[mode]();
done();
} else {
effectMethod.call(elem[0], args, done);
}
} else {
if (args.mode === "none") {
// Call the core method to track "olddisplay" properly
elem[mode]();
done();
} else {
effectMethod.call(elem[0], args, cleanup);
}
}
}
// Run prefilter on all elements first to ensure that
// any showing or hiding happens before placeholder creation,
// which ensures that any layout changes are correctly captured.
return queue === false ?
this.each(prefilter).each(run) :
this.queue(queueName, prefilter).queue(queueName, run);
},
show: (function(orig) {
return function(option) {
if (standardAnimationOption(option)) {
return orig.apply(this, arguments);
} else {
var args = _normalizeArguments.apply(this, arguments);
args.mode = "show";
return this.effect.call(this, args);
}
};
})($.fn.show),
hide: (function(orig) {
return function(option) {
if (standardAnimationOption(option)) {
return orig.apply(this, arguments);
} else {
var args = _normalizeArguments.apply(this, arguments);
args.mode = "hide";
return this.effect.call(this, args);
}
};
})($.fn.hide),
toggle: (function(orig) {
return function(option) {
if (standardAnimationOption(option) || typeof option === "boolean") {
return orig.apply(this, arguments);
} else {
var args = _normalizeArguments.apply(this, arguments);
args.mode = "toggle";
return this.effect.call(this, args);
}
};
})($.fn.toggle),
cssUnit: function(key) {
var style = this.css(key),
val = [];
$.each(["em", "px", "%", "pt"], function(i, unit) {
if (style.indexOf(unit) > 0) {
val = [parseFloat(style), unit];
}
});
return val;
},
cssClip: function(clipObj) {
if (clipObj) {
return this.css("clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
clipObj.bottom + "px " + clipObj.left + "px)");
}
return parseClip(this.css("clip"), this);
},
transfer: function(options, done) {
var element = $(this),
target = $(options.to),
targetFixed = target.css("position") === "fixed",
body = $("body"),
fixTop = targetFixed ? body.scrollTop() : 0,
fixLeft = targetFixed ? body.scrollLeft() : 0,
endPosition = target.offset(),
animation = {
top: endPosition.top - fixTop,
left: endPosition.left - fixLeft,
height: target.innerHeight(),
width: target.innerWidth()
},
startPosition = element.offset(),
transfer = $("");
transfer
.appendTo("body")
.addClass(options.className)
.css({
top: startPosition.top - fixTop,
left: startPosition.left - fixLeft,
height: element.innerHeight(),
width: element.innerWidth(),
position: targetFixed ? "fixed" : "absolute"
})
.animate(animation, options.duration, options.easing, function() {
transfer.remove();
if (typeof done === "function") {
done();
}
});
}
});
function parseClip(str, element) {
var outerWidth = element.outerWidth(),
outerHeight = element.outerHeight(),
clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
values = clipRegex.exec(str) || ["", 0, outerWidth, outerHeight, 0];
return {
top: parseFloat(values[1]) || 0,
right: values[2] === "auto" ? outerWidth : parseFloat(values[2]),
bottom: values[3] === "auto" ? outerHeight : parseFloat(values[3]),
left: parseFloat(values[4]) || 0
};
}
$.fx.step.clip = function(fx) {
if (!fx.clipInit) {
fx.start = $(fx.elem).cssClip();
if (typeof fx.end === "string") {
fx.end = parseClip(fx.end, fx.elem);
}
fx.clipInit = true;
}
$(fx.elem).cssClip({
top: fx.pos * (fx.end.top - fx.start.top) + fx.start.top,
right: fx.pos * (fx.end.right - fx.start.right) + fx.start.right,
bottom: fx.pos * (fx.end.bottom - fx.start.bottom) + fx.start.bottom,
left: fx.pos * (fx.end.left - fx.start.left) + fx.start.left
});
};
})();
/******************************************************************************/
/*********************************** EASING ***********************************/
/******************************************************************************/
(function() {
// Based on easing equations from Robert Penner (http://robertpenner.com/easing)
var baseEasings = {};
$.each(["Quad", "Cubic", "Quart", "Quint", "Expo"], function(i, name) {
baseEasings[name] = function(p) {
return Math.pow(p, i + 2);
};
});
$.extend(baseEasings, {
Sine: function(p) {
return 1 - Math.cos(p * Math.PI / 2);
},
Circ: function(p) {
return 1 - Math.sqrt(1 - p * p);
},
Elastic: function(p) {
return p === 0 || p === 1 ? p :
-Math.pow(2, 8 * (p - 1)) * Math.sin(((p - 1) * 80 - 7.5) * Math.PI / 15);
},
Back: function(p) {
return p * p * (3 * p - 2);
},
Bounce: function(p) {
var pow2,
bounce = 4;
while (p < ((pow2 = Math.pow(2, --bounce)) - 1) / 11) { }
return 1 / Math.pow(4, 3 - bounce) - 7.5625 * Math.pow((pow2 * 3 - 2) / 22 - p, 2);
}
});
$.each(baseEasings, function(name, easeIn) {
$.easing["easeIn" + name] = easeIn;
$.easing["easeOut" + name] = function(p) {
return 1 - easeIn(1 - p);
};
$.easing["easeInOut" + name] = function(p) {
return p < 0.5 ?
easeIn(p * 2) / 2 :
1 - easeIn(p * -2 + 2) / 2;
};
});
})();
var effect = $.effects;
/*!
* jQuery UI Effects Blind 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Blind Effect
//>>group: Effects
//>>description: Blinds the element.
//>>docs: https://api.jqueryui.com/blind-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectBlind = $.effects.define("blind", "hide", function(options, done) {
var map = {
up: ["bottom", "top"],
vertical: ["bottom", "top"],
down: ["top", "bottom"],
left: ["right", "left"],
horizontal: ["right", "left"],
right: ["left", "right"]
},
element = $(this),
direction = options.direction || "up",
start = element.cssClip(),
animate = { clip: $.extend({}, start) },
placeholder = $.effects.createPlaceholder(element);
animate.clip[map[direction][0]] = animate.clip[map[direction][1]];
if (options.mode === "show") {
element.cssClip(animate.clip);
if (placeholder) {
placeholder.css($.effects.clipToBox(animate));
}
animate.clip = start;
}
if (placeholder) {
placeholder.animate($.effects.clipToBox(animate), options.duration, options.easing);
}
element.animate(animate, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: done
});
});
/*!
* jQuery UI Effects Bounce 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Bounce Effect
//>>group: Effects
//>>description: Bounces an element horizontally or vertically n times.
//>>docs: https://api.jqueryui.com/bounce-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectBounce = $.effects.define("bounce", function(options, done) {
var upAnim, downAnim, refValue,
element = $(this),
// Defaults:
mode = options.mode,
hide = mode === "hide",
show = mode === "show",
direction = options.direction || "up",
distance = options.distance,
times = options.times || 5,
// Number of internal animations
anims = times * 2 + (show || hide ? 1 : 0),
speed = options.duration / anims,
easing = options.easing,
// Utility:
ref = (direction === "up" || direction === "down") ? "top" : "left",
motion = (direction === "up" || direction === "left"),
i = 0,
queuelen = element.queue().length;
$.effects.createPlaceholder(element);
refValue = element.css(ref);
// Default distance for the BIGGEST bounce is the outer Distance / 3
if (!distance) {
distance = element[ref === "top" ? "outerHeight" : "outerWidth"]() / 3;
}
if (show) {
downAnim = { opacity: 1 };
downAnim[ref] = refValue;
// If we are showing, force opacity 0 and set the initial position
// then do the "first" animation
element
.css("opacity", 0)
.css(ref, motion ? -distance * 2 : distance * 2)
.animate(downAnim, speed, easing);
}
// Start at the smallest distance if we are hiding
if (hide) {
distance = distance / Math.pow(2, times - 1);
}
downAnim = {};
downAnim[ref] = refValue;
// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
for (; i < times; i++) {
upAnim = {};
upAnim[ref] = (motion ? "-=" : "+=") + distance;
element
.animate(upAnim, speed, easing)
.animate(downAnim, speed, easing);
distance = hide ? distance * 2 : distance / 2;
}
// Last Bounce when Hiding
if (hide) {
upAnim = { opacity: 0 };
upAnim[ref] = (motion ? "-=" : "+=") + distance;
element.animate(upAnim, speed, easing);
}
element.queue(done);
$.effects.unshift(element, queuelen, anims + 1);
});
/*!
* jQuery UI Effects Clip 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Clip Effect
//>>group: Effects
//>>description: Clips the element on and off like an old TV.
//>>docs: https://api.jqueryui.com/clip-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectClip = $.effects.define("clip", "hide", function(options, done) {
var start,
animate = {},
element = $(this),
direction = options.direction || "vertical",
both = direction === "both",
horizontal = both || direction === "horizontal",
vertical = both || direction === "vertical";
start = element.cssClip();
animate.clip = {
top: vertical ? (start.bottom - start.top) / 2 : start.top,
right: horizontal ? (start.right - start.left) / 2 : start.right,
bottom: vertical ? (start.bottom - start.top) / 2 : start.bottom,
left: horizontal ? (start.right - start.left) / 2 : start.left
};
$.effects.createPlaceholder(element);
if (options.mode === "show") {
element.cssClip(animate.clip);
animate.clip = start;
}
element.animate(animate, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: done
});
});
/*!
* jQuery UI Effects Drop 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Drop Effect
//>>group: Effects
//>>description: Moves an element in one direction and hides it at the same time.
//>>docs: https://api.jqueryui.com/drop-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectDrop = $.effects.define("drop", "hide", function(options, done) {
var distance,
element = $(this),
mode = options.mode,
show = mode === "show",
direction = options.direction || "left",
ref = (direction === "up" || direction === "down") ? "top" : "left",
motion = (direction === "up" || direction === "left") ? "-=" : "+=",
oppositeMotion = (motion === "+=") ? "-=" : "+=",
animation = {
opacity: 0
};
$.effects.createPlaceholder(element);
distance = options.distance ||
element[ref === "top" ? "outerHeight" : "outerWidth"](true) / 2;
animation[ref] = motion + distance;
if (show) {
element.css(animation);
animation[ref] = oppositeMotion + distance;
animation.opacity = 1;
}
// Animate
element.animate(animation, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: done
});
});
/*!
* jQuery UI Effects Explode 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Explode Effect
//>>group: Effects
/* eslint-disable max-len */
//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
/* eslint-enable max-len */
//>>docs: https://api.jqueryui.com/explode-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectExplode = $.effects.define("explode", "hide", function(options, done) {
var i, j, left, top, mx, my,
rows = options.pieces ? Math.round(Math.sqrt(options.pieces)) : 3,
cells = rows,
element = $(this),
mode = options.mode,
show = mode === "show",
// Show and then visibility:hidden the element before calculating offset
offset = element.show().css("visibility", "hidden").offset(),
// Width and height of a piece
width = Math.ceil(element.outerWidth() / cells),
height = Math.ceil(element.outerHeight() / rows),
pieces = [];
// Children animate complete:
function childComplete() {
pieces.push(this);
if (pieces.length === rows * cells) {
animComplete();
}
}
// Clone the element for each row and cell.
for (i = 0; i < rows; i++) { // ===>
top = offset.top + i * height;
my = i - (rows - 1) / 2;
for (j = 0; j < cells; j++) { // |||
left = offset.left + j * width;
mx = j - (cells - 1) / 2;
// Create a clone of the now hidden main element that will be absolute positioned
// within a wrapper div off the -left and -top equal to size of our pieces
element
.clone()
.appendTo("body")
.wrap("")
.css({
position: "absolute",
visibility: "visible",
left: -j * width,
top: -i * height
})
// Select the wrapper - make it overflow: hidden and absolute positioned based on
// where the original was located +left and +top equal to the size of pieces
.parent()
.addClass("ui-effects-explode")
.css({
position: "absolute",
overflow: "hidden",
width: width,
height: height,
left: left + (show ? mx * width : 0),
top: top + (show ? my * height : 0),
opacity: show ? 0 : 1
})
.animate({
left: left + (show ? 0 : mx * width),
top: top + (show ? 0 : my * height),
opacity: show ? 1 : 0
}, options.duration || 500, options.easing, childComplete);
}
}
function animComplete() {
element.css({
visibility: "visible"
});
$(pieces).remove();
done();
}
});
/*!
* jQuery UI Effects Fade 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Fade Effect
//>>group: Effects
//>>description: Fades the element.
//>>docs: https://api.jqueryui.com/fade-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectFade = $.effects.define("fade", "toggle", function(options, done) {
var show = options.mode === "show";
$(this)
.css("opacity", show ? 0 : 1)
.animate({
opacity: show ? 1 : 0
}, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: done
});
});
/*!
* jQuery UI Effects Fold 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Fold Effect
//>>group: Effects
//>>description: Folds an element first horizontally and then vertically.
//>>docs: https://api.jqueryui.com/fold-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectFold = $.effects.define("fold", "hide", function(options, done) {
// Create element
var element = $(this),
mode = options.mode,
show = mode === "show",
hide = mode === "hide",
size = options.size || 15,
percent = /([0-9]+)%/.exec(size),
horizFirst = !!options.horizFirst,
ref = horizFirst ? ["right", "bottom"] : ["bottom", "right"],
duration = options.duration / 2,
placeholder = $.effects.createPlaceholder(element),
start = element.cssClip(),
animation1 = { clip: $.extend({}, start) },
animation2 = { clip: $.extend({}, start) },
distance = [start[ref[0]], start[ref[1]]],
queuelen = element.queue().length;
if (percent) {
size = parseInt(percent[1], 10) / 100 * distance[hide ? 0 : 1];
}
animation1.clip[ref[0]] = size;
animation2.clip[ref[0]] = size;
animation2.clip[ref[1]] = 0;
if (show) {
element.cssClip(animation2.clip);
if (placeholder) {
placeholder.css($.effects.clipToBox(animation2));
}
animation2.clip = start;
}
// Animate
element
.queue(function(next) {
if (placeholder) {
placeholder
.animate($.effects.clipToBox(animation1), duration, options.easing)
.animate($.effects.clipToBox(animation2), duration, options.easing);
}
next();
})
.animate(animation1, duration, options.easing)
.animate(animation2, duration, options.easing)
.queue(done);
$.effects.unshift(element, queuelen, 4);
});
/*!
* jQuery UI Effects Highlight 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Highlight Effect
//>>group: Effects
//>>description: Highlights the background of an element in a defined color for a custom duration.
//>>docs: https://api.jqueryui.com/highlight-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectHighlight = $.effects.define("highlight", "show", function(options, done) {
var element = $(this),
animation = {
backgroundColor: element.css("backgroundColor")
};
if (options.mode === "hide") {
animation.opacity = 0;
}
$.effects.saveStyle(element);
element
.css({
backgroundImage: "none",
backgroundColor: options.color || "#ffff99"
})
.animate(animation, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: done
});
});
/*!
* jQuery UI Effects Size 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Size Effect
//>>group: Effects
//>>description: Resize an element to a specified width and height.
//>>docs: https://api.jqueryui.com/size-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectSize = $.effects.define("size", function(options, done) {
// Create element
var baseline, factor, temp,
element = $(this),
// Copy for children
cProps = ["fontSize"],
vProps = ["borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom"],
hProps = ["borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight"],
// Set options
mode = options.mode,
restore = mode !== "effect",
scale = options.scale || "both",
origin = options.origin || ["middle", "center"],
position = element.css("position"),
pos = element.position(),
original = $.effects.scaledDimensions(element),
from = options.from || original,
to = options.to || $.effects.scaledDimensions(element, 0);
$.effects.createPlaceholder(element);
if (mode === "show") {
temp = from;
from = to;
to = temp;
}
// Set scaling factor
factor = {
from: {
y: from.height / original.height,
x: from.width / original.width
},
to: {
y: to.height / original.height,
x: to.width / original.width
}
};
// Scale the css box
if (scale === "box" || scale === "both") {
// Vertical props scaling
if (factor.from.y !== factor.to.y) {
from = $.effects.setTransition(element, vProps, factor.from.y, from);
to = $.effects.setTransition(element, vProps, factor.to.y, to);
}
// Horizontal props scaling
if (factor.from.x !== factor.to.x) {
from = $.effects.setTransition(element, hProps, factor.from.x, from);
to = $.effects.setTransition(element, hProps, factor.to.x, to);
}
}
// Scale the content
if (scale === "content" || scale === "both") {
// Vertical props scaling
if (factor.from.y !== factor.to.y) {
from = $.effects.setTransition(element, cProps, factor.from.y, from);
to = $.effects.setTransition(element, cProps, factor.to.y, to);
}
}
// Adjust the position properties based on the provided origin points
if (origin) {
baseline = $.effects.getBaseline(origin, original);
from.top = (original.outerHeight - from.outerHeight) * baseline.y + pos.top;
from.left = (original.outerWidth - from.outerWidth) * baseline.x + pos.left;
to.top = (original.outerHeight - to.outerHeight) * baseline.y + pos.top;
to.left = (original.outerWidth - to.outerWidth) * baseline.x + pos.left;
}
delete from.outerHeight;
delete from.outerWidth;
element.css(from);
// Animate the children if desired
if (scale === "content" || scale === "both") {
vProps = vProps.concat(["marginTop", "marginBottom"]).concat(cProps);
hProps = hProps.concat(["marginLeft", "marginRight"]);
// Only animate children with width attributes specified
// TODO: is this right? should we include anything with css width specified as well
element.find("*[width]").each(function() {
var child = $(this),
childOriginal = $.effects.scaledDimensions(child),
childFrom = {
height: childOriginal.height * factor.from.y,
width: childOriginal.width * factor.from.x,
outerHeight: childOriginal.outerHeight * factor.from.y,
outerWidth: childOriginal.outerWidth * factor.from.x
},
childTo = {
height: childOriginal.height * factor.to.y,
width: childOriginal.width * factor.to.x,
outerHeight: childOriginal.height * factor.to.y,
outerWidth: childOriginal.width * factor.to.x
};
// Vertical props scaling
if (factor.from.y !== factor.to.y) {
childFrom = $.effects.setTransition(child, vProps, factor.from.y, childFrom);
childTo = $.effects.setTransition(child, vProps, factor.to.y, childTo);
}
// Horizontal props scaling
if (factor.from.x !== factor.to.x) {
childFrom = $.effects.setTransition(child, hProps, factor.from.x, childFrom);
childTo = $.effects.setTransition(child, hProps, factor.to.x, childTo);
}
if (restore) {
$.effects.saveStyle(child);
}
// Animate children
child.css(childFrom);
child.animate(childTo, options.duration, options.easing, function() {
// Restore children
if (restore) {
$.effects.restoreStyle(child);
}
});
});
}
// Animate
element.animate(to, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: function() {
var offset = element.offset();
if (to.opacity === 0) {
element.css("opacity", from.opacity);
}
if (!restore) {
element
.css("position", position === "static" ? "relative" : position)
.offset(offset);
// Need to save style here so that automatic style restoration
// doesn't restore to the original styles from before the animation.
$.effects.saveStyle(element);
}
done();
}
});
});
/*!
* jQuery UI Effects Scale 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Scale Effect
//>>group: Effects
//>>description: Grows or shrinks an element and its content.
//>>docs: https://api.jqueryui.com/scale-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectScale = $.effects.define("scale", function(options, done) {
// Create element
var el = $(this),
mode = options.mode,
percent = parseInt(options.percent, 10) ||
(parseInt(options.percent, 10) === 0 ? 0 : (mode !== "effect" ? 0 : 100)),
newOptions = $.extend(true, {
from: $.effects.scaledDimensions(el),
to: $.effects.scaledDimensions(el, percent, options.direction || "both"),
origin: options.origin || ["middle", "center"]
}, options);
// Fade option to support puff
if (options.fade) {
newOptions.from.opacity = 1;
newOptions.to.opacity = 0;
}
$.effects.effect.size.call(this, newOptions, done);
});
/*!
* jQuery UI Effects Puff 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Puff Effect
//>>group: Effects
//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
//>>docs: https://api.jqueryui.com/puff-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectPuff = $.effects.define("puff", "hide", function(options, done) {
var newOptions = $.extend(true, {}, options, {
fade: true,
percent: parseInt(options.percent, 10) || 150
});
$.effects.effect.scale.call(this, newOptions, done);
});
/*!
* jQuery UI Effects Pulsate 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Pulsate Effect
//>>group: Effects
//>>description: Pulsates an element n times by changing the opacity to zero and back.
//>>docs: https://api.jqueryui.com/pulsate-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectPulsate = $.effects.define("pulsate", "show", function(options, done) {
var element = $(this),
mode = options.mode,
show = mode === "show",
hide = mode === "hide",
showhide = show || hide,
// Showing or hiding leaves off the "last" animation
anims = ((options.times || 5) * 2) + (showhide ? 1 : 0),
duration = options.duration / anims,
animateTo = 0,
i = 1,
queuelen = element.queue().length;
if (show || !element.is(":visible")) {
element.css("opacity", 0).show();
animateTo = 1;
}
// Anims - 1 opacity "toggles"
for (; i < anims; i++) {
element.animate({ opacity: animateTo }, duration, options.easing);
animateTo = 1 - animateTo;
}
element.animate({ opacity: animateTo }, duration, options.easing);
element.queue(done);
$.effects.unshift(element, queuelen, anims + 1);
});
/*!
* jQuery UI Effects Shake 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Shake Effect
//>>group: Effects
//>>description: Shakes an element horizontally or vertically n times.
//>>docs: https://api.jqueryui.com/shake-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectShake = $.effects.define("shake", function(options, done) {
var i = 1,
element = $(this),
direction = options.direction || "left",
distance = options.distance || 20,
times = options.times || 3,
anims = times * 2 + 1,
speed = Math.round(options.duration / anims),
ref = (direction === "up" || direction === "down") ? "top" : "left",
positiveMotion = (direction === "up" || direction === "left"),
animation = {},
animation1 = {},
animation2 = {},
queuelen = element.queue().length;
$.effects.createPlaceholder(element);
// Animation
animation[ref] = (positiveMotion ? "-=" : "+=") + distance;
animation1[ref] = (positiveMotion ? "+=" : "-=") + distance * 2;
animation2[ref] = (positiveMotion ? "-=" : "+=") + distance * 2;
// Animate
element.animate(animation, speed, options.easing);
// Shakes
for (; i < times; i++) {
element
.animate(animation1, speed, options.easing)
.animate(animation2, speed, options.easing);
}
element
.animate(animation1, speed, options.easing)
.animate(animation, speed / 2, options.easing)
.queue(done);
$.effects.unshift(element, queuelen, anims + 1);
});
/*!
* jQuery UI Effects Slide 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Slide Effect
//>>group: Effects
//>>description: Slides an element in and out of the viewport.
//>>docs: https://api.jqueryui.com/slide-effect/
//>>demos: https://jqueryui.com/effect/
var effectsEffectSlide = $.effects.define("slide", "show", function(options, done) {
var startClip, startRef,
element = $(this),
map = {
up: ["bottom", "top"],
down: ["top", "bottom"],
left: ["right", "left"],
right: ["left", "right"]
},
mode = options.mode,
direction = options.direction || "left",
ref = (direction === "up" || direction === "down") ? "top" : "left",
positiveMotion = (direction === "up" || direction === "left"),
distance = options.distance ||
element[ref === "top" ? "outerHeight" : "outerWidth"](true),
animation = {};
$.effects.createPlaceholder(element);
startClip = element.cssClip();
startRef = element.position()[ref];
// Define hide animation
animation[ref] = (positiveMotion ? -1 : 1) * distance + startRef;
animation.clip = element.cssClip();
animation.clip[map[direction][1]] = animation.clip[map[direction][0]];
// Reverse the animation if we're showing
if (mode === "show") {
element.cssClip(animation.clip);
element.css(ref, animation[ref]);
animation.clip = startClip;
animation[ref] = startRef;
}
// Actually animate
element.animate(animation, {
queue: false,
duration: options.duration,
easing: options.easing,
complete: done
});
});
/*!
* jQuery UI Effects Transfer 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Transfer Effect
//>>group: Effects
//>>description: Displays a transfer effect from one element to another.
//>>docs: https://api.jqueryui.com/transfer-effect/
//>>demos: https://jqueryui.com/effect/
var effect;
if ($.uiBackCompat === true) {
effect = $.effects.define("transfer", function(options, done) {
$(this).transfer(options, done);
});
}
var effectsEffectTransfer = effect;
/*!
* jQuery UI Focusable 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: :focusable Selector
//>>group: Core
//>>description: Selects elements which can be focused.
//>>docs: https://api.jqueryui.com/focusable-selector/
// Selectors
$.ui.focusable = function(element, hasTabindex) {
var map, mapName, img, focusableIfVisible, fieldset,
nodeName = element.nodeName.toLowerCase();
if ("area" === nodeName) {
map = element.parentNode;
mapName = map.name;
if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
return false;
}
img = $("img[usemap='#" + mapName + "']");
return img.length > 0 && img.is(":visible");
}
if (/^(input|select|textarea|button|object)$/.test(nodeName)) {
focusableIfVisible = !element.disabled;
if (focusableIfVisible) {
// Form controls within a disabled fieldset are disabled.
// However, controls within the fieldset's legend do not get disabled.
// Since controls generally aren't placed inside legends, we skip
// this portion of the check.
fieldset = $(element).closest("fieldset")[0];
if (fieldset) {
focusableIfVisible = !fieldset.disabled;
}
}
} else if ("a" === nodeName) {
focusableIfVisible = element.href || hasTabindex;
} else {
focusableIfVisible = hasTabindex;
}
return focusableIfVisible && $(element).is(":visible") &&
$(element).css("visibility") === "visible";
};
$.extend($.expr.pseudos, {
focusable: function(element) {
return $.ui.focusable(element, $.attr(element, "tabindex") != null);
}
});
var focusable = $.ui.focusable;
/*!
* jQuery UI Form Reset Mixin 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Form Reset Mixin
//>>group: Core
//>>description: Refresh input widgets when their form is reset
//>>docs: https://api.jqueryui.com/form-reset-mixin/
var formResetMixin = $.ui.formResetMixin = {
_formResetHandler: function() {
var form = $(this);
// Wait for the form reset to actually happen before refreshing
setTimeout(function() {
var instances = form.data("ui-form-reset-instances");
$.each(instances, function() {
this.refresh();
});
});
},
_bindFormResetHandler: function() {
this.form = $(this.element.prop("form"));
if (!this.form.length) {
return;
}
var instances = this.form.data("ui-form-reset-instances") || [];
if (!instances.length) {
// We don't use _on() here because we use a single event handler per form
this.form.on("reset.ui-form-reset", this._formResetHandler);
}
instances.push(this);
this.form.data("ui-form-reset-instances", instances);
},
_unbindFormResetHandler: function() {
if (!this.form.length) {
return;
}
var instances = this.form.data("ui-form-reset-instances");
instances.splice($.inArray(this, instances), 1);
if (instances.length) {
this.form.data("ui-form-reset-instances", instances);
} else {
this.form
.removeData("ui-form-reset-instances")
.off("reset.ui-form-reset");
}
}
};
/*!
* jQuery UI Legacy jQuery Core patches 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*
*/
//>>label: Legacy jQuery Core patches
//>>group: Core
//>>description: Backport `.even()`, `.odd()` and `$.escapeSelector` to older jQuery Core versions (deprecated)
// Support: jQuery 2.2.x or older.
// This method has been defined in jQuery 3.0.0.
// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js
if (!$.escapeSelector) {
$.escapeSelector = function(id) {
return CSS.escape(id + "");
};
}
// Support: jQuery 3.4.x or older
// These methods have been defined in jQuery 3.5.0.
if (!$.fn.even || !$.fn.odd) {
$.fn.extend({
even: function() {
return this.filter(function(i) {
return i % 2 === 0;
});
},
odd: function() {
return this.filter(function(i) {
return i % 2 === 1;
});
}
});
}
;
/*!
* jQuery UI Keycode 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Keycode
//>>group: Core
//>>description: Provide keycodes as keynames
//>>docs: https://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 Labels 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: labels
//>>group: Core
//>>description: Find all the labels associated with a given input
//>>docs: https://api.jqueryui.com/labels/
var labels = $.fn.labels = function() {
var ancestor, selector, id, labels, ancestors;
if (!this.length) {
return this.pushStack([]);
}
// Check control.labels first
if (this[0].labels && this[0].labels.length) {
return this.pushStack(this[0].labels);
}
// If `control.labels` is empty - e.g. inside of document fragments - find
// the labels manually
labels = this.eq(0).parents("label");
// Look for the label based on the id
id = this.attr("id");
if (id) {
// We don't search against the document in case the element
// is disconnected from the DOM
ancestor = this.eq(0).parents().last();
// Get a full set of top level ancestors
ancestors = ancestor.add(ancestor.length ? ancestor.siblings() : this.siblings());
// Create a selector for the label based on the id
selector = "label[for='" + CSS.escape(id) + "']";
labels = labels.add(ancestors.find(selector).addBack(selector));
}
// Return whatever we have found for labels
return this.pushStack(labels);
};
/*!
* jQuery UI Scroll Parent 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: scrollParent
//>>group: Core
//>>description: Get the closest ancestor element that is scrollable.
//>>docs: https://api.jqueryui.com/scrollParent/
var scrollParent = $.fn.scrollParent = function(includeHidden) {
var position = this.css("position"),
excludeStaticParent = position === "absolute",
overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
scrollParent = this.parents().filter(function() {
var parent = $(this);
if (excludeStaticParent && parent.css("position") === "static") {
return false;
}
return overflowRegex.test(parent.css("overflow") + parent.css("overflow-y") +
parent.css("overflow-x"));
}).eq(0);
return position === "fixed" || !scrollParent.length ?
$(this[0].ownerDocument || document) :
scrollParent;
};
/*!
* jQuery UI Tabbable 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: :tabbable Selector
//>>group: Core
//>>description: Selects elements which can be tabbed to.
//>>docs: https://api.jqueryui.com/tabbable-selector/
var tabbable = $.extend($.expr.pseudos, {
tabbable: function(element) {
var tabIndex = $.attr(element, "tabindex"),
hasTabindex = tabIndex != null;
return (!hasTabindex || tabIndex >= 0) && $.ui.focusable(element, hasTabindex);
}
});
/*!
* jQuery UI Unique ID 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: uniqueId
//>>group: Core
//>>description: Functions to generate and remove uniqueId's
//>>docs: https://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");
}
});
}
});
/*!
* jQuery UI Accordion 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Accordion
//>>group: Widgets
/* eslint-disable max-len */
//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
/* eslint-enable max-len */
//>>docs: https://api.jqueryui.com/accordion/
//>>demos: https://jqueryui.com/accordion/
//>>css.structure: ../../themes/base/core.css
//>>css.structure: ../../themes/base/accordion.css
//>>css.theme: ../../themes/base/theme.css
var widgetsAccordion = $.widget("ui.accordion", {
version: "1.14.1",
options: {
active: 0,
animate: {},
classes: {
"ui-accordion-header": "ui-corner-top",
"ui-accordion-header-collapsed": "ui-corner-all",
"ui-accordion-content": "ui-corner-bottom"
},
collapsible: false,
event: "click",
header: function(elem) {
return elem
.find("> li > :first-child")
.add(
elem.find("> :not(li)")
// Support: jQuery <3.5 only
// We could use `.even()` but that's unavailable in older jQuery.
.filter(function(i) {
return i % 2 === 0;
})
);
},
heightStyle: "auto",
icons: {
activeHeader: "ui-icon-triangle-1-s",
header: "ui-icon-triangle-1-e"
},
// Callbacks
activate: null,
beforeActivate: null
},
hideProps: {
borderTopWidth: "hide",
borderBottomWidth: "hide",
paddingTop: "hide",
paddingBottom: "hide",
height: "hide"
},
showProps: {
borderTopWidth: "show",
borderBottomWidth: "show",
paddingTop: "show",
paddingBottom: "show",
height: "show"
},
_create: function() {
var options = this.options;
this.prevShow = this.prevHide = $();
this._addClass("ui-accordion", "ui-widget ui-helper-reset");
this.element.attr("role", "tablist");
// Don't allow collapsible: false and active: false / null
if (!options.collapsible && (options.active === false || options.active == null)) {
options.active = 0;
}
this._processPanels();
// handle negative values
if (options.active < 0) {
options.active += this.headers.length;
}
this._refresh();
},
_getCreateEventData: function() {
return {
header: this.active,
panel: !this.active.length ? $() : this.active.next()
};
},
_createIcons: function() {
var icon, children,
icons = this.options.icons;
if (icons) {
icon = $("");
this._addClass(icon, "ui-accordion-header-icon", "ui-icon " + icons.header);
icon.prependTo(this.headers);
children = this.active.children(".ui-accordion-header-icon");
this._removeClass(children, icons.header)
._addClass(children, null, icons.activeHeader)
._addClass(this.headers, "ui-accordion-icons");
}
},
_destroyIcons: function() {
this._removeClass(this.headers, "ui-accordion-icons");
this.headers.children(".ui-accordion-header-icon").remove();
},
_destroy: function() {
var contents;
// Clean up main element
this.element.removeAttr("role");
// Clean up headers
this.headers
.removeAttr("role aria-expanded aria-selected aria-controls tabIndex")
.removeUniqueId();
this._destroyIcons();
// Clean up content panels
contents = this.headers.next()
.css("display", "")
.removeAttr("role aria-hidden aria-labelledby")
.removeUniqueId();
if (this.options.heightStyle !== "content") {
contents.css("height", "");
}
},
_setOption: function(key, value) {
if (key === "active") {
// _activate() will handle invalid values and update this.options
this._activate(value);
return;
}
if (key === "event") {
if (this.options.event) {
this._off(this.headers, this.options.event);
}
this._setupEvents(value);
}
this._super(key, value);
// Setting collapsible: false while collapsed; open first panel
if (key === "collapsible" && !value && this.options.active === false) {
this._activate(0);
}
if (key === "icons") {
this._destroyIcons();
if (value) {
this._createIcons();
}
}
},
_setOptionDisabled: function(value) {
this._super(value);
this.element.attr("aria-disabled", value);
this._toggleClass(null, "ui-state-disabled", !!value);
},
_keydown: function(event) {
if (event.altKey || event.ctrlKey) {
return;
}
var keyCode = $.ui.keyCode,
length = this.headers.length,
currentIndex = this.headers.index(event.target),
toFocus = false;
switch (event.keyCode) {
case keyCode.RIGHT:
case keyCode.DOWN:
toFocus = this.headers[(currentIndex + 1) % length];
break;
case keyCode.LEFT:
case keyCode.UP:
toFocus = this.headers[(currentIndex - 1 + length) % length];
break;
case keyCode.SPACE:
case keyCode.ENTER:
this._eventHandler(event);
break;
case keyCode.HOME:
toFocus = this.headers[0];
break;
case keyCode.END:
toFocus = this.headers[length - 1];
break;
}
if (toFocus) {
$(event.target).attr("tabIndex", -1);
$(toFocus).attr("tabIndex", 0);
$(toFocus).trigger("focus");
event.preventDefault();
}
},
_panelKeyDown: function(event) {
if (event.keyCode === $.ui.keyCode.UP && event.ctrlKey) {
$(event.currentTarget).prev().trigger("focus");
}
},
refresh: function() {
var options = this.options;
this._processPanels();
// Was collapsed or no panel
if ((options.active === false && options.collapsible === true) ||
!this.headers.length) {
options.active = false;
this.active = $();
// active false only when collapsible is true
} else if (options.active === false) {
this._activate(0);
// was active, but active panel is gone
} else if (this.active.length && !$.contains(this.element[0], this.active[0])) {
// all remaining panel are disabled
if (this.headers.length === this.headers.find(".ui-state-disabled").length) {
options.active = false;
this.active = $();
// activate previous panel
} else {
this._activate(Math.max(0, options.active - 1));
}
// was active, active panel still exists
} else {
// make sure active index is correct
options.active = this.headers.index(this.active);
}
this._destroyIcons();
this._refresh();
},
_processPanels: function() {
var prevHeaders = this.headers,
prevPanels = this.panels;
if (typeof this.options.header === "function") {
this.headers = this.options.header(this.element);
} else {
this.headers = this.element.find(this.options.header);
}
this._addClass(this.headers, "ui-accordion-header ui-accordion-header-collapsed",
"ui-state-default");
this.panels = this.headers.next().filter(":not(.ui-accordion-content-active)").hide();
this._addClass(this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content");
// Avoid memory leaks (#10056)
if (prevPanels) {
this._off(prevHeaders.not(this.headers));
this._off(prevPanels.not(this.panels));
}
},
_refresh: function() {
var maxHeight,
options = this.options,
heightStyle = options.heightStyle,
parent = this.element.parent();
this.active = this._findActive(options.active);
this._addClass(this.active, "ui-accordion-header-active", "ui-state-active")
._removeClass(this.active, "ui-accordion-header-collapsed");
this._addClass(this.active.next(), "ui-accordion-content-active");
this.active.next().show();
this.headers
.attr("role", "tab")
.each(function() {
var header = $(this),
headerId = header.uniqueId().attr("id"),
panel = header.next(),
panelId = panel.uniqueId().attr("id");
header.attr("aria-controls", panelId);
panel.attr("aria-labelledby", headerId);
})
.next()
.attr("role", "tabpanel");
this.headers
.not(this.active)
.attr({
"aria-selected": "false",
"aria-expanded": "false",
tabIndex: -1
})
.next()
.attr({
"aria-hidden": "true"
})
.hide();
// Make sure at least one header is in the tab order
if (!this.active.length) {
this.headers.eq(0).attr("tabIndex", 0);
} else {
this.active.attr({
"aria-selected": "true",
"aria-expanded": "true",
tabIndex: 0
})
.next()
.attr({
"aria-hidden": "false"
});
}
this._createIcons();
this._setupEvents(options.event);
if (heightStyle === "fill") {
maxHeight = parent.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.headers.each(function() {
maxHeight -= $(this).outerHeight(true);
});
this.headers.next()
.each(function() {
$(this).height(Math.max(0, maxHeight -
$(this).innerHeight() + $(this).height()));
})
.css("overflow", "auto");
} else if (heightStyle === "auto") {
maxHeight = 0;
this.headers.next()
.each(function() {
var isVisible = $(this).is(":visible");
if (!isVisible) {
$(this).show();
}
maxHeight = Math.max(maxHeight, $(this).css("height", "").height());
if (!isVisible) {
$(this).hide();
}
})
.height(maxHeight);
}
},
_activate: function(index) {
var active = this._findActive(index)[0];
// Trying to activate the already active panel
if (active === this.active[0]) {
return;
}
// Trying to collapse, simulate a click on the currently active header
active = active || this.active[0];
this._eventHandler({
target: active,
currentTarget: active,
preventDefault: $.noop
});
},
_findActive: function(selector) {
return typeof selector === "number" ? this.headers.eq(selector) : $();
},
_setupEvents: function(event) {
var events = {
keydown: "_keydown"
};
if (event) {
$.each(event.split(" "), function(index, eventName) {
events[eventName] = "_eventHandler";
});
}
this._off(this.headers.add(this.headers.next()));
this._on(this.headers, events);
this._on(this.headers.next(), { keydown: "_panelKeyDown" });
this._hoverable(this.headers);
this._focusable(this.headers);
},
_eventHandler: function(event) {
var activeChildren, clickedChildren,
options = this.options,
active = this.active,
clicked = $(event.currentTarget),
clickedIsActive = clicked[0] === active[0],
collapsing = clickedIsActive && options.collapsible,
toShow = collapsing ? $() : clicked.next(),
toHide = active.next(),
eventData = {
oldHeader: active,
oldPanel: toHide,
newHeader: collapsing ? $() : clicked,
newPanel: toShow
};
event.preventDefault();
if (
// 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.headers.index(clicked);
// When the call to ._toggle() comes after the class changes
// it causes a very odd bug in IE 8 (see #6720)
this.active = clickedIsActive ? $() : clicked;
this._toggle(eventData);
// Switch classes
// corner classes on the previously active header stay after the animation
this._removeClass(active, "ui-accordion-header-active", "ui-state-active");
if (options.icons) {
activeChildren = active.children(".ui-accordion-header-icon");
this._removeClass(activeChildren, null, options.icons.activeHeader)
._addClass(activeChildren, null, options.icons.header);
}
if (!clickedIsActive) {
this._removeClass(clicked, "ui-accordion-header-collapsed")
._addClass(clicked, "ui-accordion-header-active", "ui-state-active");
if (options.icons) {
clickedChildren = clicked.children(".ui-accordion-header-icon");
this._removeClass(clickedChildren, null, options.icons.header)
._addClass(clickedChildren, null, options.icons.activeHeader);
}
this._addClass(clicked.next(), "ui-accordion-content-active");
}
},
_toggle: function(data) {
var toShow = data.newPanel,
toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
// Handle activating a panel during the animation for another activation
this.prevShow.add(this.prevHide).stop(true, true);
this.prevShow = toShow;
this.prevHide = toHide;
if (this.options.animate) {
this._animate(toShow, toHide, data);
} else {
toHide.hide();
toShow.show();
this._toggleComplete(data);
}
toHide.attr({
"aria-hidden": "true"
});
toHide.prev().attr({
"aria-selected": "false",
"aria-expanded": "false"
});
// if we're switching panels, remove the old header from the tab order
// if we're opening from collapsed state, remove the previous header from the tab order
// if we're collapsing, then keep the collapsing header in the tab order
if (toShow.length && toHide.length) {
toHide.prev().attr({
"tabIndex": -1,
"aria-expanded": "false"
});
} else if (toShow.length) {
this.headers.filter(function() {
return parseInt($(this).attr("tabIndex"), 10) === 0;
})
.attr("tabIndex", -1);
}
toShow
.attr("aria-hidden", "false")
.prev()
.attr({
"aria-selected": "true",
"aria-expanded": "true",
tabIndex: 0
});
},
_animate: function(toShow, toHide, data) {
var total, easing, duration,
that = this,
adjust = 0,
boxSizing = toShow.css("box-sizing"),
down = toShow.length &&
(!toHide.length || (toShow.index() < toHide.index())),
animate = this.options.animate || {},
options = down && animate.down || animate,
complete = function() {
that._toggleComplete(data);
};
if (typeof options === "number") {
duration = options;
}
if (typeof options === "string") {
easing = options;
}
// fall back from options to animation in case of partial down settings
easing = easing || options.easing || animate.easing;
duration = duration || options.duration || animate.duration;
if (!toHide.length) {
return toShow.animate(this.showProps, duration, easing, complete);
}
if (!toShow.length) {
return toHide.animate(this.hideProps, duration, easing, complete);
}
total = toShow.show().outerHeight();
toHide.animate(this.hideProps, {
duration: duration,
easing: easing,
step: function(now, fx) {
fx.now = Math.round(now);
}
});
toShow
.hide()
.animate(this.showProps, {
duration: duration,
easing: easing,
complete: complete,
step: function(now, fx) {
fx.now = Math.round(now);
if (fx.prop !== "height") {
if (boxSizing === "content-box") {
adjust += fx.now;
}
} else if (that.options.heightStyle !== "content") {
fx.now = Math.round(total - toHide.outerHeight() - adjust);
adjust = 0;
}
}
});
},
_toggleComplete: function(data) {
var toHide = data.oldPanel,
prev = toHide.prev();
this._removeClass(toHide, "ui-accordion-content-active");
this._removeClass(prev, "ui-accordion-header-active")
._addClass(prev, "ui-accordion-header-collapsed");
this._trigger("activate", null, data);
}
});
/*!
* jQuery UI Menu 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Menu
//>>group: Widgets
//>>description: Creates nestable menus.
//>>docs: https://api.jqueryui.com/menu/
//>>demos: https://jqueryui.com/menu/
//>>css.structure: ../../themes/base/core.css
//>>css.structure: ../../themes/base/menu.css
//>>css.theme: ../../themes/base/theme.css
var widgetsMenu = $.widget("ui.menu", {
version: "1.14.1",
defaultElement: "
",
delay: 300,
options: {
icons: {
submenu: "ui-icon-caret-1-e"
},
items: "> *",
menus: "ul",
position: {
my: "left top",
at: "right top"
},
role: "menu",
// Callbacks
blur: null,
focus: null,
select: null
},
_create: function() {
this.activeMenu = this.element;
// Flag used to prevent firing of the click handler
// as the event bubbles up through nested menus
this.mouseHandled = false;
this.lastMousePosition = { x: null, y: null };
this.element
.uniqueId()
.attr({
role: this.options.role,
tabIndex: 0
});
this._addClass("ui-menu", "ui-widget ui-widget-content");
this._on({
// Prevent focus from sticking to links inside menu after clicking
// them (focus should always stay on UL during navigation).
"mousedown .ui-menu-item": function(event) {
event.preventDefault();
this._activateItem(event);
},
"click .ui-menu-item": function(event) {
var target = $(event.target);
var active = $(this.document[0].activeElement);
if (!this.mouseHandled && target.not(".ui-state-disabled").length) {
this.select(event);
// Only set the mouseHandled flag if the event will bubble, see #9469.
if (!event.isPropagationStopped()) {
this.mouseHandled = true;
}
// Open submenu on click
if (target.has(".ui-menu").length) {
this.expand(event);
} else if (!this.element.is(":focus") &&
active.closest(".ui-menu").length) {
// Redirect focus to the menu
this.element.trigger("focus", [true]);
// If the active item is on the top level, let it stay active.
// Otherwise, blur the active item since it is no longer visible.
if (this.active && this.active.parents(".ui-menu").length === 1) {
clearTimeout(this.timer);
}
}
}
},
"mouseenter .ui-menu-item": "_activateItem",
"mousemove .ui-menu-item": "_activateItem",
mouseleave: "collapseAll",
"mouseleave .ui-menu": "collapseAll",
focus: function(event, keepActiveItem) {
// If there's already an active item, keep it active
// If not, activate the first item
var item = this.active || this._menuItems().first();
if (!keepActiveItem) {
this.focus(event, item);
}
},
blur: function(event) {
this._delay(function() {
var notContained = !$.contains(
this.element[0],
this.document[0].activeElement
);
if (notContained) {
this.collapseAll(event);
}
});
},
keydown: "_keydown"
});
this.refresh();
// Clicks outside of a menu collapse any open menus
this._on(this.document, {
click: function(event) {
if (this._closeOnDocumentClick(event)) {
this.collapseAll(event, true);
}
// Reset the mouseHandled flag
this.mouseHandled = false;
}
});
},
_activateItem: function(event) {
// Ignore mouse events while typeahead is active, see #10458.
// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
// is over an item in the menu
if (this.previousFilter) {
return;
}
// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)
if (event.clientX === this.lastMousePosition.x &&
event.clientY === this.lastMousePosition.y) {
return;
}
this.lastMousePosition = {
x: event.clientX,
y: event.clientY
};
var actualTarget = $(event.target).closest(".ui-menu-item"),
target = $(event.currentTarget);
// Ignore bubbled events on parent items, see #11641
if (actualTarget[0] !== target[0]) {
return;
}
// If the item is already active, there's nothing to do
if (target.is(".ui-state-active")) {
return;
}
// Remove ui-state-active class from siblings of the newly focused menu item
// to avoid a jump caused by adjacent elements both having a class with a border
this._removeClass(target.siblings().children(".ui-state-active"),
null, "ui-state-active");
this.focus(event, target);
},
_destroy: function() {
var items = this.element.find(".ui-menu-item")
.removeAttr("role aria-disabled"),
submenus = items.children(".ui-menu-item-wrapper")
.removeUniqueId()
.removeAttr("tabIndex role aria-haspopup");
// Destroy (sub)menus
this.element
.removeAttr("aria-activedescendant")
.find(".ui-menu").addBack()
.removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled " +
"tabIndex")
.removeUniqueId()
.show();
submenus.children().each(function() {
var elem = $(this);
if (elem.data("ui-menu-submenu-caret")) {
elem.remove();
}
});
},
_keydown: function(event) {
var match, prev, character, skip,
preventDefault = true;
switch (event.keyCode) {
case $.ui.keyCode.PAGE_UP:
this.previousPage(event);
break;
case $.ui.keyCode.PAGE_DOWN:
this.nextPage(event);
break;
case $.ui.keyCode.HOME:
this._move("first", "first", event);
break;
case $.ui.keyCode.END:
this._move("last", "last", event);
break;
case $.ui.keyCode.UP:
this.previous(event);
break;
case $.ui.keyCode.DOWN:
this.next(event);
break;
case $.ui.keyCode.LEFT:
this.collapse(event);
break;
case $.ui.keyCode.RIGHT:
if (this.active && !this.active.is(".ui-state-disabled")) {
this.expand(event);
}
break;
case $.ui.keyCode.ENTER:
case $.ui.keyCode.SPACE:
this._activate(event);
break;
case $.ui.keyCode.ESCAPE:
this.collapse(event);
break;
default:
preventDefault = false;
prev = this.previousFilter || "";
skip = false;
// Support number pad values
character = event.keyCode >= 96 && event.keyCode <= 105 ?
(event.keyCode - 96).toString() : String.fromCharCode(event.keyCode);
clearTimeout(this.filterTimer);
if (character === prev) {
skip = true;
} else {
character = prev + character;
}
match = this._filterMenuItems(character);
match = skip && match.index(this.active.next()) !== -1 ?
this.active.nextAll(".ui-menu-item") :
match;
// If no matches on the current filter, reset to the last character pressed
// to move down the menu to the first item that starts with that character
if (!match.length) {
character = String.fromCharCode(event.keyCode);
match = this._filterMenuItems(character);
}
if (match.length) {
this.focus(event, match);
this.previousFilter = character;
this.filterTimer = this._delay(function() {
delete this.previousFilter;
}, 1000);
} else {
delete this.previousFilter;
}
}
if (preventDefault) {
event.preventDefault();
}
},
_activate: function(event) {
if (this.active && !this.active.is(".ui-state-disabled")) {
if (this.active.children("[aria-haspopup='true']").length) {
this.expand(event);
} else {
this.select(event);
}
}
},
refresh: function() {
var menus, items, newSubmenus, newItems, newWrappers,
that = this,
icon = this.options.icons.submenu,
submenus = this.element.find(this.options.menus);
this._toggleClass("ui-menu-icons", null, !!this.element.find(".ui-icon").length);
// Initialize nested menus
newSubmenus = submenus.filter(":not(.ui-menu)")
.hide()
.attr({
role: this.options.role,
"aria-hidden": "true",
"aria-expanded": "false"
})
.each(function() {
var menu = $(this),
item = menu.prev(),
submenuCaret = $("").data("ui-menu-submenu-caret", true);
that._addClass(submenuCaret, "ui-menu-icon", "ui-icon " + icon);
item
.attr("aria-haspopup", "true")
.prepend(submenuCaret);
menu.attr("aria-labelledby", item.attr("id"));
});
this._addClass(newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front");
menus = submenus.add(this.element);
items = menus.find(this.options.items);
// Initialize menu-items containing spaces and/or dashes only as dividers
items.not(".ui-menu-item").each(function() {
var item = $(this);
if (that._isDivider(item)) {
that._addClass(item, "ui-menu-divider", "ui-widget-content");
}
});
// Don't refresh list items that are already adapted
newItems = items.not(".ui-menu-item, .ui-menu-divider");
newWrappers = newItems.children()
.not(".ui-menu")
.uniqueId()
.attr({
tabIndex: -1,
role: this._itemRole()
});
this._addClass(newItems, "ui-menu-item")
._addClass(newWrappers, "ui-menu-item-wrapper");
// Add aria-disabled attribute to any disabled menu item
items.filter(".ui-state-disabled").attr("aria-disabled", "true");
// If the active item has been removed, blur the menu
if (this.active && !$.contains(this.element[0], this.active[0])) {
this.blur();
}
},
_itemRole: function() {
return {
menu: "menuitem",
listbox: "option"
}[this.options.role];
},
_setOption: function(key, value) {
if (key === "icons") {
var icons = this.element.find(".ui-menu-icon");
this._removeClass(icons, null, this.options.icons.submenu)
._addClass(icons, null, value.submenu);
}
this._super(key, value);
},
_setOptionDisabled: function(value) {
this._super(value);
this.element.attr("aria-disabled", String(value));
this._toggleClass(null, "ui-state-disabled", !!value);
},
focus: function(event, item) {
var nested, focused, activeParent;
this.blur(event, event && event.type === "focus");
this._scrollIntoView(item);
this.active = item.first();
focused = this.active.children(".ui-menu-item-wrapper");
this._addClass(focused, null, "ui-state-active");
// Only update aria-activedescendant if there's a role
// otherwise we assume focus is managed elsewhere
if (this.options.role) {
this.element.attr("aria-activedescendant", focused.attr("id"));
}
// Highlight active parent menu item, if any
activeParent = this.active
.parent()
.closest(".ui-menu-item")
.children(".ui-menu-item-wrapper");
this._addClass(activeParent, null, "ui-state-active");
if (event && event.type === "keydown") {
this._close();
} else {
this.timer = this._delay(function() {
this._close();
}, this.delay);
}
nested = item.children(".ui-menu");
if (nested.length && event && (/^mouse/.test(event.type))) {
this._startOpening(nested);
}
this.activeMenu = item.parent();
this._trigger("focus", event, { item: item });
},
_scrollIntoView: function(item) {
var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
if (this._hasScroll()) {
borderTop = parseFloat($.css(this.activeMenu[0], "borderTopWidth")) || 0;
paddingTop = parseFloat($.css(this.activeMenu[0], "paddingTop")) || 0;
offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
scroll = this.activeMenu.scrollTop();
elementHeight = this.activeMenu.height();
itemHeight = item.outerHeight();
if (offset < 0) {
this.activeMenu.scrollTop(scroll + offset);
} else if (offset + itemHeight > elementHeight) {
this.activeMenu.scrollTop(scroll + offset - elementHeight + itemHeight);
}
}
},
blur: function(event, fromFocus) {
if (!fromFocus) {
clearTimeout(this.timer);
}
if (!this.active) {
return;
}
this._removeClass(this.active.children(".ui-menu-item-wrapper"),
null, "ui-state-active");
this._trigger("blur", event, { item: this.active });
this.active = null;
},
_startOpening: function(submenu) {
clearTimeout(this.timer);
// Don't open if already open fixes a Firefox bug that caused a .5 pixel
// shift in the submenu position when mousing over the caret icon
if (submenu.attr("aria-hidden") !== "true") {
return;
}
this.timer = this._delay(function() {
this._close();
this._open(submenu);
}, this.delay);
},
_open: function(submenu) {
var position = $.extend({
of: this.active
}, this.options.position);
clearTimeout(this.timer);
this.element.find(".ui-menu").not(submenu.parents(".ui-menu"))
.hide()
.attr("aria-hidden", "true");
submenu
.show()
.removeAttr("aria-hidden")
.attr("aria-expanded", "true")
.position(position);
},
collapseAll: function(event, all) {
clearTimeout(this.timer);
this.timer = this._delay(function() {
// If we were passed an event, look for the submenu that contains the event
var currentMenu = all ? this.element :
$(event && event.target).closest(this.element.find(".ui-menu"));
// If we found no valid submenu ancestor, use the main menu to close all
// sub menus anyway
if (!currentMenu.length) {
currentMenu = this.element;
}
this._close(currentMenu);
this.blur(event);
// Work around active item staying active after menu is blurred
this._removeClass(currentMenu.find(".ui-state-active"), null, "ui-state-active");
this.activeMenu = currentMenu;
}, all ? 0 : this.delay);
},
// With no arguments, closes the currently active menu - if nothing is active
// it closes all menus. If passed an argument, it will search for menus BELOW
_close: function(startMenu) {
if (!startMenu) {
startMenu = this.active ? this.active.parent() : this.element;
}
startMenu.find(".ui-menu")
.hide()
.attr("aria-hidden", "true")
.attr("aria-expanded", "false");
},
_closeOnDocumentClick: function(event) {
return !$(event.target).closest(".ui-menu").length;
},
_isDivider: function(item) {
// Match hyphen, em dash, en dash
return !/[^\-\u2014\u2013\s]/.test(item.text());
},
collapse: function(event) {
var newItem = this.active &&
this.active.parent().closest(".ui-menu-item", this.element);
if (newItem && newItem.length) {
this._close();
this.focus(event, newItem);
}
},
expand: function(event) {
var newItem = this.active && this._menuItems(this.active.children(".ui-menu")).first();
if (newItem && newItem.length) {
this._open(newItem.parent());
// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
this._delay(function() {
this.focus(event, newItem);
});
}
},
next: function(event) {
this._move("next", "first", event);
},
previous: function(event) {
this._move("prev", "last", event);
},
isFirstItem: function() {
return this.active && !this.active.prevAll(".ui-menu-item").length;
},
isLastItem: function() {
return this.active && !this.active.nextAll(".ui-menu-item").length;
},
_menuItems: function(menu) {
return (menu || this.element)
.find(this.options.items)
.filter(".ui-menu-item");
},
_move: function(direction, filter, event) {
var next;
if (this.active) {
if (direction === "first" || direction === "last") {
next = this.active
[direction === "first" ? "prevAll" : "nextAll"](".ui-menu-item")
.last();
} else {
next = this.active
[direction + "All"](".ui-menu-item")
.first();
}
}
if (!next || !next.length || !this.active) {
next = this._menuItems(this.activeMenu)[filter]();
}
this.focus(event, next);
},
nextPage: function(event) {
var item, base, height;
if (!this.active) {
this.next(event);
return;
}
if (this.isLastItem()) {
return;
}
if (this._hasScroll()) {
base = this.active.offset().top;
height = this.element.innerHeight();
// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
if ($.fn.jquery.indexOf("3.2.") === 0) {
height += this.element[0].offsetHeight - this.element.outerHeight();
}
this.active.nextAll(".ui-menu-item").each(function() {
item = $(this);
return item.offset().top - base - height < 0;
});
this.focus(event, item);
} else {
this.focus(event, this._menuItems(this.activeMenu)
[!this.active ? "first" : "last"]());
}
},
previousPage: function(event) {
var item, base, height;
if (!this.active) {
this.next(event);
return;
}
if (this.isFirstItem()) {
return;
}
if (this._hasScroll()) {
base = this.active.offset().top;
height = this.element.innerHeight();
// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
if ($.fn.jquery.indexOf("3.2.") === 0) {
height += this.element[0].offsetHeight - this.element.outerHeight();
}
this.active.prevAll(".ui-menu-item").each(function() {
item = $(this);
return item.offset().top - base + height > 0;
});
this.focus(event, item);
} else {
this.focus(event, this._menuItems(this.activeMenu).first());
}
},
_hasScroll: function() {
return this.element.outerHeight() < this.element.prop("scrollHeight");
},
select: function(event) {
// TODO: It should never be possible to not have an active item at this
// point, but the tests don't trigger mouseenter before click.
this.active = this.active || $(event.target).closest(".ui-menu-item");
var ui = { item: this.active };
if (!this.active.has(".ui-menu").length) {
this.collapseAll(event, true);
}
this._trigger("select", event, ui);
},
_filterMenuItems: function(character) {
var escapedCharacter = character.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"),
regex = new RegExp("^" + escapedCharacter, "i");
return this.activeMenu
.find(this.options.items)
// Only match on items, not dividers or other content (#10571)
.filter(".ui-menu-item")
.filter(function() {
return regex.test(
String.prototype.trim.call(
$(this).children(".ui-menu-item-wrapper").text()));
});
}
});
/*!
* jQuery UI Autocomplete 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Autocomplete
//>>group: Widgets
//>>description: Lists suggested words as the user is typing.
//>>docs: https://api.jqueryui.com/autocomplete/
//>>demos: https://jqueryui.com/autocomplete/
//>>css.structure: ../../themes/base/core.css
//>>css.structure: ../../themes/base/autocomplete.css
//>>css.theme: ../../themes/base/theme.css
$.widget("ui.autocomplete", {
version: "1.14.1",
defaultElement: "",
options: {
appendTo: null,
autoFocus: false,
delay: 300,
minLength: 1,
position: {
my: "left top",
at: "left bottom",
collision: "none"
},
source: null,
// Callbacks
change: null,
close: null,
focus: null,
open: null,
response: null,
search: null,
select: null
},
requestIndex: 0,
pending: 0,
liveRegionTimer: null,
_create: function() {
// Some browsers only repeat keydown events, not keypress events,
// so we use the suppressKeyPress flag to determine if we've already
// handled the keydown event. #7269
// Unfortunately the code for & in keypress is the same as the up arrow,
// so we use the suppressKeyPressRepeat flag to avoid handling keypress
// events when we know the keydown event was used to modify the
// search term. #7799
var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
nodeName = this.element[0].nodeName.toLowerCase(),
isTextarea = nodeName === "textarea",
isInput = nodeName === "input";
// Textareas are always multi-line
// Inputs are always single-line, even if inside a contentEditable element
// All other element types are determined by whether they're contentEditable
this.isMultiLine = isTextarea ||
!isInput && this.element.prop("contentEditable") === "true";
this.valueMethod = this.element[isTextarea || isInput ? "val" : "text"];
this.isNewMenu = true;
this._addClass("ui-autocomplete-input");
this.element.attr("autocomplete", "off");
this._on(this.element, {
keydown: function(event) {
if (this.element.prop("readOnly")) {
suppressKeyPress = true;
suppressInput = true;
suppressKeyPressRepeat = true;
return;
}
suppressKeyPress = false;
suppressInput = false;
suppressKeyPressRepeat = false;
var keyCode = $.ui.keyCode;
switch (event.keyCode) {
case keyCode.PAGE_UP:
suppressKeyPress = true;
this._move("previousPage", event);
break;
case keyCode.PAGE_DOWN:
suppressKeyPress = true;
this._move("nextPage", event);
break;
case keyCode.UP:
suppressKeyPress = true;
this._keyEvent("previous", event);
break;
case keyCode.DOWN:
suppressKeyPress = true;
this._keyEvent("next", event);
break;
case keyCode.ENTER:
// when menu is open and has focus
if (this.menu.active) {
// #6055 - Opera still allows the keypress to occur
// which causes forms to submit
suppressKeyPress = true;
event.preventDefault();
this.menu.select(event);
}
break;
case keyCode.TAB:
if (this.menu.active) {
this.menu.select(event);
}
break;
case keyCode.ESCAPE:
if (this.menu.element.is(":visible")) {
if (!this.isMultiLine) {
this._value(this.term);
}
this.close(event);
// Different browsers have different default behavior for escape
// Single press can mean undo or clear
event.preventDefault();
}
break;
default:
suppressKeyPressRepeat = true;
// search timeout should be triggered before the input value is changed
this._searchTimeout(event);
break;
}
},
keypress: function(event) {
if (suppressKeyPress) {
suppressKeyPress = false;
if (!this.isMultiLine || this.menu.element.is(":visible")) {
event.preventDefault();
}
return;
}
if (suppressKeyPressRepeat) {
return;
}
// Replicate some key handlers to allow them to repeat in Firefox and Opera
var keyCode = $.ui.keyCode;
switch (event.keyCode) {
case keyCode.PAGE_UP:
this._move("previousPage", event);
break;
case keyCode.PAGE_DOWN:
this._move("nextPage", event);
break;
case keyCode.UP:
this._keyEvent("previous", event);
break;
case keyCode.DOWN:
this._keyEvent("next", event);
break;
}
},
input: function(event) {
if (suppressInput) {
suppressInput = false;
event.preventDefault();
return;
}
this._searchTimeout(event);
},
focus: function() {
this.selectedItem = null;
this.previous = this._value();
},
blur: function(event) {
clearTimeout(this.searching);
this.close(event);
this._change(event);
}
});
this._initSource();
this.menu = $("
")
.appendTo(this._appendTo())
.menu({
// disable ARIA support, the live region takes care of that
role: null
})
.hide()
.menu("instance");
this._addClass(this.menu.element, "ui-autocomplete", "ui-front");
this._on(this.menu.element, {
mousedown: function(event) {
// Prevent moving focus out of the text field
event.preventDefault();
},
menufocus: function(event, ui) {
var label, item;
// Support: Firefox
// Prevent accidental activation of menu items in Firefox (#7024 #9118)
if (this.isNewMenu) {
this.isNewMenu = false;
if (event.originalEvent && /^mouse/.test(event.originalEvent.type)) {
this.menu.blur();
this.document.one("mousemove", function() {
$(event.target).trigger(event.originalEvent);
});
return;
}
}
item = ui.item.data("ui-autocomplete-item");
if (false !== this._trigger("focus", event, { item: item })) {
// use value to match what will end up in the input, if it was a key event
if (event.originalEvent && /^key/.test(event.originalEvent.type)) {
this._value(item.value);
}
}
// Announce the value in the liveRegion
label = ui.item.attr("aria-label") || item.value;
if (label && String.prototype.trim.call(label).length) {
clearTimeout(this.liveRegionTimer);
this.liveRegionTimer = this._delay(function() {
this.liveRegion.html($("
").text(label));
}, 100);
}
},
menuselect: function(event, ui) {
var item = ui.item.data("ui-autocomplete-item"),
previous = this.previous;
// Only trigger when focus was lost (click on menu)
if (this.element[0] !== this.document[0].activeElement) {
this.element.trigger("focus");
this.previous = previous;
}
if (false !== this._trigger("select", event, { item: item })) {
this._value(item.value);
}
// reset the term after the select event
// this allows custom select handling to work properly
this.term = this._value();
this.close(event);
this.selectedItem = item;
}
});
this.liveRegion = $("
", {
role: "status",
"aria-live": "assertive",
"aria-relevant": "additions"
})
.appendTo(this.document[0].body);
this._addClass(this.liveRegion, null, "ui-helper-hidden-accessible");
// Turning off autocomplete prevents the browser from remembering the
// value when navigating through history, so we re-enable autocomplete
// if the page is unloaded before the widget is destroyed. #7790
this._on(this.window, {
beforeunload: function() {
this.element.removeAttr("autocomplete");
}
});
},
_destroy: function() {
clearTimeout(this.searching);
this.element.removeAttr("autocomplete");
this.menu.element.remove();
this.liveRegion.remove();
},
_setOption: function(key, value) {
this._super(key, value);
if (key === "source") {
this._initSource();
}
if (key === "appendTo") {
this.menu.element.appendTo(this._appendTo());
}
if (key === "disabled" && value && this.xhr) {
this.xhr.abort();
}
},
_isEventTargetInWidget: function(event) {
var menuElement = this.menu.element[0];
return event.target === this.element[0] ||
event.target === menuElement ||
$.contains(menuElement, event.target);
},
_closeOnClickOutside: function(event) {
if (!this._isEventTargetInWidget(event)) {
this.close();
}
},
_appendTo: function() {
var element = this.options.appendTo;
if (element) {
element = element.jquery || element.nodeType ?
$(element) :
this.document.find(element).eq(0);
}
if (!element || !element[0]) {
element = this.element.closest(".ui-front, dialog");
}
if (!element.length) {
element = this.document[0].body;
}
return element;
},
_initSource: function() {
var array, url,
that = this;
if (Array.isArray(this.options.source)) {
array = this.options.source;
this.source = function(request, response) {
response($.ui.autocomplete.filter(array, request.term));
};
} else if (typeof this.options.source === "string") {
url = this.options.source;
this.source = function(request, response) {
if (that.xhr) {
that.xhr.abort();
}
that.xhr = $.ajax({
url: url,
data: request,
dataType: "json",
success: function(data) {
response(data);
},
error: function() {
response([]);
}
});
};
} else {
this.source = this.options.source;
}
},
_searchTimeout: function(event) {
clearTimeout(this.searching);
this.searching = this._delay(function() {
// Search if the value has changed, or if the user retypes the same value (see #7434)
var equalValues = this.term === this._value(),
menuVisible = this.menu.element.is(":visible"),
modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
if (!equalValues || (equalValues && !menuVisible && !modifierKey)) {
this.selectedItem = null;
this.search(null, event);
}
}, this.options.delay);
},
search: function(value, event) {
value = value != null ? value : this._value();
// Always save the actual value, not the one passed as an argument
this.term = this._value();
if (value.length < this.options.minLength) {
return this.close(event);
}
if (this._trigger("search", event) === false) {
return;
}
return this._search(value);
},
_search: function(value) {
this.pending++;
this._addClass("ui-autocomplete-loading");
this.cancelSearch = false;
this.source({ term: value }, this._response());
},
_response: function() {
var index = ++this.requestIndex;
return function(content) {
if (index === this.requestIndex) {
this.__response(content);
}
this.pending--;
if (!this.pending) {
this._removeClass("ui-autocomplete-loading");
}
}.bind(this);
},
__response: function(content) {
if (content) {
content = this._normalize(content);
}
this._trigger("response", null, { content: content });
if (!this.options.disabled && content && content.length && !this.cancelSearch) {
this._suggest(content);
this._trigger("open");
} else {
// use ._close() instead of .close() so we don't cancel future searches
this._close();
}
},
close: function(event) {
this.cancelSearch = true;
this._close(event);
},
_close: function(event) {
// Remove the handler that closes the menu on outside clicks
this._off(this.document, "mousedown");
if (this.menu.element.is(":visible")) {
this.menu.element.hide();
this.menu.blur();
this.isNewMenu = true;
this._trigger("close", event);
}
},
_change: function(event) {
if (this.previous !== this._value()) {
this._trigger("change", event, { item: this.selectedItem });
}
},
_normalize: function(items) {
// assume all items have the right format when the first item is complete
if (items.length && items[0].label && items[0].value) {
return items;
}
return $.map(items, function(item) {
if (typeof item === "string") {
return {
label: item,
value: item
};
}
return $.extend({}, item, {
label: item.label || item.value,
value: item.value || item.label
});
});
},
_suggest: function(items) {
var ul = this.menu.element.empty();
this._renderMenu(ul, items);
this.isNewMenu = true;
this.menu.refresh();
// Size and position menu
ul.show();
this._resizeMenu();
ul.position($.extend({
of: this.element
}, this.options.position));
if (this.options.autoFocus) {
this.menu.next();
}
// Listen for interactions outside of the widget (#6642)
this._on(this.document, {
mousedown: "_closeOnClickOutside"
});
},
_resizeMenu: function() {
var ul = this.menu.element;
ul.outerWidth(Math.max(
// Firefox wraps long text (possibly a rounding bug)
// so we add 1px to avoid the wrapping (#7513)
ul.width("").outerWidth() + 1,
this.element.outerWidth()
));
},
_renderMenu: function(ul, items) {
var that = this;
$.each(items, function(index, item) {
that._renderItemData(ul, item);
});
},
_renderItemData: function(ul, item) {
return this._renderItem(ul, item).data("ui-autocomplete-item", item);
},
_renderItem: function(ul, item) {
return $("
")
.append($("
").text(item.label))
.appendTo(ul);
},
_move: function(direction, event) {
if (!this.menu.element.is(":visible")) {
this.search(null, event);
return;
}
if (this.menu.isFirstItem() && /^previous/.test(direction) ||
this.menu.isLastItem() && /^next/.test(direction)) {
if (!this.isMultiLine) {
this._value(this.term);
}
this.menu.blur();
return;
}
this.menu[direction](event);
},
widget: function() {
return this.menu.element;
},
_value: function() {
return this.valueMethod.apply(this.element, arguments);
},
_keyEvent: function(keyEvent, event) {
if (!this.isMultiLine || this.menu.element.is(":visible")) {
this._move(keyEvent, event);
// Prevents moving cursor to beginning/end of the text field in some browsers
event.preventDefault();
}
}
});
$.extend($.ui.autocomplete, {
escapeRegex: function(value) {
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
},
filter: function(array, term) {
var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
return $.grep(array, function(value) {
return matcher.test(value.label || value.value || value);
});
}
});
// Live region extension, adding a `messages` option
// NOTE: This is an experimental API. We are still investigating
// a full solution for string manipulation and internationalization.
$.widget("ui.autocomplete", $.ui.autocomplete, {
options: {
messages: {
noResults: "No search results.",
results: function(amount) {
return amount + (amount > 1 ? " results are" : " result is") +
" available, use up and down arrow keys to navigate.";
}
}
},
__response: function(content) {
var message;
this._superApply(arguments);
if (this.options.disabled || this.cancelSearch) {
return;
}
if (content && content.length) {
message = this.options.messages.results(content.length);
} else {
message = this.options.messages.noResults;
}
clearTimeout(this.liveRegionTimer);
this.liveRegionTimer = this._delay(function() {
this.liveRegion.html($("
").text(message));
}, 100);
}
});
var widgetsAutocomplete = $.ui.autocomplete;
/*!
* jQuery UI Controlgroup 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Controlgroup
//>>group: Widgets
//>>description: Visually groups form control widgets
//>>docs: https://api.jqueryui.com/controlgroup/
//>>demos: https://jqueryui.com/controlgroup/
//>>css.structure: ../../themes/base/core.css
//>>css.structure: ../../themes/base/controlgroup.css
//>>css.theme: ../../themes/base/theme.css
var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
var widgetsControlgroup = $.widget("ui.controlgroup", {
version: "1.14.1",
defaultElement: "
",
options: {
direction: "horizontal",
disabled: null,
onlyVisible: true,
items: {
"button": "input[type=button], input[type=submit], input[type=reset], button, a",
"controlgroupLabel": ".ui-controlgroup-label",
"checkboxradio": "input[type='checkbox'], input[type='radio']",
"selectmenu": "select",
"spinner": ".ui-spinner-input"
}
},
_create: function() {
this._enhance();
},
// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
_enhance: function() {
this.element.attr("role", "toolbar");
this.refresh();
},
_destroy: function() {
this._callChildMethod("destroy");
this.childWidgets.removeData("ui-controlgroup-data");
this.element.removeAttr("role");
if (this.options.items.controlgroupLabel) {
this.element
.find(this.options.items.controlgroupLabel)
.find(".ui-controlgroup-label-contents")
.contents().unwrap();
}
},
_initWidgets: function() {
var that = this,
childWidgets = [];
// First we iterate over each of the items options
$.each(this.options.items, function(widget, selector) {
var labels;
var options = {};
// Make sure the widget has a selector set
if (!selector) {
return;
}
if (widget === "controlgroupLabel") {
labels = that.element.find(selector);
labels.each(function() {
var element = $(this);
if (element.children(".ui-controlgroup-label-contents").length) {
return;
}
element.contents()
.wrapAll("");
});
that._addClass(labels, null, "ui-widget ui-widget-content ui-state-default");
childWidgets = childWidgets.concat(labels.get());
return;
}
// Make sure the widget actually exists
if (!$.fn[widget]) {
return;
}
// We assume everything is in the middle to start because we can't determine
// first / last elements until all enhancments are done.
if (that["_" + widget + "Options"]) {
options = that["_" + widget + "Options"]("middle");
} else {
options = { classes: {} };
}
// Find instances of this widget inside controlgroup and init them
that.element
.find(selector)
.each(function() {
var element = $(this);
var instance = element[widget]("instance");
// We need to clone the default options for this type of widget to avoid
// polluting the variable options which has a wider scope than a single widget.
var instanceOptions = $.widget.extend({}, options);
// If the button is the child of a spinner ignore it
// TODO: Find a more generic solution
if (widget === "button" && element.parent(".ui-spinner").length) {
return;
}
// Create the widget if it doesn't exist
if (!instance) {
instance = element[widget]()[widget]("instance");
}
if (instance) {
instanceOptions.classes =
that._resolveClassesValues(instanceOptions.classes, instance);
}
element[widget](instanceOptions);
// Store an instance of the controlgroup to be able to reference
// from the outermost element for changing options and refresh
var widgetElement = element[widget]("widget");
$.data(widgetElement[0], "ui-controlgroup-data",
instance ? instance : element[widget]("instance"));
childWidgets.push(widgetElement[0]);
});
});
this.childWidgets = $($.uniqueSort(childWidgets));
this._addClass(this.childWidgets, "ui-controlgroup-item");
},
_callChildMethod: function(method) {
this.childWidgets.each(function() {
var element = $(this),
data = element.data("ui-controlgroup-data");
if (data && data[method]) {
data[method]();
}
});
},
_updateCornerClass: function(element, position) {
var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
var add = this._buildSimpleOptions(position, "label").classes.label;
this._removeClass(element, null, remove);
this._addClass(element, null, add);
},
_buildSimpleOptions: function(position, key) {
var direction = this.options.direction === "vertical";
var result = {
classes: {}
};
result.classes[key] = {
"middle": "",
"first": "ui-corner-" + (direction ? "top" : "left"),
"last": "ui-corner-" + (direction ? "bottom" : "right"),
"only": "ui-corner-all"
}[position];
return result;
},
_spinnerOptions: function(position) {
var options = this._buildSimpleOptions(position, "ui-spinner");
options.classes["ui-spinner-up"] = "";
options.classes["ui-spinner-down"] = "";
return options;
},
_buttonOptions: function(position) {
return this._buildSimpleOptions(position, "ui-button");
},
_checkboxradioOptions: function(position) {
return this._buildSimpleOptions(position, "ui-checkboxradio-label");
},
_selectmenuOptions: function(position) {
var direction = this.options.direction === "vertical";
return {
width: direction ? "auto" : false,
classes: {
middle: {
"ui-selectmenu-button-open": "",
"ui-selectmenu-button-closed": ""
},
first: {
"ui-selectmenu-button-open": "ui-corner-" + (direction ? "top" : "tl"),
"ui-selectmenu-button-closed": "ui-corner-" + (direction ? "top" : "left")
},
last: {
"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
"ui-selectmenu-button-closed": "ui-corner-" + (direction ? "bottom" : "right")
},
only: {
"ui-selectmenu-button-open": "ui-corner-top",
"ui-selectmenu-button-closed": "ui-corner-all"
}
}[position]
};
},
_resolveClassesValues: function(classes, instance) {
var result = {};
$.each(classes, function(key) {
var current = instance.options.classes[key] || "";
current = String.prototype.trim.call(current.replace(controlgroupCornerRegex, ""));
result[key] = (current + " " + classes[key]).replace(/\s+/g, " ");
});
return result;
},
_setOption: function(key, value) {
if (key === "direction") {
this._removeClass("ui-controlgroup-" + this.options.direction);
}
this._super(key, value);
if (key === "disabled") {
this._callChildMethod(value ? "disable" : "enable");
return;
}
this.refresh();
},
refresh: function() {
var children,
that = this;
this._addClass("ui-controlgroup ui-controlgroup-" + this.options.direction);
if (this.options.direction === "horizontal") {
this._addClass(null, "ui-helper-clearfix");
}
this._initWidgets();
children = this.childWidgets;
// We filter here because we need to track all childWidgets not just the visible ones
if (this.options.onlyVisible) {
children = children.filter(":visible");
}
if (children.length) {
// We do this last because we need to make sure all enhancment is done
// before determining first and last
$.each(["first", "last"], function(index, value) {
var instance = children[value]().data("ui-controlgroup-data");
if (instance && that["_" + instance.widgetName + "Options"]) {
var options = that["_" + instance.widgetName + "Options"](
children.length === 1 ? "only" : value
);
options.classes = that._resolveClassesValues(options.classes, instance);
instance.element[instance.widgetName](options);
} else {
that._updateCornerClass(children[value](), value);
}
});
// Finally call the refresh method on each of the child widgets.
this._callChildMethod("refresh");
}
}
});
/*!
* jQuery UI Checkboxradio 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Checkboxradio
//>>group: Widgets
//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
//>>docs: https://api.jqueryui.com/checkboxradio/
//>>demos: https://jqueryui.com/checkboxradio/
//>>css.structure: ../../themes/base/core.css
//>>css.structure: ../../themes/base/button.css
//>>css.structure: ../../themes/base/checkboxradio.css
//>>css.theme: ../../themes/base/theme.css
$.widget("ui.checkboxradio", [$.ui.formResetMixin, {
version: "1.14.1",
options: {
disabled: null,
label: null,
icon: true,
classes: {
"ui-checkboxradio-label": "ui-corner-all",
"ui-checkboxradio-icon": "ui-corner-all"
}
},
_getCreateOptions: function() {
var disabled, labels, labelContents;
var options = this._super() || {};
// We read the type here, because it makes more sense to throw a element type error first,
// rather then the error for lack of a label. Often if its the wrong type, it
// won't have a label (e.g. calling on a div, btn, etc)
this._readType();
labels = this.element.labels();
// If there are multiple labels, use the last one
this.label = $(labels[labels.length - 1]);
if (!this.label.length) {
$.error("No label found for checkboxradio widget");
}
this.originalLabel = "";
// We need to get the label text but this may also need to make sure it does not contain the
// input itself.
// The label contents could be text, html, or a mix. We wrap all elements
// and read the wrapper's `innerHTML` to get a string representation of
// the label, without the input as part of it.
labelContents = this.label.contents().not(this.element[0]);
if (labelContents.length) {
this.originalLabel += labelContents
.clone()
.wrapAll("")
.parent()
.html();
}
// Set the label option if we found label text
if (this.originalLabel) {
options.label = this.originalLabel;
}
disabled = this.element[0].disabled;
if (disabled != null) {
options.disabled = disabled;
}
return options;
},
_create: function() {
var checked = this.element[0].checked;
this._bindFormResetHandler();
if (this.options.disabled == null) {
this.options.disabled = this.element[0].disabled;
}
this._setOption("disabled", this.options.disabled);
this._addClass("ui-checkboxradio", "ui-helper-hidden-accessible");
this._addClass(this.label, "ui-checkboxradio-label", "ui-button ui-widget");
if (this.type === "radio") {
this._addClass(this.label, "ui-checkboxradio-radio-label");
}
if (this.options.label && this.options.label !== this.originalLabel) {
this._updateLabel();
} else if (this.originalLabel) {
this.options.label = this.originalLabel;
}
this._enhance();
if (checked) {
this._addClass(this.label, "ui-checkboxradio-checked", "ui-state-active");
}
this._on({
change: "_toggleClasses",
focus: function() {
this._addClass(this.label, null, "ui-state-focus ui-visual-focus");
},
blur: function() {
this._removeClass(this.label, null, "ui-state-focus ui-visual-focus");
}
});
},
_readType: function() {
var nodeName = this.element[0].nodeName.toLowerCase();
this.type = this.element[0].type;
if (nodeName !== "input" || !/radio|checkbox/.test(this.type)) {
$.error("Can't create checkboxradio on element.nodeName=" + nodeName +
" and element.type=" + this.type);
}
},
// Support jQuery Mobile enhanced option
_enhance: function() {
this._updateIcon(this.element[0].checked);
},
widget: function() {
return this.label;
},
_getRadioGroup: function() {
var group;
var name = this.element[0].name;
var nameSelector = "input[name='" + CSS.escape(name) + "']";
if (!name) {
return $([]);
}
if (this.form.length) {
group = $(this.form[0].elements).filter(nameSelector);
} else {
// Not inside a form, check all inputs that also are not inside a form
group = $(nameSelector).filter(function() {
return $($(this).prop("form")).length === 0;
});
}
return group.not(this.element);
},
_toggleClasses: function() {
var checked = this.element[0].checked;
this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", checked);
if (this.options.icon && this.type === "checkbox") {
this._toggleClass(this.icon, null, "ui-icon-check ui-state-checked", checked)
._toggleClass(this.icon, null, "ui-icon-blank", !checked);
}
if (this.type === "radio") {
this._getRadioGroup()
.each(function() {
var instance = $(this).checkboxradio("instance");
if (instance) {
instance._removeClass(instance.label,
"ui-checkboxradio-checked", "ui-state-active");
}
});
}
},
_destroy: function() {
this._unbindFormResetHandler();
if (this.icon) {
this.icon.remove();
this.iconSpace.remove();
}
},
_setOption: function(key, value) {
// We don't allow the value to be set to nothing
if (key === "label" && !value) {
return;
}
this._super(key, value);
if (key === "disabled") {
this._toggleClass(this.label, null, "ui-state-disabled", value);
this.element[0].disabled = value;
// Don't refresh when setting disabled
return;
}
this.refresh();
},
_updateIcon: function(checked) {
var toAdd = "ui-icon ui-icon-background ";
if (this.options.icon) {
if (!this.icon) {
this.icon = $("");
this.iconSpace = $("");
this._addClass(this.iconSpace, "ui-checkboxradio-icon-space");
}
if (this.type === "checkbox") {
toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
this._removeClass(this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check");
} else {
toAdd += "ui-icon-blank";
}
this._addClass(this.icon, "ui-checkboxradio-icon", toAdd);
if (!checked) {
this._removeClass(this.icon, null, "ui-icon-check ui-state-checked");
}
this.icon.prependTo(this.label).after(this.iconSpace);
} else if (this.icon !== undefined) {
this.icon.remove();
this.iconSpace.remove();
delete this.icon;
}
},
_updateLabel: function() {
// Remove the contents of the label ( minus the icon, icon space, and input )
var contents = this.label.contents().not(this.element[0]);
if (this.icon) {
contents = contents.not(this.icon[0]);
}
if (this.iconSpace) {
contents = contents.not(this.iconSpace[0]);
}
contents.remove();
this.label.append(this.options.label);
},
refresh: function() {
var checked = this.element[0].checked,
isDisabled = this.element[0].disabled;
this._updateIcon(checked);
this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", checked);
if (this.options.label !== null) {
this._updateLabel();
}
if (isDisabled !== this.options.disabled) {
this._setOptions({ "disabled": isDisabled });
}
}
}]);
var widgetsCheckboxradio = $.ui.checkboxradio;
/*!
* jQuery UI Button 1.14.1
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*/
//>>label: Button
//>>group: Widgets
//>>description: Enhances a form with themeable buttons.
//>>docs: https://api.jqueryui.com/button/
//>>demos: https://jqueryui.com/button/
//>>css.structure: ../../themes/base/core.css
//>>css.structure: ../../themes/base/button.css
//>>css.theme: ../../themes/base/theme.css
$.widget("ui.button", {
version: "1.14.1",
defaultElement: "