/*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js * Copyright jQuery Foundation and other contributors; Licensed MIT */ (function (factory) { if (typeof define === "function" && define.amd) { // AMD. Register as an anonymous module. define(["jquery"], factory); } else { // Browser globals factory(jQuery); } }(function ($) { $.ui = $.ui || {}; var version = $.ui.version = "1.12.1"; /*! * jQuery UI Widget 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Widget //>>group: Core //>>description: Provides a factory for creating stateful widgets with a common API. //>>docs: http://api.jqueryui.com/jQuery.widget/ //>>demos: http://jqueryui.com/widget/ var widgetUuid = 0; var widgetSlice = Array.prototype.slice; $.cleanData = (function (orig) { return function (elems) { var events, elem, i; for (i = 0; (elem = elems[i]) != null; i++) { try { // Only trigger remove when necessary to save time events = $._data(elem, "events"); if (events && events.remove) { $(elem).triggerHandler("remove"); } // Http://bugs.jquery.com/ticket/8235 } catch (e) { } } orig(elems); }; })($.cleanData); $.widget = function (name, base, prototype) { var existingConstructor, constructor, basePrototype; // ProxiedPrototype allows the provided prototype to remain unmodified // so that it can be used as a mixin for multiple widgets (#8876) var proxiedPrototype = {}; var namespace = name.split(".")[0]; name = name.split(".")[1]; var fullName = namespace + "-" + name; if (!prototype) { prototype = base; base = $.Widget; } if ($.isArray(prototype)) { prototype = $.extend.apply(null, [{}].concat(prototype)); } // Create selector for plugin $.expr[":"][fullName.toLowerCase()] = function (elem) { return !!$.data(elem, fullName); }; $[namespace] = $[namespace] || {}; existingConstructor = $[namespace][name]; constructor = $[namespace][name] = function (options, element) { // Allow instantiation without "new" keyword if (!this._createWidget) { return new constructor(options, element); } // Allow instantiation without initializing for simple inheritance // must use "new" keyword (the code above always passes args) if (arguments.length) { this._createWidget(options, element); } }; // Extend with the existing constructor to carry over any static properties $.extend(constructor, existingConstructor, { version: prototype.version, // Copy the object used to create the prototype in case we need to // redefine the widget later _proto: $.extend({}, prototype), // Track widgets that inherit from this widget in case this widget is // redefined after a widget inherits from it _childConstructors: [] }); basePrototype = new base(); // We need to make the options hash a property directly on the new instance // otherwise we'll modify the options hash on the prototype that we're // inheriting from basePrototype.options = $.widget.extend({}, basePrototype.options); $.each(prototype, function (prop, value) { if (!$.isFunction(value)) { proxiedPrototype[prop] = value; return; } proxiedPrototype[prop] = (function () { function _super() { return base.prototype[prop].apply(this, arguments); } function _superApply(args) { return base.prototype[prop].apply(this, args); } return function () { var __super = this._super; var __superApply = this._superApply; var returnValue; this._super = _super; this._superApply = _superApply; returnValue = value.apply(this, arguments); this._super = __super; this._superApply = __superApply; return returnValue; }; })(); }); constructor.prototype = $.widget.extend(basePrototype, { // TODO: remove support for widgetEventPrefix // always use the name + a colon as the prefix, e.g., draggable:start // don't prefix for widgets that aren't DOM-based widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name }, proxiedPrototype, { constructor: constructor, namespace: namespace, widgetName: name, widgetFullName: fullName }); // If this widget is being redefined then we need to find all widgets that // are inheriting from it and redefine all of them so that they inherit from // the new version of this widget. We're essentially trying to replace one // level in the prototype chain. if (existingConstructor) { $.each(existingConstructor._childConstructors, function (i, child) { var childPrototype = child.prototype; // Redefine the child widget using the same prototype that was // originally used, but inherit from the new version of the base $.widget(childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto); }); // Remove the list of existing child constructors from the old constructor // so the old child constructors can be garbage collected delete existingConstructor._childConstructors; } else { base._childConstructors.push(constructor); } $.widget.bridge(name, constructor); return constructor; }; $.widget.extend = function (target) { var input = widgetSlice.call(arguments, 1); var inputIndex = 0; var inputLength = input.length; var key; var value; for (; inputIndex < inputLength; inputIndex++) { for (key in input[inputIndex]) { value = input[inputIndex][key]; if (input[inputIndex].hasOwnProperty(key) && value !== undefined) { // Clone objects if ($.isPlainObject(value)) { target[key] = $.isPlainObject(target[key]) ? $.widget.extend({}, target[key], value) : // Don't extend strings, arrays, etc. with objects $.widget.extend({}, value); // Copy everything else by reference } else { target[key] = value; } } } } return target; }; $.widget.bridge = function (name, object) { var fullName = object.prototype.widgetFullName || name; $.fn[name] = function (options) { var isMethodCall = typeof options === "string"; var args = widgetSlice.call(arguments, 1); var returnValue = this; if (isMethodCall) { // If this is an empty collection, we need to have the instance method // return undefined instead of the jQuery instance if (!this.length && options === "instance") { returnValue = undefined; } else { this.each(function () { var methodValue; var instance = $.data(this, fullName); if (options === "instance") { returnValue = instance; return false; } if (!instance) { return $.error("cannot call methods on " + name + " prior to initialization; " + "attempted to call method '" + options + "'"); } if (!$.isFunction(instance[options]) || options.charAt(0) === "_") { return $.error("no such method '" + options + "' for " + name + " widget instance"); } methodValue = instance[options].apply(instance, args); if (methodValue !== instance && methodValue !== undefined) { returnValue = methodValue && methodValue.jquery ? returnValue.pushStack(methodValue.get()) : methodValue; return false; } }); } } else { // Allow multiple hashes to be passed on init if (args.length) { options = $.widget.extend.apply(null, [options].concat(args)); } this.each(function () { var instance = $.data(this, fullName); if (instance) { instance.option(options || {}); if (instance._init) { instance._init(); } } else { $.data(this, fullName, new object(options, this)); } }); } return returnValue; }; }; $.Widget = function ( /* options, element */) { }; $.Widget._childConstructors = []; $.Widget.prototype = { widgetName: "widget", widgetEventPrefix: "", defaultElement: "
", options: { classes: {}, disabled: false, // Callbacks create: null }, _createWidget: function (options, element) { element = $(element || this.defaultElement || this)[0]; this.element = $(element); this.uuid = widgetUuid++; this.eventNamespace = "." + this.widgetName + this.uuid; this.bindings = $(); this.hoverable = $(); this.focusable = $(); this.classesElementLookup = {}; if (element !== this) { $.data(element, this.widgetFullName, this); this._on(true, this.element, { remove: function (event) { if (event.target === element) { this.destroy(); } } }); this.document = $(element.style ? // Element within the document element.ownerDocument : // Element is window or document element.document || element); this.window = $(this.document[0].defaultView || this.document[0].parentWindow); } this.options = $.widget.extend({}, this.options, this._getCreateOptions(), options); this._create(); if (this.options.disabled) { this._setOptionDisabled(this.options.disabled); } this._trigger("create", null, this._getCreateEventData()); this._init(); }, _getCreateOptions: function () { return {}; }, _getCreateEventData: $.noop, _create: $.noop, _init: $.noop, destroy: function () { var that = this; this._destroy(); $.each(this.classesElementLookup, function (key, value) { that._removeClass(value, key); }); // We can probably remove the unbind calls in 2.0 // all event bindings should go through this._on() this.element .off(this.eventNamespace) .removeData(this.widgetFullName); this.widget() .off(this.eventNamespace) .removeAttr("aria-disabled"); // Clean up events and states this.bindings.off(this.eventNamespace); }, _destroy: $.noop, widget: function () { return this.element; }, option: function (key, value) { var options = key; var parts; var curOption; var i; if (arguments.length === 0) { // Don't return a reference to the internal hash return $.widget.extend({}, this.options); } if (typeof key === "string") { // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } options = {}; parts = key.split("."); key = parts.shift(); if (parts.length) { curOption = options[key] = $.widget.extend({}, this.options[key]); for (i = 0; i < parts.length - 1; i++) { curOption[parts[i]] = curOption[parts[i]] || {}; curOption = curOption[parts[i]]; } key = parts.pop(); if (arguments.length === 1) { return curOption[key] === undefined ? null : curOption[key]; } curOption[key] = value; } else { if (arguments.length === 1) { return this.options[key] === undefined ? null : this.options[key]; } options[key] = value; } } this._setOptions(options); return this; }, _setOptions: function (options) { var key; for (key in options) { this._setOption(key, options[key]); } return this; }, _setOption: function (key, value) { if (key === "classes") { this._setOptionClasses(value); } this.options[key] = value; if (key === "disabled") { this._setOptionDisabled(value); } return this; }, _setOptionClasses: function (value) { var classKey, elements, currentElements; for (classKey in value) { currentElements = this.classesElementLookup[classKey]; if (value[classKey] === this.options.classes[classKey] || !currentElements || !currentElements.length) { continue; } // We are doing this to create a new jQuery object because the _removeClass() call // on the next line is going to destroy the reference to the current elements being // tracked. We need to save a copy of this collection so that we can add the new classes // below. elements = $(currentElements.get()); this._removeClass(currentElements, classKey); // We don't use _addClass() here, because that uses this.options.classes // for generating the string of classes. We want to use the value passed in from // _setOption(), this is the new value of the classes option which was passed to // _setOption(). We pass this value directly to _classes(). elements.addClass(this._classes({ element: elements, keys: classKey, classes: value, add: true })); } }, _setOptionDisabled: function (value) { this._toggleClass(this.widget(), this.widgetFullName + "-disabled", null, !!value); // If the widget is becoming disabled, then nothing is interactive if (value) { this._removeClass(this.hoverable, null, "ui-state-hover"); this._removeClass(this.focusable, null, "ui-state-focus"); } }, enable: function () { return this._setOptions({ disabled: false }); }, disable: function () { return this._setOptions({ disabled: true }); }, _classes: function (options) { var full = []; var that = this; options = $.extend({ element: this.element, classes: this.options.classes || {} }, options); function processClassString(classes, checkOption) { var current, i; for (i = 0; i < classes.length; i++) { current = that.classesElementLookup[classes[i]] || $(); if (options.add) { current = $($.unique(current.get().concat(options.element.get()))); } else { current = $(current.not(options.element).get()); } that.classesElementLookup[classes[i]] = current; full.push(classes[i]); if (checkOption && options.classes[classes[i]]) { full.push(options.classes[classes[i]]); } } } this._on(options.element, { "remove": "_untrackClassesElement" }); if (options.keys) { processClassString(options.keys.match(/\S+/g) || [], true); } if (options.extra) { processClassString(options.extra.match(/\S+/g) || []); } return full.join(" "); }, _untrackClassesElement: function (event) { var that = this; $.each(that.classesElementLookup, function (key, value) { if ($.inArray(event.target, value) !== -1) { that.classesElementLookup[key] = $(value.not(event.target).get()); } }); }, _removeClass: function (element, keys, extra) { return this._toggleClass(element, keys, extra, false); }, _addClass: function (element, keys, extra) { return this._toggleClass(element, keys, extra, true); }, _toggleClass: function (element, keys, extra, add) { add = (typeof add === "boolean") ? add : extra; var shift = (typeof element === "string" || element === null), options = { extra: shift ? keys : extra, keys: shift ? element : keys, element: shift ? this.element : element, add: add }; options.element.toggleClass(this._classes(options), add); return this; }, _on: function (suppressDisabledCheck, element, handlers) { var delegateElement; var instance = this; // No suppressDisabledCheck flag, shuffle arguments if (typeof suppressDisabledCheck !== "boolean") { handlers = element; element = suppressDisabledCheck; suppressDisabledCheck = false; } // No element argument, shuffle and use this.element if (!handlers) { handlers = element; element = this.element; delegateElement = this.widget(); } else { element = delegateElement = $(element); this.bindings = this.bindings.add(element); } $.each(handlers, function (event, handler) { function handlerProxy() { // Allow widgets to customize the disabled handling // - disabled as an array instead of boolean // - disabled class as method for disabling individual parts if (!suppressDisabledCheck && (instance.options.disabled === true || $(this).hasClass("ui-state-disabled"))) { return; } return (typeof handler === "string" ? instance[handler] : handler) .apply(instance, arguments); } // Copy the guid so direct unbinding works if (typeof handler !== "string") { handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++; } var match = event.match(/^([\w:-]*)\s*(.*)$/); var eventName = match[1] + instance.eventNamespace; var selector = match[2]; if (selector) { delegateElement.on(eventName, selector, handlerProxy); } else { element.on(eventName, handlerProxy); } }); }, _off: function (element, eventName) { eventName = (eventName || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace; element.off(eventName).off(eventName); // Clear the stack to avoid memory leaks (#10056) this.bindings = $(this.bindings.not(element).get()); this.focusable = $(this.focusable.not(element).get()); this.hoverable = $(this.hoverable.not(element).get()); }, _delay: function (handler, delay) { function handlerProxy() { return (typeof handler === "string" ? instance[handler] : handler) .apply(instance, arguments); } var instance = this; return setTimeout(handlerProxy, delay || 0); }, _hoverable: function (element) { this.hoverable = this.hoverable.add(element); this._on(element, { mouseenter: function (event) { this._addClass($(event.currentTarget), null, "ui-state-hover"); }, mouseleave: function (event) { this._removeClass($(event.currentTarget), null, "ui-state-hover"); } }); }, _focusable: function (element) { this.focusable = this.focusable.add(element); this._on(element, { focusin: function (event) { this._addClass($(event.currentTarget), null, "ui-state-focus"); }, focusout: function (event) { this._removeClass($(event.currentTarget), null, "ui-state-focus"); } }); }, _trigger: function (type, event, data) { var prop, orig; var callback = this.options[type]; data = data || {}; event = $.Event(event); event.type = (type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type).toLowerCase(); // The original event may come from any element // so we need to reset the target on the new event event.target = this.element[0]; // Copy original event properties over to the new event orig = event.originalEvent; if (orig) { for (prop in orig) { if (!(prop in event)) { event[prop] = orig[prop]; } } } this.element.trigger(event, data); return !($.isFunction(callback) && callback.apply(this.element[0], [event].concat(data)) === false || event.isDefaultPrevented()); } }; $.each({ show: "fadeIn", hide: "fadeOut" }, function (method, defaultEffect) { $.Widget.prototype["_" + method] = function (element, options, callback) { if (typeof options === "string") { options = { effect: options }; } var hasOptions; var effectName = !options ? method : options === true || typeof options === "number" ? defaultEffect : options.effect || defaultEffect; options = options || {}; if (typeof options === "number") { options = { duration: options }; } hasOptions = !$.isEmptyObject(options); options.complete = callback; if (options.delay) { element.delay(options.delay); } if (hasOptions && $.effects && $.effects.effect[effectName]) { element[method](options); } else if (effectName !== method && element[effectName]) { element[effectName](options.duration, options.easing, callback); } else { element.queue(function (next) { $(this)[method](); if (callback) { callback.call(element[0]); } next(); }); } }; }); var widget = $.widget; /*! * jQuery UI Position 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/position/ */ //>>label: Position //>>group: Core //>>description: Positions elements relative to other elements. //>>docs: http://api.jqueryui.com/position/ //>>demos: http://jqueryui.com/position/ (function () { var cachedScrollbarWidth, max = Math.max, abs = Math.abs, rhorizontal = /left|center|right/, rvertical = /top|center|bottom/, roffset = /[\+\-]\d+(\.[\d]+)?%?/, rposition = /^\w+/, rpercent = /%$/, _position = $.fn.position; function getOffsets(offsets, width, height) { return [ parseFloat(offsets[0]) * (rpercent.test(offsets[0]) ? width / 100 : 1), parseFloat(offsets[1]) * (rpercent.test(offsets[1]) ? height / 100 : 1) ]; } function parseCss(element, property) { return parseInt($.css(element, property), 10) || 0; } function getDimensions(elem) { var raw = elem[0]; if (raw.nodeType === 9) { return { width: elem.width(), height: elem.height(), offset: { top: 0, left: 0 } }; } if ($.isWindow(raw)) { return { width: elem.width(), height: elem.height(), offset: { top: elem.scrollTop(), left: elem.scrollLeft() } }; } if (raw.preventDefault) { return { width: 0, height: 0, offset: { top: raw.pageY, left: raw.pageX } }; } return { width: elem.outerWidth(), height: elem.outerHeight(), offset: elem.offset() }; } $.position = { scrollbarWidth: function () { if (cachedScrollbarWidth !== undefined) { return cachedScrollbarWidth; } var w1, w2, div = $("
" + "
"), innerDiv = div.children()[0]; $("body").append(div); w1 = innerDiv.offsetWidth; div.css("overflow", "scroll"); w2 = innerDiv.offsetWidth; if (w1 === w2) { w2 = div[0].clientWidth; } div.remove(); return (cachedScrollbarWidth = w1 - w2); }, getScrollInfo: function (within) { var overflowX = within.isWindow || within.isDocument ? "" : within.element.css("overflow-x"), overflowY = within.isWindow || within.isDocument ? "" : within.element.css("overflow-y"), hasOverflowX = overflowX === "scroll" || (overflowX === "auto" && within.width < within.element[0].scrollWidth), hasOverflowY = overflowY === "scroll" || (overflowY === "auto" && within.height < within.element[0].scrollHeight); return { width: hasOverflowY ? $.position.scrollbarWidth() : 0, height: hasOverflowX ? $.position.scrollbarWidth() : 0 }; }, getWithinInfo: function (element) { var withinElement = $(element || window), isWindow = $.isWindow(withinElement[0]), isDocument = !!withinElement[0] && withinElement[0].nodeType === 9, hasOffset = !isWindow && !isDocument; return { element: withinElement, isWindow: isWindow, isDocument: isDocument, offset: hasOffset ? $(element).offset() : { left: 0, top: 0 }, scrollLeft: withinElement.scrollLeft(), scrollTop: withinElement.scrollTop(), width: withinElement.outerWidth(), height: withinElement.outerHeight() }; } }; $.fn.position = function (options) { if (!options || !options.of) { return _position.apply(this, arguments); } // Make a copy, we don't want to modify arguments options = $.extend({}, options); var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, target = $(options.of), within = $.position.getWithinInfo(options.within), scrollInfo = $.position.getScrollInfo(within), collision = (options.collision || "flip").split(" "), offsets = {}; dimensions = getDimensions(target); if (target[0].preventDefault) { // Force left top to allow flipping options.at = "left top"; } targetWidth = dimensions.width; targetHeight = dimensions.height; targetOffset = dimensions.offset; // Clone to reuse original targetOffset later basePosition = $.extend({}, targetOffset); // Force my and at to have valid horizontal and vertical positions // if a value is missing or invalid, it will be converted to center $.each(["my", "at"], function () { var pos = (options[this] || "").split(" "), horizontalOffset, verticalOffset; if (pos.length === 1) { pos = rhorizontal.test(pos[0]) ? pos.concat(["center"]) : rvertical.test(pos[0]) ? ["center"].concat(pos) : ["center", "center"]; } pos[0] = rhorizontal.test(pos[0]) ? pos[0] : "center"; pos[1] = rvertical.test(pos[1]) ? pos[1] : "center"; // Calculate offsets horizontalOffset = roffset.exec(pos[0]); verticalOffset = roffset.exec(pos[1]); offsets[this] = [ horizontalOffset ? horizontalOffset[0] : 0, verticalOffset ? verticalOffset[0] : 0 ]; // Reduce to just the positions without the offsets options[this] = [ rposition.exec(pos[0])[0], rposition.exec(pos[1])[0] ]; }); // Normalize collision option if (collision.length === 1) { collision[1] = collision[0]; } if (options.at[0] === "right") { basePosition.left += targetWidth; } else if (options.at[0] === "center") { basePosition.left += targetWidth / 2; } if (options.at[1] === "bottom") { basePosition.top += targetHeight; } else if (options.at[1] === "center") { basePosition.top += targetHeight / 2; } atOffset = getOffsets(offsets.at, targetWidth, targetHeight); basePosition.left += atOffset[0]; basePosition.top += atOffset[1]; return this.each(function () { var collisionPosition, using, elem = $(this), elemWidth = elem.outerWidth(), elemHeight = elem.outerHeight(), marginLeft = parseCss(this, "marginLeft"), marginTop = parseCss(this, "marginTop"), collisionWidth = elemWidth + marginLeft + parseCss(this, "marginRight") + scrollInfo.width, collisionHeight = elemHeight + marginTop + parseCss(this, "marginBottom") + scrollInfo.height, position = $.extend({}, basePosition), myOffset = getOffsets(offsets.my, elem.outerWidth(), elem.outerHeight()); if (options.my[0] === "right") { position.left -= elemWidth; } else if (options.my[0] === "center") { position.left -= elemWidth / 2; } if (options.my[1] === "bottom") { position.top -= elemHeight; } else if (options.my[1] === "center") { position.top -= elemHeight / 2; } position.left += myOffset[0]; position.top += myOffset[1]; collisionPosition = { marginLeft: marginLeft, marginTop: marginTop }; $.each(["left", "top"], function (i, dir) { if ($.ui.position[collision[i]]) { $.ui.position[collision[i]][dir](position, { targetWidth: targetWidth, targetHeight: targetHeight, elemWidth: elemWidth, elemHeight: elemHeight, collisionPosition: collisionPosition, collisionWidth: collisionWidth, collisionHeight: collisionHeight, offset: [atOffset[0] + myOffset[0], atOffset[1] + myOffset[1]], my: options.my, at: options.at, within: within, elem: elem }); } }); if (options.using) { // Adds feedback as second argument to using callback, if present using = function (props) { var left = targetOffset.left - position.left, right = left + targetWidth - elemWidth, top = targetOffset.top - position.top, bottom = top + targetHeight - elemHeight, feedback = { target: { element: target, left: targetOffset.left, top: targetOffset.top, width: targetWidth, height: targetHeight }, element: { element: elem, left: position.left, top: position.top, width: elemWidth, height: elemHeight }, horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" }; if (targetWidth < elemWidth && abs(left + right) < targetWidth) { feedback.horizontal = "center"; } if (targetHeight < elemHeight && abs(top + bottom) < targetHeight) { feedback.vertical = "middle"; } if (max(abs(left), abs(right)) > max(abs(top), abs(bottom))) { feedback.important = "horizontal"; } else { feedback.important = "vertical"; } options.using.call(this, props, feedback); }; } elem.offset($.extend(position, { using: using })); }); }; $.ui.position = { fit: { left: function (position, data) { var within = data.within, withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, outerWidth = within.width, collisionPosLeft = position.left - data.collisionPosition.marginLeft, overLeft = withinOffset - collisionPosLeft, overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, newOverRight; // Element is wider than within if (data.collisionWidth > outerWidth) { // Element is initially over the left side of within if (overLeft > 0 && overRight <= 0) { newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; position.left += overLeft - newOverRight; // Element is initially over right side of within } else if (overRight > 0 && overLeft <= 0) { position.left = withinOffset; // Element is initially over both left and right sides of within } else { if (overLeft > overRight) { position.left = withinOffset + outerWidth - data.collisionWidth; } else { position.left = withinOffset; } } // Too far left -> align with left edge } else if (overLeft > 0) { position.left += overLeft; // Too far right -> align with right edge } else if (overRight > 0) { position.left -= overRight; // Adjust based on position and margin } else { position.left = max(position.left - collisionPosLeft, position.left); } }, top: function (position, data) { var within = data.within, withinOffset = within.isWindow ? within.scrollTop : within.offset.top, outerHeight = data.within.height, collisionPosTop = position.top - data.collisionPosition.marginTop, overTop = withinOffset - collisionPosTop, overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, newOverBottom; // Element is taller than within if (data.collisionHeight > outerHeight) { // Element is initially over the top of within if (overTop > 0 && overBottom <= 0) { newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; position.top += overTop - newOverBottom; // Element is initially over bottom of within } else if (overBottom > 0 && overTop <= 0) { position.top = withinOffset; // Element is initially over both top and bottom of within } else { if (overTop > overBottom) { position.top = withinOffset + outerHeight - data.collisionHeight; } else { position.top = withinOffset; } } // Too far up -> align with top } else if (overTop > 0) { position.top += overTop; // Too far down -> align with bottom edge } else if (overBottom > 0) { position.top -= overBottom; // Adjust based on position and margin } else { position.top = max(position.top - collisionPosTop, position.top); } } }, flip: { left: function (position, data) { var within = data.within, withinOffset = within.offset.left + within.scrollLeft, outerWidth = within.width, offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, collisionPosLeft = position.left - data.collisionPosition.marginLeft, overLeft = collisionPosLeft - offsetLeft, overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, myOffset = data.my[0] === "left" ? -data.elemWidth : data.my[0] === "right" ? data.elemWidth : 0, atOffset = data.at[0] === "left" ? data.targetWidth : data.at[0] === "right" ? -data.targetWidth : 0, offset = -2 * data.offset[0], newOverRight, newOverLeft; if (overLeft < 0) { newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; if (newOverRight < 0 || newOverRight < abs(overLeft)) { position.left += myOffset + atOffset + offset; } } else if (overRight > 0) { newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; if (newOverLeft > 0 || abs(newOverLeft) < overRight) { position.left += myOffset + atOffset + offset; } } }, top: function (position, data) { var within = data.within, withinOffset = within.offset.top + within.scrollTop, outerHeight = within.height, offsetTop = within.isWindow ? within.scrollTop : within.offset.top, collisionPosTop = position.top - data.collisionPosition.marginTop, overTop = collisionPosTop - offsetTop, overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, top = data.my[1] === "top", myOffset = top ? -data.elemHeight : data.my[1] === "bottom" ? data.elemHeight : 0, atOffset = data.at[1] === "top" ? data.targetHeight : data.at[1] === "bottom" ? -data.targetHeight : 0, offset = -2 * data.offset[1], newOverTop, newOverBottom; if (overTop < 0) { newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; if (newOverBottom < 0 || newOverBottom < abs(overTop)) { position.top += myOffset + atOffset + offset; } } else if (overBottom > 0) { newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; if (newOverTop > 0 || abs(newOverTop) < overBottom) { position.top += myOffset + atOffset + offset; } } } }, flipfit: { left: function () { $.ui.position.flip.left.apply(this, arguments); $.ui.position.fit.left.apply(this, arguments); }, top: function () { $.ui.position.flip.top.apply(this, arguments); $.ui.position.fit.top.apply(this, arguments); } } }; })(); var position = $.ui.position; /*! * jQuery UI :data 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: :data Selector //>>group: Core //>>description: Selects elements which have data stored under the specified key. //>>docs: http://api.jqueryui.com/data-selector/ var data = $.extend($.expr[":"], { data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) { return function (elem) { return !!$.data(elem, dataName); }; }) : // Support: jQuery <1.8 function (elem, i, match) { return !!$.data(elem, match[3]); } }); /*! * jQuery UI Disable Selection 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: disableSelection //>>group: Core //>>description: Disable selection of text content within the set of matched elements. //>>docs: http://api.jqueryui.com/disableSelection/ // This file is deprecated var disableSelection = $.fn.extend({ disableSelection: (function () { var eventType = "onselectstart" in document.createElement("div") ? "selectstart" : "mousedown"; return function () { return this.on(eventType + ".ui-disableSelection", function (event) { event.preventDefault(); }); }; })(), enableSelection: function () { return this.off(".ui-disableSelection"); } }); /*! * jQuery UI Effects 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Effects Core //>>group: Effects // jscs:disable maximumLineLength //>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects. // jscs:enable maximumLineLength //>>docs: http://api.jqueryui.com/category/effects-core/ //>>demos: http://jqueryui.com/effect/ var dataSpace = "ui-effects-", dataSpaceStyle = "ui-effects-style", dataSpaceAnimated = "ui-effects-animated", // Create a local jQuery because jQuery Color relies on it and the // global may not exist with AMD and a custom build (#10199) jQuery = $; $.effects = { effect: {} }; /*! * jQuery Color Animations v2.1.2 * https://github.com/jquery/jquery-color * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * Date: Wed Jan 16 08:47:09 2013 -0600 */ (function (jQuery, undefined) { var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " + "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", // Plusequals test for += 100 -= 100 rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, // A set of RE's that can match strings and generate color tuples. stringParsers = [{ re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, parse: function (execResult) { return [ execResult[1], execResult[2], execResult[3], execResult[4] ]; } }, { re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, parse: function (execResult) { return [ execResult[1] * 2.55, execResult[2] * 2.55, execResult[3] * 2.55, execResult[4] ]; } }, { // This regex ignores A-F because it's compared against an already lowercased string re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, parse: function (execResult) { return [ parseInt(execResult[1], 16), parseInt(execResult[2], 16), parseInt(execResult[3], 16) ]; } }, { // This regex ignores A-F because it's compared against an already lowercased string re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, parse: function (execResult) { return [ parseInt(execResult[1] + execResult[1], 16), parseInt(execResult[2] + execResult[2], 16), parseInt(execResult[3] + execResult[3], 16) ]; } }, { re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, space: "hsla", parse: function (execResult) { return [ execResult[1], execResult[2] / 100, execResult[3] / 100, execResult[4] ]; } }], // JQuery.Color( ) color = jQuery.Color = function (color, green, blue, alpha) { return new jQuery.Color.fn.parse(color, green, blue, alpha); }, spaces = { rgba: { props: { red: { idx: 0, type: "byte" }, green: { idx: 1, type: "byte" }, blue: { idx: 2, type: "byte" } } }, hsla: { props: { hue: { idx: 0, type: "degrees" }, saturation: { idx: 1, type: "percent" }, lightness: { idx: 2, type: "percent" } } } }, propTypes = { "byte": { floor: true, max: 255 }, "percent": { max: 1 }, "degrees": { mod: 360, floor: true } }, support = color.support = {}, // Element for support tests supportElem = jQuery("

")[0], // Colors = jQuery.Color.names colors, // Local aliases of functions called often each = jQuery.each; // Determine rgba support immediately supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; support.rgba = supportElem.style.backgroundColor.indexOf("rgba") > -1; // Define cache name and alpha properties // for rgba and hsla spaces each(spaces, function (spaceName, space) { space.cache = "_" + spaceName; space.props.alpha = { idx: 3, type: "percent", def: 1 }; }); function clamp(value, prop, allowEmpty) { var type = propTypes[prop.type] || {}; if (value == null) { return (allowEmpty || !prop.def) ? null : prop.def; } // ~~ is an short way of doing floor for positive numbers value = type.floor ? ~~value : parseFloat(value); // IE will pass in empty strings as value for alpha, // which will hit this case if (isNaN(value)) { return prop.def; } if (type.mod) { // We add mod before modding to make sure that negatives values // get converted properly: -10 -> 350 return (value + type.mod) % type.mod; } // For now all property types without mod have min and max return 0 > value ? 0 : type.max < value ? type.max : value; } function stringParse(string) { var inst = color(), rgba = inst._rgba = []; string = string.toLowerCase(); each(stringParsers, function (i, parser) { var parsed, match = parser.re.exec(string), values = match && parser.parse(match), spaceName = parser.space || "rgba"; if (values) { parsed = inst[spaceName](values); // If this was an rgba parse the assignment might happen twice // oh well.... inst[spaces[spaceName].cache] = parsed[spaces[spaceName].cache]; rgba = inst._rgba = parsed._rgba; // Exit each( stringParsers ) here because we matched return false; } }); // Found a stringParser that handled it if (rgba.length) { // If this came from a parsed string, force "transparent" when alpha is 0 // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) if (rgba.join() === "0,0,0,0") { jQuery.extend(rgba, colors.transparent); } return inst; } // Named colors return colors[string]; } color.fn = jQuery.extend(color.prototype, { parse: function (red, green, blue, alpha) { if (red === undefined) { this._rgba = [null, null, null, null]; return this; } if (red.jquery || red.nodeType) { red = jQuery(red).css(green); green = undefined; } var inst = this, type = jQuery.type(red), rgba = this._rgba = []; // More than 1 argument specified - assume ( red, green, blue, alpha ) if (green !== undefined) { red = [red, green, blue, alpha]; type = "array"; } if (type === "string") { return this.parse(stringParse(red) || colors._default); } if (type === "array") { each(spaces.rgba.props, function (key, prop) { rgba[prop.idx] = clamp(red[prop.idx], prop); }); return this; } if (type === "object") { if (red instanceof color) { each(spaces, function (spaceName, space) { if (red[space.cache]) { inst[space.cache] = red[space.cache].slice(); } }); } else { each(spaces, function (spaceName, space) { var cache = space.cache; each(space.props, function (key, prop) { // If the cache doesn't exist, and we know how to convert if (!inst[cache] && space.to) { // If the value was null, we don't need to copy it // if the key was alpha, we don't need to copy it either if (key === "alpha" || red[key] == null) { return; } inst[cache] = space.to(inst._rgba); } // This is the only case where we allow nulls for ALL properties. // call clamp with alwaysAllowEmpty inst[cache][prop.idx] = clamp(red[key], prop, true); }); // Everything defined but alpha? if (inst[cache] && jQuery.inArray(null, inst[cache].slice(0, 3)) < 0) { // Use the default of 1 inst[cache][3] = 1; if (space.from) { inst._rgba = space.from(inst[cache]); } } }); } return this; } }, is: function (compare) { var is = color(compare), same = true, inst = this; each(spaces, function (_, space) { var localCache, isCache = is[space.cache]; if (isCache) { localCache = inst[space.cache] || space.to && space.to(inst._rgba) || []; each(space.props, function (_, prop) { if (isCache[prop.idx] != null) { same = (isCache[prop.idx] === localCache[prop.idx]); return same; } }); } return same; }); return same; }, _space: function () { var used = [], inst = this; each(spaces, function (spaceName, space) { if (inst[space.cache]) { used.push(spaceName); } }); return used.pop(); }, transition: function (other, distance) { var end = color(other), spaceName = end._space(), space = spaces[spaceName], startColor = this.alpha() === 0 ? color("transparent") : this, start = startColor[space.cache] || space.to(startColor._rgba), result = start.slice(); end = end[space.cache]; each(space.props, function (key, prop) { var index = prop.idx, startValue = start[index], endValue = end[index], type = propTypes[prop.type] || {}; // If null, don't override start value if (endValue === null) { return; } // If null - use end if (startValue === null) { result[index] = endValue; } else { if (type.mod) { if (endValue - startValue > type.mod / 2) { startValue += type.mod; } else if (startValue - endValue > type.mod / 2) { startValue -= type.mod; } } result[index] = clamp((endValue - startValue) * distance + startValue, prop); } }); return this[spaceName](result); }, blend: function (opaque) { // If we are already opaque - return ourself if (this._rgba[3] === 1) { return this; } var rgb = this._rgba.slice(), a = rgb.pop(), blend = color(opaque)._rgba; return color(jQuery.map(rgb, function (v, i) { return (1 - a) * blend[i] + a * v; })); }, toRgbaString: function () { var prefix = "rgba(", rgba = jQuery.map(this._rgba, function (v, i) { return v == null ? (i > 2 ? 1 : 0) : v; }); if (rgba[3] === 1) { rgba.pop(); prefix = "rgb("; } return prefix + rgba.join() + ")"; }, toHslaString: function () { var prefix = "hsla(", hsla = jQuery.map(this.hsla(), function (v, i) { if (v == null) { v = i > 2 ? 1 : 0; } // Catch 1 and 2 if (i && i < 3) { v = Math.round(v * 100) + "%"; } return v; }); if (hsla[3] === 1) { hsla.pop(); prefix = "hsl("; } return prefix + hsla.join() + ")"; }, toHexString: function (includeAlpha) { var rgba = this._rgba.slice(), alpha = rgba.pop(); if (includeAlpha) { rgba.push(~~(alpha * 255)); } return "#" + jQuery.map(rgba, function (v) { // Default to 0 when nulls exist v = (v || 0).toString(16); return v.length === 1 ? "0" + v : v; }).join(""); }, toString: function () { return this._rgba[3] === 0 ? "transparent" : this.toRgbaString(); } }); color.fn.parse.prototype = color.fn; // Hsla conversions adapted from: // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 function hue2rgb(p, q, h) { h = (h + 1) % 1; if (h * 6 < 1) { return p + (q - p) * h * 6; } if (h * 2 < 1) { return q; } if (h * 3 < 2) { return p + (q - p) * ((2 / 3) - h) * 6; } return p; } spaces.hsla.to = function (rgba) { if (rgba[0] == null || rgba[1] == null || rgba[2] == null) { return [null, null, null, rgba[3]]; } var r = rgba[0] / 255, g = rgba[1] / 255, b = rgba[2] / 255, a = rgba[3], max = Math.max(r, g, b), min = Math.min(r, g, b), diff = max - min, add = max + min, l = add * 0.5, h, s; if (min === max) { h = 0; } else if (r === max) { h = (60 * (g - b) / diff) + 360; } else if (g === max) { h = (60 * (b - r) / diff) + 120; } else { h = (60 * (r - g) / diff) + 240; } // Chroma (diff) == 0 means greyscale which, by definition, saturation = 0% // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) if (diff === 0) { s = 0; } else if (l <= 0.5) { s = diff / add; } else { s = diff / (2 - add); } return [Math.round(h) % 360, s, l, a == null ? 1 : a]; }; spaces.hsla.from = function (hsla) { if (hsla[0] == null || hsla[1] == null || hsla[2] == null) { return [null, null, null, hsla[3]]; } var h = hsla[0] / 360, s = hsla[1], l = hsla[2], a = hsla[3], q = l <= 0.5 ? l * (1 + s) : l + s - l * s, p = 2 * l - q; return [ Math.round(hue2rgb(p, q, h + (1 / 3)) * 255), Math.round(hue2rgb(p, q, h) * 255), Math.round(hue2rgb(p, q, h - (1 / 3)) * 255), a ]; }; each(spaces, function (spaceName, space) { var props = space.props, cache = space.cache, to = space.to, from = space.from; // Makes rgba() and hsla() color.fn[spaceName] = function (value) { // Generate a cache for this space if it doesn't exist if (to && !this[cache]) { this[cache] = to(this._rgba); } if (value === undefined) { return this[cache].slice(); } var ret, type = jQuery.type(value), arr = (type === "array" || type === "object") ? value : arguments, local = this[cache].slice(); each(props, function (key, prop) { var val = arr[type === "object" ? key : prop.idx]; if (val == null) { val = local[prop.idx]; } local[prop.idx] = clamp(val, prop); }); if (from) { ret = color(from(local)); ret[cache] = local; return ret; } else { return color(local); } }; // Makes red() green() blue() alpha() hue() saturation() lightness() each(props, function (key, prop) { // Alpha is included in more than one space if (color.fn[key]) { return; } color.fn[key] = function (value) { var vtype = jQuery.type(value), fn = (key === "alpha" ? (this._hsla ? "hsla" : "rgba") : spaceName), local = this[fn](), cur = local[prop.idx], match; if (vtype === "undefined") { return cur; } if (vtype === "function") { value = value.call(this, cur); vtype = jQuery.type(value); } if (value == null && prop.empty) { return this; } if (vtype === "string") { match = rplusequals.exec(value); if (match) { value = cur + parseFloat(match[2]) * (match[1] === "+" ? 1 : -1); } } local[prop.idx] = value; return this[fn](local); }; }); }); // Add cssHook and .fx.step function for each named hook. // accept a space separated string of properties color.hook = function (hook) { var hooks = hook.split(" "); each(hooks, function (i, hook) { jQuery.cssHooks[hook] = { set: function (elem, value) { var parsed, curElem, backgroundColor = ""; if (value !== "transparent" && (jQuery.type(value) !== "string" || (parsed = stringParse(value)))) { value = color(parsed || value); if (!support.rgba && value._rgba[3] !== 1) { curElem = hook === "backgroundColor" ? elem.parentNode : elem; while ( (backgroundColor === "" || backgroundColor === "transparent") && curElem && curElem.style ) { try { backgroundColor = jQuery.css(curElem, "backgroundColor"); curElem = curElem.parentNode; } catch (e) { } } value = value.blend(backgroundColor && backgroundColor !== "transparent" ? backgroundColor : "_default"); } value = value.toRgbaString(); } try { elem.style[hook] = value; } catch (e) { // Wrapped to prevent IE from throwing errors on "invalid" values like // 'auto' or 'inherit' } } }; jQuery.fx.step[hook] = function (fx) { if (!fx.colorInit) { fx.start = color(fx.elem, hook); fx.end = color(fx.end); fx.colorInit = true; } jQuery.cssHooks[hook].set(fx.elem, fx.start.transition(fx.end, fx.pos)); }; }); }; color.hook(stepHooks); jQuery.cssHooks.borderColor = { expand: function (value) { var expanded = {}; each(["Top", "Right", "Bottom", "Left"], function (i, part) { expanded["border" + part + "Color"] = value; }); return expanded; } }; // Basic color names only. // Usage of any of the other color names requires adding yourself or including // jquery.color.svg-names.js. colors = jQuery.Color.names = { // 4.1. Basic color keywords aqua: "#00ffff", black: "#000000", blue: "#0000ff", fuchsia: "#ff00ff", gray: "#808080", green: "#008000", lime: "#00ff00", maroon: "#800000", navy: "#000080", olive: "#808000", purple: "#800080", red: "#ff0000", silver: "#c0c0c0", teal: "#008080", white: "#ffffff", yellow: "#ffff00", // 4.2.3. "transparent" color keyword transparent: [null, null, null, 0], _default: "#ffffff" }; })(jQuery); /******************************************************************************/ /****************************** CLASS ANIMATIONS ******************************/ /******************************************************************************/ (function () { var classAnimationActions = ["add", "remove", "toggle"], shorthandStyles = { border: 1, borderBottom: 1, borderColor: 1, borderLeft: 1, borderRight: 1, borderTop: 1, borderWidth: 1, margin: 1, padding: 1 }; $.each( ["borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle"], function (_, prop) { $.fx.step[prop] = function (fx) { if (fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr) { jQuery.style(fx.elem, prop, fx.end); fx.setAttr = true; } }; } ); function getElementStyles(elem) { var key, len, style = elem.ownerDocument.defaultView ? elem.ownerDocument.defaultView.getComputedStyle(elem, null) : elem.currentStyle, styles = {}; if (style && style.length && style[0] && style[style[0]]) { len = style.length; while (len--) { key = style[len]; if (typeof style[key] === "string") { styles[$.camelCase(key)] = style[key]; } } // Support: Opera, IE <9 } else { for (key in style) { if (typeof style[key] === "string") { styles[key] = style[key]; } } } return styles; } function styleDifference(oldStyle, newStyle) { var diff = {}, name, value; for (name in newStyle) { value = newStyle[name]; if (oldStyle[name] !== value) { if (!shorthandStyles[name]) { if ($.fx.step[name] || !isNaN(parseFloat(value))) { diff[name] = value; } } } } return diff; } // Support: jQuery <1.8 if (!$.fn.addBack) { $.fn.addBack = function (selector) { return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector) ); }; } $.effects.animateClass = function (value, duration, easing, callback) { var o = $.speed(duration, easing, callback); return this.queue(function () { var animated = $(this), baseClass = animated.attr("class") || "", applyClassChange, allAnimations = o.children ? animated.find("*").addBack() : animated; // Map the animated objects to store the original styles. allAnimations = allAnimations.map(function () { var el = $(this); return { el: el, start: getElementStyles(this) }; }); // Apply class change applyClassChange = function () { $.each(classAnimationActions, function (i, action) { if (value[action]) { animated[action + "Class"](value[action]); } }); }; applyClassChange(); // Map all animated objects again - calculate new styles and diff allAnimations = allAnimations.map(function () { this.end = getElementStyles(this.el[0]); this.diff = styleDifference(this.start, this.end); return this; }); // Apply original class animated.attr("class", baseClass); // Map all animated objects again - this time collecting a promise allAnimations = allAnimations.map(function () { var styleInfo = this, dfd = $.Deferred(), opts = $.extend({}, o, { queue: false, complete: function () { dfd.resolve(styleInfo); } }); this.el.animate(this.diff, opts); return dfd.promise(); }); // Once all animations have completed: $.when.apply($, allAnimations.get()).done(function () { // Set the final class applyClassChange(); // For each animated element, // clear all css properties that were animated $.each(arguments, function () { var el = this.el; $.each(this.diff, function (key) { el.css(key, ""); }); }); // This is guarnteed to be there if you use jQuery.speed() // it also handles dequeuing the next anim... o.complete.call(animated[0]); }); }); }; $.fn.extend({ addClass: (function (orig) { return function (classNames, speed, easing, callback) { return speed ? $.effects.animateClass.call(this, { add: classNames }, speed, easing, callback) : orig.apply(this, arguments); }; })($.fn.addClass), removeClass: (function (orig) { return function (classNames, speed, easing, callback) { return arguments.length > 1 ? $.effects.animateClass.call(this, { remove: classNames }, speed, easing, callback) : orig.apply(this, arguments); }; })($.fn.removeClass), toggleClass: (function (orig) { return function (classNames, force, speed, easing, callback) { if (typeof force === "boolean" || force === undefined) { if (!speed) { // Without speed parameter return orig.apply(this, arguments); } else { return $.effects.animateClass.call(this, (force ? { add: classNames } : { remove: classNames }), speed, easing, callback); } } else { // Without force parameter return $.effects.animateClass.call(this, { toggle: classNames }, force, speed, easing); } }; })($.fn.toggleClass), switchClass: function (remove, add, speed, easing, callback) { return $.effects.animateClass.call(this, { add: add, remove: remove }, speed, easing, callback); } }); })(); /******************************************************************************/ /*********************************** EFFECTS **********************************/ /******************************************************************************/ (function () { if ($.expr && $.expr.filters && $.expr.filters.animated) { $.expr.filters.animated = (function (orig) { return function (elem) { return !!$(elem).data(dataSpaceAnimated) || orig(elem); }; })($.expr.filters.animated); } if ($.uiBackCompat !== false) { $.extend($.effects, { // Saves a set of properties in a data storage save: function (element, set) { var i = 0, length = set.length; for (; i < length; i++) { if (set[i] !== null) { element.data(dataSpace + set[i], element[0].style[set[i]]); } } }, // Restores a set of previously saved properties from a data storage restore: function (element, set) { var val, i = 0, length = set.length; for (; i < length; i++) { if (set[i] !== null) { val = element.data(dataSpace + set[i]); element.css(set[i], val); } } }, setMode: function (el, mode) { if (mode === "toggle") { mode = el.is(":hidden") ? "show" : "hide"; } return mode; }, // Wraps the element around a wrapper that copies position properties createWrapper: function (element) { // If the element is already wrapped, return it if (element.parent().is(".ui-effects-wrapper")) { return element.parent(); } // Wrap the element var props = { width: element.outerWidth(true), height: element.outerHeight(true), "float": element.css("float") }, wrapper = $("

") .addClass("ui-effects-wrapper") .css({ fontSize: "100%", background: "transparent", border: "none", margin: 0, padding: 0 }), // Store the size in case width/height are defined in % - Fixes #5245 size = { width: element.width(), height: element.height() }, active = document.activeElement; // Support: Firefox // Firefox incorrectly exposes anonymous content // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 try { active.id; } catch (e) { active = document.body; } element.wrap(wrapper); // Fixes #7595 - Elements lose focus when wrapped. if (element[0] === active || $.contains(element[0], active)) { $(active).trigger("focus"); } // Hotfix for jQuery 1.4 since some change in wrap() seems to actually // lose the reference to the wrapped element wrapper = element.parent(); // Transfer positioning properties to the wrapper if (element.css("position") === "static") { wrapper.css({ position: "relative" }); element.css({ position: "relative" }); } else { $.extend(props, { position: element.css("position"), zIndex: element.css("z-index") }); $.each(["top", "left", "bottom", "right"], function (i, pos) { props[pos] = element.css(pos); if (isNaN(parseInt(props[pos], 10))) { props[pos] = "auto"; } }); element.css({ position: "relative", top: 0, left: 0, right: "auto", bottom: "auto" }); } element.css(size); return wrapper.css(props).show(); }, removeWrapper: function (element) { var active = document.activeElement; if (element.parent().is(".ui-effects-wrapper")) { element.parent().replaceWith(element); // Fixes #7595 - Elements lose focus when wrapped. if (element[0] === active || $.contains(element[0], active)) { $(active).trigger("focus"); } } return element; } }); } $.extend($.effects, { version: "1.12.1", define: function (name, mode, effect) { if (!effect) { effect = mode; mode = "effect"; } $.effects.effect[name] = effect; $.effects.effect[name].mode = mode; return effect; }, scaledDimensions: function (element, percent, direction) { if (percent === 0) { return { height: 0, width: 0, outerHeight: 0, outerWidth: 0 }; } var x = direction !== "horizontal" ? ((percent || 100) / 100) : 1, y = direction !== "vertical" ? ((percent || 100) / 100) : 1; return { height: element.height() * y, width: element.width() * x, outerHeight: element.outerHeight() * y, outerWidth: element.outerWidth() * x }; }, clipToBox: function (animation) { return { width: animation.clip.right - animation.clip.left, height: animation.clip.bottom - animation.clip.top, left: animation.clip.left, top: animation.clip.top }; }, // Injects recently queued functions to be first in line (after "inprogress") unshift: function (element, queueLength, count) { var queue = element.queue(); if (queueLength > 1) { queue.splice.apply(queue, [1, 0].concat(queue.splice(queueLength, count))); } element.dequeue(); }, saveStyle: function (element) { element.data(dataSpaceStyle, element[0].style.cssText); }, restoreStyle: function (element) { element[0].style.cssText = element.data(dataSpaceStyle) || ""; element.removeData(dataSpaceStyle); }, mode: function (element, mode) { var hidden = element.is(":hidden"); if (mode === "toggle") { mode = hidden ? "show" : "hide"; } if (hidden ? mode === "hide" : mode === "show") { mode = "none"; } return mode; }, // Translates a [top,left] array into a baseline value getBaseline: function (origin, original) { var y, x; switch (origin[0]) { case "top": y = 0; break; case "middle": y = 0.5; break; case "bottom": y = 1; break; default: y = origin[0] / original.height; } switch (origin[1]) { case "left": x = 0; break; case "center": x = 0.5; break; case "right": x = 1; break; default: x = origin[1] / original.width; } return { x: x, y: y }; }, // Creates a placeholder element so that the original element can be made absolute createPlaceholder: function (element) { var placeholder, cssPosition = element.css("position"), position = element.position(); // Lock in margins first to account for form elements, which // will change margin if you explicitly set height // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380 // Support: Safari element.css({ marginTop: element.css("marginTop"), marginBottom: element.css("marginBottom"), marginLeft: element.css("marginLeft"), marginRight: element.css("marginRight") }) .outerWidth(element.outerWidth()) .outerHeight(element.outerHeight()); if (/^(static|relative)/.test(cssPosition)) { cssPosition = "absolute"; placeholder = $("<" + element[0].nodeName + ">").insertAfter(element).css({ // Convert inline to inline block to account for inline elements // that turn to inline block based on content (like img) display: /^(inline|ruby)/.test(element.css("display")) ? "inline-block" : "block", visibility: "hidden", // Margins need to be set to account for margin collapse marginTop: element.css("marginTop"), marginBottom: element.css("marginBottom"), marginLeft: element.css("marginLeft"), marginRight: element.css("marginRight"), "float": element.css("float") }) .outerWidth(element.outerWidth()) .outerHeight(element.outerHeight()) .addClass("ui-effects-placeholder"); element.data(dataSpace + "placeholder", placeholder); } element.css({ position: cssPosition, left: position.left, top: position.top }); return placeholder; }, removePlaceholder: function (element) { var dataKey = dataSpace + "placeholder", placeholder = element.data(dataKey); if (placeholder) { placeholder.remove(); element.removeData(dataKey); } }, // Removes a placeholder if it exists and restores // properties that were modified during placeholder creation cleanUp: function (element) { $.effects.restoreStyle(element); $.effects.removePlaceholder(element); }, setTransition: function (element, list, factor, value) { value = value || {}; $.each(list, function (i, x) { var unit = element.cssUnit(x); if (unit[0] > 0) { value[x] = unit[0] * factor + unit[1]; } }); return value; } }); // Return an effect options object for the given parameters: function _normalizeArguments(effect, options, speed, callback) { // Allow passing all options as the first parameter if ($.isPlainObject(effect)) { options = effect; effect = effect.effect; } // Convert to an object effect = { effect: effect }; // Catch (effect, null, ...) if (options == null) { options = {}; } // Catch (effect, callback) if ($.isFunction(options)) { callback = options; speed = null; options = {}; } // Catch (effect, speed, ?) if (typeof options === "number" || $.fx.speeds[options]) { callback = speed; speed = options; options = {}; } // Catch (effect, options, callback) if ($.isFunction(speed)) { callback = speed; speed = null; } // Add options to effect if (options) { $.extend(effect, options); } speed = speed || options.duration; effect.duration = $.fx.off ? 0 : typeof speed === "number" ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default; effect.complete = callback || options.complete; return effect; } function standardAnimationOption(option) { // Valid standard speeds (nothing, number, named speed) if (!option || typeof option === "number" || $.fx.speeds[option]) { return true; } // Invalid strings - treat as "normal" speed if (typeof option === "string" && !$.effects.effect[option]) { return true; } // Complete callback if ($.isFunction(option)) { return true; } // Options hash (but not naming an effect) if (typeof option === "object" && !option.effect) { return true; } // Didn't match any standard API return false; } $.fn.extend({ effect: function ( /* effect, options, speed, callback */) { var args = _normalizeArguments.apply(this, arguments), effectMethod = $.effects.effect[args.effect], defaultMode = effectMethod.mode, queue = args.queue, queueName = queue || "fx", complete = args.complete, mode = args.mode, modes = [], prefilter = function (next) { var el = $(this), normalizedMode = $.effects.mode(el, mode) || defaultMode; // Sentinel for duck-punching the :animated psuedo-selector el.data(dataSpaceAnimated, true); // Save effect mode for later use, // we can't just call $.effects.mode again later, // as the .show() below destroys the initial state modes.push(normalizedMode); // See $.uiBackCompat inside of run() for removal of defaultMode in 1.13 if (defaultMode && (normalizedMode === "show" || (normalizedMode === defaultMode && normalizedMode === "hide"))) { el.show(); } if (!defaultMode || normalizedMode !== "none") { $.effects.saveStyle(el); } if ($.isFunction(next)) { next(); } }; if ($.fx.off || !effectMethod) { // Delegate to the original method (e.g., .show()) if possible if (mode) { return this[mode](args.duration, complete); } else { return this.each(function () { if (complete) { complete.call(this); } }); } } function run(next) { var elem = $(this); function cleanup() { elem.removeData(dataSpaceAnimated); $.effects.cleanUp(elem); if (args.mode === "hide") { elem.hide(); } done(); } function done() { if ($.isFunction(complete)) { complete.call(elem[0]); } if ($.isFunction(next)) { next(); } } // Override mode option on a per element basis, // as toggle can be either show or hide depending on element state args.mode = modes.shift(); if ($.uiBackCompat !== false && !defaultMode) { if (elem.is(":hidden") ? mode === "hide" : mode === "show") { // Call the core method to track "olddisplay" properly elem[mode](); done(); } else { effectMethod.call(elem[0], args, done); } } else { if (args.mode === "none") { // Call the core method to track "olddisplay" properly elem[mode](); done(); } else { effectMethod.call(elem[0], args, cleanup); } } } // Run prefilter on all elements first to ensure that // any showing or hiding happens before placeholder creation, // which ensures that any layout changes are correctly captured. return queue === false ? this.each(prefilter).each(run) : this.queue(queueName, prefilter).queue(queueName, run); }, show: (function (orig) { return function (option) { if (standardAnimationOption(option)) { return orig.apply(this, arguments); } else { var args = _normalizeArguments.apply(this, arguments); args.mode = "show"; return this.effect.call(this, args); } }; })($.fn.show), hide: (function (orig) { return function (option) { if (standardAnimationOption(option)) { return orig.apply(this, arguments); } else { var args = _normalizeArguments.apply(this, arguments); args.mode = "hide"; return this.effect.call(this, args); } }; })($.fn.hide), toggle: (function (orig) { return function (option) { if (standardAnimationOption(option) || typeof option === "boolean") { return orig.apply(this, arguments); } else { var args = _normalizeArguments.apply(this, arguments); args.mode = "toggle"; return this.effect.call(this, args); } }; })($.fn.toggle), cssUnit: function (key) { var style = this.css(key), val = []; $.each(["em", "px", "%", "pt"], function (i, unit) { if (style.indexOf(unit) > 0) { val = [parseFloat(style), unit]; } }); return val; }, cssClip: function (clipObj) { if (clipObj) { return this.css("clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " + clipObj.bottom + "px " + clipObj.left + "px)"); } return parseClip(this.css("clip"), this); }, transfer: function (options, done) { var element = $(this), target = $(options.to), targetFixed = target.css("position") === "fixed", body = $("body"), fixTop = targetFixed ? body.scrollTop() : 0, fixLeft = targetFixed ? body.scrollLeft() : 0, endPosition = target.offset(), animation = { top: endPosition.top - fixTop, left: endPosition.left - fixLeft, height: target.innerHeight(), width: target.innerWidth() }, startPosition = element.offset(), transfer = $("
") .appendTo("body") .addClass(options.className) .css({ top: startPosition.top - fixTop, left: startPosition.left - fixLeft, height: element.innerHeight(), width: element.innerWidth(), position: targetFixed ? "fixed" : "absolute" }) .animate(animation, options.duration, options.easing, function () { transfer.remove(); if ($.isFunction(done)) { done(); } }); } }); function parseClip(str, element) { var outerWidth = element.outerWidth(), outerHeight = element.outerHeight(), clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/, values = clipRegex.exec(str) || ["", 0, outerWidth, outerHeight, 0]; return { top: parseFloat(values[1]) || 0, right: values[2] === "auto" ? outerWidth : parseFloat(values[2]), bottom: values[3] === "auto" ? outerHeight : parseFloat(values[3]), left: parseFloat(values[4]) || 0 }; } $.fx.step.clip = function (fx) { if (!fx.clipInit) { fx.start = $(fx.elem).cssClip(); if (typeof fx.end === "string") { fx.end = parseClip(fx.end, fx.elem); } fx.clipInit = true; } $(fx.elem).cssClip({ top: fx.pos * (fx.end.top - fx.start.top) + fx.start.top, right: fx.pos * (fx.end.right - fx.start.right) + fx.start.right, bottom: fx.pos * (fx.end.bottom - fx.start.bottom) + fx.start.bottom, left: fx.pos * (fx.end.left - fx.start.left) + fx.start.left }); }; })(); /******************************************************************************/ /*********************************** EASING ***********************************/ /******************************************************************************/ (function () { // Based on easing equations from Robert Penner (http://www.robertpenner.com/easing) var baseEasings = {}; $.each(["Quad", "Cubic", "Quart", "Quint", "Expo"], function (i, name) { baseEasings[name] = function (p) { return Math.pow(p, i + 2); }; }); $.extend(baseEasings, { Sine: function (p) { return 1 - Math.cos(p * Math.PI / 2); }, Circ: function (p) { return 1 - Math.sqrt(1 - p * p); }, Elastic: function (p) { return p === 0 || p === 1 ? p : -Math.pow(2, 8 * (p - 1)) * Math.sin(((p - 1) * 80 - 7.5) * Math.PI / 15); }, Back: function (p) { return p * p * (3 * p - 2); }, Bounce: function (p) { var pow2, bounce = 4; while (p < ((pow2 = Math.pow(2, --bounce)) - 1) / 11) { } return 1 / Math.pow(4, 3 - bounce) - 7.5625 * Math.pow((pow2 * 3 - 2) / 22 - p, 2); } }); $.each(baseEasings, function (name, easeIn) { $.easing["easeIn" + name] = easeIn; $.easing["easeOut" + name] = function (p) { return 1 - easeIn(1 - p); }; $.easing["easeInOut" + name] = function (p) { return p < 0.5 ? easeIn(p * 2) / 2 : 1 - easeIn(p * -2 + 2) / 2; }; }); })(); var effect = $.effects; /*! * jQuery UI Effects Blind 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Blind Effect //>>group: Effects //>>description: Blinds the element. //>>docs: http://api.jqueryui.com/blind-effect/ //>>demos: http://jqueryui.com/effect/ var effectsEffectBlind = $.effects.define("blind", "hide", function (options, done) { var map = { up: ["bottom", "top"], vertical: ["bottom", "top"], down: ["top", "bottom"], left: ["right", "left"], horizontal: ["right", "left"], right: ["left", "right"] }, element = $(this), direction = options.direction || "up", start = element.cssClip(), animate = { clip: $.extend({}, start) }, placeholder = $.effects.createPlaceholder(element); animate.clip[map[direction][0]] = animate.clip[map[direction][1]]; if (options.mode === "show") { element.cssClip(animate.clip); if (placeholder) { placeholder.css($.effects.clipToBox(animate)); } animate.clip = start; } if (placeholder) { placeholder.animate($.effects.clipToBox(animate), options.duration, options.easing); } element.animate(animate, { queue: false, duration: options.duration, easing: options.easing, complete: done }); }); /*! * jQuery UI Effects Bounce 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Bounce Effect //>>group: Effects //>>description: Bounces an element horizontally or vertically n times. //>>docs: http://api.jqueryui.com/bounce-effect/ //>>demos: http://jqueryui.com/effect/ var effectsEffectBounce = $.effects.define("bounce", function (options, done) { var upAnim, downAnim, refValue, element = $(this), // Defaults: mode = options.mode, hide = mode === "hide", show = mode === "show", direction = options.direction || "up", distance = options.distance, times = options.times || 5, // Number of internal animations anims = times * 2 + (show || hide ? 1 : 0), speed = options.duration / anims, easing = options.easing, // Utility: ref = (direction === "up" || direction === "down") ? "top" : "left", motion = (direction === "up" || direction === "left"), i = 0, queuelen = element.queue().length; $.effects.createPlaceholder(element); refValue = element.css(ref); // Default distance for the BIGGEST bounce is the outer Distance / 3 if (!distance) { distance = element[ref === "top" ? "outerHeight" : "outerWidth"]() / 3; } if (show) { downAnim = { opacity: 1 }; downAnim[ref] = refValue; // If we are showing, force opacity 0 and set the initial position // then do the "first" animation element .css("opacity", 0) .css(ref, motion ? -distance * 2 : distance * 2) .animate(downAnim, speed, easing); } // Start at the smallest distance if we are hiding if (hide) { distance = distance / Math.pow(2, times - 1); } downAnim = {}; downAnim[ref] = refValue; // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here for (; i < times; i++) { upAnim = {}; upAnim[ref] = (motion ? "-=" : "+=") + distance; element .animate(upAnim, speed, easing) .animate(downAnim, speed, easing); distance = hide ? distance * 2 : distance / 2; } // Last Bounce when Hiding if (hide) { upAnim = { opacity: 0 }; upAnim[ref] = (motion ? "-=" : "+=") + distance; element.animate(upAnim, speed, easing); } element.queue(done); $.effects.unshift(element, queuelen, anims + 1); }); /*! * jQuery UI Effects Clip 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Clip Effect //>>group: Effects //>>description: Clips the element on and off like an old TV. //>>docs: http://api.jqueryui.com/clip-effect/ //>>demos: http://jqueryui.com/effect/ var effectsEffectClip = $.effects.define("clip", "hide", function (options, done) { var start, animate = {}, element = $(this), direction = options.direction || "vertical", both = direction === "both", horizontal = both || direction === "horizontal", vertical = both || direction === "vertical"; start = element.cssClip(); animate.clip = { top: vertical ? (start.bottom - start.top) / 2 : start.top, right: horizontal ? (start.right - start.left) / 2 : start.right, bottom: vertical ? (start.bottom - start.top) / 2 : start.bottom, left: horizontal ? (start.right - start.left) / 2 : start.left }; $.effects.createPlaceholder(element); if (options.mode === "show") { element.cssClip(animate.clip); animate.clip = start; } element.animate(animate, { queue: false, duration: options.duration, easing: options.easing, complete: done }); }); /*! * jQuery UI Effects Drop 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Drop Effect //>>group: Effects //>>description: Moves an element in one direction and hides it at the same time. //>>docs: http://api.jqueryui.com/drop-effect/ //>>demos: http://jqueryui.com/effect/ var effectsEffectDrop = $.effects.define("drop", "hide", function (options, done) { var distance, element = $(this), mode = options.mode, show = mode === "show", direction = options.direction || "left", ref = (direction === "up" || direction === "down") ? "top" : "left", motion = (direction === "up" || direction === "left") ? "-=" : "+=", oppositeMotion = (motion === "+=") ? "-=" : "+=", animation = { opacity: 0 }; $.effects.createPlaceholder(element); distance = options.distance || element[ref === "top" ? "outerHeight" : "outerWidth"](true) / 2; animation[ref] = motion + distance; if (show) { element.css(animation); animation[ref] = oppositeMotion + distance; animation.opacity = 1; } // Animate element.animate(animation, { queue: false, duration: options.duration, easing: options.easing, complete: done }); }); /*! * jQuery UI Effects Explode 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Explode Effect //>>group: Effects // jscs:disable maximumLineLength //>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness. // jscs:enable maximumLineLength //>>docs: http://api.jqueryui.com/explode-effect/ //>>demos: http://jqueryui.com/effect/ var effectsEffectExplode = $.effects.define("explode", "hide", function (options, done) { var i, j, left, top, mx, my, rows = options.pieces ? Math.round(Math.sqrt(options.pieces)) : 3, cells = rows, element = $(this), mode = options.mode, show = mode === "show", // Show and then visibility:hidden the element before calculating offset offset = element.show().css("visibility", "hidden").offset(), // Width and height of a piece width = Math.ceil(element.outerWidth() / cells), height = Math.ceil(element.outerHeight() / rows), pieces = []; // Children animate complete: function childComplete() { pieces.push(this); if (pieces.length === rows * cells) { animComplete(); } } // Clone the element for each row and cell. for (i = 0; i < rows; i++) { // ===> top = offset.top + i * height; my = i - (rows - 1) / 2; for (j = 0; j < cells; j++) { // ||| left = offset.left + j * width; mx = j - (cells - 1) / 2; // Create a clone of the now hidden main element that will be absolute positioned // within a wrapper div off the -left and -top equal to size of our pieces element .clone() .appendTo("body") .wrap("
") .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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Fade Effect //>>group: Effects //>>description: Fades the element. //>>docs: http://api.jqueryui.com/fade-effect/ //>>demos: http://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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Fold Effect //>>group: Effects //>>description: Folds an element first horizontally and then vertically. //>>docs: http://api.jqueryui.com/fold-effect/ //>>demos: http://jqueryui.com/effect/ var 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Highlight Effect //>>group: Effects //>>description: Highlights the background of an element in a defined color for a custom duration. //>>docs: http://api.jqueryui.com/highlight-effect/ //>>demos: http://jqueryui.com/effect/ var 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Size Effect //>>group: Effects //>>description: Resize an element to a specified width and height. //>>docs: http://api.jqueryui.com/size-effect/ //>>demos: http://jqueryui.com/effect/ var 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; } 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Scale Effect //>>group: Effects //>>description: Grows or shrinks an element and its content. //>>docs: http://api.jqueryui.com/scale-effect/ //>>demos: http://jqueryui.com/effect/ var 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://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: http://api.jqueryui.com/puff-effect/ //>>demos: http://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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Pulsate Effect //>>group: Effects //>>description: Pulsates an element n times by changing the opacity to zero and back. //>>docs: http://api.jqueryui.com/pulsate-effect/ //>>demos: http://jqueryui.com/effect/ var 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Shake Effect //>>group: Effects //>>description: Shakes an element horizontally or vertically n times. //>>docs: http://api.jqueryui.com/shake-effect/ //>>demos: http://jqueryui.com/effect/ var 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Slide Effect //>>group: Effects //>>description: Slides an element in and out of the viewport. //>>docs: http://api.jqueryui.com/slide-effect/ //>>demos: http://jqueryui.com/effect/ var 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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Transfer Effect //>>group: Effects //>>description: Displays a transfer effect from one element to another. //>>docs: http://api.jqueryui.com/transfer-effect/ //>>demos: http://jqueryui.com/effect/ var effect; if ($.uiBackCompat !== false) { effect = $.effects.define("transfer", function (options, done) { $(this).transfer(options, done); }); } var effectsEffectTransfer = effect; /*! * jQuery UI Focusable 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: :focusable Selector //>>group: Core //>>description: Selects elements which can be focused. //>>docs: http://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") && visible($(element)); }; // Support: IE 8 only // IE 8 doesn't resolve inherit to visible/hidden for computed values function visible(element) { var visibility = element.css("visibility"); while (visibility === "inherit") { element = element.parent(); visibility = element.css("visibility"); } return visibility !== "hidden"; } $.extend($.expr[":"], { focusable: function (element) { return $.ui.focusable(element, $.attr(element, "tabindex") != null); } }); var focusable = $.ui.focusable; // Support: IE8 Only // IE8 does not support the form attribute and when it is supplied. It overwrites the form prop // with a string, so we need to find the proper form. var form = $.fn.form = function () { return typeof this[0].form === "string" ? this.closest("form") : $(this[0].form); }; /*! * jQuery UI Form Reset Mixin 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Form Reset Mixin //>>group: Core //>>description: Refresh input widgets when their form is reset //>>docs: http://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.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 Support for jQuery core 1.7.x 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * */ //>>label: jQuery 1.7 Support //>>group: Core //>>description: Support version 1.7.x of jQuery core // Support: jQuery 1.7 only // Not a great way to check versions, but since we only support 1.7+ and only // need to detect <1.8, this is a simple check that should suffice. Checking // for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0 // and we'll never reach 1.70.0 (if we do, we certainly won't be supporting // 1.7 anymore). See #11197 for why we're not using feature detection. if ($.fn.jquery.substring(0, 3) === "1.7") { // Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight() // Unlike jQuery Core 1.8+, these only support numeric values to set the // dimensions in pixels $.each(["Width", "Height"], function (i, name) { var side = name === "Width" ? ["Left", "Right"] : ["Top", "Bottom"], type = name.toLowerCase(), orig = { innerWidth: $.fn.innerWidth, innerHeight: $.fn.innerHeight, outerWidth: $.fn.outerWidth, outerHeight: $.fn.outerHeight }; function reduce(elem, size, border, margin) { $.each(side, function () { size -= parseFloat($.css(elem, "padding" + this)) || 0; if (border) { size -= parseFloat($.css(elem, "border" + this + "Width")) || 0; } if (margin) { size -= parseFloat($.css(elem, "margin" + this)) || 0; } }); return size; } $.fn["inner" + name] = function (size) { if (size === undefined) { return orig["inner" + name].call(this); } return this.each(function () { $(this).css(type, reduce(this, size) + "px"); }); }; $.fn["outer" + name] = function (size, margin) { if (typeof size !== "number") { return orig["outer" + name].call(this, size); } return this.each(function () { $(this).css(type, reduce(this, size, true, margin) + "px"); }); }; }); $.fn.addBack = function (selector) { return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector) ); }; } ; /*! * jQuery UI Keycode 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Keycode //>>group: Core //>>description: Provide keycodes as keynames //>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ var keycode = $.ui.keyCode = { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 }; // Internal use only var escapeSelector = $.ui.escapeSelector = (function () { var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g; return function (selector) { return selector.replace(selectorEscape, "\\$1"); }; })(); /*! * jQuery UI Labels 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: labels //>>group: Core //>>description: Find all the labels associated with a given input //>>docs: http://api.jqueryui.com/labels/ var labels = $.fn.labels = function () { var ancestor, selector, id, labels, ancestors; // Check control.labels first if (this[0].labels && this[0].labels.length) { return this.pushStack(this[0].labels); } // Support: IE <= 11, FF <= 37, Android <= 2.3 only // Above browsers do not support control.labels. Everything below is to support them // as well as document fragments. control.labels does not work on document fragments 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='" + $.ui.escapeSelector(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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: scrollParent //>>group: Core //>>description: Get the closest ancestor element that is scrollable. //>>docs: http://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.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: :tabbable Selector //>>group: Core //>>description: Selects elements which can be tabbed to. //>>docs: http://api.jqueryui.com/tabbable-selector/ var tabbable = $.extend($.expr[":"], { tabbable: function (element) { var tabIndex = $.attr(element, "tabindex"), hasTabindex = tabIndex != null; return (!hasTabindex || tabIndex >= 0) && $.ui.focusable(element, hasTabindex); } }); /*! * jQuery UI Unique ID 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: uniqueId //>>group: Core //>>description: Functions to generate and remove uniqueId's //>>docs: http://api.jqueryui.com/uniqueId/ var uniqueId = $.fn.extend({ uniqueId: (function () { var uuid = 0; return function () { return this.each(function () { if (!this.id) { this.id = "ui-id-" + (++uuid); } }); }; })(), removeUniqueId: function () { return this.each(function () { if (/^ui-id-\d+$/.test(this.id)) { $(this).removeAttr("id"); } }); } }); /*! * jQuery UI Accordion 1.12.1 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Accordion //>>group: Widgets // jscs:disable maximumLineLength //>>description: Displays collapsible content panels for presenting information in a limited amount of space. // jscs:enable maximumLineLength //>>docs: http://api.jqueryui.com/accordion/ //>>demos: http://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.12.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: "> li > :first-child, > :not(li):even", 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); // Support: IE8 Only // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE // so we need to add the disabled class to the headers and panels this._toggleClass(null, "ui-state-disabled", !!value); this._toggleClass(this.headers.add(this.headers.next()), 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; 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"); // Work around for rendering bug in IE (#5421) if (toHide.length) { toHide.parent()[0].className = toHide.parent()[0].className; } this._trigger("activate", null, data); } }); var safeActiveElement = $.ui.safeActiveElement = function (document) { var activeElement; // Support: IE 9 only // IE9 throws an "Unspecified error" accessing document.activeElement from an