/*! jQuery UI - v1.11.4 - 2016-01-06 * http://jqueryui.com * Includes: core.js, widget.js, mouse.js, position.js, tabs.js, effect.js, effect-fade.js, effect-slide.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($) { /*! * jQuery UI Core 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/category/ui-core/ */ // $.ui might exist from components with no dependencies, e.g., $.ui.position $.ui = $.ui || {}; $.extend($.ui, { version: "1.11.4", 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 } }); // plugins $.fn.extend({ 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; }, 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"); } }); } }); // selectors function focusable(element, isTabIndexNotNaN) { var map, mapName, img, 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 + "']")[0]; return !!img && visible(img); } return (/^(input|select|textarea|button|object)$/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible visible(element); } function visible(element) { return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function() { return $.css(this, "visibility") === "hidden"; }).length; } $.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]); }, focusable: function(element) { return focusable(element, !isNaN($.attr(element, "tabindex"))); }, tabbable: function(element) { var tabIndex = $.attr(element, "tabindex"), isTabIndexNaN = isNaN(tabIndex); return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN); } }); // support: jQuery <1.8 if (!$("").outerWidth(1).jquery) { $.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"); }); }; }); } // support: jQuery <1.8 if (!$.fn.addBack) { $.fn.addBack = function(selector) { return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector) ); }; } // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) if ($("").data("a-b", "a").removeData("a-b").data("a-b")) { $.fn.removeData = (function(removeData) { return function(key) { if (arguments.length) { return removeData.call(this, $.camelCase(key)); } else { return removeData.call(this); } }; })($.fn.removeData); } // deprecated $.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()); $.fn.extend({ focus: (function(orig) { return function(delay, fn) { return typeof delay === "number" ? this.each(function() { var elem = this; setTimeout(function() { $(elem).focus(); if (fn) { fn.call(elem); } }, delay); }) : orig.apply(this, arguments); }; })($.fn.focus), disableSelection: (function() { var eventType = "onselectstart" in document.createElement("div") ? "selectstart" : "mousedown"; return function() { return this.bind(eventType + ".ui-disableSelection", function(event) { event.preventDefault(); }); }; })(), enableSelection: function() { return this.unbind(".ui-disableSelection"); }, zIndex: function(zIndex) { if (zIndex !== undefined) { return this.css("zIndex", zIndex); } if (this.length) { var elem = $(this[0]), position, value; while (elem.length && elem[0] !== document) { // Ignore z-index if position is set to a value where z-index is ignored by the browser // This makes behavior of this function consistent across browsers // WebKit always returns auto if the element is positioned position = elem.css("position"); if (position === "absolute" || position === "relative" || position === "fixed") { // IE returns 0 when zIndex is not specified // other browsers return a string // we ignore the case of nested elements with an explicit value of 0 //
value = parseInt(elem.css("zIndex"), 10); if (!isNaN(value) && value !== 0) { return value; } } elem = elem.parent(); } } return 0; } }); // $.ui.plugin is deprecated. Use $.widget() extensions instead. $.ui.plugin = { add: function(module, option, set) { var i, proto = $.ui[module].prototype; for (i in set) { proto.plugins[i] = proto.plugins[i] || []; proto.plugins[i].push([option, set[i]]); } }, call: function(instance, name, args, allowDisconnected) { var i, set = instance.plugins[name]; if (!set) { return; } if (!allowDisconnected && (!instance.element[0].parentNode || instance.element[0].parentNode.nodeType === 11)) { return; } for (i = 0; i < set.length; i++) { if (instance.options[set[i][0]]) { set[i][1].apply(instance.element, args); } } } }; /*! * jQuery UI Widget 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/jQuery.widget/ */ var widget_uuid = 0, widget_slice = 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 fullName, existingConstructor, constructor, basePrototype, // proxiedPrototype allows the provided prototype to remain unmodified // so that it can be used as a mixin for multiple widgets (#8876) proxiedPrototype = {}, namespace = name.split(".")[0]; name = name.split(".")[1]; fullName = namespace + "-" + name; if (!prototype) { prototype = base; base = $.Widget; } // 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() { var _super = function() { return base.prototype[prop].apply(this, arguments); }, _superApply = function(args) { return base.prototype[prop].apply(this, args); }; return function() { var __super = this._super, __superApply = this._superApply, 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 = widget_slice.call(arguments, 1), inputIndex = 0, inputLength = input.length, key, 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", args = widget_slice.call(arguments, 1), returnValue = this; if (isMethodCall) { this.each(function() { var methodValue, 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: { disabled: false, // callbacks create: null }, _createWidget: function(options, element) { element = $(element || this.defaultElement || this)[0]; this.element = $(element); this.uuid = widget_uuid++; this.eventNamespace = "." + this.widgetName + this.uuid; this.bindings = $(); this.hoverable = $(); this.focusable = $(); 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(); this._trigger("create", null, this._getCreateEventData()); this._init(); }, _getCreateOptions: $.noop, _getCreateEventData: $.noop, _create: $.noop, _init: $.noop, destroy: function() { this._destroy(); // we can probably remove the unbind calls in 2.0 // all event bindings should go through this._on() this.element .unbind(this.eventNamespace) .removeData(this.widgetFullName) // support: jquery <1.6.3 // http://bugs.jquery.com/ticket/9413 .removeData($.camelCase(this.widgetFullName)); this.widget() .unbind(this.eventNamespace) .removeAttr("aria-disabled") .removeClass( this.widgetFullName + "-disabled " + "ui-state-disabled"); // clean up events and states this.bindings.unbind(this.eventNamespace); this.hoverable.removeClass("ui-state-hover"); this.focusable.removeClass("ui-state-focus"); }, _destroy: $.noop, widget: function() { return this.element; }, option: function(key, value) { var options = key, parts, curOption, 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) { this.options[key] = value; if (key === "disabled") { this.widget() .toggleClass(this.widgetFullName + "-disabled", !!value); // If the widget is becoming disabled, then nothing is interactive if (value) { this.hoverable.removeClass("ui-state-hover"); this.focusable.removeClass("ui-state-focus"); } } return this; }, enable: function() { return this._setOptions({ disabled: false }); }, disable: function() { return this._setOptions({ disabled: true }); }, _on: function(suppressDisabledCheck, element, handlers) { var delegateElement, 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*(.*)$/), eventName = match[1] + instance.eventNamespace, selector = match[2]; if (selector) { delegateElement.delegate(selector, eventName, handlerProxy); } else { element.bind(eventName, handlerProxy); } }); }, _off: function(element, eventName) { eventName = (eventName || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace; element.unbind(eventName).undelegate(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) { $(event.currentTarget).addClass("ui-state-hover"); }, mouseleave: function(event) { $(event.currentTarget).removeClass("ui-state-hover"); } }); }, _focusable: function(element) { this.focusable = this.focusable.add(element); this._on(element, { focusin: function(event) { $(event.currentTarget).addClass("ui-state-focus"); }, focusout: function(event) { $(event.currentTarget).removeClass("ui-state-focus"); } }); }, _trigger: function(type, event, data) { var prop, orig, 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, 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 Mouse 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/mouse/ */ var mouseHandled = false; $(document).mouseup(function() { mouseHandled = false; }); var mouse = $.widget("ui.mouse", { version: "1.11.4", options: { cancel: "input,textarea,button,select,option", distance: 1, delay: 0 }, _mouseInit: function() { var that = this; this.element .bind("mousedown." + this.widgetName, function(event) { return that._mouseDown(event); }) .bind("click." + this.widgetName, function(event) { if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { $.removeData(event.target, that.widgetName + ".preventClickEvent"); event.stopImmediatePropagation(); return false; } }); this.started = false; }, // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse _mouseDestroy: function() { this.element.unbind("." + this.widgetName); if (this._mouseMoveDelegate) { this.document .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); } }, _mouseDown: function(event) { // don't let more than one widget handle mouseStart if (mouseHandled) { return; } this._mouseMoved = false; // we may have missed mouseup (out of window) (this._mouseStarted && this._mouseUp(event)); this._mouseDownEvent = event; var that = this, btnIsLeft = (event.which === 1), // event.target.nodeName works around a bug in IE 8 with // disabled inputs (#7620) elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { return true; } this.mouseDelayMet = !this.options.delay; if (!this.mouseDelayMet) { this._mouseDelayTimer = setTimeout(function() { that.mouseDelayMet = true; }, this.options.delay); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(event) !== false); if (!this._mouseStarted) { event.preventDefault(); return true; } } // Click event may never have fired (Gecko & Opera) if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { $.removeData(event.target, this.widgetName + ".preventClickEvent"); } // these delegates are required to keep context this._mouseMoveDelegate = function(event) { return that._mouseMove(event); }; this._mouseUpDelegate = function(event) { return that._mouseUp(event); }; this.document .bind("mousemove." + this.widgetName, this._mouseMoveDelegate) .bind("mouseup." + this.widgetName, this._mouseUpDelegate); event.preventDefault(); mouseHandled = true; return true; }, _mouseMove: function(event) { // Only check for mouseups outside the document if you've moved inside the document // at least once. This prevents the firing of mouseup in the case of IE<9, which will // fire a mousemove event if content is placed under the cursor. See #7778 // Support: IE <9 if (this._mouseMoved) { // IE mouseup check - mouseup happened when mouse was out of window if ($.ui.ie && (!document.documentMode || document.documentMode < 9) && !event.button) { return this._mouseUp(event); // Iframe mouseup check - mouseup occurred in another document } else if (!event.which) { return this._mouseUp(event); } } if (event.which || event.button) { this._mouseMoved = true; } if (this._mouseStarted) { this._mouseDrag(event); return event.preventDefault(); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(this._mouseDownEvent, event) !== false); (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); } return !this._mouseStarted; }, _mouseUp: function(event) { this.document .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); if (this._mouseStarted) { this._mouseStarted = false; if (event.target === this._mouseDownEvent.target) { $.data(event.target, this.widgetName + ".preventClickEvent", true); } this._mouseStop(event); } mouseHandled = false; return false; }, _mouseDistanceMet: function(event) { return (Math.max( Math.abs(this._mouseDownEvent.pageX - event.pageX), Math.abs(this._mouseDownEvent.pageY - event.pageY) ) >= this.options.distance); }, _mouseDelayMet: function( /* event */ ) { return this.mouseDelayMet; }, // These are placeholder methods, to be overriden by extending plugin _mouseStart: function( /* event */ ) {}, _mouseDrag: function( /* event */ ) {}, _mouseStop: function( /* event */ ) {}, _mouseCapture: function( /* event */ ) { return true; } }); /*! * jQuery UI Position 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/position/ */ (function() { $.ui = $.ui || {}; var cachedScrollbarWidth, supportsOffsetFractions, max = Math.max, abs = Math.abs, round = Math.round, 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; return { element: withinElement, isWindow: isWindow, isDocument: isDocument, offset: withinElement.offset() || { left: 0, top: 0 }, scrollLeft: withinElement.scrollLeft(), scrollTop: withinElement.scrollTop(), // support: jQuery 1.6.x // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), height: isWindow || isDocument ? withinElement.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]; // if the browser doesn't support fractions, then round for consistent results if (!supportsOffsetFractions) { position.left = round(position.left); position.top = round(position.top); } 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); } } }; // fraction support test (function() { var testElement, testElementParent, testElementStyle, offsetLeft, i, body = document.getElementsByTagName("body")[0], div = document.createElement("div"); //Create a "fake body" for testing based on method used in jQuery.support testElement = document.createElement(body ? "div" : "body"); testElementStyle = { visibility: "hidden", width: 0, height: 0, border: 0, margin: 0, background: "none" }; if (body) { $.extend(testElementStyle, { position: "absolute", left: "-1000px", top: "-1000px" }); } for (i in testElementStyle) { testElement.style[i] = testElementStyle[i]; } testElement.appendChild(div); testElementParent = body || document.documentElement; testElementParent.insertBefore(testElement, testElementParent.firstChild); div.style.cssText = "position: absolute; left: 10.7432222px;"; offsetLeft = $(div).offset().left; supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; testElement.innerHTML = ""; testElementParent.removeChild(testElement); })(); })(); var position = $.ui.position; /*! * jQuery UI Tabs 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/tabs/ */ var tabs = $.widget("ui.tabs", { version: "1.11.4", delay: 300, options: { active: null, collapsible: false, event: "click", heightStyle: "content", hide: null, show: null, // callbacks activate: null, beforeActivate: null, beforeLoad: null, load: null }, _isLocal: (function() { var rhash = /\?.*|#.*$/; return function(anchor) { var anchorUrl, locationUrl; // support: IE7 // IE7 doesn't normalize the href property when set via script (#9317) anchor = anchor.cloneNode(false); anchorUrl = anchor.href.replace(rhash, ""); locationUrl = location.href.replace(rhash, ""); // decoding may throw an error if the URL isn't UTF-8 (#9518) try { anchorUrl = decodeURIComponent(anchorUrl); } catch (error) {} try { locationUrl = decodeURIComponent(locationUrl); } catch (error) {} return anchor.hash.length > 1 && anchorUrl === locationUrl; }; })(), _create: function() { var that = this, options = this.options; this.running = false; this.element .addClass("ui-tabs ui-widget ui-widget-content ui-corner-all") .toggleClass("ui-tabs-collapsible", options.collapsible); this._processTabs(); options.active = this._initialActive(); // Take disabling tabs via class attribute from HTML // into account and update option properly. if ($.isArray(options.disabled)) { options.disabled = $.unique(options.disabled.concat( $.map(this.tabs.filter(".ui-state-disabled"), function(li) { return that.tabs.index(li); }) )).sort(); } // check for length avoids error when initializing empty list if (this.options.active !== false && this.anchors.length) { this.active = this._findActive(options.active); } else { this.active = $(); } this._refresh(); if (this.active.length) { this.load(options.active); } }, _initialActive: function() { var active = this.options.active, collapsible = this.options.collapsible, locationHash = location.hash.substring(1); if (active === null) { // check the fragment identifier in the URL if (locationHash) { this.tabs.each(function(i, tab) { if ($(tab).attr("aria-controls") === locationHash) { active = i; return false; } }); } // check for a tab marked active via a class if (active === null) { active = this.tabs.index(this.tabs.filter(".ui-tabs-active")); } // no active tab, set to false if (active === null || active === -1) { active = this.tabs.length ? 0 : false; } } // handle numbers: negative, out of range if (active !== false) { active = this.tabs.index(this.tabs.eq(active)); if (active === -1) { active = collapsible ? false : 0; } } // don't allow collapsible: false and active: false if (!collapsible && active === false && this.anchors.length) { active = 0; } return active; }, _getCreateEventData: function() { return { tab: this.active, panel: !this.active.length ? $() : this._getPanelForTab(this.active) }; }, _tabKeydown: function(event) { var focusedTab = $(this.document[0].activeElement).closest("li"), selectedIndex = this.tabs.index(focusedTab), goingForward = true; if (this._handlePageNav(event)) { return; } switch (event.keyCode) { case $.ui.keyCode.RIGHT: case $.ui.keyCode.DOWN: selectedIndex++; break; case $.ui.keyCode.UP: case $.ui.keyCode.LEFT: goingForward = false; selectedIndex--; break; case $.ui.keyCode.END: selectedIndex = this.anchors.length - 1; break; case $.ui.keyCode.HOME: selectedIndex = 0; break; case $.ui.keyCode.SPACE: // Activate only, no collapsing event.preventDefault(); clearTimeout(this.activating); this._activate(selectedIndex); return; case $.ui.keyCode.ENTER: // Toggle (cancel delayed activation, allow collapsing) event.preventDefault(); clearTimeout(this.activating); // Determine if we should collapse or activate this._activate(selectedIndex === this.options.active ? false : selectedIndex); return; default: return; } // Focus the appropriate tab, based on which key was pressed event.preventDefault(); clearTimeout(this.activating); selectedIndex = this._focusNextTab(selectedIndex, goingForward); // Navigating with control/command key will prevent automatic activation if (!event.ctrlKey && !event.metaKey) { // Update aria-selected immediately so that AT think the tab is already selected. // Otherwise AT may confuse the user by stating that they need to activate the tab, // but the tab will already be activated by the time the announcement finishes. focusedTab.attr("aria-selected", "false"); this.tabs.eq(selectedIndex).attr("aria-selected", "true"); this.activating = this._delay(function() { this.option("active", selectedIndex); }, this.delay); } }, _panelKeydown: function(event) { if (this._handlePageNav(event)) { return; } // Ctrl+up moves focus to the current tab if (event.ctrlKey && event.keyCode === $.ui.keyCode.UP) { event.preventDefault(); this.active.focus(); } }, // Alt+page up/down moves focus to the previous/next tab (and activates) _handlePageNav: function(event) { if (event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP) { this._activate(this._focusNextTab(this.options.active - 1, false)); return true; } if (event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN) { this._activate(this._focusNextTab(this.options.active + 1, true)); return true; } }, _findNextTab: function(index, goingForward) { var lastTabIndex = this.tabs.length - 1; function constrain() { if (index > lastTabIndex) { index = 0; } if (index < 0) { index = lastTabIndex; } return index; } while ($.inArray(constrain(), this.options.disabled) !== -1) { index = goingForward ? index + 1 : index - 1; } return index; }, _focusNextTab: function(index, goingForward) { index = this._findNextTab(index, goingForward); this.tabs.eq(index).focus(); return index; }, _setOption: function(key, value) { if (key === "active") { // _activate() will handle invalid values and update this.options this._activate(value); return; } if (key === "disabled") { // don't use the widget factory's disabled handling this._setupDisabled(value); return; } this._super(key, value); if (key === "collapsible") { this.element.toggleClass("ui-tabs-collapsible", value); // Setting collapsible: false while collapsed; open first panel if (!value && this.options.active === false) { this._activate(0); } } if (key === "event") { this._setupEvents(value); } if (key === "heightStyle") { this._setupHeightStyle(value); } }, _sanitizeSelector: function(hash) { return hash ? hash.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&") : ""; }, refresh: function() { var options = this.options, lis = this.tablist.children(":has(a[href])"); // get disabled tabs from class attribute from HTML // this will get converted to a boolean if needed in _refresh() options.disabled = $.map(lis.filter(".ui-state-disabled"), function(tab) { return lis.index(tab); }); this._processTabs(); // was collapsed or no tabs if (options.active === false || !this.anchors.length) { options.active = false; this.active = $(); // was active, but active tab is gone } else if (this.active.length && !$.contains(this.tablist[0], this.active[0])) { // all remaining tabs are disabled if (this.tabs.length === options.disabled.length) { options.active = false; this.active = $(); // activate previous tab } else { this._activate(this._findNextTab(Math.max(0, options.active - 1), false)); } // was active, active tab still exists } else { // make sure active index is correct options.active = this.tabs.index(this.active); } this._refresh(); }, _refresh: function() { this._setupDisabled(this.options.disabled); this._setupEvents(this.options.event); this._setupHeightStyle(this.options.heightStyle); this.tabs.not(this.active).attr({ "aria-selected": "false", "aria-expanded": "false", tabIndex: -1 }); this.panels.not(this._getPanelForTab(this.active)) .hide() .attr({ "aria-hidden": "true" }); // Make sure one tab is in the tab order if (!this.active.length) { this.tabs.eq(0).attr("tabIndex", 0); } else { this.active .addClass("ui-tabs-active ui-state-active") .attr({ "aria-selected": "true", "aria-expanded": "true", tabIndex: 0 }); this._getPanelForTab(this.active) .show() .attr({ "aria-hidden": "false" }); } }, _processTabs: function() { var that = this, prevTabs = this.tabs, prevAnchors = this.anchors, prevPanels = this.panels; this.tablist = this._getList() .addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all") .attr("role", "tablist") // Prevent users from focusing disabled tabs via click .delegate("> li", "mousedown" + this.eventNamespace, function(event) { if ($(this).is(".ui-state-disabled")) { event.preventDefault(); } }) // support: IE <9 // Preventing the default action in mousedown doesn't prevent IE // from focusing the element, so if the anchor gets focused, blur. // We don't have to worry about focusing the previously focused // element since clicking on a non-focusable element should focus // the body anyway. .delegate(".ui-tabs-anchor", "focus" + this.eventNamespace, function() { if ($(this).closest("li").is(".ui-state-disabled")) { this.blur(); } }); this.tabs = this.tablist.find("> li:has(a[href])") .addClass("ui-state-default ui-corner-top") .attr({ role: "tab", tabIndex: -1 }); this.anchors = this.tabs.map(function() { return $("a", this)[0]; }) .addClass("ui-tabs-anchor") .attr({ role: "presentation", tabIndex: -1 }); this.panels = $(); this.anchors.each(function(i, anchor) { var selector, panel, panelId, anchorId = $(anchor).uniqueId().attr("id"), tab = $(anchor).closest("li"), originalAriaControls = tab.attr("aria-controls"); // inline tab if (that._isLocal(anchor)) { selector = anchor.hash; panelId = selector.substring(1); panel = that.element.find(that._sanitizeSelector(selector)); // remote tab } else { // If the tab doesn't already have aria-controls, // generate an id by using a throw-away element panelId = tab.attr("aria-controls") || $({}).uniqueId()[0].id; selector = "#" + panelId; panel = that.element.find(selector); if (!panel.length) { panel = that._createPanel(panelId); panel.insertAfter(that.panels[i - 1] || that.tablist); } panel.attr("aria-live", "polite"); } if (panel.length) { that.panels = that.panels.add(panel); } if (originalAriaControls) { tab.data("ui-tabs-aria-controls", originalAriaControls); } tab.attr({ "aria-controls": panelId, "aria-labelledby": anchorId }); panel.attr("aria-labelledby", anchorId); }); this.panels .addClass("ui-tabs-panel ui-widget-content ui-corner-bottom") .attr("role", "tabpanel"); // Avoid memory leaks (#10056) if (prevTabs) { this._off(prevTabs.not(this.tabs)); this._off(prevAnchors.not(this.anchors)); this._off(prevPanels.not(this.panels)); } }, // allow overriding how to find the list for rare usage scenarios (#7715) _getList: function() { return this.tablist || this.element.find("ol,ul").eq(0); }, _createPanel: function(id) { return $("
") .attr("id", id) .addClass("ui-tabs-panel ui-widget-content ui-corner-bottom") .data("ui-tabs-destroy", true); }, _setupDisabled: function(disabled) { if ($.isArray(disabled)) { if (!disabled.length) { disabled = false; } else if (disabled.length === this.anchors.length) { disabled = true; } } // disable tabs for (var i = 0, li; (li = this.tabs[i]); i++) { if (disabled === true || $.inArray(i, disabled) !== -1) { $(li) .addClass("ui-state-disabled") .attr("aria-disabled", "true"); } else { $(li) .removeClass("ui-state-disabled") .removeAttr("aria-disabled"); } } this.options.disabled = disabled; }, _setupEvents: function(event) { var events = {}; if (event) { $.each(event.split(" "), function(index, eventName) { events[eventName] = "_eventHandler"; }); } this._off(this.anchors.add(this.tabs).add(this.panels)); // Always prevent the default action, even when disabled this._on(true, this.anchors, { click: function(event) { event.preventDefault(); } }); this._on(this.anchors, events); this._on(this.tabs, { keydown: "_tabKeydown" }); this._on(this.panels, { keydown: "_panelKeydown" }); this._focusable(this.tabs); this._hoverable(this.tabs); }, _setupHeightStyle: function(heightStyle) { var maxHeight, parent = this.element.parent(); if (heightStyle === "fill") { maxHeight = parent.height(); maxHeight -= this.element.outerHeight() - this.element.height(); this.element.siblings(":visible").each(function() { var elem = $(this), position = elem.css("position"); if (position === "absolute" || position === "fixed") { return; } maxHeight -= elem.outerHeight(true); }); this.element.children().not(this.panels).each(function() { maxHeight -= $(this).outerHeight(true); }); this.panels.each(function() { $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height())); }) .css("overflow", "auto"); } else if (heightStyle === "auto") { maxHeight = 0; this.panels.each(function() { maxHeight = Math.max(maxHeight, $(this).height("").height()); }).height(maxHeight); } }, _eventHandler: function(event) { var options = this.options, active = this.active, anchor = $(event.currentTarget), tab = anchor.closest("li"), clickedIsActive = tab[0] === active[0], collapsing = clickedIsActive && options.collapsible, toShow = collapsing ? $() : this._getPanelForTab(tab), toHide = !active.length ? $() : this._getPanelForTab(active), eventData = { oldTab: active, oldPanel: toHide, newTab: collapsing ? $() : tab, newPanel: toShow }; event.preventDefault(); if (tab.hasClass("ui-state-disabled") || // tab is already loading tab.hasClass("ui-tabs-loading") || // can't switch durning an animation this.running || // click on active header, but not collapsible (clickedIsActive && !options.collapsible) || // allow canceling activation (this._trigger("beforeActivate", event, eventData) === false)) { return; } options.active = collapsing ? false : this.tabs.index(tab); this.active = clickedIsActive ? $() : tab; if (this.xhr) { this.xhr.abort(); } if (!toHide.length && !toShow.length) { $.error("jQuery UI Tabs: Mismatching fragment identifier."); } if (toShow.length) { this.load(this.tabs.index(tab), event); } this._toggle(event, eventData); }, // handles show/hide for selecting tabs _toggle: function(event, eventData) { var that = this, toShow = eventData.newPanel, toHide = eventData.oldPanel; this.running = true; function complete() { that.running = false; that._trigger("activate", event, eventData); } function show() { eventData.newTab.closest("li").addClass("ui-tabs-active ui-state-active"); if (toShow.length && that.options.show) { that._show(toShow, that.options.show, complete); } else { toShow.show(); complete(); } } // start out by hiding, then showing, then completing if (toHide.length && this.options.hide) { this._hide(toHide, this.options.hide, function() { eventData.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"); show(); }); } else { eventData.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"); toHide.hide(); show(); } toHide.attr("aria-hidden", "true"); eventData.oldTab.attr({ "aria-selected": "false", "aria-expanded": "false" }); // If we're switching tabs, remove the old tab from the tab order. // If we're opening from collapsed state, remove the previous tab from the tab order. // If we're collapsing, then keep the collapsing tab in the tab order. if (toShow.length && toHide.length) { eventData.oldTab.attr("tabIndex", -1); } else if (toShow.length) { this.tabs.filter(function() { return $(this).attr("tabIndex") === 0; }) .attr("tabIndex", -1); } toShow.attr("aria-hidden", "false"); eventData.newTab.attr({ "aria-selected": "true", "aria-expanded": "true", tabIndex: 0 }); }, _activate: function(index) { var anchor, active = this._findActive(index); // trying to activate the already active panel if (active[0] === this.active[0]) { return; } // trying to collapse, simulate a click on the current active header if (!active.length) { active = this.active; } anchor = active.find(".ui-tabs-anchor")[0]; this._eventHandler({ target: anchor, currentTarget: anchor, preventDefault: $.noop }); }, _findActive: function(index) { return index === false ? $() : this.tabs.eq(index); }, _getIndex: function(index) { // meta-function to give users option to provide a href string instead of a numerical index. if (typeof index === "string") { index = this.anchors.index(this.anchors.filter("[href$='" + index + "']")); } return index; }, _destroy: function() { if (this.xhr) { this.xhr.abort(); } this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"); this.tablist .removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all") .removeAttr("role"); this.anchors .removeClass("ui-tabs-anchor") .removeAttr("role") .removeAttr("tabIndex") .removeUniqueId(); this.tablist.unbind(this.eventNamespace); this.tabs.add(this.panels).each(function() { if ($.data(this, "ui-tabs-destroy")) { $(this).remove(); } else { $(this) .removeClass("ui-state-default ui-state-active ui-state-disabled " + "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel") .removeAttr("tabIndex") .removeAttr("aria-live") .removeAttr("aria-busy") .removeAttr("aria-selected") .removeAttr("aria-labelledby") .removeAttr("aria-hidden") .removeAttr("aria-expanded") .removeAttr("role"); } }); this.tabs.each(function() { var li = $(this), prev = li.data("ui-tabs-aria-controls"); if (prev) { li .attr("aria-controls", prev) .removeData("ui-tabs-aria-controls"); } else { li.removeAttr("aria-controls"); } }); this.panels.show(); if (this.options.heightStyle !== "content") { this.panels.css("height", ""); } }, enable: function(index) { var disabled = this.options.disabled; if (disabled === false) { return; } if (index === undefined) { disabled = false; } else { index = this._getIndex(index); if ($.isArray(disabled)) { disabled = $.map(disabled, function(num) { return num !== index ? num : null; }); } else { disabled = $.map(this.tabs, function(li, num) { return num !== index ? num : null; }); } } this._setupDisabled(disabled); }, disable: function(index) { var disabled = this.options.disabled; if (disabled === true) { return; } if (index === undefined) { disabled = true; } else { index = this._getIndex(index); if ($.inArray(index, disabled) !== -1) { return; } if ($.isArray(disabled)) { disabled = $.merge([index], disabled).sort(); } else { disabled = [index]; } } this._setupDisabled(disabled); }, load: function(index, event) { index = this._getIndex(index); var that = this, tab = this.tabs.eq(index), anchor = tab.find(".ui-tabs-anchor"), panel = this._getPanelForTab(tab), eventData = { tab: tab, panel: panel }, complete = function(jqXHR, status) { if (status === "abort") { that.panels.stop(false, true); } tab.removeClass("ui-tabs-loading"); panel.removeAttr("aria-busy"); if (jqXHR === that.xhr) { delete that.xhr; } }; // not remote if (this._isLocal(anchor[0])) { return; } this.xhr = $.ajax(this._ajaxSettings(anchor, event, eventData)); // support: jQuery <1.8 // jQuery <1.8 returns false if the request is canceled in beforeSend, // but as of 1.8, $.ajax() always returns a jqXHR object. if (this.xhr && this.xhr.statusText !== "canceled") { tab.addClass("ui-tabs-loading"); panel.attr("aria-busy", "true"); this.xhr .done(function(response, status, jqXHR) { // support: jQuery <1.8 // http://bugs.jquery.com/ticket/11778 setTimeout(function() { panel.html(response); that._trigger("load", event, eventData); complete(jqXHR, status); }, 1); }) .fail(function(jqXHR, status) { // support: jQuery <1.8 // http://bugs.jquery.com/ticket/11778 setTimeout(function() { complete(jqXHR, status); }, 1); }); } }, _ajaxSettings: function(anchor, event, eventData) { var that = this; return { url: anchor.attr("href"), beforeSend: function(jqXHR, settings) { return that._trigger("beforeLoad", event, $.extend({ jqXHR: jqXHR, ajaxSettings: settings }, eventData)); } }; }, _getPanelForTab: function(tab) { var id = $(tab).attr("aria-controls"); return this.element.find(this._sanitizeSelector("#" + id)); } }); /*! * jQuery UI Effects 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/category/effects-core/ */ var dataSpace = "ui-effects-", // 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() { $.extend($.effects, { version: "1.11.4", // Saves a set of properties in a data storage save: function(element, set) { for (var i = 0; i < set.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; for (i = 0; i < set.length; i++) { if (set[i] !== null) { val = element.data(dataSpace + set[i]); // support: jQuery 1.6.2 // http://bugs.jquery.com/ticket/9917 // jQuery 1.6.2 incorrectly returns undefined for any falsy value. // We can't differentiate between "" and 0 here, so we just assume // empty string since it's likely to be a more common value... if (val === undefined) { val = ""; } element.css(set[i], val); } } }, setMode: function(el, mode) { if (mode === "toggle") { mode = el.is(":hidden") ? "show" : "hide"; } return mode; }, // Translates a [top,left] array into a baseline value // this should be a little more flexible in the future to handle a string & hash 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 }; }, // 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).focus(); } wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element // 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).focus(); } } return 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), mode = args.mode, queue = args.queue, effectMethod = $.effects.effect[args.effect]; if ($.fx.off || !effectMethod) { // delegate to the original method (e.g., .show()) if possible if (mode) { return this[mode](args.duration, args.complete); } else { return this.each(function() { if (args.complete) { args.complete.call(this); } }); } } function run(next) { var elem = $(this), complete = args.complete, mode = args.mode; function done() { if ($.isFunction(complete)) { complete.call(elem[0]); } if ($.isFunction(next)) { next(); } } // If the element already has the correct final state, delegate to // the core methods so the internal tracking of "olddisplay" works. if (elem.is(":hidden") ? mode === "hide" : mode === "show") { elem[mode](); done(); } else { effectMethod.call(elem[0], args, done); } } return queue === false ? this.each(run) : this.queue(queue || "fx", 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), // helper functions 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; } }); })(); /******************************************************************************/ /*********************************** 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 Fade 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/fade-effect/ */ var effectFade = $.effects.effect.fade = function(o, done) { var el = $(this), mode = $.effects.setMode(el, o.mode || "toggle"); el.animate({ opacity: mode }, { queue: false, duration: o.duration, easing: o.easing, complete: done }); }; /*! * jQuery UI Effects Slide 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/slide-effect/ */ var effectSlide = $.effects.effect.slide = function(o, done) { // Create element var el = $(this), props = ["position", "top", "bottom", "left", "right", "width", "height"], mode = $.effects.setMode(el, o.mode || "show"), show = mode === "show", direction = o.direction || "left", ref = (direction === "up" || direction === "down") ? "top" : "left", positiveMotion = (direction === "up" || direction === "left"), distance, animation = {}; // Adjust $.effects.save(el, props); el.show(); distance = o.distance || el[ref === "top" ? "outerHeight" : "outerWidth"](true); $.effects.createWrapper(el).css({ overflow: "hidden" }); if (show) { el.css(ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance); } // Animation animation[ref] = (show ? (positiveMotion ? "+=" : "-=") : (positiveMotion ? "-=" : "+=")) + distance; // Animate el.animate(animation, { queue: false, duration: o.duration, easing: o.easing, complete: function() { if (mode === "hide") { el.hide(); } $.effects.restore(el, props); $.effects.removeWrapper(el); done(); } }); }; }));