Make timespan() helper show fuzzier periods if required
diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php
index 2a34cf9..9f8e05b 100644
--- a/system/helpers/date_helper.php
+++ b/system/helpers/date_helper.php
@@ -163,7 +163,7 @@
  */
 if ( ! function_exists('timespan'))
 {
-	function timespan($seconds = 1, $time = '')
+	function timespan($seconds = 1, $time = '', $units = '')
 	{
 		$CI =& get_instance();
 		$CI->lang->load('date');
@@ -178,83 +178,124 @@
 			$time = time();
 		}
 
-		$seconds = ($time <= $seconds) ? 1 : $time - $seconds;
+		if ( ! is_numeric($units))
+		{
+			$units = 999;
+		}
 
-		$str = '';
-		$years = floor($seconds / 31557600);
+		if ($time <= $seconds)
+		{
+			$seconds = 1;
+		}
+		else
+		{
+			$seconds = $time - $seconds;
+		}
+
+		$str = array();
+	
+		// years
+	
+		$years = floor($seconds / 31536000);
 
 		if ($years > 0)
 		{
-			$str .= $years.' '.$CI->lang->line((($years	> 1) ? 'date_years' : 'date_year')).', ';
+			$str[] = $years.' '.$CI->lang->line((($years	> 1) ? 'date_years' : 'date_year'));
 		}
 
-		$seconds -= $years * 31557600;
-		$months = floor($seconds / 2629743);
+		$seconds -= $years * 31536000;
 
-		if ($years > 0 OR $months > 0)
-		{
-			if ($months > 0)
+		// months
+	
+		if (count($str) < $units) {
+			$months = floor($seconds / 2628000);
+
+			if ($years > 0 OR $months > 0)
 			{
-				$str .= $months.' '.$CI->lang->line((($months	> 1) ? 'date_months' : 'date_month')).', ';
-			}
+				if ($months > 0)
+				{
+					$str[] = $months.' '.$CI->lang->line((($months	> 1) ? 'date_months' : 'date_month'));
+				}
 
-			$seconds -= $months * 2629743;
+				$seconds -= $months * 2628000;
+			}
 		}
 
-		$weeks = floor($seconds / 604800);
+		// weeks
+	
+		if (count($str) < $units) {
+			$weeks = floor($seconds / 604800);
 
-		if ($years > 0 OR $months > 0 OR $weeks > 0)
-		{
-			if ($weeks > 0)
+			if ($years > 0 OR $months > 0 OR $weeks > 0)
 			{
-				$str .= $weeks.' '.$CI->lang->line((($weeks	> 1) ? 'date_weeks' : 'date_week')).', ';
-			}
+				if ($weeks > 0)
+				{
+					$str[] = $weeks.' '.$CI->lang->line((($weeks	> 1) ? 'date_weeks' : 'date_week'));
+				}
 
-			$seconds -= $weeks * 604800;
+				$seconds -= $weeks * 604800;
+			}
 		}
 
-		$days = floor($seconds / 86400);
+		// days
 
-		if ($months > 0 OR $weeks > 0 OR $days > 0)
-		{
-			if ($days > 0)
+		if (count($str) < $units) {
+			$days = floor($seconds / 86400);
+
+			if ($months > 0 OR $weeks > 0 OR $days > 0)
 			{
-				$str .= $days.' '.$CI->lang->line((($days	> 1) ? 'date_days' : 'date_day')).', ';
-			}
+				if ($days > 0)
+				{
+					$str[] = $days.' '.$CI->lang->line((($days	> 1) ? 'date_days' : 'date_day'));
+				}
 
-			$seconds -= $days * 86400;
+				$seconds -= $days * 86400;
+			}
 		}
 
-		$hours = floor($seconds / 3600);
+		// hours
 
-		if ($days > 0 OR $hours > 0)
-		{
-			if ($hours > 0)
+		if (count($str) < $units) {
+
+			$hours = floor($seconds / 3600);
+
+			if ($days > 0 OR $hours > 0)
 			{
-				$str .= $hours.' '.$CI->lang->line((($hours	> 1) ? 'date_hours' : 'date_hour')).', ';
-			}
+				if ($hours > 0)
+				{
+					$str[] = $hours.' '.$CI->lang->line((($hours	> 1) ? 'date_hours' : 'date_hour'));
+				}
 
-			$seconds -= $hours * 3600;
+				$seconds -= $hours * 3600;
+			}
 		}
 
-		$minutes = floor($seconds / 60);
+		// minutes
 
-		if ($days > 0 OR $hours > 0 OR $minutes > 0)
-		{
-			if ($minutes > 0)
+		if (count($str) < $units) {
+
+			$minutes = floor($seconds / 60);
+
+			if ($days > 0 OR $hours > 0 OR $minutes > 0)
 			{
-				$str .= $minutes.' '.$CI->lang->line((($minutes	> 1) ? 'date_minutes' : 'date_minute')).', ';
+				if ($minutes > 0)
+				{
+					$str[] = $minutes.' '.$CI->lang->line((($minutes	> 1) ? 'date_minutes' : 'date_minute'));
+				}
+
+				$seconds -= $minutes * 60;
 			}
-
-			$seconds -= $minutes * 60;
 		}
 
-		if ($str == '')
-		{
-			$str .= $seconds.' '.$CI->lang->line((($seconds	> 1) ? 'date_seconds' : 'date_second')).', ';
+		//  seconds
+
+		if (count($str) == 0) {
+			{
+				$str[] = $seconds.' '.$CI->lang->line((($seconds	> 1) ? 'date_seconds' : 'date_second'));
+			}
 		}
 
-		return substr(trim($str), 0, -1);
+		return strtolower(implode(', ', $str));
 	}
 }