Index: main/plugin-web/i18n/messages_en.xml
===================================================================
--- main/plugin-web/i18n/messages_en.xml	(revision 27131)
+++ main/plugin-web/i18n/messages_en.xml	(working copy)
@@ -1452,7 +1452,14 @@
 	<message key="FRONT_MODULE_SEARCH_ALL_WORDS">All the words</message>
 	<message key="FRONT_MODULE_SEARCH_EXACT_PHRASE">Exact wording or phrase</message>
 	<message key="FRONT_MODULE_SEARCH_ANY_WORDS">Any of the words</message>
-
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_DATE_FROM">From</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_DATE_TO">To</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_END">Search on a date interval (end date)</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_END_DESC">Choose a typed date metadata to offer to the visitor a research on a time interval.&lt;br/&gt;If 'None' is chosen for the begin date, the visitor couldn't make a search by date.</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_BEGIN">Search on a date interval (begin date)</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_BEGIN_DESC">Choose a typed date metadata to offer to the visitor a research on a time interval.&lt;br/&gt;If 'None' is chosen, le visiteur ne pourra pas faire de recherche par date.</message>
+	<message key="PLUGINS_WEB_LAST_MODIFICATION_DATE">Last modification date</message>
+	
 	<!-- FRONT SEARCH CRITERIA Service -->
 	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_CRITERIA_LABEL">Search criteria</message>	
 	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_CRITERIA_DESCRIPTION">The service displays search criteria for visitors that redirect to another page with the 'Search engine' service</message>
Index: main/plugin-web/i18n/messages_fr.xml
===================================================================
--- main/plugin-web/i18n/messages_fr.xml	(revision 27131)
+++ main/plugin-web/i18n/messages_fr.xml	(working copy)
@@ -1453,6 +1453,13 @@
 	<message key="FRONT_MODULE_SEARCH_ALL_WORDS">Tous les mots</message>
 	<message key="FRONT_MODULE_SEARCH_EXACT_PHRASE">Expression exacte</message>
 	<message key="FRONT_MODULE_SEARCH_ANY_WORDS">Aucun des mots</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_DATE_FROM">Du</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_DATE_TO">Au</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_END">Recherche sur un intervalle de date (date de fin)</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_END_DESC">Sélectionner une métadonnée de type date pour offrir au visiteur une recherche sur un intervalle de temps.&lt;br/&gt;Si 'Aucune' est choisi pour la date de début, le visiteur ne pourra pas faire de recherche par date.</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_BEGIN">Recherche sur un intervalle de date (date de début)</message>
+	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_BEGIN_DESC">Sélectionner une métadonnée de type date pour offrir au visiteur une recherche sur un intervalle de temps.&lt;br/&gt;Si 'Aucune' est choisi, le visiteur ne pourra pas faire de recherche par date.</message>
+	<message key="PLUGINS_WEB_LAST_MODIFICATION_DATE">Date de dernière modification</message>
 	
 	<!-- FRONT SEARCH CRITERIA Service -->
 	<message key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_CRITERIA_LABEL">Critères de recherche</message>	
Index: main/plugin-web/plugin.xml
===================================================================
--- main/plugin-web/plugin.xml	(revision 27131)
+++ main/plugin-web/plugin.xml	(working copy)
@@ -2871,7 +2871,8 @@
 					   class="org.ametys.web.clientsideelement.TagClientSideElement">
 				<action class="org.ametys.ribbon.control.button.SmartTagButton">
 					<param name="action">org.ametys.web.tag.Tag.affect</param>
-
+                    <param name="target-type">^content$</param>
+                    
 					<param name="label" i18n="true">PLUGINS_WEB_UITOOL_TAG_LABEL</param>
 					<param name="default-description" i18n="true">PLUGINS_WEB_UITOOL_TAG_DESCRIPTION</param>
 					<param name="footer" i18n="true">PLUGINS_WEB_UITOOL_TAG_FOOTER</param>
@@ -3948,7 +3949,7 @@
                             <enumeration>
                                 <custom-enumerator class="org.ametys.web.frontoffice.ContentTypesForSearchEnumerator"/>
                             </enumeration>
-                            <widget>sorted-multiselect</widget>
+                            <widget>content-types</widget>
                         </parameter>
                         <parameter name="search-by-content-types-choice" type="string" multiple="false">
                             <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE</label>
@@ -3977,10 +3978,30 @@
                             </enumeration>
                             <default-value>none</default-value>
                         </parameter>
+                        <parameter name="search-by-common-date-begin" type="string" multiple="false">
+                            <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_BEGIN</label>
+                            <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_BEGIN_DESC</description>
+                            <widget>typed-metadata</widget>
+                            <widget-params>
+                                <param name="metadataSetName">index</param>
+                                <param name="metadataType">DATE</param>
+                            </widget-params>
+                        </parameter>
+                         <parameter name="search-by-common-date-end" type="string" multiple="false">
+                            <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_END</label>
+                            <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_CONTENTTYPE_CHOICE_DATE_END_DESC</description>
+                            <widget>typed-metadata</widget>
+                            <widget-params>
+                                <param name="metadataSetName">index</param>
+                                <param name="metadataType">DATE</param>
+                            </widget-params>
+                        </parameter>
                         <parameter name="advanced-search" type="boolean">
                             <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_ADVANCED_SEARCH</label>
                             <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_ADVANCED_SEARCH_DESC</description>
                         </parameter>
+                    </group>
+                    <group>
                         <parameter name="search-by-pages" type="string" multiple="true">
                             <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_SECTION</label>
                             <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_SECTION_DESC</description>
@@ -3991,10 +4012,10 @@
                             <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_BY_TAG_CATEGORY_DESC</description>
                             <widget>content-tags</widget>
                             <widget-params>
-                            	<param name="allowProviders">true</param>
+                                <param name="allowProviders">true</param>
                                 <param name="onlyTagsWithChildren">true</param>
                             </widget-params>
-                        </parameter>
+                        </parameter>  
                         <parameter name="strict-search-on-tags" type="boolean">
                             <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_STRICT_SEARCH_ON_TAGS</label>
                             <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_STRICT_SEARCH_ON_TAGS_DESC</description>
@@ -4003,8 +4024,6 @@
                             <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_ON_ALL_SITES</label>
                             <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_ON_ALL_SITES_DESC</description>
                         </parameter>
-                    </group>
-                    <group>
                         <parameter name="search-mode" type="string">
                             <label i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_MODE</label>
                             <description i18n="true">PLUGINS_WEB_SERVICE_FRONT_SEARCH_MODE_DESC</description>
@@ -4065,7 +4084,7 @@
                             </enumeration>
                         </parameter>
                     </group>
-				</parameters>
+                </parameters>
 			</extension>
 		</extensions>
 	</feature>
Index: main/plugin-web/sitemap-front.xmap
===================================================================
--- main/plugin-web/sitemap-front.xmap	(revision 27131)
+++ main/plugin-web/sitemap-front.xmap	(working copy)
@@ -281,6 +281,8 @@
 					<map:parameter name="search-by-pages" value="{parent-context-attr:search-by-pages}"/>
 					<map:parameter name="search-multisite" value="{parent-context-attr:search-multisite}"/>
                     <map:parameter name="service-group-id" value="{parent-context-attr:service-group-id}"/>
+                    <map:parameter name="startDate" value="{parent-context-attr:search-by-common-date-begin}"/>
+                    <map:parameter name="endDate" value="{parent-context-attr:search-by-common-date-end}"/>
 				</map:generate>
 				<map:transform type="i18n" label="xml">
 					<map:parameter name="locale" value="{request-attr:sitemapLanguage}"/>
Index: main/plugin-web/pages/services/search/search-criteria/search-criteria_3.3.xsl
===================================================================
--- main/plugin-web/pages/services/search/search-criteria/search-criteria_3.3.xsl	(revision 27131)
+++ main/plugin-web/pages/services/search/search-criteria/search-criteria_3.3.xsl	(working copy)
@@ -171,13 +171,53 @@
            <!-- Multisite -->
            <xsl:call-template name="form-search-element-multisite"/>
            
+           <!-- Dates -->
+           <xsl:call-template name="form-search-element-dates"/>
+           
            <!-- Template common for submit button -->
            <xsl:call-template name="common-utils-input-submit">
                <xsl:with-param name="class-name">search</xsl:with-param>
                <xsl:with-param name="i18nkey" select="'plugin.web:FRONT_MODULE_SEARCH_BUTTON_OK'" />                                
            </xsl:call-template>
+                      
 	</xsl:template>
 		
+	<!-- Dates -->
+	<xsl:template name="form-search-element-dates">
+		<xsl:if test="/search/form/fields/dates = 'true'">
+			<div class="field">
+				<div class="label"><label for="startDate"><i18n:text i18n:key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_DATE_FROM" i18n:catalogue="plugin.web"/></label></div>
+				<div class="input">
+					<input id="startDate-{$uniqueId}" type="text" name="startDate" maxlength="10">
+						<xsl:if test="/search/form/values/startDate"><xsl:attribute name="value"><xsl:value-of select="/search/form/values/startDate"/></xsl:attribute></xsl:if>
+					</input>
+				</div>
+				<div class="field-end"></div>
+			</div>
+			<div class="field">
+				<div class="label"><label for="endDate"><i18n:text i18n:key="PLUGINS_WEB_SERVICE_FRONT_SEARCH_DATE_TO" i18n:catalogue="plugin.web"/></label></div>
+				<div class="input">
+					<input id="endDate-{$uniqueId}" type="text" name="endDate" maxlength="10">
+						<xsl:if test="/search/form/values/endDate"><xsl:attribute name="value"><xsl:value-of select="/search/form/values/endDate"/></xsl:attribute></xsl:if>
+					</input>
+				</div>
+				<div class="field-end"></div>
+			</div>
+			<script type="text/javascript">
+				$j(document).ready(function () 
+				{
+					var idStart = "startDate-"+"<xsl:value-of select="$uniqueId"/>";
+					var idEnd = "endDate-"+"<xsl:value-of select="$uniqueId"/>";
+					
+					var opt = { dateFormat: 'dd/mm/yy', altFormat: 'dd/mm/yy'};
+					
+					$j('#'+idStart).datepicker(opt);
+					$j('#'+idEnd).datepicker(opt);
+				});
+			</script>
+		</xsl:if>
+	</xsl:template>	
+		
     <!-- Keywords -->
     <xsl:template name="form-search-element-keywords">
         <div class="field">
Index: main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java
===================================================================
--- main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java	(revision 27131)
+++ main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java	(working copy)
@@ -16,8 +16,10 @@
 package org.ametys.web.frontoffice;
 
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.util.BitSet;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -29,6 +31,7 @@
 import org.apache.cocoon.xml.AttributesImpl;
 import org.apache.cocoon.xml.XMLUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.lucene.document.DateTools;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.queryParser.MultiFieldQueryParser;
@@ -43,6 +46,7 @@
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.SortField;
 import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.TermRangeQuery;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.TopFieldCollector;
 import org.apache.lucene.search.WildcardQuery;
@@ -179,7 +183,8 @@
         _addContentTypeQuery(query, request);
         _addTagsQuery(query, request);
         _addPagesQuery(query, request);
-        
+        _addDateQuery(query, request);
+
         return query;
     }
     
@@ -202,10 +207,87 @@
         _addContentTypeQuery(query, cType);
         _addTagsQuery(query, request);
         _addPagesQuery(query, request);
+        _addDateQuery(query, request);
         
         return query;
     }
     
+    private void _addDateQuery(BooleanQuery query, Request request)
+    {
+        String startDateId = parameters.getParameter("startDate", "");
+        String endDateId = parameters.getParameter("endDate", "");
+        
+        String endDate = request.getParameter("endDate");
+        String startDate = request.getParameter("startDate");
+
+        // We check if startDate < endDate. If not, we swap.
+        if (StringUtils.isNotEmpty(endDate) && StringUtils.isNotEmpty(startDate))
+        {                
+            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
+
+            try
+            {
+                Date dateS = format.parse(startDate);
+                Date dateE = format.parse(endDate);
+                
+                if (dateS.compareTo(dateE) > 0) 
+                {
+                    String dateAux = startDate;
+                    startDate = endDate;
+                    endDate = dateAux;
+                }
+            }
+            catch (java.text.ParseException e)
+            {
+                getLogger().error(e.getMessage());
+            }
+        }
+        
+        if (StringUtils.isNotEmpty(endDate))
+        {
+            String endDateFormat = _toDateFormat(endDate);
+            if (endDateFormat != null)
+            {
+                query.add(new TermRangeQuery(startDateId, null, endDateFormat, false, true), BooleanClause.Occur.MUST);
+            }
+        }
+        
+        if (StringUtils.isNotEmpty(startDate))
+        {
+            String startDateFormat = _toDateFormat(startDate);
+            if (startDateFormat != null)
+            {
+                // Two cases are possible :
+                // An event could have an end date (query 1)
+                // If not, the start date is also the end date (query 2)
+                BooleanQuery endDateQuery = new BooleanQuery();
+               
+                if (!endDateId.equals(""))
+                {
+                    endDateQuery.add(new TermRangeQuery(endDateId, startDateFormat, null, true, false), BooleanClause.Occur.SHOULD);
+                }
+                endDateQuery.add(new TermRangeQuery(startDateId, startDateFormat, null, true, false), BooleanClause.Occur.SHOULD);
+                
+                query.add(endDateQuery, BooleanClause.Occur.MUST);
+            }
+        }
+    }
+    
+    private String _toDateFormat(String date)
+    {
+        try
+        {
+            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
+            Date dateD = sdf.parse(date);
+            return DateTools.dateToString(dateD, DateTools.Resolution.DAY);
+        }
+        catch (java.text.ParseException e)
+        {
+            getLogger().warn("Format de date invalide.");
+        }
+        return null;
+    }
+    
     @Override
     protected String[] getFields ()
     {
@@ -310,6 +392,13 @@
             }
             XMLUtils.endElement(contentHandler, "sites");
         }
+        
+        String startDate = parameters.getParameter("startDate", "");
+        
+        if (!startDate.equals(""))
+        {
+            XMLUtils.createElement(contentHandler, "dates", "true");
+        }
     }
     
     @Override
@@ -323,6 +412,48 @@
         _saxTags(request);
         _saxPages(request);
         _saxMultisite(request);
+        _saxDates(request);
+    }
+    
+    private void _saxDates(Request request) throws SAXException
+    {
+        String startDate = request.getParameter("startDate");
+        String endDate = request.getParameter("endDate");
+        if (startDate != null && !startDate.equals(""))
+        { 
+            if (endDate != null && !endDate.equals(""))
+            { 
+                SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
+
+                try
+                {
+                    Date dateS = format.parse(startDate);
+                    Date dateE = format.parse(endDate);
+                    
+                    if (dateS.compareTo(dateE) <= 0) 
+                    {
+                        XMLUtils.createElement(contentHandler, "endDate", endDate);
+                        XMLUtils.createElement(contentHandler, "startDate", startDate);
+                    }
+                    else
+                    {
+                        XMLUtils.createElement(contentHandler, "endDate", startDate);
+                        XMLUtils.createElement(contentHandler, "startDate", endDate);
+                    }
+                }
+                catch (java.text.ParseException e)
+                {
+                    getLogger().error(e.getMessage());
+                }
+            }     
+        }
+        else
+        {
+            if (endDate != null && !endDate.equals(""))
+            {
+                XMLUtils.createElement(contentHandler, "endDate", endDate);
+            }
+        }
     }
     
     private void _saxTextField(Request request) throws SAXException
