/* |
/* |
* jQuery UI Effects @VERSION |
* jQuery UI Effects @VERSION |
* |
* |
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) |
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) |
* Dual licensed under the MIT or GPL Version 2 licenses. |
* Dual licensed under the MIT or GPL Version 2 licenses. |
* http://jquery.org/license |
* http://jquery.org/license |
* |
* |
* http://docs.jquery.com/UI/Effects/ |
* http://docs.jquery.com/UI/Effects/ |
*/ |
*/ |
;jQuery.effects || (function($, undefined) { |
;jQuery.effects || (function($, undefined) { |
|
|
$.effects = {}; |
$.effects = {}; |
|
|
|
|
|
|
/******************************************************************************/ |
/******************************************************************************/ |
/****************************** COLOR ANIMATIONS ******************************/ |
/****************************** COLOR ANIMATIONS ******************************/ |
/******************************************************************************/ |
/******************************************************************************/ |
|
|
// override the animation for color styles |
// override the animation for color styles |
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', |
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', |
'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'], |
'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'], |
function(i, attr) { |
function(i, attr) { |
$.fx.step[attr] = function(fx) { |
$.fx.step[attr] = function(fx) { |
if (!fx.colorInit) { |
if (!fx.colorInit) { |
fx.start = getColor(fx.elem, attr); |
fx.start = getColor(fx.elem, attr); |
fx.end = getRGB(fx.end); |
fx.end = getRGB(fx.end); |
fx.colorInit = true; |
fx.colorInit = true; |
} |
} |
|
|
fx.elem.style[attr] = 'rgb(' + |
fx.elem.style[attr] = 'rgb(' + |
Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' + |
Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' + |
Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' + |
Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' + |
Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')'; |
Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')'; |
}; |
}; |
}); |
}); |
|
|
// Color Conversion functions from highlightFade |
// Color Conversion functions from highlightFade |
// By Blair Mitchelmore |
// By Blair Mitchelmore |
// http://jquery.offput.ca/highlightFade/ |
// http://jquery.offput.ca/highlightFade/ |
|
|
// Parse strings looking for color tuples [255,255,255] |
// Parse strings looking for color tuples [255,255,255] |
function getRGB(color) { |
function getRGB(color) { |
var result; |
var result; |
|
|
// Check if we're already dealing with an array of colors |
// Check if we're already dealing with an array of colors |
if ( color && color.constructor == Array && color.length == 3 ) |
if ( color && color.constructor == Array && color.length == 3 ) |
return color; |
return color; |
|
|
// Look for rgb(num,num,num) |
// Look for rgb(num,num,num) |
if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) |
if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) |
return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; |
return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; |
|
|
// Look for rgb(num%,num%,num%) |
// Look for rgb(num%,num%,num%) |
if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) |
if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) |
return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; |
return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; |
|
|
// Look for #a0b1c2 |
// Look for #a0b1c2 |
if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) |
if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) |
return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; |
return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; |
|
|
// Look for #fff |
// Look for #fff |
if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) |
if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) |
return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; |
return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; |
|
|
// Look for rgba(0, 0, 0, 0) == transparent in Safari 3 |
// Look for rgba(0, 0, 0, 0) == transparent in Safari 3 |
if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) |
if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) |
return colors['transparent']; |
return colors['transparent']; |
|
|
// Otherwise, we're most likely dealing with a named color |
// Otherwise, we're most likely dealing with a named color |
return colors[$.trim(color).toLowerCase()]; |
return colors[$.trim(color).toLowerCase()]; |
} |
} |
|
|
function getColor(elem, attr) { |
function getColor(elem, attr) { |
var color; |
var color; |
|
|
do { |
do { |
color = $.curCSS(elem, attr); |
color = $.curCSS(elem, attr); |
|
|
// Keep going until we find an element that has color, or we hit the body |
// Keep going until we find an element that has color, or we hit the body |
if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) |
if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) |
break; |
break; |
|
|
attr = "backgroundColor"; |
attr = "backgroundColor"; |
} while ( elem = elem.parentNode ); |
} while ( elem = elem.parentNode ); |
|
|
return getRGB(color); |
return getRGB(color); |
}; |
}; |
|
|
// Some named colors to work with |
// Some named colors to work with |
// From Interface by Stefan Petre |
// From Interface by Stefan Petre |
// http://interface.eyecon.ro/ |
// http://interface.eyecon.ro/ |
|
|
var colors = { |
var colors = { |
aqua:[0,255,255], |
aqua:[0,255,255], |
azure:[240,255,255], |
azure:[240,255,255], |
beige:[245,245,220], |
beige:[245,245,220], |
black:[0,0,0], |
black:[0,0,0], |
blue:[0,0,255], |
blue:[0,0,255], |
brown:[165,42,42], |
brown:[165,42,42], |
cyan:[0,255,255], |
cyan:[0,255,255], |
darkblue:[0,0,139], |
darkblue:[0,0,139], |
darkcyan:[0,139,139], |
darkcyan:[0,139,139], |
darkgrey:[169,169,169], |
darkgrey:[169,169,169], |
darkgreen:[0,100,0], |
darkgreen:[0,100,0], |
darkkhaki:[189,183,107], |
darkkhaki:[189,183,107], |
darkmagenta:[139,0,139], |
darkmagenta:[139,0,139], |
darkolivegreen:[85,107,47], |
darkolivegreen:[85,107,47], |
darkorange:[255,140,0], |
darkorange:[255,140,0], |
darkorchid:[153,50,204], |
darkorchid:[153,50,204], |
darkred:[139,0,0], |
darkred:[139,0,0], |
darksalmon:[233,150,122], |
darksalmon:[233,150,122], |
darkviolet:[148,0,211], |
darkviolet:[148,0,211], |
fuchsia:[255,0,255], |
fuchsia:[255,0,255], |
gold:[255,215,0], |
gold:[255,215,0], |
green:[0,128,0], |
green:[0,128,0], |
indigo:[75,0,130], |
indigo:[75,0,130], |
khaki:[240,230,140], |
khaki:[240,230,140], |
lightblue:[173,216,230], |
lightblue:[173,216,230], |
lightcyan:[224,255,255], |
lightcyan:[224,255,255], |
lightgreen:[144,238,144], |
lightgreen:[144,238,144], |
lightgrey:[211,211,211], |
lightgrey:[211,211,211], |
lightpink:[255,182,193], |
lightpink:[255,182,193], |
lightyellow:[255,255,224], |
lightyellow:[255,255,224], |
lime:[0,255,0], |
lime:[0,255,0], |
magenta:[255,0,255], |
magenta:[255,0,255], |
maroon:[128,0,0], |
maroon:[128,0,0], |
navy:[0,0,128], |
navy:[0,0,128], |
olive:[128,128,0], |
olive:[128,128,0], |
orange:[255,165,0], |
orange:[255,165,0], |
pink:[255,192,203], |
pink:[255,192,203], |
purple:[128,0,128], |
purple:[128,0,128], |
violet:[128,0,128], |
violet:[128,0,128], |
red:[255,0,0], |
red:[255,0,0], |
silver:[192,192,192], |
silver:[192,192,192], |
white:[255,255,255], |
white:[255,255,255], |
yellow:[255,255,0], |
yellow:[255,255,0], |
transparent: [255,255,255] |
transparent: [255,255,255] |
}; |
}; |
|
|
|
|
|
|
/******************************************************************************/ |
/******************************************************************************/ |
/****************************** CLASS ANIMATIONS ******************************/ |
/****************************** CLASS ANIMATIONS ******************************/ |
/******************************************************************************/ |
/******************************************************************************/ |
|
|
var classAnimationActions = ['add', 'remove', 'toggle'], |
var classAnimationActions = ['add', 'remove', 'toggle'], |
shorthandStyles = { |
shorthandStyles = { |
border: 1, |
border: 1, |
borderBottom: 1, |
borderBottom: 1, |
borderColor: 1, |
borderColor: 1, |
borderLeft: 1, |
borderLeft: 1, |
borderRight: 1, |
borderRight: 1, |
borderTop: 1, |
borderTop: 1, |
borderWidth: 1, |
borderWidth: 1, |
margin: 1, |
margin: 1, |
padding: 1 |
padding: 1 |
}; |
}; |
|
|
function getElementStyles() { |
function getElementStyles() { |
var style = document.defaultView |
var style = document.defaultView |
? document.defaultView.getComputedStyle(this, null) |
? document.defaultView.getComputedStyle(this, null) |
: this.currentStyle, |
: this.currentStyle, |
newStyle = {}, |
newStyle = {}, |
key, |
key, |
camelCase; |
camelCase; |
|
|
// webkit enumerates style porperties |
// webkit enumerates style porperties |
if (style && style.length && style[0] && style[style[0]]) { |
if (style && style.length && style[0] && style[style[0]]) { |
var len = style.length; |
var len = style.length; |
while (len--) { |
while (len--) { |
key = style[len]; |
key = style[len]; |
if (typeof style[key] == 'string') { |
if (typeof style[key] == 'string') { |
camelCase = key.replace(/\-(\w)/g, function(all, letter){ |
camelCase = key.replace(/\-(\w)/g, function(all, letter){ |
return letter.toUpperCase(); |
return letter.toUpperCase(); |
}); |
}); |
newStyle[camelCase] = style[key]; |
newStyle[camelCase] = style[key]; |
} |
} |
} |
} |
} else { |
} else { |
for (key in style) { |
for (key in style) { |
if (typeof style[key] === 'string') { |
if (typeof style[key] === 'string') { |
newStyle[key] = style[key]; |
newStyle[key] = style[key]; |
} |
} |
} |
} |
} |
} |
|
|
return newStyle; |
return newStyle; |
} |
} |
|
|
function filterStyles(styles) { |
function filterStyles(styles) { |
var name, value; |
var name, value; |
for (name in styles) { |
for (name in styles) { |
value = styles[name]; |
value = styles[name]; |
if ( |
if ( |
// ignore null and undefined values |
// ignore null and undefined values |
value == null || |
value == null || |
// ignore functions (when does this occur?) |
// ignore functions (when does this occur?) |
$.isFunction(value) || |
$.isFunction(value) || |
// shorthand styles that need to be expanded |
// shorthand styles that need to be expanded |
name in shorthandStyles || |
name in shorthandStyles || |
// ignore scrollbars (break in IE) |
// ignore scrollbars (break in IE) |
(/scrollbar/).test(name) || |
(/scrollbar/).test(name) || |
|
|
// only colors or values that can be converted to numbers |
// only colors or values that can be converted to numbers |
(!(/color/i).test(name) && isNaN(parseFloat(value))) |
(!(/color/i).test(name) && isNaN(parseFloat(value))) |
) { |
) { |
delete styles[name]; |
delete styles[name]; |
} |
} |
} |
} |
|
|
return styles; |
return styles; |
} |
} |
|
|
function styleDifference(oldStyle, newStyle) { |
function styleDifference(oldStyle, newStyle) { |
var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459 |
var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459 |
name; |
name; |
|
|
for (name in newStyle) { |
for (name in newStyle) { |
if (oldStyle[name] != newStyle[name]) { |
if (oldStyle[name] != newStyle[name]) { |
diff[name] = newStyle[name]; |
diff[name] = newStyle[name]; |
} |
} |
} |
} |
|
|
return diff; |
return diff; |
} |
} |
|
|
$.effects.animateClass = function(value, duration, easing, callback) { |
$.effects.animateClass = function(value, duration, easing, callback) { |
if ($.isFunction(easing)) { |
if ($.isFunction(easing)) { |
callback = easing; |
callback = easing; |
easing = null; |
easing = null; |
} |
} |
|
|
return this.queue('fx', function() { |
return this.queue('fx', function() { |
var that = $(this), |
var that = $(this), |
originalStyleAttr = that.attr('style') || ' ', |
originalStyleAttr = that.attr('style') || ' ', |
originalStyle = filterStyles(getElementStyles.call(this)), |
originalStyle = filterStyles(getElementStyles.call(this)), |
newStyle, |
newStyle, |
className = that.attr('className'); |
className = that.attr('className'); |
|
|
$.each(classAnimationActions, function(i, action) { |
$.each(classAnimationActions, function(i, action) { |
if (value[action]) { |
if (value[action]) { |
that[action + 'Class'](value[action]); |
that[action + 'Class'](value[action]); |
} |
} |
}); |
}); |
newStyle = filterStyles(getElementStyles.call(this)); |
newStyle = filterStyles(getElementStyles.call(this)); |
that.attr('className', className); |
that.attr('className', className); |
|
|
that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() { |
that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() { |
$.each(classAnimationActions, function(i, action) { |
$.each(classAnimationActions, function(i, action) { |
if (value[action]) { that[action + 'Class'](value[action]); } |
if (value[action]) { that[action + 'Class'](value[action]); } |
}); |
}); |
// work around bug in IE by clearing the cssText before setting it |
// work around bug in IE by clearing the cssText before setting it |
if (typeof that.attr('style') == 'object') { |
if (typeof that.attr('style') == 'object') { |
that.attr('style').cssText = ''; |
that.attr('style').cssText = ''; |
that.attr('style').cssText = originalStyleAttr; |
that.attr('style').cssText = originalStyleAttr; |
} else { |
} else { |
that.attr('style', originalStyleAttr); |
that.attr('style', originalStyleAttr); |
} |
} |
if (callback) { callback.apply(this, arguments); } |
if (callback) { callback.apply(this, arguments); } |
}); |
}); |
|
|
// $.animate adds a function to the end of the queue |
// $.animate adds a function to the end of the queue |
// but we want it at the front |
// but we want it at the front |
var queue = $.queue(this), |
var queue = $.queue(this), |
anim = queue.splice(queue.length - 1, 1)[0]; |
anim = queue.splice(queue.length - 1, 1)[0]; |
queue.splice(1, 0, anim); |
queue.splice(1, 0, anim); |
$.dequeue(this); |
$.dequeue(this); |
}); |
}); |
}; |
}; |
|
|
$.fn.extend({ |
$.fn.extend({ |
_addClass: $.fn.addClass, |
_addClass: $.fn.addClass, |
addClass: function(classNames, speed, easing, callback) { |
addClass: function(classNames, speed, easing, callback) { |
return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); |
return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); |
}, |
}, |
|
|
_removeClass: $.fn.removeClass, |
_removeClass: $.fn.removeClass, |
removeClass: function(classNames,speed,easing,callback) { |
removeClass: function(classNames,speed,easing,callback) { |
return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); |
return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); |
}, |
}, |
|
|
_toggleClass: $.fn.toggleClass, |
_toggleClass: $.fn.toggleClass, |
toggleClass: function(classNames, force, speed, easing, callback) { |
toggleClass: function(classNames, force, speed, easing, callback) { |
if ( typeof force == "boolean" || force === undefined ) { |
if ( typeof force == "boolean" || force === undefined ) { |
if ( !speed ) { |
if ( !speed ) { |
// without speed parameter; |
// without speed parameter; |
return this._toggleClass(classNames, force); |
return this._toggleClass(classNames, force); |
} else { |
} else { |
return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]); |
return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]); |
} |
} |
} else { |
} else { |
// without switch parameter; |
// without switch parameter; |
return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]); |
return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]); |
} |
} |
}, |
}, |
|
|
switchClass: function(remove,add,speed,easing,callback) { |
switchClass: function(remove,add,speed,easing,callback) { |
return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); |
return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); |
} |
} |
}); |
}); |
|
|
|
|
|
|
/******************************************************************************/ |
/******************************************************************************/ |
/*********************************** EFFECTS **********************************/ |
/*********************************** EFFECTS **********************************/ |
/******************************************************************************/ |
/******************************************************************************/ |
|
|
$.extend($.effects, { |
$.extend($.effects, { |
version: "@VERSION", |
version: "@VERSION", |
|
|
// Saves a set of properties in a data storage |
// Saves a set of properties in a data storage |
save: function(element, set) { |
save: function(element, set) { |
for(var i=0; i < set.length; i++) { |
for(var i=0; i < set.length; i++) { |
if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); |
if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); |
} |
} |
}, |
}, |
|
|
// Restores a set of previously saved properties from a data storage |
// Restores a set of previously saved properties from a data storage |
restore: function(element, set) { |
restore: function(element, set) { |
for(var i=0; i < set.length; i++) { |
for(var i=0; i < set.length; i++) { |
if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); |
if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); |
} |
} |
}, |
}, |
|
|
setMode: function(el, mode) { |
setMode: function(el, mode) { |
if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle |
if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle |
return mode; |
return mode; |
}, |
}, |
|
|
getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value |
getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value |
// this should be a little more flexible in the future to handle a string & hash |
// this should be a little more flexible in the future to handle a string & hash |
var y, x; |
var y, x; |
switch (origin[0]) { |
switch (origin[0]) { |
case 'top': y = 0; break; |
case 'top': y = 0; break; |
case 'middle': y = 0.5; break; |
case 'middle': y = 0.5; break; |
case 'bottom': y = 1; break; |
case 'bottom': y = 1; break; |
default: y = origin[0] / original.height; |
default: y = origin[0] / original.height; |
}; |
}; |
switch (origin[1]) { |
switch (origin[1]) { |
case 'left': x = 0; break; |
case 'left': x = 0; break; |
case 'center': x = 0.5; break; |
case 'center': x = 0.5; break; |
case 'right': x = 1; break; |
case 'right': x = 1; break; |
default: x = origin[1] / original.width; |
default: x = origin[1] / original.width; |
}; |
}; |
return {x: x, y: y}; |
return {x: x, y: y}; |
}, |
}, |
|
|
// Wraps the element around a wrapper that copies position properties |
// Wraps the element around a wrapper that copies position properties |
createWrapper: function(element) { |
createWrapper: function(element) { |
|
|
// if the element is already wrapped, return it |
// if the element is already wrapped, return it |
if (element.parent().is('.ui-effects-wrapper')) { |
if (element.parent().is('.ui-effects-wrapper')) { |
return element.parent(); |
return element.parent(); |
} |
} |
|
|
// wrap the element |
// wrap the element |
var props = { |
var props = { |
width: element.outerWidth(true), |
width: element.outerWidth(true), |
height: element.outerHeight(true), |
height: element.outerHeight(true), |
'float': element.css('float') |
'float': element.css('float') |
}, |
}, |
wrapper = $('<div></div>') |
wrapper = $('<div></div>') |
.addClass('ui-effects-wrapper') |
.addClass('ui-effects-wrapper') |
.css({ |
.css({ |
fontSize: '100%', |
fontSize: '100%', |
background: 'transparent', |
background: 'transparent', |
border: 'none', |
border: 'none', |
margin: 0, |
margin: 0, |
padding: 0 |
padding: 0 |
}); |
}); |
|
|
element.wrap(wrapper); |
element.wrap(wrapper); |
wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element |
wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element |
|
|
// transfer positioning properties to the wrapper |
// transfer positioning properties to the wrapper |
if (element.css('position') == 'static') { |
if (element.css('position') == 'static') { |
wrapper.css({ position: 'relative' }); |
wrapper.css({ position: 'relative' }); |
element.css({ position: 'relative' }); |
element.css({ position: 'relative' }); |
} else { |
} else { |
$.extend(props, { |
$.extend(props, { |
position: element.c |