corrected a few docblock comments to accurately reflect return values
removed some unneeded whitespace
diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php
index 0e3dd5e..ec84eb0 100644
--- a/system/libraries/Ftp.php
+++ b/system/libraries/Ftp.php
@@ -1,618 +1,618 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * FTP Class

- *

- * @package		CodeIgniter

- * @subpackage	Libraries

- * @category	Libraries

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/libraries/ftp.html

- */ 

-class CI_FTP {

-

-	var $hostname	= '';

-	var $username	= '';

-	var $password	= '';

-	var $port		= 21;

-	var $passive	= TRUE;

-	var $debug		= FALSE;

-	var $conn_id	= FALSE;

-

-

-	/**

-	 * Constructor - Sets Preferences

-	 *

-	 * The constructor can be passed an array of config values

-	 */	

-	function CI_FTP($config = array())

-	{		

-		if (count($config) > 0)

-		{

-			$this->initialize($config);

-		}	

-

-		log_message('debug', "FTP Class Initialized");

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Initialize preferences

-	 *

-	 * @access	public

-	 * @param	array

-	 * @return	void

-	 */	

-	function initialize($config = array())

-	{

-		foreach ($config as $key => $val)

-		{

-			if (isset($this->$key))

-			{

-				$this->$key = $val;

-			}

-		}

-		

-		// Prep the hostname

-		$this->hostname = preg_replace('|.+?://|', '', $this->hostname);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * FTP Connect

-	 *

-	 * @access	public

-	 * @param	array	 the connection values

-	 * @return	bool

-	 */	

-	function connect($config = array())

-	{		

-		if (count($config) > 0)

-		{

-			$this->initialize($config);

-		}	

-	

-		if (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port)))

-		{

-			if ($this->debug == TRUE)

-			{

-				$this->_error('ftp_unable_to_connect');

-			}		

-			return FALSE;

-		}

-		

-		if ( ! $this->_login())

-		{

-			if ($this->debug == TRUE)

-			{

-				$this->_error('ftp_unable_to_login');

-			}		

-			return FALSE;

-		}

-		

-		// Set passive mode if needed

-		if ($this->passive == TRUE)

-		{

-			ftp_pasv($this->conn_id, TRUE);

-		}

-		

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * FTP Login

-	 *

-	 * @access	private

-	 * @return	bool

-	 */	

-	function _login()

-	{

-		return @ftp_login($this->conn_id, $this->username, $this->password);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Validates the connection ID

-	 *

-	 * @access	private

-	 * @return	bool

-	 */	

-	function _is_conn()

-	{

-		if ( ! is_resource($this->conn_id))

-		{

-			if ($this->debug == TRUE)

-			{

-				$this->_error('ftp_no_connection');

-			}		

-			return FALSE;

-		}

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-

-	/**

-	 * Change direcotry

-	 *

-	 * The second parameter lets us momentarily turn off debugging so that

-	 * this function can be used to test for the existance of a folder

-	 * without throwing an error.  There's no FTP equivalent to is_dir()

-	 * so we do it by trying to change to a particular directory.  

-	 * Internally, this paramter is only used by the "mirror" function below.

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	bool

-	 * @return	bool

-	 */	

-	function changedir($path = '', $supress_debug = FALSE)

-	{

-		if ($path == '' OR ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-		

-		$result = @ftp_chdir($this->conn_id, $path);

-		

-		if ($result === FALSE)

-		{

-			if ($this->debug == TRUE AND $supress_debug == FALSE)

-			{

-				$this->_error('ftp_unable_to_changedir');

-			}		

-			return FALSE;		

-		}

-		

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create a directory

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	bool

-	 */	

-	function mkdir($path = '', $permissions = NULL)

-	{

-		if ($path == '' OR ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-	

-		$result = @ftp_mkdir($this->conn_id, $path);

-		

-		if ($result === FALSE)

-		{

-			if ($this->debug == TRUE)

-			{

-				$this->_error('ftp_unable_to_makdir');

-			}		

-			return FALSE;		

-		}

-

-		// Set file permissions if needed

-		if ( ! is_null($permissions))

-		{

-			$this->chmod($path, (int)$permissions);

-		}

-		

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Upload a file to the server

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @param	string

-	 * @return	bool

-	 */	

-	function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		if ( ! file_exists($locpath))

-		{

-			$this->_error('ftp_no_source_file');

-			return FALSE;

-		}

-	

-		// Set the mode if not specified

-		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;

-		

-		$result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);

-		

-		if ($result === FALSE)

-		{

-			if ($this->debug == TRUE)

-			{

-				$this->_error('ftp_unable_to_upload');

-			}		

-			return FALSE;		

-		}

-		

-		// Set file permissions if needed

-		if ( ! is_null($permissions))

-		{

-			$this->chmod($rempath, (int)$permissions);

-		}

-		

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename (or move) a file

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @param	bool

-	 * @return	bool

-	 */	

-	function rename($old_file, $new_file, $move = FALSE)

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		$result = @ftp_rename($this->conn_id, $old_file, $new_file);

-		

-		if ($result === FALSE)

-		{

-			if ($this->debug == TRUE)

-			{

-				$msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move';

-				

-				$this->_error($msg);

-			}		

-			return FALSE;		

-		}

-		

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Move a file

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	bool

-	 */	

-	function move($old_file, $new_file)

-	{

-		return $this->rename($old_file, $new_file, TRUE);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename (or move) a file

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	bool

-	 */	

-	function delete_file($filepath)

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		$result = @ftp_delete($this->conn_id, $filepath);

-		

-		if ($result === FALSE)

-		{

-			if ($this->debug == TRUE)

-			{				

-				$this->_error('ftp_unable_to_delete');

-			}		

-			return FALSE;		

-		}

-		

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete a folder and recursively delete everything (including sub-folders)

-	 * containted within it.

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	bool

-	 */	

-	function delete_dir($filepath)

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		// Add a trailing slash to the file path if needed

-		$filepath = preg_replace("/(.+?)\/*$/", "\\1/",  $filepath);

-		

-		$list = $this->list_files($filepath);

-		

-		if ($list !== FALSE AND count($list) > 0)

-		{

-			foreach ($list as $item)

-			{			

-				// If we can't delete the item it's probaly a folder so

-				// we'll recursively call delete_dir()

-				if ( ! @ftp_delete($this->conn_id, $item))

-				{

-					$this->delete_dir($item);

-				}

-			}

-		}

-	

-		$result = @ftp_rmdir($this->conn_id, $filepath);

-		

-		if ($result === FALSE)

-		{

-			if ($this->debug == TRUE)

-			{				

-				$this->_error('ftp_unable_to_delete');

-			}		

-			return FALSE;		

-		}

-		

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set file permissions

-	 *

-	 * @access	public

-	 * @param	string 	the file path

-	 * @param	string	the permissions

-	 * @return	bool

-	 */		

-	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)

-		{

-			if ($this->debug == TRUE)

-			{

-				$this->_error('ftp_unable_to_chmod');

-			}		

-			return FALSE;		

-		}

-		

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * FTP List files in the specified directory

-	 *

-	 * @access	public

-	 * @return	array

-	 */	

-	function list_files($path = '.')

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		return ftp_nlist($this->conn_id, $path);

-	}

-

-	// ------------------------------------------------------------------------

-	

-	/**

-	 * Read a directory and recreate it remotely

-	 *

-	 * This function recursively reads a folder and everything it contains (including

-	 * sub-folders) and creates a mirror via FTP based on it.  Whatever the directory structure

-	 * of the original file path will be recreated on the server.

-	 *

-	 * @access	public

-	 * @param	string	path to source with trailing slash

-	 * @param	string	path to destination - include the base folder with trailing slash

-	 * @return	bool

-	 */	

-	function mirror($locpath, $rempath)

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		// Open the local file path

-		if ($fp = @opendir($locpath))

-		{

-			// Attempt to open the remote file path.

-			if ( ! $this->changedir($rempath, TRUE))

-			{

-				// If it doesn't exist we'll attempt to create the direcotory

-				if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))

-				{

-					return FALSE;

-				}

-			}

-		

-			// Recursively read the local directory

-			while (FALSE !== ($file = readdir($fp)))

-			{

-				if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.')

-				{					

-					$this->mirror($locpath.$file."/", $rempath.$file."/");

-				}

-				elseif (substr($file, 0, 1) != ".")

-				{

-					// Get the file extension so we can se the upload type

-					$ext = $this->_getext($file);

-					$mode = $this->_settype($ext);

-					

-					$this->upload($locpath.$file, $rempath.$file, $mode);

-				}

-			}

-			return TRUE;

-		}

-		

-		return FALSE;

-	}

-

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Extract the file extension

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */	

-	function _getext($filename)

-	{

-		if (FALSE === strpos($filename, '.'))

-		{

-			return 'txt';

-		}

-	

-		$x = explode('.', $filename);

-		return end($x);

-	}	

-

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Set the upload type

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */	

-	function _settype($ext)

-	{

-		$text_types = array(

-							'txt',

-							'text',

-							'php',

-							'phps',

-							'php4',

-							'js',

-							'css',

-							'htm',

-							'html',

-							'phtml',

-							'shtml',

-							'log',

-							'xml'

-							);

-	

-	

-		return (in_array($ext, $text_types)) ? 'ascii' : 'binary';

-	}

-

-	// ------------------------------------------------------------------------

-	

-	/**

-	 * Close the connection

-	 *

-	 * @access	public

-	 * @param	string	path to source

-	 * @param	string	path to destination

-	 * @return	bool

-	 */	

-	function close()

-	{

-		if ( ! $this->_is_conn())

-		{

-			return FALSE;

-		}

-

-		@ftp_close($this->conn_id);

-	}

-

-	// ------------------------------------------------------------------------

-	

-	/**

-	 * Display error message

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	bool

-	 */	

-	function _error($line)

-	{

-		$CI =& get_instance();

-		$CI->lang->load('ftp');

-		show_error($CI->lang->line($line));		

-	}

-

-

-}

-// END FTP Class

-

-/* End of file Ftp.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * FTP Class
+ *
+ * @package		CodeIgniter
+ * @subpackage	Libraries
+ * @category	Libraries
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/libraries/ftp.html
+ */
+class CI_FTP {
+
+	var $hostname	= '';
+	var $username	= '';
+	var $password	= '';
+	var $port		= 21;
+	var $passive	= TRUE;
+	var $debug		= FALSE;
+	var $conn_id	= FALSE;
+
+
+	/**
+	 * Constructor - Sets Preferences
+	 *
+	 * The constructor can be passed an array of config values
+	 */
+	function CI_FTP($config = array())
+	{
+		if (count($config) > 0)
+		{
+			$this->initialize($config);
+		}
+
+		log_message('debug', "FTP Class Initialized");
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Initialize preferences
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function initialize($config = array())
+	{
+		foreach ($config as $key => $val)
+		{
+			if (isset($this->$key))
+			{
+				$this->$key = $val;
+			}
+		}
+
+		// Prep the hostname
+		$this->hostname = preg_replace('|.+?://|', '', $this->hostname);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * FTP Connect
+	 *
+	 * @access	public
+	 * @param	array	 the connection values
+	 * @return	bool
+	 */
+	function connect($config = array())
+	{
+		if (count($config) > 0)
+		{
+			$this->initialize($config);
+		}
+
+		if (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port)))
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_connect');
+			}
+			return FALSE;
+		}
+
+		if ( ! $this->_login())
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_login');
+			}
+			return FALSE;
+		}
+
+		// Set passive mode if needed
+		if ($this->passive == TRUE)
+		{
+			ftp_pasv($this->conn_id, TRUE);
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * FTP Login
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _login()
+	{
+		return @ftp_login($this->conn_id, $this->username, $this->password);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Validates the connection ID
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _is_conn()
+	{
+		if ( ! is_resource($this->conn_id))
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_no_connection');
+			}
+			return FALSE;
+		}
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+
+	/**
+	 * Change direcotry
+	 *
+	 * The second parameter lets us momentarily turn off debugging so that
+	 * this function can be used to test for the existance of a folder
+	 * without throwing an error.  There's no FTP equivalent to is_dir()
+	 * so we do it by trying to change to a particular directory.
+	 * Internally, this paramter is only used by the "mirror" function below.
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	bool
+	 * @return	bool
+	 */
+	function changedir($path = '', $supress_debug = FALSE)
+	{
+		if ($path == '' OR ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		$result = @ftp_chdir($this->conn_id, $path);
+
+		if ($result === FALSE)
+		{
+			if ($this->debug == TRUE AND $supress_debug == FALSE)
+			{
+				$this->_error('ftp_unable_to_changedir');
+			}
+			return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create a directory
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	bool
+	 */
+	function mkdir($path = '', $permissions = NULL)
+	{
+		if ($path == '' OR ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		$result = @ftp_mkdir($this->conn_id, $path);
+
+		if ($result === FALSE)
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_makdir');
+			}
+			return FALSE;
+		}
+
+		// Set file permissions if needed
+		if ( ! is_null($permissions))
+		{
+			$this->chmod($path, (int)$permissions);
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Upload a file to the server
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @param	string
+	 * @return	bool
+	 */
+	function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		if ( ! file_exists($locpath))
+		{
+			$this->_error('ftp_no_source_file');
+			return FALSE;
+		}
+
+		// Set the mode if not specified
+		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;
+
+		$result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);
+
+		if ($result === FALSE)
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_upload');
+			}
+			return FALSE;
+		}
+
+		// Set file permissions if needed
+		if ( ! is_null($permissions))
+		{
+			$this->chmod($rempath, (int)$permissions);
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename (or move) a file
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @param	bool
+	 * @return	bool
+	 */
+	function rename($old_file, $new_file, $move = FALSE)
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		$result = @ftp_rename($this->conn_id, $old_file, $new_file);
+
+		if ($result === FALSE)
+		{
+			if ($this->debug == TRUE)
+			{
+				$msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move';
+
+				$this->_error($msg);
+			}
+			return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Move a file
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	bool
+	 */
+	function move($old_file, $new_file)
+	{
+		return $this->rename($old_file, $new_file, TRUE);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename (or move) a file
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	bool
+	 */
+	function delete_file($filepath)
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		$result = @ftp_delete($this->conn_id, $filepath);
+
+		if ($result === FALSE)
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_delete');
+			}
+			return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete a folder and recursively delete everything (including sub-folders)
+	 * containted within it.
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	bool
+	 */
+	function delete_dir($filepath)
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		// Add a trailing slash to the file path if needed
+		$filepath = preg_replace("/(.+?)\/*$/", "\\1/",  $filepath);
+
+		$list = $this->list_files($filepath);
+
+		if ($list !== FALSE AND count($list) > 0)
+		{
+			foreach ($list as $item)
+			{
+				// If we can't delete the item it's probaly a folder so
+				// we'll recursively call delete_dir()
+				if ( ! @ftp_delete($this->conn_id, $item))
+				{
+					$this->delete_dir($item);
+				}
+			}
+		}
+
+		$result = @ftp_rmdir($this->conn_id, $filepath);
+
+		if ($result === FALSE)
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_delete');
+			}
+			return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set file permissions
+	 *
+	 * @access	public
+	 * @param	string 	the file path
+	 * @param	string	the permissions
+	 * @return	bool
+	 */
+	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)
+		{
+			if ($this->debug == TRUE)
+			{
+				$this->_error('ftp_unable_to_chmod');
+			}
+			return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * FTP List files in the specified directory
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_files($path = '.')
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		return ftp_nlist($this->conn_id, $path);
+	}
+
+	// ------------------------------------------------------------------------
+
+	/**
+	 * Read a directory and recreate it remotely
+	 *
+	 * This function recursively reads a folder and everything it contains (including
+	 * sub-folders) and creates a mirror via FTP based on it.  Whatever the directory structure
+	 * of the original file path will be recreated on the server.
+	 *
+	 * @access	public
+	 * @param	string	path to source with trailing slash
+	 * @param	string	path to destination - include the base folder with trailing slash
+	 * @return	bool
+	 */
+	function mirror($locpath, $rempath)
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		// Open the local file path
+		if ($fp = @opendir($locpath))
+		{
+			// Attempt to open the remote file path.
+			if ( ! $this->changedir($rempath, TRUE))
+			{
+				// If it doesn't exist we'll attempt to create the direcotory
+				if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))
+				{
+					return FALSE;
+				}
+			}
+
+			// Recursively read the local directory
+			while (FALSE !== ($file = readdir($fp)))
+			{
+				if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.')
+				{
+					$this->mirror($locpath.$file."/", $rempath.$file."/");
+				}
+				elseif (substr($file, 0, 1) != ".")
+				{
+					// Get the file extension so we can se the upload type
+					$ext = $this->_getext($file);
+					$mode = $this->_settype($ext);
+
+					$this->upload($locpath.$file, $rempath.$file, $mode);
+				}
+			}
+			return TRUE;
+		}
+
+		return FALSE;
+	}
+
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Extract the file extension
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _getext($filename)
+	{
+		if (FALSE === strpos($filename, '.'))
+		{
+			return 'txt';
+		}
+
+		$x = explode('.', $filename);
+		return end($x);
+	}
+
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set the upload type
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _settype($ext)
+	{
+		$text_types = array(
+							'txt',
+							'text',
+							'php',
+							'phps',
+							'php4',
+							'js',
+							'css',
+							'htm',
+							'html',
+							'phtml',
+							'shtml',
+							'log',
+							'xml'
+							);
+
+
+		return (in_array($ext, $text_types)) ? 'ascii' : 'binary';
+	}
+
+	// ------------------------------------------------------------------------
+
+	/**
+	 * Close the connection
+	 *
+	 * @access	public
+	 * @param	string	path to source
+	 * @param	string	path to destination
+	 * @return	bool
+	 */
+	function close()
+	{
+		if ( ! $this->_is_conn())
+		{
+			return FALSE;
+		}
+
+		@ftp_close($this->conn_id);
+	}
+
+	// ------------------------------------------------------------------------
+
+	/**
+	 * Display error message
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	bool
+	 */
+	function _error($line)
+	{
+		$CI =& get_instance();
+		$CI->lang->load('ftp');
+		show_error($CI->lang->line($line));
+	}
+
+
+}
+// END FTP Class
+
+/* End of file Ftp.php */
 /* Location: ./system/libraries/Ftp.php */
\ No newline at end of file