/*! 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: '
')[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