Merge pull request #796 from narfbg/develop

Optimize display_errors() in Image_lib, Trackback and Upload libraries
diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php
index 717ccd9..01a0cb8 100644
--- a/system/libraries/Cart.php
+++ b/system/libraries/Cart.php
@@ -1,13 +1,13 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 /**
  * CodeIgniter
  *
  * An open source application development framework for PHP 5.1.6 or newer
  *
  * NOTICE OF LICENSE
- * 
+ *
  * Licensed under the Open Software License version 3.0
- * 
+ *
  * This source file is subject to the Open Software License (OSL 3.0) that is
  * bundled with this package in the files license.txt / license.rst.  It is
  * also available through the world wide web at this URL:
@@ -39,13 +39,13 @@
 class CI_Cart {
 
 	// These are the regular expression rules that we use to validate the product ID and product name
-	var $product_id_rules	= '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods
-	var $product_name_rules	= '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods
-	var $product_name_safe  = true; // only allow safe product names
+	public $product_id_rules	= '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods
+	public $product_name_rules	= '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods
+	public $product_name_safe  = true; // only allow safe product names
 
 	// Private variables.  Do not change!
-	var $CI;
-	var $_cart_contents	= array();
+	private $CI;
+	private $_cart_contents	= array();
 
 
 	/**
@@ -59,28 +59,17 @@
 		$this->CI =& get_instance();
 
 		// Are any config settings being passed manually?  If so, set them
-		$config = array();
-		if (count($params) > 0)
-		{
-			foreach ($params as $key => $val)
-			{
-				$config[$key] = $val;
-			}
-		}
+		$config = is_array($params) ? $params : array();
 
 		// Load the Sessions class
 		$this->CI->load->library('session', $config);
 
-		// Grab the shopping cart array from the session table, if it exists
-		if ($this->CI->session->userdata('cart_contents') !== FALSE)
-		{
-			$this->_cart_contents = $this->CI->session->userdata('cart_contents');
-		}
-		else
+		// Grab the shopping cart array from the session table
+		$this->_cart_contents = $this->CI->session->userdata('cart_contents');
+		if ($this->_cart_contents === FALSE)
 		{
 			// No cart exists so we'll set some base values
-			$this->_cart_contents['cart_total'] = 0;
-			$this->_cart_contents['total_items'] = 0;
+			$this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);
 		}
 
 		log_message('debug', "Cart Class Initialized");
@@ -95,10 +84,10 @@
 	 * @param	array
 	 * @return	bool
 	 */
-	function insert($items = array())
+	public function insert($items = array())
 	{
 		// Was any cart data passed? No? Bah...
-		if ( ! is_array($items) OR count($items) == 0)
+		if ( ! is_array($items) OR count($items) === 0)
 		{
 			log_message('error', 'The insert method must be passed an array containing data.');
 			return FALSE;
@@ -132,7 +121,7 @@
 		}
 
 		// Save the cart data if the insert was successful
-		if ($save_cart == TRUE)
+		if ($save_cart === TRUE)
 		{
 			$this->_save_cart();
 			return isset($rowid) ? $rowid : TRUE;
@@ -150,10 +139,10 @@
 	 * @param	array
 	 * @return	bool
 	 */
-	function _insert($items = array())
+	private function _insert($items = array())
 	{
 		// Was any cart data passed? No? Bah...
-		if ( ! is_array($items) OR count($items) == 0)
+		if ( ! is_array($items) OR count($items) === 0)
 		{
 			log_message('error', 'The insert method must be passed an array containing data.');
 			return FALSE;
@@ -170,10 +159,8 @@
 
 		// --------------------------------------------------------------------
 
-		// Prep the quantity. It can only be a number.  Duh...
-		$items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty']));
-		// Trim any leading zeros
-		$items['qty'] = trim(preg_replace('/(^[0]+)/i', '', $items['qty']));
+		// Prep the quantity. It can only be a number.  Duh... also trim any leading zeros
+		$items['qty'] = (float) $items['qty'];
 
 		// If the quantity is zero or blank there's nothing for us to do
 		if ( ! is_numeric($items['qty']) OR $items['qty'] == 0)
@@ -186,7 +173,7 @@
 		// Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods
 		// Not totally sure we should impose this rule, but it seems prudent to standardize IDs.
 		// Note: These can be user-specified by setting the $this->product_id_rules variable.
-		if ( ! preg_match("/^[".$this->product_id_rules."]+$/i", $items['id']))
+		if ( ! preg_match('/^['.$this->product_id_rules.']+$/i', $items['id']))
 		{
 			log_message('error', 'Invalid product ID.  The product ID can only contain alpha-numeric characters, dashes, and underscores');
 			return FALSE;
@@ -196,7 +183,7 @@
 
 		// Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods.
 		// Note: These can be user-specified by setting the $this->product_name_rules variable.
-		if ( $this->product_name_safe && ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name']))
+		if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i', $items['name']))
 		{
 			log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces');
 			return FALSE;
@@ -204,10 +191,8 @@
 
 		// --------------------------------------------------------------------
 
-		// Prep the price.  Remove anything that isn't a number or decimal point.
-		$items['price'] = trim(preg_replace('/([^0-9\.])/i', '', $items['price']));
-		// Trim any leading zeros
-		$items['price'] = trim(preg_replace('/(^[0]+)/i', '', $items['price']));
+		// Prep the price. Remove leading zeros and anything that isn't a number or decimal point.
+		$items['price'] = (float) $items['price'];
 
 		// Is the price a valid number?
 		if ( ! is_numeric($items['price']))
@@ -244,33 +229,13 @@
 
 		// Now that we have our unique "row ID", we'll add our cart items to the master array
 		// grab quantity if it's already there and add it on
-		if (isset($this->_cart_contents[$rowid]['qty']))
-		{
-			// set our old quantity
-			$old_quantity = (int)$this->_cart_contents[$rowid]['qty'];
-		}
-		else
-		{
-			// we have no old quantity but - we don't want to throw an error
-			$old_quantity = 0;
-		}
-		
-		// let's unset this first, just to make sure our index contains only the data from this submission
-		unset($this->_cart_contents[$rowid]);
+		$old_quantity = isset($this->_cart_contents[$rowid]['qty']) ? (int) $this->_cart_contents[$rowid]['qty'] : 0;
 
-		// Create a new index with our new row ID
-		$this->_cart_contents[$rowid]['rowid'] = $rowid;
+		// Re-create the entry, just to make sure our index contains only the data from this submission
+		$items['rowid'] = $rowid;
+		$items['qty'] += $old_quantity;
+		$this->_cart_contents[$rowid] = $items;
 
-		// And add the new items to the cart array
-		foreach ($items as $key => $val)
-		{
-			$this->_cart_contents[$rowid][$key] = $val;
-		}
-		
-		// add old quantity back in
-		$this->_cart_contents[$rowid]['qty'] = ($this->_cart_contents[$rowid]['qty'] + $old_quantity);
-		
-		// Woot!
 		return $rowid;
 	}
 
@@ -289,10 +254,10 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function update($items = array())
+	public function update($items = array())
 	{
 		// Was any cart data passed?
-		if ( ! is_array($items) OR count($items) == 0)
+		if ( ! is_array($items) OR count($items) === 0)
 		{
 			return FALSE;
 		}
@@ -302,9 +267,9 @@
 		// determine the array type is by looking for a required array key named "id".
 		// If it's not found we assume it's a multi-dimensional array
 		$save_cart = FALSE;
-		if (isset($items['rowid']) AND isset($items['qty']))
+		if (isset($items['rowid'], $items['qty']))
 		{
-			if ($this->_update($items) == TRUE)
+			if ($this->_update($items) === TRUE)
 			{
 				$save_cart = TRUE;
 			}
@@ -313,9 +278,9 @@
 		{
 			foreach ($items as $val)
 			{
-				if (is_array($val) AND isset($val['rowid']) AND isset($val['qty']))
+				if (is_array($val) && isset($val['rowid'], $val['qty']))
 				{
-					if ($this->_update($val) == TRUE)
+					if ($this->_update($val) === TRUE)
 					{
 						$save_cart = TRUE;
 					}
@@ -324,7 +289,7 @@
 		}
 
 		// Save the cart data if the insert was successful
-		if ($save_cart == TRUE)
+		if ($save_cart === TRUE)
 		{
 			$this->_save_cart();
 			return TRUE;
@@ -347,7 +312,7 @@
 	 * @param	array
 	 * @return	bool
 	 */
-	function _update($items = array())
+	private function _update($items = array())
 	{
 		// Without these array indexes there is nothing we can do
 		if ( ! isset($items['qty']) OR ! isset($items['rowid']) OR ! isset($this->_cart_contents[$items['rowid']]))
@@ -356,7 +321,7 @@
 		}
 
 		// Prep the quantity
-		$items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']);
+		$items['qty'] = (float) $items['qty'];
 
 		// Is the quantity a number?
 		if ( ! is_numeric($items['qty']))
@@ -393,15 +358,10 @@
 	 * @access	private
 	 * @return	bool
 	 */
-	function _save_cart()
+	private function _save_cart()
 	{
-		// Unset these so our total can be calculated correctly below
-		unset($this->_cart_contents['total_items']);
-		unset($this->_cart_contents['cart_total']);
-
 		// Lets add up the individual prices and set the cart sub-total
-		$total = 0;
-		$items = 0;
+		$this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0;
 		foreach ($this->_cart_contents as $key => $val)
 		{
 			// We make sure the array contains the proper indexes
@@ -410,17 +370,11 @@
 				continue;
 			}
 
-			$total += ($val['price'] * $val['qty']);
-			$items += $val['qty'];
-
-			// Set the subtotal
+			$this->_cart_contents['cart_total'] += ($val['price'] * $val['qty']);
+			$this->_cart_contents['total_items'] += $val['qty'];
 			$this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']);
 		}
 
-		// Set the cart total and total items.
-		$this->_cart_contents['total_items'] = $items;
-		$this->_cart_contents['cart_total'] = $total;
-
 		// Is our cart empty?  If so we delete it from the session
 		if (count($this->_cart_contents) <= 2)
 		{
@@ -446,13 +400,13 @@
 	 * @access	public
 	 * @return	integer
 	 */
-	function total()
+	public function total()
 	{
 		return $this->_cart_contents['cart_total'];
 	}
-	
+
 	// --------------------------------------------------------------------
-	
+
 	/**
 	 * Remove Item
 	 *
@@ -463,16 +417,12 @@
 	 */
 	 public function remove($rowid)
 	 {
-		// just do an unset 
+		// unset & save
 		unset($this->_cart_contents[$rowid]);
-		
-		// we need to save the cart now we've made our changes
 		$this->_save_cart();
-		
-		// completed
-		return true;
+		return TRUE;
 	 }
-	 
+
 	// --------------------------------------------------------------------
 
 	/**
@@ -483,7 +433,7 @@
 	 * @access	public
 	 * @return	integer
 	 */
-	function total_items()
+	public function total_items()
 	{
 		return $this->_cart_contents['total_items'];
 	}
@@ -498,19 +448,10 @@
 	 * @access	public
 	 * @return	array
 	 */
-	function contents($newest_first = false)
+	public function contents($newest_first = FALSE)
 	{
 		// do we want the newest first?
-		if($newest_first)
-		{
-			// reverse the array
-			$cart = array_reverse($this->_cart_contents);
-		}
-		else
-		{
-			// just added first to last
-			$cart = $this->_cast_contents;
-		}
+		$cart = ($newest_first) ? array_reverse($this->_cart_contents) : $this->_cart_contents;
 
 		// Remove these so they don't create a problem when showing the cart table
 		unset($cart['total_items']);
@@ -528,16 +469,11 @@
 	 * that has options associated with it.
 	 *
 	 * @access	public
-	 * @return	array
+	 * @return	bool
 	 */
-	function has_options($rowid = '')
+	public function has_options($rowid = '')
 	{
-		if ( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0)
-		{
-			return FALSE;
-		}
-
-		return TRUE;
+		return (isset($this->_cart_contents[$rowid]['options']) && count($this->_cart_contents[$rowid]['options']) !== 0) ? TRUE : FALSE;
 	}
 
 	// --------------------------------------------------------------------
@@ -550,14 +486,9 @@
 	 * @access	public
 	 * @return	array
 	 */
-	function product_options($rowid = '')
+	public function product_options($rowid = '')
 	{
-		if ( ! isset($this->_cart_contents[$rowid]['options']))
-		{
-			return array();
-		}
-
-		return $this->_cart_contents[$rowid]['options'];
+		return isset($this->_cart_contents[$rowid]['options']) ? $this->_cart_contents[$rowid]['options'] : array();
 	}
 
 	// --------------------------------------------------------------------
@@ -568,9 +499,9 @@
 	 * Returns the supplied number with commas and a decimal point.
 	 *
 	 * @access	public
-	 * @return	integer
+	 * @return	string
 	 */
-	function format_number($n = '')
+	public function format_number($n = '')
 	{
 		if ($n == '')
 		{
@@ -578,7 +509,7 @@
 		}
 
 		// Remove anything that isn't a number or decimal point.
-		$n = trim(preg_replace('/([^0-9\.])/i', '', $n));
+		$n = (float) $n;
 
 		return number_format($n, 2, '.', ',');
 	}
@@ -591,15 +522,11 @@
 	 * Empties the cart and kills the session
 	 *
 	 * @access	public
-	 * @return	null
+	 * @return	void
 	 */
-	function destroy()
+	public function destroy()
 	{
-		unset($this->_cart_contents);
-
-		$this->_cart_contents['cart_total'] = 0;
-		$this->_cart_contents['total_items'] = 0;
-
+		$this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);
 		$this->CI->session->unset_userdata('cart_contents');
 	}
 
@@ -608,4 +535,4 @@
 // END Cart Class
 
 /* End of file Cart.php */
-/* Location: ./system/libraries/Cart.php */
\ No newline at end of file
+/* Location: ./system/libraries/Cart.php */
diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php
index 8df137e..183a959 100644
--- a/system/libraries/Driver.php
+++ b/system/libraries/Driver.php
@@ -1,13 +1,13 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 /**
  * CodeIgniter
  *
  * An open source application development framework for PHP 5.1.6 or newer
  *
  * NOTICE OF LICENSE
- * 
+ *
  * Licensed under the Open Software License version 3.0
- * 
+ *
  * This source file is subject to the Open Software License (OSL 3.0) that is
  * bundled with this package in the files license.txt / license.rst.  It is
  * also available through the world wide web at this URL:
@@ -46,7 +46,7 @@
 
 	// The first time a child is used it won't exist, so we instantiate it
 	// subsequents calls will go straight to the proper child.
-	function __get($child)
+	public function __get($child)
 	{
 		if ( ! isset($this->lib_name))
 		{
@@ -55,11 +55,11 @@
 
 		// The class will be prefixed with the parent lib
 		$child_class = $this->lib_name.'_'.$child;
-	
+
 		// Remove the CI_ prefix and lowercase
 		$lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name)));
 		$driver_name = strtolower(str_replace('CI_', '', $child_class));
-		
+
 		if (in_array($driver_name, array_map('strtolower', $this->valid_drivers)))
 		{
 			// check and see if the driver is in a separate file
@@ -119,6 +119,7 @@
  * @link
  */
 class CI_Driver {
+
 	protected $parent;
 
 	private $methods = array();
@@ -238,4 +239,4 @@
 // END CI_Driver CLASS
 
 /* End of file Driver.php */
-/* Location: ./system/libraries/Driver.php */
\ No newline at end of file
+/* Location: ./system/libraries/Driver.php */
diff --git a/system/libraries/Email.php b/system/libraries/Email.php
index 631b62e..1066535 100644
--- a/system/libraries/Email.php
+++ b/system/libraries/Email.php
@@ -1,13 +1,13 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 /**
  * CodeIgniter
  *
  * An open source application development framework for PHP 5.1.6 or newer
  *
  * NOTICE OF LICENSE
- * 
+ *
  * Licensed under the Open Software License version 3.0
- * 
+ *
  * This source file is subject to the Open Software License (OSL 3.0) that is
  * bundled with this package in the files license.txt / license.rst.  It is
  * also available through the world wide web at this URL:
@@ -40,54 +40,54 @@
  */
 class CI_Email {
 
-	var	$useragent		= "CodeIgniter";
-	var	$mailpath		= "/usr/sbin/sendmail";	// Sendmail path
-	var	$protocol		= "mail";	// mail/sendmail/smtp
-	var	$smtp_host		= "";		// SMTP Server.  Example: mail.earthlink.net
-	var	$smtp_user		= "";		// SMTP Username
-	var	$smtp_pass		= "";		// SMTP Password
-	var	$smtp_port		= "25";		// SMTP Port
-	var	$smtp_timeout	= 5;		// SMTP Timeout in seconds
-	var	$smtp_crypto	= "";		// SMTP Encryption. Can be null, tls or ssl.
-	var	$wordwrap		= TRUE;		// TRUE/FALSE  Turns word-wrap on/off
-	var	$wrapchars		= "76";		// Number of characters to wrap at.
-	var	$mailtype		= "text";	// text/html  Defines email formatting
-	var	$charset		= "utf-8";	// Default char set: iso-8859-1 or us-ascii
-	var	$multipart		= "mixed";	// "mixed" (in the body) or "related" (separate)
-	var $alt_message	= '';		// Alternative message for HTML emails
-	var	$validate		= FALSE;	// TRUE/FALSE.  Enables email validation
-	var	$priority		= "3";		// Default priority (1 - 5)
-	var	$newline		= "\n";		// Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822)
-	var $crlf			= "\n";		// The RFC 2045 compliant CRLF for quoted-printable is "\r\n".  Apparently some servers,
+	public $useragent		= "CodeIgniter";
+	public $mailpath		= "/usr/sbin/sendmail";	// Sendmail path
+	public $protocol		= "mail";	// mail/sendmail/smtp
+	public $smtp_host		= "";		// SMTP Server.  Example: mail.earthlink.net
+	public $smtp_user		= "";		// SMTP Username
+	public $smtp_pass		= "";		// SMTP Password
+	public $smtp_port		= "25";		// SMTP Port
+	public $smtp_timeout	= 5;		// SMTP Timeout in seconds
+	public $smtp_crypto	= "";		// SMTP Encryption. Can be null, tls or ssl.
+	public $wordwrap		= TRUE;		// TRUE/FALSE  Turns word-wrap on/off
+	public $wrapchars		= "76";		// Number of characters to wrap at.
+	public $mailtype		= "text";	// text/html  Defines email formatting
+	public $charset		= "utf-8";	// Default char set: iso-8859-1 or us-ascii
+	public $multipart		= "mixed";	// "mixed" (in the body) or "related" (separate)
+	public $alt_message	= '';		// Alternative message for HTML emails
+	public $validate		= FALSE;	// TRUE/FALSE.  Enables email validation
+	public $priority		= "3";		// Default priority (1 - 5)
+	public $newline		= "\n";		// Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822)
+	public $crlf			= "\n";		// The RFC 2045 compliant CRLF for quoted-printable is "\r\n".  Apparently some servers,
 									// even on the receiving end think they need to muck with CRLFs, so using "\n", while
 									// distasteful, is the only thing that seems to work for all environments.
-	var $send_multipart	= TRUE;		// TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override.  Set to FALSE for Yahoo.
-	var	$bcc_batch_mode	= FALSE;	// TRUE/FALSE  Turns on/off Bcc batch feature
-	var	$bcc_batch_size	= 200;		// If bcc_batch_mode = TRUE, sets max number of Bccs in each batch
-	var $_safe_mode		= FALSE;
-	var	$_subject		= "";
-	var	$_body			= "";
-	var	$_finalbody		= "";
-	var	$_alt_boundary	= "";
-	var	$_atc_boundary	= "";
-	var	$_header_str	= "";
-	var	$_smtp_connect	= "";
-	var	$_encoding		= "8bit";
-	var $_IP			= FALSE;
-	var	$_smtp_auth		= FALSE;
-	var $_replyto_flag	= FALSE;
-	var	$_debug_msg		= array();
-	var	$_recipients	= array();
-	var	$_cc_array		= array();
-	var	$_bcc_array		= array();
-	var	$_headers		= array();
-	var	$_attach_name	= array();
-	var	$_attach_type	= array();
-	var	$_attach_disp	= array();
-	var	$_protocols		= array('mail', 'sendmail', 'smtp');
-	var	$_base_charsets	= array('us-ascii', 'iso-2022-');	// 7-bit charsets (excluding language suffix)
-	var	$_bit_depths	= array('7bit', '8bit');
-	var	$_priorities	= array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)');
+	public $send_multipart	= TRUE;		// TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override.  Set to FALSE for Yahoo.
+	public $bcc_batch_mode	= FALSE;	// TRUE/FALSE  Turns on/off Bcc batch feature
+	public $bcc_batch_size	= 200;		// If bcc_batch_mode = TRUE, sets max number of Bccs in each batch
+	private $_safe_mode		= FALSE;
+	private $_subject		= "";
+	private $_body			= "";
+	private $_finalbody		= "";
+	private $_alt_boundary	= "";
+	private $_atc_boundary	= "";
+	private $_header_str	= "";
+	private $_smtp_connect	= "";
+	private $_encoding		= "8bit";
+	private $_IP			= FALSE;
+	private $_smtp_auth		= FALSE;
+	private $_replyto_flag	= FALSE;
+	private $_debug_msg		= array();
+	private $_recipients	= array();
+	private $_cc_array		= array();
+	private $_bcc_array		= array();
+	private $_headers		= array();
+	private $_attach_name	= array();
+	private $_attach_type	= array();
+	private $_attach_disp	= array();
+	private $_protocols		= array('mail', 'sendmail', 'smtp');
+	private $_base_charsets	= array('us-ascii', 'iso-2022-');	// 7-bit charsets (excluding language suffix)
+	private $_bit_depths	= array('7bit', '8bit');
+	private $_priorities	= array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)');
 
 
 	/**
@@ -104,7 +104,7 @@
 		else
 		{
 			$this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE;
-			$this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;
+			$this->_safe_mode = (bool) @ini_get("safe_mode");
 		}
 
 		log_message('debug', "Email Class Initialized");
@@ -140,7 +140,7 @@
 		$this->clear();
 
 		$this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE;
-		$this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;
+		$this->_safe_mode = (bool) @ini_get("safe_mode");
 
 		return $this;
 	}
@@ -194,7 +194,7 @@
 	{
 		if (preg_match( '/\<(.*)\>/', $from, $match))
 		{
-			$from = $match['1'];
+			$from = $match[1];
 		}
 
 		if ($this->validate)
@@ -237,7 +237,7 @@
 	{
 		if (preg_match( '/\<(.*)\>/', $replyto, $match))
 		{
-			$replyto = $match['1'];
+			$replyto = $match[1];
 		}
 
 		if ($this->validate)
@@ -250,7 +250,7 @@
 			$name = $replyto;
 		}
 
-		if (strncmp($name, '"', 1) != 0)
+		if (strncmp($name, '"', 1) !== 0)
 		{
 			$name = '"'.$name.'"';
 		}
@@ -280,7 +280,7 @@
 			$this->validate_email($to);
 		}
 
-		if ($this->_get_protocol() != 'mail')
+		if ($this->_get_protocol() !== 'mail')
 		{
 			$this->_set_header('To', implode(", ", $to));
 		}
@@ -320,7 +320,7 @@
 
 		$this->_set_header('Cc', implode(", ", $cc));
 
-		if ($this->_get_protocol() == "smtp")
+		if ($this->_get_protocol() === 'smtp')
 		{
 			$this->_cc_array = $cc;
 		}
@@ -354,7 +354,7 @@
 			$this->validate_email($bcc);
 		}
 
-		if (($this->_get_protocol() == "smtp") OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size))
+		if ($this->_get_protocol() === 'smtp' OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size))
 		{
 			$this->_bcc_array = $bcc;
 		}
@@ -538,19 +538,13 @@
 	 */
 	public function set_priority($n = 3)
 	{
-		if ( ! is_numeric($n))
+		if ( ! is_numeric($n) OR $n < 1 OR $n > 5)
 		{
 			$this->priority = 3;
 			return;
 		}
 
-		if ($n < 1 OR $n > 5)
-		{
-			$this->priority = 3;
-			return;
-		}
-
-		$this->priority = $n;
+		$this->priority = (int) $n;
 		return $this;
 	}
 
@@ -565,14 +559,7 @@
 	 */
 	public function set_newline($newline = "\n")
 	{
-		if ($newline != "\n" AND $newline != "\r\n" AND $newline != "\r")
-		{
-			$this->newline	= "\n";
-			return;
-		}
-
-		$this->newline	= $newline;
-
+		$this->newline = in_array($newline, array("\n", "\r\n", "\r")) ? $newline : "\n";
 		return $this;
 	}
 
@@ -587,14 +574,7 @@
 	 */
 	public function set_crlf($crlf = "\n")
 	{
-		if ($crlf != "\n" AND $crlf != "\r\n" AND $crlf != "\r")
-		{
-			$this->crlf	= "\n";
-			return;
-		}
-
-		$this->crlf	= $crlf;
-
+		$this->crlf = ($crlf !== "\n" AND $crlf !== "\r\n" AND $crlf !== "\r") ? "\n" : $crlf;
 		return $this;
 	}
 
@@ -622,9 +602,7 @@
 	 */
 	protected function _get_message_id()
 	{
-		$from = $this->_headers['Return-Path'];
-		$from = str_replace(">", "", $from);
-		$from = str_replace("<", "", $from);
+		$from = str_replace(array('>', '<'), '', $this->_headers['Return-Path']);
 
 		return  "<".uniqid('').strstr($from, '@').">";
 	}
@@ -664,7 +642,7 @@
 
 		foreach ($this->_base_charsets as $charset)
 		{
-			if (strncmp($charset, $this->charset, strlen($charset)) == 0)
+			if (strncmp($charset, $this->charset, strlen($charset)) === 0)
 			{
 				$this->_encoding = '7bit';
 			}
@@ -686,15 +664,15 @@
 	 */
 	protected function _get_content_type()
 	{
-		if	($this->mailtype == 'html' &&  count($this->_attach_name) == 0)
+		if ($this->mailtype === 'html' && count($this->_attach_name) === 0)
 		{
 			return 'html';
 		}
-		elseif	($this->mailtype == 'html' &&  count($this->_attach_name)  > 0)
+		elseif	($this->mailtype === 'html' && count($this->_attach_name) > 0)
 		{
 			return 'html-attach';
 		}
-		elseif	($this->mailtype == 'text' &&  count($this->_attach_name)  > 0)
+		elseif	($this->mailtype === 'text' && count($this->_attach_name) > 0)
 		{
 			return 'plain-attach';
 		}
@@ -715,9 +693,9 @@
 	protected function _set_date()
 	{
 		$timezone = date("Z");
-		$operator = (strncmp($timezone, '-', 1) == 0) ? '-' : '+';
+		$operator = (strncmp($timezone, '-', 1) === 0) ? '-' : '+';
 		$timezone = abs($timezone);
-		$timezone = floor($timezone/3600) * 100 + ($timezone % 3600 ) / 60;
+		$timezone = floor($timezone/3600) * 100 + ($timezone % 3600) / 60;
 
 		return sprintf("%s %s%04d", date("D, j M Y H:i:s"), $operator, $timezone);
 	}
@@ -775,7 +753,7 @@
 	 */
 	public function valid_email($address)
 	{
-		return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE;
+		return (bool) preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address);
 	}
 
 	// --------------------------------------------------------------------
@@ -791,28 +769,14 @@
 	{
 		if ( ! is_array($email))
 		{
-			if (preg_match('/\<(.*)\>/', $email, $match))
-			{
-				return $match['1'];
-			}
-			else
-			{
-				return $email;
-			}
+			return (preg_match('/\<(.*)\>/', $email, $match)) ? $match[1] : $email;
 		}
 
 		$clean_email = array();
 
 		foreach ($email as $addy)
 		{
-			if (preg_match( '/\<(.*)\>/', $addy, $match))
-			{
-				$clean_email[] = $match['1'];
-			}
-			else
-			{
-				$clean_email[] = $addy;
-			}
+			$clean_email[] = (preg_match( '/\<(.*)\>/', $addy, $match)) ? $match[1] : $addy;
 		}
 
 		return $clean_email;
@@ -838,32 +802,15 @@
 			return $this->word_wrap($this->alt_message, '76');
 		}
 
-		if (preg_match('/\<body.*?\>(.*)\<\/body\>/si', $this->_body, $match))
-		{
-			$body = $match['1'];
-		}
-		else
-		{
-			$body = $this->_body;
-		}
-
-		$body = trim(strip_tags($body));
-		$body = preg_replace( '#<!--(.*)--\>#', "", $body);
-		$body = str_replace("\t", "", $body);
+		$body = (preg_match('/\<body.*?\>(.*)\<\/body\>/si', $this->_body, $match)) ? $match[1] : $this->_body;
+		$body = str_replace("\t", '', preg_replace('#<!--(.*)--\>#', '', trim(strip_tags($body))));
 
 		for ($i = 20; $i >= 3; $i--)
 		{
-			$n = "";
-
-			for ($x = 1; $x <= $i; $x ++)
-			{
-				$n .= "\n";
-			}
-
-			$body = str_replace($n, "\n\n", $body);
+			$body = str_replace(str_repeat("\n", $i), "\n\n", $body);
 		}
 
-		return $this->word_wrap($body, '76');
+		return $this->word_wrap($body, 76);
 	}
 
 	// --------------------------------------------------------------------
@@ -881,7 +828,7 @@
 		// Se the character limit
 		if ($charlim == '')
 		{
-			$charlim = ($this->wrapchars == "") ? "76" : $this->wrapchars;
+			$charlim = ($this->wrapchars == "") ? 76 : $this->wrapchars;
 		}
 
 		// Reduce multiple spaces
@@ -898,10 +845,10 @@
 		$unwrap = array();
 		if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches))
 		{
-			for ($i = 0; $i < count($matches['0']); $i++)
+			for ($i = 0, $c = count($matches[0]); $i < $c; $i++)
 			{
-				$unwrap[] = $matches['1'][$i];
-				$str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str);
+				$unwrap[] = $matches[1][$i];
+				$str = str_replace($matches[1][$i], "{{unwrapped".$i."}}", $str);
 			}
 		}
 
@@ -923,7 +870,7 @@
 			}
 
 			$temp = '';
-			while ((strlen($line)) > $charlim)
+			do
 			{
 				// If the over-length word is a URL we won't wrap it
 				if (preg_match("!\[url.+\]|://|wwww.!", $line))
@@ -935,19 +882,16 @@
 				$temp .= substr($line, 0, $charlim-1);
 				$line = substr($line, $charlim-1);
 			}
+			while (strlen($line) > $charlim);
 
 			// If $temp contains data it means we had to split up an over-length
 			// word into smaller chunks so we'll add it back to our current line
 			if ($temp != '')
 			{
-				$output .= $temp.$this->newline.$line;
-			}
-			else
-			{
-				$output .= $line;
+				$output .= $temp.$this->newline;
 			}
 
-			$output .= $this->newline;
+			$output .= $line.$this->newline;
 		}
 
 		// Put our markers back
@@ -990,7 +934,7 @@
 	 */
 	protected function _write_headers()
 	{
-		if ($this->protocol == 'mail')
+		if ($this->protocol === 'mail')
 		{
 			$this->_subject = $this->_headers['Subject'];
 			unset($this->_headers['Subject']);
@@ -1009,7 +953,7 @@
 			}
 		}
 
-		if ($this->_get_protocol() == 'mail')
+		if ($this->_get_protocol() === 'mail')
 		{
 			$this->_header_str = rtrim($this->_header_str);
 		}
@@ -1025,7 +969,7 @@
 	 */
 	protected function _build_message()
 	{
-		if ($this->wordwrap === TRUE  AND  $this->mailtype != 'html')
+		if ($this->wordwrap === TRUE AND $this->mailtype !== 'html')
 		{
 			$this->_body = $this->word_wrap($this->_body);
 		}
@@ -1033,17 +977,17 @@
 		$this->_set_boundaries();
 		$this->_write_headers();
 
-		$hdr = ($this->_get_protocol() == 'mail') ? $this->newline : '';
+		$hdr = ($this->_get_protocol() === 'mail') ? $this->newline : '';
 		$body = '';
 
 		switch ($this->_get_content_type())
 		{
 			case 'plain' :
 
-				$hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
-				$hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding();
+				$hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline
+					. "Content-Transfer-Encoding: " . $this->_get_encoding();
 
-				if ($this->_get_protocol() == 'mail')
+				if ($this->_get_protocol() === 'mail')
 				{
 					$this->_header_str .= $hdr;
 					$this->_finalbody = $this->_body;
@@ -1055,33 +999,32 @@
 
 				return;
 
-			break;
 			case 'html' :
 
 				if ($this->send_multipart === FALSE)
 				{
-					$hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
-					$hdr .= "Content-Transfer-Encoding: quoted-printable";
+					$hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline
+						. "Content-Transfer-Encoding: quoted-printable";
 				}
 				else
 				{
 					$hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline . $this->newline;
 
-					$body .= $this->_get_mime_message() . $this->newline . $this->newline;
-					$body .= "--" . $this->_alt_boundary . $this->newline;
+					$body .= $this->_get_mime_message() . $this->newline . $this->newline
+						. "--" . $this->_alt_boundary . $this->newline
 
-					$body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
-					$body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
-					$body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;
+						. "Content-Type: text/plain; charset=" . $this->charset . $this->newline
+						. "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline
+						. $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline
 
-					$body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
-					$body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline;
+						. "Content-Type: text/html; charset=" . $this->charset . $this->newline
+						. "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline;
 				}
 
 				$this->_finalbody = $body . $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline;
 
 
-				if ($this->_get_protocol() == 'mail')
+				if ($this->_get_protocol() === 'mail')
 				{
 					$this->_header_str .= $hdr;
 				}
@@ -1098,62 +1041,57 @@
 
 				return;
 
-			break;
 			case 'plain-attach' :
 
 				$hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline . $this->newline;
 
-				if ($this->_get_protocol() == 'mail')
+				if ($this->_get_protocol() === 'mail')
 				{
 					$this->_header_str .= $hdr;
 				}
 
-				$body .= $this->_get_mime_message() . $this->newline . $this->newline;
-				$body .= "--" . $this->_atc_boundary . $this->newline;
+				$body .= $this->_get_mime_message() . $this->newline . $this->newline
+					. "--" . $this->_atc_boundary . $this->newline
 
-				$body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
-				$body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
+					. "Content-Type: text/plain; charset=" . $this->charset . $this->newline
+					. "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline
 
-				$body .= $this->_body . $this->newline . $this->newline;
+					. $this->_body . $this->newline . $this->newline;
 
 			break;
 			case 'html-attach' :
 
 				$hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline . $this->newline;
 
-				if ($this->_get_protocol() == 'mail')
+				if ($this->_get_protocol() === 'mail')
 				{
 					$this->_header_str .= $hdr;
 				}
 
-				$body .= $this->_get_mime_message() . $this->newline . $this->newline;
-				$body .= "--" . $this->_atc_boundary . $this->newline;
+				$body .= $this->_get_mime_message() . $this->newline . $this->newline
+					. "--" . $this->_atc_boundary . $this->newline
 
-				$body .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline .$this->newline;
-				$body .= "--" . $this->_alt_boundary . $this->newline;
+					. "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline .$this->newline
+					. "--" . $this->_alt_boundary . $this->newline
 
-				$body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
-				$body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
-				$body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;
+					. "Content-Type: text/plain; charset=" . $this->charset . $this->newline
+					. "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline
+					. $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline
 
-				$body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
-				$body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline;
+					. "Content-Type: text/html; charset=" . $this->charset . $this->newline
+					. "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline
 
-				$body .= $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline;
-				$body .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;
+					. $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline
+					. "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;
 
 			break;
 		}
 
 		$attachment = array();
-
-		$z = 0;
-
-		for ($i=0; $i < count($this->_attach_name); $i++)
+		for ($i = 0, $c = count($this->_attach_name), $z = 0; $i < $c; $i++)
 		{
 			$filename = $this->_attach_name[$i][0];
-			$basename = ( is_null($this->_attach_name[$i][1]) ? basename($filename) : $this->_attach_name[$i][1] );
-				
+			$basename = (is_null($this->_attach_name[$i][1])) ? basename($filename) : $this->_attach_name[$i][1];
 			$ctype = $this->_attach_type[$i];
 
 			if ( ! file_exists($filename))
@@ -1162,13 +1100,12 @@
 				return FALSE;
 			}
 
-			$h  = "--".$this->_atc_boundary.$this->newline;
-			$h .= "Content-type: ".$ctype."; ";
-			$h .= "name=\"".$basename."\"".$this->newline;
-			$h .= "Content-Disposition: ".$this->_attach_disp[$i].";".$this->newline;
-			$h .= "Content-Transfer-Encoding: base64".$this->newline;
+			$attachment[$z++] = "--".$this->_atc_boundary.$this->newline
+				. "Content-type: ".$ctype."; "
+				. "name=\"".$basename."\"".$this->newline
+				. "Content-Disposition: ".$this->_attach_disp[$i].";".$this->newline
+				. "Content-Transfer-Encoding: base64".$this->newline;
 
-			$attachment[$z++] = $h;
 			$file = filesize($filename) +1;
 
 			if ( ! $fp = fopen($filename, FOPEN_READ))
@@ -1182,17 +1119,7 @@
 		}
 
 		$body .= implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--";
-
-
-		if ($this->_get_protocol() == 'mail')
-		{
-			$this->_finalbody = $body;
-		}
-		else
-		{
-			$this->_finalbody = $hdr . $body;
-		}
-
+		$this->_finalbody = ($this->_get_protocol() === 'mail') ? $body : $hdr . $body;
 		return;
 	}
 
@@ -1214,16 +1141,13 @@
 		// Set the character limit
 		// Don't allow over 76, as that will make servers and MUAs barf
 		// all over quoted-printable data
-		if ($charlim == '' OR $charlim > '76')
+		if ($charlim == '' OR $charlim > 76)
 		{
-			$charlim = '76';
+			$charlim = 76;
 		}
 
-		// Reduce multiple spaces
-		$str = preg_replace("| +|", " ", $str);
-
-		// kill nulls
-		$str = preg_replace('/\x00+/', '', $str);
+		// Reduce multiple spaces & remove nulls
+		$str = preg_replace(array("| +|", '/\x00+/'), array(' ', ''), $str);
 
 		// Standardize newlines
 		if (strpos($str, "\r") !== FALSE)
@@ -1235,13 +1159,10 @@
 		// properly and MUAs will behave, so {unwrap} must go!
 		$str = str_replace(array('{unwrap}', '{/unwrap}'), '', $str);
 
-		// Break into an array of lines
-		$lines = explode("\n", $str);
-
 		$escape = '=';
 		$output = '';
 
-		foreach ($lines as $line)
+		foreach (explode("\n", $str) as $line)
 		{
 			$length = strlen($line);
 			$temp = '';
@@ -1252,17 +1173,15 @@
 			for ($i = 0; $i < $length; $i++)
 			{
 				// Grab the next character
-				$char = substr($line, $i, 1);
+				$char = $line[$i];
 				$ascii = ord($char);
 
 				// Convert spaces and tabs but only if it's the end of the line
-				if ($i == ($length - 1))
+				if ($i === ($length - 1) && ($ascii === 32 OR $ascii === 9))
 				{
-					$char = ($ascii == '32' OR $ascii == '9') ? $escape.sprintf('%02s', dechex($ascii)) : $char;
+					$char = $escape.sprintf('%02s', dechex($ascii));
 				}
-
-				// encode = signs
-				if ($ascii == '61')
+				elseif ($ascii === 61) // encode = signs
 				{
 					$char = $escape.strtoupper(sprintf('%02s', dechex($ascii)));  // =3D
 				}
@@ -1325,7 +1244,7 @@
 		for ($i = 0, $length = strlen($str); $i < $length; $i++)
 		{
 			// Grab the next character
-			$char = substr($str, $i, 1);
+			$char = $str[$i];
 			$ascii = ord($char);
 
 			// convert ALL non-printable ASCII characters and our specials
@@ -1335,7 +1254,7 @@
 			}
 
 			// handle regular spaces a bit more compactly than =20
-			if ($ascii == 32)
+			if ($ascii === 32)
 			{
 				$char = '_';
 			}
@@ -1386,22 +1305,14 @@
 
 		$this->_build_headers();
 
-		if ($this->bcc_batch_mode  AND  count($this->_bcc_array) > 0)
+		if ($this->bcc_batch_mode AND count($this->_bcc_array) > $this->bcc_batch_size)
 		{
-			if (count($this->_bcc_array) > $this->bcc_batch_size)
-				return $this->batch_bcc_send();
+			return $this->batch_bcc_send();
 		}
 
 		$this->_build_message();
 
-		if ( ! $this->_spool_email())
-		{
-			return FALSE;
-		}
-		else
-		{
-			return TRUE;
-		}
+		return $this->_spool_email();
 	}
 
 	// --------------------------------------------------------------------
@@ -1420,7 +1331,7 @@
 
 		$chunk = array();
 
-		for ($i = 0; $i < count($this->_bcc_array); $i++)
+		for ($i = 0, $c = count($this->_bcc_array); $i < $c; $i++)
 		{
 			if (isset($this->_bcc_array[$i]))
 			{
@@ -1430,25 +1341,23 @@
 			if ($i == $float)
 			{
 				$chunk[] = substr($set, 1);
-				$float = $float + $this->bcc_batch_size;
+				$float += $this->bcc_batch_size;
 				$set = "";
 			}
 
-			if ($i == count($this->_bcc_array)-1)
+			if ($i === $c-1)
 			{
 				$chunk[] = substr($set, 1);
 			}
 		}
 
-		for ($i = 0; $i < count($chunk); $i++)
+		for ($i = 0, $c = count($chunk); $i < $c; $i++)
 		{
 			unset($this->_headers['Bcc']);
-			unset($bcc);
 
-			$bcc = $this->_str_to_array($chunk[$i]);
-			$bcc = $this->clean_email($bcc);
+			$bcc = $this->clean_email($this->_str_to_array($chunk[$i]));
 
-			if ($this->protocol != 'smtp')
+			if ($this->protocol !== 'smtp')
 			{
 				$this->_set_header('Bcc', implode(", ", $bcc));
 			}
@@ -1505,33 +1414,10 @@
 	{
 		$this->_unwrap_specials();
 
-		switch ($this->_get_protocol())
+		$method = '_send_with_' . $this->_get_protocol();
+		if ( ! $this->$method())
 		{
-			case 'mail'	:
-
-					if ( ! $this->_send_with_mail())
-					{
-						$this->_set_error_message('lang:email_send_failure_phpmail');
-						return FALSE;
-					}
-			break;
-			case 'sendmail'	:
-
-					if ( ! $this->_send_with_sendmail())
-					{
-						$this->_set_error_message('lang:email_send_failure_sendmail');
-						return FALSE;
-					}
-			break;
-			case 'smtp'	:
-
-					if ( ! $this->_send_with_smtp())
-					{
-						$this->_set_error_message('lang:email_send_failure_smtp');
-						return FALSE;
-					}
-			break;
-
+			$this->_set_error_message('lang:email_send_failure_' . ($this->_get_protocol() === 'mail' ? 'phpmail' : $this->_get_protocol()));
 		}
 
 		$this->_set_error_message('lang:email_sent', $this->_get_protocol());
@@ -1550,28 +1436,13 @@
 	{
 		if ($this->_safe_mode == TRUE)
 		{
-			if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str))
-			{
-				return FALSE;
-			}
-			else
-			{
-				return TRUE;
-			}
+			return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str);
 		}
 		else
 		{
 			// most documentation of sendmail using the "-f" flag lacks a space after it, however
 			// we've encountered servers that seem to require it to be in place.
-
-			if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From'])))
-			{
-				return FALSE;
-			}
-			else
-			{
-				return TRUE;
-			}
+			return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From']));
 		}
 	}
 
@@ -1598,12 +1469,7 @@
 
 		$status = pclose($fp);
 
-		if (version_compare(PHP_VERSION, '4.2.3') == -1)
-		{
-			$status = $status >> 8 & 0xFF;
-		}
-
-		if ($status != 0)
+		if ($status !== 0)
 		{
 			$this->_set_error_message('lang:email_exit_status', $status);
 			$this->_set_error_message('lang:email_no_socket');
@@ -1672,7 +1538,7 @@
 
 		$this->_set_error_message($reply);
 
-		if (strncmp($reply, '250', 3) != 0)
+		if (strncmp($reply, '250', 3) !== 0)
 		{
 			$this->_set_error_message('lang:email_smtp_error', $reply);
 			return FALSE;
@@ -1824,7 +1690,7 @@
 
 		$reply = $this->_get_smtp_data();
 
-		if (strncmp($reply, '334', 3) != 0)
+		if (strncmp($reply, '334', 3) !== 0)
 		{
 			$this->_set_error_message('lang:email_failed_smtp_login', $reply);
 			return FALSE;
@@ -1834,7 +1700,7 @@
 
 		$reply = $this->_get_smtp_data();
 
-		if (strncmp($reply, '334', 3) != 0)
+		if (strncmp($reply, '334', 3) !== 0)
 		{
 			$this->_set_error_message('lang:email_smtp_auth_un', $reply);
 			return FALSE;
@@ -1844,7 +1710,7 @@
 
 		$reply = $this->_get_smtp_data();
 
-		if (strncmp($reply, '235', 3) != 0)
+		if (strncmp($reply, '235', 3) !== 0)
 		{
 			$this->_set_error_message('lang:email_smtp_auth_pw', $reply);
 			return FALSE;
@@ -1868,10 +1734,8 @@
 			$this->_set_error_message('lang:email_smtp_data_failure', $data);
 			return FALSE;
 		}
-		else
-		{
-			return TRUE;
-		}
+
+		return TRUE;
 	}
 
 	// --------------------------------------------------------------------
@@ -1890,7 +1754,7 @@
 		{
 			$data .= $str;
 
-			if (substr($str, 3, 1) == " ")
+			if ($str[3] == " ")
 			{
 				break;
 			}
@@ -1929,12 +1793,16 @@
 
 		$cip = (isset($_SERVER['HTTP_CLIENT_IP']) AND $_SERVER['HTTP_CLIENT_IP'] != "") ? $_SERVER['HTTP_CLIENT_IP'] : FALSE;
 		$rip = (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR'] != "") ? $_SERVER['REMOTE_ADDR'] : FALSE;
-		$fip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR'] != "") ? $_SERVER['HTTP_X_FORWARDED_FOR'] : FALSE;
-
-		if ($cip && $rip)	$this->_IP = $cip;
-		elseif ($rip)		$this->_IP = $rip;
-		elseif ($cip)		$this->_IP = $cip;
-		elseif ($fip)		$this->_IP = $fip;
+		if ($cip) $this->_IP = $cip;
+		elseif ($rip) $this->_IP = $rip;
+		else
+		{
+			$fip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR'] != "") ? $_SERVER['HTTP_X_FORWARDED_FOR'] : FALSE;
+			if ($fip)
+			{
+				$this->_IP = $fip;
+			}
+		}
 
 		if (strpos($this->_IP, ',') !== FALSE)
 		{
@@ -1947,10 +1815,6 @@
 			$this->_IP = '0.0.0.0';
 		}
 
-		unset($cip);
-		unset($rip);
-		unset($fip);
-
 		return $this->_IP;
 	}
 
@@ -1992,7 +1856,7 @@
 		$CI =& get_instance();
 		$CI->lang->load('email');
 
-		if (substr($msg, 0, 5) != 'lang:' || FALSE === ($line = $CI->lang->line(substr($msg, 5))))
+		if (substr($msg, 0, 5) !== 'lang:' || FALSE === ($line = $CI->lang->line(substr($msg, 5))))
 		{
 			$this->_debug_msg[] = str_replace('%s', $val, $msg)."<br />";
 		}
@@ -2109,4 +1973,4 @@
 // END CI_Email class
 
 /* End of file Email.php */
-/* Location: ./system/libraries/Email.php */
\ No newline at end of file
+/* Location: ./system/libraries/Email.php */
diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php
index 70d7fc8..99850a9 100644
--- a/system/libraries/Ftp.php
+++ b/system/libraries/Ftp.php
@@ -1,13 +1,13 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 /**
  * CodeIgniter
  *
  * An open source application development framework for PHP 5.1.6 or newer
  *
  * NOTICE OF LICENSE
- * 
+ *
  * Licensed under the Open Software License version 3.0
- * 
+ *
  * This source file is subject to the Open Software License (OSL 3.0) that is
  * bundled with this package in the files license.txt / license.rst.  It is
  * also available through the world wide web at this URL:
@@ -38,13 +38,13 @@
  */
 class CI_FTP {
 
-	var $hostname	= '';
-	var $username	= '';
-	var $password	= '';
-	var $port		= 21;
-	var $passive	= TRUE;
-	var $debug		= FALSE;
-	var $conn_id	= FALSE;
+	public $hostname	= '';
+	public $username	= '';
+	public $password	= '';
+	public $port		= 21;
+	public $passive	= TRUE;
+	public $debug		= FALSE;
+	public $conn_id	= FALSE;
 
 
 	/**
@@ -71,7 +71,7 @@
 	 * @param	array
 	 * @return	void
 	 */
-	function initialize($config = array())
+	public function initialize($config = array())
 	{
 		foreach ($config as $key => $val)
 		{
@@ -94,7 +94,7 @@
 	 * @param	array	 the connection values
 	 * @return	bool
 	 */
-	function connect($config = array())
+	public function connect($config = array())
 	{
 		if (count($config) > 0)
 		{
@@ -136,7 +136,7 @@
 	 * @access	private
 	 * @return	bool
 	 */
-	function _login()
+	private function _login()
 	{
 		return @ftp_login($this->conn_id, $this->username, $this->password);
 	}
@@ -149,7 +149,7 @@
 	 * @access	private
 	 * @return	bool
 	 */
-	function _is_conn()
+	private function _is_conn()
 	{
 		if ( ! is_resource($this->conn_id))
 		{
@@ -179,7 +179,7 @@
 	 * @param	bool
 	 * @return	bool
 	 */
-	function changedir($path = '', $supress_debug = FALSE)
+	public function changedir($path = '', $supress_debug = FALSE)
 	{
 		if ($path == '' OR ! $this->_is_conn())
 		{
@@ -209,7 +209,7 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function mkdir($path = '', $permissions = NULL)
+	public function mkdir($path = '', $permissions = NULL)
 	{
 		if ($path == '' OR ! $this->_is_conn())
 		{
@@ -247,7 +247,7 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)
+	public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -261,14 +261,14 @@
 		}
 
 		// Set the mode if not specified
-		if ($mode == 'auto')
+		if ($mode === 'auto')
 		{
 			// Get the file extension so we can set the upload type
 			$ext = $this->_getext($locpath);
 			$mode = $this->_settype($ext);
 		}
 
-		$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
+		$mode = ($mode === 'ascii') ? FTP_ASCII : FTP_BINARY;
 
 		$result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);
 
@@ -301,7 +301,7 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function download($rempath, $locpath, $mode = 'auto')
+	public function download($rempath, $locpath, $mode = 'auto')
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -309,14 +309,14 @@
 		}
 
 		// Set the mode if not specified
-		if ($mode == 'auto')
+		if ($mode === 'auto')
 		{
 			// Get the file extension so we can set the upload type
 			$ext = $this->_getext($rempath);
 			$mode = $this->_settype($ext);
 		}
 
-		$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
+		$mode = ($mode === 'ascii') ? FTP_ASCII : FTP_BINARY;
 
 		$result = @ftp_get($this->conn_id, $locpath, $rempath, $mode);
 
@@ -343,7 +343,7 @@
 	 * @param	bool
 	 * @return	bool
 	 */
-	function rename($old_file, $new_file, $move = FALSE)
+	public function rename($old_file, $new_file, $move = FALSE)
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -356,9 +356,7 @@
 		{
 			if ($this->debug == TRUE)
 			{
-				$msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move';
-
-				$this->_error($msg);
+				$this->_error('ftp_unable_to_' . ($move == FALSE ? 'rename' : 'move'));
 			}
 			return FALSE;
 		}
@@ -376,7 +374,7 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function move($old_file, $new_file)
+	public function move($old_file, $new_file)
 	{
 		return $this->rename($old_file, $new_file, TRUE);
 	}
@@ -390,7 +388,7 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function delete_file($filepath)
+	public function delete_file($filepath)
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -421,7 +419,7 @@
 	 * @param	string
 	 * @return	bool
 	 */
-	function delete_dir($filepath)
+	public function delete_dir($filepath)
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -470,23 +468,13 @@
 	 * @param	string	the permissions
 	 * @return	bool
 	 */
-	function chmod($path, $perm)
+	public function chmod($path, $perm)
 	{
 		if ( ! $this->_is_conn())
 		{
 			return FALSE;
 		}
 
-		// Permissions can only be set when running PHP 5
-		if ( ! function_exists('ftp_chmod'))
-		{
-			if ($this->debug == TRUE)
-			{
-				$this->_error('ftp_unable_to_chmod');
-			}
-			return FALSE;
-		}
-
 		$result = @ftp_chmod($this->conn_id, $perm, $path);
 
 		if ($result === FALSE)
@@ -509,7 +497,7 @@
 	 * @access	public
 	 * @return	array
 	 */
-	function list_files($path = '.')
+	public function list_files($path = '.')
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -533,7 +521,7 @@
 	 * @param	string	path to destination - include the base folder with trailing slash
 	 * @return	bool
 	 */
-	function mirror($locpath, $rempath)
+	public function mirror($locpath, $rempath)
 	{
 		if ( ! $this->_is_conn())
 		{
@@ -543,24 +531,20 @@
 		// Open the local file path
 		if ($fp = @opendir($locpath))
 		{
-			// Attempt to open the remote file path.
-			if ( ! $this->changedir($rempath, TRUE))
+			// Attempt to open the remote file path and try to create it, if it doesn't exist
+			if ( ! $this->changedir($rempath, TRUE) AND ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath)))
 			{
-				// If it doesn't exist we'll attempt to create the direcotory
-				if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))
-				{
-					return FALSE;
-				}
+				return FALSE;
 			}
 
 			// Recursively read the local directory
 			while (FALSE !== ($file = readdir($fp)))
 			{
-				if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.')
+				if (@is_dir($locpath.$file) && $file[0] !== '.')
 				{
 					$this->mirror($locpath.$file."/", $rempath.$file."/");
 				}
-				elseif (substr($file, 0, 1) != ".")
+				elseif ($file[0] !== ".")
 				{
 					// Get the file extension so we can se the upload type
 					$ext = $this->_getext($file);
@@ -585,7 +569,7 @@
 	 * @param	string
 	 * @return	string
 	 */
-	function _getext($filename)
+	private function _getext($filename)
 	{
 		if (FALSE === strpos($filename, '.'))
 		{
@@ -606,7 +590,7 @@
 	 * @param	string
 	 * @return	string
 	 */
-	function _settype($ext)
+	private function _settype($ext)
 	{
 		$text_types = array(
 							'txt',
@@ -634,18 +618,16 @@
 	 * Close the connection
 	 *
 	 * @access	public
-	 * @param	string	path to source
-	 * @param	string	path to destination
 	 * @return	bool
 	 */
-	function close()
+	public function close()
 	{
 		if ( ! $this->_is_conn())
 		{
 			return FALSE;
 		}
 
-		@ftp_close($this->conn_id);
+		return @ftp_close($this->conn_id);
 	}
 
 	// ------------------------------------------------------------------------
@@ -655,9 +637,9 @@
 	 *
 	 * @access	private
 	 * @param	string
-	 * @return	bool
+	 * @return	void
 	 */
-	function _error($line)
+	private function _error($line)
 	{
 		$CI =& get_instance();
 		$CI->lang->load('ftp');
@@ -669,4 +651,4 @@
 // END FTP Class
 
 /* End of file Ftp.php */
-/* Location: ./system/libraries/Ftp.php */
\ No newline at end of file
+/* Location: ./system/libraries/Ftp.php */
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index 62f60b1..8a7109f 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -75,6 +75,7 @@
 -  Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table.
 -  Bug #795 - Fixed form method and accept-charset when passing an empty array.
 -  Bug #797 - timespan was using incorrect seconds for year and month.
+-  Fixed a bug in CI_Cart::contents() where if called without a TRUE (or equal) parameter, it would fail due to a typo.
 
 Version 2.1.0
 =============