",
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();
}
});
};
}));