solr_search_results.html

 1   <#setting url_escaping_charset="UTF-8">
 2   <#if conf_user_query??>
 3   <#assign conf_query = "&conf=${conf_user_query}">
 4   <#else>
 5   <#assign conf_query = "">
 6   </#if>
 7   <#-- Encode facet queries -->
 8   <#macro EncodeFQ list_fq optionalParam="" optionalParamDate=false >
 9   <#assign encoded_facets_queries = "">
 10   <#list list_fq as facet>
 11           <#assign facet_url = facet?url>
 12           <#if !optionalParam?has_content>
 13                   <#assign encoded_facets_queries = encoded_facets_queries+"&fq="+facet_url>
 14           <#else>
 15                   <#if optionalParam != facet_url && optionalParamDate == false>
 16                           <#assign encoded_facets_queries = encoded_facets_queries+"&fq="+facet_url>
 17                   </#if>
 18                   <#if optionalParam != facet_url?url && optionalParamDate== true >
 19                           <#assign encoded_facets_queries = encoded_facets_queries+"&fq="+facet_url>
 20                   </#if>
 21           </#if>
 22   </#list>
 23   ${encoded_facets_queries}
 24   </#macro>
 25   <#macro CreateFilterUrl facets_list sh facet query count name="" >
 26   	<#assign filter_name = count.name>
 27   	<#if name!="">
 28   		<#assign filter_name = name>
 29   	</#if>
 30   	<#if sh?has_content>
 31   		<li>
 32   			<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}<@EncodeFQ facets_list sh?url />${conf_query}">
 33   				<i class="fa fa-check-square fa-fw"></i>
 34   				${filter_name}
 35   				<span class="label label-primary">${count.count}</span>
 36   			</a>
 37   		</li>
 38   	<#else>
 39   		<#if count.count &gt; 0>
 40   		<li>
 41   			<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}&facetlabel=${count.name}&facetname=${facet.name}&fq=${facet.name}:${count.name?url}<@EncodeFQ facets_list />${conf_query}">
 42   				<i class="fa fa-square-o fa-fw"></i>	
 43   				${filter_name}
 44   				<span class="label label-primary">${count.count}</span>
 45   			</a>
 46   		</li>	
 47   		</#if>
 48   	</#if>
 49   </#macro>
 50   
 51   <#if conf.extraMappingQuery>
 52     <script type="text/javascript">
 53         var loadresource = document.createElement('link');
 54         loadresource.setAttribute("rel", "stylesheet");
 55         loadresource.setAttribute("type", "text/css");
 56         loadresource.setAttribute("href", "js/plugins/leaflet/leaflet/leaflet.css");
 57         document.getElementsByTagName("head")[0].appendChild(loadresource);
 58         loadresource = document.createElement('link');
 59         loadresource.setAttribute("rel", "stylesheet");
 60         loadresource.setAttribute("type", "text/css");
 61         loadresource.setAttribute("href", "js/plugins/leaflet/leaflet/MarkerCluster.css");
 62         document.getElementsByTagName("head")[0].appendChild(loadresource);
 63         loadresource = document.createElement('link');
 64         loadresource.setAttribute("rel", "stylesheet");
 65         loadresource.setAttribute("type", "text/css");
 66         loadresource.setAttribute("href", "js/plugins/leaflet/leaflet/MarkerCluster.Default.css");
 67         document.getElementsByTagName("head")[0].appendChild(loadresource);
 68     </script>
 69     <script src = "js/plugins/leaflet/leaflet/leaflet.js"></script>
 70     <script src="js/plugins/leaflet/leaflet/leaflet.markercluster.js"></script>
 71     <script type="text/javascript">
 72     $(window).load(function () {
 73           var map = L.map('map').setView([48.85632, 2.33272], 12);
 74           var points = [
 75               <#list points as point>
 76               {
 77                   "type": "${point.type}",
 78                   "code": "${point.code}",
 79                   "id": "${point.id}",
 80                   "geojson": ${point.geojson}
 81               }<#if point_has_next>,</#if>
 82               </#list>
 83           ];
 84           // create the tile layer with correct attribution
 85           var osmUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
 86           var osmAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
 87           var osm = new L.TileLayer(osmUrl, {minZoom: 8, maxZoom: 16, attribution: osmAttrib}).addTo(map);
 88           var marker_clusters = {};
 89           var marker_icons = {};
 90           //Workardound https://github.com/Leaflet/Leaflet/issues/3696
 91           var defaultIcon = L.Icon.extend({
 92               options: {
 93                   iconSize: [25, 41],
 94                   iconAnchor: [12, 41],
 95                   popupAnchor: [1, -34],
 96                   shadowSize: [41, 41],
 97                   shadowUrl: L.Icon.Default.imagePath + '/marker-shadow.png'
 98               }
 99           });
 100           var greenIcon = new defaultIcon({
 101               iconUrl: L.Icon.Default.imagePath + '/marker-icon-green.png',
 102               iconRetinaUrl: L.Icon.Default.imagePath + '/marker-icon-green-2x.png',
 103           });
 104           var yellowIcon = new defaultIcon({
 105                iconUrl: L.Icon.Default.imagePath + '/marker-icon-yellow.png',
 106                iconRetinaUrl: L.Icon.Default.imagePath + '/marker-icon-yellow-2x.png'
 107           });
 108           var redIcon = new defaultIcon({
 109               iconUrl: L.Icon.Default.imagePath + '/marker-icon-red.png',
 110               iconRetinaUrl: L.Icon.Default.imagePath + '/marker-icon-red-2x.png'
 111           });
 112           var createGreenCluster = function (cluster) {
 113               var childCount = cluster.getChildCount();
 114               return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', className: 'marker-cluster marker-cluster-small', iconSize: new L.Point(40, 40) });
 115           };
 116           var createYellowCluster = function (cluster) {
 117               var childCount = cluster.getChildCount();
 118               return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', className: 'marker-cluster marker-cluster-medium', iconSize: new L.Point(40, 40) });
 119           };
 120           var createRedCluster = function (cluster) {
 121               var childCount = cluster.getChildCount();
 122               return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', className: 'marker-cluster marker-cluster-large', iconSize: new L.Point(40, 40) });
 123           };
 124           for (var i = 0; i < points.length; i++) {
 125               var markers = undefined;
 126               var icon = undefined;
 127               var layer = "";
 128               var popupContent = undefined;
 129               var properties = points[i]["geojson"]["properties"];
 130               if (typeof(properties) != 'undefined') {
 131                   layer = properties["layer"];
 132               }
 133               if (!layer) {
 134                   layer = points[i]["code"];
 135               }
 136               if (typeof(marker_clusters[layer]) != "undefined") {
 137                   markers = marker_clusters[layer];
 138                   icon    = marker_icons[layer];
 139               } else {
 140                   if (typeof(properties) != 'undefined' && typeof(properties["icon"]) != 'undefined') {
 141                       var clusterIconCreateFunction = undefined;
 142                       if (properties["icon"] == 'red' ) {
 143                           icon = redIcon;
 144                           clusterIconCreateFunction = createRedCluster;
 145                       } else if (properties["icon"] == 'green' ) {
 146                           icon = greenIcon;
 147                           clusterIconCreateFunction = createGreenCluster;
 148                       } else if (properties["icon"] == 'yellow' ) {
 149                           icon = yellowIcon;
 150                           clusterIconCreateFunction = createYellowCluster;
 151                       }
 152                       if (typeof(clusterIconCreateFunction) != 'undefined') {
 153                           markers = new L.MarkerClusterGroup({
 154                               iconCreateFunction: clusterIconCreateFunction
 155                           });
 156                       }
 157                   }
 158                   if (typeof(icon) == 'undefined') {
 159                       markers = new L.MarkerClusterGroup();
 160                       icon = new L.Icon.Default();
 161                   }
 162                   marker_clusters[layer] = markers;
 163                   marker_icons[layer] = icon;
 164               }
 165               var marker = L.marker([points[i]["geojson"]["geometry"]["coordinates"][1],points[i]["geojson"]["geometry"]["coordinates"][0]] ,{icon: icon});
 166               if ( (typeof(properties) != 'undefined') && (typeof(properties["popupContent"]) != 'undefined') ) {
 167                   if (properties["popupContent"]) {
 168                       marker.bindPopup(properties["popupContent"])
 169                   }
 170               } else {
 171                   popupContent = "<p>Loading " + points[i]["type"] + " " + points[i]["id"] + " " + points[i]["code"] + "...</p>";
 172                   marker.bindPopup(popupContent)
 173                   marker.on('click', (function(point) {
 174                       return function(e) {
 175                           var properties = point["properties"];
 176                           var popup = e.target.getPopup();
 177                           var url;
 178                           if ( (typeof(properties) != 'undefined') && (typeof(properties["popupAjax"]) != 'undefined') ) {
 179                               url = properties["popupAjax"];
 180                           } else {
 181                               url = "rest/leaflet/popup/" + point["type"] + "/" + point["id"] + "/" + point["code"];
 182                           }
 183        
 184                           $.get(url).done(function(data) {
 185                               popup.setContent(data);
 186                               popup.update();
 187                           }).fail(function() {
 188                               map.closePopup();
 189                           });
 190                       };
 191                   })(points[i]));
 192               }
 193               markers.addLayer(marker);
 194           }
 195           for (var markers in marker_clusters) {
 196               if (marker_clusters.hasOwnProperty(markers)) {
 197                   map.addLayer(marker_clusters[markers]);
 198               }
 199           }
 200         var baseMaps = {
 201             "osm": osm
 202         };
 203         var overlayMaps = marker_clusters;
 204         // paramétrage et ajout du L.control.layers à la carte
 205         L.control.layers(baseMaps, overlayMaps).addTo(map);
 206     });
 207     </script>
 208   </#if>
 209   <
 210   <div id="solr-form-section">
 211    <div class="row">
 212   	<div class="col-xs-12 col-sm-12">
 213   		<ol class="breadcrumb">
 214   			<li>
 215   				<a target="_top" href="">Accueil</a>
 216   			</li>
 217   			<li>
 218   				<a target="_top" href="jsp/site/Portal.jsp?page=search-solr">Recherche</a>
 219   			</li>
 220   			<li>
 221   				<span class="last-path">#i18n{portal.search.search_results.title}</span>
 222   			</li>
 223   		</ol>
 224   		<h2>#i18n{portal.search.search_results.title}</h2>
 225   		<div id="resultForm" class="row">
 226   		<div class="col-xs-12 col-sm-12">
 227   			<form id="search" name="search" class="form" method="post" action="${fullUrl}">
 228   				<input type="hidden" name="page" value="search-solr">
 229   				<#if conf_user_query??>
 230   					<input type="hidden" name="conf" value="${conf_user_query}">
 231   				</#if>
 232   				<input type="hidden" name="sort_name" value="${sort_name!}">
 233   				<input type="hidden" name="sort_order" value="${sort_order!}">
 234   				<#if facets_list??>
 235   					<#list facets_list as facet>
 236   						<input type="hidden" name="fq" id="${facet[0..3]}" data-type="${facet[0..3]}" data-val="${facet[5..]}" value="${facet}">
 237   					</#list>
 238   				</#if>
 239   				<div class="form-group">
 240   					<label for="" class="sr-only">Recherche</label>
 241   					<div class="input-group">
 242   						<input type="text" name="query" class="form-control" placeholder="Rechercher" value="${query?if_exists}" id="solr"> 
 243   						<span class="input-group-btn">
 244   							<button type="submit" class="btn btn-primary btn-lg" title=" #i18n{portal.search.search_results.buttonSearch}">
 245   								<i class="fa fa-search"></i>
 246   							</button>
 247   						</span>	
 248   						<#if conf.extraMappingQuery>
 249   							<div id="map" style="height: 400px; width: 100%"></div>
 250   						</#if>
 251   					</div>
 252   				</div>
 253   				<#-- spellChecker -->
 254   			<#if suggestion?has_content>
 255   				<div id="spellchecker" class="form-group">
 256   					<p class="lead">
 257   						<#list suggestion as sugg>
 258   							<#assign newQuery="" >
 259   							<span class="text-gray">#i18n{search.solr.display.result.spellchecker}</span> <a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&query=${sugg.getCollationQueryString()?url}<@EncodeFQ  facets_list  />${conf_query}">${sugg.getCollationQueryString()}</a>
 260   						</#list>
 261   					</p>	
 262   				</div>
 263   			</#if>
 264   			</form>
 265   			<#if error?has_content>
 266   				<div class="row">
 267   					<div class="col-xs-12 col-sm-offset-2 col-sm-6">
 268   						<div class="alert alert-danger">${error}</div>
 269   					</div>	
 270   				</div>	
 271   			</#if>
 272   			<div class="row">
 273   				<div class="col-xs-12 col-sm-6">
 274   					<h3 id="item-count">Il y a  <span>${paginator.itemsCount} résultats </span> pour la recherche  ${query?if_exists}</h3>
 275   				</div>	
 276   				<div class="col-xs-12 col-sm-6">	
 277   					<#if sort_list??>
 278   						<h3 id="tri" class="text-right">
 279   						Trier par pertinence
 280   						<#list sort_list as field>
 281   							<#if field.enableSort>
 282   								<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&query=${query?url}<@EncodeFQ  facets_list />&sort_name=${field.solrName}&sort_order=desc${conf_query}" title="${field.label} desc">
 283   									<i class="fa fa-chevron-down"></i>
 284   								</a>
 285   								<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&query=${query?url}<@EncodeFQ  facets_list />&sort_name=${field.solrName}&sort_order=asc${conf_query}" title="${field.label} asc">
 286   									<i class="fa fa-chevron-up"></i>
 287   								</a>
 288   							</#if>
 289   						</#list>
 290   						</h3>
 291   					</#if>
 292   				</div>
 293   			</div>
 294   			<div class="row">
 295   				<div class="col-xs-12 col-sm-3">
 296   					<label for="from" class="sr-only">De</label>
 297   					<div class="input-group">
 298   						<span class="input-group-addon">De</span>
 299   						<input type="text" class="form-control" id="from" name="from">
 300   					</div>	
 301   				</div>	
 302   				<div class="col-xs-12 col-sm-3">
 303   					<label for="to" class="sr-only"> &agrave; </label>
 304   					<div class="input-group">
 305   						<span class="input-group-addon"> &agrave;</span>
 306   						<input type="text" class="form-control" id="to" name="to">
 307   					</div>
 308   				</div>
 309   			</div>
 310   			<#if historique??>
 311   				<#assign  fl=historique?size>
 312   				<#if fl &gt; 0>
 313   					<div id="filters" class="row">
 314   						<div class="col-xs-12 col-sm-12">
 315   						<h5>Filtre<#if fl &gt; 1>s</#if> actif<#if fl &gt; 1>s</#if> :</h5>
 316   						<#list historique as fh>
 317   							<a id="a-${fh.name[0..3]}" data-type="${fh.name[5..]}" class="btn btn-primary" href="${fullUrl}?page=search-solr&query=${query?url}${fh.query}" class="btn btn-primary">
 318   								<#if fh.name[0..3]='date'>
 319                                       <#assign toDate = "${fh.name[6..26]}"?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")>
 320                                       <#assign toString = "${toDate?string('yyyy')}">
 321                                       <#assign nowString = "${.now?string('yyyy')}">
 322                                       <#if toString = nowString>
 323                                           <#assign toMonth = "${toDate?string('MMMM')}">
 324                                           ${toMonth} ${toString}
 325                                       <#else>
 326                                           ${toString}
 327                                       </#if>
 328                                       
 329   								<#else>	
 330   									${fh.name[5..]} 
 331   								</#if> <i class="fa fa-remove fa-fw"></i>
 332   							</a>
 333   						</#list>
 334   						</div>
 335   					</div>
 336   				</#if>
 337   			</#if>
 338   			<#-- Historique -->
 339   			<p id="historique" class="text-right">
 340   				<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}${conf_query}">
 341   					Rénitialiser
 342   				</a>
 343   			</p>
 344   		</div>
 345   	</div>
 346   	<#-- results -->
 347   	<div id="resultList">
 348   		<div class="row">
 349   			<#-- facet refining -->
 350   			<div id="facets" class="col-xs-12 col-sm-4">
 351   			<#-- facets field -->
 352   			<#if facets??><#-- empty or null when no connection to server -->
 353   				<#assign i=0>
 354   				<#list facets as facet>
 355   					<#assign i=i+1>
 356   					
 357   					<#if facet.values?? >
 358   						<#assign ftype=solr_fields[facet.name].label>
 359   						<#-- when there is no result, facet is not null, but facet.values is -->
 360   						<div class="panel-group" id="accordion-${i}" role="tablist" aria-multiselectable="true">
 361   							<div class="panel panel-default">
 362   								<div class="panel-heading" role="tab" id="heading-${i}">
 363   									<a role="button" data-toggle="collapse" data-parent="#accordion-${i}" href="#collapse-${i}" aria-expanded="true" aria-controls="collapse">
 364   									<h4 class="panel-title">
 365   										<i class="fa fa-fw fa-chevron-right"></i>  <strong>${solr_fields[facet.name].label}</strong>
 366   									</h4>
 367   									</a>
 368   								</div>
 369   								<div id="collapse-${i}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-${i}">
 370   									<div class="panel-body">
 371   										<#assign list_dir="">
 372   										<#assign list_met="">
 373   										<#assign list_syn="">
 374   										<ul class="list-unstyled">
 375   										<#list facet.values as count>
 376   											<#assign sh = "">
 377   											<#list historique as fh>
 378   												<#if fh.name = facet.name+":"+count.name>
 379   													<#assign sh = facet.name+":"+count.name>
 380   												</#if>
 381   											</#list>
 382   											
 383   											<#switch ftype>
 384   												<#case "Type">
 385   													<#assign sName=count.name>
 386   													<#switch count.name>
 387   														<#case "blogs">
 388   															<#assign sName="Actualités">
 389   															<#break>
 390   														<#case "helpdesk">
 391   															<#assign sName="F.A.Q.">
 392   															<#break>
 393   														<#default>
 394   															<#assign sName=count.name?capitalize>
 395   													</#switch>
 396   													<@CreateFilterUrl facets_list sh facet query count sName/>
 397   												<#break>
 398   													
 399   												<#case "Site">
 400   													<#switch count.name>
 401   														<#case "IntraParis-Portail">
 402   															<@CreateFilterUrl facets_list sh facet query count />
 403   														<#break>
 404   														<#case "IntraParis-Achats">
 405   														<#case "IntraParis-AIP">
 406   														<#case "IntraParis-Association">
 407   														<#case "IntraParis-Communication">
 408   														<#case "IntraParis-CompteParisien">
 409   														<#case "IntraParis-Elise">
 410   														<#case "IntraParis-FacilFamille">
 411   														<#case "IntraParis-Finances">
 412   														<#case "IntraParis-Jurilib">
 413   														<#case "IntraParis-Mairie11">
 414   														<#case "IntraParis-Mairie12">
 415   														<#case "IntraParis-Mairie16">
 416   														<#case "IntraParis-Mairie18">
 417   														<#case "IntraParis-Mairie4">
 418   														<#case "IntraParis-Mairie7">
 419   														<#case "IntraParis-Nomos">
 420   														<#case "IntraParis-Qualiparis">
 421   														<#case "IntraParis-RelationUsager">
 422   														<#case "IntraParis-RH">
 423   														<#case "IntraParis-SEQUANA">
 424   															<#assign list_met>
 425   																${list_met}
 426   																<@CreateFilterUrl facets_list sh facet query count />
 427   															</#assign>
 428   														<#break>
 429   														<#case "IntraParis-CabinetDeLaMaire">
 430   														<#case "IntraParis-CASVP">
 431   														<#case "IntraParis-Conseil-De-Paris">
 432   														<#case "IntraParis-DAC">
 433   														<#case "IntraParis-DAE">
 434   														<#case "IntraParis-DAJ">
 435   														<#case "IntraParis-DASCO">
 436   														<#case "IntraParis-DASES">
 437   														<#case "IntraParis-DDCT">
 438   														<#case "IntraParis-Delib">
 439   														<#case "IntraParis-DEVE">
 440   														<#case "IntraParis-DFA">
 441   														<#case "IntraParis-DFPE">
 442   														<#case "IntraParis-DICOM">
 443   														<#case "IntraParis-DILT">
 444   														<#case "IntraParis-DJS">
 445   														<#case "IntraParis-DLH">
 446   														<#case "IntraParis-DPA">
 447   														<#case "IntraParis-DPE">
 448   														<#case "IntraParis-DPP">
 449   														<#case "IntraParis-DRH">
 450   														<#case "IntraParis-DSTI">
 451   														<#case "IntraParis-DSIN">
 452   														<#case "IntraParis-DU">
 453   														<#case "IntraParis-DVD">
 454   														<#case "IntraParis-IG">
 455   														<#case "IntraParis-SG">
 456   														<#case "IntraParis-MUSEES">
 457   															<#assign list_dir>
 458   																${list_dir}
 459   																<@CreateFilterUrl facets_list sh facet query count />
 460   															</#assign>
 461   														<#break>
 462   														<#case "IntraParis-CASVP-CFTC">
 463   														<#case "IntraParis-CASVP-CGT">
 464   														<#case "IntraParis-CASVP-FO">
 465   														<#case "IntraParis-CASVP-SUD">
 466   														<#case "IntraParis-CASVP-SUPAP-FSU">
 467   														<#case "IntraParis-CASVP-UNSA">
 468   														<#case "IntraParis-CFDT">
 469   														<#case "IntraParis-CFTC">
 470   														<#case "IntraParis-CGC">
 471   														<#case "IntraParis-CGT">
 472   														<#case "IntraParis-EPPM-CFDT">
 473   														<#case "IntraParis-EPPM-CFTC">
 474   														<#case "IntraParis-EPPM-CGC">
 475   														<#case "IntraParis-EPPM-CGT">
 476   														<#case "IntraParis-EPPM-FO">
 477   														<#case "IntraParis-EPPM-SUD">
 478   														<#case "IntraParis-EPPM-SUPAP-FSU">
 479   														<#case "IntraParis-EPPM-UCP">
 480   														<#case "IntraParis-EPPM-UNSA">
 481   														<#case "IntraParis-FO">
 482   														<#case "IntraParis-SUD">
 483   														<#case "IntraParis-SUPAP-FSU">
 484   														<#case "IntraParis-UCP">
 485   														<#case "IntraParis-UNSA">
 486   															<#assign list_syn>
 487   															${list_syn}
 488   															<@CreateFilterUrl facets_list sh facet query count />
 489   															</#assign>
 490   														<#break>
 491   													</#switch>	
 492   												<#break>
 493   											</#switch>		
 494   											
 495   										</#list>
 496   											<li>
 497   											<#if ftype="Site">
 498   												<p id="dir-title" class="lead" data-toggle="collapse" data-target="#dir"><i class="fa fa-chevron-right fa-fw"></i> Direction <span class="label label-primary"></span></p>
 499   												<ul id="dir" class="collapse" aria-labelledby="dir-title">
 500   													${list_dir}
 501   												</ul>
 502   												<p id="met-title" class="lead" data-toggle="collapse" data-target="#met"><i class="fa fa-chevron-right fa-fw"></i> Métier <span class="label label-primary"></span></p>
 503   												<ul id="met" class="collapse" aria-labelledby="met-title">
 504   													${list_met}
 505   												</ul>
 506   												<p id="syn-title" class="lead" data-toggle="collapse" data-target="#syn"><i class="fa fa-chevron-right fa-fw"></i> Syndicats <span class="label label-primary"></span></p>
 507   												<ul id="syn" class="collapse" aria-labelledby="syn-title">
 508   													${list_syn}
 509   												</ul>
 510   											</#if>	
 511   											</li>
 512   										</ul>
 513   											
 514   									</div>
 515   								</div>
 516   							</div>
 517   						</div>				
 518   					</#if>
 519   				</#list>
 520   			</#if>
 521   			<#-- facets date refining -->
 522   			<#if facets_date??>
 523   				<#list facets_date as field>
 524   					<#if field.counts??>
 525   					<#-- when there is no result, facet is not null, but facet.counts is -->
 526   					<div class="panel-group" id="accordion-date" role="tablist" aria-multiselectable="true">
 527   						<div class="panel panel-default">
 528   							<div class="panel-heading" role="tab" id="heading-date">
 529   								<a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-date" aria-expanded="true" aria-controls="collapse">
 530   									<h4 class="panel-title">
 531   										<i class="fa fa-fw fa-chevron-right"></i> <strong> ${solr_fields[field.name].label} </strong>
 532   									</h4>
 533   								</a>
 534   							</div>
 535   							<div id="collapse-date" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-date">
 536   								<div class="panel-body">
 537   									<ul class="list-unstyled">
 538   									<#assign year_count=0>
 539   									<#assign current_year=0>
 540   									<#assign nYear=0>
 541   									<#assign nowString = "${.now?string('yyyy')}">
 542   									<#assign nowNumber = nowString?number>
 543                                       <#assign prev_year=0>
 544   									<#list field.counts?reverse as count>
 545   										<#if count.count != 0>
 546   											<#assign toDate = "${count.value}"?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")>
 547   											<#assign toString = "${toDate?string('yyyy')}">
 548   											<#assign toMonth = "${toDate?string('MMMM')}">
 549                                               <#if nowString=toString >
 550                                                   <#assign daterange = "${field.name}:[${count.value} TO ${count.value}${facetDateGap}]"?url>
 551                                               <#else>
 552                                                   <#assign daterange = "${field.name}:[${prev_year}-01-01T00:00:00Z TO ${prev_year+1}-01-01T00:00:00Z]"?url>
 553                                               </#if>
 554   											
 555   											<#assign sh = "">
 556   											<#list historique as fh>
 557   												<#if fh.name?url = daterange>
 558   												   <#assign sh = daterange>
 559   												</#if>
 560   											</#list>
 561   											<#if nowString=toString >
 562   												<#if sh?has_content >
 563   													<li>
 564   														<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}<@EncodeFQ  facets_list sh?url true />${conf_query}">
 565   															<i class="fa fa-check-square fa-fw"></i> ${toMonth} ${toString} <span class="label label-primary">${count.count}</span>
 566   														</a>
 567   													</li>		
 568   												<#else>
 569   													<li>
 570   														<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}&facetlabel=${toMonth}-${toString}&facetname=${field.name}&fq=${daterange}<@EncodeFQ  facets_list />${conf_query}">
 571   															<i class="fa fa-square-o fa-fw"></i>  ${toMonth} ${toString}  <span class="label label-primary">${count.count}</span>
 572   														</a>
 573   													</li>	
 574   												</#if>
 575   												<#assign nYear=toString?number>
 576   											<#else>
 577   												<#if toString?number &gt; 0 >
 578   													<#assign current_year=toString?number>
 579   													<#if current_year = nYear>
 580   														<#assign year_count= year_count + count.count>
 581   													<#else>
 582                                                           <#if nYear != nowNumber && nYear &gt; 0>
 583   														<#if sh?has_content >
 584   															<li>
 585   																<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}<@EncodeFQ  facets_list sh?url true />${conf_query}">
 586   																	<i class="fa fa-check-square fa-fw"></i> ${nYear} <span class="label label-primary">${year_count}</span>
 587   																</a>
 588   															</li>	
 589   															<#else>
 590   															<li>
 591   																<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}&facetlabel=${prev_year}&facetname=${field.name}&fq=${daterange}<@EncodeFQ  facets_list />${conf_query}">
 592   																	<i class="fa fa-square-o fa-fw"></i> ${nYear}  <span class="label label-primary">${year_count}</span>
 593   																</a>
 594   															</li>	
 595   														</#if>
 596                                                           </#if>
 597   														<#assign nYear = toString?number>
 598   														<#assign year_count=count.count > 
 599   													</#if>
 600   												</#if>
 601   											</#if>
 602   										
 603   										</#if>
 604                                           <#assign prev_year=current_year>
 605   									</#list>
 606                                       <#if 0 < prev_year>
 607                                           <#assign daterange = "${field.name}:[${prev_year}-01-01T00:00:00Z TO ${prev_year+1}-01-01T00:00:00Z]"?url>
 608                                           <#assign sh = "">
 609                                           <#list historique as fh>
 610                                               <#if fh.name?url = daterange>
 611                                                  <#assign sh = daterange>
 612                                               </#if>
 613                                           </#list>
 614                                           <#if sh?has_content >
 615                                               <li>
 616                                                   <a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}<@EncodeFQ  facets_list sh?url true />${conf_query}">
 617                                                       <i class="fa fa-check-square fa-fw"></i> ${nYear} <span class="label label-primary">${year_count}</span>
 618                                                   </a>
 619                                               </li>	
 620                                           <#else>
 621                                               <li>
 622                                                   <a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}&facetlabel=${prev_year}&facetname=${field.name}&fq=${daterange}<@EncodeFQ  facets_list />${conf_query}">
 623                                                       <i class="fa fa-square-o fa-fw"></i> ${nYear}  <span class="label label-primary">${year_count}</span>
 624                                                   </a>
 625                                               </li>	
 626                                           </#if>
 627                                       </#if>
 628   									</ul>
 629   								</div>
 630   							</div>
 631   						</div>
 632   					</div>
 633   					</#if>
 634   				</#list>
 635   			</#if>	
 636       		<#-- facets Intersection -->
 637   			<#if facet_tree??>
 638   			
 639   			<div id="intersection" class="">
 640   				<#list facet_tree?keys as key>
 641   				<table>
 642   					<th>
 643   						<#assign field1= "${key}"?split(",")[0] >
 644   						<#assign field2= "${key}"?split(",")[1] >
 645   						${solr_fields[field1].label} / ${solr_fields[field2].label}
 646   					</th>
 647   					<#list facet_tree[key] as facet>
 648   					<#if facet.values??>
 649   					<#-- when there is no result, facet is not null, but facet.values is -->
 650   					<tr>
 651   						<td>
 652   							<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}&fq=${field1}:${facet.name?url}<@EncodeFQ  facets_list/>${conf_query}">${facet.name}</a>
 653   						</td>
 654   					</tr>
 655   					<tr>
 656   						<td>
 657   							<ul>
 658   								<#list facet.values as count>
 659   								<li>
 660   									<a href="${fullUrl}?page=search-solr&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}&query=${query?url}&fq=${field1}:${facet.name?url}&fq=${field2}:${count.name?url}<@EncodeFQ  facets_list/>${conf_query}">${count.name}(${count.count})</a>
 661   								</li>
 662   								</#list>
 663   							</ul>
 664   						</td>
 665   					</tr>
 666   					</#if>
 667   					</#list>
 668   				</table>
 669   				</#list>
 670   			</div>
 671   			</#if>
 672   			
 673   		</div>	
 674   		<div id="resultItems" class="col-xs-12 col-sm-8">
 675   			<form name="search" class="form-inline" method="post" action="${fullUrl}">
 676   				<input type="hidden" name="page" value="search-solr">
 677   				<input type="hidden" name="query" value="${query?if_exists}" > 
 678   				<#if conf_user_query??>
 679   					<input type="hidden" name="conf" value="${conf_user_query}">
 680   				</#if>
 681   				<input type="hidden" name="sort_name" value="${sort_name!}">
 682   				<input type="hidden" name="sort_order" value="${sort_order!}">
 683   				<#if facets_list??>
 684   					<#list facets_list as facet>
 685   						<input type="hidden" name="fq" value="${facet}">
 686   					</#list>
 687   				</#if>
 688   				<#-- Number of documents per page selector 	#i18n{portal.search.search_results.labelNbDocsPerPage}: -->
 689   				<div class="pagination">
 690   					<@NbItemsPerPageSelectorCombo nb_items_per_page?string /> <@paginationSearch paginator=paginator />
 691   				</div>		
 692   			</form>
 693   			<hr>
 694   			<div class="item">
 695   			<#list results_list as result>
 696   				<#switch result.type>
 697   				<#case "helpdesk">
 698   					<#assign image='fichier_article'>	
 699   					<#break>
 700   				<#case "blogs">
 701   					<#assign image='fichier_article'>	
 702   					<#break>
 703   				<#case "directory">
 704   					<#assign image='fichier_article'>	
 705   					<#break>
 706   				<#case "PAGE">
 707   					<#assign image='fichier_article'>	
 708   					<#break>
 709   				<#case "htmlpage">
 710   					<#assign image='fichier_article'>	
 711   					<#break>
 712   				<#case "Fichiers en téléchargement">
 713   					<#assign image='fichiers_pdf'>	
 714   					<#break>
 715   				<#default>
 716   					<#assign image='fichier_article'>	
 717   				</#switch>
 718   				<div class="row">
 719   					<div class="hidden-xs col-sm-1">
 720   						<a class="img" href="${result.url}&terms=${query?url}&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}<@EncodeFQ  facets_list />">
 721   							<img src="images/local/skin/${image}.png" alt="" title="" class="img-responsive"> 
 722   						</a>
 723   					</div>
 724   					<div class="col-xs-12 col-sm-11">
 725   						<a href="${result.url}&terms=${query?url}&items_per_page=${nb_items_per_page}&sort_name=${sort_name!}&sort_order=${sort_order!}<@EncodeFQ  facets_list />">
 726   							<h2>${result.title}</h2>
 727   							<p class="date"><#if result.date?has_content>${result.date?date} - </#if>${result.site}</p>
 728   							<div class="result-text">
 729   							<#if result.summary??>${(result.highlight.map["summary"][0])!result.summary}</#if>
 730   								<#if result.highlight??>
 731   									<#-- get a extract from the "content" field where there is one (or more) of the searched words -->
 732   									<#if result.highlight.map["content"]??>
 733   										#i18n{search.solr.display.result.summary.extract} : 
 734   										<#list result.highlight.map["content"] as extrait>
 735   											${extrait}
 736   										</#list>
 737   									</#if>
 738   								</#if>
 739   							</div>
 740   						</a>	
 741   						
 742   					</div>
 743   				</div>
 744   			</#list>
 745   			<hr>
 746   			<form name="search" class="form-inline" method="post" action="${fullUrl}">
 747   				<input type="hidden" name="page" value="search-solr" />
 748   				<input type="hidden" name="query" value="${query?if_exists}" > 
 749   				<#if conf_user_query??>
 750   					<input type="hidden" name="conf" value="${conf_user_query}">
 751   				</#if>
 752   				<input type="hidden" name="sort_name" value="${sort_name!}">
 753   				<input type="hidden" name="sort_order" value="${sort_order!}">
 754   				<#if facets_list??>
 755   					<#list facets_list as facet>
 756   						<input type="hidden" name="fq" value="${facet}">
 757   					</#list>
 758   				</#if>
 759   				<#-- Number of documents per page selector 	#i18n{portal.search.search_results.labelNbDocsPerPage}: -->
 760   				<div class="pagination">
 761   					<@NbItemsPerPageSelectorCombo nb_items_per_page?string /> <@paginationSearch paginator=paginator />
 762   				</div>		
 763   			</form>
 764   		</div>
 765       </div>
 766   </div>
 767   <#-- Freemarker macros -->
 768   <#macro paginationSearch paginator >
 769   	<#if (paginator.pagesCount > 1) >
 770   		<@paginationSitePageLinks paginator=paginator />
 771   	</#if>
 772    </#macro>
 773   <#-- Number of items per page selector - Combo Box implementation -->
 774   <#macro NbItemsPerPageSelectorCombo nb_items_per_page>
 775   <select name="items_per_page" class="perpage">
 776       <#list [ "10" , "20" , "50" , "100" ] as nb>
 777       <#if nb_items_per_page = nb >
 778   		<option selected="selected" value="${nb}">${nb} par page</option>
 779       <#else>
 780   		<option value="${nb}">${nb} par page</option>
 781       </#if>
 782       </#list>
 783   </select>
 784   </#macro>
 785   <#-- Number of items per page selector - Radio List implementation -->
 786   <#macro NbItemsPerPageSelectorRadioList nb_items_per_page>
 787   <#list [ "5" , "10" , "20" , "50" ] as nb>
 788   <#if nb = nb_items_per_page > 
 789   <input value="${nb}" id="items_per_page${nb}" name="items_per_page" class="radio" type="radio" checked ><label for="items_per_page${nb}">${nb}</label>
 790   <#else>
 791   <input value="${nb}" id="items_per_page${nb}" name="items_per_page" class="radio" type="radio" ><label for="items_per_page${nb}">${nb}</label>
 792   </#if>
 793   </#list>
 794   </#macro>
 795   
 796   <script>
 797   $(function() {
 798   	$('.panel-title').on( 'click', function(e){
 799   		$(this).find('i').toggleClass('fa-chevron-down').toggleClass('fa-chevron-up');
 800   	}); 
 801   	
 802   	$('.lead').on( 'click', function(e){
 803   		$(this).find('i').toggleClass('fa-chevron-down').toggleClass('fa-chevron-up');
 804   	}); 
 805   	
 806   	$('.perpage').on( 'change', function(e){
 807   		var f = $(this).parents('.form-inline');
 808   		f.submit();
 809   	});
 810   	
 811   	var collapsible = $('i.fa-check-square').parents('.collapse');
 812   	collapsible.each(function() {
 813   		$(this).collapse('show');
 814   		var collParent = $(this).attr('aria-labelledby');
 815   		$('#' + collParent).find('i').toggleClass('fa-chevron-down').toggleClass('fa-chevron-up');
 816   	});
 817   	
 818   	$('#solr').autocomplete({
 819   		source: function(request, response){
 820   		$.ajax({
 821   			url: '@base_url@servlet/plugins/SolrSuggest',
 822   			dataType: 'jsonp',
 823   			minLength: 3,
 824   			data: {
 825   			q: request.term,
 826   			},
 827   			success: function(data) {
 828   				var formattedResponse = $.map(data.response.docs, function (item) {
 829   				return {
 830   					label: item.title,
 831   					value: item.title,
 832   					};
 833   				});
 834   				response( formattedResponse );
 835   			}
 836   			});
 837   		},
 838   	});
 839   	
 840   	if ( $("#historique").length > 0 ){
 841   		var stype=$('#a-type').data('type');
 842   	
 843   		switch (stype) {
 844   		case 'blogs':
 845   			$('#a-type').html('Actualités <i class="fa fa-remove fa-fw"></i>');
 846   			break;
 847   		case 'helpdesk':
 848   			$("#a-type").html('F.A.Q. <i class="fa fa-remove fa-fw"></i>');
 849   			break;
 850   		}
 851   	}
 852   	
 853   	if ( $("input#date").length > 0 ){
 854   		var valFrom = "";
 855   		var aFrom = $("input#date").attr("data-val").substring(1,11).split("-");
 856   		var i = 0;
 857   		while (i < aFrom.length ){ 
 858   			valFrom += aFrom.pop() + "/";
 859   		}
 860   		valFrom=valFrom.substr( 0, valFrom.length - 1 )
 861   		$( "#from" ).val( valFrom );
 862   		
 863   		var valTo = "";
 864   		var aTo = $("input#date").attr("data-val").substring(25,35).split("-");
 865   		var i = 0;
 866   		while (i < aTo.length ) { 
 867   			valTo += aTo.pop() + "/";
 868   		}
 869   		valTo = valTo.substr( 0, valTo.length - 1 )
 870   		$( "#to" ).val( valTo );
 871   		
 872   								
 873   		$("#a-date").html( "Du " + valFrom +" au "+ valTo + " <i class=\"fa fa-remove fa-fw\"></i>");
 874   		$("#a-date").attr("title", "Supprimer le filtre date: Du " + valFrom +" au "+ valTo );
 875   	};
 876   	
 877       $( "#from" ).datepicker({
 878   		regional: "fr",	
 879   		defaultDate: "+1w",
 880   		changeMonth: true,
 881   		changeYear: true,
 882   		onClose: function( selectedDate ) {
 883   			$( "#to" ).datepicker( "option", "minDate", selectedDate );
 884         }
 885       }).datepicker(  );
 886       $( "#to" ).datepicker({
 887   	  regional: "fr",	
 888         defaultDate: "+1w",
 889         changeMonth: true,
 890   	  changeYear: true,
 891         onClose: function( selectedDate ) {
 892           $( "#from" ).datepicker( "option", "maxDate", selectedDate );
 893         }
 894       });
 895   	
 896   	$("#search").submit( function(){
 897   		if( $( "#from" ).val() != "" ){
 898   			var dateFrom = $.datepicker.formatDate( "yy-mm-dd", $( "#from" ).datepicker( "getDate" ) );
 899   			
 900   			if ( $( "#to" ).val() == "" ){
 901   				var date = new Date();
 902   				var s= date.getDate() + "/" + date.getMonth() + "/" + date.getYear();
 903   				$( "#to" ).datepicker( "setDate", s );
 904   			}
 905   			var dateTo = $.datepicker.formatDate( "yy-mm-dd", $( "#to" ).datepicker( "getDate" ) );
 906   			
 907   			if ( $("input#date").length == 0 ){
 908   				$("#search").append('<input name="fq" id="date" data-type="date" data-val="" value="" type="hidden">');
 909   			};
 910   			$("input#date").val("date:[" + dateFrom.toString() + "T00:00:00Z TO " + dateTo.toString() + "T00:00:00Z]" );
 911   		}
 912   	});
 913   	
 914   });
 915   </script>