docs: function (color, elem, prop) {
  		var colorObject,
  			regexRgba = /^rgba/,
  			markup;
  
  		if (color && color.linearGradient) {
  
  			var stopColor,
  				stopOpacity,
  				linearGradient = color.linearGradient,
  				angle,
  				color1,
  				opacity1,
  				color2,
  				opacity2;
  
  			each(color.stops, function (stop, i) {
  				if (regexRgba.test(stop[1])) {
  					colorObject = Color(stop[1]);
  					stopColor = colorObject.get('rgb');
  					stopOpacity = colorObject.get('a');
  				} else {
  					stopColor = stop[1];
  					stopOpacity = 1;
  				}
  
  				if (!i) { // first
  					color1 = stopColor;
  					opacity1 = stopOpacity;
  				} else {
  					color2 = stopColor;
  					opacity2 = stopOpacity;
  				}
  			});
  
  
  
  			// calculate the angle based on the linear vector
  			angle = 90  - math.atan(
  				(linearGradient[3] - linearGradient[1]) / // y vector
  				(linearGradient[2] - linearGradient[0]) // x vector
  				) * 180 / mathPI;
  
  			// when colors attribute is used, the meanings of opacity and o:opacity2
  			// are reversed.
  			markup = ['<', prop, ' colors="0% ', color1, ',100% ', color2, '" angle="', angle,
  				'" opacity="', opacity2, '" o:opacity2="', opacity1,
  				'" type="gradient" focus="100%" />'];
  			createElement(this.prepVML(markup), null, null, elem);
  
  
  
  		// if the color is an rgba color, split it and add a fill node
  		// to hold the opacity component
  		} else if (regexRgba.test(color) && elem.tagName !== 'IMG') {
  
  			colorObject = Color(color);
  
  			markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>'];
  			createElement(this.prepVML(markup), null, null, elem);
  
  			return colorObject.get('rgb');
  
  
  		} else {
  			var strokeNodes = elem.getElementsByTagName(prop);
  			if (strokeNodes.length) {
  				strokeNodes[0].opacity = 1;
  			}
  			return color;
  		}
  
  	}