Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatt <matt@59fd770c-687e-43c8-a1e3-f5a4ff64c105>2010-06-23 07:45:36 +0400
committermatt <matt@59fd770c-687e-43c8-a1e3-f5a4ff64c105>2010-06-23 07:45:36 +0400
commit7e1b5d6b762340cbff1bb928d15815980c7649a7 (patch)
treee07da179b9e1372866d2349777bd1cc6b4c9e8cf /plugins/MultiSites
parent999f46479294713104c962bfe7469e9b6e7a4bbf (diff)
parentc98ea06f2cccec81c6ccce49162a583494e44d91 (diff)
Diffstat (limited to 'plugins/MultiSites')
-rw-r--r--plugins/MultiSites/Controller.php195
-rw-r--r--plugins/MultiSites/MultiSites.php46
-rw-r--r--plugins/MultiSites/images/arrow_asc.gifbin0 -> 120 bytes
-rw-r--r--plugins/MultiSites/images/arrow_desc.gifbin0 -> 122 bytes
-rw-r--r--plugins/MultiSites/images/arrow_down.pngbin0 -> 685 bytes
-rw-r--r--plugins/MultiSites/images/arrow_up.pngbin0 -> 707 bytes
-rw-r--r--plugins/MultiSites/images/door_in.pngbin0 -> 693 bytes
-rw-r--r--plugins/MultiSites/images/link.gifbin0 -> 75 bytes
-rw-r--r--plugins/MultiSites/images/loading-blue.gifbin0 -> 1849 bytes
-rw-r--r--plugins/MultiSites/images/stop.pngbin0 -> 577 bytes
-rw-r--r--plugins/MultiSites/templates/common.js245
-rw-r--r--plugins/MultiSites/templates/index.tpl99
-rw-r--r--plugins/MultiSites/templates/row.tpl26
-rw-r--r--plugins/MultiSites/templates/styles.css46
14 files changed, 657 insertions, 0 deletions
diff --git a/plugins/MultiSites/Controller.php b/plugins/MultiSites/Controller.php
new file mode 100644
index 0000000000..1d7b0a8280
--- /dev/null
+++ b/plugins/MultiSites/Controller.php
@@ -0,0 +1,195 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
+ * @version $Id$
+ *
+ * @category Piwik_Plugins
+ * @package Piwik_MultiSites
+ */
+
+/**
+ *
+ * @package Piwik_MultiSites
+ */
+class Piwik_MultiSites_Controller extends Piwik_Controller
+{
+ protected $orderBy = 'names';
+ protected $order = 'desc';
+ protected $evolutionBy = 'visits';
+ protected $mySites = array();
+ protected $page = 1;
+ protected $limit = 20;
+ protected $period;
+ protected $date;
+ protected $dateToStr;
+
+
+ function index()
+ {
+ $this->getSitesInfo();
+ }
+
+
+ public function getSitesInfo()
+ {
+ Piwik::checkUserHasSomeViewAccess();
+ // overwrites the default Date set in the parent controller
+ // Instead of the default current website's local date,
+ // we set "today" or "yesterday" based on the default Piwik timezone
+ $piwikDefaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone();
+ $date = Piwik_Common::getRequestVar('date', 'today');
+ $date = $this->getDateParameterInTimezone($date, $piwikDefaultTimezone);
+ $this->setDate($date);
+
+ $mySites = Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess();
+ $params = $this->getGraphParamsModified();
+ $this->dateToStr = $params['date'];
+
+ $ids = 'all';
+ $this->period = Piwik_Common::getRequestVar('period', 'day');
+
+ $lastDate = date('Y-m-d',strtotime("-1 ".$this->period, strtotime($this->strDate)));
+
+ $visits = Piwik_VisitsSummary_API::getInstance()->getVisits($ids, $this->period, $this->strDate);
+ $lastVisits = Piwik_VisitsSummary_API::getInstance()->getVisits($ids, $this->period, $lastDate);
+
+ $actions = Piwik_VisitsSummary_API::getInstance()->getActions($ids, $this->period, $this->strDate);
+ $lastActions = Piwik_VisitsSummary_API::getInstance()->getActions($ids, $this->period, $lastDate);
+
+ $uniqueUsers = Piwik_VisitsSummary_API::getInstance()->getUniqueVisitors($ids, $this->period, $this->strDate);
+ $lastUniqueUsers = Piwik_VisitsSummary_API::getInstance()->getUniqueVisitors($ids, $this->period, $lastDate);
+
+ $visitsSummary = $this->getSummary($lastVisits, $visits, $mySites, "visits");
+ $actionsSummary = $this->getSummary($lastActions, $actions, $mySites, "actions");
+ $uniqueSummary = $this->getSummary($lastUniqueUsers, $uniqueUsers, $mySites, "unique");
+
+ $visitsArray = $visits->getArray();
+ $actionsArray = $actions->getArray();
+ $uniqueUsersArray = $uniqueUsers->getArray();
+ $lastVisitsArray = $lastVisits->getArray();
+ $lastActionsArray = $lastActions->getArray();
+ $lastUniqueUsersArray = $lastUniqueUsers->getArray();
+ foreach($mySites as &$site)
+ {
+ $idSite = $site['idsite'];
+ $site['visits'] = array_shift($visitsArray[$idSite]->getColumn(0));
+ $site['actions'] = array_shift($actionsArray[$idSite]->getColumn(0));
+ $site['unique'] = array_shift($uniqueUsersArray[$idSite]->getColumn(0));
+ $site['lastVisits'] = array_shift($lastVisitsArray[$idSite]->getColumn(0));
+ $site['lastActions'] = array_shift($lastActionsArray[$idSite]->getColumn(0));
+ $site['lastUnique'] = array_shift($lastUniqueUsersArray[$idSite]->getColumn(0));
+ $site['visitsSummaryValue'] = $visitsSummary[$idSite];
+ $site['actionsSummaryValue'] = $actionsSummary[$idSite];
+ $site['uniqueSummaryValue'] = $uniqueSummary[$idSite];
+
+ }
+
+ $view = new Piwik_View("MultiSites/templates/index.tpl");
+ $view->mySites = $mySites;
+ $view->evolutionBy = $this->evolutionBy;
+ $view->period = $this->period;
+ $view->date = $this->strDate;
+ $view->page = $this->page;
+ $view->limit = $this->limit;
+ $view->orderBy = $this->orderBy;
+ $view->order = $this->order;
+ $view->dateToStr = $this->dateToStr;
+
+ $view->autoRefreshTodayReport = false;
+ // if the current date is today, or yesterday,
+ // in case the website is set to UTC-12), or today in UTC+14, we refresh the page every 5min
+ if(in_array($this->strDate, array( 'today', date('Y-m-d'),
+ 'yesterday', Piwik_Date::factory('yesterday')->toString('Y-m-d'),
+ Piwik_Date::factory('now', 'UTC+14')->toString('Y-m-d'))))
+ {
+ $view->autoRefreshTodayReport = true;
+ }
+ $this->setGeneralVariablesView($view);
+ $this->setMinMaxDateAcrossWebsites($mySites, $view);
+
+ echo $view->render();
+ }
+
+ /**
+ * The Multisites reports displays the first calendar date as the earliest day available for all websites.
+ * Also, today is the later "today" available across all timezones.
+ * @param $mySites
+ * @param $view
+ * @return void
+ */
+ private function setMinMaxDateAcrossWebsites($mySites, $view)
+ {
+ $minDate = null;
+ $maxDate = Piwik_Date::now();
+ foreach($mySites as &$site)
+ {
+ // look for 'now' in the website's timezone
+ $timezone = $site['timezone'];
+ $date = Piwik_Date::factory('now', $timezone);
+ if($date->isLater($maxDate))
+ {
+ $maxDate = clone $date;
+ }
+
+ // look for the absolute minimum date
+ $creationDate = $site['ts_created'];
+ $date = Piwik_Date::factory($creationDate, $timezone);
+ if(is_null($minDate)
+ || $date->isEarlier($minDate))
+ {
+ $minDate = clone $date;
+ }
+ }
+ $this->setMinDateView($minDate, $view);
+ $this->setMaxDateView($maxDate, $view);
+ }
+
+ private function getSummary($lastVisits, $currentVisits, $mySites, $type)
+ {
+ $currentVisitsArray = $currentVisits->getArray();
+ $lastVisitsArray = $lastVisits->getArray();
+ $summaryArray = array();
+ foreach($mySites as $site)
+ {
+ $idSite = $site['idsite'];
+ $current = array_shift($currentVisitsArray[$idSite]->getColumn(0));
+ $last = array_shift($lastVisitsArray[$idSite]->getColumn(0));
+ $summaryArray[$idSite] = $this->fillSummary($current, $last, $this->evolutionBy);
+ }
+ return $summaryArray;
+ }
+
+ private function fillSummary($current, $last, $type)
+ {
+ if($current == 0 && $last == 0)
+ {
+ $summary = 0;
+ }
+ elseif($last == 0)
+ {
+ $summary = 100;
+ }
+ else
+ {
+ $summary = (($current - $last) / $last) * 100;
+ }
+
+ $output = round($summary,2);
+
+ return $output;
+ }
+
+ public function getEvolutionGraph( $fetch = false, $columns = false)
+ {
+ $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "VisitsSummary.get");
+ if(empty($columns))
+ {
+ $columns = Piwik_Common::getRequestVar('columns');
+ }
+ $view->setColumnsToDisplay($columns);
+ return $this->renderView($view, $fetch);
+ }
+}
diff --git a/plugins/MultiSites/MultiSites.php b/plugins/MultiSites/MultiSites.php
new file mode 100644
index 0000000000..ccdc2169b6
--- /dev/null
+++ b/plugins/MultiSites/MultiSites.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
+ * @version $Id$
+ *
+ * @category Piwik_Plugins
+ * @package Piwik_MultiSites
+ */
+
+/**
+ *
+ * @package Piwik_MultiSites
+ */
+class Piwik_MultiSites extends Piwik_Plugin
+{
+ public function getInformation()
+ {
+ return array(
+ 'description' => Piwik_Translate('MultiSites_PluginDescription'),
+ 'author' => 'ClearCode.cc',
+ 'author_homepage' => "http://clearcode.cc/",
+ 'version' => Piwik_Version::VERSION,
+ );
+ }
+
+ public function getListHooksRegistered()
+ {
+ return array(
+ 'template_css_import' => 'css',
+ 'template_js_import' => 'js',
+ );
+ }
+
+ public function css()
+ {
+ echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"plugins/MultiSites/templates/styles.css\" />\n";
+ }
+
+ public function js()
+ {
+ echo "<script type=\"text/javascript\" src=\"plugins/MultiSites/templates/common.js\"></script>\n";
+ }
+}
diff --git a/plugins/MultiSites/images/arrow_asc.gif b/plugins/MultiSites/images/arrow_asc.gif
new file mode 100644
index 0000000000..df463fa72f
--- /dev/null
+++ b/plugins/MultiSites/images/arrow_asc.gif
Binary files differ
diff --git a/plugins/MultiSites/images/arrow_desc.gif b/plugins/MultiSites/images/arrow_desc.gif
new file mode 100644
index 0000000000..abe79f0769
--- /dev/null
+++ b/plugins/MultiSites/images/arrow_desc.gif
Binary files differ
diff --git a/plugins/MultiSites/images/arrow_down.png b/plugins/MultiSites/images/arrow_down.png
new file mode 100644
index 0000000000..efa4624a05
--- /dev/null
+++ b/plugins/MultiSites/images/arrow_down.png
Binary files differ
diff --git a/plugins/MultiSites/images/arrow_up.png b/plugins/MultiSites/images/arrow_up.png
new file mode 100644
index 0000000000..800536e52e
--- /dev/null
+++ b/plugins/MultiSites/images/arrow_up.png
Binary files differ
diff --git a/plugins/MultiSites/images/door_in.png b/plugins/MultiSites/images/door_in.png
new file mode 100644
index 0000000000..41676a0a5b
--- /dev/null
+++ b/plugins/MultiSites/images/door_in.png
Binary files differ
diff --git a/plugins/MultiSites/images/link.gif b/plugins/MultiSites/images/link.gif
new file mode 100644
index 0000000000..e160f23b63
--- /dev/null
+++ b/plugins/MultiSites/images/link.gif
Binary files differ
diff --git a/plugins/MultiSites/images/loading-blue.gif b/plugins/MultiSites/images/loading-blue.gif
new file mode 100644
index 0000000000..8a3f8c01b6
--- /dev/null
+++ b/plugins/MultiSites/images/loading-blue.gif
Binary files differ
diff --git a/plugins/MultiSites/images/stop.png b/plugins/MultiSites/images/stop.png
new file mode 100644
index 0000000000..84d56a4532
--- /dev/null
+++ b/plugins/MultiSites/images/stop.png
Binary files differ
diff --git a/plugins/MultiSites/templates/common.js b/plugins/MultiSites/templates/common.js
new file mode 100644
index 0000000000..2fc8dc86f0
--- /dev/null
+++ b/plugins/MultiSites/templates/common.js
@@ -0,0 +1,245 @@
+function setRowData (idsite, visits, actions, unique, name, url, visitsSummaryValue, actionsSummaryValue, uniqueSummaryValue)
+{
+ this.idsite = idsite;
+ this.visits = visits;
+ this.unique = unique;
+ this.name = name;
+ this.url = url;
+ this.actions = actions;
+ this.visitsSummaryValue = parseFloat(visitsSummaryValue);
+ this.actionsSummaryValue = parseFloat(actionsSummaryValue);
+ this.uniqueSummaryValue = parseFloat(uniqueSummaryValue);
+}
+
+function setOrderBy(self, allSites, params, mOrderBy)
+{
+ if(params['mOrderBy'] == mOrderBy) {
+ if(params['order'] == 'desc') {
+ params['order'] = 'asc';
+ }
+ else {
+ params['order'] = 'desc';
+ }
+ }
+ params['mOrderBy'] = mOrderBy;
+ prepareRows(allSites, params);
+
+ $('.arrow').removeClass('multisites_desc multisites_asc');
+ if($(self).attr('class') == 'evolution')
+ {
+ mOrderBy = 'evolution';
+ }
+ $('#' + mOrderBy + ' .arrow').addClass('multisites_' + params['order']);
+
+ return params;
+}
+
+function prepareRows(allUnsortedSites, params)
+{
+ var allSites;
+ $("#tb").find("tr").remove();
+ $("#next").html('');
+ $("#prev").html('');
+ var mOrderBy = params['mOrderBy'];
+
+ allSites = orderBy(allUnsortedSites, params);
+
+ if(allSites.length > params['limit'])
+ {
+ allSites = limitBy(allSites, params);
+ }
+
+
+ displayRows(allSites, params);
+
+ showPagination(allUnsortedSites, params);
+ params['sitesVisible'] = allSites;
+}
+
+function orderBy(allSites, params)
+{
+ if(params['mOrderBy'] == 'names')
+ {
+ allSites.sort(function(a,b) {
+ if (a['name'].toLowerCase() == b['name'].toLowerCase())
+ {
+ return 0;
+ }
+ return (a['name'].toLowerCase() < b['name'].toLowerCase()) ? -1 : 1;
+ });
+ }
+ else if(params['mOrderBy'] == 'visits')
+ {
+ allSites.sort(function(a,b) {
+ if (a['visits'] == b['visits']) {
+ return 0;
+ }
+ return (a['visits'] < b['visits']) ? -1 : 1;
+ });
+ }
+ else if(params['mOrderBy'] == 'actions')
+ {
+ allSites.sort(function (a,b) {
+ if (a['actions'] == b['actions']) {
+ return 0;
+ }
+ return (a['actions'] < b['actions']) ? -1 : 1;
+ });
+ }
+ else if(params['mOrderBy'] == 'unique')
+ {
+ allSites.sort(function (a,b) {
+ if (a['unique'] == b['unique']) {
+ return 0;
+ }
+ return (a['unique'] < b['unique']) ? -1 : 1;
+ });
+ }
+ else if(params['mOrderBy'] == 'uniqueSummary')
+ {
+ allSites.sort(function (a,b) {
+ if (a['uniqueSummaryValue'] == b['uniqueSummaryValue']) {
+ return 0;
+ }
+ return (a['uniqueSummaryValue'] - b['uniqueSummaryValue'] <= 0.01) ? -1 : 1;
+ });
+ }
+ else if(params['mOrderBy'] == 'actionsSummary')
+ {
+ allSites.sort(function (a,b) {
+ if (a['actionsSummaryValue'] == b['actionsSummaryValue']) {
+ return 0;
+ }
+ return (a['actionsSummaryValue'] - b['actionsSummaryValue'] <= 0.01) ? -1 : 1;
+ });
+ }
+ else if(params['mOrderBy'] == 'visitsSummary')
+ {
+ allSites.sort(function (a,b) {
+ if (a['visitsSummaryValue'] == b['visitsSummaryValue']) {
+ return 0;
+ }
+ return (a['visitsSummaryValue'] - b['visitsSummaryValue'] <= 0.01) ? -1 : 1;
+ });
+ }
+
+ if(params['order'] == 'asc')
+ {
+ allSites.reverse();
+ }
+ return allSites;
+}
+
+function limitBy(allSites, params)
+{
+ var begin = (params['page'] - 1) * params['limit'];
+ var end = (params['page'] * params['limit']);
+ return allSites.slice(begin, end);
+}
+
+function switchEvolution(params)
+{
+ $('.actions').hide();
+ $('.unique').hide();
+ $('.visits').hide();
+ $('.' + params['evolutionBy']).show();
+ sitesVisible = params['sitesVisible'];
+ for(i = 0; i < allSites.length; i++)
+ {
+ $('#sparkline_' + allSites[i].idsite).html(getSparklineImg(allSites[i].idsite, params['evolutionBy'], params));
+ }
+}
+
+function displayRows(allSites, params)
+{
+ for(var i = 0; i < allSites.length; i++)
+ {
+ var str = params['row'];
+ str = str.replace(/%uniqueSummary%/g, getImageForSummary(allSites[i].uniqueSummaryValue));
+ str = str.replace(/%actionsSummary%/g, getImageForSummary(allSites[i].actionsSummaryValue));
+ str = str.replace(/%visitsSummary%/g, getImageForSummary(allSites[i].visitsSummaryValue));
+ str = str.replace(/%sparkline%/g, getSparklineImg(allSites[i].idsite, params['evolutionBy'], params));
+ str = str.replace(/%actions%/g, allSites[i].actions);
+ str = str.replace(/%idsite%/g, allSites[i].idsite);
+ str = str.replace(/%visits%/g, allSites[i].visits);
+ str = str.replace(/%name%/g, allSites[i].name);
+ str = str.replace(/%unique%/g, allSites[i].unique);
+ str = str.replace(/%main_url%/g, allSites[i].url);
+ str = str.replace(/%date%/g, params['date']);
+ str = str.replace(/%period%/g, params['period']);
+
+ $('#tb').append('<tr class="tables_row" id="row_'+ allSites[i].idsite+'">' + str + '</tr>');
+ }
+
+ $(".table_row").show();
+ $('.actions').hide();
+ $('.unique').hide();
+ $('.visits').hide();
+ $('#main_indicator').hide();
+ $('.' + params['evolutionBy']).show();
+ $("#main_indicator").hide();
+}
+
+function getSparklineImg(id, column, params)
+{
+ if(column == 'unique')
+ {
+ column = 'uniq_visitors';
+ }
+ return '<img class="sparkline" alt="" src="?module=MultiSites&action=getEvolutionGraph&period=' + params['period'] + '&date=' + params['dateToStr'] + '&evolutionBy=' + params['evolutionBy'] + '&columns[]=nb_' + column + '&idSite=' + id + '&idsite=' + id + '&viewDataTable=sparkline" width="100" height="25" />';
+}
+
+
+
+function showPagination(allSites, params)
+{
+ if ((params['page'] * params['limit']) < allSites.length)
+ {
+ var html = '<span style="cursor:pointer;" class="pointer" onClick="changePage(allSites, params, \'next\');">' + params['next'] + ' &#187;</span>';
+ $("#next").html(html);
+ }
+ if(params['page'] > 1)
+ {
+ html = '<span style="cursor:pointer;" onClick="changePage(allSites, params, \'prev\');">&#171; ' + params['prev'] + '</span>'
+ $("#prev").html(html);
+ }
+ var start = (params['page'] - 1) * params['limit'] + 1;
+ var count = allSites.length;
+ var end = parseInt(start) + parseInt(params['limit']) - 1;
+ if(end > count) end = count;
+ html = '<span>' + (start ) + ' - ' + end + ' of ' + count + '</span>';
+ $("#counter").html(html);
+}
+
+function changePage(allSites, params, kind)
+{
+ if(kind == 'next')
+ {
+ params['page']++;
+ }
+ else
+ {
+ params['page']--;
+ }
+ prepareRows(allSites, params);
+ return params;
+}
+
+
+function getImageForSummary(value)
+{
+ if(value > 0)
+ {
+ return '<img src="plugins/MultiSites/images/arrow_up.png" alt="" /> <b style="color: green;">' + value + ' %</b>';
+ }
+ else if(value == 0)
+ {
+ return '<img src="plugins/MultiSites/images/stop.png" alt="" /> <b>' + value + '%</b>';
+ }
+ else
+ {
+ return '<img src="plugins/MultiSites/images/arrow_down.png" alt="" /> <b style="color: red;">' + value +' %</b>';
+ }
+}
+
+
diff --git a/plugins/MultiSites/templates/index.tpl b/plugins/MultiSites/templates/index.tpl
new file mode 100644
index 0000000000..d4aa6e0097
--- /dev/null
+++ b/plugins/MultiSites/templates/index.tpl
@@ -0,0 +1,99 @@
+<img src="plugins/MultiSites/images/arrow_desc.gif" style="display: none" />
+<img src="plugins/MultiSites/images/arrow_asc.gif" style="display: none" />
+{assign var=showSitesSelection value=false}
+{assign var=showPeriodSelection value=true}
+{include file="CoreHome/templates/header.tpl"}
+
+<script type="text/javascript" src="plugins/MultiSites/templates/common.js"></script>
+<style>
+{fetch file="plugins/MultiSites/templates/styles.css"}
+</style>
+
+<div id="multisites" style="margin: auto">
+<div id="main">
+{include file="MultiSites/templates/row.tpl" assign="row"}
+<script type="text/javascript">
+ var allSites = new Array();
+ var params = new Array();
+ {foreach from=$mySites key=i item=site}
+ allSites[{$i}] = new setRowData({$site.idsite}, {$site.visits}, {$site.actions}, {$site.unique}, '{$site.name|escape:"quotes"}', '{$site.main_url}', '{$site.visitsSummaryValue|replace:",":"."}', '{$site.actionsSummaryValue|replace:",":"."}', '{$site.uniqueSummaryValue|replace:",":"."}');
+ {/foreach}
+ params['period'] = '{$period}';
+ params['date'] = '{$date}';
+ params['dateToStr'] = '{$dateToStr}';
+ params['evolutionBy'] = '{$evolutionBy}';
+ params['mOrderBy'] = '{$orderBy}';
+ params['order'] = '{$order}';
+ params['site'] = '{$site}';
+ params['limit'] = '{$limit}';
+ params['page'] = 1;
+ params['prev'] = "{'General_Previous'|translate}";
+ params['next'] = "{'General_Next'|translate}";
+ params['row'] = '{$row|escape:"javascript"}';
+</script>
+
+{postEvent name="template_headerMultiSites"}
+<div align="center">
+<table id="mt" class="dataTable" cellspacing="0" style="width:850px;">
+ <thead>
+ <th id="names" class="label" style="text-align:center">
+ <span style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, 'names');">{'General_Website'|translate}</span>
+ <span class="arrow multisites_desc"></span>
+ </th>
+ <th id="visits" class="multisites-column" style="width: 100px">
+ <span style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, 'visits');">{'General_ColumnNbVisits'|translate}</span>
+ <span class="arrow"></span>
+ </th>
+ <th id="actions" class="multisites-column" style="width: 110px">
+ <span style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, 'actions');">{'General_ColumnPageviews'|translate}</span>
+ <span class="arrow"></span>
+ </th>
+ <th id="unique" class="multisites-column" style="width: 120px">
+ <span style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, 'unique');">{'General_ColumnNbUniqVisitors'|translate}</span>
+ <span class="arrow"></span>
+ </th>
+ <th id="evolution" style="text-align:center; width:350px" colspan="2">
+ <span class="arrow "></span>
+ <span class="evolution" style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, $('#evolution_selector').val() + 'Summary');"> {'MultiSites_Evolution'|translate}</span>
+ <select class="selector" id="evolution_selector" onchange="params['evolutionBy'] = $('#evolution_selector').val(); switchEvolution(params);">
+ <option value="visits" {if $evolutionBy eq 'visits'} selected {/if}>{'General_ColumnNbVisits'|translate}</option>
+ <option value="actions" {if $evolutionBy eq 'actions'} selected {/if}>{'General_ColumnPageviews'|translate}</option>
+ <option value="unique"{if $evolutionBy eq 'unique'} selected {/if}>{'General_ColumnNbUniqVisitors'|translate}</option>
+ </select>
+ </th>
+ </thead>
+
+ <tbody id="tb">
+ </tbody>
+
+ <tfoot>
+ <tr row_id="last" >
+ <td colspan="8" class="clean" style="padding: 20px">
+ <span id="prev" class="pager" style="padding-right: 20px;"></span>
+ <span id="dataTablePages">
+ <span id="counter">
+ </span>
+ </span>
+ <span id="next" class="clean" style="padding-left: 20px;"></span>
+ </td>
+ </tr>
+ </tfoot>
+</table>
+</div>
+<script type="text/javascript">
+prepareRows(allSites, params, '{$orderBy}');
+
+{if $autoRefreshTodayReport}
+{literal}
+function refreshAfter(timeoutPeriod) {
+ setTimeout("location.reload(true);",timeoutPeriod);
+}
+refreshAfter(5*60*1000);
+{/literal}
+{/if}
+</script>
+</div>
+</div>
+
+</body>
+</html>
diff --git a/plugins/MultiSites/templates/row.tpl b/plugins/MultiSites/templates/row.tpl
new file mode 100644
index 0000000000..c651eaed5b
--- /dev/null
+++ b/plugins/MultiSites/templates/row.tpl
@@ -0,0 +1,26 @@
+<td class="multisites-label label" >
+ <a title="View reports" href="index.php?module=CoreHome&action=index&date=%date%&period=%period%&idSite=%idsite%">%name%</a>
+
+ <span style="width: 10px; margin-left:3px">
+ <a target="_blank" title="{'General_GoTo'|translate:"%main_url%"}" href="%main_url%"><img src="plugins/MultiSites/images/link.gif" /></a>
+ </span>
+</td>
+<td class="multisites-column">
+ %visits%
+</td>
+<td class="multisites-column">
+ %actions%&nbsp;
+</td>
+<td class="multisites-column">
+ %unique%&nbsp;
+</td>
+<td style="width:170px">
+ <div class="visits" style="display:none">%visitsSummary%</div>
+ <div class="actions"style="display:none">%actionsSummary%</div>
+ <div class="unique" >%uniqueSummary%</div>
+</td>
+<td style="width:180px">
+ <div id="sparkline_%idsite%" style="width: 100px; margin: auto">
+ %sparkline%
+ </div
+</td>
diff --git a/plugins/MultiSites/templates/styles.css b/plugins/MultiSites/templates/styles.css
new file mode 100644
index 0000000000..5c8204d9d0
--- /dev/null
+++ b/plugins/MultiSites/templates/styles.css
@@ -0,0 +1,46 @@
+.indicator {
+ background-image: url("../images/loading-blue.gif");
+ background-position: center;
+ background-repeat: no-repeat;
+ height: 20px;
+ width: 60px;
+ margin: auto;
+ border: 0px !important;
+}
+.clean {
+ border: 0px !important;
+}
+#multisites td, #multisites tr, #multisites .sparkline {
+ text-align: center;
+ vertical-align: middle;
+ padding: 1px ;
+ margin: 0px ;
+}
+#multisites td.multisites-label {
+ padding-left: 15px ;
+ text-align:left;
+ width: 250px;
+}
+#multisites td.multisites-label a:hover {
+ text-decoration: underline;
+}
+#multisites td.multisites-column, #multisites th.multisites-column {
+ width:70px;
+}
+#multisites td.multisites-column-evolution, #multisites th.multisites-column-evolution {
+ width:70px;
+}
+.multisites_asc
+{
+ width: 10px;
+ height: 12px;
+ display: inline-block;
+ background-image: url('plugins/MultiSites/images/arrow_asc.gif');
+}
+.multisites_desc
+{
+ width: 10px;
+ height: 13px;
+ display: inline-block;
+ background-image: url('plugins/MultiSites/images/arrow_desc.gif');
+} \ No newline at end of file