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 33240)
+++ main/plugin-explorer/resources/js/org/ametys/explorer/applications/calendar/CalendarApplication.i18n.js	(working copy)
@@ -73,25 +73,44 @@
 	                	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);
-	                	tooltip += "\n<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") + ")";
-	                	var modification = record.selectSingleNode("lastModified");
+	                	
+                		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 += "\n\n<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);
-		                	tooltip += "\n<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") + ")";
-	                	}
+	                		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");
+                			}
+            			}
 	                	
 	                	if (!noWorkflow)
 	                	{	var imgPath = context.contextPath + record.selectSingleNode("icon-small-workflow")[org.ametys.servercomm.ServerComm.xmlTextContent];
-	                		var text = "&lt;span title='" + 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 title='" + tooltip + "' &gt;" + v + "&lt;/span&gt;";
+	                		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;";
 	                	}
 	                	else
 	                	{
-	                		return "&lt;span title='" + tooltip + "' &gt;" + v + "&lt;/span&gt;";
+	                		return "&lt;span ext:qtip='" + tooltip + "' &gt;" + v + "&lt;/span&gt;";
 	                	}
+	                	
                 	}
                 },
             	{name:'StartDate', mapping: 'startDate', type: 'date', dateFormat: Date.patterns.ISO8601Long},
