Add color customization to the CAPTCHA helper

Ref: Issue #867 & PRs #1405, #2485
diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php
index f3b9c6c..2d2ae77 100644
--- a/system/helpers/captcha_helper.php
+++ b/system/helpers/captcha_helper.php
@@ -43,15 +43,31 @@
 	/**
 	 * Create CAPTCHA
 	 *
-	 * @param	array	array of data for the CAPTCHA
-	 * @param	string	path to create the image in
-	 * @param	string	URL to the CAPTCHA image folder
-	 * @param	string	server path to font
+	 * @param	array	$data		data for the CAPTCHA
+	 * @param	string	$img_path	path to create the image in
+	 * @param	string	$img_url	URL to the CAPTCHA image folder
+	 * @param	string	$font_path	server path to font
 	 * @return	string
 	 */
 	function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')
 	{
-		$defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'word_length' => 8, 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
+		$defaults = array(
+			'word'		=> '',
+			'img_path'	=> '',
+			'img_url'	=> '',
+			'img_width'	=> '150',
+			'img_height'	=> '30',
+			'font_path'	=> '',
+			'expiration'	=> 7200,
+			'word_length'	=> 8,
+			'pool'		=> '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+			'colors'	=> array(
+				'background'	=> array(255,255,255),
+				'border'	=> array(153,102,102),
+				'text'		=> array(204,153,153),
+				'grid'		=> array(255,182,182)
+			)
+		);
 
 		foreach ($defaults as $key => $val)
 		{
@@ -122,15 +138,19 @@
 
 		// -----------------------------------
 		//  Assign colors
-		// -----------------------------------
-		$bg_color	= imagecolorallocate($im, 255, 255, 255);
-		$border_color	= imagecolorallocate($im, 153, 102, 102);
-		$text_color	= imagecolorallocate($im, 204, 153, 153);
-		$grid_color	= imagecolorallocate($im, 255, 182, 182);
-		$shadow_color	= imagecolorallocate($im, 255, 240, 240);
+		// ----------------------------------
 
-		//  Create the rectangle
-		ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color);
+		is_array($colors) OR $colors = $defaults['colors'];
+
+		foreach (array_keys($default['colors']) as $key)
+		{
+			// Check for a possible missing value
+			is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key];
+			$colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]);
+		}
+
+		// Create the rectangle
+		ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']);
 
 		// -----------------------------------
 		//  Create the spiral pattern
@@ -151,7 +171,7 @@
 			$rad1 = $radius * (($i + 1) / $points);
 			$x1 = ($rad1 * cos($theta)) + $x_axis;
 			$y1 = ($rad1 * sin($theta)) + $y_axis;
-			imageline($im, $x, $y, $x1, $y1, $grid_color);
+			imageline($im, $x, $y, $x1, $y1, $colors['grid']);
 			$theta -= $thetac;
 		}
 
@@ -178,19 +198,19 @@
 			if ($use_font === FALSE)
 			{
 				$y = rand(0 , $img_height / 2);
-				imagestring($im, $font_size, $x, $y, $word[$i], $text_color);
+				imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']);
 				$x += ($font_size * 2);
 			}
 			else
 			{
 				$y = rand($img_height / 2, $img_height - 3);
-				imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, $word[$i]);
+				imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]);
 				$x += $font_size;
 			}
 		}
 
 		// Create the border
-		imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $border_color);
+		imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']);
 
 		// -----------------------------------
 		//  Generate the image
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index 6f08dcb..4cbbda7 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -123,10 +123,14 @@
       - Deprecated function ``trim_slashes()`` - it's just an alias for PHP's native ``trim()`` (with a slash as its second argument).
       - Deprecated randomization type options **unique** and **encrypt** for funcion :php:func:`random_string()` (they are only aliases for **md5** and **sha1** respectively).
 
+   -  :doc:`CAPTCHA Helper <helpers/captcha_helper>` changes include:
+
+      - Added *word_length* and *pool* options to allow customization of the generated word.
+      - Added *colors* configuration to allow customization for the *background*, *border*, *text* and *grid* colors.
+
    -  :doc:`Directory Helper <helpers/directory_helper>` :php:func:`directory_map()` will now append ``DIRECTORY_SEPARATOR`` to directory names in the returned array.
    -  :doc:`Language Helper <helpers/language_helper>` :php:func:`lang()` now accepts an optional list of additional HTML attributes.
    -  Deprecated the :doc:`Email Helper <helpers/email_helper>` as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively.
-   -  :doc:`CAPTCHA Helper <helpers/captcha_helper>` :php:func:`create_captcha` added word_length and pool options for setting length of randomly generated captcha word, and what characters to select from.
 
 -  Database
 
diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst
index ca24e01..27e11e6 100644
--- a/user_guide_src/source/helpers/captcha_helper.rst
+++ b/user_guide_src/source/helpers/captcha_helper.rst
@@ -64,7 +64,15 @@
 		'img_height'	=> 30,
 		'expiration'	=> 7200,
 		'word_length'	=> 8,
-		'pool'	=> '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+		'pool'		=> '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+
+		// White background and border, black text and shadow, red grid
+		'colors'	=> array(
+			'background' => array(255, 255, 255),
+			'border' => array(255, 255, 255),
+			'text' => array(0, 0, 0),
+			'grid' => array(255, 40, 40)
+		)
 	);
 
 	$cap = create_captcha($vals);
@@ -82,6 +90,7 @@
    in the captcha folder before it will be deleted. The default is two
    hours.
 -  **word_length** defaults to 8, **pool** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+-  If any of the **colors** values is missing, it will be replaced by the default.
 
 Adding a Database
 -----------------