src/ztfy/myams/resources/js/ext/jquery-color-2.1.2.js
changeset 127 cf00ea83daa7
equal deleted inserted replaced
126:3868baf80db1 127:cf00ea83daa7
       
     1 /*!
       
     2  * jQuery Color Animations v2.1.2
       
     3  * https://github.com/jquery/jquery-color
       
     4  *
       
     5  * Copyright 2013 jQuery Foundation and other contributors
       
     6  * Released under the MIT license.
       
     7  * http://jquery.org/license
       
     8  *
       
     9  * Date: Wed Jan 16 08:47:09 2013 -0600
       
    10  */
       
    11 (function( jQuery, undefined ) {
       
    12 
       
    13 	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
       
    14 
       
    15 	// plusequals test for += 100 -= 100
       
    16 	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
       
    17 	// a set of RE's that can match strings and generate color tuples.
       
    18 	stringParsers = [{
       
    19 			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
       
    20 			parse: function( execResult ) {
       
    21 				return [
       
    22 					execResult[ 1 ],
       
    23 					execResult[ 2 ],
       
    24 					execResult[ 3 ],
       
    25 					execResult[ 4 ]
       
    26 				];
       
    27 			}
       
    28 		}, {
       
    29 			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
       
    30 			parse: function( execResult ) {
       
    31 				return [
       
    32 					execResult[ 1 ] * 2.55,
       
    33 					execResult[ 2 ] * 2.55,
       
    34 					execResult[ 3 ] * 2.55,
       
    35 					execResult[ 4 ]
       
    36 				];
       
    37 			}
       
    38 		}, {
       
    39 			// this regex ignores A-F because it's compared against an already lowercased string
       
    40 			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
       
    41 			parse: function( execResult ) {
       
    42 				return [
       
    43 					parseInt( execResult[ 1 ], 16 ),
       
    44 					parseInt( execResult[ 2 ], 16 ),
       
    45 					parseInt( execResult[ 3 ], 16 )
       
    46 				];
       
    47 			}
       
    48 		}, {
       
    49 			// this regex ignores A-F because it's compared against an already lowercased string
       
    50 			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
       
    51 			parse: function( execResult ) {
       
    52 				return [
       
    53 					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
       
    54 					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
       
    55 					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
       
    56 				];
       
    57 			}
       
    58 		}, {
       
    59 			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
       
    60 			space: "hsla",
       
    61 			parse: function( execResult ) {
       
    62 				return [
       
    63 					execResult[ 1 ],
       
    64 					execResult[ 2 ] / 100,
       
    65 					execResult[ 3 ] / 100,
       
    66 					execResult[ 4 ]
       
    67 				];
       
    68 			}
       
    69 		}],
       
    70 
       
    71 	// jQuery.Color( )
       
    72 	color = jQuery.Color = function( color, green, blue, alpha ) {
       
    73 		return new jQuery.Color.fn.parse( color, green, blue, alpha );
       
    74 	},
       
    75 	spaces = {
       
    76 		rgba: {
       
    77 			props: {
       
    78 				red: {
       
    79 					idx: 0,
       
    80 					type: "byte"
       
    81 				},
       
    82 				green: {
       
    83 					idx: 1,
       
    84 					type: "byte"
       
    85 				},
       
    86 				blue: {
       
    87 					idx: 2,
       
    88 					type: "byte"
       
    89 				}
       
    90 			}
       
    91 		},
       
    92 
       
    93 		hsla: {
       
    94 			props: {
       
    95 				hue: {
       
    96 					idx: 0,
       
    97 					type: "degrees"
       
    98 				},
       
    99 				saturation: {
       
   100 					idx: 1,
       
   101 					type: "percent"
       
   102 				},
       
   103 				lightness: {
       
   104 					idx: 2,
       
   105 					type: "percent"
       
   106 				}
       
   107 			}
       
   108 		}
       
   109 	},
       
   110 	propTypes = {
       
   111 		"byte": {
       
   112 			floor: true,
       
   113 			max: 255
       
   114 		},
       
   115 		"percent": {
       
   116 			max: 1
       
   117 		},
       
   118 		"degrees": {
       
   119 			mod: 360,
       
   120 			floor: true
       
   121 		}
       
   122 	},
       
   123 	support = color.support = {},
       
   124 
       
   125 	// element for support tests
       
   126 	supportElem = jQuery( "<p>" )[ 0 ],
       
   127 
       
   128 	// colors = jQuery.Color.names
       
   129 	colors,
       
   130 
       
   131 	// local aliases of functions called often
       
   132 	each = jQuery.each;
       
   133 
       
   134 // determine rgba support immediately
       
   135 supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
       
   136 support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
       
   137 
       
   138 // define cache name and alpha properties
       
   139 // for rgba and hsla spaces
       
   140 each( spaces, function( spaceName, space ) {
       
   141 	space.cache = "_" + spaceName;
       
   142 	space.props.alpha = {
       
   143 		idx: 3,
       
   144 		type: "percent",
       
   145 		def: 1
       
   146 	};
       
   147 });
       
   148 
       
   149 function clamp( value, prop, allowEmpty ) {
       
   150 	var type = propTypes[ prop.type ] || {};
       
   151 
       
   152 	if ( value == null ) {
       
   153 		return (allowEmpty || !prop.def) ? null : prop.def;
       
   154 	}
       
   155 
       
   156 	// ~~ is an short way of doing floor for positive numbers
       
   157 	value = type.floor ? ~~value : parseFloat( value );
       
   158 
       
   159 	// IE will pass in empty strings as value for alpha,
       
   160 	// which will hit this case
       
   161 	if ( isNaN( value ) ) {
       
   162 		return prop.def;
       
   163 	}
       
   164 
       
   165 	if ( type.mod ) {
       
   166 		// we add mod before modding to make sure that negatives values
       
   167 		// get converted properly: -10 -> 350
       
   168 		return (value + type.mod) % type.mod;
       
   169 	}
       
   170 
       
   171 	// for now all property types without mod have min and max
       
   172 	return 0 > value ? 0 : type.max < value ? type.max : value;
       
   173 }
       
   174 
       
   175 function stringParse( string ) {
       
   176 	var inst = color(),
       
   177 		rgba = inst._rgba = [];
       
   178 
       
   179 	string = string.toLowerCase();
       
   180 
       
   181 	each( stringParsers, function( i, parser ) {
       
   182 		var parsed,
       
   183 			match = parser.re.exec( string ),
       
   184 			values = match && parser.parse( match ),
       
   185 			spaceName = parser.space || "rgba";
       
   186 
       
   187 		if ( values ) {
       
   188 			parsed = inst[ spaceName ]( values );
       
   189 
       
   190 			// if this was an rgba parse the assignment might happen twice
       
   191 			// oh well....
       
   192 			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
       
   193 			rgba = inst._rgba = parsed._rgba;
       
   194 
       
   195 			// exit each( stringParsers ) here because we matched
       
   196 			return false;
       
   197 		}
       
   198 	});
       
   199 
       
   200 	// Found a stringParser that handled it
       
   201 	if ( rgba.length ) {
       
   202 
       
   203 		// if this came from a parsed string, force "transparent" when alpha is 0
       
   204 		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
       
   205 		if ( rgba.join() === "0,0,0,0" ) {
       
   206 			jQuery.extend( rgba, colors.transparent );
       
   207 		}
       
   208 		return inst;
       
   209 	}
       
   210 
       
   211 	// named colors
       
   212 	return colors[ string ];
       
   213 }
       
   214 
       
   215 color.fn = jQuery.extend( color.prototype, {
       
   216 	parse: function( red, green, blue, alpha ) {
       
   217 		if ( red === undefined ) {
       
   218 			this._rgba = [ null, null, null, null ];
       
   219 			return this;
       
   220 		}
       
   221 		if ( red.jquery || red.nodeType ) {
       
   222 			red = jQuery( red ).css( green );
       
   223 			green = undefined;
       
   224 		}
       
   225 
       
   226 		var inst = this,
       
   227 			type = jQuery.type( red ),
       
   228 			rgba = this._rgba = [];
       
   229 
       
   230 		// more than 1 argument specified - assume ( red, green, blue, alpha )
       
   231 		if ( green !== undefined ) {
       
   232 			red = [ red, green, blue, alpha ];
       
   233 			type = "array";
       
   234 		}
       
   235 
       
   236 		if ( type === "string" ) {
       
   237 			return this.parse( stringParse( red ) || colors._default );
       
   238 		}
       
   239 
       
   240 		if ( type === "array" ) {
       
   241 			each( spaces.rgba.props, function( key, prop ) {
       
   242 				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
       
   243 			});
       
   244 			return this;
       
   245 		}
       
   246 
       
   247 		if ( type === "object" ) {
       
   248 			if ( red instanceof color ) {
       
   249 				each( spaces, function( spaceName, space ) {
       
   250 					if ( red[ space.cache ] ) {
       
   251 						inst[ space.cache ] = red[ space.cache ].slice();
       
   252 					}
       
   253 				});
       
   254 			} else {
       
   255 				each( spaces, function( spaceName, space ) {
       
   256 					var cache = space.cache;
       
   257 					each( space.props, function( key, prop ) {
       
   258 
       
   259 						// if the cache doesn't exist, and we know how to convert
       
   260 						if ( !inst[ cache ] && space.to ) {
       
   261 
       
   262 							// if the value was null, we don't need to copy it
       
   263 							// if the key was alpha, we don't need to copy it either
       
   264 							if ( key === "alpha" || red[ key ] == null ) {
       
   265 								return;
       
   266 							}
       
   267 							inst[ cache ] = space.to( inst._rgba );
       
   268 						}
       
   269 
       
   270 						// this is the only case where we allow nulls for ALL properties.
       
   271 						// call clamp with alwaysAllowEmpty
       
   272 						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
       
   273 					});
       
   274 
       
   275 					// everything defined but alpha?
       
   276 					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
       
   277 						// use the default of 1
       
   278 						inst[ cache ][ 3 ] = 1;
       
   279 						if ( space.from ) {
       
   280 							inst._rgba = space.from( inst[ cache ] );
       
   281 						}
       
   282 					}
       
   283 				});
       
   284 			}
       
   285 			return this;
       
   286 		}
       
   287 	},
       
   288 	is: function( compare ) {
       
   289 		var is = color( compare ),
       
   290 			same = true,
       
   291 			inst = this;
       
   292 
       
   293 		each( spaces, function( _, space ) {
       
   294 			var localCache,
       
   295 				isCache = is[ space.cache ];
       
   296 			if (isCache) {
       
   297 				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
       
   298 				each( space.props, function( _, prop ) {
       
   299 					if ( isCache[ prop.idx ] != null ) {
       
   300 						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
       
   301 						return same;
       
   302 					}
       
   303 				});
       
   304 			}
       
   305 			return same;
       
   306 		});
       
   307 		return same;
       
   308 	},
       
   309 	_space: function() {
       
   310 		var used = [],
       
   311 			inst = this;
       
   312 		each( spaces, function( spaceName, space ) {
       
   313 			if ( inst[ space.cache ] ) {
       
   314 				used.push( spaceName );
       
   315 			}
       
   316 		});
       
   317 		return used.pop();
       
   318 	},
       
   319 	transition: function( other, distance ) {
       
   320 		var end = color( other ),
       
   321 			spaceName = end._space(),
       
   322 			space = spaces[ spaceName ],
       
   323 			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
       
   324 			start = startColor[ space.cache ] || space.to( startColor._rgba ),
       
   325 			result = start.slice();
       
   326 
       
   327 		end = end[ space.cache ];
       
   328 		each( space.props, function( key, prop ) {
       
   329 			var index = prop.idx,
       
   330 				startValue = start[ index ],
       
   331 				endValue = end[ index ],
       
   332 				type = propTypes[ prop.type ] || {};
       
   333 
       
   334 			// if null, don't override start value
       
   335 			if ( endValue === null ) {
       
   336 				return;
       
   337 			}
       
   338 			// if null - use end
       
   339 			if ( startValue === null ) {
       
   340 				result[ index ] = endValue;
       
   341 			} else {
       
   342 				if ( type.mod ) {
       
   343 					if ( endValue - startValue > type.mod / 2 ) {
       
   344 						startValue += type.mod;
       
   345 					} else if ( startValue - endValue > type.mod / 2 ) {
       
   346 						startValue -= type.mod;
       
   347 					}
       
   348 				}
       
   349 				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
       
   350 			}
       
   351 		});
       
   352 		return this[ spaceName ]( result );
       
   353 	},
       
   354 	blend: function( opaque ) {
       
   355 		// if we are already opaque - return ourself
       
   356 		if ( this._rgba[ 3 ] === 1 ) {
       
   357 			return this;
       
   358 		}
       
   359 
       
   360 		var rgb = this._rgba.slice(),
       
   361 			a = rgb.pop(),
       
   362 			blend = color( opaque )._rgba;
       
   363 
       
   364 		return color( jQuery.map( rgb, function( v, i ) {
       
   365 			return ( 1 - a ) * blend[ i ] + a * v;
       
   366 		}));
       
   367 	},
       
   368 	toRgbaString: function() {
       
   369 		var prefix = "rgba(",
       
   370 			rgba = jQuery.map( this._rgba, function( v, i ) {
       
   371 				return v == null ? ( i > 2 ? 1 : 0 ) : v;
       
   372 			});
       
   373 
       
   374 		if ( rgba[ 3 ] === 1 ) {
       
   375 			rgba.pop();
       
   376 			prefix = "rgb(";
       
   377 		}
       
   378 
       
   379 		return prefix + rgba.join() + ")";
       
   380 	},
       
   381 	toHslaString: function() {
       
   382 		var prefix = "hsla(",
       
   383 			hsla = jQuery.map( this.hsla(), function( v, i ) {
       
   384 				if ( v == null ) {
       
   385 					v = i > 2 ? 1 : 0;
       
   386 				}
       
   387 
       
   388 				// catch 1 and 2
       
   389 				if ( i && i < 3 ) {
       
   390 					v = Math.round( v * 100 ) + "%";
       
   391 				}
       
   392 				return v;
       
   393 			});
       
   394 
       
   395 		if ( hsla[ 3 ] === 1 ) {
       
   396 			hsla.pop();
       
   397 			prefix = "hsl(";
       
   398 		}
       
   399 		return prefix + hsla.join() + ")";
       
   400 	},
       
   401 	toHexString: function( includeAlpha ) {
       
   402 		var rgba = this._rgba.slice(),
       
   403 			alpha = rgba.pop();
       
   404 
       
   405 		if ( includeAlpha ) {
       
   406 			rgba.push( ~~( alpha * 255 ) );
       
   407 		}
       
   408 
       
   409 		return "#" + jQuery.map( rgba, function( v ) {
       
   410 
       
   411 			// default to 0 when nulls exist
       
   412 			v = ( v || 0 ).toString( 16 );
       
   413 			return v.length === 1 ? "0" + v : v;
       
   414 		}).join("");
       
   415 	},
       
   416 	toString: function() {
       
   417 		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
       
   418 	}
       
   419 });
       
   420 color.fn.parse.prototype = color.fn;
       
   421 
       
   422 // hsla conversions adapted from:
       
   423 // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
       
   424 
       
   425 function hue2rgb( p, q, h ) {
       
   426 	h = ( h + 1 ) % 1;
       
   427 	if ( h * 6 < 1 ) {
       
   428 		return p + (q - p) * h * 6;
       
   429 	}
       
   430 	if ( h * 2 < 1) {
       
   431 		return q;
       
   432 	}
       
   433 	if ( h * 3 < 2 ) {
       
   434 		return p + (q - p) * ((2/3) - h) * 6;
       
   435 	}
       
   436 	return p;
       
   437 }
       
   438 
       
   439 spaces.hsla.to = function ( rgba ) {
       
   440 	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
       
   441 		return [ null, null, null, rgba[ 3 ] ];
       
   442 	}
       
   443 	var r = rgba[ 0 ] / 255,
       
   444 		g = rgba[ 1 ] / 255,
       
   445 		b = rgba[ 2 ] / 255,
       
   446 		a = rgba[ 3 ],
       
   447 		max = Math.max( r, g, b ),
       
   448 		min = Math.min( r, g, b ),
       
   449 		diff = max - min,
       
   450 		add = max + min,
       
   451 		l = add * 0.5,
       
   452 		h, s;
       
   453 
       
   454 	if ( min === max ) {
       
   455 		h = 0;
       
   456 	} else if ( r === max ) {
       
   457 		h = ( 60 * ( g - b ) / diff ) + 360;
       
   458 	} else if ( g === max ) {
       
   459 		h = ( 60 * ( b - r ) / diff ) + 120;
       
   460 	} else {
       
   461 		h = ( 60 * ( r - g ) / diff ) + 240;
       
   462 	}
       
   463 
       
   464 	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
       
   465 	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
       
   466 	if ( diff === 0 ) {
       
   467 		s = 0;
       
   468 	} else if ( l <= 0.5 ) {
       
   469 		s = diff / add;
       
   470 	} else {
       
   471 		s = diff / ( 2 - add );
       
   472 	}
       
   473 	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
       
   474 };
       
   475 
       
   476 spaces.hsla.from = function ( hsla ) {
       
   477 	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
       
   478 		return [ null, null, null, hsla[ 3 ] ];
       
   479 	}
       
   480 	var h = hsla[ 0 ] / 360,
       
   481 		s = hsla[ 1 ],
       
   482 		l = hsla[ 2 ],
       
   483 		a = hsla[ 3 ],
       
   484 		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
       
   485 		p = 2 * l - q;
       
   486 
       
   487 	return [
       
   488 		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
       
   489 		Math.round( hue2rgb( p, q, h ) * 255 ),
       
   490 		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
       
   491 		a
       
   492 	];
       
   493 };
       
   494 
       
   495 
       
   496 each( spaces, function( spaceName, space ) {
       
   497 	var props = space.props,
       
   498 		cache = space.cache,
       
   499 		to = space.to,
       
   500 		from = space.from;
       
   501 
       
   502 	// makes rgba() and hsla()
       
   503 	color.fn[ spaceName ] = function( value ) {
       
   504 
       
   505 		// generate a cache for this space if it doesn't exist
       
   506 		if ( to && !this[ cache ] ) {
       
   507 			this[ cache ] = to( this._rgba );
       
   508 		}
       
   509 		if ( value === undefined ) {
       
   510 			return this[ cache ].slice();
       
   511 		}
       
   512 
       
   513 		var ret,
       
   514 			type = jQuery.type( value ),
       
   515 			arr = ( type === "array" || type === "object" ) ? value : arguments,
       
   516 			local = this[ cache ].slice();
       
   517 
       
   518 		each( props, function( key, prop ) {
       
   519 			var val = arr[ type === "object" ? key : prop.idx ];
       
   520 			if ( val == null ) {
       
   521 				val = local[ prop.idx ];
       
   522 			}
       
   523 			local[ prop.idx ] = clamp( val, prop );
       
   524 		});
       
   525 
       
   526 		if ( from ) {
       
   527 			ret = color( from( local ) );
       
   528 			ret[ cache ] = local;
       
   529 			return ret;
       
   530 		} else {
       
   531 			return color( local );
       
   532 		}
       
   533 	};
       
   534 
       
   535 	// makes red() green() blue() alpha() hue() saturation() lightness()
       
   536 	each( props, function( key, prop ) {
       
   537 		// alpha is included in more than one space
       
   538 		if ( color.fn[ key ] ) {
       
   539 			return;
       
   540 		}
       
   541 		color.fn[ key ] = function( value ) {
       
   542 			var vtype = jQuery.type( value ),
       
   543 				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
       
   544 				local = this[ fn ](),
       
   545 				cur = local[ prop.idx ],
       
   546 				match;
       
   547 
       
   548 			if ( vtype === "undefined" ) {
       
   549 				return cur;
       
   550 			}
       
   551 
       
   552 			if ( vtype === "function" ) {
       
   553 				value = value.call( this, cur );
       
   554 				vtype = jQuery.type( value );
       
   555 			}
       
   556 			if ( value == null && prop.empty ) {
       
   557 				return this;
       
   558 			}
       
   559 			if ( vtype === "string" ) {
       
   560 				match = rplusequals.exec( value );
       
   561 				if ( match ) {
       
   562 					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
       
   563 				}
       
   564 			}
       
   565 			local[ prop.idx ] = value;
       
   566 			return this[ fn ]( local );
       
   567 		};
       
   568 	});
       
   569 });
       
   570 
       
   571 // add cssHook and .fx.step function for each named hook.
       
   572 // accept a space separated string of properties
       
   573 color.hook = function( hook ) {
       
   574 	var hooks = hook.split( " " );
       
   575 	each( hooks, function( i, hook ) {
       
   576 		jQuery.cssHooks[ hook ] = {
       
   577 			set: function( elem, value ) {
       
   578 				var parsed, curElem,
       
   579 					backgroundColor = "";
       
   580 
       
   581 				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
       
   582 					value = color( parsed || value );
       
   583 					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
       
   584 						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
       
   585 						while (
       
   586 							(backgroundColor === "" || backgroundColor === "transparent") &&
       
   587 							curElem && curElem.style
       
   588 						) {
       
   589 							try {
       
   590 								backgroundColor = jQuery.css( curElem, "backgroundColor" );
       
   591 								curElem = curElem.parentNode;
       
   592 							} catch ( e ) {
       
   593 							}
       
   594 						}
       
   595 
       
   596 						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
       
   597 							backgroundColor :
       
   598 							"_default" );
       
   599 					}
       
   600 
       
   601 					value = value.toRgbaString();
       
   602 				}
       
   603 				try {
       
   604 					elem.style[ hook ] = value;
       
   605 				} catch( e ) {
       
   606 					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
       
   607 				}
       
   608 			}
       
   609 		};
       
   610 		jQuery.fx.step[ hook ] = function( fx ) {
       
   611 			if ( !fx.colorInit ) {
       
   612 				fx.start = color( fx.elem, hook );
       
   613 				fx.end = color( fx.end );
       
   614 				fx.colorInit = true;
       
   615 			}
       
   616 			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
       
   617 		};
       
   618 	});
       
   619 
       
   620 };
       
   621 
       
   622 color.hook( stepHooks );
       
   623 
       
   624 jQuery.cssHooks.borderColor = {
       
   625 	expand: function( value ) {
       
   626 		var expanded = {};
       
   627 
       
   628 		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
       
   629 			expanded[ "border" + part + "Color" ] = value;
       
   630 		});
       
   631 		return expanded;
       
   632 	}
       
   633 };
       
   634 
       
   635 // Basic color names only.
       
   636 // Usage of any of the other color names requires adding yourself or including
       
   637 // jquery.color.svg-names.js.
       
   638 colors = jQuery.Color.names = {
       
   639 	// 4.1. Basic color keywords
       
   640 	aqua: "#00ffff",
       
   641 	black: "#000000",
       
   642 	blue: "#0000ff",
       
   643 	fuchsia: "#ff00ff",
       
   644 	gray: "#808080",
       
   645 	green: "#008000",
       
   646 	lime: "#00ff00",
       
   647 	maroon: "#800000",
       
   648 	navy: "#000080",
       
   649 	olive: "#808000",
       
   650 	purple: "#800080",
       
   651 	red: "#ff0000",
       
   652 	silver: "#c0c0c0",
       
   653 	teal: "#008080",
       
   654 	white: "#ffffff",
       
   655 	yellow: "#ffff00",
       
   656 
       
   657 	// 4.2.3. "transparent" color keyword
       
   658 	transparent: [ null, null, null, 0 ],
       
   659 
       
   660 	_default: "#ffffff"
       
   661 };
       
   662 
       
   663 })( jQuery );