]> git.openstreetmap.org Git - nominatim.git/blob - lib/template/search-html.php
fix json output of empty arrays
[nominatim.git] / lib / template / search-html.php
1 <?php
2         header("content-type: text/html; charset=UTF-8");
3 ?>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head>
7         <title>OpenStreetMap Nominatim: Search</title>
8
9         <base href="<?php echo CONST_Website_BaseURL;?>" />
10         <link href="nominatim.xml" rel="search" title="Nominatim Search" type="application/opensearchdescription+xml" />
11         <link href="css/search.css" rel="stylesheet" type="text/css" />
12
13         <script src="js/OpenLayers.js" type="text/javascript"></script>
14         <script src="js/tiles.js" type="text/javascript"></script>
15         <script src="js/prototype-1.6.0.3.js" type="text/javascript"></script>
16
17         <script type="text/javascript">
18
19                 var map;
20
21                 function handleResize()
22                 {
23                         if ($('searchresults'))
24                         {
25                                 var viewwidth = ((document.documentElement.clientWidth > 0?document.documentElement.clientWidth:document.documentElement.offsetWidth) - 200) + 'px';
26                                 $('map').style.width = viewwidth;
27                                 $('report').style.width = viewwidth;
28                         }
29                         else
30                         {
31                                 $('map').style.width = ((document.documentElement.clientWidth > 0?document.documentElement.clientWidth:document.documentElement.offsetWidth) - 0) + 'px';
32                                 $('map').style.left = '0px';
33                         }
34
35                         if ($('map')) $('map').style.height = ((document.documentElement.clientHeight > 0?document.documentElement.clientHeight:document.documentElement.offsetHeight) - 38) + 'px';
36                         if ($('searchresults')) $('searchresults').style.height = ((document.documentElement.clientHeight > 0?document.documentElement.clientHeight:document.documentElement.offsetHeight) - 38) + 'px';
37                         if ($('report')) $('report').style.height = ((document.documentElement.clientHeight > 0?document.documentElement.clientHeight:document.documentElement.offsetHeight) - 38) + 'px';
38                 }
39                 window.onresize = handleResize;
40
41                 function panToLatLon(lat,lon) {
42                         var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
43                         map.panTo(lonLat, <?php echo $iZoom ?>);
44                 }
45
46                 function panToLatLonZoom(lat, lon, zoom) {
47                         var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
48                         if (zoom != map.getZoom())
49                                 map.setCenter(lonLat, zoom);
50                         else
51                                 map.panTo(lonLat, 10);
52                 }
53
54                 function panToLatLonBoundingBox(lat,lon,minlat,maxlat,minlon,maxlon,wkt) {
55                         vectorLayer.destroyFeatures();
56                         var proj_EPSG4326 = new OpenLayers.Projection("EPSG:4326");
57                         var proj_map = map.getProjectionObject();
58                         map.zoomToExtent(new OpenLayers.Bounds(minlon,minlat,maxlon,maxlat).transform(proj_EPSG4326, proj_map));
59                         var lonLat = new OpenLayers.LonLat(lon, lat).transform(proj_EPSG4326, proj_map);
60                         map.panTo(lonLat, <?php echo $iZoom ?>);
61
62                         if (wkt)
63                         {
64                                 var freader = new OpenLayers.Format.WKT({
65                                                 'internalProjection': proj_map,
66                                                 'externalProjection': proj_EPSG4326
67                                                 });
68
69                                 var feature = freader.read(wkt);
70                                 if (feature)
71                                 {
72                                         feature.style = {
73                                                         strokeColor: "#75ADFF",
74                                                         fillColor: "#F0F7FF",
75                                                         strokeWidth: 2,
76                                                         strokeOpacity: 0.75,
77                                                         fillOpacity: 0.75,
78                                                         pointRadius: 100
79                     };
80                                         vectorLayer.addFeatures([feature]);
81                                 }
82                         }
83                 }
84
85                 function round(v,n)
86                 {
87                         n = Math.pow(10,n);
88                         return Math.round(v*n)/n;
89                 }
90                 function floor(v,n)
91                 {
92                         n = Math.pow(10,n);
93                         return Math.floor(v*n)/n;
94                 }
95                 function ceil(v,n)
96                 {
97                         n = Math.pow(10,n);
98                         return Math.ceil(v*n)/n;
99                 }
100
101                 function mapEventMove() {
102                         var proj = new OpenLayers.Projection("EPSG:4326");
103                         var bounds = map.getExtent();
104                         bounds = bounds.transform(map.getProjectionObject(), proj);
105                         $('viewbox').value = floor(bounds.left,2)+','+ceil(bounds.top,2)+','+ceil(bounds.right,2)+','+floor(bounds.bottom,2);
106                 }
107
108     function init() {
109                         handleResize();
110                         map = new OpenLayers.Map ("map", {
111                 controls:[
112                                                                                 new OpenLayers.Control.Navigation(),
113                                                                                 new OpenLayers.Control.PanZoomBar(),
114                                                                                 new OpenLayers.Control.MousePosition(),
115                                                                                 new OpenLayers.Control.Attribution()],
116                 maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
117                 maxResolution: 156543.0399,
118                 numZoomLevels: 19,
119                 units: 'm',
120                 projection: new OpenLayers.Projection("EPSG:900913"),
121                 displayProjection: new OpenLayers.Projection("EPSG:4326"),
122                 eventListeners: {
123                                                                         "moveend": mapEventMove
124                                                                 }
125                 } );
126                         map.addLayer(new OpenLayers.Layer.OSM.<?php echo CONST_Tile_Default;?>("Default"));
127
128                         var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
129                         layer_style.fillOpacity = 0.2;
130                         layer_style.graphicOpacity = 1;
131                         vectorLayer = new OpenLayers.Layer.Vector("Points", {style: layer_style});
132                         map.addLayer(vectorLayer);
133                         
134 //                      var lonLat = new OpenLayers.LonLat(<?php echo $fLon ?>, <?php echo $fLat ?>).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
135 //                      map.setCenter (lonLat, <?php echo $iZoom ?>);
136                 }
137
138                 function setfocus(field_id) { 
139                         $(field_id).focus() 
140                 } 
141                 
142         </script>
143 </head>
144
145 <body onload="setfocus('q');">
146
147         <div id="seachheaderfade1"></div><div id="seachheaderfade2"></div><div id="seachheaderfade3"></div><div id="seachheaderfade4"></div>
148
149         <div id="seachheader">
150                 <form accept-charset="UTF-8" action="<?php echo CONST_Website_BaseURL; ?>search.php" method="get">
151                         <table border="0" width="100%" summary="header">
152                                 <tr>
153                                         <td valign="middle" style="width:30px;"><img alt="logo" src="images/logo.gif" /></td>
154                                         <td valign="middle" style="width:400px;"><input id="q" name="q" value="<?php echo htmlspecialchars($sQuery); 
155 ?>" style="width:270px;" /><input type="text" id="viewbox" style="width:120px;" name="viewbox" /></td>
156                                         <td style="width:80px;"><input type="submit" value="Search"/></td>
157 <?php if (CONST_Search_AreaPolygons) { ?>                                       <td style="width:100px;"><input type="checkbox" value="1" name="polygon" <?php if ($bAsText) echo "checked='checked'"; ?>/> Highlight</td>
158 <td style="text-align:right;">Data: <?php echo $sDataDate; ?></td>
159 <td style="text-align:right;">
160 <a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Documentation</a> | <a href="http://wiki.openstreetmap.org/wiki/Nominatim/FAQ" 
161 target="_blank">FAQ</a></td>
162
163 <?php } ?>                                      <td style="text-align:right;"><?php if ($sQuery) { ?><input type="button" value="Report Problem With Results" onclick="$('report').style.visibility=($('report').style.visibility=='hidden'?'visible':'hidden')"/><?php } ?></td>
164                                 </tr>
165                         </table>
166                 </form>
167         </div>
168
169 <?php
170         if ($sQuery)
171         {
172 ?>
173         <div id="searchresultsfade1"></div><div id="searchresultsfade2"></div><div id="searchresultsfade3"></div><div id="searchresultsfade4"></div>
174         <div id="searchresults">
175 <?php
176         if ($sSuggestionURL)
177         {
178                 echo '<div class="more"><b>Suggest: </b><a href="'.$sSuggestionURL.'"><b>'.$sSuggestion.'</b></a></div>';
179         }
180         foreach($aSearchResults as $iResNum => $aResult)
181         {
182                 if ($aResult['aBoundingBox'])
183                 {
184                         echo '<div class="result" onClick=\'panToLatLonBoundingBox('.$aResult['lat'].', '.$aResult['lon'];
185                         echo ', '.$aResult['aBoundingBox'][0];
186                         echo ', '.$aResult['aBoundingBox'][1];
187                         echo ', '.$aResult['aBoundingBox'][2];
188                         echo ', '.$aResult['aBoundingBox'][3];
189                         if (isset($aResult['astext'])) echo ', "'.$aResult['astext'].'"';
190                         echo ");'>\n";
191                 }
192                 elseif (isset($aResult['zoom']))
193                 {
194                         echo '<div class="result" onClick="panToLatLonZoom('.$aResult['lat'].', '.$aResult['lon'].', '.$aResult['zoom'].');">';
195                 }
196                 else
197                 {
198                         echo '<div class="result" onClick="panToLatLon('.$aResult['lat'].', '.$aResult['lon'].');">';
199                 }
200
201                 echo (isset($aResult['icon'])?'<img alt="icon" src="'.$aResult['icon'].'"/>':'');
202                 echo ' <span class="name">'.htmlspecialchars($aResult['name']).'</span>';
203                 echo ' <span class="latlon">'.round($aResult['lat'],3).','.round($aResult['lon'],3).'</span>';
204                 echo ' <span class="place_id">'.$aResult['place_id'].'</span>';
205                 if (isset($aResult['label']))
206                         echo ' <span class="type">('.$aResult['label'].')</span>';
207                 else if ($aResult['type'] == 'yes')
208                         echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
209                 else
210                         echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
211                 echo ' <span class="details">(<a href="details.php?place_id='.$aResult['place_id'].'">details</a>)</span>';
212                 echo '</div>';
213         }
214         if (sizeof($aSearchResults))
215         {
216                 if ($sMoreURL)
217                 {
218                         echo '<div class="more"><a href="'.htmlentities($sMoreURL).'">Search for more results</a></div>';
219                 }
220         }
221         else
222         {
223                 echo '<div class="noresults">No search results found</div>';
224         }
225
226 ?>
227                 <div class="disclaimer">Addresses and postcodes are approximate
228                         <input type="button" value="Report Problem" onclick="$('report').style.visibility=($('report').style.visibility=='hidden'?'visible':'hidden')"/>
229                 </div>
230         </div>
231 <?php
232 }
233 ?>
234
235         <div id="map"></div>
236         <div id="report" style="visibility:hidden;"><div style="width:600px;margin:auto;margin-top:60px;">
237                 <h2>Report a problem</h2>
238                 <p>Before reporting problems please read the <a href="http://wiki.openstreetmap.org/wiki/Nominatim">user documentation</a> and <a 
239 href="http://wiki.openstreetmap.org/wiki/Nominatim/FAQ">FAQ</a>.  If your problem relates to the address of a particular search result please use the 'details' link 
240 to check how the address was generated before reporting a problem.</p>
241                 <p>Please use <a href="http://trac.openstreetmap.org/newticket?component=nominatim">trac.openstreetmap.org</a> to report problems 
242 making sure to set 
243 the component to 'nominatim'.  You can search for existing bug reports <a href="http://trac.openstreetmap.org/query?status=new&amp;status=assigned&amp;status=reopened&amp;component=nominatim&amp;order=priority">here</a>.</p>
244                 <p>Please ensure that you include a full description of the problem, including the search query that you used, the problem with the result and, if 
245 the problem relates to missing data, the osm id of the item that is missing.  Problems that contain enough detail are likely to get looked at before ones that 
246 require significant research!</p>
247                 </div>
248
249 <!--
250                 <p>Please use this form to report problems with the search results.  Of particular interest are items missing, but please also use this form to 
251 report any other problems.</p>
252                 <p>If your problem relates to the address of a particular search result please use the 'details' link to check how the address was generated before 
253 reporting a problem.</p>
254                 <p>If you are reporting a missing result please (if possible) include the OSM ID of the item you where expecting (i.e. node 422162)</p>
255                 <form method="post">
256                 <table>
257                 <tr><th>Your Query:</th><td><input type="hidden" name="report:query" value="<?php echo htmlspecialchars($sQuery); ?>" style="width:500px;"><?php echo htmlspecialchars($sQuery); ?></td></tr>
258                 <tr><th>Your Email Address(opt):</th><td><input type="text" name="report:email" value="" style="width:500px;"></td></tr>
259                 <tr><th>Description of Problem:</th><td><textarea name="report:description" style="width:500px;height:200px;"></textarea></td></tr>
260                 <tr><td colspan="2" class="button"><input type="button" value="Cancel" onclick="$('report').style.visibility='hidden'"><input type="submit" value="Report"></td></tr>
261                 </table>
262                 </form>
263                 <h2>Known Problems</h2>
264                 <ul>
265                 <li>Countries where missed out of the index</li>
266                 <li>Area Polygons relate to the search area - not the address area which would make more sense</li>
267                 </ul>
268 -->
269         </div>
270
271         <script type="text/javascript">
272 init();
273 <?php
274         foreach($aSearchResults as $iResNum => $aResult)
275         {
276                 if ($aResult['aBoundingBox'])
277                 {
278                         echo 'panToLatLonBoundingBox('.$aResult['lat'].', '.$aResult['lon'];
279                         echo ', '.$aResult['aBoundingBox'][0];
280                         echo ', '.$aResult['aBoundingBox'][1];
281                         echo ', '.$aResult['aBoundingBox'][2];
282                         echo ', '.$aResult['aBoundingBox'][3];
283                         if (isset($aResult['astext'])) echo ", '".$aResult['astext']."'";
284                         echo ');'."\n";
285                 }
286                 else
287                 {
288                         echo 'panToLatLonZoom('.$fLat.', '.$fLon.', '.$iZoom.');'."\n";
289                 }
290                 break;
291         }
292         if (!sizeof($aSearchResults))
293         {
294                 echo 'panToLatLonZoom('.$fLat.', '.$fLon.', '.$iZoom.');'."\n";
295         }
296 ?>
297 </script>
298 </body>
299
300 </html>