Index: main/plugin-explorer/i18n/messages_en.xml
===================================================================
--- main/plugin-explorer/i18n/messages_en.xml	(revision 37352)
+++ main/plugin-explorer/i18n/messages_en.xml	(working copy)
@@ -104,8 +104,14 @@
     <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_CREATED">Created the</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_MODIFIED">Last modification the</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT">at</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_1">from</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_2">From</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_THE">The</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_TO">to</message>
     
-	<!-- Format -->
+    <!-- Format -->
+    <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_TOOLTIP_FULL_DAY">m/d/Y</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_TOOLTIP_HOUR">H:i a</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_FULL_DAY">l F j Y</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_MEDIUM_DAY">j M Y</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_DAY_AND_MONTH_DAY">j M</message>
Index: main/plugin-explorer/i18n/messages_fr.xml
===================================================================
--- main/plugin-explorer/i18n/messages_fr.xml	(revision 37352)
+++ main/plugin-explorer/i18n/messages_fr.xml	(working copy)
@@ -104,8 +104,14 @@
     <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_CREATED">Crée le</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_MODIFIED">Dernière modification le</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT">à</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_1">de</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_2">Du</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_THE">Le</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_TO">au</message>
     
     <!-- Format -->
+    <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_TOOLTIP_FULL_DAY">d/m/y</message>
+    <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_TOOLTIP_HOUR">H:i</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_FULL_DAY">l j F Y</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_MEDIUM_DAY">j M Y</message>
     <message key="PLUGINS_EXPLORER_CALENDAR_FORMAT_DAY_AND_MONTH_DAY">j M</message>
Index: main/plugin-explorer/resources/css/calendar-ametys.css
===================================================================
--- main/plugin-explorer/resources/css/calendar-ametys.css	(revision 37352)
+++ main/plugin-explorer/resources/css/calendar-ametys.css	(working copy)
@@ -34,3 +34,9 @@
     margin-right: 4px;
     display: inline-block;
 }
+
+.tooltip-event-title
+{
+    font-weight: bold;
+}
+
Index: main/plugin-explorer/resources/js/org/ametys/explorer/applications/calendar/CalendarApplication.i18n.js
===================================================================
--- main/plugin-explorer/resources/js/org/ametys/explorer/applications/calendar/CalendarApplication.i18n.js	(revision 37352)
+++ main/plugin-explorer/resources/js/org/ametys/explorer/applications/calendar/CalendarApplication.i18n.js	(working copy)
@@ -68,53 +68,30 @@
 	                		}
 	                	}
 	                	
-	                	var dateCreator = Date.parseDate(record.selectSingleNode("creationDate")[org.ametys.servercomm.ServerComm.xmlTextContent], Date.patterns.ISO8601Long);
-	                	var formatDay = "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_FORMAT_FULL_DAY"/>";
-	                	var formatHour = "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_FORMAT_LINK_HOUR"/>";
-	                	
-                		tooltip = "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_CREATED"/> " + dateCreator.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + dateCreator.format(formatHour);
-	                	
-                		var creator = record.selectSingleNode("creator");
-                		if (creator.hasChildNodes())
-                		{
-                			tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + record.selectSingleNode("creator/user/firstname")[org.ametys.servercomm.ServerComm.xmlTextContent] + " " + record.selectSingleNode("creator/user/lastname")[org.ametys.servercomm.ServerComm.xmlTextContent] + " (" + record.selectSingleNode("creator").getAttribute("login") + ")";
-                		}
-                		else
-            			{
-                			tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + record.selectSingleNode("creator").getAttribute("login");
-            			}
-                		
-                		var modification = record.selectSingleNode("lastModified");
-	                	if (modification != null)
-	                	{
-	                		var dateContributor = Date.parseDate(modification[org.ametys.servercomm.ServerComm.xmlTextContent], Date.patterns.ISO8601Long);
-	                		tooltip += "&lt;br/&gt;&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_MODIFIED"/> " + dateContributor.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + dateContributor.format(formatHour);
-		                	
-	                		var contributor = record.selectSingleNode("contributor");
-                    		if (contributor.hasChildNodes())
-                			{
-                    			tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + record.selectSingleNode("contributor/user/firstname")[org.ametys.servercomm.ServerComm.xmlTextContent] + " " + record.selectSingleNode("contributor/user/lastname")[org.ametys.servercomm.ServerComm.xmlTextContent] + " (" + record.selectSingleNode("contributor").getAttribute("login") + ")";
-                			}
-                    		else
-                			{
-                    			tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + record.selectSingleNode("contributor").getAttribute("login");
-                			}
-            			}
-	                	
+	                	var titleConverted = "";
 	                	if (!noWorkflow)
 	                	{	var imgPath = context.contextPath + record.selectSingleNode("icon-small-workflow")[org.ametys.servercomm.ServerComm.xmlTextContent];
-	                		var text = "&lt;span ext:qtip='" + tooltip + "' class='calendar-event-icon-workflow-state'&gt;&lt;span style='background-image: url(" + imgPath + ");' &gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='calendar-event-icon-workflow-state-placeholder'&gt;&lt;/span&gt;";
-	                		return text + "&lt;span ext:qtip='" + tooltip + "' &gt;" + v + "&lt;/span&gt;";
+	                		var text = "&lt;span class='calendar-event-icon-workflow-state'&gt;&lt;span style='background-image: url(" + imgPath + ");' &gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='calendar-event-icon-workflow-state-placeholder'&gt;&lt;/span&gt;";
+	                		titleConverted = text + "&lt;span &gt;" + v + "&lt;/span&gt;";
 	                	}
 	                	else
 	                	{
-	                		return "&lt;span ext:qtip='" + tooltip + "' &gt;" + v + "&lt;/span&gt;";
+	                		titleConverted = "&lt;span &gt;" + v + "&lt;/span&gt;";
 	                	}
 	                	
+	                	return titleConverted;
                 	}
                 },
             	{name:'StartDate', mapping: 'startDate', type: 'date', dateFormat: Date.patterns.ISO8601Long},
                 {name:'EndDate', mapping: 'endDate', type: 'date', dateFormat: Date.patterns.ISO8601Long},
+                {name:'CreationDate', mapping: 'creationDate', type: 'date', dateFormat: Date.patterns.ISO8601Long},
+                {name:'LastModified', mapping: 'lastModified', type: 'date', dateFormat: Date.patterns.ISO8601Long},
+                {name:'CreatorFirstname', mapping: 'creator/user/firstname'},
+                {name:'CreatorLastname', mapping: 'creator/user/lastname'},
+                {name:'CreatorLogin', mapping: 'creator/@login'},
+                {name:'ContributorFirstname', mapping: 'contributor/user/firstname'},
+                {name:'ContributorLastname', mapping: 'contributor/user/lastname'},
+                {name:'ContributorLogin', mapping: 'contributor/@login'},
                 {name:'Notes', mapping: 'desc'},
                 {name:'CalendarId', mapping: '@color'},
                 {name:'TrueCalendarId', mapping: '@calendarId'},
@@ -454,6 +431,33 @@
             },
             'eventsrendered': {
             	fn: function() {
+            		//Add Tooltip
+            		var eventCount = this._xmlStore.getCount();
+            		for (var j=0; j &lt; eventCount; j++)
+            		{
+            			var record = this._xmlStore.getAt(j);
+            			
+            			var els;
+            			if (typeof(this._calendar.getActiveView().getEventEls) == "function")
+            			{
+            				els = this._calendar.getActiveView().getEventEls(record.get("EventId"));
+            			}
+            			else
+            			{
+            				els = this._calendar.getActiveView().header.getEventEls(record.get("EventId"));
+            				if (els.getCount() == 0)
+            				{
+            					els = this._calendar.getActiveView().body.getEventEls(record.get("EventId"));
+            				}
+            			}
+            			
+            			var tooltip = this.createEventTooltip(record);
+            			Ext.each(els, function(el) {
+            				el.set({"ext:qtip": tooltip});
+            			});
+            		}
+            		
+            		//Update selected events
         			var selectedEventIds = this.getSelectedRecordIds();
         			for (var i=0; i &lt; selectedEventIds.length; i++)
 	        	    {
@@ -560,6 +564,91 @@
     return this._calendar;
 };
 
+
+org.ametys.explorer.applications.calendar.CalendarApplication.prototype.createEventTooltip = function(record)
+{
+	var dateCreator = record.get("CreationDate");
+	var formatDay = "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_FORMAT_TOOLTIP_FULL_DAY"/>";
+	var formatHour = "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_FORMAT_TOOLTIP_HOUR"/>";
+	
+	var title = record.get("Title");
+	var tooltip = '&lt;span class="tooltip-event-title" &gt;' + title + '&lt;/span&gt;';
+	
+	tooltip += "&lt;br/&gt;";
+	var startDate = record.get("StartDate");
+	var endDate = record.get("EndDate");
+	
+	var fullDay = record.get("IsAllDay");
+	if (fullDay)
+	{
+		if (startDate.format(formatDay) == endDate.format(formatDay))
+		{
+			tooltip += "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_THE"/> " + startDate.format(formatDay);
+		}
+		else
+		{
+			tooltip += "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_2"/> " + startDate.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_TO"/> " + endDate.format(formatDay);
+		}
+	}
+	else
+	{
+		if (startDate.format(formatDay) == endDate.format(formatDay))
+		{
+			tooltip += "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_THE"/> " + startDate.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_1"/> " + startDate.format(formatHour) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + endDate.format(formatHour);
+		}
+		else
+		{
+			tooltip += "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_FROM_2"/> " + startDate.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + startDate.format(formatHour) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_TO"/> " + endDate.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + endDate.format(formatHour);
+		}
+	}
+	
+	var creatorFirstname = record.get("CreatorFirstname");
+	var creatorLastname = record.get("CreatorLastname");
+	var creatorLogin = record.get("CreatorLogin");
+	if (creatorFirstname != "" &amp;&amp; creatorLastname != "")
+	{
+		tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + creatorFirstname + " " + creatorLastname + " (" + creatorLogin + ")";
+	}
+	else
+	{
+		tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + creatorLogin;
+	}
+	
+	var desc = record.get("Notes");
+	if (desc != "")
+	{
+		tooltip += "&lt;br/&gt;&lt;br/&gt;";
+
+		var find = '\n';
+		var regExp = new RegExp(find, 'g');
+		desc = desc.replace(regExp, '&lt;br/&gt;');
+		tooltip += desc;
+	}
+	
+	tooltip += "&lt;br/&gt;&lt;br/&gt;";
+	tooltip += "<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_CREATED"/> " + dateCreator.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + dateCreator.format(formatHour);
+	
+	var lastModification = record.get("LastModified");
+	if (lastModification != null)
+	{
+		tooltip += "&lt;br/&gt;&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_MODIFIED"/> " + lastModification.format(formatDay) + " <i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_AT"/> " + lastModification.format(formatHour);
+    	
+		var contributorFirstname = record.get("ContributorFirstname");
+		var contributorLastname = record.get("ContributorLastname");
+		var contributorLogin = record.get("ContributorLogin");
+		if (contributorFirstname != "" &amp;&amp; contributorLastname != "")
+		{
+			tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + contributorFirstname + " " + contributorLastname + " (" + contributorLogin + ")";
+		}
+		else
+		{
+			tooltip += "&lt;br/&gt;<i18n:text i18n:key="PLUGINS_EXPLORER_CALENDAR_TOOLTIP_EVENT_BY"/> " + contributorLogin;
+		}
+	}
+	
+	return tooltip;
+}
+
 org.ametys.explorer.applications.calendar.CalendarApplication.prototype.refresh = function (node) 
 {
 	this._selectedNode = node;
