jquery-color 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c64775f45fad73e465a845c9ab4204d4ca1c10a0
4
+ data.tar.gz: d71951fb235e51f7ecde30ca09502310db379676
5
+ SHA512:
6
+ metadata.gz: 0c652f516c4f34ee4e270ac39d31c54c61c49519c7bc191c9a36aec68d1bf38a90ded98df7f24c272acd33ee996946a1f542cbfc21c03034f9c23d0d53acebe1
7
+ data.tar.gz: 29b016c3ae5f64cb2680ff186e75bf73fdb96bd230da92d31c569ebe885bd157e10d94ba2e099942d927ada7a7b1113509b73fb45bc9148ac36168af36b2a01d
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Dennis Baskin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ # Jquery::Color
2
+
3
+ This Ruby Gem wraps the jQuery plugin for color manipulation and animation support. For documentation please see https://github.com/jquery/jquery-color.
4
+
5
+ ### Current Version
6
+
7
+ 2.1.2 - Matches jQuery plugin version
8
+
9
+ ## Documentation
10
+
11
+ Documentation can be found at https://github.com/jquery/jquery-color
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'jquery-color'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install jquery-color
26
+
27
+ ## Usage
28
+
29
+ Add the following directive to your Javascript manifest file (application.js):
30
+
31
+ //= require jquery.color.js
32
+
33
+ or
34
+
35
+ //= jquery.color.svg-names.js
36
+
37
+ or
38
+
39
+ //= jquery.color.plus-names.js
40
+
41
+ Please see developer site for usage instructions: https://github.com/jquery/jquery-color
42
+
43
+ ## Contributing
44
+
45
+ 1. Fork it ( https://github.com/[my-github-username]/jquery-color/fork )
46
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
47
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
48
+ 4. Push to the branch (`git push origin my-new-feature`)
49
+ 5. Create a new Pull Request
@@ -0,0 +1,8 @@
1
+ require "jquery/color/version"
2
+
3
+ module Jquery
4
+ module Color
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ require "jquery/color/version"
2
+
3
+ module Jquery
4
+ module Color
5
+ # Your code goes here...
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Jquery
2
+ module Color
3
+ VERSION = "2.1.2"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Jquery
2
+ module Color
3
+ VERSION = "2.1.1"
4
+ end
5
+ end
@@ -0,0 +1,663 @@
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 );