Index: main/plugin-web/i18n/messages_en.xml
===================================================================
--- main/plugin-web/i18n/messages_en.xml	(revision 32871)
+++ main/plugin-web/i18n/messages_en.xml	(working copy)
@@ -483,6 +483,14 @@
     <message key="PLUGINS_WEB_SITES_TREE_SITES_ROOT_DESCRIPTION">Root of all sites</message>
     
     <!-- Statistics -->
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_LABEL">Dynamic cache</message>
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_GROUP_GROUP_CONTEXT_LABEL">Context</message>
+    
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_LABEL">Static cache</message>
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_GROUP_GROUP_CONTEXT_LABEL">Actions</message>
+    
+    <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_CACHE_STATISTICS_BACK_TITLE">Dynamic cache of the site </message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_CACHE_STATISTICS_SERVERS_TITLE">Static cache of the site </message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_STATISTICS_LABEL">Statistics of site</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_STATISTICS_DESCRIPTION">See statistics of site</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_STATISTICS_TITLE">Statistics of site </message>
@@ -567,9 +575,9 @@
     
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_STATISTICS_HANDLE_REINITIALIZE">Reinitialize the statistics</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS">Dynamic cache statistics</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS_DESC">This cache stores page elements in RAM.&lt;br/&gt;Pages with dynamic elements are faster generated by the CMS when they are already partially in this cache.</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS_DESC">This cache stores page elements in RAM.&lt;br/&gt;Pages with dynamic elements are generated faster by the CMS when because they are already partially present in this cache. This tool displays the selected site's dynamic cache statistics.</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS">Static cache statistics</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS_DESC">This cache stores whole pages (when they are fully cacheable) on the hard disk.&lt;br/&gt;Pages are distributed by frontoffice applications or directly by a web server (such as Apache Httpd).</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS_DESC">This cache stores whole pages (when they are fully cacheable) on the hard disk.&lt;br/&gt;Pages are distributed by frontoffice applications or directly by a web server (such as Apache Httpd). This tool displays the selected site's static cache statistics.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TITLE">Statistics for the dynamic cache of the site {name}</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_LABEL">Context:</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_BACK_DEFAULT">CMS</message>
@@ -600,6 +608,7 @@
 	It is possible to get more information by clicking on the appropriate button in the action menu above.&lt;br/&gt;You will get the detailed statistics for HTTP server and the frontoffice: you can check that the HTTP server is correctly configured to read the cache directory by itself.&lt;br/&gt;&lt;br/&gt; \
 	The 'Cacheable' rate  is weighted by the number of hits, making it comparable to the 'Efficiency'.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_HANDLE_DISPLAY_HIDE">Display/Hide details</message>
+	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_HANDLE_DISPLAY_HIDE_DESC">Display or hide the detail of the columns.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_FIRST">Main</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_EFFICIENCY">Efficiency</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_HITS">Hits</message>
 	
\ No newline at end of file
Index: main/plugin-web/i18n/messages_fr.xml
===================================================================
--- main/plugin-web/i18n/messages_fr.xml	(revision 32871)
+++ main/plugin-web/i18n/messages_fr.xml	(working copy)
@@ -485,6 +485,16 @@
     <message key="PLUGINS_WEB_SITES_TREE_SITES_ROOT_DESCRIPTION">Racine de tous les sites</message>
     
     <!-- Statistics -->
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_LABEL">Cache dynamique</message>
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_GROUP_GROUP_CONTEXT_LABEL">Contexte</message>
+    
+    
+    
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_LABEL">Cache statique</message>
+    <message key="RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_GROUP_GROUP_CONTEXT_LABEL">Actions</message>
+    
+    <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_CACHE_STATISTICS_BACK_TITLE">Cache dynamique du site </message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_CACHE_STATISTICS_SERVERS_TITLE">Cache statique du site </message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_STATISTICS_LABEL">Statistiques du site</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_STATISTICS_DESCRIPTION">Cet outil permet de visualiser les statistiques du site</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_STATISTICS_TITLE">Statistiques du site </message>
@@ -569,19 +579,19 @@
 	
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_STATISTICS_HANDLE_REINITIALIZE">Réinitialiser les stats</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS">Statistiques du cache dynamique</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS_DESC">Ce cache stocke les éléments de pages en mémoire vive.&lt;br/&gt;Les pages ayant des éléments dynamiques sont ainsi servies plus rapidement par le CMS lorsqu'elles sont partiellement déjà en cache.</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS_DESC">Ce cache stocke les éléments de pages en mémoire vive.&lt;br/&gt;Les pages ayant des éléments dynamiques sont ainsi servies plus rapidement par le CMS lorsqu'elles sont partiellement déjà en cache. &lt;br/&gt;Cet outil affiche les statistiques du cache dynamique.</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS">Statistiques du cache statique</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS_DESC">Ce cache stocke les pages complètes (lorsqu'elle sont cacheables dans leur ensemble) sur disque dur.&lt;br/&gt;Les pages sont servies par les applications front-office ou directement par un serveur http (comme Apache Httpd).</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS_DESC">Ce cache stocke les pages complètes (lorsqu'elle sont cacheables dans leur ensemble) sur disque dur.&lt;br/&gt;Les pages sont servies par les applications front-office ou directement par un serveur http (comme Apache Httpd).&lt;br/&gt;Cet outil affiche les statistiques du cache statique.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TITLE">Statistiques pour le cache dynamique du site {name}</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_LABEL">Contexte :</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_BACK_DEFAULT">CMS</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_BACK_DEFAULT_DESC">CMS (back / default)&lt;br/&gt;Contexte d'accès dans l'outil CMS.</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_BACK_DEFAULT_DESC">CMS (back / default)&lt;br/&gt;Enclenchez ce bouton pour inclure le contexte d'accès dans l'outil CMS dans les statistiques. Si aucun contexte n'est sélectionné, tous les contextes seront pris en compte.</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_DEFAULT">Prévisualisation</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_DEFAULT_DESC">Prévisualisation (preview / default)&lt;br/&gt;Contexte d'accès en mode 'Prévisualiser'.</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_DEFAULT_DESC">Prévisualisation (preview / default)&lt;br/&gt;Enclenchez ce bouton pour inclure le contexte d'accès de la prévisualisation dans les statistiques. Si aucun contexte n'est sélectionné, tous les contextes seront pris en compte.</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_LIVE">Version en ligne</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_LIVE_DESC">Version en ligne (preview / live)&lt;br/&gt;Context d'accès en mode 'Version en ligne'.</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_LIVE_DESC">Version en ligne (preview / live)&lt;br/&gt;Enclenchez ce bouton pour inclure le contexte d'accès de la version en ligne dans les statistiques. Si aucun contexte n'est sélectionné, tous les contextes seront pris en compte.</message>
     <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_FRONT_LIVE">Site</message>
-    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_FRONT_LIVE_DESC">Site (front / live)&lt;br/&gt;Contexte d'accès depuis le site web.</message>
+    <message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_FRONT_LIVE_DESC">Site (front / live)&lt;br/&gt;Enclenchez ce bouton pour inclure le contexte d'accès du site web dans les statistiques. Si aucun contexte n'est sélectionné, tous les contextes seront pris en compte.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_HELP_TEXT">Ce tableau centralise les statistiques d'accès aux pages et aux éléments des pages sur le CMS.&lt;br/&gt;&lt;br/&gt; \
 	Les statistiques peuvent être filtrées par contexte d'utilisation du cache.&lt;br/&gt;&lt;br/&gt; \
 	Les statistiques affichées sur chaque ligne sont le cumul des sous-éléments de l'arbre : pour une page donnée on y lit donc les statistiques de la page mais aussi de ses sous-pages.&lt;br/&gt;Pour voir le détail d'une page il faut ouvrir le sous-élément 'détails'.&lt;br/&gt;La colonne 'Cacheable' représente le taux d'éléments des pages qui peuvent être mises en cache, pondéré par le nombre de hits par élément : le pourcentage obtenu est donc comparable à la colonne 'Efficacité'.&lt;br/&gt;&lt;br/&gt; \
@@ -602,6 +612,7 @@
 	Il est possible d'afficher plus d'informations en cliquant sur le bouton approprié dans le menu des actions ci-dessus.&lt;br/&gt;Vous obtiendrez le détails des statistiques pour le serveur HTTP et l'application frontoffice : cela permet de vérifier que le serveur HTTP est configuré correctement pour servir directement le répertoire de cache.&lt;br/&gt;&lt;br/&gt; \
 	Le pourcentage de 'Cacheable' est pondéré par le nombre de hits ce qui le rend comparable à la colonne 'Efficacité'.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_HANDLE_DISPLAY_HIDE">Afficher/Masquer détails</message>
+	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_HANDLE_DISPLAY_HIDE_DESC">Afficher ou masquer le détail des colonnes.</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_FIRST">Général</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_EFFICIENCY">Efficacité</message>
 	<message key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_HITS">Hits</message>
 	
\ No newline at end of file
Index: main/plugin-web/pages/administrator/sites/cache-statistics-back-tree.xsl
===================================================================
--- main/plugin-web/pages/administrator/sites/cache-statistics-back-tree.xsl	(revision 32871)
+++ main/plugin-web/pages/administrator/sites/cache-statistics-back-tree.xsl	(working copy)
@@ -26,156 +26,253 @@
     <xsl:param name="contextPath"/>
     <xsl:param name="pluginName"/>
     
-    
     <xsl:template match="/stats">
     	<root>
 			<!-- filters site that contains at least a page with a context (ie. some statistics) -->
-			<xsl:apply-templates select="site" />
+            {
+               "children": [
+	                    <xsl:for-each select="site">
+	                     <xsl:if test="position() != 1">,</xsl:if>
+	                     <xsl:call-template name="site"/> 
+	                   </xsl:for-each>
+	                ]
+             }
 		</root>
     </xsl:template>
     
-    <xsl:template match="site">
-    	<site id="{@id}" label="{@name}" qtip="{@id}" leaf="true" expanded="true"
-    	icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/stats/sitemap_16.png" cls="site-node">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
-			
-			<xsl:attribute name="pageHits"><xsl:call-template name="get-pagehits-sum" /></xsl:attribute>
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
-    	
-    		<xsl:apply-templates select="sitemap[descendant::context[1]]">
-    			<xsl:sort select="@name" />
-    		</xsl:apply-templates>
-    	</site>
+    <xsl:template name="site">
+    	<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
+        <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
+    	{
+   	       "id": "<xsl:value-of select="@id"/>",
+           "label": "<xsl:value-of select="@name"/>",
+           "qtip": "<xsl:value-of select="@id"/>",
+           "expanded": true,
+           "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/site/stats/sitemap_16.png",
+           
+           "pageHits": "<xsl:call-template name="get-pagehits-sum" />",
+           "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+           "hits": "<xsl:value-of select="$hits" />",
+           "cacheHits": "<xsl:value-of select="$cacheHits" />",
+           "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+           "children": [
+	           <xsl:for-each select="sitemap[descendant::context[1]]">
+	              <xsl:sort select="@name" />
+	
+	              <xsl:if test="position() != 1">,</xsl:if>
+	              <xsl:call-template name="sitemap"/> 
+	            </xsl:for-each>
+           ]
+   	   }
     </xsl:template>
     
-    <xsl:template match="sitemap">
-    	<sitemap 	id="{@id}" label="{@name}" qtip="{@id}" leaf="true" expanded="true"
-    				icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/stats/sitemap_16.png" cls="sitemap-node">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
-			
-			<xsl:attribute name="pageHits"><xsl:call-template name="get-pagehits-sum" /></xsl:attribute>
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
-    	
-    		<xsl:apply-templates select="page[descendant::context[1]]">
-    			<xsl:sort select="@name" />
-    		</xsl:apply-templates>
-    	</sitemap>
+    <xsl:template name="sitemap">
+        <xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
+        <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
+    	{
+               "id": "<xsl:value-of select="@id"/>",
+               "label": "<xsl:value-of select="@name"/>",
+               "qtip": "<xsl:value-of select="@id"/>",
+               "expanded": true,
+               "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/site/stats/sitemap_16.png",
+               
+               "pageHits": "<xsl:call-template name="get-pagehits-sum" />",
+               "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+               "hits": "<xsl:value-of select="$hits" />",
+               "cacheHits": "<xsl:value-of select="$cacheHits" />",
+               "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+               "children": [
+                   <xsl:for-each select="page[descendant::context[1]]">
+                     <xsl:sort select="@name" />
+
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="page"/> 
+                   </xsl:for-each>
+               ]
+         }
     </xsl:template>
     
-    <xsl:template match="page">
-    	<page 	id="{@id}" label="{@name}.html" qtip="{@id}" leaf="true"
-    			icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/stats/content_16.png" cls="page-node">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
-			
-			<xsl:attribute name="pageHits"><xsl:call-template name="get-pagehits-sum" /></xsl:attribute>
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
-    	
-    		<xsl:apply-templates select="self::page[context[1]]" mode="alone" />
-			<xsl:apply-templates select="page[descendant::context[1]]">
-				<xsl:sort select="@name" />
-			</xsl:apply-templates>
-    	</page>
+    <xsl:template name="page">
+        <xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
+        <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
+        {
+               "id": "<xsl:value-of select="@id"/>",
+               "label": "<xsl:value-of select="@name"/>.html",
+               "qtip": "<xsl:value-of select="@id"/>",
+               "expanded": false,
+               "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/site/stats/content_16.png",
+               
+               "pageHits": "<xsl:call-template name="get-pagehits-sum" />",
+               "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+               "hits": "<xsl:value-of select="$hits" />",
+               "cacheHits": "<xsl:value-of select="$cacheHits" />",
+               "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+               "children": [
+                   <xsl:for-each select="self::page[context[1]]">
+                     <xsl:sort select="@name" />
+
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="alone-page"/> 
+                   </xsl:for-each>
+                   
+                   <xsl:if test='count(self::page[context[1]]) > 0 and count(page[descendant::context[1]]) > 0'>,</xsl:if>
+                   
+                   <xsl:for-each select="page[descendant::context[1]]">
+                     <xsl:sort select="@name" />
+
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="page"/> 
+                   </xsl:for-each>
+               ]
+         }
     </xsl:template>
     
-    <xsl:template match="page" mode="alone">
-    	<context 	id="{@id}_alone" label="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TREE_DETAILS" qtip="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TREE_DETAILS_DESC" leaf="true"
-    				icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/sites/cachestats/details_16.png" i18n:attr="label qtip"
-    				cls="context-node">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum-details" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum-details" /></xsl:variable>
-			
-			<xsl:attribute name="pageHits"><xsl:call-template name="get-pagehits-sum-details" /></xsl:attribute>
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean-details" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
+    <xsl:template name="alone-page">
+        <xsl:variable name="hits"><xsl:call-template name="get-hits-sum-details" /></xsl:variable>
+        <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum-details" /></xsl:variable>
     	
-    		<xsl:apply-templates select="context">
-    			<xsl:sort select="@renderingContext" />
-    			<xsl:sort select="@workspaceJCR" />
-    		</xsl:apply-templates>
-    	</context>
+    	{
+               "id": "<xsl:value-of select="@id"/>_alone",
+               "label": "<i18n:text i18n:key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TREE_DETAILS"/>",
+               "qtip": "<i18n:text i18n:key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TREE_DETAILS_DESC"/>",
+               "expanded": false,
+               "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/administrator/sites/cachestats/details_16.png",
+               
+               "pageHits": "<xsl:call-template name="get-pagehits-sum" />",
+               "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+               "hits": "<xsl:value-of select="$hits" />",
+               "cacheHits": "<xsl:value-of select="$cacheHits" />",
+               "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+               "children": [
+                   <xsl:for-each select="context">
+                     <xsl:sort select="@renderingContext" />
+                     <xsl:sort select="@workspaceJCR" />
+
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="context"/> 
+                   </xsl:for-each>
+               ]
+         }
     </xsl:template>
     
-    <xsl:template match="context">
-   		<context 	id="{../@id}_{@renderingContext}_{@workspaceJCR}" leaf="true" icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/sites/cachestats/context_16.png" cls="context-node"
-   					label="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_{text:uppercase(@renderingContext)}_{text:uppercase(@workspaceJCR)}" pageHits="{hits}" i18n:attr="label">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
-			
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
-			
-    		<xsl:apply-templates select="zone|inputdata" />
-    	</context>
+    <xsl:template name="context">
+            <xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
+            <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
+            
+	       {
+               "id": "<xsl:value-of select="../@id"/>_<xsl:value-of select="@renderingContext"/>_<xsl:value-of select="@workspaceJCR"/>",
+               "label": "<i18n:text i18n:key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_{text:uppercase(@renderingContext)}_{text:uppercase(@workspaceJCR)}"/>",
+               "expanded": false,
+               "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/administrator/sites/cachestats/details_16.png",
+               "pageHits": "<xsl:value-of select="hits"/>",
+
+               "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+               "hits": "<xsl:value-of select="$hits" />",
+               "cacheHits": "<xsl:value-of select="$cacheHits" />",
+               "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+               "children": [
+                   <xsl:for-each select="zone">
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="zone"/> 
+                   </xsl:for-each>
+                   
+                   <xsl:if test="count(zone) > 0 and count(inputdata) > 0">,</xsl:if>
+                   
+                   <xsl:for-each select="inputdata">
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="inputdata"/> 
+                   </xsl:for-each>
+               ]
+         }
     </xsl:template>
     
-    <xsl:template match="zone">
-    	<zone 	id="{@id}_{../@renderingContext}_{../@workspaceJCR}" label="{@name}" qtip="{@id}" leaf="true" icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/sites/cachestats/zone_16.png" cls="zone-node">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
-			
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
-			
-    		<xsl:apply-templates select="zoneitem" />
-    	</zone>
+    <xsl:template name="zone">
+	        <xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
+            <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
+            
+           {
+               "id": "<xsl:value-of select="@id"/>_<xsl:value-of select="../@renderingContext"/>_<xsl:value-of select="../@workspaceJCR"/>",
+               "label": "<xsl:value-of select="@name"/>",
+               "qtip": "<xsl:value-of select="@id"/>",
+               "expanded": false,
+               "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/administrator/sites/cachestats/zone_16.png",
+                
+               "hits":  "<xsl:value-of select="$hits" />",
+               "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+               "cacheHits": "<xsl:value-of select="$cacheHits" />",
+               "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+               "children": [
+                   <xsl:for-each select="zoneitem">
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="zoneitem"/> 
+                   </xsl:for-each>            
+               ]
+         }
     </xsl:template>
     
-    <xsl:template match="zoneitem">
-    	<zoneitem 	id="{@id}_{../../@renderingContext}_{../../@workspaceJCR}" leaf="true" icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/sites/cachestats/zoneitem_16.png"
-					label="#{@index} ({@type})" cacheable="{@cacheable}" hits="{hits}" cacheHits="{cacheHits}" eff="{round(cacheHits*100 div hits)} %">
-					
-			<xsl:attribute name="qtip">
-				<xsl:value-of select="concat('id : ', @id, '&lt;br/&gt;')" />
-				<xsl:value-of select="concat('type : ', @type, '&lt;br/&gt;')" />
-				<xsl:choose>
-					<xsl:when test="@type = 'content'">
-						<xsl:value-of select="concat('content type : ', @contentType, '&lt;br/&gt;')" />
-						<xsl:value-of select="concat('content id : ', @contentId)" />
-					</xsl:when>
-					<xsl:when test="@type = 'service'">
-						<xsl:value-of select="concat('service id : ', @serviceId)" />
-					</xsl:when>
-				</xsl:choose>
-			</xsl:attribute>
-    	</zoneitem>
+    <xsl:template name="zoneitem">
+         <xsl:variable name="qtip">
+           <xsl:value-of select="concat('id : ', @id, '&lt;br/&gt;')" />
+           <xsl:value-of select="concat('type : ', @type, '&lt;br/&gt;')" />
+           <xsl:choose>
+               <xsl:when test="@type = 'content'">
+                   <xsl:value-of select="concat('content type : ', @contentType, '&lt;br/&gt;')" />
+                   <xsl:value-of select="concat('content id : ', @contentId)" />
+               </xsl:when>
+               <xsl:when test="@type = 'service'">
+                   <xsl:value-of select="concat('service id : ', @serviceId)" />
+               </xsl:when>
+           </xsl:choose>
+        </xsl:variable>
+        
+       {
+           "id": "<xsl:value-of select="@id"/>_<xsl:value-of select="../../@renderingContext"/>_<xsl:value-of select="../../@workspaceJCR"/>",
+           "label": "#<xsl:value-of select="@index"/> (<xsl:value-of select="@type"/>)",
+           "qtip": "<xsl:value-of select="$qtip"/>",
+           "expanded": false,
+           "leaf": true,
+           "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/administrator/sites/cachestats/zoneitem_16.png",
+           "cacheable": "<xsl:value-of select="@cacheable"/>",
+           "hits": "<xsl:value-of select="hits" />",
+           "cacheHits": "<xsl:value-of select="cacheHits" />",
+           "eff": "<xsl:value-of select="round(cacheHits*100 div hits)" /><xsl:text> %</xsl:text>"
+     }
     </xsl:template>
     
-    <xsl:template match="inputdata">
-    	<inputdata 	id="{../../@id}_{../@renderingContext}_{../@workspaceJCR}_inputdata" label="InputData" leaf="true" icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/sites/cachestats/inputdata_16.png" cls="inputdata-node">
-			<xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
-			<xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
-			
-			<xsl:attribute name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:attribute>
-			<xsl:attribute name="hits"><xsl:value-of select="$hits" /></xsl:attribute>
-			<xsl:attribute name="cacheHits"><xsl:value-of select="$cacheHits" /></xsl:attribute>
-			<xsl:attribute name="eff"><xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text></xsl:attribute>
-			
-    		<xsl:apply-templates select="inputdataitem" />
-    	</inputdata>
+    <xsl:template name="inputdata">
+          <xsl:variable name="hits"><xsl:call-template name="get-hits-sum" /></xsl:variable>
+          <xsl:variable name="cacheHits"><xsl:call-template name="get-cachehits-sum" /></xsl:variable>
+         {
+	           "id": "<xsl:value-of select="../../@id"/>_<xsl:value-of select="../@renderingContext"/>_<xsl:value-of select="../@workspaceJCR"/>_inputdata",
+	           "label": "InputData",
+	           "expanded": false,
+	           "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/administrator/sites/cachestats/inputdata_16.png",
+	           "cacheable": "<xsl:call-template name="get-weighted-cacheable-mean" />",
+	           "hits": "<xsl:value-of select="$hits" />",
+	           "cacheHits": "<xsl:value-of select="$cacheHits" />",
+	           "eff": "<xsl:value-of select="round($cacheHits*100 div $hits)" /><xsl:text> %</xsl:text>",
+	           "children": [
+                   <xsl:for-each select="inputdataitem">
+                     <xsl:if test="position() != 1">,</xsl:if>
+                     <xsl:call-template name="inputdataitem"/> 
+                   </xsl:for-each>            
+   	           ]
+	     }
     </xsl:template>
     
-    <xsl:template match="inputdataitem">
-    	<inputdataitem 	id="{../../../@id}_{../../@renderingContext}_{../../@workspaceJCR}_{@id}" qtip="{@id}" leaf="true" icon="{$contextPath}/plugins/{$pluginName}/resources/img/administrator/sites/cachestats/inputdataitems_16.png"
-						label="{@title}" cacheable="{@cacheable}" hits="{hits}" cacheHits="{cacheHits}" eff="{round(cacheHits*100 div hits)} %">
-    	</inputdataitem>
+    <xsl:template name="inputdataitem">
+        {
+               "id": "<xsl:value-of select="../../../@id"/>_<xsl:value-of select="../../@renderingContext"/>_<xsl:value-of select="../../@workspaceJCR"/>_<xsl:value-of select="@id"/>",
+               "label": "<xsl:value-of select="@title"/>",
+               "qtip": "<xsl:value-of select="@id"/>",
+               "expanded": false,
+               "leaf": true,
+               "icon": "<xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources/img/administrator/sites/cachestats/inputdataitems_16.png",
+               "cacheable": "<xsl:value-of select="@cacheable"/>",
+               "hits": "<xsl:value-of select="hits" />",
+               "cacheHits": "<xsl:value-of select="cacheHits" />",
+               "eff": "<xsl:value-of select="round(cacheHits*100 div hits)" /><xsl:text> %</xsl:text>"
+         }
     </xsl:template>
     
     <xsl:template name="get-pagehits-sum">
Index: main/plugin-web/pages/administrator/sites/cache-statistics-back.xsl
===================================================================
--- main/plugin-web/pages/administrator/sites/cache-statistics-back.xsl	(revision 32871)
+++ main/plugin-web/pages/administrator/sites/cache-statistics-back.xsl	(nonexistent)
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Copyright 2012 Anyware Services
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-<xsl:stylesheet version="1.0" 
-                xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
-                exclude-result-prefixes="ametys">
-    
-    <xsl:param name="contextPath"/>
-    <xsl:param name="pluginName"/>
-    
-    <xsl:template match="/">
-        <html>
-            <head>
-                <title>
-                    <i18n:translate>
-                        <i18n:text i18n:key="PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_TITLE"/>
-                        <i18n:param name="name"><xsl:value-of select="site/@name"/></i18n:param>
-                    </i18n:translate>
-                </title>
-				<link rel="stylesheet" href="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/treegrid.css')}" type="text/css"/>
-				<style>
-					.custom-hd-row { background-image: url("<xsl:value-of select="ametys:pluginResourceURL('extjs', 'images/default/grid/grid3-hrow.gif')" />"); }
-				</style>
-            </head>
-            
-            <script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGrid.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridColumnResizer.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridColumns.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridLoader.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridNodeUI.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridSorter.js')}"></script>
-                
-				<script type="text/javascript" src="{ametys:pluginResourceURL($pluginName, 'js/org/ametys/web/administration/CacheStatistics.i18n.js')}"></script>
-				<script type="text/javascript" src="{ametys:pluginResourceURL($pluginName, 'js/org/ametys/web/administration/CacheStatisticsBack.i18n.js')}"></script>
-                
-                <script type="text/javascript">
-            		org.ametys.web.administration.CacheStatisticsBack.init("<xsl:value-of select="$pluginName"/>", "<xsl:value-of select="site/@name"/>", "<xsl:value-of select="site/@path"/>");
-            		
-                   	org.ametys.runtime.administrator.Panel.createPanel = function () 
-					{
-						return new Ext.Panel({
-							region: 'center',
-							
-							baseCls: 'transparent-panel',
-							border: false,
-							layout: 'border',
-							autoScroll: true,
-							
-							items : [org.ametys.web.administration.CacheStatisticsBack._centerPanel,
-									 org.ametys.web.administration.CacheStatisticsBack._rightPanel
-							]
-						});
-					}
-                </script>
-            </script>
-            
-            <body>
-            </body>
-        </html>
-    </xsl:template>
-    
-</xsl:stylesheet>
Index: main/plugin-web/pages/administrator/sites/cache-statistics-servers-tree.xsl
===================================================================
--- main/plugin-web/pages/administrator/sites/cache-statistics-servers-tree.xsl	(revision 32871)
+++ main/plugin-web/pages/administrator/sites/cache-statistics-servers-tree.xsl	(working copy)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright 2012 Anyware Services
+   Copyright 2015 Anyware Services
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -28,66 +28,87 @@
     
     <xsl:template match="/stats">
     	<root>
-			<xsl:apply-templates select="site" />
-			
-			<!-- Displays orphans if it contains at least some statistics -->
-			<xsl:apply-templates select="orphans[descendant::resource[1]]" />
+    	   {
+               "children": [
+               
+                       <!-- The site -->
+                       <xsl:for-each select="site">
+                         <xsl:if test="position() != 1">,</xsl:if>
+                         <xsl:call-template name="site"/> 
+                       </xsl:for-each>
+                       
+                       <xsl:if test="count(site) > 0">,</xsl:if>
+                       
+                       <!-- Total for pages only -->
+                       {
+                           "type": "pages",
+                           
+				           <xsl:call-template name="entry-data">
+				               <xsl:with-param name="icon" select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/site/stats/sitemap_16.png')" />
+				               
+				               <xsl:with-param name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean-total-page" /></xsl:with-param>
+				               <xsl:with-param name="httpServerHits"><xsl:call-template name="get-httpServerHits-sum-total-page" /></xsl:with-param>
+				               <xsl:with-param name="httpServerCacheHits"><xsl:call-template name="get-httpServerCacheHits-sum-total-page" /></xsl:with-param>
+				               <xsl:with-param name="frontHits"><xsl:call-template name="get-frontHits-sum-total-page" /></xsl:with-param>
+				               <xsl:with-param name="frontCacheHits"><xsl:call-template name="get-frontCachehits-sum-total-page" /></xsl:with-param>
+				               <xsl:with-param name="backHits"><xsl:call-template name="get-backHits-sum-total-page" /></xsl:with-param>
+				           </xsl:call-template>
+				           
+				           children: []
+			           }
+                       
+                       <!-- Orphans -->
+                       <xsl:for-each select="orphans[descendant::resource[1]]">
+                            <xsl:text>,</xsl:text>
+                            <xsl:call-template name="orphans"/> 
+                       </xsl:for-each>
+                    ]
+             }
 		</root>
     </xsl:template>
     
-    <xsl:template match="site">
-    	<site>
-    		<xsl:call-template name="entry-attributes">
-    			<xsl:with-param name="label" select="'PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_SITENODE'"/>
-                <xsl:with-param name="i18n" select="'label'"/>
-    			<xsl:with-param name="qtip" select="@id" />
-    			<xsl:with-param name="expanded" select="'true'" />
-    			<xsl:with-param name="icon" select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/administrator/stats/sitemap_16.png')" />
-    		</xsl:call-template>
-    		
-    		<xsl:apply-templates select="resource">
-    			<xsl:sort select="@name" />
-    		</xsl:apply-templates>
-    	</site>
-   		<total>
-   			<!-- Total for pages only -->
-   			<xsl:call-template name="entry-attributes">
-                <xsl:with-param name="i18n" select="'label qtip'"/>
-    			<xsl:with-param name="label" select="'PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_PAGENODE'"/>
-    			<xsl:with-param name="qtip" select="'PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_PAGENODE_DESC'"/>
-    			<xsl:with-param name="icon" select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/administrator/stats/sitemap_16.png')" />
-				
-				<xsl:with-param name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean-total-page" /></xsl:with-param>
-				<xsl:with-param name="httpServerHits"><xsl:call-template name="get-httpServerHits-sum-total-page" /></xsl:with-param>
-				<xsl:with-param name="httpServerCacheHits"><xsl:call-template name="get-httpServerCacheHits-sum-total-page" /></xsl:with-param>
-				<xsl:with-param name="frontHits"><xsl:call-template name="get-frontHits-sum-total-page" /></xsl:with-param>
-				<xsl:with-param name="frontCacheHits"><xsl:call-template name="get-frontCachehits-sum-total-page" /></xsl:with-param>
-				<xsl:with-param name="backHits"><xsl:call-template name="get-backHits-sum-total-page" /></xsl:with-param>
-			</xsl:call-template>
-  			</total>
-    	
-		<spacer>
-			<xsl:call-template name="node-attributes" />
-		</spacer>
+    <xsl:template name="site">
+        {
+            "type": "site",
+	        <xsl:call-template name="entry-data">
+	            <xsl:with-param name="qtip" select="@id" />
+	            <xsl:with-param name="expanded" select="'true'" />
+	            <xsl:with-param name="leaf" select="'false'" />
+	            <xsl:with-param name="icon" select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/site/stats/sitemap_16.png')" />
+	        </xsl:call-template>
+            
+            "children": [
+	            <xsl:for-each select="resource">
+	              <xsl:sort select="@name" />
+
+	              <xsl:if test="position() != 1">,</xsl:if>
+	              <xsl:call-template name="resource"/> 
+	            </xsl:for-each>
+            ]
+        }
     </xsl:template>
     
-    <xsl:template match="orphans">
-    	<orphans>
-    		<xsl:call-template name="entry-attributes">
-    			<xsl:with-param name="label" select="'PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_ORPHEAN'"/>
-    			<xsl:with-param name="qtip" select="'PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_ORPHEAN_DESC'"/>
-                <xsl:with-param name="i18n" select="'label qtip'"/>
-    			<xsl:with-param name="expanded" select="'true'" />
-				<xsl:with-param name="icon" select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/administrator/stats/sitemap_16.png')" />
-    		</xsl:call-template>
-    		
-    		<xsl:apply-templates select="resource">
-    			<xsl:sort select="@name" />
-    		</xsl:apply-templates>
-    	</orphans>
+    <xsl:template name="orphans">
+   		{
+   		   "type": "orphans",
+   		   <xsl:call-template name="entry-data">
+   			   <xsl:with-param name="expanded" select="'true'" />
+   			   <xsl:with-param name="leaf" select="'false'" />
+			   <xsl:with-param name="icon" select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/site/stats/sitemap_16.png')" />
+   		   </xsl:call-template>
+   		   
+   		  "children": [
+               <xsl:for-each select="resource">
+                 <xsl:sort select="@name" />
+
+                 <xsl:if test="position() != 1">,</xsl:if>
+                 <xsl:call-template name="resource"/> 
+               </xsl:for-each>
+           ]
+       }
     </xsl:template>
     
-    <xsl:template match="resource">
+    <xsl:template name="resource">
     	<xsl:choose>
     		<xsl:when test="@type='folder'"><xsl:call-template name="folder" /></xsl:when>
 			<xsl:otherwise><xsl:call-template name="file" /></xsl:otherwise>
@@ -95,15 +116,22 @@
    	</xsl:template>
    	
    	<xsl:template name="folder">
-    	<resource>
-    		<xsl:call-template name="entry-attributes">
+    	{
+    	   "type": "folder",
+    		<xsl:call-template name="entry-data">
     			<xsl:with-param name="label" select="@name" />
+    			<xsl:with-param name="leaf" select="'false'" />
     		</xsl:call-template>
     		
-    		<xsl:apply-templates select="resource">
-    			<xsl:sort select="@name" />
-    		</xsl:apply-templates>
-    	</resource>
+    		"children": [
+               <xsl:for-each select="resource">
+                 <xsl:sort select="@name" />
+                 
+                 <xsl:if test="position() != 1">,</xsl:if>
+                 <xsl:call-template name="resource"/> 
+               </xsl:for-each>
+           ]
+        }
     </xsl:template>
     
    	<xsl:template name="file">
@@ -111,50 +139,52 @@
     	<xsl:variable name="isFrontEntry" select="boolean(entry[@type='front'])" />
     	<xsl:variable name="isBackEntry" select="boolean(entry[@type='back'])" />
     	
-    	<resource>
-    		<xsl:variable name="httpServerPath">
-    			<xsl:if test="$isHTTPServerEntry"><xsl:value-of select="concat('HTTPServer: ', entry[@type='httpserver']/@httpServerPath, '&lt;br/&gt;')" /></xsl:if>
-    		</xsl:variable>
-    		<xsl:variable name="frontPath">
-    			<xsl:choose>
-    				<xsl:when test="$isFrontEntry"><xsl:value-of select="concat('Front: ', entry[@type='front']/@path, '&lt;br/&gt;')" /></xsl:when>
-    				<xsl:when test="entry[@type='httpserver']/@frontPath"><xsl:value-of select="concat('Front : ', entry[@type='httpserver']/@frontPath, '&lt;br/&gt;')" /></xsl:when>
-   				</xsl:choose>
-    		</xsl:variable>
-    		<xsl:variable name="backId">
-    			<xsl:if test="$isBackEntry"><xsl:value-of select="concat('Id: ', entry[@type='back']/@id)" /></xsl:if>
-    		</xsl:variable>
-    		
-			<xsl:variable name="cacheable">
-				<xsl:call-template name="get-weighted-cacheable-mean-page" />
-			</xsl:variable>
-			<xsl:variable name="httpServerHits">
-				<xsl:variable name="child"><xsl:call-template name="get-httpServerHits-sum" /></xsl:variable>
-				<xsl:value-of select="$child + sum(entry[@type='httpserver']/httpServerHits)" />
-			</xsl:variable>
-			<xsl:variable name="httpServerCacheHits">
-				<xsl:variable name="child"><xsl:call-template name="get-httpServerCacheHits-sum" /></xsl:variable>
-				<xsl:value-of select="$child + sum(entry[@type='httpserver']/httpServerCacheHits)" />
-			</xsl:variable>
-			<xsl:variable name="frontHits">
-				<xsl:variable name="child"><xsl:call-template name="get-frontHits-sum" /></xsl:variable>
-				<xsl:value-of select="$child + sum(entry[@type='httpserver' or @type='front']/*[local-name()='frontHits' or local-name()='hits'])" />
-			</xsl:variable>
-			<xsl:variable name="frontCacheHits">
-				<xsl:variable name="child"><xsl:call-template name="get-frontCachehits-sum" /></xsl:variable>
-				<xsl:value-of select="$child + sum(entry[@type='httpserber' or @type='front']/*[local-name()='frontCacheHits1' or local-name()='frontCacheHits2' or local-name()='cacheHits1' or local-name()='cacheHits2'])" />
-			</xsl:variable>
-			<xsl:variable name="backHits">
-				<xsl:choose>
-					<xsl:when test="@type = 'page'">
-						<xsl:variable name="child"><xsl:call-template name="get-backHits-sum" /></xsl:variable>
-						<xsl:value-of select="$child + sum(entry[@type='back']/hits)" />
-					</xsl:when>
-					<xsl:otherwise><xsl:text>N/A</xsl:text></xsl:otherwise>
-				</xsl:choose>
-			</xsl:variable>
+        <xsl:variable name="httpServerPath">
+            <xsl:if test="$isHTTPServerEntry"><xsl:value-of select="concat('HTTPServer: ', entry[@type='httpserver']/@httpServerPath, '&lt;br/&gt;')" /></xsl:if>
+        </xsl:variable>
+        <xsl:variable name="frontPath">
+            <xsl:choose>
+                <xsl:when test="$isFrontEntry"><xsl:value-of select="concat('Front: ', entry[@type='front']/@path, '&lt;br/&gt;')" /></xsl:when>
+                <xsl:when test="entry[@type='httpserver']/@frontPath"><xsl:value-of select="concat('Front : ', entry[@type='httpserver']/@frontPath, '&lt;br/&gt;')" /></xsl:when>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="backId">
+            <xsl:if test="$isBackEntry"><xsl:value-of select="concat('Id: ', entry[@type='back']/@id)" /></xsl:if>
+        </xsl:variable>
+        
+        <xsl:variable name="cacheable">
+            <xsl:call-template name="get-weighted-cacheable-mean-page" />
+        </xsl:variable>
+        <xsl:variable name="httpServerHits">
+            <xsl:variable name="child"><xsl:call-template name="get-httpServerHits-sum" /></xsl:variable>
+            <xsl:value-of select="$child + sum(entry[@type='httpserver']/httpServerHits)" />
+        </xsl:variable>
+        <xsl:variable name="httpServerCacheHits">
+            <xsl:variable name="child"><xsl:call-template name="get-httpServerCacheHits-sum" /></xsl:variable>
+            <xsl:value-of select="$child + sum(entry[@type='httpserver']/httpServerCacheHits)" />
+        </xsl:variable>
+        <xsl:variable name="frontHits">
+            <xsl:variable name="child"><xsl:call-template name="get-frontHits-sum" /></xsl:variable>
+            <xsl:value-of select="$child + sum(entry[@type='httpserver' or @type='front']/*[local-name()='frontHits' or local-name()='hits'])" />
+        </xsl:variable>
+        <xsl:variable name="frontCacheHits">
+            <xsl:variable name="child"><xsl:call-template name="get-frontCachehits-sum" /></xsl:variable>
+            <xsl:value-of select="$child + sum(entry[@type='httpserber' or @type='front']/*[local-name()='frontCacheHits1' or local-name()='frontCacheHits2' or local-name()='cacheHits1' or local-name()='cacheHits2'])" />
+        </xsl:variable>
+        <xsl:variable name="backHits">
+            <xsl:choose>
+                <xsl:when test="@type = 'page'">
+                    <xsl:variable name="child"><xsl:call-template name="get-backHits-sum" /></xsl:variable>
+                    <xsl:value-of select="$child + sum(entry[@type='back']/hits)" />
+                </xsl:when>
+                <xsl:otherwise><xsl:text>N/A</xsl:text></xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+	
+    	{
+            "type": "file",
     		
-    		<xsl:call-template name="entry-attributes">
+    		<xsl:call-template name="entry-data">
     			<xsl:with-param name="label" select="@name" />
     			<xsl:with-param name="qtip" select="concat($httpServerPath, $frontPath, $backId)" />
     			
@@ -166,27 +196,38 @@
     			<xsl:with-param name="backHits" select="$backHits" />
     		</xsl:call-template>
     		
-    		<xsl:apply-templates select="self::resource[resource]" mode="alone" />
+    		"children": [
+    		   <xsl:for-each select="self::resource[resource]">
+                 <xsl:sort select="@name" />
+
+                 <xsl:if test="position() != 1">,</xsl:if>
+                 <xsl:call-template name="resource-alone"/> 
+               </xsl:for-each>
+    		  
+    		   <xsl:if test="count(self::resource[resource]) > 0 and count(resource) > 0">,</xsl:if>
     		
-    		<xsl:apply-templates select="resource">
-    			<xsl:sort select="@name" />
-    		</xsl:apply-templates>
-    	</resource>
+               <xsl:for-each select="resource">
+                 <xsl:sort select="@name" />
+
+                 <xsl:if test="position() != 1">,</xsl:if>
+                 <xsl:call-template name="resource"/> 
+               </xsl:for-each>
+           ]
+   		}
     </xsl:template>
     
-    <xsl:template match="resource" mode="alone">
+    <xsl:template name="resource-alone">
     	<xsl:if test="@type='page'">
     		<xsl:call-template name="file-alone" />
     	</xsl:if>
    	</xsl:template>
     
    	<xsl:template name="file-alone">
-    	<resource>
-    		<xsl:call-template name="entry-attributes">
-    			<xsl:with-param name="label" select="'détails'" />
-    			<xsl:with-param name="qtip" select="concat('Détails des statistiques pour la page ', @name)" />
-    			<xsl:with-param name="icon" select="''" />
-    			<xsl:with-param name="iconCls" select="'x-tree-node-inline-icon'" />
+    	{
+    	   "type": "file",
+    		<xsl:call-template name="entry-data">
+    		    <xsl:with-param name="label" select="@name" />
+    			<xsl:with-param name="qtip" select="concat('Page ', @name)" />
     			
     			<xsl:with-param name="cacheable" select="@cacheable" />
     			<xsl:with-param name="httpServerHits" select="sum(entry[@type='httpserver']/httpServerHits)" />
@@ -195,19 +236,16 @@
     			<xsl:with-param name="frontCacheHits" select="sum(entry[@type='httpserver' or @type='front']/*[local-name()='frontCacheHits1' or local-name()='frontCacheHits2' or local-name()='cacheHits1' or local-name()='cacheHits2'])" />
     			<xsl:with-param name="backHits" select="sum(entry[@type='back']/hits)" />
     		</xsl:call-template>
-    	</resource>
+        }
     </xsl:template>
     
-	<xsl:template name="node-attributes">
+	<xsl:template name="node-data">
 		<xsl:param name="label" />
 		<xsl:param name="id" />
-        <xsl:param name="i18n" />
 		<xsl:param name="qtip" />
 		<xsl:param name="leaf" select="'true'" />
 		<xsl:param name="expanded" />
 		<xsl:param name="icon" />
-		<xsl:param name="iconCls" select="'x-tree-node-inline-icon'" />
-		<xsl:param name="cls" />
 		
 		<xsl:param name="cacheable" />
 		<xsl:param name="hits" />
@@ -221,15 +259,12 @@
 		<xsl:param name="effA" />
 		<xsl:param name="effF" />
 		
-		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'i18n:attr'" /><xsl:with-param name="value" select="$i18n" /></xsl:call-template>
-        <xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'label'" /><xsl:with-param name="value" select="$label" /></xsl:call-template>
+        <xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'computedLabel'" /><xsl:with-param name="value" select="$label" /></xsl:call-template>
 		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'id'" /><xsl:with-param name="value" select="$id" /></xsl:call-template>
-		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'qtip'" /><xsl:with-param name="value" select="$qtip" /></xsl:call-template>
+		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'computedQtip'" /><xsl:with-param name="value" select="$qtip" /></xsl:call-template>
 		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'leaf'" /><xsl:with-param name="value" select="$leaf" /></xsl:call-template>
 		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'expanded'" /><xsl:with-param name="value" select="$expanded" /></xsl:call-template>
 		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'icon'" /><xsl:with-param name="value" select="$icon" /></xsl:call-template>
-		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'iconCls'" /><xsl:with-param name="value" select="$iconCls" /></xsl:call-template>
-		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'cls'" /><xsl:with-param name="value" select="$cls" /></xsl:call-template>
 	
 		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'cacheable'" /><xsl:with-param name="value" select="$cacheable" /></xsl:call-template>
 		<xsl:call-template name="if-param-attr"><xsl:with-param name="name" select="'hits'" /><xsl:with-param name="value" select="$hits" /></xsl:call-template>
@@ -249,20 +284,17 @@
 		<xsl:param name="value" />
 		
 		<xsl:if test="$value != ''">
-			<xsl:attribute name="{$name}"><xsl:value-of select="$value" /></xsl:attribute>
+			"<xsl:value-of select="$name"/>": "<xsl:value-of select="$value" />"<xsl:text>, </xsl:text>
 		</xsl:if>
 	</xsl:template>
 	
-	<xsl:template name="entry-attributes">
+	<xsl:template name="entry-data">
 		<xsl:param name="label" />
 		<xsl:param name="id" />
-        <xsl:param name="i18n" />
 		<xsl:param name="qtip" />
 		<xsl:param name="leaf" select="'true'" />
 		<xsl:param name="expanded" />
 		<xsl:param name="icon"><xsl:call-template name="get-entry-icon" /></xsl:param>
-		<xsl:param name="iconCls"><xsl:call-template name="get-entry-iconCls" /></xsl:param>
-		<xsl:param name="cls" />
 		
 		<xsl:param name="cacheable"><xsl:call-template name="get-weighted-cacheable-mean" /></xsl:param>
 		<xsl:param name="httpServerHits"><xsl:call-template name="get-httpServerHits-sum" /></xsl:param>
@@ -289,16 +321,13 @@
 		<xsl:variable name="effA"><xsl:call-template name="get-percent"><xsl:with-param name="value" select="round(100*$cacheHitsA div $hits)" /></xsl:call-template></xsl:variable>
 		<xsl:variable name="effF"><xsl:call-template name="get-percent"><xsl:with-param name="value" select="round(100*$cacheHitsF div $hits)" /></xsl:call-template></xsl:variable>
 		
-		<xsl:call-template name="node-attributes">
+		<xsl:call-template name="node-data">
 			<xsl:with-param name="label" select="$label" />
 			<xsl:with-param name="id" select="$id" />
-            <xsl:with-param name="i18n" select="$i18n" />
 			<xsl:with-param name="qtip" select="$qtip" />
 			<xsl:with-param name="leaf" select="$leaf" />
 			<xsl:with-param name="expanded" select="$expanded" />
 			<xsl:with-param name="icon" select="$icon" />
-			<xsl:with-param name="iconCls" select="$iconCls" />
-			<xsl:with-param name="cls" select="$cls" />
 			
 			<xsl:with-param name="cacheable" select="$cacheable" />
 			<xsl:with-param name="hits" select="$hits" />
@@ -426,17 +455,11 @@
     <xsl:template name="get-entry-icon">
     	<xsl:choose>
     		<xsl:when test="@type = 'folder'">
-    			<xsl:value-of select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/administrator/stats/resources_16.png')" />
+    			<xsl:value-of select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/site/stats/resources_16.png')" />
     		</xsl:when>
     		<xsl:when test="@type = 'page'">
-    			<xsl:value-of select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/administrator/stats/content_16.png')" />
+    			<xsl:value-of select="concat($contextPath, '/plugins/', $pluginName, '/resources/img/site/stats/content_16.png')" />
     		</xsl:when>
     	</xsl:choose>
     </xsl:template>
-    
-    <xsl:template name="get-entry-iconCls">
-    		<xsl:if test="@type = 'asset'">
-    			<xsl:value-of select="'x-tree-node-inline-icon'" />
-    		</xsl:if>
-    </xsl:template>
 </xsl:stylesheet>
Index: main/plugin-web/pages/administrator/sites/cache-statistics-servers.xsl
===================================================================
--- main/plugin-web/pages/administrator/sites/cache-statistics-servers.xsl	(revision 32871)
+++ main/plugin-web/pages/administrator/sites/cache-statistics-servers.xsl	(nonexistent)
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Copyright 2012 Anyware Services
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-<xsl:stylesheet version="1.0" 
-                xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
-                exclude-result-prefixes="ametys">
-    
-    <xsl:param name="contextPath"/>
-    <xsl:param name="pluginName"/>
-    
-    <xsl:template match="/">
-        <html>
-            <head>
-                <title>
-                    <i18n:translate>
-                        <i18n:text i18n:key="PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TITLE"/>
-                        <i18n:param name="name"><xsl:value-of select="site/@name"/></i18n:param>
-                    </i18n:translate>
-                </title>
-				<link rel="stylesheet" href="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/treegrid.css')}" type="text/css"/>
-				<style>
-					.custom-hd-row { background-image: url("<xsl:value-of select="ametys:pluginResourceURL('extjs', 'images/default/grid/grid3-hrow.gif')" />"); }
-					/* Fixing chrome custom header issue */
-					td.x-treegrid-hd-hidden { border: 0; }
-					td.x-treegrid-hd-hidden div.x-treegrid-hd-inner { display: none; }
-				</style>
-            </head>
-            
-            <script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGrid.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridColumnResizer.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridColumns.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridLoader.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridNodeUI.js')}"></script>
-                <script type="text/javascript" src="{ametys:pluginResourceURL('extjs', 'ux/js/treegrid/TreeGridSorter.js')}"></script>
-                
-				<script type="text/javascript" src="{ametys:pluginResourceURL($pluginName, 'js/org/ametys/web/administration/CacheStatistics.i18n.js')}"></script>
-				<script type="text/javascript" src="{ametys:pluginResourceURL($pluginName, 'js/org/ametys/web/administration/CacheStatisticsServers.i18n.js')}"></script>
-				
-                <script type="text/javascript">
-					org.ametys.web.administration.CacheStatisticsServers.init("<xsl:value-of select="$pluginName"/>", "<xsl:value-of select="site/@name"/>", "<xsl:value-of select="site/@path"/>");
-					
-                    org.ametys.runtime.administrator.Panel.createPanel = function() 
-                    {
-						return new Ext.Panel({
-							region: 'center',
-							
-							baseCls: 'transparent-panel',
-							border: false,
-							layout: 'border',
-							autoScroll: true,
-							
-							items : [org.ametys.web.administration.CacheStatisticsServers._centerPanel,
-									 org.ametys.web.administration.CacheStatisticsServers._rightPanel
-							]
-						});
-                    }
-                </script>
-            </script>
-            
-            <body>
-            </body>
-        </html>
-    </xsl:template>
-    
-</xsl:stylesheet>
Index: main/plugin-web/pages/administrator/sites/load-config.xsl
===================================================================
--- main/plugin-web/pages/administrator/sites/load-config.xsl	(revision 32871)
+++ main/plugin-web/pages/administrator/sites/load-config.xsl	(nonexistent)
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Copyright 2010 Anyware Services
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-<xsl:stylesheet version="1.0" 
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-                xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
-    
-    <xsl:param name="contextPath"/>
-    <xsl:param name="pluginName"/>
-    <xsl:param name="workspaceName"/>
-    <xsl:param name="workspaceURI"/>
-    
-    <xsl:variable name="workspaceContext"><xsl:value-of select="$contextPath"/><xsl:value-of select="$workspaceURI"/></xsl:variable>
-    <xsl:variable name="workspace-resources" select="concat($workspaceContext, '/resources')"/>
-    <xsl:variable name="resourcesPath"><xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources</xsl:variable>
-    
-    <xsl:template match="/">
-        <html>
-            <head>
-                <title><i18n:text i18n:key="PLUGINS_WEB_ADMINISTRATOR_SITES_TITLE"/></title>
-                <link rel="stylesheet" href="{$resourcesPath}/css/administrator/sites.css" type="text/css"/>
-                <link type="text/css" href="{$contextPath}{$workspaceURI}/resources/css/public.css" rel="stylesheet" /> 
-            </head>
-            <script>
-                <script type="text/javascript">
-                    var item = new org.ametys.DesktopItem({
-                        text: "<i18n:text i18n:key="PLUGINS_WEB_ADMIN_CONFIG_ACT"/>",
-                        desc: "<i18n:text i18n:key="PLUGINS_WEB_ADMIN_CONFIG_DESCRIPTION"/>",
-                        icon: "<xsl:value-of select="$contextPath"/>/plugins/core/resources/img/administrator/config/icon_large.png",
-                        iconOver: "<xsl:value-of select="$contextPath"/>/plugins/core/resources/img/administrator/config/icon_large_over.png",
-                        plugin: "web",
-                        actionFunction: org.ametys.runtime.Link,
-                        actionParams: {"Link": "administrator/sites/config/<xsl:value-of select="/site/@name"/>/edit.html", "Mode" : "plugin-wrapped"}
-                        
-                    });
-                    
-                    var toping = new org.ametys.HtmlContainer({
-                        region: 'north',
-                        contentEl : 'top-panel',
-                        cls: 'top-panel',
-                        border: false
-                    });
-                    
-                    var center = new Ext.Panel({
-                        region: 'center',
-                        baseCls: 'center-panel',
-                        border: false,
-                        items : [item]
-                    });
-                    
-                    org.ametys.runtime.HomePage.createPanel = function()
-                    {
-                        return new Ext.Panel({
-                            border: false,
-                            layout: 'border',
-                            autoScroll: true,
-                            baseCls: 'transparent-panel',
-                            items: [toping, center]
-                        });
-                    }
-                </script>
-            </script>
-            <body>
-                <div id="top-panel"> 
-                    <div class="title">
-                        <i18n:text i18n:key="PLUGINS_WEB_ADMIN_CONFIG_TITLE"/>
-                    </div>
-                    
-                    <br/><br/>
-                    
-                    <div>
-                        <xsl:choose>
-                            <xsl:when test="normalize-space(site/@title) = ''">
-                                <i18n:translate>
-                                    <i18n:text i18n:key="PLUGINS_WEB_ADMIN_CONFIG_TEXT_NO_TITLE"/>
-                                    <i18n:param><xsl:value-of select="site/@name"/></i18n:param>
-                                </i18n:translate>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <i18n:translate>
-                                    <i18n:text i18n:key="PLUGINS_WEB_ADMIN_CONFIG_TEXT"/>
-                                    <i18n:param><xsl:value-of select="site/@title"/></i18n:param>
-                                    <i18n:param><xsl:value-of select="site/@name"/></i18n:param>
-                                </i18n:translate>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </div>
-                    
-                    <br/><br/>
-                    
-                </div>
-            </body>
-        </html>
-    </xsl:template>
-
-</xsl:stylesheet>
Index: main/plugin-web/plugin.xml
===================================================================
--- main/plugin-web/plugin.xml	(revision 32871)
+++ main/plugin-web/plugin.xml	(working copy)
@@ -9754,6 +9818,226 @@
                 <user runtime-config-parameter="cache.monitoring.datasource.jdbc.user"/>
                 <password runtime-config-parameter="cache.monitoring.datasource.jdbc.passwd"/>
             </extension>
+            
+            <extension id="org.ametys.web.admin.site.CacheStatisticsBackTab"
+                       point="org.ametys.core.ui.RibbonTabsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.tab.TabController">
+                    <tool-role>^(uitool-admin-cache-statistics-back)\$.*$</tool-role>
+                </class>
+            </extension>
+            
+            <extension id="Ametys.plugins.web.administration.CacheStatisticsBackFactory"  
+                       point="org.ametys.core.ui.UIToolsFactoriesManager" 
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.tool.factory.BasicToolFactory">
+                    <role>uitool-admin-cache-statistics-back</role>
+                    <toolClass>Ametys.plugins.web.administration.CacheStatisticsBackTool</toolClass>
+                    
+                    <title i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS</title>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_back_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_back_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_back_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackTool.js</file>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackTool/CacheStatisticsBackEntry.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.CacheStatisticsBack"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <!-- 
+                        This interaction allows to display the statistics of the back's cache
+                     -->
+                    <action>Ametys.plugins.web.site.SiteActions.cacheStatisticsBack</action>
+                    
+                    <selection-target-type>^(site)$</selection-target-type>
+                    
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_BACK_STATISTICS_DESC</description>
+
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_back_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_back_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_back_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/site/SiteActions.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.CMSContext"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_BACK_DEFAULT</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_BACK_DEFAULT_DESC</description>
+
+                    <action>Ametys.plugins.web.administration.CacheStatisticsBackActions.changeContext</action>
+
+                    <toggle-enabled>true</toggle-enabled>
+                    <toggle-state>true</toggle-state>
+                    
+                    <context>back-default</context>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_back_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_back_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_back_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js</file>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.PreviewContext"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_DEFAULT</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_DEFAULT_DESC</description>
+                    
+                    <action>Ametys.plugins.web.administration.CacheStatisticsBackActions.changeContext</action>
+                    
+                    <toggle-enabled>true</toggle-enabled>
+                    <toggle-state>true</toggle-state>
+                    
+                    <context>preview-default</context>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_back_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_back_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_back_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js</file>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.LiveContext"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_LIVE</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_PREVIEW_LIVE_DESC</description>
+                    
+                    <action>Ametys.plugins.web.administration.CacheStatisticsBackActions.changeContext</action>
+                    
+                    <toggle-enabled>true</toggle-enabled>
+                    <toggle-state>true</toggle-state>
+                    
+                    <context>preview-live</context>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_back_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_back_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_back_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js</file>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.FrontContext"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_FRONT_LIVE</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_CONTEXT_FRONT_LIVE_DESC</description>
+                    
+                    <action>Ametys.plugins.web.administration.CacheStatisticsBackActions.changeContext</action>
+                    
+                    <toggle-enabled>true</toggle-enabled>
+                    <toggle-state>true</toggle-state>
+                    
+                    <context>front-live</context>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_back_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_back_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_back_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js</file>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.CacheStatisticsServersTab"
+                       point="org.ametys.core.ui.RibbonTabsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.tab.TabController">
+                    <tool-role>^(uitool-admin-cache-statistics-servers)\$.*$</tool-role>
+                </class>
+            </extension>
+            
+            <extension id="Ametys.plugins.web.administration.CacheStatisticsServersFactory"  
+                       point="org.ametys.core.ui.UIToolsFactoriesManager" 
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.tool.factory.BasicToolFactory">
+                    <role>uitool-admin-cache-statistics-servers</role>
+                    <toolClass>Ametys.plugins.web.administration.CacheStatisticsServersTool</toolClass>
+                    
+                    <title i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS</title>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_front_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_front_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_front_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsServersTool.js</file>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsServersTool/CacheStatisticsServersEntry.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.CacheStatisticsServers"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <!-- 
+                        This interaction allows to display the statistics of the back's cache
+                     -->
+                    <action>Ametys.plugins.web.site.SiteActions.cacheStatisticsServers</action>
+                    
+                    <selection-target-type>^(site)$</selection-target-type>
+                    
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_SITES_HANDLE_CACHE_SERVERS_STATISTICS_DESC</description>
+
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_front_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_front_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_front_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/site/SiteActions.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.web.admin.site.ShowHideDetails"
+                       point="org.ametys.core.ui.RibbonControlsManager"
+                       class="org.ametys.core.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <label i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_HANDLE_DISPLAY_HIDE</label>
+                    <description i18n="true">PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_HANDLE_DISPLAY_HIDE_DESC</description>
+                    
+                    <action>Ametys.plugins.web.administration.CacheStatisticsServersActions.showHideDetails</action>
+                    
+                    <toggle-enabled>true</toggle-enabled>
+                    
+                    <detail-columns>effA effF hitsA hitsF cacheHitsA cacheHitsF</detail-columns>
+                    
+                    <icon-small file="true">img/administrator/sites/stats_site_cache_front_16.png</icon-small>
+                    <icon-medium file="true">img/administrator/sites/stats_site_cache_front_32.png</icon-medium>
+                    <icon-large file="true">img/administrator/sites/stats_site_cache_front_48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/web/administration/CacheStatisticsServersActions.js</file>
+                </scripts>
+            </extension>
         </extensions>
     </feature>
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackActions.js	(revision 0)
@@ -0,0 +1,52 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * Back cache statistics related actions
+ */
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsBackActions', {
+	singleton: true,
+	
+	/**
+	 * Change the context and send a modified message
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller the controller calling this function
+	 */
+	changeContext: function(controller)
+	{
+		var context = controller.getInitialConfig('context');
+		if (controller.isPressed())
+		{
+			Ametys.plugins.web.administration.CacheStatisticsBackContext.activateContexts([context]);
+		}
+		else
+		{
+			Ametys.plugins.web.administration.CacheStatisticsBackContext.deactivateContext(context);
+		}
+		
+		// inform the tool that the context has been modified
+		var target = Ext.create ('Ametys.message.MessageTarget', {
+			type: Ametys.message.MessageTarget.CACHE_CONTEXT,
+			parameters: {
+			}
+		});
+		
+		Ext.create('Ametys.message.Message', {
+			type: Ametys.message.Message.MODIFIED,
+			targets: [target]
+		});
+	}
+});
+
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackContext.js	(revision 0)
@@ -0,0 +1,58 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * Singleton class handling the list of active/inactive contexts
+ */
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsBackContext', {
+	singleton: true,
+	
+	/**
+	 * @private
+	 * @property _activeContexts the active cache statistics contexts
+	 */
+	_activeContexts: [],
+	
+	/**
+	 * Activate the given cache contexts
+	 * @param {String[]} contexts the cache contexts to activate
+	 */
+	activateContexts: function(contexts)
+	{
+		var me = this;
+		Ext.Array.each(contexts, function(context){
+			me._activeContexts.push(context);
+		});
+	},
+	
+	/**
+	 * Deactivate the given cache context
+	 * @param {String} context the cache context to deactivate
+	 */
+	deactivateContext: function(context)
+	{
+		Ext.Array.remove(this._activeContexts, context);
+	},
+
+	/**
+	 * Get the currently active cache contexts
+	 * @return the active cache contexts
+	 */
+	getActiveContexts: function()
+	{
+		return this._activeContexts;
+	}
+});
\ No newline at end of file
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackTool/CacheStatisticsBackEntry.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackTool/CacheStatisticsBackEntry.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackTool/CacheStatisticsBackEntry.js	(revision 0)
@@ -0,0 +1,34 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @private
+ * The model for the {@link Ametys.plugins.web.administration.CacheStatisticsBackTool} tree tool. 
+ */
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsBackTool.CacheStatisticsBackEntry', { 
+    extend: 'Ext.data.TreeModel', 
+    fields: [ 
+        { name: 'id', type: 'string', mapping: 'id'}, 
+        { name: 'label', type: 'string', mapping: 'label'}, 
+        { name: 'qtip', type: 'string', mapping: 'qtip'}, 
+        { name: 'icon', type: 'string', mapping: 'icon'},
+        { name: 'pageHits', type: 'string', mapping: 'pageHits'},
+        { name: 'cacheable', type: 'string', mapping: 'cacheable'},
+        { name: 'hits', type: 'string', mapping: 'hits'},
+        { name: 'eff', type: 'string', mapping: 'eff'},
+        { name: 'cacheHits', type: 'string', mapping: 'cacheHits'}
+    ]
+}); 
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackTool.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackTool.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsBackTool.js	(revision 0)
@@ -0,0 +1,226 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * This tool displays the cache statistics of the back
+ */
+
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsBackTool', {
+	extend: 'Ametys.tool.Tool',
+	
+	/**
+	 * @private
+	 * @property {Ext.tree.Panel} _tree The tree panel
+	 */
+	
+	/**
+	 * @private
+	 * @property {String} _siteName The selected site
+	 */
+	
+	/**
+	 * @private
+	 * @property {String[]} _contexts the contexts' list
+	 */
+	constructor: function()
+	{
+		this.callParent(arguments);
+		
+		// Activate all contexts
+		Ametys.plugins.web.administration.CacheStatisticsBackContext.activateContexts(["back-default", "preview-default", "preview-live", "front-live"]);
+		Ametys.message.MessageBus.on(Ametys.message.Message.MODIFIED, this._onModified, this);
+	},
+	
+	getMBSelectionInteraction: function() 
+	{
+		return Ametys.tool.Tool.MB_TYPE_NOSELECTION;
+	},
+	
+	createPanel: function ()
+	{
+		this._tree = this._drawCacheStatisticsTree();
+		return this._tree;
+	},
+	
+	setParams: function (params)
+	{
+		this.callParent(arguments);
+		this._siteName = params.siteName;
+		
+		var toolTitle = "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_CACHE_STATISTICS_BACK_TITLE'/>";
+		toolTitle += params.siteTitle ? " " + params.siteTitle + " (" + this._siteName + ")" : this._siteName;
+		this.setTitle(toolTitle);
+
+		this._tree.getStore().setRoot({id: 'root'});
+		this.refresh();
+	},
+	
+	refresh: function ()
+	{
+		this.showRefreshing();
+		
+		this._tree.getRootNode().expand(false, Ext.bind(this.showRefreshed, this), this);
+	},
+	
+	/**
+	 * @private
+	 * Draw the tree panel representing the cache statistics
+	 * @return a tree panel
+	 */
+	_drawCacheStatisticsTree: function()
+	{
+		var columns = [
+            {
+		        xtype: 'treecolumn',
+		        text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_COL_FIRST'/>",
+		        dataIndex: 'label',
+		        flex: 1
+	    	}, 
+	    	{
+		    	text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_FIRST_ROWHD_PAGE'/>",
+		    	columns: [{
+		    		header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_COL_PAGE_HITS'/>", 
+		    		dataIndex: 'pageHits', 
+		    		align: 'center', 
+		    		
+		    	}],
+	    	},
+	    	{
+		    	text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_FIRST_ROWHD_PAGE_ELEMENT'/>",
+		    	columns: [
+    	            {
+			    		header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_COL_CACHEABLE'/>", 
+			    		dataIndex: 'cacheable', 
+			    		align: 'center', 
+			    		flex: 0.25
+			    	},
+			    	{
+			    		header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_COL_EFFICIENCY'/>", 
+			    		dataIndex: 'eff', 
+			    		align: 'center', 
+			    		flex: 0.25
+			    	},
+			    	{
+			    		header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_COL_HITS'/>", 
+			    		dataIndex: 'hits', 
+			    		align: 'center', 
+			    		flex: 0.25
+			    	},
+			    	{
+			    		header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_BACK_STATISTICS_COL_CACHE_HITS'/>", 
+			    		dataIndex: 'cacheHits', 
+			    		align: 'center', 
+			    		flex: 0.25
+			    	}
+		    	]
+	    	}
+		];
+		
+		return Ext.create ('Ext.tree.Panel', {
+			rootVisible: false,
+			
+			columns: columns,
+			
+			store: Ext.create('Ext.data.TreeStore', {
+				
+				model: 'Ametys.plugins.web.administration.CacheStatisticsBackTool.CacheStatisticsBackEntry',
+				root: {
+					id: 'dummy',
+					text : 'dummy',
+					name: 'dummy',
+					path: 'dummy',
+					expanded: false
+				},
+				
+				proxy: {
+		        	type: 'ametys',
+					plugin: 'web',
+					url: '/administrator/sites/cache-statistics-back-tree.json',
+		        	reader: {
+		        		type: 'json'
+		        	}
+		        },
+		        
+				listeners: {
+					'beforeload': Ext.bind(this._onBeforeLoad, this)
+				}
+			}),
+			
+			autoScroll: true,
+			border: false
+		});
+	},
+	
+	/**
+	 * @private
+	 * Handle the before load event of the store in order to cancel the load request on the root node.
+	 * Be careful, this is mandatory is our case only because we have an hidden root node, which automatically perform a load when the node is created.
+	 * @param {Ext.data.TreeStore} store The tree store
+	 * @param {Object} operation The Ext.data.operation.Operation object that will be passed to the Proxy to
+	 * load the Store
+	 */
+	_onBeforeLoad: function(store, operation)
+    {
+		var node = operation.node,
+		id = node != null ? node.getId() : null;
+	
+		// Cancel load
+		if (!id || id === 'dummy')
+		{
+			return false;
+		}
+		
+		var params = {};
+		params.siteName = this._siteName;
+		params.contexts = '';
+		
+		Ext.Array.each (this._contexts, function(context){
+			params.contexts += context == '' ? context : '#' + context;
+		});
+		
+		operation.setParams(Ext.apply(operation.getParams() || {}, params ));
+    },
+    
+    /**
+     * @private
+     * Listener when a "modified" message has been sent out on the message bus
+     * @param {Ametys.message.Message} message The message
+     */
+    _onModified: function(message)
+    {	
+    	var targets = message.getTargets(Ametys.message.MessageTarget.CACHE_CONTEXT);
+    	if (targets.length > 0)
+		{
+    		this._contexts = Ametys.plugins.web.administration.CacheStatisticsBackContext.getActiveContexts();
+			this._tree.getStore().load({node: this._tree.getRootNode()});
+    	}
+    }
+});
+
+Ext.define("Ametys.message.CacheStatisticsBackContextMessageTarget",
+	{
+	    override: "Ametys.message.MessageTarget",
+	    statics: 
+	    {
+	        /**
+	         * @member Ametys.message.MessageTarget
+	         * @readonly
+	         * @property {String} CACHE_CONTEXT The target of the message is the cache's context 
+	         */
+	        CACHE_CONTEXT: "cacheContext"
+	    }
+	}
+);
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersActions.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersActions.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersActions.js	(revision 0)
@@ -0,0 +1,42 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * Servers cache statistics related actions
+ */
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsServersActions', {
+	singleton: true,
+	
+	/**
+	 * Show/Hide the detail columns of the site statistics tool
+	 * @param {Ametys.core.ribbon.ui.ButtonController} controller the controller calling this function
+	 */
+	showHideDetails: function(controller)
+	{
+		var focusedTool = Ametys.tool.ToolsManager.getFocusedTool();
+		if (focusedTool != null)
+		{
+			var detailColumnsArray = Ext.String.splitWords(controller.getInitialConfig('detail-columns'));
+			Ext.Array.each(focusedTool.getTree().getColumns(), function(column) {
+				if (Ext.Array.contains(detailColumnsArray, column.dataIndex))
+				{
+					column.setVisible(controller.isPressed());
+				}
+			});
+		}	
+	}
+});
+
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersTool/CacheStatisticsServersEntry.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersTool/CacheStatisticsServersEntry.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersTool/CacheStatisticsServersEntry.js	(revision 0)
@@ -0,0 +1,76 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @private
+ * The model for the {@link Ametys.plugins.web.administration.CacheStatisticsServersTool} tool. 
+ */
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsServersTool.CacheStatisticsServersEntry', { 
+    extend: 'Ext.data.TreeModel', 
+    fields: [ 
+        { name: 'id', type: 'string', mapping: 'id'}, 
+        { name: 'type', type: 'string', mapping: 'type'}, 
+        { name: 'computedLabel', type: 'string', mapping: 'computedLabel'}, 
+        { name: 'label', type: 'string', calculate: function(data) {
+	    		if (data.type == 'pages')
+				{
+	    			return "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_PAGENODE'/>";
+				}
+	    		else if (data.type == 'site')
+				{
+	    			return "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_SITENODE'/>";
+				}
+	    		else if (data.type == 'orphans')
+				{
+	    			return "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_ORPHEAN'/>";
+				}
+	    		else
+				{
+	    			return data.computedLabel;
+				} 
+	        }
+        },
+        { name: 'computedQtip', type: 'string', mapping: 'computedQtip'},
+        { name: 'qtip', type: 'string', calculate: function(data){
+        		if (data.type == 'pages')
+    			{
+        			return "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_PAGENODE_DESC'/>";
+    			}
+	    		else if (data.type == 'orphans')
+				{
+	    			return "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_TREE_ORPHEAN_DESC'/>";
+				}
+	    		else
+    			{
+	    			return data.computedQtip;
+    			}
+        	}
+        }, 
+        { name: 'icon', type: 'string', mapping: 'icon'},
+        { name: 'pageHits', type: 'string', mapping: 'pageHits'},
+        { name: 'cacheable', type: 'string', mapping: 'cacheable'},
+        { name: 'hits', type: 'string', mapping: 'hits'},
+        { name: 'hitsA', type: 'string', mapping: 'hitsA'},
+        { name: 'hitsF', type: 'string', mapping: 'hitsF'},
+        { name: 'hitsB', type: 'string', mapping: 'hitsB'},
+        { name: 'eff', type: 'string', mapping: 'eff'},
+        { name: 'effA', type: 'string', mapping: 'effA'},
+        { name: 'effF', type: 'string', mapping: 'effF'},
+        { name: 'cacheHits', type: 'string', mapping: 'cacheHits'},
+        { name: 'cacheHitsA', type: 'string', mapping: 'cacheHitsA'},
+        { name: 'cacheHitsF', type: 'string', mapping: 'cacheHitsF'}
+    ]
+}); 
Index: main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersTool.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersTool.js	(revision 0)
+++ main/plugin-web/resources/js/Ametys/plugins/web/administration/CacheStatisticsServersTool.js	(revision 0)
@@ -0,0 +1,245 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * This tool displays the cache statistics of the back
+ */
+
+Ext.define('Ametys.plugins.web.administration.CacheStatisticsServersTool', {
+	extend: 'Ametys.tool.Tool',
+	
+	/**
+	 * @private
+	 * @property {Ext.tree.Panel} _tree The tree panel
+	 */
+	
+	/**
+	 * @private
+	 * @property {String} _siteName The selected site
+	 */
+
+	getMBSelectionInteraction: function() 
+	{
+		return Ametys.tool.Tool.MB_TYPE_NOSELECTION;
+	},
+	
+	createPanel: function ()
+	{
+		this._tree = this._drawCacheStatisticsServersTree();
+		return this._tree;
+	},
+	
+	setParams: function (params)
+	{
+		this.callParent(arguments);
+		this._siteName = params.siteName;
+
+		var toolTitle = "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_UITOOL_SITE_CACHE_STATISTICS_SERVERS_TITLE'/>";
+		toolTitle += params.siteTitle ? " " + params.siteTitle + " (" + this._siteName + ")" : this._siteName;
+		this.setTitle(toolTitle);
+		
+		this._tree.getStore().setRoot({id: 'root'});
+		this.refresh();
+	},
+	
+	refresh: function ()
+	{
+		this.showRefreshing();
+		
+		this._tree.getRootNode().expand(false, Ext.bind(this.showRefreshed, this), this);
+	},
+	
+	/**
+	 * Get the tree panel of the tool
+	 * @return the tree panel of the tool
+	 */
+	getTree: function()
+	{
+		return this._tree;
+	},
+	
+	/**
+	 * @private
+	 * Draw the tree panel representing the servers' cache statistics 
+	 * @return a tree panel
+	 */
+	_drawCacheStatisticsServersTree: function()
+	{
+		var columns = [
+            {
+		        text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_FIRST'/>",
+		        columns: [
+                  {
+                	  xtype: 'treecolumn',
+                	  dataIndex: 'label',
+                	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_FIRST'/>",
+                	  minWidth: 200
+                  },
+                  {
+                	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_CACHEABLE'/>", 
+	  		          dataIndex: 'cacheable', 
+	  		          align: 'center' ,
+	  		          width: 75
+                  }
+              ]
+	    	}, 
+	    	{
+		    	text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_EFFICIENCY'/>",
+		    	columns: [
+    	          {
+		    		  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_EFFICIENCY_TOTAL'/>", 
+		    		  dataIndex: 'eff', 
+		    		  width: 75,
+		    		  align: 'center'
+    	          },
+    	          {
+    	        	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_EFFICIENCY_HTTPSERVER'/>", 
+  		    		  dataIndex: 'effA', 
+  		    		  width: 75,
+  		    		  hidden: true,
+  		    		  align: 'center'
+    	          },
+    	          {
+    	        	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_EFFICIENCY_FRONT'/>", 
+  		    		  dataIndex: 'effF',
+  		    		  width: 75,
+  		    		  hidden: true,
+  		    		  align: 'center'
+    	          }
+	            ],
+	    	},
+	    	{
+		    	text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_HITS'/>",
+		    	columns: [
+    	          {
+		    		  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_HITS_TOTAL'/>", 
+		    		  dataIndex: 'hits', 
+		    		  width: 75,
+		    		  align: 'center'
+    	          },
+    	          {
+    	        	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_HITS_HTTPSERVER'/>", 
+  		    		  dataIndex: 'hitsA', 
+  		    		  width: 75,
+  		    		  hidden: true,
+  		    		  align: 'center'
+    	          },
+    	          {
+    	        	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_HITS_FRONT'/>", 
+  		    		  dataIndex: 'hitsF', 
+  		    		  width: 75,
+  		    		  hidden: true,
+  		    		  align: 'center'
+    	          }
+	            ],
+	    	},
+	    	{
+	    		text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_CACHE_HITS'/>",
+		    	columns: [
+    	          {
+		    		  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_CACHE_HITS_TOTAL'/>", 
+		    		  dataIndex: 'cacheHits', 
+		    		  width: 75,
+		    		  align: 'center'
+    	          },
+    	          {
+    	        	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_CACHE_HITS_HTTPSERVER'/>", 
+  		    		  dataIndex: 'cacheHitsA',
+  		    		  width: 50,
+  		    		  hidden: true,
+  		    		  align: 'center'
+    	          },
+    	          {
+    	        	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_CACHE_HITS_FRONT'/>", 
+  		    		  dataIndex: 'cacheHitsF', 
+  		    		  width: 50,
+  		    		  hidden: true,
+  		    		  align: 'center'
+    	          }
+	            ],
+	    	},
+	    	{
+	    		text: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_COL_HITS_BACK'/>",
+	    		columns: [
+    		      {
+    		    	  header: "<i18n:text i18n:key='PLUGINS_WEB_ADMINISTRATOR_CACHE_SERVERS_STATISTICS_FIRST_ROWHD_BACK'/>", 
+		    		  dataIndex: 'hitsB',
+		    		  width: 50,
+		    		  align: 'center'
+    		      }
+	            ]
+	    	}
+		];
+		
+		return Ext.create ('Ext.tree.Panel', {
+			rootVisible: false,
+			
+			columns: columns,
+			
+			store: Ext.create('Ext.data.TreeStore', {
+				
+				model: 'Ametys.plugins.web.administration.CacheStatisticsServersTool.CacheStatisticsServersEntry',
+				root: {
+					id: 'dummy',
+					text : 'dummy',
+					name: 'dummy',
+					path: 'dummy',
+					expanded: false
+				},
+				
+				proxy: {
+		        	type: 'ametys',
+					plugin: 'web',
+					url: '/administrator/sites/cache-statistics-servers-tree.json',
+		        	reader: {
+		        		type: 'json'
+		        	}
+		        },
+		        
+				listeners: {
+					'beforeload': Ext.bind(this._onBeforeLoad, this)
+				}
+			}),
+			
+			autoScroll: true,
+			border: false
+		});
+	},
+	
+	/**
+	 * @private
+	 * Handle the before load event of the store in order to cancel the load request on the root node.
+	 * Be careful, this is mandatory is our case only because we have an hidden root node, which automatically perform a load when the node is created.
+	 * @param {Ext.data.TreeStore} store The tree store
+	 * @param {Object} operation The Ext.data.operation.Operation object that will be passed to the Proxy to
+	 * load the Store
+	 */
+	_onBeforeLoad: function(store, operation)
+    {
+		var node = operation.node,
+		id = node != null ? node.getId() : null;
+	
+		// Cancel load
+		if (!id || id === 'dummy')
+		{
+			return false;
+		}
+		
+		operation.setParams(Ext.apply(operation.getParams() || {}, {
+			siteName: this._siteName
+		}));
+    }
+});
Index: main/plugin-web/resources/js/Ametys/plugins/web/page/NotifyPublication.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/page/NotifyPublication.js	(revision 32871)
+++ main/plugin-web/resources/js/Ametys/plugins/web/page/NotifyPublication.js	(working copy)
@@ -105,7 +105,7 @@
 								xtype: 'component',
 								cls: 'text',
 								html: "<i18n:text i18n:key='PLUGINS_WEB_PAGE_NOTIFY_ONLINE_PUBLICATION_DIALOG_HINT_2'/>"
-							},
+							}
 					]
 				});
 		
Index: main/plugin-web/resources/js/Ametys/plugins/web/site/SiteActions.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/site/SiteActions.js	(revision 32871)
+++ main/plugin-web/resources/js/Ametys/plugins/web/site/SiteActions.js	(working copy)
@@ -395,6 +395,32 @@
 	},
 	
 	/**
+	 * Open the selected site's back cache statistics
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	cacheStatisticsBack: function(controller)
+	{
+		var target = controller.getMatchingTargets()[0];
+		if (target != null)
+		{
+ 			Ametys.tool.ToolsManager.openTool('uitool-admin-cache-statistics-back', {id: target.getParameters().name, siteName: target.getParameters().name, siteTitle: target.getParameters().title});
+		}
+	},
+
+	/**
+	 * Open the selected site's serverss statistics for the servers
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	cacheStatisticsServers: function(controller)
+	{
+		var target = controller.getMatchingTargets()[0];
+		if (target != null)
+		{
+ 			Ametys.tool.ToolsManager.openTool('uitool-admin-cache-statistics-servers', {id: target.getParameters().name, siteName: target.getParameters().name, siteTitle: target.getParameters().title});
+		}
+	},
+	
+	/**
 	 * Affect a super user on a site
 	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
 	 */	
Index: main/plugin-web/resources/js/Ametys/plugins/web/site/SiteStatisticsTool.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/site/SiteStatisticsTool.js	(revision 32871)
+++ main/plugin-web/resources/js/Ametys/plugins/web/site/SiteStatisticsTool.js	(working copy)
@@ -26,11 +26,6 @@
 	 * @property {Ext.tree.Panel} _tree The statistics tree
 	 */
 	
-	constructor: function(config)
-	{
-		this.callParent(arguments);
-	},
-		
 	getMBSelectionInteraction: function() 
 	{
 		return Ametys.tool.Tool.MB_TYPE_NOSELECTION;
Index: main/plugin-web/resources/js/Ametys/plugins/web/site/SitesTool.js
===================================================================
--- main/plugin-web/resources/js/Ametys/plugins/web/site/SitesTool.js	(revision 32871)
+++ main/plugin-web/resources/js/Ametys/plugins/web/site/SitesTool.js	(working copy)
@@ -23,7 +23,7 @@
 	
 	/**
 	 * @private
-	 * @property {Ext.tree.Panel} _tree The sites tree panel
+	 * @property {Ametys.web.site.SitesTree} _tree The sites tree panel
 	 */
 	
 	constructor: function(config)
Index: main/plugin-web/ribbon/web-ribbon-sites.xml
===================================================================
--- main/plugin-web/ribbon/web-ribbon-sites.xml	(revision 32871)
+++ main/plugin-web/ribbon/web-ribbon-sites.xml	(working copy)
@@ -33,6 +33,10 @@
                         <layout size="small" align="top">
                             <control id="org.ametys.web.admin.site.Statistics"/>
                             <control id="org.ametys.web.admin.site.SuperUser"/>
+                            <control id="org.ametys.web.admin.site.CacheStatisticsBack"/>
+                        </layout>
+                        <layout size="small" align="top">
+                            <control id="org.ametys.web.admin.site.CacheStatisticsServers"/>
                         </layout>
                     </medium>
                     <small/>
@@ -61,6 +65,31 @@
                 </group>
             </groups>
         </tab>
-        
+   
+        <tab id="org.ametys.web.admin.site.CacheStatisticsBackTab" label="plugin.web:RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_LABEL" contextualLabel="plugin.web:RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_LABEL" contextualColor="7" contextualGroup="SITESTATSBACK">
+            <groups>
+                <group label="plugin.web:RIBBON_TABS_TAB_CACHE_STATISTICS_BACK_GROUP_GROUP_CONTEXT_LABEL" icon="">
+                    <large/>
+                    <medium>
+                       <control id="org.ametys.web.admin.site.CMSContext"/>
+                       <control id="org.ametys.web.admin.site.PreviewContext"/>
+                       <control id="org.ametys.web.admin.site.LiveContext"/>
+                       <control id="org.ametys.web.admin.site.FrontContext"/> 
+                    </medium>
+                    <small/>
+                </group>
+            </groups>
+        </tab>
+        <tab id="org.ametys.web.admin.site.CacheStatisticsServersTab" label="plugin.web:RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_LABEL" contextualLabel="plugin.web:RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_LABEL" contextualColor="7" contextualGroup="SITESTATSSERVERS">
+            <groups>
+                <group label="plugin.web:RIBBON_TABS_TAB_CACHE_STATISTICS_SERVERS_GROUP_GROUP_CONTEXT_LABEL" icon="">
+                    <large/>
+                    <medium>
+                       <control id="org.ametys.web.admin.site.ShowHideDetails"/>
+                    </medium>
+                    <small/>
+                </group>
+            </groups>
+        </tab>
     </tabs>
 </ribbon>
\ No newline at end of file
Index: main/plugin-web/sitemap-back.xmap
===================================================================
--- main/plugin-web/sitemap-back.xmap	(revision 32871)
+++ main/plugin-web/sitemap-back.xmap	(working copy)
@@ -30,8 +30,10 @@
             <!-- TODO to remove -->
             <map:generator name="convert-pagepath-to-id" src="org.ametys.web.repository.page.generators.ConvertPagePathToIdGenerator" label="xml" pool-grow="2" pool-max="16" pool-min="0" />
             <map:generator name="child-pages" src="org.ametys.web.repository.page.generators.ChildrenPagesIdGenerator" label="xml" pool-grow="2" pool-max="16" pool-min="0" />
+            
             <map:generator name="cache-stats-back" src="org.ametys.web.cache.monitoring.ui.PageElementCacheStatsGenerator" logger="org.ametys.web.cachemonitoring.generators.PageElementCacheStatsGenerator" label="xml" />
             <map:generator name="cache-stats-servers" src="org.ametys.web.cache.monitoring.ui.ServersCacheStatsGenerator" logger="org.ametys.web.cachemonitoring.generators.ServersCacheStatsGenerator" label="xml" />
+            
             <map:generator name="site-parameters" src="org.ametys.web.site.SiteParametersGenerator" logger="org.ametys.web.site.SiteParametersGenerator" label="xml" />
             <map:generator name="page-info" src="org.ametys.web.repository.page.generators.PageInformationGenerator" label="xml" pool-grow="2" pool-max="16" pool-min="0" />
             <map:generator name="site-info" src="org.ametys.web.repository.site.SiteInformationGenerator" label="xml" pool-grow="2" pool-max="16" pool-min="0" />
@@ -229,24 +231,9 @@
                 <map:serialize type="xml" />
             </map:match>
 
-            <map:match pattern="administrator/sites/cache-statistics-back/*.html">
-                <map:generate type="site-configuration" label="content">
-                    <map:parameter name="name" value="{1}" />
-                </map:generate>
-                <map:transform src="pages/administrator/sites/cache-statistics-back.xsl">
-                    <map:parameter name="contextPath" value="{request:contextPath}" />
-                    <map:parameter name="pluginName" value="{request-attr:pluginName}" />
-                </map:transform>
-                <map:transform type="i18n">
-                    <map:parameter name="locale" value="{locale:locale}" />
-                    <map:parameter name="plugin" value="{request-attr:pluginName}" />
-                </map:transform>
-                <map:serialize type="xml" />
-            </map:match>
-
-            <map:match pattern="administrator/sites/cache-statistics-back-tree/*.xml">
+            <map:match pattern="administrator/sites/cache-statistics-back-tree.json">
                 <map:generate type="cache-stats-back">
-                    <map:parameter name="siteName" value="{1}" />
+                    <map:parameter name="siteName" value="{request-param:siteName}" />
                     <map:parameter name="contexts" value="{request-param:contexts}" />
                 </map:generate>
                 <map:transform src="pages/administrator/sites/cache-statistics-back-tree.xsl">
@@ -257,37 +244,18 @@
                     <map:parameter name="locale" value="{locale:locale}" />
                     <map:parameter name="plugin" value="{request-attr:pluginName}" />
                 </map:transform>
-                <map:serialize type="xml" />
-            </map:match>
-
-            <map:match pattern="administrator/sites/cache-statistics-servers/*.html">
-                <map:generate type="site-configuration">
-                    <map:parameter name="name" value="{1}" />
-                </map:generate>
-                <map:transform src="pages/administrator/sites/cache-statistics-servers.xsl">
-                    <map:parameter name="contextPath" value="{request:contextPath}" />
-                    <map:parameter name="pluginName" value="{request-attr:pluginName}" />
-                </map:transform>
-                <map:transform type="i18n">
-                    <map:parameter name="locale" value="{locale:locale}" />
-                    <map:parameter name="plugin" value="{request-attr:pluginName}" />
-                </map:transform>
-                <map:serialize type="xml" />
+                <map:serialize type="text" />
             </map:match>
 
-            <map:match pattern="administrator/sites/cache-statistics-servers-tree/*.xml">
+            <map:match pattern="administrator/sites/cache-statistics-servers-tree.json">
                 <map:generate type="cache-stats-servers">
-                    <map:parameter name="siteName" value="{1}" />
+                    <map:parameter name="siteName" value="{request-param:siteName}" />
                 </map:generate>
                 <map:transform src="pages/administrator/sites/cache-statistics-servers-tree.xsl">
                     <map:parameter name="contextPath" value="{request:contextPath}" />
                     <map:parameter name="pluginName" value="{request-attr:pluginName}" />
                 </map:transform>
-                <map:transform type="i18n">
-                    <map:parameter name="locale" value="{locale:locale}" />
-                    <map:parameter name="plugin" value="{request-attr:pluginName}" />
-                </map:transform>
-                <map:serialize type="xml" />
+                <map:serialize type="text" />
             </map:match>
 
             <map:match pattern="administrator/skins/view.html">
