/*
 Color animation jQuery-plugin
 http://www.bitstorm.org/jquery/color-animation/
 Copyright 2011 Edwin Martin <edwin@bitstorm.org>
 Released under the MIT and GPL licenses.
*/
(function( jQuery, undefined ){var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color outlineColor".split(" "),rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,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 [2.55 * execResult[1],2.55 * execResult[2],2.55 * execResult[3],execResult[ 4 ]];}}, {re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,parse: function( execResult ) {return [parseInt( execResult[ 1 ], 16 ),parseInt( execResult[ 2 ], 16 ),parseInt( execResult[ 3 ], 16 )];}}, {re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-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]];}}],color = jQuery.Color = function( color, green, blue, alpha ) {return new jQuery.Color.fn.parse( color, green, blue, alpha );},spaces = {rgba: {cache: "_rgba",props: {red: {idx: 0,type: "byte",empty: true},green: {idx: 1,type: "byte",empty: true},blue: {idx: 2,type: "byte",empty: true},alpha: {idx: 3,type: "percent",def: 1}}},hsla: {cache: "_hsla",props: {hue: {idx: 0,type: "degrees",empty: true},saturation: {idx: 1,type: "percent",empty: true},lightness: {idx: 2,type: "percent",empty: true}}}},propTypes = {"byte": {floor: true,min: 0,max: 255},"percent": {min: 0,max: 1},"degrees": {mod: 360,floor: true}},rgbaspace = spaces.rgba.props,support = color.support = {},colors,each = jQuery.each;spaces.hsla.props.alpha = rgbaspace.alpha;function clamp( value, prop, alwaysAllowEmpty ) {var type = propTypes[ prop.type ] || {},allowEmpty = prop.empty || alwaysAllowEmpty;if ( allowEmpty && value == null ) {return null;}if ( prop.def && value == null ) {return prop.def;}if ( type.floor ) {value = ~~value;} else {value = parseFloat( value );}if ( value == null || isNaN( value ) ) {return prop.def;}if ( type.mod ) {value = value % type.mod;return value < 0 ? type.mod + value : value;}return type.min > value ? type.min : type.max < value ? type.max : value;}color.fn = color.prototype = {constructor: color,parse: function( red, green, blue, alpha ) {if ( red === undefined ) {this._rgba = [ null, null, null, null ];return this;}if ( red instanceof jQuery || red.nodeType ) {red = red instanceof jQuery ? red.css( green ) : jQuery( red ).css( green );green = undefined;}var inst = this,type = jQuery.type( red ),rgba = this._rgba = [],source;if ( green !== undefined ) {red = [ red, green, blue, alpha ];type = "array";}if ( type === "string" ) {red = red.toLowerCase();each( stringParsers, function( i, parser ) {var match = parser.re.exec( red ),values = match && parser.parse( match ),parsed,spaceName = parser.space || "rgba",cache = spaces[ spaceName ].cache;if ( values ) {parsed = inst[ spaceName ]( values );inst[ cache ] = parsed[ cache ];rgba = inst._rgba = parsed._rgba;return false;}});if ( rgba.length !== 0 ) {if ( Math.max.apply( Math, rgba ) === 0 ) {jQuery.extend( rgba, colors.transparent );}return this;}red = colors[ red ] || colors._default;return this.parse( red );}if ( type === "array" ) {each( rgbaspace, 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 ) {each( space.props, function( key, prop ) {var cache = space.cache;if ( !inst[ cache ] && space.to ) {if ( red[ key ] == null || key === "alpha") {return;}inst[ cache ] = space.to( inst._rgba );}inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );});});}return this;}},is: function( compare ) {var is = color( compare ),same = true,myself = this;each( spaces, function( _, space ) {var isCache = is[ space.cache ],localCache;if (isCache) {localCache = myself[ space.cache ] || space.to && space.to( myself._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 ],start = this[ space.cache ] || space.to( this._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 ( endValue === null ) {return;}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[ prop.idx ] = clamp( ( endValue - startValue ) * distance + startValue, prop );}});return this[ spaceName ]( result );},blend: function( opaque ) {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;}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, i ) {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;function hue2rgb( p, q, h ) {h = ( h + 1 ) % 1;if ( h * 6 < 1 ) {return p + (q - p) * 6 * h;}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;}if ( l === 0 || l === 1 ) {s = l;} 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,r, g, b;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;color.fn[ spaceName ] = function( value ) {if ( to && !this[ cache ] ) {this[ cache ] = to( this._rgba );}if ( value === undefined ) {return this[ cache ].slice();}var type = jQuery.type( value ),arr = ( type === "array" || type === "object" ) ? value : arguments,local = this[ cache ].slice(),ret;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 );}};each( props, function( key, prop ) {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 );};});});each( stepHooks, function( i, hook ) {jQuery.cssHooks[ hook ] = {set: function( elem, value ) {value = color( value );if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {var backgroundColor,curElem = hook === "backgroundColor" ? elem.parentNode : elem;do {backgroundColor = jQuery.curCSS( curElem, "backgroundColor" );} while (( backgroundColor === "" || backgroundColor === "transparent" ) &&( curElem = curElem.parentNode ) &&curElem.style);value = value.blend( backgroundColor && backgroundColor !== "transparent" ? backgroundColor : "_default" );} value = value.toRgbaString();elem.style[ hook ] = value;}};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 ) );};});jQuery(function() {var div = document.createElement( "div" ),div_style = div.style;div_style.cssText = "background-color:rgba(1,1,1,.5)";support.rgba = div_style.backgroundColor.indexOf( "rgba" ) > -1;});})( jQuery );
