Merge pull request #345 from kylefarris/patch-1

Session Class - 'user_data' Has No Default Value
diff --git a/application/config/config.php b/application/config/config.php
index 880393c..a6d10d8 100644
--- a/application/config/config.php
+++ b/application/config/config.php
@@ -79,6 +79,8 @@
 | This determines which character set is used by default in various methods
 | that require a character set to be provided.
 |
+| See http://php.net/htmlspecialchars for a list of supported charsets.
+|
 */
 $config['charset'] = 'UTF-8';
 
diff --git a/application/config/mimes.php b/application/config/mimes.php
index 90a1d18..206329f 100644
--- a/application/config/mimes.php
+++ b/application/config/mimes.php
@@ -8,7 +8,7 @@
 |
 */
 
-$mimes = array('hqx'   =>      array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
+$mimes = array('hqx'	=>	array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
 				'cpt'	=>	'application/mac-compactpro',
 				'csv'	=>	array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
 				'bin'	=>	array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),
diff --git a/application/config/routes.php b/application/config/routes.php
index 5f9a583..f30a0d1 100644
--- a/application/config/routes.php
+++ b/application/config/routes.php
@@ -23,7 +23,7 @@
 | RESERVED ROUTES
 | -------------------------------------------------------------------------
 |
-| There area two reserved routes:
+| There are two reserved routes:
 |
 |	$route['default_controller'] = 'welcome';
 |
diff --git a/application/config/smileys.php b/application/config/smileys.php
index 25d28b2..38f02a9 100644
--- a/application/config/smileys.php
+++ b/application/config/smileys.php
@@ -60,7 +60,7 @@
 	':exclaim:'		=>	array('exclaim.gif',		'19',	'19',	'excaim'),
 	':question:'	=>	array('question.gif',		'19',	'19',	'question') // no comma after last item
 
-		);
+);
 
 /* End of file smileys.php */
 /* Location: ./application/config/smileys.php */
\ No newline at end of file
diff --git a/application/config/user_agents.php b/application/config/user_agents.php
index 4746f2f..9080b43 100644
--- a/application/config/user_agents.php
+++ b/application/config/user_agents.php
@@ -11,168 +11,169 @@
 */
 
 $platforms = array (
-					'windows nt 6.0'	=> 'Windows Longhorn',
+					'windows nt 6.1'	=> 'Windows 7',
+					'windows nt 6.0'	=> 'Windows Vista',
 					'windows nt 5.2'	=> 'Windows 2003',
-					'windows nt 5.0'	=> 'Windows 2000',
 					'windows nt 5.1'	=> 'Windows XP',
+					'windows nt 5.0'	=> 'Windows 2000',
 					'windows nt 4.0'	=> 'Windows NT 4.0',
-					'winnt4.0'			=> 'Windows NT 4.0',
-					'winnt 4.0'			=> 'Windows NT',
-					'winnt'				=> 'Windows NT',
+					'winnt4.0'		=> 'Windows NT 4.0',
+					'winnt 4.0'		=> 'Windows NT',
+					'winnt'			=> 'Windows NT',
 					'windows 98'		=> 'Windows 98',
-					'win98'				=> 'Windows 98',
+					'win98'			=> 'Windows 98',
 					'windows 95'		=> 'Windows 95',
-					'win95'				=> 'Windows 95',
-					'windows'			=> 'Unknown Windows OS',
-					'os x'				=> 'Mac OS X',
-					'ppc mac'			=> 'Power PC Mac',
-					'freebsd'			=> 'FreeBSD',
-					'ppc'				=> 'Macintosh',
-					'linux'				=> 'Linux',
-					'debian'			=> 'Debian',
-					'sunos'				=> 'Sun Solaris',
-					'beos'				=> 'BeOS',
+					'win95'			=> 'Windows 95',
+					'windows'		=> 'Unknown Windows OS',
+					'os x'			=> 'Mac OS X',
+					'ppc mac'		=> 'Power PC Mac',
+					'freebsd'		=> 'FreeBSD',
+					'ppc'			=> 'Macintosh',
+					'linux'			=> 'Linux',
+					'debian'		=> 'Debian',
+					'sunos'			=> 'Sun Solaris',
+					'beos'			=> 'BeOS',
 					'apachebench'		=> 'ApacheBench',
-					'aix'				=> 'AIX',
-					'irix'				=> 'Irix',
-					'osf'				=> 'DEC OSF',
-					'hp-ux'				=> 'HP-UX',
-					'netbsd'			=> 'NetBSD',
-					'bsdi'				=> 'BSDi',
-					'openbsd'			=> 'OpenBSD',
-					'gnu'				=> 'GNU/Linux',
-					'unix'				=> 'Unknown Unix OS'
+					'aix'			=> 'AIX',
+					'irix'			=> 'Irix',
+					'osf'			=> 'DEC OSF',
+					'hp-ux'			=> 'HP-UX',
+					'netbsd'		=> 'NetBSD',
+					'bsdi'			=> 'BSDi',
+					'openbsd'		=> 'OpenBSD',
+					'gnu'			=> 'GNU/Linux',
+					'unix'			=> 'Unknown Unix OS'
 				);
 
 
 // The order of this array should NOT be changed. Many browsers return
 // multiple browser types so we want to identify the sub-type first.
 $browsers = array(
-					'Flock'				=> 'Flock',
-					'Chrome'			=> 'Chrome',
-					'Opera'				=> 'Opera',
-					'MSIE'				=> 'Internet Explorer',
+					'Flock'			=> 'Flock',
+					'Chrome'		=> 'Chrome',
+					'Opera'			=> 'Opera',
+					'MSIE'			=> 'Internet Explorer',
 					'Internet Explorer'	=> 'Internet Explorer',
-					'Shiira'			=> 'Shiira',
-					'Firefox'			=> 'Firefox',
-					'Chimera'			=> 'Chimera',
-					'Phoenix'			=> 'Phoenix',
-					'Firebird'			=> 'Firebird',
-					'Camino'			=> 'Camino',
-					'Netscape'			=> 'Netscape',
-					'OmniWeb'			=> 'OmniWeb',
-					'Safari'			=> 'Safari',
-					'Mozilla'			=> 'Mozilla',
-					'Konqueror'			=> 'Konqueror',
-					'icab'				=> 'iCab',
-					'Lynx'				=> 'Lynx',
-					'Links'				=> 'Links',
-					'hotjava'			=> 'HotJava',
-					'amaya'				=> 'Amaya',
-					'IBrowse'			=> 'IBrowse'
+					'Shiira'		=> 'Shiira',
+					'Firefox'		=> 'Firefox',
+					'Chimera'		=> 'Chimera',
+					'Phoenix'		=> 'Phoenix',
+					'Firebird'		=> 'Firebird',
+					'Camino'		=> 'Camino',
+					'Netscape'		=> 'Netscape',
+					'OmniWeb'		=> 'OmniWeb',
+					'Safari'		=> 'Safari',
+					'Mozilla'		=> 'Mozilla',
+					'Konqueror'		=> 'Konqueror',
+					'icab'			=> 'iCab',
+					'Lynx'			=> 'Lynx',
+					'Links'			=> 'Links',
+					'hotjava'		=> 'HotJava',
+					'amaya'			=> 'Amaya',
+					'IBrowse'		=> 'IBrowse'
 				);
 
 $mobiles = array(
 					// legacy array, old values commented out
 					'mobileexplorer'	=> 'Mobile Explorer',
-//					'openwave'			=> 'Open Wave',
+//					'openwave'		=> 'Open Wave',
 //					'opera mini'		=> 'Opera Mini',
-//					'operamini'			=> 'Opera Mini',
-//					'elaine'			=> 'Palm',
+//					'operamini'		=> 'Opera Mini',
+//					'elaine'		=> 'Palm',
 					'palmsource'		=> 'Palm',
 //					'digital paths'		=> 'Palm',
-//					'avantgo'			=> 'Avantgo',
-//					'xiino'				=> 'Xiino',
-					'palmscape'			=> 'Palmscape',
-//					'nokia'				=> 'Nokia',
-//					'ericsson'			=> 'Ericsson',
+//					'avantgo'		=> 'Avantgo',
+//					'xiino'			=> 'Xiino',
+					'palmscape'		=> 'Palmscape',
+//					'nokia'			=> 'Nokia',
+//					'ericsson'		=> 'Ericsson',
 //					'blackberry'		=> 'BlackBerry',
-//					'motorola'			=> 'Motorola'
+//					'motorola'		=> 'Motorola'
 
 					// Phones and Manufacturers
-					'motorola'			=> "Motorola",
-					'nokia'				=> "Nokia",
-					'palm'				=> "Palm",
-					'iphone'			=> "Apple iPhone",
-					'ipad'				=> "iPad",
-					'ipod'				=> "Apple iPod Touch",
-					'sony'				=> "Sony Ericsson",
-					'ericsson'			=> "Sony Ericsson",
+					'motorola'		=> "Motorola",
+					'nokia'			=> "Nokia",
+					'palm'			=> "Palm",
+					'iphone'		=> "Apple iPhone",
+					'ipad'			=> "iPad",
+					'ipod'			=> "Apple iPod Touch",
+					'sony'			=> "Sony Ericsson",
+					'ericsson'		=> "Sony Ericsson",
 					'blackberry'		=> "BlackBerry",
-					'cocoon'			=> "O2 Cocoon",
-					'blazer'			=> "Treo",
-					'lg'				=> "LG",
-					'amoi'				=> "Amoi",
-					'xda'				=> "XDA",
-					'mda'				=> "MDA",
-					'vario'				=> "Vario",
-					'htc'				=> "HTC",
-					'samsung'			=> "Samsung",
-					'sharp'				=> "Sharp",
-					'sie-'				=> "Siemens",
-					'alcatel'			=> "Alcatel",
-					'benq'				=> "BenQ",
-					'ipaq'				=> "HP iPaq",
-					'mot-'				=> "Motorola",
+					'cocoon'		=> "O2 Cocoon",
+					'blazer'		=> "Treo",
+					'lg'			=> "LG",
+					'amoi'			=> "Amoi",
+					'xda'			=> "XDA",
+					'mda'			=> "MDA",
+					'vario'			=> "Vario",
+					'htc'			=> "HTC",
+					'samsung'		=> "Samsung",
+					'sharp'			=> "Sharp",
+					'sie-'			=> "Siemens",
+					'alcatel'		=> "Alcatel",
+					'benq'			=> "BenQ",
+					'ipaq'			=> "HP iPaq",
+					'mot-'			=> "Motorola",
 					'playstation portable'	=> "PlayStation Portable",
-					'hiptop'			=> "Danger Hiptop",
-					'nec-'				=> "NEC",
-					'panasonic'			=> "Panasonic",
-					'philips'			=> "Philips",
-					'sagem'				=> "Sagem",
-					'sanyo'				=> "Sanyo",
-					'spv'				=> "SPV",
-					'zte'				=> "ZTE",
-					'sendo'				=> "Sendo",
+					'hiptop'		=> "Danger Hiptop",
+					'nec-'			=> "NEC",
+					'panasonic'		=> "Panasonic",
+					'philips'		=> "Philips",
+					'sagem'			=> "Sagem",
+					'sanyo'			=> "Sanyo",
+					'spv'			=> "SPV",
+					'zte'			=> "ZTE",
+					'sendo'			=> "Sendo",
 
-					// Operating Systems
-					'android'				=> "Android",
-					'symbian'				=> "Symbian",
-					'SymbianOS'				=> "SymbianOS",
-					'elaine'				=> "Palm",
-					'palm'					=> "Palm",
-					'series60'				=> "Symbian S60",
-					'windows ce'			=> "Windows CE",
+// Operating Systems
+					'android'		=> "Android",
+					'symbian'		=> "Symbian",
+					'SymbianOS'		=> "SymbianOS",
+					'elaine'		=> "Palm",
+					'palm'			=> "Palm",
+					'series60'		=> "Symbian S60",
+					'windows ce'		=> "Windows CE",
 
 					// Browsers
-					'obigo'					=> "Obigo",
-					'netfront'				=> "Netfront Browser",
-					'openwave'				=> "Openwave Browser",
-					'mobilexplorer'			=> "Mobile Explorer",
-					'operamini'				=> "Opera Mini",
-					'opera mini'			=> "Opera Mini",
+					'obigo'			=> "Obigo",
+					'netfront'		=> "Netfront Browser",
+					'openwave'		=> "Openwave Browser",
+					'mobilexplorer'		=> "Mobile Explorer",
+					'operamini'		=> "Opera Mini",
+					'opera mini'		=> "Opera Mini",
 
 					// Other
-					'digital paths'			=> "Digital Paths",
-					'avantgo'				=> "AvantGo",
-					'xiino'					=> "Xiino",
-					'novarra'				=> "Novarra Transcoder",
-					'vodafone'				=> "Vodafone",
-					'docomo'				=> "NTT DoCoMo",
-					'o2'					=> "O2",
+					'digital paths'		=> "Digital Paths",
+					'avantgo'		=> "AvantGo",
+					'xiino'			=> "Xiino",
+					'novarra'		=> "Novarra Transcoder",
+					'vodafone'		=> "Vodafone",
+					'docomo'		=> "NTT DoCoMo",
+					'o2'			=> "O2",
 
 					// Fallback
-					'mobile'				=> "Generic Mobile",
-					'wireless'				=> "Generic Mobile",
-					'j2me'					=> "Generic Mobile",
-					'midp'					=> "Generic Mobile",
-					'cldc'					=> "Generic Mobile",
-					'up.link'				=> "Generic Mobile",
-					'up.browser'			=> "Generic Mobile",
-					'smartphone'			=> "Generic Mobile",
-					'cellphone'				=> "Generic Mobile"
+					'mobile'		=> "Generic Mobile",
+					'wireless'		=> "Generic Mobile",
+					'j2me'			=> "Generic Mobile",
+					'midp'			=> "Generic Mobile",
+					'cldc'			=> "Generic Mobile",
+					'up.link'		=> "Generic Mobile",
+					'up.browser'		=> "Generic Mobile",
+					'smartphone'		=> "Generic Mobile",
+					'cellphone'		=> "Generic Mobile"
 				);
 
 // There are hundreds of bots but these are the most common.
 $robots = array(
-					'googlebot'			=> 'Googlebot',
-					'msnbot'			=> 'MSNBot',
-					'slurp'				=> 'Inktomi Slurp',
-					'yahoo'				=> 'Yahoo',
-					'askjeeves'			=> 'AskJeeves',
+					'googlebot'		=> 'Googlebot',
+					'msnbot'		=> 'MSNBot',
+					'slurp'			=> 'Inktomi Slurp',
+					'yahoo'			=> 'Yahoo',
+					'askjeeves'		=> 'AskJeeves',
 					'fastcrawler'		=> 'FastCrawler',
-					'infoseek'			=> 'InfoSeek Robot 1.0',
-					'lycos'				=> 'Lycos'
+					'infoseek'		=> 'InfoSeek Robot 1.0',
+					'lycos'			=> 'Lycos'
 				);
 
 /* End of file user_agents.php */
diff --git a/application/views/welcome_message.php b/application/views/welcome_message.php
index 0bf5a8d..d906bc8 100644
--- a/application/views/welcome_message.php
+++ b/application/views/welcome_message.php
@@ -81,7 +81,7 @@
 		<p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
 	</div>
 
-	<p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
+	<p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo  (ENVIRONMENT == 'development') ?  'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p>
 </div>
 
 </body>
diff --git a/readme.md b/readme.md
index be807db..7919465 100644
--- a/readme.md
+++ b/readme.md
@@ -8,4 +8,4 @@
  * [Community Forums](http://codeigniter.com/forums/)
  * [User Voice](http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor)
  * [Community Wiki](http://codeigniter.com/wiki/)
- * [Community IRC](http://webchat.freenode.net/?channels=codeigniter&uio=d4)
\ No newline at end of file
+ * [Community IRC](http://codeigniter.com/irc/)
\ No newline at end of file
diff --git a/system/core/Security.php b/system/core/Security.php
index 342455f..e99418b 100755
--- a/system/core/Security.php
+++ b/system/core/Security.php
@@ -525,9 +525,17 @@
 	 * @param	string
 	 * @return	string
 	 */
-	public function entity_decode($str, $charset='UTF-8')
+	public function entity_decode($str, $charset = NULL)
 	{
-		if (stristr($str, '&') === FALSE) return $str;
+		if (stristr($str, '&') === FALSE)
+		{
+			return $str;
+		}
+		
+		if (empty($charset))
+		{
+			$charset = config_item('charset');
+		}
 
 		// The reason we are not using html_entity_decode() by itself is because
 		// while it is not technically correct to leave out the semicolon
diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php
index 37d162b..7162e2a 100644
--- a/system/database/DB_active_rec.php
+++ b/system/database/DB_active_rec.php
@@ -872,11 +872,11 @@
 	 * @param	integer	the offset value
 	 * @return	object
 	 */
-	public function limit($value, $offset = '')
+	public function limit($value, $offset = NULL)
 	{
 		$this->ar_limit = (int) $value;
 
-		if ($offset != '')
+		if ( ! is_null($offset))
 		{
 			$this->ar_offset = (int) $offset;
 		}
@@ -894,7 +894,7 @@
 	 */
 	public function offset($offset)
 	{
-		$this->ar_offset = $offset;
+		$this->ar_offset = (int) $offset;
 		return $this;
 	}
 
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index f3e824d..300ca29 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -251,9 +251,10 @@
 	{
 		if ($sql == '')
 		{
+			log_message('error', 'Invalid query: '.$sql);
+
 			if ($this->db_debug)
 			{
-				log_message('error', 'Invalid query: '.$sql);
 				return $this->display_error('db_invalid_query');
 			}
 			return FALSE;
@@ -306,21 +307,23 @@
 			// This will trigger a rollback if transactions are being used
 			$this->_trans_status = FALSE;
 
+			// Grab the error number and message now, as we might run some
+			// additional queries before displaying the error
+			$error_no = $this->_error_number();
+			$error_msg = $this->_error_message();
+
+			// Log errors
+			log_message('error', 'Query error: '.$error_msg);
+
 			if ($this->db_debug)
 			{
-				// grab the error number and message now, as we might run some
-				// additional queries before displaying the error
-				$error_no = $this->_error_number();
-				$error_msg = $this->_error_message();
-
 				// We call this function in order to roll-back queries
 				// if transactions are enabled.  If we don't call this here
 				// the error message will trigger an exit, causing the
 				// transactions to remain in limbo.
 				$this->trans_complete();
 
-				// Log and display errors
-				log_message('error', 'Query error: '.$error_msg);
+				// Display errors
 				return $this->display_error(
 										array(
 												'Error Number: '.$error_no,
diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php
index 6c559bb..e14bc2f 100644
--- a/system/helpers/date_helper.php
+++ b/system/helpers/date_helper.php
@@ -54,10 +54,8 @@
 
 			return $system_time;
 		}
-		else
-		{
-			return time();
-		}
+
+		return time();
 	}
 }
 
@@ -85,12 +83,18 @@
 	function mdate($datestr = '', $time = '')
 	{
 		if ($datestr == '')
-			return '';
+		{
+			return '';			
+		}
 
-		if ($time == '')
-			$time = now();
+		$time = ($time == '') ? now() : $time;
 
-		$datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr));
+		$datestr = str_replace(
+			'%\\', 
+			'', 
+			preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr)
+		);
+
 		return date($datestr, $time);
 	}
 }
@@ -162,14 +166,7 @@
 			$time = time();
 		}
 
-		if ($time <= $seconds)
-		{
-			$seconds = 1;
-		}
-		else
-		{
-			$seconds = $time - $seconds;
-		}
+		$seconds = ($time <= $seconds) ? 1 : $time - $seconds;
 
 		$str = '';
 		$years = floor($seconds / 31536000);
@@ -303,9 +300,18 @@
 	function local_to_gmt($time = '')
 	{
 		if ($time == '')
+		{
 			$time = time();
-
-		return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time));
+		}
+		
+		return mktime(
+			gmdate("H", $time), 
+			gmdate("i", $time), 
+			gmdate("s", $time), 
+			gmdate("m", $time), 
+			gmdate("d", $time), 
+			gmdate("Y", $time)
+		);
 	}
 }
 
@@ -366,14 +372,14 @@
 		$time = str_replace(' ', '', $time);
 
 		// YYYYMMDDHHMMSS
-		return  mktime(
-						substr($time, 8, 2),
-						substr($time, 10, 2),
-						substr($time, 12, 2),
-						substr($time, 4, 2),
-						substr($time, 6, 2),
-						substr($time, 0, 4)
-						);
+		return mktime(
+			substr($time, 8, 2),
+			substr($time, 10, 2),
+			substr($time, 12, 2),
+			substr($time, 4, 2),
+			substr($time, 6, 2),
+			substr($time, 0, 4)
+		);
 	}
 }
 
@@ -475,13 +481,19 @@
 			$ampm = strtolower($split['2']);
 
 			if (substr($ampm, 0, 1) == 'p' AND $hour < 12)
-				$hour = $hour + 12;
+			{
+				$hour = $hour + 12;				
+			}
 
 			if (substr($ampm, 0, 1) == 'a' AND $hour == 12)
+			{
 				$hour =  '00';
-
+			}
+			
 			if (strlen($hour) == 1)
-				$hour = '0'.$hour;
+			{
+				$hour = '0'.$hour;				
+			}
 		}
 
 		return mktime($hour, $min, $sec, $month, $day, $year);
@@ -501,16 +513,16 @@
  */
 if ( ! function_exists('nice_date'))
 {
-	function nice_date($bad_date='', $format=false) 
+	function nice_date($bad_date = '', $format = FALSE) 
 	{
 		if (empty($bad_date))
 		{
 			return 'Unknown';
 		}
+
 		// Date like: YYYYMM
-		if (preg_match('/^\d{6}$/',$bad_date)) 
+		if (preg_match('/^\d{6}$/', $bad_date)) 
 		{
-			//echo $bad_date." ";
 			if (in_array(substr($bad_date, 0, 2),array('19', '20'))) 
 			{
 				$year  = substr($bad_date, 0, 4);
@@ -521,8 +533,8 @@
 				$month  = substr($bad_date, 0, 2);
 				$year   = substr($bad_date, 2, 4);
 			}
+			
 			return date($format, strtotime($year . '-' . $month . '-01'));
-		    
 		}
 		
 		// Date Like: YYYYMMDD
@@ -531,6 +543,7 @@
 			$month = substr($bad_date, 0, 2);
 			$day   = substr($bad_date, 2, 2);
 			$year  = substr($bad_date, 4, 4);
+			
 			return date($format, strtotime($month . '/01/' . $year));
 		}
 		
@@ -574,8 +587,7 @@
 		$CI =& get_instance();
 		$CI->lang->load('date');
 
-		if ($default == 'GMT')
-			$default = 'UTC';
+		$default = ($default == 'GMT') ? 'UTC' : $default;
 
 		$menu = '<select name="'.$name.'"';
 
@@ -618,60 +630,58 @@
 		// some items appear to be in the wrong order
 
 		$zones = array(
-						'UM12'		=> -12,
-						'UM11'		=> -11,
-						'UM10'		=> -10,
-						'UM95'		=> -9.5,
-						'UM9'		=> -9,
-						'UM8'		=> -8,
-						'UM7'		=> -7,
-						'UM6'		=> -6,
-						'UM5'		=> -5,
-						'UM45'		=> -4.5,
-						'UM4'		=> -4,
-						'UM35'		=> -3.5,
-						'UM3'		=> -3,
-						'UM2'		=> -2,
-						'UM1'		=> -1,
-						'UTC'		=> 0,
-						'UP1'		=> +1,
-						'UP2'		=> +2,
-						'UP3'		=> +3,
-						'UP35'		=> +3.5,
-						'UP4'		=> +4,
-						'UP45'		=> +4.5,
-						'UP5'		=> +5,
-						'UP55'		=> +5.5,
-						'UP575'		=> +5.75,
-						'UP6'		=> +6,
-						'UP65'		=> +6.5,
-						'UP7'		=> +7,
-						'UP8'		=> +8,
-						'UP875'		=> +8.75,
-						'UP9'		=> +9,
-						'UP95'		=> +9.5,
-						'UP10'		=> +10,
-						'UP105'		=> +10.5,
-						'UP11'		=> +11,
-						'UP115'		=> +11.5,
-						'UP12'		=> +12,
-						'UP1275'	=> +12.75,
-						'UP13'		=> +13,
-						'UP14'		=> +14
-					);
+			'UM12'		=> -12,
+			'UM11'		=> -11,
+			'UM10'		=> -10,
+			'UM95'		=> -9.5,
+			'UM9'		=> -9,
+			'UM8'		=> -8,
+			'UM7'		=> -7,
+			'UM6'		=> -6,
+			'UM5'		=> -5,
+			'UM45'		=> -4.5,
+			'UM4'		=> -4,
+			'UM35'		=> -3.5,
+			'UM3'		=> -3,
+			'UM2'		=> -2,
+			'UM1'		=> -1,
+			'UTC'		=> 0,
+			'UP1'		=> +1,
+			'UP2'		=> +2,
+			'UP3'		=> +3,
+			'UP35'		=> +3.5,
+			'UP4'		=> +4,
+			'UP45'		=> +4.5,
+			'UP5'		=> +5,
+			'UP55'		=> +5.5,
+			'UP575'		=> +5.75,
+			'UP6'		=> +6,
+			'UP65'		=> +6.5,
+			'UP7'		=> +7,
+			'UP8'		=> +8,
+			'UP875'		=> +8.75,
+			'UP9'		=> +9,
+			'UP95'		=> +9.5,
+			'UP10'		=> +10,
+			'UP105'		=> +10.5,
+			'UP11'		=> +11,
+			'UP115'		=> +11.5,
+			'UP12'		=> +12,
+			'UP1275'	=> +12.75,
+			'UP13'		=> +13,
+			'UP14'		=> +14
+		);
 
 		if ($tz == '')
 		{
 			return $zones;
 		}
-
-		if ($tz == 'GMT')
-			$tz = 'UTC';
-
+		
+		$tz = ($tz == 'GMT') ? 'UTC' : $tz;
+		
 		return ( ! isset($zones[$tz])) ? 0 : $zones[$tz];
 	}
 }
 
-
 /* End of file date_helper.php */
 /* Location: ./system/helpers/date_helper.php */
\ No newline at end of file
diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
index d9305c0..130daee 100644
--- a/system/helpers/form_helper.php
+++ b/system/helpers/form_helper.php
@@ -642,11 +642,8 @@
 		{
 			return $str;
 		}
-
-		$str = htmlspecialchars($str);
-
-		// In case htmlspecialchars misses these.
-		$str = str_replace(array("'", '"'), array("&#39;", "&quot;"), $str);
+		
+		$str = html_escape($str);
 
 		if ($field_name != '')
 		{
diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php
index 9fa69f4..dd8ffad 100644
--- a/system/helpers/string_helper.php
+++ b/system/helpers/string_helper.php
@@ -215,12 +215,9 @@
 						case 'nozero'	:	$pool = '123456789';
 							break;
 					}
-
-					$str = '';
-					for ($i=0; $i < $len; $i++)
-					{
-						$str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
-					}
+					
+					$str = substr(str_shuffle(str_repeat($pool, ceil($len/strlen($pool)))),0,$len);
+					
 					return $str;
 				break;
 			case 'unique'	:
diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php
index 19b4eec..82e686e 100644
--- a/system/helpers/typography_helper.php
+++ b/system/helpers/typography_helper.php
@@ -39,9 +39,7 @@
 	function nl2br_except_pre($str)
 	{
 		$CI =& get_instance();
-
 		$CI->load->library('typography');
-
 		return $CI->typography->nl2br_except_pre($str);
 	}
 }
@@ -82,9 +80,15 @@
  */
 if ( ! function_exists('entity_decode'))
 {
-	function entity_decode($str, $charset='UTF-8')
+	function entity_decode($str, $charset = NULL)
 	{
 		global $SEC;
+		
+		if (empty($charset))
+		{
+			$charset = config_item('charset');
+		}
+		
 		return $SEC->entity_decode($str, $charset);
 	}
 }
diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php
index 4763ca2..94cb882 100644
--- a/system/language/english/migration_lang.php
+++ b/system/language/english/migration_lang.php
@@ -5,7 +5,7 @@
 $lang['migration_multiple_version']		= "This are multiple migrations with the same version number: %d.";
 $lang['migration_class_doesnt_exist']	= "The migration class \"%s\" could not be found.";
 $lang['migration_missing_up_method']	= "The migration class \"%s\" is missing an 'up' method.";
-$lang['migration_missing_down_method']	= "The migration class \"%s\" is missing an 'up' method.";
+$lang['migration_missing_down_method']	= "The migration class \"%s\" is missing a 'down' method.";
 $lang['migration_invalid_filename']		= "Migration \"%s\" has an invalid filename.";
 
 
diff --git a/user_guide/changelog.html b/user_guide/changelog.html
index c203746..005237e 100644
--- a/user_guide/changelog.html
+++ b/user_guide/changelog.html
@@ -65,42 +65,44 @@
 <ul>
 	<li>General Changes
 		<ul>
-			<li class="reactor">Added Android to the list of user agents.</li>
-			<li class="reactor">Callback validation rules can now accept parameters like any other validation rule.</li>
-			<li class="reactor">Ability to log certain error types, not all under a threshold.</li>
-			<li class="reactor">Added html_escape() to <a href="general/common_functions.html">Common functions</a> to escape HTML output for preventing XSS.</li>
+			<li>Added Android to the list of user agents.</li>
+			<li>Added Windows 7 to the list of user platforms.</li>
+			<li>Callback validation rules can now accept parameters like any other validation rule.</li>
+			<li>Ability to log certain error types, not all under a threshold.</li>
+			<li>Added html_escape() to <a href="general/common_functions.html">Common functions</a> to escape HTML output for preventing XSS.</li>
 		</ul>
 	</li>
 	<li>Helpers
 		<ul>
-			<li class="reactor">Added <samp>increment_string()</samp> to <a href="helpers/string_helper.html">String Helper</a> to turn "foo" into "foo-1" or "foo-1" into "foo-2".</li>
-        	<li>Altered form helper - made action on form_open_multipart helper function call optional.  Fixes (#65)</li>
+			<li>Added <samp>increment_string()</samp> to <a href="helpers/string_helper.html">String Helper</a> to turn "foo" into "foo-1" or "foo-1" into "foo-2".</li>
+        		<li>Altered form helper - made action on form_open_multipart helper function call optional.  Fixes (#65)</li>
 			<li><samp>url_title()</samp> will now trim extra dashes from beginning and end.</li>
+			<li>Improved speed of <a href="helpers/string_helper.html">String Helper</a>'s <b>random_string()</b> method</li>
 		</ul>
 	</li>
 	<li>Database
 		<ul>
-			<li class="reactor">Added a <a href="http://www.cubrid.org/" target="_blank">CUBRID</a> driver to the <a href="database/index.html">Database Driver</a>. Thanks to the CUBRID team for supplying this patch.</li>
-			<li class="reactor">Typecast limit and offset in the <a href="database/queries.html">Database Driver</a> to integers to avoid possible injection.</li>
-			<li class="reactor">
+			<li>Added a <a href="http://www.cubrid.org/" target="_blank">CUBRID</a> driver to the <a href="database/index.html">Database Driver</a>. Thanks to the CUBRID team for supplying this patch.</li>
+			<li>Typecast limit and offset in the <a href="database/queries.html">Database Driver</a> to integers to avoid possible injection.</li>
+			<li>
 				Added additional option 'none' for the optional third argument for  <kbd>$this->db->like()</kbd> in the <a href="database/active_record.html">Database Driver</a>.
 			</li>
 		</ul>
 	</li>
 	<li>Libraries
 		<ul>
-			<li class="reactor">Changed <kbd>$this->cart->insert()</kbd> in the <a href="libraries/cart.html">Cart Library</a> to return the Row ID if a single item was inserted successfully.</li>
-			<li class="reactor">Added support to set an optional parameter in your callback rules of validation using the <a href="libraries/form_validation.html">Form Validation Library</a>.</li>
-			<li class="reactor">Added a <a href="libraries/migration.html">Migration Library</a> to assist with applying incremental updates to your database schema.</li>
-			<li class="reactor">Driver children can be located in any package path.</li>
-			<li class="reactor">Added max_filename_increment config setting for Upload library.</li>
+			<li>Changed <kbd>$this->cart->insert()</kbd> in the <a href="libraries/cart.html">Cart Library</a> to return the Row ID if a single item was inserted successfully.</li>
+			<li>Added support to set an optional parameter in your callback rules of validation using the <a href="libraries/form_validation.html">Form Validation Library</a>.</li>
+			<li>Added a <a href="libraries/migration.html">Migration Library</a> to assist with applying incremental updates to your database schema.</li>
+			<li>Driver children can be located in any package path.</li>
+			<li>Added max_filename_increment config setting for Upload library.</li>
 			<li><samp>CI_Loader::_ci_autoloader()</samp> is now a protected method.</li>
-			<li class="reactor">Added <kbd>is_unique</kbd> to the <a href="libraries/form_validation.html">Form Validation library</a>.</li>
+			<li>Added <kbd>is_unique</kbd> to the <a href="libraries/form_validation.html">Form Validation library</a>.</li>
 		</ul>
 	</li>
 	<li>Core
 		<ul>
-			<li class="reactor">Changed private functions in CI_URI to protected so MY_URI can override them.</li>
+			<li>Changed private functions in CI_URI to protected so MY_URI can override them.</li>
 		</ul>
 	</li>
 </ul>
@@ -112,6 +114,7 @@
 	<li class="reactor">Fixed a bug (Reactor #19) where 1) the 404_override route was being ignored in some cases, and 2) auto-loaded libraries were not available to the 404_override controller when a controller existed but the requested method did not.</li>
 	<li class="rector">Fixed a bug (Reactor #89) where MySQL export would fail if the table had hyphens or other non alphanumeric/underscore characters.</li>
     <li class="reactor">Fixed a bug (#200) where MySQL queries would be malformed after calling <samp>count_all()</samp> then <samp>db->get()</samp></li>
+    <li class="reactor">Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled</li>
     <li>Fixed a bug (#181) where a mis-spelling was in the form validation language file.</li>
 	<li>Fixed a bug (#160) - Removed unneeded array copy in the file cache driver.</li>
 	<li>Fixed a bug (#150) - <samp>field_data()</samp> now correctly returns column length.</li>
diff --git a/user_guide/database/results.html b/user_guide/database/results.html
index ec5f977..a47e335 100644
--- a/user_guide/database/results.html
+++ b/user_guide/database/results.html
@@ -105,8 +105,8 @@
 	<br />
 	foreach ($query->result('User') as $user)<br />
 	{<br />
-	&nbsp;&nbsp;&nbsp;echo $row->name; // call attributes<br />
-	&nbsp;&nbsp;&nbsp;echo $row->reverse_name(); // or methods defined on the 'User' class<br />
+	&nbsp;&nbsp;&nbsp;echo $user->name; // call attributes<br />
+	&nbsp;&nbsp;&nbsp;echo $user->reverse_name(); // or methods defined on the 'User' class<br />
 	}
 	</code>
 
diff --git a/user_guide/general/cli.html b/user_guide/general/cli.html
index befc999..222a77c 100644
--- a/user_guide/general/cli.html
+++ b/user_guide/general/cli.html
@@ -83,7 +83,7 @@
 
 <ul>
 	<li>Run your cron-jobs without needing to use wget or curl</li>
-	<li>Make your cron-jobs inaccessible from being loaded in the URL by checking for <kbd>IS_CLI</kbd></li>
+	<li>Make your cron-jobs inaccessible from being loaded in the URL by checking for <kbd>$this->input->is_cli_request()</kbd></li>
 	<li>Make interactive "tasks" that can do things like set permissions, prune cache folders, run backups, etc.</li>
 	<li>Integrate with other applications in other languages. For example, a random C++ script could call one command and run code in your models!</li>
 </ul>
diff --git a/user_guide/general/profiling.html b/user_guide/general/profiling.html
index 9895b02..0993da5 100644
--- a/user_guide/general/profiling.html
+++ b/user_guide/general/profiling.html
@@ -155,6 +155,11 @@
 			<td class="td">TRUE</td>
 		</tr>
 		<tr>
+			<td class="td"><strong>session_data</strong></td>
+			<td class="td">Data stored in current session</td>
+			<td class="td">TRUE</td>
+		</tr>
+		<tr>
 			<td class="td"><strong>query_toggle_count</strong></td>
 			<td class="td">The number of queries after which the query block will default to hidden.</td>
 			<td class="td">25</td>
diff --git a/user_guide/general/requirements.html b/user_guide/general/requirements.html
index 405798f..de0ee76 100644
--- a/user_guide/general/requirements.html
+++ b/user_guide/general/requirements.html
@@ -59,7 +59,7 @@
 
 <ul>
 	<li><a href="http://www.php.net/">PHP</a> version 5.1.6 or newer.</li>
-	<li>A Database is required for most web application programming. Current supported databases are MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, SQLite, and ODBC.</li>
+	<li>A Database is required for most web application programming. Current supported databases are MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, SQLite, ODBC and CUBRID.</li>
 </ul>
 
 
diff --git a/user_guide/helpers/form_helper.html b/user_guide/helpers/form_helper.html
index dd935eb..0afe0eb 100644
--- a/user_guide/helpers/form_helper.html
+++ b/user_guide/helpers/form_helper.html
@@ -84,7 +84,7 @@
 
 <p>The above example would create a form that points to your base URL plus the "email/send" URI segments, like this:</p>
 
-<code>&lt;form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send" /></code>
+<code>&lt;form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send" /></code>
 
 <h4>Adding Attributes</h4>
 
@@ -97,7 +97,7 @@
 
 <p>The above example would create a form similar to this:</p>
 
-<code>&lt;form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send" &nbsp;class="email" &nbsp;id="myform" /></code>
+<code>&lt;form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send" &nbsp;class="email" &nbsp;id="myform" /></code>
 
 <h4>Adding Hidden Input Fields</h4>
 
@@ -110,7 +110,7 @@
 
 <p>The above example would create a form similar to this:</p>
 
-<code>&lt;form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send"><br />
+<code>&lt;form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send"><br />
 &lt;input type="hidden" name="username" value="Joe" /><br />
 &lt;input type="hidden" name="member_id" value="234" /></code>
 
diff --git a/user_guide/installation/downloads.html b/user_guide/installation/downloads.html
index f36b2bc..bb18f1d 100644
--- a/user_guide/installation/downloads.html
+++ b/user_guide/installation/downloads.html
@@ -58,7 +58,9 @@
 <h1>Downloading CodeIgniter</h1>
 
 <ul>
-	<li><a href="http://codeigniter.com/downloads/">CodeIgniter V 2.0.2 (Current version)</a></li>
+	<li><a href="http://codeigniter.com/downloads/">CodeIgniter V 2.1.0 (Current version)</a></li>
+	<li><a href="http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.3.zip">CodeIgniter V 2.0.3</a></li>
+	<li><a href="http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.2.zip">CodeIgniter V 2.0.2</a></li>
 	<li><a href="http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.1.zip">CodeIgniter V 2.0.1</a></li>
 	<li><a href="http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.0.zip">CodeIgniter V 2.0.0</a></li>
 	<li><a href="http://codeigniter.com/download_files/CodeIgniter_1.7.3.zip">CodeIgniter V 1.7.3</a></li>
@@ -86,14 +88,14 @@
 
 
 
-<h1 id="hg">Mercurial Server</h1>
-<p><a href="http://mercurial.selenic.com">Mercurial</a> is a distributed version control system.</p>
+<h1 id="git">Git Server</h1>
+<p><a href="http://git-scm.com/about">Git</a> is a distributed version control system.</p>
 
-							<p>Public Hg access is available at <a href="http://bitbucket.org/ellislab/codeigniter-reactor/">BitBucket</a>.
+							<p>Public Git access is available at <a href="https://github.com/EllisLab/CodeIgniter">GitHub</a>.
 								Please note that while every effort is made to keep this code base functional, we cannot guarantee the functionality of code taken
 								from the tip.</p>
 
-							<p>Beginning with version 1.6.1, stable tags are also available via BitBucket, simply select the version from the Tags dropdown.</p>
+							<p>Beginning with version 2.0.3, stable tags are also available via GitHub, simply select the version from the Tags dropdown.</p>
 </div>
 <!-- END CONTENT -->
 
diff --git a/user_guide/installation/upgrade_210.html b/user_guide/installation/upgrade_210.html
new file mode 100644
index 0000000..6e8ddec
--- /dev/null
+++ b/user_guide/installation/upgrade_210.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Upgrading from 2.0.3 to 2.1.0 : CodeIgniter User Guide</title>
+
+<style type='text/css' media='all'>@import url('../userguide.css');</style>
+<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />
+
+<script type="text/javascript" src="../nav/nav.js"></script>
+<script type="text/javascript" src="../nav/prototype.lite.js"></script>
+<script type="text/javascript" src="../nav/moo.fx.js"></script>
+<script type="text/javascript" src="../nav/user_guide_menu.js"></script>
+
+<meta http-equiv='expires' content='-1' />
+<meta http-equiv= 'pragma' content='no-cache' />
+<meta name='robots' content='all' />
+<meta name='author' content='ExpressionEngine Dev Team' />
+<meta name='description' content='CodeIgniter User Guide' />
+
+</head>
+<body>
+
+<!-- START NAVIGATION -->
+<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
+<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div>
+<div id="masthead">
+<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
+<tr>
+<td><h1>CodeIgniter User Guide Version 2.1.0</h1></td>
+<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td>
+</tr>
+</table>
+</div>
+<!-- END NAVIGATION -->
+
+
+<!-- START BREADCRUMB -->
+<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
+<tr>
+<td id="breadcrumb">
+<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp;
+<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp;
+Upgrading from 2.0.3 to 2.1.0
+</td>
+<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td>
+</tr>
+</table>
+<!-- END BREADCRUMB -->
+
+<br clear="all" />
+
+
+<!-- START CONTENT -->
+<div id="content">
+
+<h1>Upgrading from 2.0.3 to 2.1.0</h1>
+
+<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p>
+
+<h2>Step 1: Update your CodeIgniter files</h2>
+
+<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p>
+
+<h2>Step 2: Replace config/user_agents.php</h2>
+
+<p>This config file has been updated to contain more user agent types, please copy it to <kbd>application/config/user_agents.php</kbd>.</p>
+
+<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p>
+	
+
+	
+
+</div>
+<!-- END CONTENT -->
+
+
+<div id="footer">
+<p>
+Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a>
+&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
+<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
+<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
+Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a>
+</p>
+<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2011 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a></p>
+</div>
+
+</body>
+</html>
\ No newline at end of file