From 820e604a34df00bada49218d04f6ba26db5c9699 Mon Sep 17 00:00:00 2001
From: BeezyT <timo@ezdesign.de>
Date: Wed, 9 Nov 2011 18:07:25 +0000
Subject: [PATCH] refs #1820 added metrics picker to more core reports. some
 language updates to make metrics consistent and short. new api methods for
 comparing metrics in Referers and VisitsSummary. minor tweaks.

git-svn-id: http://dev.piwik.org/svn/trunk@5421 59fd770c-687e-43c8-a1e3-f5a4ff64c105
---
 core/DataTable/Renderer/Csv.php               |  1 -
 lang/de.php                                   | 18 +++---
 lang/en.php                                   |  8 +--
 plugins/CoreHome/templates/jqplot.js          |  4 +-
 plugins/Referers/API.php                      | 55 ++++++++++++++++++
 plugins/Referers/Controller.php               | 58 +++++++++++--------
 plugins/VisitFrequency/API.php                | 36 +++++++-----
 plugins/VisitFrequency/Controller.php         | 46 ++++++++++-----
 plugins/VisitFrequency/VisitFrequency.php     |  2 +-
 plugins/VisitsSummary/API.php                 |  2 +-
 ...Site_lastN__API.getProcessedReport_day.xml | 15 +++--
 ...ortMetadata__API.getReportMetadata_day.xml | 14 +++--
 ...test_apiGetReportMetadata__API.get_day.xml |  6 +-
 ...adata_year__API.getReportMetadata_year.xml | 14 +++--
 14 files changed, 190 insertions(+), 89 deletions(-)

diff --git a/core/DataTable/Renderer/Csv.php b/core/DataTable/Renderer/Csv.php
index 57285fb3ea..6a383ec815 100644
--- a/core/DataTable/Renderer/Csv.php
+++ b/core/DataTable/Renderer/Csv.php
@@ -408,7 +408,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 				'bounce_count_returning' => 'VisitFrequency_ColumnBounceCountForReturningVisits',
 				'max_actions' => 'General_ColumnMaxActions',
 				'max_actions_returning' => 'VisitFrequency_ColumnMaxActionsInReturningVisit',
-				'nb_uniq_visitors_returning' => 'VisitFrequency_ColumnUniqueReturningVisitors',
 				'nb_visits_converted_returning' => 'VisitFrequency_ColumnNbReturningVisitsConverted',
 				'sum_visit_length_returning' => 'VisitFrequency_ColumnSumVisitLengthReturning',
 				'nb_visits_converted' => 'General_ColumnVisitsWithConversions',
diff --git a/lang/de.php b/lang/de.php
index 0899464ca1..722db44a72 100644
--- a/lang/de.php
+++ b/lang/de.php
@@ -580,7 +580,7 @@ $translations = array(
 	'Goals_ColumnQuantityDocumentation' => 'Quantität ist die Gesamtzahl der Produkte die von %s verkauft wurden.',
 	'Goals_ColumnOrdersDocumentation' => 'Die Gesamtzahl aller Ecommerce Bestellungen welche %s mindestens einmal enthielten.',
 	'Goals_ColumnAveragePriceDocumentation' => 'Der Durchschnittsertrag für %s.',
-	'Goals_ColumnAverageQuantityDocumentation' => 'Die Durschnittliche Anzahl von %s verkauft durch Ecommerce Bestellungen.',
+	'Goals_ColumnAverageQuantityDocumentation' => 'Die durchschnittliche Anzahl von %s verkauft durch Ecommerce Bestellungen.',
 	'Goals_ColumnVisits' => 'Die Gesamtanzahl an Besuchen, unabhängig davon ob dabei ein Ziel erreicht wurde oder nicht.',
 	'Goals_GoalX' => 'Ziel %s',
 	'Goals_GoalConversion' => 'Ziel-Konversion',
@@ -841,12 +841,12 @@ $translations = array(
 	'Referers_TypeSearchEngines' => '%s von Suchmaschinen',
 	'Referers_TypeWebsites' => '%s von Webseiten',
 	'Referers_TypeCampaigns' => '%s von Kampagnen',
-	'Referers_Distinct' => 'Vermittler nach Verweisart unterscheiden',
-	'Referers_DistinctSearchEngines' => 'Suchmaschinen unterscheiden',
-	'Referers_DistinctKeywords' => 'Stichwörter unterscheiden',
-	'Referers_DistinctCampaigns' => 'Kampagnen unterscheiden',
-	'Referers_DistinctWebsites' => 'Webseiten unterscheiden',
-	'Referers_UsingNDistinctUrls' => '(%s zum URL unterscheiden werden verwendet)',
+	'Referers_Distinct' => 'Unterschiedliche Verweise nach Verweisart',
+	'Referers_DistinctSearchEngines' => 'verschiedene Suchmaschinen',
+	'Referers_DistinctKeywords' => 'verschiedene Suchbegriffe',
+	'Referers_DistinctCampaigns' => 'verschiedene Kampagnen',
+	'Referers_DistinctWebsites' => 'verschiedene Webseiten',
+	'Referers_UsingNDistinctUrls' => '(mit %s verschiedenen URLs)',
 	'Referers_SubmenuOverview' => 'Ãœbersicht',
 	'Referers_SubmenuSearchEngines' => 'Suchmaschinen und Suchbegriffe',
 	'Referers_SubmenuWebsites' => 'Webseiten',
@@ -1315,10 +1315,10 @@ $translations = array(
 	'VisitFrequency_ReturningVisitsDocumentation' => 'Dies ist eine Übersicht über die wiederkehrenden Besuche.',
 	'VisitFrequency_ReturningVisitDocumentation' => 'Ein wiederkehrender Besuch wird (im Vergleich zu einem neuen Besuch) von jemandem gemacht, der bereits mindestens einmal die Webseite besucht hat.',
 	'VisitFrequency_ColumnActionsByReturningVisits' => 'Aktionen bei wiederkehrenden Besuchen',
-	'VisitFrequency_ColumnAverageVisitDurationForReturningVisitors' => 'Durchschnittliche Aufenthaltszeit bei wiederkehrenden Besuchen (in Sekunden)',
+	'VisitFrequency_ColumnAverageVisitDurationForReturningVisitors' => 'Durchschnittszeit von wiederkehrenden Besuchen',
 	'VisitFrequency_ColumnBounceRateForReturningVisits' => 'Absprungsrate bei wiederkehrenden Besuchen',
 	'VisitFrequency_ColumnBounceCountForReturningVisits' => 'Absprünge von wiederkehrenden Besuchen',
-	'VisitFrequency_ColumnAvgActionsPerReturningVisit' => 'Durchschnittliche Anzahl an Aktionen bei wiederkehrenden Besuchen',
+	'VisitFrequency_ColumnAvgActionsPerReturningVisit' => 'Aktionen pro wiederkehrender Besuch',
 	'VisitFrequency_ColumnMaxActionsInReturningVisit' => 'Maximale Aktionen bei einem wiederkehrenden Besuch',
 	'VisitFrequency_ColumnUniqueReturningVisitors' => 'Eindeutige wiederkehrende Besucher',
 	'VisitFrequency_ColumnNbReturningVisitsConverted' => 'Anzahl wiederkehrende Besuche mit Konversion',
diff --git a/lang/en.php b/lang/en.php
index f105d90ce0..0585e94507 100644
--- a/lang/en.php
+++ b/lang/en.php
@@ -1378,10 +1378,10 @@ Note: this token will expire in 24 hrs.',
 	'VisitFrequency_ReturningVisitsDocumentation' => 'This is an overview of the returning visits.',
 	'VisitFrequency_ReturningVisitDocumentation' => 'A returning visit is (as opposed to a new visit) made by someone who has visited the website at least once before.',
 	'VisitFrequency_ColumnActionsByReturningVisits' => 'Actions by Returning Visits',
-	'VisitFrequency_ColumnAverageVisitDurationForReturningVisitors' => 'Avg. Visit Duration for Returning Visitors (in seconds)',
-	'VisitFrequency_ColumnBounceRateForReturningVisits' => 'Bounce rate for returning visits',
-	'VisitFrequency_ColumnBounceCountForReturningVisits' => 'Bounce count for returning visits',
-	'VisitFrequency_ColumnAvgActionsPerReturningVisit' => 'Avg. actions per returning visit',
+	'VisitFrequency_ColumnAverageVisitDurationForReturningVisitors' => 'Avg. Duration of a Returning Visit (in sec)',
+	'VisitFrequency_ColumnBounceRateForReturningVisits' => 'Bounce Rate for Returning Visits',
+	'VisitFrequency_ColumnBounceCountForReturningVisits' => 'Bounce Count for Returning Visits',
+	'VisitFrequency_ColumnAvgActionsPerReturningVisit' => 'Avg. Actions per Returning Visit',
 	'VisitFrequency_ColumnMaxActionsInReturningVisit' => 'Maximum actions in one returning visit',
 	'VisitFrequency_ColumnUniqueReturningVisitors' => 'Unique returning visitors',
 	'VisitFrequency_ColumnNbReturningVisitsConverted' => 'Number of converted returning visits',
diff --git a/plugins/CoreHome/templates/jqplot.js b/plugins/CoreHome/templates/jqplot.js
index 83c36dacb7..c238d34575 100644
--- a/plugins/CoreHome/templates/jqplot.js
+++ b/plugins/CoreHome/templates/jqplot.js
@@ -947,7 +947,9 @@ JQPlot.prototype = {
 		
 		// try to display popover to the right
 		var margin = (parseInt(pickerLink.css('marginLeft'), 10) - 4);
-		if (margin + neededSpace < plotWidth) {
+		if (margin + neededSpace < plotWidth
+				// make sure it's not too far to the left
+				|| margin - neededSpace + 60 < 0) {
 			pickerPopover.css('marginLeft', margin + 'px').show();
 		} else {
 			// display to the left
diff --git a/plugins/Referers/API.php b/plugins/Referers/API.php
index b61d2b151a..fc23849a32 100644
--- a/plugins/Referers/API.php
+++ b/plugins/Referers/API.php
@@ -54,6 +54,61 @@ class Piwik_Referers_API
 		return $dataTable;
 	}
 	
+	/**
+	 * This is a combined report that contains one row with the visits per referrer
+	 * as columns. It is used internally to make comparing the referrers with the
+	 * metrics picker possible.
+	 */
+	public function getVisitsPerRefererType($idSite, $period, $date, $segment=false)
+	{
+		$dataTable = $this->getRefererType($idSite, $period, $date, $segment);
+		
+		$isDataTableArray = $dataTable instanceof Piwik_DataTable_Array;
+		$result = new Piwik_DataTable_Array;
+		
+		if ($isDataTableArray)
+		{
+			$array = $dataTable->getArray();
+			$result->metadata = $dataTable->metadata;
+		}
+		else
+		{
+			$array = array($dataTable);
+		}
+		
+		$rowBase = array(
+			'nb_visits_'.Piwik_Common::REFERER_TYPE_DIRECT_ENTRY => 0,
+			'nb_visits_'.Piwik_Common::REFERER_TYPE_SEARCH_ENGINE => 0,
+			'nb_visits_'.Piwik_Common::REFERER_TYPE_WEBSITE => 0,
+			'nb_visits_'.Piwik_Common::REFERER_TYPE_CAMPAIGN => 0
+		);
+		
+		foreach ($array as $tableIndex => $dataTable)
+		{
+			$newTable = new Piwik_DataTable;
+			$columns = $rowBase;
+			foreach ($dataTable->getRows() as $row)
+			{
+				$visits = $row->getColumn(Piwik_Archive::INDEX_NB_VISITS);
+				$refType = $row->getColumn('label');
+				$label = 'nb_visits_'.$refType;
+				$columns[$label] = $visits;
+			}
+			$newTable->addRowFromArray(array(
+				Piwik_DataTable_Row::COLUMNS => $columns
+			));
+			$result->addTable($newTable, $tableIndex);
+		}
+		
+		if (!$isDataTableArray)
+		{
+			$array = $result->getArray();
+			$result = $array[0];
+		}
+		
+		return $result;
+	}
+	
 	public function getKeywords($idSite, $period, $date, $segment = false, $expanded = false)
 	{
 		$dataTable = $this->getDataTable('Referers_searchEngineByKeyword', $idSite, $period, $date, $segment, $expanded);
diff --git a/plugins/Referers/Controller.php b/plugins/Referers/Controller.php
index 5451744b0f..453feb504d 100644
--- a/plugins/Referers/Controller.php
+++ b/plugins/Referers/Controller.php
@@ -20,7 +20,7 @@ class Piwik_Referers_Controller extends Piwik_Controller
 	{
 		$view = Piwik_View::factory('index');
 		
-		$view->graphEvolutionReferers = $this->getEvolutionGraph(true, Piwik_Common::REFERER_TYPE_DIRECT_ENTRY, array('nb_visits'));
+		$view->graphEvolutionReferers = $this->getEvolutionGraph(true, Piwik_Common::REFERER_TYPE_DIRECT_ENTRY);
 		$view->nameGraphEvolutionReferers = 'ReferersgetEvolutionGraph';
 		
 		$view->numberDistinctSearchEngines 	= $this->getNumberOfDistinctSearchEngines(true);
@@ -38,10 +38,10 @@ class Piwik_Referers_Controller extends Piwik_Controller
 			$view->$name = $value;
 		}
 		// sparkline for the historical data of the above values
-		$view->urlSparklineSearchEngines	= $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_SEARCH_ENGINE));
-		$view->urlSparklineDirectEntry 		= $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_DIRECT_ENTRY));
-		$view->urlSparklineWebsites 		= $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_WEBSITE));
-		$view->urlSparklineCampaigns 		= $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_CAMPAIGN));
+		$view->urlSparklineSearchEngines	= $this->getUrlSparkline('getEvolutionGraph', array('typeReferer' => Piwik_Common::REFERER_TYPE_SEARCH_ENGINE));
+		$view->urlSparklineDirectEntry 		= $this->getUrlSparkline('getEvolutionGraph', array('typeReferer' => Piwik_Common::REFERER_TYPE_DIRECT_ENTRY));
+		$view->urlSparklineWebsites 		= $this->getUrlSparkline('getEvolutionGraph', array('typeReferer' => Piwik_Common::REFERER_TYPE_WEBSITE));
+		$view->urlSparklineCampaigns 		= $this->getUrlSparkline('getEvolutionGraph', array('typeReferer' => Piwik_Common::REFERER_TYPE_CAMPAIGN));
 		
 		// sparklines for the evolution of the distinct keywords count/websites count/ etc
 		$view->urlSparklineDistinctSearchEngines 	= $this->getUrlSparkline('getLastDistinctSearchEnginesGraph');
@@ -246,36 +246,48 @@ class Piwik_Referers_Controller extends Piwik_Controller
 		Piwik_Common::REFERER_TYPE_CAMPAIGN => 'Referers_Campaigns',
 	);
 	
-	public function getEvolutionGraph( $fetch = false, $typeReferer = false, $columns = false)
+	public function getEvolutionGraph( $fetch = false, $typeReferer = false, $columns = array() )
 	{
-		$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Referers.getRefererType');
-		if(empty($typeReferer))
+		$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Referers.getVisitsPerRefererType');
+		
+		$typeReferrerRequest = Piwik_Common::getRequestVar('typeReferer', false);
+		if ($typeReferrerRequest !== false)
 		{
-			$typeReferer = Piwik_Common::getRequestVar('typeReferer');
+			$typeReferer = $typeReferrerRequest;
 		}
+		
 		if(empty($columns))
 		{
-			$columns = Piwik_Common::getRequestVar('columns');
+			$columns = Piwik_Common::getRequestVar('columns', false);
+			$columns = Piwik::getArrayFromApiParameter($columns);
+		}
+		
+		// if referrer type is set, transform it into the corresponding column name
+		if ($typeReferer !== false)
+		{
+			$columns[] = 'nb_visits_'.$typeReferer;
 		}
-		$columns = !is_array($columns) ? array($columns) : $columns; 
+		
 		$view->setColumnsToDisplay($columns);
-		$view->setParametersToModify(array('typeReferer' => $typeReferer));
-		foreach($columns as $columnName)
+		
+		$translations = array();
+		$selectableColumns = array();
+		foreach ($this->referrerTypeToLabel as $id => $langString)
 		{
-			$columnTranslation = $view->getColumnTranslation($columnName);
-			$referrerTypeTranslation = $this->referrerTypeToLabel[$typeReferer];
-			$view->setColumnTranslation(
-				$columnName,
-				Piwik_Translate('Referers_MetricsFromRefererTypeGraphLegend',
-					array(	Piwik_Translate($columnTranslation),
-							Piwik_Translate($referrerTypeTranslation)
-						)
-					)
-				);
+			$label = 'nb_visits_'.$id;
+			$selectableColumns[] = $label;
+			
+			$translations[$label] = Piwik_Translate('Referers_MetricsFromRefererTypeGraphLegend',
+					array(Piwik_Translate('General_ColumnNbVisits'), Piwik_Translate($langString)));
 		}
+		
+		$view->setColumnsTranslations($translations);
+		$view->setSelectableColumns($selectableColumns);
+		
 		$view->setReportDocumentation(Piwik_Translate('Referers_EvolutionDocumentation').'<br />'
 				.Piwik_Translate('General_BrokenDownReportDocumentation').'<br />'
 				.Piwik_Translate('Referers_EvolutionDocumentationMoreInfo', '&quot;'.Piwik_Translate('Referers_DetailsByRefererType').'&quot;'));
+		
 		return $this->renderView($view, $fetch);
 	}
 	
diff --git a/plugins/VisitFrequency/API.php b/plugins/VisitFrequency/API.php
index d6212b4793..30e909de47 100644
--- a/plugins/VisitFrequency/API.php
+++ b/plugins/VisitFrequency/API.php
@@ -31,24 +31,35 @@ class Piwik_VisitFrequency_API
 		Piwik::checkUserHasViewAccess( $idSite );
 		$archive = Piwik_Archive::build($idSite, $period, $date, $segment );
 		
+		// array values are comma separated
 		$columns = Piwik::getArrayFromApiParameter($columns);
-		$countColumnsRequested = count($columns);
+		$tempColumns = array();
 		
 		$bounceRateReturningRequested = $averageVisitDurationReturningRequested = $actionsPerVisitReturningRequested = false;
 		if(!empty($columns))
 		{
-			if(($bounceRateReturningRequested = array_search('bounce_rate_returning', $columns)) !== false)
+			// make sure base metrics are there for processed metrics
+			if(false !== ($bounceRateReturningRequested = array_search('bounce_rate_returning', $columns)))
 			{
-				$columns = array('nb_visits_returning', 'bounce_count_returning');
+				if (!in_array('nb_visits_returning', $columns)) $tempColumns[] = 'nb_visits_returning';
+				if (!in_array('bounce_count_returning', $columns)) $tempColumns[] = 'bounce_count_returning';
+				unset($columns[$bounceRateReturningRequested]);
 			}
-			elseif(($actionsPerVisitReturningRequested = array_search('nb_actions_per_visit_returning', $columns)) !== false)
+			if(false !== ($actionsPerVisitReturningRequested = array_search('nb_actions_per_visit_returning', $columns)))
 			{
-				$columns = array('nb_actions_returning', 'nb_visits_returning');
+				if (!in_array('nb_actions_returning', $columns)) $tempColumns[] = 'nb_actions_returning';
+				if (!in_array('nb_visits_returning', $columns)) $tempColumns[] = 'nb_visits_returning';
+				unset($columns[$actionsPerVisitReturningRequested]);
 			}
-			elseif(($averageVisitDurationReturningRequested = array_search('avg_time_on_site_returning', $columns)) !== false)
+			if(false !== ($averageVisitDurationReturningRequested = array_search('avg_time_on_site_returning', $columns)))
 			{
-				$columns = array('sum_visit_length_returning', 'nb_visits_returning');
+				if (!in_array('sum_visit_length_returning', $columns)) $tempColumns[] = 'sum_visit_length_returning';
+				if (!in_array('nb_visits_returning', $columns)) $tempColumns[] = 'nb_visits_returning';
+				unset($columns[$averageVisitDurationReturningRequested]);
 			}
+			
+			$tempColumns = array_unique($tempColumns);
+			$columns = array_merge($columns, $tempColumns);
 		}
 		else
 		{ 
@@ -83,14 +94,9 @@ class Piwik_VisitFrequency_API
 			$dataTable->filter('ColumnCallbackAddColumnQuotient', array('avg_time_on_site_returning', 'sum_visit_length_returning', 'nb_visits_returning', 0));
 		}
 	
-		// If only a computed metrics was requested, we delete other metrics 
-		// that we selected only to process this one metric 
-		if($countColumnsRequested == 1
-			&& ($bounceRateReturningRequested || $averageVisitDurationReturningRequested || $actionsPerVisitReturningRequested)
-			) 
-		{
-			$dataTable->deleteColumns($columns);
-		}
+		// remove temporary metrics that were used to compute processed metrics
+		$dataTable->deleteColumns($tempColumns);
+		
 		return $dataTable;
 	}
 
diff --git a/plugins/VisitFrequency/Controller.php b/plugins/VisitFrequency/Controller.php
index 526dd9076b..d8339176ab 100644
--- a/plugins/VisitFrequency/Controller.php
+++ b/plugins/VisitFrequency/Controller.php
@@ -33,25 +33,45 @@ class Piwik_VisitFrequency_Controller extends Piwik_Controller
 	
 	public function getEvolutionGraph( $fetch = false, $columns = false)
 	{
-		$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "VisitFrequency.get");
 		if(empty($columns))
 		{
 			$columns = Piwik_Common::getRequestVar('columns');
+			$columns = Piwik::getArrayFromApiParameter($columns);
 		}
-		$view->setColumnsToDisplay($columns);
-		$view->setColumnsTranslations(array(
-			'nb_visits_returning' => Piwik_Translate('VisitFrequency_ColumnReturningVisits'),
-			'nb_actions_returning' => Piwik_Translate('VisitFrequency_ColumnActionsByReturningVisits'),
-			'avg_time_on_site_returning' => Piwik_Translate('VisitFrequency_ColumnAverageVisitDurationForReturningVisitors'),
-			'bounce_rate_returning' => Piwik_Translate('VisitFrequency_ColumnBounceRateForReturningVisits'),
-			'nb_actions_per_visit_returning' => Piwik_Translate('VisitFrequency_ColumnAvgActionsPerReturningVisit'),
-		));
 		
-		$doc = Piwik_Translate('VisitFrequency_ReturningVisitsDocumentation').'<br />'
-		     . Piwik_Translate('General_BrokenDownReportDocumentation').'<br />'
-		     . Piwik_Translate('VisitFrequency_ReturningVisitDocumentation');
+		$documentation = Piwik_Translate('VisitFrequency_ReturningVisitsDocumentation').'<br />'
+				. Piwik_Translate('General_BrokenDownReportDocumentation').'<br />'
+				. Piwik_Translate('VisitFrequency_ReturningVisitDocumentation');
 		
-		$view->setReportDocumentation($doc);
+		$selectableColumns = array(
+			// columns from VisitFrequency.get
+			'nb_visits_returning',
+			'nb_actions_returning',
+			'nb_actions_per_visit_returning',
+			'bounce_rate_returning',
+			'avg_time_on_site_returning',
+			// columns from VisitsSummary.get
+			'nb_visits',
+			'nb_actions',
+			'nb_actions_per_visit',
+			'bounce_rate',
+			'avg_time_on_site'
+		);
+		
+		$period = Piwik_Common::getRequestVar('period', false);
+		if ($period == 'day')
+		{
+			// add number of unique (returning) visitors for period=day
+			$selectableColumns = array_merge(
+					array($selectableColumns[0]),
+					array('nb_uniq_visitors_returning'),
+					array_slice($selectableColumns, 1, -4),
+					array('nb_uniq_visitors'),
+					array_slice($selectableColumns, -4));
+		}
+		
+		$view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, 
+							$selectableColumns, $documentation);
 		
 		return $this->renderView($view, $fetch);
 	}
diff --git a/plugins/VisitFrequency/VisitFrequency.php b/plugins/VisitFrequency/VisitFrequency.php
index d731a428be..74b5d54435 100644
--- a/plugins/VisitFrequency/VisitFrequency.php
+++ b/plugins/VisitFrequency/VisitFrequency.php
@@ -53,8 +53,8 @@ class Piwik_VisitFrequency extends Piwik_Plugin
     			'avg_time_on_site_returning' => Piwik_Translate('VisitFrequency_ColumnAverageVisitDurationForReturningVisitors'),
     			'bounce_rate_returning' => Piwik_Translate('VisitFrequency_ColumnBounceRateForReturningVisits'),
     			'nb_actions_per_visit_returning' => Piwik_Translate('VisitFrequency_ColumnAvgActionsPerReturningVisit'),
+				'nb_uniq_visitors_returning' => Piwik_Translate('VisitFrequency_ColumnUniqueReturningVisitors'),
 // Not displayed
-//    			'nb_uniq_visitors_returning',
 //    			'nb_visits_converted_returning',
 //    			'sum_visit_length_returning',
 //    			'max_actions_returning',
diff --git a/plugins/VisitsSummary/API.php b/plugins/VisitsSummary/API.php
index 1063c29e7b..28495d9a45 100644
--- a/plugins/VisitsSummary/API.php
+++ b/plugins/VisitsSummary/API.php
@@ -41,7 +41,7 @@ class Piwik_VisitsSummary_API
 		$tempColumns = array();
 		
 		$bounceRateRequested = $actionsPerVisitRequested = $averageVisitDurationRequested = false;
-		if($subsetOfColumns = !empty($columns))
+		if(!empty($columns))
 		{
 			// make sure base metrics are there for processed metrics
 			if(false !== ($bounceRateRequested = array_search('bounce_rate', $columns)))
diff --git a/tests/integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitFrequency.get_firstSite_lastN__API.getProcessedReport_day.xml b/tests/integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitFrequency.get_firstSite_lastN__API.getProcessedReport_day.xml
index 1023c67df1..db9bad0898 100644
--- a/tests/integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitFrequency.get_firstSite_lastN__API.getProcessedReport_day.xml
+++ b/tests/integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitFrequency.get_firstSite_lastN__API.getProcessedReport_day.xml
@@ -10,9 +10,10 @@
 		<metrics>
 			<nb_visits_returning>Returning Visits</nb_visits_returning>
 			<nb_actions_returning>Actions by Returning Visits</nb_actions_returning>
-			<avg_time_on_site_returning>Avg. Visit Duration for Returning Visitors (in seconds)</avg_time_on_site_returning>
-			<bounce_rate_returning>Bounce rate for returning visits</bounce_rate_returning>
-			<nb_actions_per_visit_returning>Avg. actions per returning visit</nb_actions_per_visit_returning>
+			<avg_time_on_site_returning>Avg. Duration of a Returning Visit (in sec)</avg_time_on_site_returning>
+			<bounce_rate_returning>Bounce Rate for Returning Visits</bounce_rate_returning>
+			<nb_actions_per_visit_returning>Avg. Actions per Returning Visit</nb_actions_per_visit_returning>
+			<nb_uniq_visitors_returning>Unique returning visitors</nb_uniq_visitors_returning>
 
 		</metrics>
 		<metricsDocumentation>
@@ -35,9 +36,10 @@
 	<columns>
 		<nb_visits_returning>Returning Visits</nb_visits_returning>
 		<nb_actions_returning>Actions by Returning Visits</nb_actions_returning>
-		<avg_time_on_site_returning>Avg. Visit Duration for Returning Visitors (in seconds)</avg_time_on_site_returning>
-		<bounce_rate_returning>Bounce rate for returning visits</bounce_rate_returning>
-		<nb_actions_per_visit_returning>Avg. actions per returning visit</nb_actions_per_visit_returning>
+		<avg_time_on_site_returning>Avg. Duration of a Returning Visit (in sec)</avg_time_on_site_returning>
+		<bounce_rate_returning>Bounce Rate for Returning Visits</bounce_rate_returning>
+		<nb_actions_per_visit_returning>Avg. Actions per Returning Visit</nb_actions_per_visit_returning>
+		<nb_uniq_visitors_returning>Unique returning visitors</nb_uniq_visitors_returning>
 
 	</columns>
 	<reportData>
@@ -45,6 +47,7 @@
 		<result prettyDate="Monday 4 January 2010" />
 		<result prettyDate="Tuesday 5 January 2010">
 			<nb_actions_returning>5</nb_actions_returning>
+			<nb_uniq_visitors_returning>1</nb_uniq_visitors_returning>
 			<nb_visits_returning>1</nb_visits_returning>
 			<bounce_rate_returning>0%</bounce_rate_returning>
 			<nb_actions_per_visit_returning>5</nb_actions_per_visit_returning>
diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
index 822ca90736..99af9c8995 100644
--- a/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
+++ b/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
@@ -21,9 +21,10 @@
 			<max_actions>Maximum actions in one visit</max_actions>
 			<nb_visits_returning>Returning Visits</nb_visits_returning>
 			<nb_actions_returning>Actions by Returning Visits</nb_actions_returning>
-			<avg_time_on_site_returning>Avg. Visit Duration for Returning Visitors (in seconds)</avg_time_on_site_returning>
-			<bounce_rate_returning>Bounce rate for returning visits</bounce_rate_returning>
-			<nb_actions_per_visit_returning>Avg. actions per returning visit</nb_actions_per_visit_returning>
+			<avg_time_on_site_returning>Avg. Duration of a Returning Visit (in sec)</avg_time_on_site_returning>
+			<bounce_rate_returning>Bounce Rate for Returning Visits</bounce_rate_returning>
+			<nb_actions_per_visit_returning>Avg. Actions per Returning Visit</nb_actions_per_visit_returning>
+			<nb_uniq_visitors_returning>Unique returning visitors</nb_uniq_visitors_returning>
 			<nb_conversions>Abandoned Carts</nb_conversions>
 			<nb_visits_converted>Visits with Conversions</nb_visits_converted>
 			<conversion_rate>Conversion Rate</conversion_rate>
@@ -1191,9 +1192,10 @@
 		<metrics>
 			<nb_visits_returning>Returning Visits</nb_visits_returning>
 			<nb_actions_returning>Actions by Returning Visits</nb_actions_returning>
-			<avg_time_on_site_returning>Avg. Visit Duration for Returning Visitors (in seconds)</avg_time_on_site_returning>
-			<bounce_rate_returning>Bounce rate for returning visits</bounce_rate_returning>
-			<nb_actions_per_visit_returning>Avg. actions per returning visit</nb_actions_per_visit_returning>
+			<avg_time_on_site_returning>Avg. Duration of a Returning Visit (in sec)</avg_time_on_site_returning>
+			<bounce_rate_returning>Bounce Rate for Returning Visits</bounce_rate_returning>
+			<nb_actions_per_visit_returning>Avg. Actions per Returning Visit</nb_actions_per_visit_returning>
+			<nb_uniq_visitors_returning>Unique returning visitors</nb_uniq_visitors_returning>
 
 		</metrics>
 		<metricsDocumentation>
diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.get_day.xml b/tests/integration/expected/test_apiGetReportMetadata__API.get_day.xml
index 724e8459e4..9bde2b3b80 100644
--- a/tests/integration/expected/test_apiGetReportMetadata__API.get_day.xml
+++ b/tests/integration/expected/test_apiGetReportMetadata__API.get_day.xml
@@ -18,9 +18,9 @@
 	<conversion_rate>100</conversion_rate>
 	<revenue>42.26</revenue>
 	<nb_visits_returning>0</nb_visits_returning>
-	<bounce_count_returning>0</bounce_count_returning>
-	<bounce_rate_returning>0%</bounce_rate_returning>
 	<nb_actions_returning>0</nb_actions_returning>
-	<avg_time_on_site_returning>0</avg_time_on_site_returning>
+	<nb_uniq_visitors_returning>0</nb_uniq_visitors_returning>
+	<bounce_rate_returning>0%</bounce_rate_returning>
 	<nb_actions_per_visit_returning>0</nb_actions_per_visit_returning>
+	<avg_time_on_site_returning>0</avg_time_on_site_returning>
 </result>
\ No newline at end of file
diff --git a/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml b/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml
index 7f2494c98e..f0640715a3 100644
--- a/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml
+++ b/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml
@@ -21,9 +21,10 @@
 			<max_actions>Maximum actions in one visit</max_actions>
 			<nb_visits_returning>Returning Visits</nb_visits_returning>
 			<nb_actions_returning>Actions by Returning Visits</nb_actions_returning>
-			<avg_time_on_site_returning>Avg. Visit Duration for Returning Visitors (in seconds)</avg_time_on_site_returning>
-			<bounce_rate_returning>Bounce rate for returning visits</bounce_rate_returning>
-			<nb_actions_per_visit_returning>Avg. actions per returning visit</nb_actions_per_visit_returning>
+			<avg_time_on_site_returning>Avg. Duration of a Returning Visit (in sec)</avg_time_on_site_returning>
+			<bounce_rate_returning>Bounce Rate for Returning Visits</bounce_rate_returning>
+			<nb_actions_per_visit_returning>Avg. Actions per Returning Visit</nb_actions_per_visit_returning>
+			<nb_uniq_visitors_returning>Unique returning visitors</nb_uniq_visitors_returning>
 			<nb_conversions>Conversions</nb_conversions>
 			<nb_visits_converted>Visits with Conversions</nb_visits_converted>
 			<conversion_rate>Conversion Rate</conversion_rate>
@@ -839,9 +840,10 @@
 		<metrics>
 			<nb_visits_returning>Returning Visits</nb_visits_returning>
 			<nb_actions_returning>Actions by Returning Visits</nb_actions_returning>
-			<avg_time_on_site_returning>Avg. Visit Duration for Returning Visitors (in seconds)</avg_time_on_site_returning>
-			<bounce_rate_returning>Bounce rate for returning visits</bounce_rate_returning>
-			<nb_actions_per_visit_returning>Avg. actions per returning visit</nb_actions_per_visit_returning>
+			<avg_time_on_site_returning>Avg. Duration of a Returning Visit (in sec)</avg_time_on_site_returning>
+			<bounce_rate_returning>Bounce Rate for Returning Visits</bounce_rate_returning>
+			<nb_actions_per_visit_returning>Avg. Actions per Returning Visit</nb_actions_per_visit_returning>
+			<nb_uniq_visitors_returning>Unique returning visitors</nb_uniq_visitors_returning>
 
 		</metrics>
 		<metricsDocumentation>
-- 
GitLab