docs: function (input) {
  	// declare variables
  	var rgba = [], result;
  
  	/**
  	 * Parse the input color to rgba array
  	 * @param {String} input
  	 */
  	function init(input) {
  
  		// rgba
  		result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(input);
  		if (result) {
  			rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
  		} else { // hex
  			result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(input);
  			if (result) {
  				rgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
  			}
  		}
  
  	}
  	/**
  	 * Return the color a specified format
  	 * @param {String} format
  	 */
  	function get(format) {
  		var ret;
  
  		// it's NaN if gradient colors on a column chart
  		if (rgba && !isNaN(rgba[0])) {
  			if (format === 'rgb') {
  				ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
  			} else if (format === 'a') {
  				ret = rgba[3];
  			} else {
  				ret = 'rgba(' + rgba.join(',') + ')';
  			}
  		} else {
  			ret = input;
  		}
  		return ret;
  	}
  
  	/**
  	 * Brighten the color
  	 * @param {Number} alpha
  	 */
  	function brighten(alpha) {
  		if (isNumber(alpha) && alpha !== 0) {
  			var i;
  			for (i = 0; i < 3; i++) {
  				rgba[i] += pInt(alpha * 255);
  
  				if (rgba[i] < 0) {
  					rgba[i] = 0;
  				}
  				if (rgba[i] > 255) {
  					rgba[i] = 255;
  				}
  			}
  		}
  		return this;
  	}
  	/**
  	 * Set the color's opacity to a given alpha value
  	 * @param {Number} alpha
  	 */
  	function setOpacity(alpha) {
  		rgba[3] = alpha;
  		return this;
  	}
  
  	// initialize: parse the input
  	init(input);
  
  	// public methods
  	return {
  		get: get,
  		brighten: brighten,
  		setOpacity: setOpacity
  	};
  }