Index: webapp/cms/skins/odf/conf/tags.xml
===================================================================
--- webapp/cms/skins/odf/conf/tags.xml	(revision 37480)
+++ webapp/cms/skins/odf/conf/tags.xml	(working copy)
@@ -19,6 +19,10 @@
 		<label i18n="true">SKIN_BO_TAG_SPECIALPAGES_LABEL</label>
 		<description i18n="true">SKIN_BO_TAG_SPECIALPAGES_DESCRIPTION</description>
 		
+        <tag id="CART" target="PAGE">
+            <label i18n="true">SKIN_BO_TAG_SPECIALPAGES_TAG_CART_LABEL</label>
+            <description i18n="true">SKIN_BO_TAG_SPECIALPAGES_TAG_CART_DESCRIPTION</description>
+        </tag>
 		<tag id="FOOTER_LINKS" target="PAGE">
 			<label i18n="true">SKIN_BO_TAG_SPECIALPAGES_TAG_FOOTERLINK_LABEL</label>
 			<description i18n="true">SKIN_BO_TAG_SPECIALPAGES_TAG_FOOTERLINK_DESCRIPTION</description>
Index: webapp/cms/skins/odf/i18n/messages.xml
===================================================================
--- webapp/cms/skins/odf/i18n/messages.xml	(revision 37480)
+++ webapp/cms/skins/odf/i18n/messages.xml	(working copy)
@@ -34,6 +34,13 @@
 	<message key="SKIN_DOWNLOAD_PDF_TITLE">Download the content as a PDF</message>
 	<message key="SKIN_DOWNLOAD_PDF_ALT">PDF</message>
 
+    <message key="SKIN_CART">See the cart's content</message>
+    <message key="SKIN_ADD_TO_CART">Add to cart</message>
+    <message key="SKIN_CART_PROGRAM">program</message>
+    <message key="SKIN_CART_PROGRAMS">programs</message>
+    <message key="SKIN_CART_COURSE">course</message>
+    <message key="SKIN_CART_COURSES">courses</message>
+    
 	<message key="SKIN_TRANSLATION">Traductions :</message>
 	<message key="SKIN_TRANSLATION_fr">Voir la page en français</message>
 	<message key="SKIN_TRANSLATION_en">See this page in english</message>
@@ -421,6 +428,8 @@
 		+-->
 	<message key="SKIN_BO_TAG_SPECIALPAGES_LABEL">Special pages</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_DESCRIPTION">Page with a specific feature</message>
+	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_CART_LABEL">Programs and courses cart</message>
+    <message key="SKIN_BO_TAG_SPECIALPAGES_TAG_CART_DESCRIPTION">Page containing the visualization service of the cart's contents</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_FOOTERLINK_LABEL">Footer links</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_FOOTERLINK_DESCRIPTION">Pages accessible at the bottom of the page</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_NEWSLETTER_MAIN_LABEL">Newsletter page</message>
Index: webapp/cms/skins/odf/i18n/messages_fr.xml
===================================================================
--- webapp/cms/skins/odf/i18n/messages_fr.xml	(revision 37480)
+++ webapp/cms/skins/odf/i18n/messages_fr.xml	(working copy)
@@ -33,6 +33,13 @@
 
 	<message key="SKIN_DOWNLOAD_PDF_TITLE">Télécharger le contenu au format PDF</message>
 	<message key="SKIN_DOWNLOAD_PDF_ALT">PDF</message>
+	
+	<message key="SKIN_CART">Voir le contenu du panier</message>
+	<message key="SKIN_ADD_TO_CART">Ajouter au panier</message>
+    <message key="SKIN_CART_PROGRAM">1 formation</message>
+    <message key="SKIN_CART_PROGRAMS">formations</message>
+    <message key="SKIN_CART_COURSE">1 ELP</message>
+    <message key="SKIN_CART_COURSES">ELPs</message>
 
 	<message key="SKIN_TRANSLATION">Traductions :</message>
 	<message key="SKIN_TRANSLATION_fr">Voir la page en français</message>
@@ -422,6 +429,8 @@
 		+-->
 	<message key="SKIN_BO_TAG_SPECIALPAGES_LABEL">Pages spéciales</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_DESCRIPTION">Page possédant une fonctionnalité spécifique</message>
+	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_CART_LABEL">Panier de formations et d'UE</message>
+    <message key="SKIN_BO_TAG_SPECIALPAGES_TAG_CART_DESCRIPTION">Page contenant le service de visualisation des contenus du panier.</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_FOOTERLINK_LABEL">Liens de bas de page</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_FOOTERLINK_DESCRIPTION">Pages accessibles dans le bas de page</message>
 	<message key="SKIN_BO_TAG_SPECIALPAGES_TAG_NEWSLETTER_MAIN_LABEL">Page Newsletter</message>
Index: webapp/cms/skins/odf/resources/css/ametys.css
===================================================================
--- webapp/cms/skins/odf/resources/css/ametys.css	(revision 37480)
+++ webapp/cms/skins/odf/resources/css/ametys.css	(working copy)
@@ -727,6 +727,28 @@
 /* AMETYS END Desktop */
 }
 
+.art-nav div.go-to-cart
+{
+    float: right;
+}
+
+.art-nav div.go-to-cart a.go-to-cart-btn
+{
+    cursor: pointer;
+}
+
+.art-nav div.go-to-cart table.go-to-cart-table
+{
+	float: right;
+	width: 80px;
+}
+
+.art-nav div.go-to-cart table.go-to-cart-table tr td
+{
+    float: right;
+    color: #C8C1B1;
+}
+
 /* AMETYS BEGIN Desktop */
 .art-nav-outer
 {
@@ -736,7 +758,7 @@
 
 .art-nav-wrapper 
 {
-        position: relative;
+    position: relative;
     width:1000px;
     margin:0 auto;
 }
@@ -2507,6 +2529,16 @@
 	font-weight: normal;
 }/* end PostHeaderIcon */
 
+span.content-title div.add-to-cart
+{
+    float: right;
+}
+
+span.content-title div.add-to-cart img.add-to-cart-btn
+{
+    cursor: pointer;
+}
+
 /* begin PostBullets */
 .ametys-cms-content ol, .ametys-cms-content ul
 {
Index: webapp/cms/skins/odf/stylesheets/content/course/course-main.xsl
===================================================================
--- webapp/cms/skins/odf/stylesheets/content/course/course-main.xsl	(revision 37480)
+++ webapp/cms/skins/odf/stylesheets/content/course/course-main.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.
@@ -17,9 +17,50 @@
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 							xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
                             xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
-							exclude-result-prefixes="ametys">
+                            xmlns:resolver="org.ametys.cms.transformation.xslt.ResolveURIComponent" 
+                            exclude-result-prefixes="ametys resolver">
+
 
 	<xsl:import href="plugin:odf://stylesheets/content/course/course-main.xsl"/>	
 	<xsl:import href="course.xsl"/>	
+    
+    <xsl:template name="common-content-head-js">
+        <script type="text/javascript" src="{ametys:pluginResourceURL('odf-web', 'js/org/helper/cart-helper.js')}"></script>
+    </xsl:template>
+    
+    <xsl:template name="common-content-body-title-content">
+        <xsl:param name="title" select="metadata/title"/>
+        <xsl:param name="subtitle" select="metadata/document-subtitle"/>
+        
+        <xsl:call-template name="zone-header"> 
+            <xsl:with-param name="content">
+                <span class="content-title summary"><xsl:value-of select="$title"/>
+                    <xsl:call-template name="add-to-cart-btn"/>
+                </span>
+                <xsl:if test="$subtitle != ''">
+                    <span class="content-subtitle"><xsl:value-of select="$subtitle"/></span>
+                </xsl:if>
+            </xsl:with-param>
+        </xsl:call-template>
+    </xsl:template>
+    
+    <xsl:template name="add-to-cart-btn">
+         <script type="text/javascript">
+ 	         <xsl:variable name="skin" select="ametys:skin()"/>
+	         <xsl:variable name="pageId" select="ametys:pageId()"/>
+	        
+	         document.writeln('&lt;div class=\"add-to-cart\"&gt;');
+	         <xsl:choose>
+                <xsl:when test="$rendering-context = 'back'">
+                    document.writeln("&lt;img class=\"add-to-cart-btn\" onclick=\"addCourse('<xsl:value-of select="@id"/>', '<xsl:value-of select="$pageId"/>', '', '<xsl:value-of select="@title"/>');document.location.reload(false);\" src=\"<xsl:value-of select="ametys:skinURL('img/content/cart/add.png')"/>\" type=\"image/png\" title=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\" alt=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\"/&gt;");
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:variable name="pageURL" select="resolver:resolve('page', $pageId, false)"/>
+                    document.writeln("&lt;img class=\"add-to-cart-btn\" onclick=\"addCourse('<xsl:value-of select="@id"/>', '<xsl:value-of select="$pageId"/>', '<xsl:value-of select="$pageURL"/>', '<xsl:value-of select="@title"/>');document.location.reload(false);\" src=\"<xsl:value-of select="ametys:skinURL('img/content/cart/add.png')"/>\" type=\"image/png\" title=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\" alt=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\"/&gt;");
+                </xsl:otherwise>            
+             </xsl:choose>
+             document.writeln('&lt;/div&gt;');
+        </script>
+    </xsl:template>
 	
 </xsl:stylesheet>
Index: webapp/cms/skins/odf/stylesheets/content/program/program-main.xsl
===================================================================
--- webapp/cms/skins/odf/stylesheets/content/program/program-main.xsl	(revision 37480)
+++ webapp/cms/skins/odf/stylesheets/content/program/program-main.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.
@@ -18,19 +18,55 @@
 							xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
                             xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
                             xmlns:resolver="org.ametys.cms.transformation.xslt.ResolveURIComponent" 
-							exclude-result-prefixes="ametys">
+							exclude-result-prefixes="ametys resolver">
 
 	<xsl:import href="plugin:odf://stylesheets/content/program/program-main.xsl"/>	
 	<xsl:import href="program.xsl"/>	
-
-	<xsl:template name="common-content-head-js">
-		<script type="text/javascript">
-			$j(document).ready(function() {
-				$j("#tabs-<xsl:value-of select="$programAnchor"/>").tabs();
-			});
-		</script>
-	</xsl:template>
-		
+    
+    <xsl:template name="common-content-head-js">
+        <script type="text/javascript">
+            $j(document).ready(function() {
+                $j("#tabs-<xsl:value-of select="$programAnchor"/>").tabs();
+            });
+        </script>
+        <script type="text/javascript" src="{ametys:pluginResourceURL('odf-web', 'js/org/helper/cart-helper.js')}"></script>
+    </xsl:template>
+    
+    <xsl:template name="common-content-body-title-content">
+        <xsl:param name="title" select="metadata/title"/>
+        <xsl:param name="subtitle" select="metadata/document-subtitle"/>
+        
+        <xsl:call-template name="zone-header"> 
+            <xsl:with-param name="content">
+                <span class="content-title summary"><xsl:value-of select="$title"/>
+                    <xsl:call-template name="add-to-cart-btn"/>
+                </span>
+                <xsl:if test="$subtitle != ''">
+                    <span class="content-subtitle"><xsl:value-of select="$subtitle"/></span>
+                </xsl:if>
+            </xsl:with-param>
+        </xsl:call-template>
+    </xsl:template>
+    
+    <xsl:template name="add-to-cart-btn">
+        <script type="text/javascript">
+            <xsl:variable name="skin" select="ametys:skin()"/>
+            <xsl:variable name="pageId" select="ametys:pageId()"/>
+            
+            document.writeln('&lt;div class=\"add-to-cart\"&gt;');
+            <xsl:choose>
+	            <xsl:when test="$rendering-context = 'back'">
+    	            document.writeln("&lt;img class=\"add-to-cart-btn\" onclick=\"addProgram('<xsl:value-of select="@id"/>', '<xsl:value-of select="$pageId"/>', '', '<xsl:value-of select="@title"/>');document.location.reload(false);\" src=\"<xsl:value-of select="ametys:skinURL('img/content/cart/add.png')"/>\" type=\"image/png\" title=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\" alt=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\"/&gt;");
+	            </xsl:when>
+                <xsl:otherwise>
+		            <xsl:variable name="pageURL" select="resolver:resolve('page', $pageId, false)"/>
+                    document.writeln("&lt;img class=\"add-to-cart-btn\" onclick=\"addProgram('<xsl:value-of select="@id"/>', '<xsl:value-of select="$pageId"/>', '<xsl:value-of select="$pageURL"/>', '<xsl:value-of select="@title"/>');document.location.reload(false);\" src=\"<xsl:value-of select="ametys:skinURL('img/content/cart/add.png')"/>\" type=\"image/png\" title=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\" alt=\"<i18n:text i18n:key="SKIN_ADD_TO_CART" i18n:catalogue="skin.{$skin}"/>\"/&gt;");
+                </xsl:otherwise>            
+            </xsl:choose>
+            document.writeln('&lt;/div&gt;');
+        </script>
+    </xsl:template>
+    
     <xsl:template name="translations">
         <xsl:if test="translations/*">
             <div class="translations">
@@ -52,5 +88,5 @@
                 </ul>
             </div>
         </xsl:if>
-    </xsl:template>		
+    </xsl:template>
 </xsl:stylesheet>
Index: webapp/cms/skins/odf/stylesheets/head.xsl
===================================================================
--- webapp/cms/skins/odf/stylesheets/head.xsl	(revision 37671)
+++ webapp/cms/skins/odf/stylesheets/head.xsl	(working copy)
@@ -177,7 +177,10 @@
 					    $j(".ametys-cms-service form").jqTransform(); 
 					});
    				</script>
-
+                
+                <!-- Cart -->
+                <script type="text/javascript" src="{ametys:pluginResourceURL('odf-web', 'js/org/helper/cart-helper.js')}"></script>
+                
    				<!-- History -->
    				<script type="text/javascript" src="{ametys:skinURL('js/history.js')}"></script>
 
Index: webapp/cms/skins/odf/stylesheets/main.xsl
===================================================================
--- webapp/cms/skins/odf/stylesheets/main.xsl	(revision 37480)
+++ webapp/cms/skins/odf/stylesheets/main.xsl	(working copy)
@@ -51,7 +51,9 @@
 				    <div class="cleared reset-box"></div>
 				<div class="art-nav">
 					<div class="art-nav-l"></div>
-					<div class="art-nav-r"></div>
+					<div class="art-nav-r">
+					</div>
+                    <xsl:call-template name="cart" />
 				<div class="art-nav-outer">
 				<div class="art-nav-wrapper">
 				<div class="art-nav-inner">
Index: webapp/cms/skins/odf/stylesheets/others.xsl
===================================================================
--- webapp/cms/skins/odf/stylesheets/others.xsl	(revision 37480)
+++ webapp/cms/skins/odf/stylesheets/others.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.
@@ -166,6 +166,72 @@
 	</xsl:template>
 	
 	<!-- + 
+         | CART
+         + -->
+    <xsl:template name="cart">
+        <xsl:variable name="cartPagesIds" select="ametys:findPagesIdsByTag('CART')"/>
+        
+        <xsl:if test="$cartPagesIds">
+            <script type="text/javascript">
+             document.writeln('&lt;div class=\"go-to-cart\"&gt;');
+		         <xsl:choose>
+		             <xsl:when test="$rendering-context = 'back'">
+		                   document.writeln("&lt;a class=\"go-to-cart-btn\" onclick=\"javascript:parent.org.ametys.uitool.ToolsManager.getInstance().openTool(\'uitool-page\', {id:'<xsl:value-of select="$cartPagesIds/@id"/>'});\"&gt;");
+		                   document.writeln("&lt;img  src=\"<xsl:value-of select="ametys:skinURL('img/content/cart/cart.png')"/>\" title=\"<i18n:text i18n:key="SKIN_CART" i18n:catalogue="skin.{$skin}"/>\" alt=\"<i18n:text i18n:key="SKIN_CART" i18n:catalogue="skin.{$skin}"/>\"/&gt;");
+		                   document.writeln("&lt;/a&gt;");
+		             </xsl:when>
+		             <xsl:otherwise>
+		                <xsl:variable name="pageURL" select="resolver:resolve('page', $cartPagesIds/@id, false)"/>
+		                   document.writeln('&lt;a class=\"go-to-cart-btn\" href=\"<xsl:value-of select="$pageURL"/>\"&gt;');
+		                   document.writeln("&lt;img  src=\"<xsl:value-of select="ametys:skinURL('img/content/cart/cart.png')"/>\" title=\"<i18n:text i18n:key="SKIN_CART" i18n:catalogue="skin.{$skin}"/>\" alt=\"<i18n:text i18n:key="SKIN_CART" i18n:catalogue="skin.{$skin}"/>\"/&gt;");
+		                   document.writeln("&lt;/a&gt;");
+		             </xsl:otherwise>
+		         </xsl:choose>
+		         
+		         var programsAmount = Object.keys(getPrograms()).length;
+		         var programsLabel;
+		         switch (programsAmount)
+		         {
+		           case 1: programsLabel = '<i18n:text i18n:key="SKIN_CART_PROGRAM" i18n:catalogue="skin.{$skin}"/>';
+		                    break;
+		           
+		           default: programsLabel = programsAmount + ' <i18n:text i18n:key="SKIN_CART_PROGRAMS" i18n:catalogue="skin.{$skin}"/>';
+		                     break;
+		         }
+		         
+		         var coursesAmount = Object.keys(getCourses()).length;
+		         var coursesLabel;
+	             switch (coursesAmount)
+	             {
+	               case 1: coursesLabel = '<i18n:text i18n:key="SKIN_CART_COURSE" i18n:catalogue="skin.{$skin}"/>';
+	                       break;	               
+	               default: coursesLabel =  coursesAmount + ' <i18n:text i18n:key="SKIN_CART_COURSES" i18n:catalogue="skin.{$skin}"/>';
+	                        break;
+	             }
+	         
+		         document.writeln('&lt;table class=\"go-to-cart-table\"&gt;');
+			         
+			         // Programs
+			         document.writeln('&lt;tr&gt;');
+			             document.writeln('&lt;td&gt;');
+	                        document.writeln(programsLabel);
+	                     document.writeln('&lt;/td&gt;');
+			         document.writeln('&lt;/tr&gt;');
+			         
+			         // Courses
+			         document.writeln('&lt;tr&gt;');
+	                     document.writeln('&lt;td&gt;');
+	                        document.writeln(coursesLabel);
+	                     document.writeln('&lt;/td&gt;');
+	                 document.writeln('&lt;/tr&gt;');
+	                 
+	             document.writeln('&lt;/table&gt;');
+	         document.writeln('&lt;/div&gt;');
+            </script>    
+        </xsl:if>
+    </xsl:template>
+	
+	<!-- + 
 	     | PRINT
 	     + -->
 	<xsl:template name="print">
