### Eclipse Workspace Patch 1.0
#P trunk
Index: plugins/Live/API.php
===================================================================
--- plugins/Live/API.php	(revision 2731)
+++ plugins/Live/API.php	(working copy)
@@ -33,7 +33,7 @@
 		}
 		return self::$instance;
 	}
-	
+
 	const TYPE_FETCH_VISITS = 1;
 	const TYPE_FETCH_PAGEVIEWS = 2;
 
@@ -51,7 +51,7 @@
 	public function getLastVisitsForVisitor( $visitorId, $idSite, $limit = 10 )
 	{
 		Piwik::checkUserHasViewAccess($idSite);
-		$visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $visitorId, $limit);
+		$visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $period = null, $date = null, $limit, $offset = null, $minIdVisit = null, $visitorId);
 		$table = $this->getCleanedVisitorsFromDetails($visitorDetails, $idSite);
 		return $table;
 	}
@@ -62,7 +62,7 @@
 	public function getLastVisits( $idSite, $limit = 10, $minIdVisit = false )
 	{
 		Piwik::checkUserHasViewAccess($idSite);
-		$visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $visitorId = null, $limit, $minIdVisit);
+		$visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $period = null, $date = null, $limit, $offset = null, $minIdVisit, $visitorId = null);
 		$table = $this->getCleanedVisitorsFromDetails($visitorDetails, $idSite);
 		return $table;
 	}
@@ -70,10 +70,10 @@
 	/*
 	 * @return Piwik_DataTable
 	 */
-	public function getLastVisitsDetails( $idSite, $limit = 1000, $minIdVisit = false )
+	public function getLastVisitsDetails( $idSite, $period = null, $date = null, $limit = 25, $filter_offset = 0, $minIdVisit = false )
 	{
 		Piwik::checkUserHasViewAccess($idSite);
-		$visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $visitorId = null, $limit, $minIdVisit);
+		$visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $period, $date, $limit, $filter_offset, $minIdVisit); 
 		$dataTable = $this->getCleanedVisitorsFromDetails($visitorDetails, $idSite);
 		return $dataTable;
 	}
@@ -118,7 +118,7 @@
 		$visitorData = $this->loadLastVisitorInLastXTimeFromDatabase($idSite, $minutes, $days = 0, self::TYPE_FETCH_PAGEVIEWS);
 		return $visitorData;
 	}
-	
+
 	/*
 	 * @return Piwik_DataTable
 	 */
@@ -144,7 +144,7 @@
 			$sql = "
 				SELECT DISTINCT " .Piwik_Common::prefixTable('log_action').".name AS pageUrl
 				FROM " .Piwik_Common::prefixTable('log_link_visit_action')."
-					INNER JOIN " .Piwik_Common::prefixTable('log_action')." 
+					INNER JOIN " .Piwik_Common::prefixTable('log_action')."
 					ON  " .Piwik_Common::prefixTable('log_link_visit_action').".idaction_url = " .Piwik_Common::prefixTable('log_action').".idaction
 				WHERE " .Piwik_Common::prefixTable('log_link_visit_action').".idvisit = $idvisit;
 				 ";
@@ -154,7 +154,7 @@
 			$sql = "
 				SELECT DISTINCT " .Piwik_Common::prefixTable('log_action').".name AS pageUrl
 				FROM " .Piwik_Common::prefixTable('log_link_visit_action')."
-					INNER JOIN " .Piwik_Common::prefixTable('log_action')." 
+					INNER JOIN " .Piwik_Common::prefixTable('log_action')."
 					ON  " .Piwik_Common::prefixTable('log_link_visit_action').".idaction_name = " .Piwik_Common::prefixTable('log_action').".idaction
 				WHERE " .Piwik_Common::prefixTable('log_link_visit_action').".idvisit = $idvisit;
 				 ";
@@ -169,13 +169,13 @@
 	/*
 	 * @return array
 	 */
-	private function loadLastVisitorDetailsFromDatabase($idSite, $visitorId = null, $limit = null, $minIdVisit = false )
+	private function loadLastVisitorDetailsFromDatabase($idSite, $period = null, $date = null, $limit = null, $offset = null, $minIdVisit = false, $visitorId = null)
 	{
 		$where = $whereBind = array();
 
 		$where[] = Piwik_Common::prefixTable('log_visit') . ".idsite = ? ";
 		$whereBind[] = $idSite;
-
+		
 		if(!empty($visitorId))
 		{
 			$where[] = Piwik_Common::prefixTable('log_visit') . ".visitor_idcookie = ? ";
@@ -188,23 +188,42 @@
 			$whereBind[] = $minIdVisit;
 		}
 
+		//increse limit by offset when visitor paginates
+		if(isset($offset)) {
+			$limit += $offset;
+		}
+		
+		// SQL Filter with provided period
+		if (!empty($period) && !empty($date)) {
+
+			$currentSite = new Piwik_Site($idSite);
+			$currentTimezone = $currentSite->getTimezone();
+			$processedDate = Piwik_Date::factory($date, $currentTimezone);
+			$processedPeriod = Piwik_Period::factory($period, $processedDate);
+
+			array_push(     $where, Piwik_Common::prefixTable('log_visit') . ".visit_first_action_time BETWEEN ? AND ?");
+			array_push(     $whereBind,
+			$processedPeriod->getDateStart()->toString(),
+			$processedPeriod->getDateEnd()->addDay(1)->toString());
+		}
+
 		$sqlWhere = "";
 		if(count($where) > 0)
 		{
 			$sqlWhere = " WHERE " . join(' AND ', $where);
 		}
 
-		$sql = "SELECT 	" . Piwik_Common::prefixTable('log_visit') . ".* , 
+		$sql = "SELECT 	" . Piwik_Common::prefixTable('log_visit') . ".* ,
 						" . Piwik_Common::prefixTable ( 'goal' ) . ".match_attribute
 				FROM " . Piwik_Common::prefixTable('log_visit') . "
-					LEFT JOIN ".Piwik_Common::prefixTable('log_conversion')." 
+					LEFT JOIN ".Piwik_Common::prefixTable('log_conversion')."
 					ON " . Piwik_Common::prefixTable('log_visit') . ".idvisit = " . Piwik_Common::prefixTable('log_conversion') . ".idvisit
-					LEFT JOIN ".Piwik_Common::prefixTable('goal')." 
+					LEFT JOIN ".Piwik_Common::prefixTable('goal')."
 					ON (" . Piwik_Common::prefixTable('goal') . ".idsite = " . Piwik_Common::prefixTable('log_visit') . ".idsite
 						AND  " . Piwik_Common::prefixTable('goal') . ".idgoal = " . Piwik_Common::prefixTable('log_conversion') . ".idgoal)
 					AND " . Piwik_Common::prefixTable('goal') . ".deleted = 0
-				$sqlWhere
-				ORDER BY idsite,idvisit DESC
+					$sqlWhere
+				ORDER BY idvisit DESC
 				LIMIT $limit";
 
 		return Piwik_FetchAll($sql, $whereBind);
@@ -235,8 +254,14 @@
 
 		if($days != 0)
 		{
-			$timeLimit = mktime(0, 0, 0, date("m"),   date("d") - $days + 1,   date("Y"));
-			$where[] = " visit_last_action_time > '".date('Y-m-d H:i:s', $timeLimit)."'";
+			$oSite = new Piwik_Site($idSite);
+			$sTimezone = $oSite->getTimezone();
+			
+			$oDate = Piwik_Date::factory("now");
+			$oDate = $oDate->setTimezone($sTimezone);
+			
+			$where[] = " visit_last_action_time > '".$oDate->getDateStartUTC()."'";
+
 		}
 
 		$sqlWhere = "";
@@ -252,31 +277,31 @@
 				FROM " . Piwik_Common::prefixTable('log_visit') . "
 				$sqlWhere
 				ORDER BY idsite,idvisit DESC";
-		 }
-		 // Pages
-		 elseif($type == self::TYPE_FETCH_PAGEVIEWS)
-		 {
+		}
+		// Pages
+		elseif($type == self::TYPE_FETCH_PAGEVIEWS)
+		{
 			$sql = "SELECT " . Piwik_Common::prefixTable('log_link_visit_action') . ".idaction_url
 					FROM " . Piwik_Common::prefixTable('log_link_visit_action') . "
-    					INNER JOIN " . Piwik_Common::prefixTable('log_visit') . " 
+    					INNER JOIN " . Piwik_Common::prefixTable('log_visit') . "
     					ON " . Piwik_Common::prefixTable('log_visit') . ".idvisit = " . Piwik_Common::prefixTable('log_link_visit_action') . ".idvisit
-				$sqlWhere";
-		 }
-		 else
-		 {
-		 	// no $type is set --> ERROR
-		 	throw new Exception("type parameter is not properly set.");
-		 }
+    					$sqlWhere";
+		}
+		else
+		{
+			// no $type is set --> ERROR
+			throw new Exception("type parameter is not properly set.");
+		}
 
 		// return $sql by fetching
 		return Piwik_FetchAll($sql, $whereBind);
 	}
-	
-	
+
+
 	/**
 	 * Removes fields that are not meant to be displayed (md5 config hash)
 	 * Or that the user should only access if he is super user (cookie, IP)
-	 * 
+	 *
 	 * @return void
 	 */
 	private function cleanVisitorDetails( &$visitorDetails )
@@ -295,5 +320,5 @@
 			}
 		}
 	}
-	
+
 }
Index: plugins/Live/templates/index.tpl
===================================================================
--- plugins/Live/templates/index.tpl	(revision 2731)
+++ plugins/Live/templates/index.tpl	(working copy)
@@ -61,7 +61,7 @@
 		$("#visitsTotal").load("index.php?module=Live&idSite={/literal}{$idSite}{literal}&action=ajaxTotalVisitors");
 	}
 
-	// updates the visit table, to refresh the already presented visotors pages
+	// updates the visit table, to refresh the already presented visitors pages
 	function updateVisitBox()
 	{
 		$("#visitsLive").load("index.php?module=Live&idSite={/literal}{$idSite}{literal}&action=getLastVisitsStart");
@@ -79,67 +79,58 @@
 </script>
 
 <style>
-#visitsLive {
-	text-align:left;
-	font-size:90%;
+ #visitsLive {
+        text-align:left;
+        font-size:90%;
+        color:#444444;
+ }
+ #visitsLive .datetime, #visitsLive .country, #visitsLive .referer, #visitsLive .settings, #visitsLive .returning , #visitsLive .countActions{
+        border-bottom: 1px solid #d3d1c5;
+        border-right:1px solid #d3d1c5;
+        padding:5px 5px 5px 12px;
 }
-#visitsLive .datetime, #visitsLive .country, #visitsLive .referer, #visitsLive .settings, #visitsLive .returning , #visitsLive .countActions{
-	border-bottom:1px solid #C1DAD7;
-	border-right:1px solid #C1DAD7;
-	padding:5px 5px 5px 12px;
-}
 
-#visitsLive .datetime {
-	background:#D4E3ED url(plugins/CoreHome/templates/images/bg_header.jpg) repeat-x scroll 0 0;
-	border-top:1px solid #C1DAD7;
-	color:#6D929B;
-	margin:0;
-	text-align:left;
+ #visitsLive .datetime {
+        background:#E4E2D7;
+        border-top:1px solid #d3d1c5;
+        margin:0;
+        text-align:left;
 }
 
-#visitsLive .country {
-	color:#4F6B72;
-	background:#FFFFFF url(plugins/CoreHome/templates/images/bullet1.gif) no-repeat scroll 0 0;
+ #visitsLive .country {
+        background:#FFFFFF url(plugins/CoreHome/templates/images/bullet1.gif) no-repeat scroll 0 0;
 }
 
-#visitsLive .referer {
-	background:#F9FAFA none repeat scroll 0 0;
-	color:#797268;
+ #visitsLive .referer {
+        background:#F9FAFA none repeat scroll 0 0;
 }
 
-#visitsLive .pagesTitle {
-	display:block;
-	float:left;
-	padding-top: 3px;
+#visitsLive .referer:hover {
+        background:#FFFFF7;
 }
 
-#visitsLive .countActions {
-	background:#FFFFFF none repeat scroll 0 0;
-	color:#4F6B72;
+ #visitsLive .pagesTitle {
+         display:block;
+         float:left;
 }
 
-#visitsLive .settings {
-	background:#FFFFFF none repeat scroll 0 0;
-	color:#4F6B72;
-}
+ #visitsLive .countActions {
+         background:#FFFFFF none repeat scroll 0 0;
+ }
 
-#visitsLive .returning {
-	background:#F9FAFA none repeat scroll 0 0;
-	color:#797268;
-}
+ #visitsLive .settings {
+         background:#FFFFFF none repeat scroll 0 0;
+ }
 
-#visitsLive .visit {
-}
+ #visitsLive .returning {
+         background:#F9FAFA none repeat scroll 0 0;
+ }
 
-#visitsLive .alt {
-}
+ .visitsLiveFooter a.rightLink{
+         float:right;
+         padding-right:20px;
+ }
 
-#visitsLive .actions {
-	background:#F9FAFA none repeat scroll 0 0;
-	color:#797268;
-	padding:0px 5px 0px 12px;
-}
-
 </style>
 {/literal}
 
@@ -175,7 +166,8 @@
 {$visitors}
 </div>
 
-<div>
+<div class="visitsLiveFooter">
 	<a href="javascript:void(0);" onclick="onClickPause();"><img id="pauseImage" border="0" src="plugins/Live/templates/images/pause_disabled.gif" /></a>
 	<a href="javascript:void(0);" onclick="onClickPlay();"><img id="playImage" border="0" src="plugins/Live/templates/images/play.gif" /></a>
+	&nbsp; <a class="rightLink" href="javascript:broadcast.propagateAjax('module=Live&action=getLastVisitsDetails')">{'Live_LinkVisitorLog'|translate}</a>
 </div>
Index: plugins/Live/templates/visitorLog.tpl
===================================================================
--- plugins/Live/templates/visitorLog.tpl	(revision 0)
+++ plugins/Live/templates/visitorLog.tpl	(revision 0)
@@ -0,0 +1,136 @@
+<div class="home" id="content" style="display: block;"><a graphid="VisitsSummarygetEvolutionGraph" name="evolutionGraph"></a>
+<h2>Besucherverlauf</h2>
+
+<div id="{$properties.uniqueId}">
+
+{if isset($arrayDataTable.result) and $arrayDataTable.result == 'error'}
+		{$arrayDataTable.message}
+	{else}
+		{if count($arrayDataTable) == 0}
+		<a name="{$properties.uniqueId}"></a>
+		<div class="pk-emptyDataTable">{'CoreHome_ThereIsNoDataForThisReport'|translate}</div>
+		{else}
+			<a name="{$properties.uniqueId}"></a>
+
+	<table class="dataTable" cellspacing="0" width="100%" style="width:100%;">
+	<thead>
+	<tr>
+	<th style="display:none"></th>
+	<th id="label" class="sortable label" style="cursor: auto;width:12%" width="12%">
+	<div id="thDIV">{'Live_Date'|translate}<div></th>
+	<th id="label" class="sortable label" style="cursor: auto;width:13%" width="13%">
+	<div id="thDIV">{'General_Visitors'|translate}<div></th>
+	<th id="label" class="sortable label" style="cursor: auto;width:15%" width="15%">
+	<div id="thDIV">{'Live_Referrer_URL'|translate}<div></th>
+	<th id="label" class="sortable label" style="cursor: auto;width:62%" width="62%">
+	<div id="thDIV">{'General_ColumnNbActions'|translate}<div></th>
+	</tr>
+	</thead>
+	<tbody>
+
+{foreach from=$arrayDataTable item=visitor}
+	<tr class="label{cycle values='odd,even'}">
+	<td style="display:none;"></td>
+	<td class="label" style="width:12%" width="12%">
+
+				{$visitor.columns.serverDatePretty} - {$visitor.columns.serverTimePretty}
+				{if isset($visitor.columns.ip)} <br/>IP: {$visitor.columns.ip}{/if}
+				{if (isset($visitor.columns.provider)&&$visitor.columns.provider!='IP')} 
+					<br />
+					{'Provider_ColumnProvider'|translate}: 
+					<a href="{$visitor.columns.providerUrl}" target="_blank" title="{$visitor.columns.providerUrl}" style="text-decoration:underline;">
+						{$visitor.columns.provider}
+					</a>
+				{/if}
+				
+	</td>
+	<td class="label" style="width:13%" width="13%">
+		&nbsp;<img src="{$visitor.columns.countryFlag}" title="{$visitor.columns.country}, Provider {$visitor.columns.provider}" />
+		&nbsp;<img src="{$visitor.columns.browserIcon}" title="{$visitor.columns.browser} with plugins {$visitor.columns.plugins} enabled" />
+		&nbsp;<img src="{$visitor.columns.operatingSystemIcon}" title="{$visitor.columns.operatingSystem}, {$visitor.columns.resolution} ({$visitor.columns.screen})" />
+		&nbsp;{if $visitor.columns.isVisitorGoalConverted}<img src="{$visitor.columns.goalIcon}" title="{$visitor.columns.goalType}" />{/if}
+		{if $visitor.columns.isVisitorReturning}
+			&nbsp;<img src="plugins/Live/templates/images/returningVisitor.gif" title="Returning Visitor" />
+		{/if}
+		<br/>
+		{if count($visitor.columns.pluginIcons) > 0}
+			<hr />
+			{'UserSettings_Plugins'|translate}:
+				{foreach from=$visitor.columns.pluginIcons item=pluginIcon}
+					<img src="{$pluginIcon.pluginIcon}" title="{$pluginIcon.pluginName|capitalize:true}" alt="{$pluginIcon.pluginName|capitalize:true}" />
+				{/foreach}
+		{/if}
+	</td>
+
+	<td class="column" style="width:20%" width="20%">
+		<div class="referer">
+			{if $visitor.columns.refererType == 'website'}
+				{'Referers_ColumnWebsite'|translate}:
+				<a href="{$visitor.columns.refererUrl}" target="_blank" title="{$visitor.columns.refererUrl}" style="text-decoration:underline;">
+					{$visitor.columns.refererName}
+				</a>
+			{/if}
+			{if $visitor.columns.refererType == 'campaign'}
+				{'Referers_Campaigns'|translate}
+				<br />
+				<a href="{$visitor.columns.refererUrl}" target="_blank" title="{$visitor.columns.refererUrl}" style="text-decoration:underline;">
+					{$visitor.columns.refererName}
+				</a>
+			{/if}
+			{if $visitor.columns.refererType == 'searchEngine'}
+				{if !empty($visitor.columns.searchEngineIcon)}
+					<img src="{$visitor.columns.searchEngineIcon}" alt="{$visitor.columns.refererName}" /> 
+				{/if}
+				{$visitor.columns.refererName}
+				<br />
+				{if !empty($visitor.columns.keywords)}{'Referers_Keywords'|translate}:{/if}
+				<a href="{$visitor.columns.refererUrl}" target="_blank" style="text-decoration:underline;">
+					{if !empty($visitor.columns.keywords)}
+						"{$visitor.columns.keywords}"
+					{/if}
+				</a>
+			{/if}
+			{if $visitor.columns.refererType == 'directEntry'}{'Referers_DirectEntry'|translate}{/if}
+		</div>
+	</td>
+	<td class="column" style="width:55%" width="55%">
+			<strong>{$visitor.columns.actionDetails|@count} {'Actions_Actions'|translate} - {$visitor.columns.visitLengthPretty}</strong>
+			<br /><br />
+			<ol style="list-style:decimal inside none;">
+			{foreach from=$visitor.columns.actionDetails item=action}
+				<li>
+					<a href="{$action.pageUrl}" target="_blank" style="text-decoration:underline;" title="{$action.pageUrl}">
+						{$action.pageUrl|truncate:80:"...":true}
+					</a>
+				</li>
+			{/foreach}
+			</ol>
+	</td>
+	</tr>
+{/foreach}
+	</tbody>
+	</table>
+
+		{/if}
+		{if $properties.show_footer}
+			{include file="CoreHome/templates/datatable_footer.tpl"}
+		{/if}
+		{include file="CoreHome/templates/datatable_js.tpl"}
+	{/if}
+</div>
+
+{literal}
+<style>
+ hr {
+	background:none repeat scroll 0 0 transparent;
+	border-color:-moz-use-text-color -moz-use-text-color #EEEEEE;
+	border-style:none none solid;
+	border-width:0 0 1px;
+	color:#CCCCCC;
+	margin:0 2em 0.5em;
+	padding:0 0 0.5em;
+ }
+
+</style>
+{/literal}
+</div>
\ No newline at end of file
Index: lang/en.php
===================================================================
--- lang/en.php	(revision 2731)
+++ lang/en.php	(working copy)
@@ -577,6 +577,7 @@
 	'LanguagesManager_PluginDescription' => 'This plugin will display a list of the available languages for the Piwik interface. The language selected will be saved in the preferences for each user.',
 	'LanguagesManager_AboutPiwikTranslations' => 'About Piwik translations',
 	'Live_PluginDescription' => 'Spy on your visitors, live, in real-time!',
+	'Live_LinkVisitorLog' => 'View detailed visitor log',
 	'Live_VisitorLog' => 'Visitor Log',
 	'Live_Date' => 'Date',
 	'Live_Time' => 'Time',
Index: plugins/Live/Controller.php
===================================================================
--- plugins/Live/Controller.php	(revision 2731)
+++ plugins/Live/Controller.php	(working copy)
@@ -30,7 +30,7 @@
 	public function widget($fetch = false)
 	{
 		$view = Piwik_View::factory('index');
-		$view->idSite = Piwik_Common::getRequestVar('idSite');		
+		$view->idSite = Piwik_Common::getRequestVar('idSite');
 		$view->visitorsCountHalfHour = $this->getUsersInLastXMin(30);
 		$view->visitorsCountToday = $this->getUsersInLastXDays(1);
 		$view->pisHalfhour = $this->getPageImpressionsInLastXMin(30);
@@ -42,55 +42,24 @@
 
 	public function getLastVisitsDetails($fetch = false)
 	{
-		$view = Piwik_ViewDataTable::factory('');
+		$view = Piwik_ViewDataTable::factory();
 		$view->init( $this->pluginName,
 							__FUNCTION__,
-						'Live.getLastVisitsDetails',
-						'getPagesFromVisitId');
-// All colomns in DB which could be shown
-//'ip', 'idVisit', 'countActions', 'isVisitorReturning', 'country', 'countryFlag', 'continent', 'provider', 'providerUrl', 'idSite',
-//'serverDate', 'visitLength', 'visitLengthPretty', 'firstActionTimestamp', 'lastActionTimestamp', 'refererType', 'refererName',
-//'keywords', 'refererUrl', 'searchEngineUrl', 'searchEngineIcon', 'operatingSystem', 'operatingSystemShortName', 'operatingSystemIcon',
-//'browserFamily', 'browserFamilyDescription', 'browser', 'browserIcon', 'screen', 'resolution', 'screenIcon', 'plugins', 'lastActionDateTime',
-//'serverDatePretty', 'serverTimePretty', 'actionDetails'
+						'Live.getLastVisitsDetails');
 
-		$view->setColumnsToDisplay(array(
-			'idVisit',
-			'serverDatePretty',
-			'serverTimePretty',
-			'ip',
-			'countActions',
-			'visitLengthPretty',
-			'keywords',
-			'refererUrl',
-			'operatingSystemShortName',
-			'browser',
-			'screen',
-			'resolution',
-			'plugins',
-		));
+		// All colomns in DB which could be shown
+		//'ip', 'idVisit', 'countActions', 'isVisitorReturning', 'country', 'countryFlag', 'continent', 'provider', 'providerUrl', 'idSite',
+		//'serverDate', 'visitLength', 'visitLengthPretty', 'firstActionTimestamp', 'lastActionTimestamp', 'refererType', 'refererName',
+		//'keywords', 'refererUrl', 'searchEngineUrl', 'searchEngineIcon', 'operatingSystem', 'operatingSystemShortName', 'operatingSystemIcon',
+		//'browserFamily', 'browserFamilyDescription', 'browser', 'browserIcon', 'screen', 'resolution', 'screenIcon', 'plugins', 'lastActionDateTime',
+		//'serverDatePretty', 'serverTimePretty', 'actionDetails'
 
-		$view->setColumnsTranslations(array(
-			'idVisit' => Piwik_Translate(''),
-			'serverDatePretty' => Piwik_Translate('Live_Date'),
-			'serverTimePretty' => Piwik_Translate('Live_Time'),
-			'ip' => 'IP',
-			'countActions' => Piwik_Translate('VisitorInterest_ColumnPagesPerVisit'),
-			'visitLengthPretty' => Piwik_Translate('VisitorInterest_ColumnVisitDuration'),
-			'keywords' => Piwik_Translate('Referers_ColumnKeyword'),
-			'refererUrl' => Piwik_Translate('Live_Referrer_URL'),
-			'operatingSystemShortName' => Piwik_Translate('UserSettings_ColumnOperatingSystem'),
-			'browser' => Piwik_Translate('UserSettings_ColumnBrowser'),
-			'screen' => Piwik_Translate('UserSettings_ColumnTypeOfScreen'),
-			'resolution' => Piwik_Translate('UserSettings_ColumnResolution'),
-			'plugins' => Piwik_Translate('UserSettings_ColumnPlugin'),
-		));
-
 		$view->disableSort();
-		$view->setLimit(10);
-		$view->disableExcludeLowPopulation();
+		$view->setLimit(20);
+		$view->setTemplate("Live/templates/visitorLog.tpl");
 		$view->setSortedColumn('idVisit', 'ASC');
 		$view->disableSearchBox();
+		$view->disableOffsetInformation();
 		// "Include low population" link won't be displayed under this table
 		$view->disableExcludeLowPopulation();
 		// disable the tag cloud,  pie charts, bar chart icons
@@ -101,22 +70,11 @@
 		return $this->renderView($view, $fetch);
 	}
 
-	function getPagesFromVisitId( $fetch = false)
-	{
-		$view = Piwik_ViewDataTable::factory('');
-		$view->init( $this->pluginName,
-							__FUNCTION__,
-						'Live.getLastVisitsForVisitor',
-						'getPagesFromVisitId');
-
-		return $this->renderView($view, $fetch);
-	}
-
 	public function getLastVisitsStart($fetch = false)
 	{
 		$view = Piwik_View::factory('lastVisits');
-		$view->idSite = Piwik_Common::getRequestVar('idSite');		
-		
+		$view->idSite = Piwik_Common::getRequestVar('idSite');
+
 		$view->visitors = $this->getLastVisits(10);
 
 		$rendered = $view->render($fetch);
@@ -167,7 +125,7 @@
 	public function ajaxTotalVisitors($fetch = false)
 	{
 		$view = Piwik_View::factory('totalVisits');
-		$view->idSite = Piwik_Common::getRequestVar('idSite');		
+		$view->idSite = Piwik_Common::getRequestVar('idSite');
 		$view->visitorsCountHalfHour = $this->getUsersInLastXMin(30);
 		$view->visitorsCountToday = $this->getUsersInLastXDays(1);
 		$view->pisHalfhour = $this->getPageImpressionsInLastXMin(30);
@@ -179,6 +137,6 @@
 		{
 			return $rendered;
 		}
-		echo $rendered;	
+		echo $rendered;
 	}
 }
Index: plugins/Live/Visitor.php
===================================================================
--- plugins/Live/Visitor.php	(revision 2731)
+++ plugins/Live/Visitor.php	(working copy)
@@ -28,6 +28,8 @@
  */
 class Piwik_Live_Visitor
 {
+	const DELIMITER_PLUGIN_NAME = ", ";
+	
 	function __construct($visitorRawData)
 	{
 		$this->details = $visitorRawData;
@@ -71,6 +73,7 @@
 			'resolution' => $this->getResolution(),
 			'screenIcon' => $this->getScreenTypeIcon(),
 			'plugins' => $this->getPlugins(),
+			'pluginIcons' => $this->getPluginIcons(),
 			'lastActionDateTime' => $this->getDateTimeLastAction(),
 			'isVisitorGoalConverted' => $this->isVisitorGoalConverted(),
 			'goalIcon' => $this->getGoalIcon(),
@@ -80,7 +83,7 @@
 
 	function getServerDate()
 	{
-		return date('Y-m-d', strtotime($this->details['visit_last_action_time'])); 
+		return date('Y-m-d', strtotime($this->details['visit_last_action_time']));
 	}
 
 	function getIp()
@@ -150,10 +153,10 @@
 	function getRefererType()
 	{
 		$map = array(
-			Piwik_Common::REFERER_TYPE_SEARCH_ENGINE => 'searchEngine',
-			Piwik_Common::REFERER_TYPE_WEBSITE => 'website',
-			Piwik_Common::REFERER_TYPE_DIRECT_ENTRY => 'directEntry',
-			Piwik_Common::REFERER_TYPE_CAMPAIGN => 'campaign',
+		Piwik_Common::REFERER_TYPE_SEARCH_ENGINE => 'searchEngine',
+		Piwik_Common::REFERER_TYPE_WEBSITE => 'website',
+		Piwik_Common::REFERER_TYPE_DIRECT_ENTRY => 'directEntry',
+		Piwik_Common::REFERER_TYPE_CAMPAIGN => 'campaign',
 		);
 		if(isset($map[$this->details['referer_type']]))
 		{
@@ -185,7 +188,7 @@
 	function getSearchEngineUrl()
 	{
 		if($this->getRefererType() == 'searchEngine'
-			&& !empty($this->details['referer_name']))
+		&& !empty($this->details['referer_name']))
 		{
 			return Piwik_getSearchEngineUrlFromName($this->details['referer_name']);
 		}
@@ -215,18 +218,34 @@
 	 		'config_gears',
 	 		'config_silverlight',
 		);
-		$return = array();
+		$pluginShortNames = array();
 		foreach($plugins as $plugin)
 		{
 			if($this->details[$plugin] == 1)
 			{
 				$pluginShortName = substr($plugin, 7);
-				$return[] = $pluginShortName;
+				$pluginShortNames[] = $pluginShortName;
 			}
 		}
-		return implode(", ", $return);
+		return implode(self::DELIMITER_PLUGIN_NAME, $pluginShortNames);
 	}
 
+	function getPluginIcons()
+	{
+		$pluginNames = $this->getPlugins();
+		if( !empty($pluginNames) )
+		{
+			$pluginNames = explode(self::DELIMITER_PLUGIN_NAME, $pluginNames);
+			$pluginIcons = array();
+
+			foreach($pluginNames as $plugin) {
+				$pluginIcons[] = array("pluginIcon" =>Piwik_getPluginsLogo($plugin), "pluginName" =>$plugin);
+			}
+			return $pluginIcons;
+		}
+		return null;
+	}
+
 	function getOperatingSystem()
 	{
 		return Piwik_getOSLabel($this->details['config_os']);
@@ -310,15 +329,15 @@
 		if(isset($this->details['match_attribute'])){
 			$goalicon = "";
 			switch ($this->details['match_attribute']) {
-	    		case "url":
-			    	$goalicon = "plugins/Live/templates/images/goal.png";
-	    			break;
-			    case "file":
-	        		$goalicon = "plugins/Live/templates/images/download.png";
-		        	break;
-			    case "external_website":
-	        		$goalicon = "plugins/Live/templates/images/outboundlink.png";
-		        	break;
+				case "url":
+					$goalicon = "plugins/Live/templates/images/goal.png";
+					break;
+				case "file":
+					$goalicon = "plugins/Live/templates/images/download.png";
+					break;
+				case "external_website":
+					$goalicon = "plugins/Live/templates/images/outboundlink.png";
+					break;
 			}
 			return $goalicon;
 		}

