Fix #1624 and clear-up the form validation docs (manually applying #1603)
diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php
index 91f46b6..c1bf519 100644
--- a/system/libraries/Form_validation.php
+++ b/system/libraries/Form_validation.php
@@ -957,15 +957,15 @@
 	/**
 	 * Match one field to another
 	 *
-	 * @param	string
-	 * @param	string	field
+	 * @param	string	$str	string to compare against
+	 * @param	string	$field
 	 * @return	bool
 	 */
 	public function matches($str, $field)
 	{
-		$validation_array = empty($this->validation_data) ? $_POST : $this->validation_data;
-
-		return isset($validation_array[$field]) ? ($str === $validation_array[$field]) : FALSE;
+		return isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])
+			? ($str === $this->_field_data[$field]['postdata'])
+			: FALSE;
 	}
 
 	// --------------------------------------------------------------------
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index 3d6538e..0d83242 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -386,6 +386,7 @@
 -  Fixed a bug (#1811) - :doc:`URI Library <libraries/uri>` didn't properly cache segments for ``uri_to_assoc()`` and ``ruri_to_assoc()``.
 -  Fixed a bug (#1506) - :doc:`Form Helpers <helpers/form_helper>` set empty *name* attributes.
 -  Fixed a bug (#59) - :doc:`Query Builder <database/query_builder>` method ``count_all_results()`` ignored the DISTINCT clause.
+-  Fixed a bug (#1624) - :doc:`Form Validation Library <libraries/form_validation>` rule **matches** didn't property handle array field names.
 
 Version 2.1.3
 =============
diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst
index 6c6743d..4d19402 100644
--- a/user_guide_src/source/libraries/form_validation.rst
+++ b/user_guide_src/source/libraries/form_validation.rst
@@ -254,30 +254,30 @@
 
 Before moving on it should be noted that the rule setting function can
 be passed an array if you prefer to set all your rules in one action. If
-you use this approach you must name your array keys as indicated::
+you use this approach, you must name your array keys as indicated::
 
 	$config = array(
-	               array(
-	                     'field'   => 'username', 
-	                     'label'   => 'Username', 
-	                     'rules'   => 'required'
-	                  ),
-	               array(
-	                     'field'   => 'password', 
-	                     'label'   => 'Password', 
-	                     'rules'   => 'required'
-	                  ),
-	               array(
-	                     'field'   => 'passconf', 
-	                     'label'   => 'Password Confirmation', 
-	                     'rules'   => 'required'
-	                  ),   
-	               array(
-	                     'field'   => 'email', 
-	                     'label'   => 'Email', 
-	                     'rules'   => 'required'
-	                  )
-	            );
+		array(
+			'field' => 'username',
+			'label' => 'Username',
+			'rules' => 'required'
+		),
+		array(
+			'field' => 'password',
+			'label' => 'Password',
+			'rules' => 'required'
+		),
+		array(
+			'field' => 'passconf',
+			'label' => 'Password Confirmation',
+			'rules' => 'required'
+		),
+		array(
+			'field' => 'email',
+			'label' => 'Email',
+			'rules' => 'required'
+		)
+	);
 
 	$this->form_validation->set_rules($config);
 
@@ -291,7 +291,6 @@
 	$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');
 	$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
 	$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
-	
 
 The above code sets the following rules:
 
@@ -560,11 +559,10 @@
 
 #. **Set delimiters in a config file**
    You can add your error delimiters in application/config/form_validation.php as follows::
-   
+
       $config['error_prefix'] = '<div class="error_prefix">';
       $config['error_suffix'] = '</div>';
 
-
 Showing Errors Individually
 ===========================
 
@@ -592,8 +590,8 @@
 If there are no errors, nothing will be shown. If there is an error, the
 message will appear.
 
-**Important Note:** If you use an array as the name of a form field, you
-must supply it as an array to the function. Example::
+.. important:: If you use an array as the name of a form field, you
+	must supply it as an array to the function. Example::
 
 	<?php echo form_error('options[size]'); ?>
 	<input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />
@@ -603,20 +601,20 @@
 Validating an Array (other than $_POST)
 =======================================
 
-Sometimes you may want to validate an array that does not originate from $_POST data.
+Sometimes you may want to validate an array that does not originate from ``$_POST`` data.
 
 In this case, you can specify the array to be validated::
-	
+
 	$data = array(
-			'username' => 'johndoe',
-			'password' => 'mypassword',
-		 	'passconf' => 'mypassword'
-		);
+		'username' => 'johndoe',
+		'password' => 'mypassword',
+		'passconf' => 'mypassword'
+	);
 
 	$this->form_validation->set_data($data);
 
-Creating validation rules, running the validation and retrieving error messages works the same whether you are
-validating $_POST data or an array.
+Creating validation rules, running the validation and retrieving error messages works the
+same whether you are validating ``$_POST`` data or an array.
 
 **Important Note:** If you want to validate more than one array during a single execution, then you should	
 call the reset_validation() function before setting up rules and validating the new array.
@@ -644,32 +642,32 @@
 the validation array will have this prototype::
 
 	$config = array(
-	               array(
-	                     'field'   => 'username', 
-	                     'label'   => 'Username', 
-	                     'rules'   => 'required'
-	                  ),
-	               array(
-	                     'field'   => 'password', 
-	                     'label'   => 'Password', 
-	                     'rules'   => 'required'
-	                  ),
-	               array(
-	                     'field'   => 'passconf', 
-	                     'label'   => 'Password Confirmation', 
-	                     'rules'   => 'required'
-	                  ),   
-	               array(
-	                     'field'   => 'email', 
-	                     'label'   => 'Email', 
-	                     'rules'   => 'required'
-	                  )
-	            );
+		array(
+			'field' => 'username',
+			'label' => 'Username',
+			'rules' => 'required'
+		),
+		array(
+			'field' => 'password',
+			'label' => 'Password',
+			'rules' => 'required'
+		),
+		array(
+			'field' => 'passconf',
+			'label' => 'Password Confirmation',
+			'rules' => 'required'
+		),
+		array(
+			'field' => 'email',
+			'label' => 'Email',
+			'rules' => 'required'
+		)
+	);
 
 Your validation rule file will be loaded automatically and used when you
-call the run() function.
+call the ``run()`` method.
 
-Please note that you MUST name your array $config.
+Please note that you MUST name your ``$config`` array.
 
 Creating Sets of Rules
 ======================
@@ -729,45 +727,44 @@
 Calling a Specific Rule Group
 =============================
 
-In order to call a specific group you will pass its name to the run()
-function. For example, to call the signup rule you will do this::
+In order to call a specific group you will pass its name to the ``run()``
+method. For example, to call the signup rule you will do this::
 
 	if ($this->form_validation->run('signup') == FALSE)
 	{
-	   $this->load->view('myform');
+		$this->load->view('myform');
 	}
 	else
 	{
-	   $this->load->view('formsuccess');
+		$this->load->view('formsuccess');
 	}
 
 Associating a Controller Function with a Rule Group
 ===================================================
 
 An alternate (and more automatic) method of calling a rule group is to
-name it according to the controller class/function you intend to use it
+name it according to the controller class/method you intend to use it
 with. For example, let's say you have a controller named Member and a
-function named signup. Here's what your class might look like::
+method named signup. Here's what your class might look like::
 
 	<?php
 
 	class Member extends CI_Controller {
 
-	   function signup()
-	   {      
-	      $this->load->library('form_validation');
+		function signup()
+		{
+			$this->load->library('form_validation');
 
-	      if ($this->form_validation->run() == FALSE)
-	      {
-	         $this->load->view('myform');
-	      }
-	      else
-	      {
-	         $this->load->view('formsuccess');
-	      }
-	   }
+			if ($this->form_validation->run() == FALSE)
+			{
+				$this->load->view('myform');
+			}
+			else
+			{
+				$this->load->view('formsuccess');
+			}
+		}
 	}
-	?>
 
 In your validation config file, you will name your rule group
 member/signup::
@@ -913,6 +910,9 @@
 	to two parameters, where at least one is required (to pass
 	the field data).
 
+.. note:: When using the **matches** rule, the form item specified
+	to compare against must already be defined.
+
 ******************
 Prepping Reference
 ******************
@@ -945,7 +945,7 @@
 functions.
 
 $this->form_validation->set_rules();
-======================================
+====================================
 
 	.. php:method:: set_rules ($field, $label = '', $rules = '')
 
@@ -953,7 +953,7 @@
 		:param string $label: The field label
 		:param mixed $rules: The rules, as a string with rules separated by a pipe "|", or an array or rules.
 		:rtype: Object
-	
+
 		Permits you to set validation rules, as described in the tutorial
 		sections above:
 
@@ -961,19 +961,19 @@
 	-  :ref:`saving-groups`
 
 $this->form_validation->run();
-===============================
+==============================
 	
 	.. php:method:: run ($group = '')
 
 		:param string $group: The name of the validation group to run
 		:rtype: Boolean
-	
+
 		Runs the validation routines. Returns boolean TRUE on success and FALSE
 		on failure. You can optionally pass the name of the validation group via
 		the function, as described in: :ref:`saving-groups`
 
 $this->form_validation->set_message();
-========================================
+======================================
 	
 	.. php:method:: set_message ($lang, $val = '')
 
@@ -984,7 +984,7 @@
 		Permits you to set custom error messages. See :ref:`setting-error-messages`
 
 $this->form_validation->set_data();
-========================================
+===================================
 	
 	.. php:method:: set_data ($data = '')
 
@@ -996,13 +996,13 @@
 $this->form_validation->reset_validation();
 ===========================================
 
- .. php:method:: reset_validation ()
+	.. php:method:: reset_validation ()
 
-    Permits you to reset the validation when you validate more than one array.
-	This function should be called before validating each new array.
+		Permits you to reset the validation when you validate more than one array.
+		This method should be called before validating each new array.
 
 $this->form_validation->error_array();
-========================================
+======================================
 	
 	.. php:method:: error_array ()
 
@@ -1021,7 +1021,7 @@
 **do not** require you to prepend them with $this->form_validation.
 
 form_error()
-=============
+============
 
 Shows an individual error message associated with the field name
 supplied to the function. Example::
@@ -1032,7 +1032,7 @@
 :ref:`changing-delimiters` section above.
 
 validation_errors()
-====================
+===================
 
 Shows all error messages as a string: Example::
 
@@ -1042,7 +1042,7 @@
 :ref:`changing-delimiters` section above.
 
 set_value()
-============
+===========
 
 Permits you to set the value of an input form or textarea. You must
 supply the field name via the first parameter of the function. The
@@ -1054,7 +1054,7 @@
 The above form will show "0" when loaded for the first time.
 
 set_select()
-=============
+============
 
 If you use a <select> menu, this function permits you to display the
 menu item that was selected. The first parameter must contain the name
@@ -1071,7 +1071,7 @@
 	</select>
 
 set_checkbox()
-===============
+==============
 
 Permits you to display a checkbox in the state it was submitted. The
 first parameter must contain the name of the checkbox, the second
@@ -1082,7 +1082,7 @@
 	<input type="checkbox" name="mycheck[]" value="2" <?php echo set_checkbox('mycheck[]', '2'); ?> />
 
 set_radio()
-============
+===========
 
 Permits you to display radio buttons in the state they were submitted.
 This function is identical to the **set_checkbox()** function above.
@@ -1090,4 +1090,4 @@
 ::
 
 	<input type="radio" name="myradio" value="1" <?php echo  set_radio('myradio', '1', TRUE); ?> />
-	<input type="radio" name="myradio" value="2" <?php echo  set_radio('myradio', '2'); ?> />
+	<input type="radio" name="myradio" value="2" <?php echo  set_radio('myradio', '2'); ?> />
\ No newline at end of file