Index: main/plugin-survey/cms-ribbon.xml
===================================================================
--- main/plugin-survey/cms-ribbon.xml	(revision 34428)
+++ main/plugin-survey/cms-ribbon.xml	(working copy)
@@ -35,6 +35,7 @@
 	                    	<control id="org.ametys.survey.Redirection"/>
 	                    	<control id="org.ametys.survey.GrantedUsers"/>
 	                    </layout>
+                        <control id="org.ametys.survey.Schedule"/>
                     	<layout size="small" align="top">
 	                    	<control id="org.ametys.survey.Print"/>
 	                    </layout>
@@ -56,6 +57,7 @@
                             <control id="org.ametys.survey.GrantedUsers"/>
                         </layout>
                         <layout size="small" align="top">
+                            <control id="org.ametys.survey.Schedule"/>
                             <control id="org.ametys.survey.Print"/>
                         </layout>
                     </medium>
@@ -76,6 +78,7 @@
                             <control id="org.ametys.survey.GrantedUsers"/>
                         </layout>
                         <layout size="very-small" align="top">
+                            <control id="org.ametys.survey.Schedule"/>
                             <control id="org.ametys.survey.Print"/>
                         </layout>
                     </small>
Index: main/plugin-survey/i18n/messages_en.xml
===================================================================
--- main/plugin-survey/i18n/messages_en.xml	(revision 34428)
+++ main/plugin-survey/i18n/messages_en.xml	(working copy)
@@ -30,6 +30,8 @@
    	<message key="PLUGINS_SURVEY_RIGHTS_CATEGORY">Online surveys</message>
    	<message key="PLUGINS_SURVEY_RIGHTS_SERVICE_DISPLAY_LABEL">Online surveys</message>
    	<message key="PLUGINS_SURVEY_RIGHTS_SERVICE_DISPLAY_DESCRIPTION">Allow to add the service to display a survey</message>
+    <message key="PLUGINS_SURVEY_RIGHTS_SCHEDULE_LABEL">Schedule surveys</message>
+    <message key="PLUGINS_SURVEY_RIGHTS_SCHEDULE_DESCRIPTION">Allow to schedule the opening of surveys</message>
    	
    	<!-- Ribbon -->
    	<message key="PLUGINS_SURVEY_RIBBON_TAB_LABEL">Survey</message>
@@ -393,4 +395,48 @@
     <message key="PLUGINS_SURVEY_PRINT_SURVEY_DISABLED_DESC">This button is deactivated because no survey is currently open or because your rights are insufficient.</message>
     <message key="PLUGINS_SURVEY_PRINT_SURVEY_NOT_OPEN_DESC">This button is deactivated because no survey is currently open.</message>
     <message key="PLUGINS_SURVEY_PRINT_SURVEY_NO_SELECTION_DESC">This button is deactivated because no survey is currently selected.</message>
+    
+    <!-- +
+         | SCHEDULING 
+         + -->
+    <message key="SURVEY_SCHEDULE_OPENING_LABEL">Scheduled opening</message>
+    <message key="SURVEY_SCHEDULE_OPENING_DESCRIPTION">This button allows you to plan the opening of the survey.</message>
+    <message key="SURVEY_SCHEDULE_OPENING_REFRESHING">Please wait ... this button is unactivated while checking on server.</message>
+    <message key="SURVEY_SCHEDULE_OPENING_TOOMANYSURVEYS">Action is unavailable because several surveys are selected.&lt;br/&gt;Please select only one survey.</message>
+    <message key="SURVEY_SCHEDULE_OPENING_ERROR">This button is disabled.</message>
+    
+    <message key="SURVEY_SCHEDULED_DESCRIPTION_START">The survey </message>
+    <message key="SURVEY_SCHEDULED_DESCRIPTION">'{0}'</message>
+    <message key="SURVEY_SCHEDULED_DESCRIPTION_END"> is currently opened.</message>
+    
+    <message key="SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION_START">The survey </message>
+    <message key="SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION">'{0}'</message>
+    <message key="SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION_END"> is over.</message>
+    
+    <message key="SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION_START">The survey </message>
+    <message key="SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION">'{0}'</message>
+    <message key="SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION_END"> is not yet opened.</message>
+    
+    <message key="SURVEY_SCHEDULED_STARTDATE_DESCRIPTION_START">Start : </message>
+    <message key="SURVEY_SCHEDULED_STARTDATE_DESCRIPTION">{0}</message>
+    <message key="SURVEY_SCHEDULED_STARTDATE_DESCRIPTION_END"></message>
+    
+    <message key="SURVEY_SCHEDULED_ENDDATE_DESCRIPTION_START">End : </message>
+    <message key="SURVEY_SCHEDULED_ENDDATE_DESCRIPTION">{0}</message>
+    <message key="SURVEY_SCHEDULED_ENDDATE_DESCRIPTION_END"></message>
+    
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_TITLE">Schedule opening</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_OK_BTN">Ok</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_CANCEL_BTN">Cancel</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_HINT">Select the dates you want your survey to be opened and / or closed.&lt;br/&gt;Participation to the survey will be restricted to the dates selected.</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_START_DATE">Start</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_START_DATE_DESC">Start date of the survey</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_END_DATE">End</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_END_DATE_DESC">End date of the survey</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_ERROR">An error has occurred. Unable to schedule the opening.</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_INTERVAL_ERROR">The end date must be greater than the start date</message>
+    
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_TOOSOON">This survey has not started and will open the </message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_TOOLATE">This survey is over since </message>
+
 </catalogue>
Index: main/plugin-survey/i18n/messages_fr.xml
===================================================================
--- main/plugin-survey/i18n/messages_fr.xml	(revision 34428)
+++ main/plugin-survey/i18n/messages_fr.xml	(working copy)
@@ -30,7 +30,9 @@
    	<message key="PLUGINS_SURVEY_RIGHTS_CATEGORY">Enquêtes en lignes</message>
    	<message key="PLUGINS_SURVEY_RIGHTS_SERVICE_DISPLAY_LABEL">Enquête en ligne</message>
    	<message key="PLUGINS_SURVEY_RIGHTS_SERVICE_DISPLAY_DESCRIPTION">Autorise à ajouter le service d'affichage d'enquête en ligne à une page</message>
-   	
+    <message key="PLUGINS_SURVEY_RIGHTS_SCHEDULE_LABEL">Planifier l'enquête</message>
+    <message key="PLUGINS_SURVEY_RIGHTS_SCHEDULE_DESCRIPTION">Autorise à planifier l'ouverture d'une enquête en ligne</message>
+
    	<!-- Ribbon -->
    	<message key="PLUGINS_SURVEY_RIBBON_TAB_LABEL">Enquêtes en ligne</message>
    	<message key="PLUGINS_SURVEY_RIBBON_TAB_SHORTLABEL">Enquêtes</message>
@@ -392,4 +394,48 @@
 	<message key="PLUGINS_SURVEY_PRINT_SURVEY_DISABLED_DESC">Ce bouton est inactif car aucune enquête n'est actuellement ouverte ou que vos droits sont insuffisants.</message>
 	<message key="PLUGINS_SURVEY_PRINT_SURVEY_NOT_OPEN_DESC">Ce bouton est inactif car aucune enquête n'est actuellement ouverte.</message>
 	<message key="PLUGINS_SURVEY_PRINT_SURVEY_NO_SELECTION_DESC">Ce bouton est inactif car aucune enquête n'est actuellement sélectionnée.</message>
+    
+    <!-- +
+         | SCHEDULING 
+         + -->
+    <message key="SURVEY_SCHEDULE_OPENING_LABEL">Ouverture programmée</message>
+    <message key="SURVEY_SCHEDULE_OPENING_DESCRIPTION">Ce bouton permet de planifier l'ouverture de l'enquête en ligne.</message>
+    <message key="SURVEY_SCHEDULE_OPENING_REFRESHING">Veuillez patienter... Ce bouton est désactivé pendant que des vérifications sont en cours sur le serveur.</message>
+    <message key="SURVEY_SCHEDULE_OPENING_TOOMANYSURVEYS">Ce bouton est désactivé car plusieurs enquêtes en ligne sont actuellement sélectionnées.&lt;br/&gt;Veuillez ne sélectionner qu'une seule enquête pour continuer.</message>
+    <message key="SURVEY_SCHEDULE_OPENING_ERROR">Ce bouton est désactivé.</message>
+    
+    <message key="SURVEY_SCHEDULED_DESCRIPTION_START">L'enquête en ligne </message>
+    <message key="SURVEY_SCHEDULED_DESCRIPTION">'{0}'</message>
+    <message key="SURVEY_SCHEDULED_DESCRIPTION_END"> est actuellement ouverte.</message>
+    
+    <message key="SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION_START">L'enquête en ligne </message>
+    <message key="SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION">'{0}'</message>
+    <message key="SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION_END"> est close.</message>
+    
+    <message key="SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION_START">L'enquête en ligne </message>
+    <message key="SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION">'{0}'</message>
+    <message key="SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION_END"> n'est pas encore ouverte.</message>
+    
+    <message key="SURVEY_SCHEDULED_STARTDATE_DESCRIPTION_START">Début : </message>
+    <message key="SURVEY_SCHEDULED_STARTDATE_DESCRIPTION">{0}</message>
+    <message key="SURVEY_SCHEDULED_STARTDATE_DESCRIPTION_END"></message>
+    
+    <message key="SURVEY_SCHEDULED_ENDDATE_DESCRIPTION_START">Fin : </message>
+    <message key="SURVEY_SCHEDULED_ENDDATE_DESCRIPTION">{0}</message>
+    <message key="SURVEY_SCHEDULED_ENDDATE_DESCRIPTION_END"></message>
+    
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_TITLE">Ouverture programmée</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_OK_BTN">Ok</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_CANCEL_BTN">Annuler</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_HINT">Choisissez les dates auxquelles vous souhaitez que votre enquête en ligne soit ouverte.&lt;br/&gt;Les participation à l'enquête ne seront possible que sur la plage de dates choisie.</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_START_DATE">Début</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_START_DATE_DESC">Date de début de l'enquête</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_END_DATE">Fin</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_END_DATE_DESC">Date de fin de l'enquête</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_ERROR">Une erreur est survenue. Impossible de planifier l'enquête.</message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_INTERVAL_ERROR">La date de fin doit être supérieure à la date de début</message>
+    
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_TOOSOON">Cette enquête n'est pas commencée et ouvrira le </message>
+    <message key="PLUGINS_SURVEY_OPENING_SCHEDULE_TOOLATE">Cette enquête est close depuis le </message>
+
 </catalogue>
Index: main/plugin-survey/pages/services/display/display_1.0.xsl
===================================================================
--- main/plugin-survey/pages/services/display/display_1.0.xsl	(revision 34428)
+++ main/plugin-survey/pages/services/display/display_1.0.xsl	(working copy)
@@ -52,15 +52,30 @@
 	        </xsl:call-template>
 	    </xsl:variable>
 	    <xsl:variable name="is-title-visible" select="string-length($raw-is-title-visible) &gt; 0"/>
-    
-        <xsl:call-template name="view">
-        	<xsl:with-param name="level">
-	        	<xsl:choose>
-	    	        <xsl:when test="$is-title-visible">2</xsl:when>
-		            <xsl:otherwise>1</xsl:otherwise>
-		        </xsl:choose>
-        	</xsl:with-param>
-        </xsl:call-template>
+        
+        
+        <xsl:choose>
+            <xsl:when test="survey/@status = 'not-open' and survey/startDate">
+                <div>
+                    <i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_TOOSOON"/><i18n:date pattern="long" src-pattern="yyyy-MM-dd'T'HH:mm:ss"><xsl:value-of select="survey/startDate"/></i18n:date><xsl:text>.</xsl:text>
+                </div>
+            </xsl:when>
+            <xsl:when test="survey/@status = 'over' and survey/endDate">
+                <div>
+                    <i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_TOOLATE"/><i18n:date pattern="long" src-pattern="yyyy-MM-dd'T'HH:mm:ss"><xsl:value-of select="survey/endDate"/></i18n:date><xsl:text>.</xsl:text>
+                </div>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="view">
+                	<xsl:with-param name="level">
+        	        	<xsl:choose>
+        	    	        <xsl:when test="$is-title-visible">2</xsl:when>
+        		            <xsl:otherwise>1</xsl:otherwise>
+        		        </xsl:choose>
+                	</xsl:with-param>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
     </xsl:template>
     
 </xsl:stylesheet>
Index: main/plugin-survey/plugin.xml
===================================================================
--- main/plugin-survey/plugin.xml	(revision 34428)
+++ main/plugin-survey/plugin.xml	(working copy)
@@ -1059,4 +1059,73 @@
         </extensions>
     </feature>
     
+    <feature name="survey.scheduled-opening">
+        <extensions>
+            <extension point="org.ametys.runtime.plugins.core.right.RightsExtensionPoint"
+                       id="survey.rights.schedule">
+                <right id="Survey_Rights_Schedule">
+                    <label>PLUGINS_SURVEY_RIGHTS_SCHEDULE_LABEL</label>
+                    <description>PLUGINS_SURVEY_RIGHTS_SCHEDULE_DESCRIPTION</description>
+                    <category>PLUGINS_SURVEY_RIGHTS_CATEGORY</category>
+                </right>
+            </extension>
+            
+            <extension id="org.ametys.survey.Schedule"
+                       point="org.ametys.cms.workspace.ribbon.RibbonControlsManager" 
+                       class="org.ametys.plugins.survey.clientsideelement.ScheduledSurveyClientSideElement">
+                <action class="org.ametys.survey.control.ScheduledOpeningActionButton">
+                    <param name="action">org.ametys.survey.ScheduleOpening</param>
+                    
+                    <param name="label" i18n="true">SURVEY_SCHEDULE_OPENING_LABEL</param>
+                    <param name="default-description" i18n="true">SURVEY_SCHEDULE_OPENING_DESCRIPTION</param>
+                    <param name="refresh-description" i18n="true">SURVEY_SCHEDULE_OPENING_REFRESHING</param>
+                    <param name="multiselection-disabled-description" i18n="true">SURVEY_SCHEDULE_OPENING_TOOMANYSURVEYS</param>
+                    <param name="error-description" i18n="true">SURVEY_SCHEDULE_OPENING_ERROR</param>
+                    
+                    <param name="icon-small" file="true" plugin="web">img/publication/publication_16.png</param>
+                    <param name="icon-medium" file="true" plugin="web">img/publication/publication_32.png</param>
+                    <param name="icon-large" file="true" plugin="web">img/publication/publication_48.png</param>
+                    
+                    <param name="on-icon-small" file="true" plugin="web">img/publication/publication_on_16.png</param>
+                    <param name="on-icon-medium" file="true" plugin="web">img/publication/publication_on_32.png</param>
+                    <param name="on-icon-large" file="true" plugin="web">img/publication/publication_on_48.png</param>
+                    
+                    <param name="forthcoming-icon-small" file="true" plugin="web">img/publication/publication_fc_16.png</param>
+                    <param name="forthcoming-icon-medium" file="true" plugin="web">img/publication/publication_fc_32.png</param>
+                    <param name="forthcoming-icon-large" file="true" plugin="web">img/publication/publication_fc_48.png</param>
+                    
+                    <param name="outofdate-icon-small" file="true" plugin="web">img/publication/publication_ood_16.png</param>
+                    <param name="outofdate-icon-medium" file="true" plugin="web">img/publication/publication_ood_32.png</param>
+                    <param name="outofdate-icon-large" file="true" plugin="web">img/publication/publication_ood_48.png</param>
+                    
+                    <param name="scheduled-survey-valid-start-description" i18n="true">SURVEY_SCHEDULED_DESCRIPTION_START</param>
+                    <param name="scheduled-survey-valid-description" i18n="true">SURVEY_SCHEDULED_DESCRIPTION</param>
+                    <param name="scheduled-survey-valid-end-description" i18n="true">SURVEY_SCHEDULED_DESCRIPTION_END</param>
+                    
+                    <param name="scheduled-survey-outofdate-start-description" i18n="true">SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION_START</param>
+                    <param name="scheduled-survey-outofdate-description" i18n="true">SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION</param>
+                    <param name="scheduled-survey-outofdate-end-description" i18n="true">SURVEY_SCHEDULED_OUTOFDATE_DESCRIPTION_END</param>
+                    
+                    <param name="scheduled-survey-forthcoming-start-description" i18n="true">SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION_START</param>
+                    <param name="scheduled-survey-forthcoming-description" i18n="true">SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION</param>
+                    <param name="scheduled-survey-forthcoming-end-description" i18n="true">SURVEY_SCHEDULED_FORTHCOMING_DESCRIPTION_END</param>
+                    
+                    <param name="scheduled-survey-startdate-start-description" i18n="true">SURVEY_SCHEDULED_STARTDATE_DESCRIPTION_START</param>
+                    <param name="scheduled-survey-startdate-description" i18n="true">SURVEY_SCHEDULED_STARTDATE_DESCRIPTION</param>
+                    <param name="scheduled-survey-startdate-end-description" i18n="true">SURVEY_SCHEDULED_STARTDATE_DESCRIPTION_END</param>
+                    
+                    <param name="scheduled-survey-enddate-start-description" i18n="true">SURVEY_SCHEDULED_ENDDATE_DESCRIPTION_START</param>
+                    <param name="scheduled-survey-enddate-description" i18n="true">SURVEY_SCHEDULED_ENDDATE_DESCRIPTION</param>
+                    <param name="scheduled-survey-enddate-end-description" i18n="true">SURVEY_SCHEDULED_ENDDATE_DESCRIPTION_END</param>
+                </action>
+                <scripts>
+                    <file>js/org/ametys/survey/control/ScheduleOpeningActionButton.js</file>
+                    <file>js/org/ametys/survey/ScheduleOpening.i18n.js</file>
+                </scripts>
+                <right>Survey_Rights_Schedule</right>
+            </extension>
+        
+        </extensions>
+    </feature>
+    
 </plugin>
Index: main/plugin-survey/resources/js/org/ametys/survey/ScheduleOpening.i18n.js
===================================================================
--- main/plugin-survey/resources/js/org/ametys/survey/ScheduleOpening.i18n.js	(revision 0)
+++ main/plugin-survey/resources/js/org/ametys/survey/ScheduleOpening.i18n.js	(revision 0)
@@ -0,0 +1,193 @@
+/*
+ *  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.
+ */
+
+Ext.namespace('org.ametys.survey');
+
+org.ametys.survey.ScheduleOpening = function (controlId, controlConfiguration, controlPluginName)
+{
+    this._pluginName = controlPluginName;
+	var targets = org.ametys.ribbon.RibbonManager.getInstance().getCurrentSelectionTargets();
+	
+	var target = org.ametys.messagebus.message.MessageTargetHelper.findFirst(targets, function (target) { return target.getType() == 'survey';});
+	if (target == null)
+	{
+		return;
+	}
+	
+	org.ametys.survey.ScheduleOpening._targetSurveyId = target.getParameters().id;
+	
+	if (!org.ametys.survey.ScheduleOpening.delayedInitialize ())
+    {
+		return;
+    }
+	
+	org.ametys.survey.ScheduleOpening._initForm ();
+	
+	org.ametys.survey.ScheduleOpening._box.show();
+}
+
+/**
+ * @private
+ * The id of the current selected survey
+ */
+org.ametys.survey.ScheduleOpening._targetSurveyId;
+
+org.ametys.survey.ScheduleOpening.delayedInitialize = function ()
+{
+	if (org.ametys.survey.ScheduleOpening._initialized)
+    {
+		return true;
+    }
+	
+	// start date
+	org.ametys.survey.ScheduleOpening._startDateField = new org.ametys.form.DateField ({
+		fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_START_DATE"/>",
+        desc: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_START_DATE_DESC"/>",
+        name: 'startDate',
+        listeners: {'afterrender': function() { this.setWidth('auto'); this.setWidth(this.initialConfig.width); }},
+        width: 150
+	});
+	
+	// end date
+	org.ametys.survey.ScheduleOpening._endDateField = new org.ametys.form.DateField ({
+		fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_END_DATE"/>",
+        desc: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_END_DATE_DESC"/>",
+        name: 'endDate',
+        listeners: {'afterrender': function() { this.setWidth('auto'); this.setWidth(this.initialConfig.width); }},
+		width: 150
+	});
+	
+	org.ametys.survey.ScheduleOpening._box = new org.ametys.DialogBox ({
+		
+		title : "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_TITLE"/>",
+		icon : getPluginResourcesUrl('web') + "/img/publication/publication_16.png",
+		
+		width: 380,
+		height: 210,
+		autoScroll: true,
+		cls: 'text-dialog',
+
+		layout: 'form',
+		labelWidth :80,
+		
+		items : [ new org.ametys.HtmlContainer ({ html: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_HINT"/>", cls: 'dialog-text-hint'}),
+				  org.ametys.survey.ScheduleOpening._startDateField,
+				  org.ametys.survey.ScheduleOpening._endDateField
+		],
+		
+		defaultButton: org.ametys.survey.ScheduleOpening._startDateField,
+		closeAction: 'hide',
+		buttons : [{
+			text: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_OK_BTN"/>",
+			handler: org.ametys.survey.ScheduleOpening.ok
+		}, {
+			text: "<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_DIALOG_CANCEL_BTN"/>",
+			handler : org.ametys.survey.ScheduleOpening.cancel
+		} ]
+	});
+	
+	org.ametys.survey.ScheduleOpening._initialized = true;
+	
+	return true;
+}
+
+org.ametys.survey.ScheduleOpening._initForm = function ()
+{
+	var serverMessage = new org.ametys.servercomm.ServerMessage('survey', '/survey/scheduled-dates', {'id': org.ametys.survey.ScheduleOpening._targetSurveyId}, org.ametys.servercomm.ServerComm.PRIORITY_SYNCHRONOUS, null, this, null);
+	var response = org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
+	
+	if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_ERROR"/>", response, "org.ametys.survey.ScheduleOpening"))
+	{
+		return;
+	}
+	
+	var startDate = response.selectSingleNode('survey/start-date') != null ? response.selectSingleNode('survey/start-date')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
+	var endDate = response.selectSingleNode('survey/end-date') != null ? response.selectSingleNode('survey/end-date')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
+	
+	if (startDate != '')
+	{
+		org.ametys.survey.ScheduleOpening._startDateField.setValue(Date.parseDate (startDate, Date.patterns.ISO8601Long));
+	}
+	else
+	{
+		org.ametys.survey.ScheduleOpening._startDateField.setValue('');
+	}
+	
+	if (endDate != '')
+	{
+		org.ametys.survey.ScheduleOpening._endDateField.setValue(Date.parseDate (endDate, Date.patterns.ISO8601Long));
+	}
+	else
+	{
+		org.ametys.survey.ScheduleOpening._endDateField.setValue('');
+	}
+}
+
+org.ametys.survey.ScheduleOpening.ok = function()
+{
+	var params = org.ametys.survey.ScheduleOpening._getParams ();
+	if (params == null)
+	{
+		return;
+	}
+	
+	var serverMessage = new org.ametys.servercomm.ServerMessage("survey", 'survey/set-scheduled-dates', params, org.ametys.servercomm.ServerComm.PRIORITY_MAJOR, org.ametys.survey.ScheduleOpening._saveCallBack, this, params, "xml");
+	org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
+}
+
+org.ametys.survey.ScheduleOpening._saveCallBack = function (response, params)
+{
+	if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_ERROR"/>", response, "org.ametys.survey.ScheduleOpening"))
+	{
+		return;
+	}
+	
+	org.ametys.survey.ScheduleOpening._box.hide();
+	
+	var target = org.ametys.messagebus.bus.MessageBuilder.getInstance().createTarget("survey", {'id': params.id});
+	var event = org.ametys.messagebus.bus.MessageBuilder.getInstance().createMessage(org.ametys.ribbon.RibbonManager.EVENTTYPE_MINORMETADATACHANGED, null, [target]);
+	org.ametys.messagebus.MessageBus.getInstance().fireMessages([event]);
+}
+
+org.ametys.survey.ScheduleOpening._getParams = function()
+{
+	if (!org.ametys.survey.ScheduleOpening._startDateField.isValid() || !org.ametys.survey.ScheduleOpening._endDateField.isValid())
+	{
+		return null;
+	}
+	
+	var params = {};
+	params['id'] = org.ametys.survey.ScheduleOpening._targetSurveyId;
+	
+	var startDate = org.ametys.survey.ScheduleOpening._startDateField.getValue();
+	var endDate = org.ametys.survey.ScheduleOpening._endDateField.getValue();
+	
+	if (endDate != '' &amp;&amp; startDate != '' &amp;&amp; endDate.getTime() - startDate.getTime() &lt;= 0)
+	{
+		org.ametys.survey.ScheduleOpening._endDateField.markInvalid ("<i18n:text i18n:key="PLUGINS_SURVEY_OPENING_SCHEDULE_INTERVAL_ERROR"/>");
+		return;
+	}
+	
+	params[org.ametys.survey.ScheduleOpening._startDateField.getName()] = startDate != '' ? startDate.format (Date.patterns.ISO8601Long) : '';
+	params[org.ametys.survey.ScheduleOpening._endDateField.getName()] = endDate != '' ? endDate.format (Date.patterns.ISO8601Long) : '';
+	
+	return params;
+}
+
+org.ametys.survey.ScheduleOpening.cancel = function ()
+{
+	org.ametys.survey.ScheduleOpening._box.hide();
+}
Index: main/plugin-survey/resources/js/org/ametys/survey/control/ScheduleOpeningActionButton.js
===================================================================
--- main/plugin-survey/resources/js/org/ametys/survey/control/ScheduleOpeningActionButton.js	(revision 0)
+++ main/plugin-survey/resources/js/org/ametys/survey/control/ScheduleOpeningActionButton.js	(revision 0)
@@ -0,0 +1,258 @@
+/*
+ *  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.
+ */
+
+Ext.namespace('org.ametys.survey.control');
+
+org.ametys.survey.control.ScheduledOpeningActionButton = function(id, configuration, pluginName)
+{
+    org.ametys.survey.control.ScheduledOpeningActionButton.superclass.constructor.call(this, id, configuration, pluginName);
+}
+
+Ext.extend(org.ametys.survey.control.ScheduledOpeningActionButton, org.ametys.ribbon.control.button.ActionSelectionButton, {});
+
+/**
+ * @private
+ * @property {Map<String, String>} _lastParams The parameters received on the last refresh
+ */
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype._lastParams;
+
+/**
+ * @private
+ * @property {String[]} _currentSurveysId The surveys id currently selected or null. 
+ */
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype._currentSurveysId;
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype._doReload = function()
+{
+	if (this._currentSurveysId.length == 0)
+	{
+        var iconSmall = context.contextPath + this.getConfiguration()['icon-small'];
+        var iconLarge = context.contextPath + this.getConfiguration()['icon-medium'];
+		this.getElements().each(function(element) { 
+            element.setDisabled(true); 
+            element.toggle(false);
+            element.iconSmall = iconSmall;
+            element.iconLarge = iconLarge;
+            element.updateIcon();
+        });
+		this.updateTooltip(this.getConfiguration()["default-description"]);
+	}
+	else if (this._currentSurveysId.length == 1)
+	{
+		this.getElements().each(function(element) { element.setDisabled(true); element.refreshing(); });
+		this.updateTooltip(this.getConfiguration()["refresh-description"]);
+		org.ametys.ribbon.RibbonManager.getInstance().refreshElement('control', this, {targets: this._currentSurveysId});
+	}
+	else
+	{
+		this.getElements().each(function(element) { element.setDisabled(true); });
+		this.updateTooltip(this.getConfiguration()["multiselection-disabled-description"]);
+	}
+}
+
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype.onMessage = function (messages)
+{
+	// SELECTION
+	for (var i=messages.length - 1; i >= 0; i--)
+	{
+		if (messages[i].getType().getName() == org.ametys.ribbon.RibbonManager.EVENTTYPE_SELECTIONCHANGED)
+		{
+			var targets = messages[i].getTargets();
+			var allTargets = org.ametys.messagebus.message.MessageTargetHelper.findAll(targets, this.checkTarget());
+			var allTargetsId = this._convertToId(allTargets);
+			
+			// No survey selected
+			if (allTargets.length == 0)
+			{
+				this._currentSurveysId = [];
+				this._doReload();
+			}
+			// A single target selected 
+			else if (allTargets.length == 1)
+			{
+				if (this._currentSurveysId.length != 1 || allTargets[0] != this._currentSurveysId[0])
+				{
+					this._currentSurveysId = allTargetsId;
+					this._doReload();
+				}
+			}
+			// Too many surveys selected
+			else
+			{
+				this._currentSurveysId = [];
+				this._doReload();
+			}
+			
+			break;
+		}
+	}
+	
+	for (var i=messages.length - 1; i >= 0; i--)
+	{
+		if (messages[i].getType().getName() == org.ametys.ribbon.RibbonManager.EVENTTYPE_METADATACHANGED
+	        || messages[i].getType().getName() == org.ametys.ribbon.RibbonManager.EVENTTYPE_MINORMETADATACHANGED)
+		{
+			this._doReload();
+			break;
+		}
+	}
+}
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype._convertToId = function (targets)
+{
+	var targetsIds = [];
+	for (var i = 0; i < targets.length; i++)
+	{
+		targetsIds.push(targets[i].getParameters()['id']);
+	}
+	return targetsIds;
+}
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype.checkTarget = function ()
+{
+	return function (target) { return target.getType() == 'survey'; };
+}
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype._handlingMultiple = function(tooltip, paramPrefix, params)
+{
+	var count = parseInt(params[paramPrefix + "-size"]);
+	if (count > 0)
+	{
+		if (tooltip != "")
+		{
+			tooltip += "<br/><br/>";
+		}
+		
+		for (var i=0; i < count; i++)
+		{
+			if (i != 0) 
+			{
+				tooltip += "<br/>";
+			}
+			
+			tooltip += this.getConfiguration()[paramPrefix + "-start-description"];
+			tooltip += params[paramPrefix + "-" + i];
+			tooltip += this.getConfiguration()[paramPrefix + "-end-description"];
+			
+			if (params["scheduled-survey-startdate-" + i] != null)
+			{
+				tooltip += "<br/>";
+				tooltip += this.getConfiguration()["scheduled-survey-startdate-start-description"];
+				tooltip += params["scheduled-survey-startdate-" + i];
+				tooltip += this.getConfiguration()["scheduled-survey-startdate-end-description"];
+			}
+			
+			if (params["scheduled-survey-enddate-" + i] != null)
+			{
+				tooltip += "<br/>";
+				tooltip += this.getConfiguration()["scheduled-survey-enddate-start-description"];
+				tooltip += params["scheduled-survey-enddate-" + i];
+				tooltip += this.getConfiguration()["scheduled-survey-enddate-end-description"];
+			}
+			
+		}
+	}
+	
+	return tooltip;
+}
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype._getIcon = function(params)
+{
+	var nbScheduledSurveys = parseInt(params['scheduled-survey-size']);
+	var nbValidSurveys = parseInt(params['scheduled-survey-valid-size']);
+	var nbOutOfDateSurveys = parseInt(params['scheduled-survey-outofdate-size']);
+	var nbForthComingSurveys = parseInt(params['scheduled-survey-forthcoming-size']);
+	
+	if (nbScheduledSurveys > 0 && nbValidSurveys > 0)
+	{
+		var iconSmall = context.contextPath + this.getConfiguration()['on-icon-small'];
+		var iconLarge = context.contextPath + this.getConfiguration()['on-icon-medium'];
+		this.getElements().each(
+			function (element) 
+			{
+				element.iconSmall = iconSmall;
+				element.iconLarge = iconLarge;
+			}
+		);
+	}
+	
+	if (nbScheduledSurveys > 0 && nbForthComingSurveys > 0)
+	{
+		var iconSmall = context.contextPath + this.getConfiguration()['forthcoming-icon-small'];
+		var iconLarge = context.contextPath + this.getConfiguration()['forthcoming-icon-medium'];
+		this.getElements().each(
+			function (element) 
+			{
+				element.iconSmall = iconSmall;
+				element.iconLarge = iconLarge;
+			}
+		);
+	}
+	
+	if (nbScheduledSurveys > 0 && nbOutOfDateSurveys > 0)
+	{
+		var iconSmall = context.contextPath + this.getConfiguration()['outofdate-icon-small'];
+		var iconLarge = context.contextPath + this.getConfiguration()['outofdate-icon-medium'];
+		this.getElements().each(
+			function (element) 
+			{
+				element.iconSmall = iconSmall;
+				element.iconLarge = iconLarge;
+			}
+		);
+	}
+	
+	if (nbScheduledSurveys == 0)
+	{
+		var iconSmall = context.contextPath + this.getConfiguration()['icon-small'];
+		var iconLarge = context.contextPath + this.getConfiguration()['icon-medium'];
+		this.getElements().each(
+			function (element) 
+			{
+				element.iconSmall = iconSmall;
+				element.iconLarge = iconLarge;
+			}
+		);
+	}
+}
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype.configurationError = function(response)
+{
+	this.getElements().each(function(element) { element.stopRefreshing(); element.setDisabled(true); });
+	this.updateTooltip(this.getConfiguration()["default-description"]);
+}
+
+org.ametys.survey.control.ScheduledOpeningActionButton.prototype.configurationChanged = function(params)
+{
+	this.getElements().each(function(element) { element.stopRefreshing(); });
+	
+	var tooltip = this._handlingMultiple(this.getConfiguration()["default-description"], "scheduled-survey-valid", params);
+	tooltip = this._handlingMultiple(tooltip, "scheduled-survey-outofdate", params);
+	tooltip = this._handlingMultiple(tooltip, "scheduled-survey-forthcoming", params);
+	
+	// Icon
+	this._getIcon(params);
+	
+	this.getElements().each(function(element) { element.updateIcon(); });
+	this.updateTooltip(tooltip, this.getElements().get(0).iconLarge, null);
+	
+	var nbScheduledSurveys = parseInt(params['scheduled-survey-size']);
+	this.getElements().each(function(element) { element.toggle(nbScheduledSurveys > 0); });	
+    this.getElements().each(function(element) { element.stopRefreshing(); element.setDisabled(false); });
+
+	this._lastParams = params;
+}
Index: main/plugin-survey/sitemap.xmap
===================================================================
--- main/plugin-survey/sitemap.xmap	(revision 34428)
+++ main/plugin-survey/sitemap.xmap	(working copy)
@@ -30,6 +30,8 @@
             <map:generator name="sessions" src="org.ametys.plugins.survey.generators.SurveySessionsGenerator" logger="org.ametys.plugins.survey.generators.SurveySessionsGenerator"/>
             
             <map:generator name="survey-errors" src="org.ametys.plugins.survey.answer.SurveyErrorsGenerator" logger="org.ametys.plugins.survey.answer.SurveyErrorsGenerator"/>
+			
+			<map:generator name="survey-scheduled-dates" src="org.ametys.plugins.survey.generators.ScheduledDatesGenerator" logger="org.ametys.plugins.survey.generators.ScheduledDatesGenerator"/>
 		</map:generators>
 		
 		<map:actions>
@@ -69,6 +71,8 @@
             <map:action name="send-invitation-mail" src="org.ametys.plugins.survey.actions.SendInvitationMailAction" logger="org.ametys.plugins.survey.actions.SendInvitationMailAction"/>
             
             <map:action name="set-survey-header" src="org.ametys.plugins.survey.actions.SetSurveyHeaderAction" logger="org.ametys.plugins.survey.actions.SetSurveyHeaderAction"/>
+			
+			<map:action name="set-scheduled-dates" src="org.ametys.plugins.survey.actions.setSurveyScheduledDatesAction" logger="org.ametys.plugins.survey.actions.setSurveyScheduledDatesAction"/>
 		</map:actions>
         
         <map:serializers>
@@ -481,6 +485,18 @@
                     <map:serialize type="html-xls"/>
                 </map:act>
             </map:match>
+			
+			<map:match pattern="survey/scheduled-dates">
+				<map:generate type="survey-scheduled-dates"/>
+				<map:serialize type="xml"/>
+			</map:match>
+			
+			<map:match pattern="survey/set-scheduled-dates">
+				<map:act type="set-scheduled-dates">
+					<map:generate type="action-result"/>
+					<map:serialize type="xml"/>
+				</map:act>
+			</map:match>
         </map:pipeline>
 	</map:pipelines>
 </map:sitemap>
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/setSurveyScheduledDatesAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/setSurveyScheduledDatesAction.java	(revision 0)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/setSurveyScheduledDatesAction.java	(revision 0)
@@ -0,0 +1,59 @@
+/*
+ *  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.
+ */
+package org.ametys.plugins.survey.actions;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Redirector;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.SourceResolver;
+
+import org.ametys.cms.observation.AbstractNotifierAction;
+import org.ametys.cms.observation.Event;
+import org.ametys.plugins.survey.SurveyEvents;
+import org.ametys.plugins.survey.repository.Survey;
+import org.ametys.runtime.util.parameter.ParameterHelper;
+import org.ametys.runtime.util.parameter.ParameterHelper.ParameterType;
+
+/**
+ * Action for setting the survey scheduled dates
+ */
+public class setSurveyScheduledDatesAction extends AbstractNotifierAction
+{
+    @Override
+    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
+    {
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        String id = request.getParameter("id");
+        
+        Survey survey = _resolver.resolveById(id);
+        
+        String startDate = parameters.getParameter("startDate", request.getParameter("startDate"));
+        String endDate = parameters.getParameter("endDate", request.getParameter("endDate"));
+        
+        survey.setStartDate((Date) ParameterHelper.castValue(startDate, ParameterType.DATE));
+        survey.setEndDate((Date) ParameterHelper.castValue(endDate, ParameterType.DATE));
+        
+        survey.saveChanges();
+        
+        _observationManager.notify(new Event(_getCurrentUser(), SurveyEvents.SURVEY_MODIFIED, survey));
+
+        return EMPTY_MAP;
+    }
+}
Index: main/plugin-survey/src/org/ametys/plugins/survey/clientsideelement/ScheduledSurveyClientSideElement.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/clientsideelement/ScheduledSurveyClientSideElement.java	(revision 0)
+++ main/plugin-survey/src/org/ametys/plugins/survey/clientsideelement/ScheduledSurveyClientSideElement.java	(revision 0)
@@ -0,0 +1,156 @@
+/*
+ *  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.
+ */
+
+package org.ametys.plugins.survey.clientsideelement;
+
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.i18n.I18nUtils;
+
+import org.ametys.plugins.repository.AmetysObjectResolver;
+import org.ametys.plugins.survey.repository.Survey;
+import org.ametys.runtime.ui.impl.StaticContextualClientSideElement;
+import org.ametys.runtime.util.I18nizableText;
+
+/**
+ * ClientSideElement for the Scheduled Survey
+ */
+public class ScheduledSurveyClientSideElement extends StaticContextualClientSideElement implements Contextualizable
+{
+
+    private AmetysObjectResolver _resolver;
+    private Context _context;
+
+    @Override
+    public void service(ServiceManager smanager) throws ServiceException
+    {
+        super.service(smanager);
+        _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE);
+    }
+    
+    @Override
+    public void contextualize(Context context) throws ContextException
+    {
+        _context = context;
+    }
+    
+    @Override
+    public Map<String, I18nizableText> getCurrentParameters(Map<String, Object> parameters)
+    {
+        Map<String, I18nizableText> params = new HashMap<String, I18nizableText>();
+        
+        int scheduledSurveysCount = 0;
+        int validSurveysCount = 0;
+        int oodSurveysCount = 0;
+        int fcSurveysCount = 0;
+        
+        List<String> surveysId = (List<String>) parameters.get("targets");
+        for (String surveyId : surveysId)
+        {
+            Survey survey = _resolver.resolveById(surveyId);
+            
+            Calendar now = new GregorianCalendar();
+            now.set(Calendar.HOUR_OF_DAY, 0);
+            now.set(Calendar.MINUTE, 0);
+            now.set(Calendar.SECOND, 0);
+            now.set(Calendar.MILLISECOND, 0);
+            
+            Date startDate = survey.getStartDate();
+            Date endDate = survey.getEndDate();
+            
+            boolean isScheduled = startDate != null || endDate != null;
+            if (isScheduled)
+            {
+                List<String> scheduledSurveyI18nParameters = new ArrayList<String>();
+                scheduledSurveyI18nParameters.add(survey.getTitle());
+
+                Map objectModel = ContextHelper.getObjectModel(_context);
+                Locale locale = I18nUtils.findLocale(objectModel, "locale", null, Locale.getDefault(), true);
+                
+                if (startDate != null)
+                {
+                    DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, locale);
+                    List<String> startDateI18nParameters = new ArrayList<String>();
+                    startDateI18nParameters.add(df.format(startDate));
+                    
+                    I18nizableText ed = this._initialParameters.get("scheduled-survey-startdate-description");
+                    I18nizableText msg = new I18nizableText(ed.getCatalogue(), ed.getKey(), startDateI18nParameters);
+                    
+                    params.put("scheduled-survey-startdate-"  + scheduledSurveysCount, msg);
+                }
+                
+                if (endDate != null)
+                {
+                    DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, locale);
+                    List<String> endDateI18nParameters = new ArrayList<String>();
+                    endDateI18nParameters.add(df.format(endDate));
+                    
+                    I18nizableText ed = this._initialParameters.get("scheduled-survey-enddate-description");
+                    I18nizableText msg = new I18nizableText(ed.getCatalogue(), ed.getKey(), endDateI18nParameters);
+                    
+                    params.put("scheduled-survey-enddate-"  + scheduledSurveysCount, msg);
+                }
+                
+                if ((startDate == null || startDate.before(now.getTime())) && (endDate == null || endDate.after(now.getTime())))
+                {
+                    I18nizableText ed = this._initialParameters.get("scheduled-survey-valid-description");
+                    I18nizableText msg = new I18nizableText(ed.getCatalogue(), ed.getKey(), scheduledSurveyI18nParameters);
+                    
+                    params.put("scheduled-survey-valid-"  + scheduledSurveysCount, msg);
+                    validSurveysCount++;
+                }
+                else if (endDate != null && endDate.before(now.getTime()))
+                {
+                    I18nizableText ed = this._initialParameters.get("scheduled-survey-outofdate-description");
+                    I18nizableText msg = new I18nizableText(ed.getCatalogue(), ed.getKey(), scheduledSurveyI18nParameters);
+                    
+                    params.put("scheduled-survey-outofdate-"  + scheduledSurveysCount, msg);
+                    oodSurveysCount++;
+                }
+                else if (startDate != null && startDate.after(now.getTime()))
+                {
+                    I18nizableText ed = this._initialParameters.get("scheduled-survey-forthcoming-description");
+                    I18nizableText msg = new I18nizableText(ed.getCatalogue(), ed.getKey(), scheduledSurveyI18nParameters);
+                    
+                    params.put("scheduled-survey-forthcoming-"  + scheduledSurveysCount, msg);
+                    fcSurveysCount++;
+                }
+                scheduledSurveysCount++;
+            }
+        }
+        
+        params.put("scheduled-survey-size", new I18nizableText(Integer.toString(scheduledSurveysCount)));
+        params.put("scheduled-survey-valid-size", new I18nizableText(Integer.toString(validSurveysCount)));
+        params.put("scheduled-survey-outofdate-size", new I18nizableText(Integer.toString(oodSurveysCount)));
+        params.put("scheduled-survey-forthcoming-size", new I18nizableText(Integer.toString(fcSurveysCount)));
+        
+        return params;
+    }
+}
Index: main/plugin-survey/src/org/ametys/plugins/survey/generators/ScheduledDatesGenerator.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/generators/ScheduledDatesGenerator.java	(revision 0)
+++ main/plugin-survey/src/org/ametys/plugins/survey/generators/ScheduledDatesGenerator.java	(revision 0)
@@ -0,0 +1,81 @@
+/*
+ *  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.
+ */
+package org.ametys.plugins.survey.generators;
+
+import java.io.IOException;
+import java.util.Date;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.generation.ServiceableGenerator;
+import org.apache.cocoon.xml.XMLUtils;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import org.ametys.plugins.repository.AmetysObjectResolver;
+import org.ametys.plugins.survey.repository.Survey;
+import org.ametys.runtime.util.parameter.ParameterHelper;
+
+/**
+ * SAX the publication dates
+ */
+public class ScheduledDatesGenerator extends ServiceableGenerator
+{
+    private AmetysObjectResolver _resolver;
+
+    @Override
+    public void service(ServiceManager serviceManager) throws ServiceException
+    {
+        super.service(serviceManager);
+        _resolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE);
+    }
+
+    @Override
+    public void generate() throws IOException, SAXException, ProcessingException
+    {
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        String id = request.getParameter("id");
+        
+        Survey survey = _resolver.resolveById(id);
+        
+        contentHandler.startDocument();
+        
+        AttributesImpl attr = new AttributesImpl();
+        attr.addAttribute("", "id", "id", "CDATA", id);
+        XMLUtils.startElement(contentHandler, "survey", attr);
+        
+        Date startDate = survey.getStartDate();
+        if (startDate != null)
+        {
+            XMLUtils.createElement(contentHandler, "start-date", ParameterHelper.valueToString(startDate));
+        }
+        
+        Date endDate = survey.getEndDate();
+        if (endDate != null)
+        {
+            XMLUtils.createElement(contentHandler, "end-date", ParameterHelper.valueToString(endDate));
+        }
+        
+        XMLUtils.endElement(contentHandler, "survey");
+        contentHandler.endDocument();
+
+    }
+
+
+}
Index: main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveyGenerator.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveyGenerator.java	(revision 34428)
+++ main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveyGenerator.java	(working copy)
@@ -16,6 +16,9 @@
 package org.ametys.plugins.survey.generators;
 
 import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
 
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
@@ -31,6 +34,7 @@
 import org.ametys.plugins.survey.repository.Survey;
 import org.ametys.plugins.survey.repository.SurveyPage;
 import org.ametys.runtime.user.CurrentUserProvider;
+import org.ametys.runtime.util.parameter.ParameterHelper;
 
 /**
  * SAX surveys
@@ -63,16 +67,48 @@
         
         Survey survey = _resolver.resolveById(id);
         
+        Calendar now = new GregorianCalendar();
+        now.set(Calendar.HOUR_OF_DAY, 0);
+        now.set(Calendar.MINUTE, 0);
+        now.set(Calendar.SECOND, 0);
+        now.set(Calendar.MILLISECOND, 0);
+        
+        Date startDate = survey.getStartDate();
+        Date endDate = survey.getEndDate();
+        
         AttributesImpl attrs = new AttributesImpl();
         attrs.addCDATAAttribute("id", survey.getId());
         attrs.addCDATAAttribute("name", survey.getName());
         attrs.addCDATAAttribute("private", String.valueOf(survey.isPrivate()));
         attrs.addCDATAAttribute("validated", String.valueOf(survey.isValidated()));
         
+        if (startDate != null && startDate.after(now.getTime()))
+        {
+            attrs.addCDATAAttribute("status", "not-open");
+        }
+        else if (endDate != null && endDate.before(now.getTime()))
+        {
+            attrs.addCDATAAttribute("status", "over");
+        }
+        else
+        {
+            attrs.addCDATAAttribute("status", "open");
+        }
+        
         XMLUtils.startElement(contentHandler, "survey", attrs);
+        
         XMLUtils.createElement(contentHandler, "title", survey.getTitle());
         XMLUtils.createElement(contentHandler, "label", survey.getLabel());
         
+        if (startDate != null)
+        {
+            XMLUtils.createElement(contentHandler, "startDate", ParameterHelper.valueToString(startDate));
+        }
+        if (endDate != null)
+        {
+            XMLUtils.createElement(contentHandler, "endDate", ParameterHelper.valueToString(endDate));
+        }
+        
         String description = survey.getDescription();
         if (description != null)
         {
Index: main/plugin-survey/src/org/ametys/plugins/survey/repository/Survey.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/repository/Survey.java	(revision 34428)
+++ main/plugin-survey/src/org/ametys/plugins/survey/repository/Survey.java	(working copy)
@@ -60,6 +60,10 @@
     private static final String __METADATA_VALIDATION_DATE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":validationDate";
     /** Constants for private metadata. */
     private static final String __METADATA_REDIRECTION = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":redirection";
+    /** Constants for start date metadata. */
+    private static final String __METADATA_START_DATE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":startDate";
+    /** Constants for end date metadata. */
+    private static final String __METADATA_END_DATE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":endDate";
     /** Constants for granted users metadata. */
     private static final String __GRANTED_USERS = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":grantedUsers";
     /** Constants for granted users metadata. */
@@ -353,6 +357,102 @@
     }
     
     /**
+     * Set the start date
+     * @param date The start date
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setStartDate(Date date) throws AmetysRepositoryException
+    {
+        try
+        {
+            if (date != null)
+            {
+                GregorianCalendar calendar = new GregorianCalendar();
+                calendar.setTime(date);
+                
+                getNode().setProperty(__METADATA_START_DATE, calendar);
+            }
+            else if (getNode().hasProperty(__METADATA_START_DATE))
+            {
+                getNode().getProperty(__METADATA_START_DATE).remove();
+            }
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Unable to set start date", e);
+        }
+    }
+    
+    /**
+     * Get the start date
+     * @return the start date
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public Date getStartDate () throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_START_DATE).getDate().getTime();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Unable to get start date property", e);
+        }
+    }
+    
+    /**
+     * Set the end date
+     * @param date The end date
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setEndDate(Date date) throws AmetysRepositoryException
+    {
+        try
+        {
+            if (date != null)
+            {
+                GregorianCalendar calendar = new GregorianCalendar();
+                calendar.setTime(date);
+                
+                getNode().setProperty(__METADATA_END_DATE, calendar);
+            }
+            else if (getNode().hasProperty(__METADATA_END_DATE))
+            {
+                getNode().getProperty(__METADATA_END_DATE).remove();
+            }
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Unable to set end date", e);
+        }
+    }
+
+    /**
+     * Get the end date
+     * @return the end date
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public Date getEndDate () throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_END_DATE).getDate().getTime();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Unable to get end date property", e);
+        }
+    }
+
+    /**
      * Retrieves the redirection.
      * @return the page id of redirection or null.
      * @throws AmetysRepositoryException if an error occurs.
