Making sure all the "nearest" mappers are displayed instead of just one.
[rails.git] / app / views / user / account.rhtml
1 <h2>User details</h2>
2 <%= error_messages_for 'user' %>
3 <%= start_form_tag :controller => 'user', :action => 'edit', :display_name => @user.display_name %>
4 <table style="width : 100%">
5   <tr><td>Name</td><td><%= @user.email %></td></tr>
6   <tr><td>Mapper since</td><td><%= @user.creation_time %> (<%= time_ago_in_words(@user.creation_time) %> ago)</td></tr>
7   <tr><td>Display Name</td><td><%= text_field :user, :display_name, :value => @user.display_name %></td></tr>
8   <tr id="homerow" <% unless @user.home_lat and @user.home_lon %> class="nohome" <%end%> ><td>Your home</td><td><em class="message">You have not entered your home location.</em><span class="location">Latitude: <%= text_field :user, :home_lat, :value => @user.home_lat, :size => 20, :id => "home_lat" %> Longitude <%= text_field :user, :home_lon, :value => @user.home_lon, :size => 20, :id => "home_lon" %></span>  </td></tr>
9
10   <tr><td></td><td>
11   <p>Update home location when I click on the map? <input type="checkbox" value="1" <% unless @user.home_lat and @user.home_lon %> checked="checked" <% end %> id="updatehome" /> </p>
12   <div id="map" style="border: 1px solid black; position: relative; width : 90%; height : 300px;">
13     <% # This now just used to detect the width/height required for the popup. %>
14     <p id="highlightinfo"></p>
15   </div>
16   </td></tr>
17
18   <tr><td valign="top">Description</td><td><%= text_area :user, :description, :value => @user.description, :class => "editDescription" %></td></tr>
19 </table>
20 <%= submit_tag 'Save Changes' %>
21 <%= end_form_tag %>
22
23 <% nearest_str = "" %>
24 <% if @user.home_lat and @user.home_lon %>
25     <h2>Users in your area</h2>
26
27     <% if @user.nearby.empty? %>
28     There are no users who admit to mapping in your area.  Better go out and spread the word about OSM!
29     <% else %>
30
31     <p>These users are mapping in your area:</p>
32     <table>
33     <tr>
34     <th>Name</th>
35     <th>Contact</th>
36     </tr>
37     <% @user.nearby(1,1).each do |nearby| %>
38     <% nearest_str += "nearest.push( { 'display_name' : '#{nearby.display_name}', 'home_lat' : #{nearby.home_lat}, 'home_lon' : #{nearby.home_lon} } );\n" %>
39
40     <tr>
41     <td><%= link_to nearby.display_name, :controller => 'user', :action => 'view',  :display_name => nearby.display_name %></td>
42     <td><%= link_to 'send message', :controller => 'message', :action => 'new', :user_id => nearby.id %></td>
43     </tr>
44     <%end%>
45     </table>
46
47     <%end%>
48     <br />
49 <% end %>
50 <script type="text/javascript">
51     var nearest = [], friends = [];
52     <%= nearest_str %>
53 </script>
54
55 <% if @user.home_lat and @user.home_lon %>
56     <% marker = true %>
57     <% mlon = @user.home_lon %> 
58     <% mlat = @user.home_lat %>
59     <% lon =  @user.home_lon %>
60     <% lat =  @user.home_lat  %>
61     <% zoom =  '12' %>
62 <script type="text/javascript">
63   var mlat = <%= mlat %>;
64   var mlon = <%= mlon %>;
65 </script>
66 <% else %>
67     <% lon =  params['lon'] || '-0.1' %>
68     <% lat =  params['lat'] || '51.5' %>
69     <% zoom =  params['zoom'] || '4' %> 
70 <% end %>
71
72
73
74 <script type="text/javascript">
75   var lat = <%= lat %>;
76   var lon = <%= lon %>;
77   var zoom = <%= zoom %>;
78   var PI = 3.14159265358979323846;
79
80
81
82   <% if params['scale'] and params['scale'].length > 0 then %>
83   zoom = Math.log(360.0/(( <% print params['scale'].to_f() %> ) * 512.0)) / Math.log(2.0);
84   <% end %>
85   zoom = zoom;
86   lon = lon * 20037508.34 / 180;
87   lat = Math.log(Math.tan( (90 + lat) * PI / 360)) / (PI / 180);
88   lat = lat * 20037508.34 / 180;
89   <% if marker %>
90   mlon = mlon * 20037508.34 / 180;
91   mlat = Math.log(Math.tan( (90 + mlat) * PI / 360)) / (PI / 180);
92   mlat = mlat * 20037508.34 / 180;
93   <%end%>
94
95 </script>
96 <script type="text/javascript" src="/javascripts/OpenLayers.js"></script>
97
98 <script type="text/javascript">
99   <!--
100   var map, layer, markers, marker, popup;
101
102
103   function mercator2lonlat( merc ) {
104     var lon_deg = (merc.lon / 20037508.34) * 180;
105     var lat_deg = (merc.lat / 20037508.34) * 180;
106     var PI = 3.14159265358979323846;
107     lat_deg = 180/PI * (2 * Math.atan(Math.exp(lat_deg * PI / 180)) - PI / 2);
108     return new OpenLayers.LonLat(lon_deg,lat_deg);
109   }
110
111   function lonlat2mercator( ll ) {
112       var lon = ll.lon * 20037508.34 / 180;
113       var lat = Math.log(Math.tan( (90 + ll.lat) * PI / 360)) / (PI / 180);
114       lat = lat * 20037508.34 / 180;
115       return new OpenLayers.LonLat(lon,lat);
116   }
117
118   function init(){
119
120     OpenLayers.Util.onImageLoadError = function() {
121       this.src = "http://www.openstreetmap.org/javascripts/img/404.png";
122     }
123     map = new OpenLayers.Map( "map", 
124         {maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), maxZoomLevel:18, maxResolution:156543, units:'meters', projection: "EPSG:41001"} );
125     layer = new OpenLayers.Layer.LikeGoogle( "Mapnik", "http://tile.openstreetmap.org/", {type:'png'} );
126     map.addLayer(layer);
127     layer = new OpenLayers.Layer.LikeGoogle( "Osmarender", "http://dev.openstreetmap.org/~ojw/Tiles/tile.php/", {type:'png'} );
128     map.addLayer(layer);
129
130     //Marker stuff
131
132     markers = new OpenLayers.Layer.Markers("markers");
133     map.addLayer(markers); 
134
135     <% if marker %>
136     marker = new OpenLayers.Marker(new OpenLayers.LonLat(mlon,mlat));
137     marker.events.register("click", "marker", markerOnClick );
138     markers.addMarker(marker);
139     <%end%>
140
141     var near_icon = OpenLayers.Marker.defaultIcon();
142     near_icon.url = OpenLayers.Util.getImagesLocation() + "marker-green.png";;
143     var i = nearest.length;
144     while( i-- ) {
145         var nearmarker = new OpenLayers.Marker( lonlat2mercator( new OpenLayers.LonLat( nearest[i].home_lon, nearest[i].home_lat ) ), near_icon.clone() );
146         markers.addMarker( nearmarker );
147         nearmarker.events.register("click", "nearmarker", makeMarkerFunction( i ) );
148     }
149
150       map.addControl(new OpenLayers.Control.LayerSwitcher());
151     map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
152
153     map.events.register("click", map, setHome);
154   }        
155
156   function makeMarkerFunction( i ) {
157     return function() { markerOnClick( i ); };
158   }
159
160   function markerOnClick( i ) {
161     var html, position;
162     if( typeof( i ) == 'number'  ) {
163         html = '<p>Nearby mapper: <a href="/user/'+nearest[i].display_name+'">'+nearest[i].display_name+'</a></p>';
164         html += '<p style="text-align:right">(<a href="#" onclick="return closePopup();">close</a>)</p>';
165         position = lonlat2mercator( new OpenLayers.LonLat( nearest[i].home_lon, nearest[i].home_lat ) );
166     } else {
167         html = '<p>Your location (<a href="#" onclick="return closePopup()">close</a>)</p>';
168         position = new OpenLayers.LonLat(mlon,mlat);
169     }
170     var box = document.getElementById( 'highlightinfo' );
171     box.innerHTML = html;
172     closePopup();
173     popup = new OpenLayers.Popup.AnchoredBubble( 'popup', position, new OpenLayers.Size( box.offsetWidth, box.offsetHeight ), html, OpenLayers.Marker.defaultIcon(), true );
174     map.addPopup( popup );
175   }
176   
177     function closePopup() {
178         if( popup ) {
179             map.removePopup( popup );
180             delete popup;
181         }
182         return false;
183     }
184
185     function setHome( e ) { 
186         closePopup();
187         if( ! document.getElementById( 'updatehome' ).checked )
188             return;
189         var lonlat = map.getLonLatFromViewPortPx(e.xy)
190
191         var lon_deg = (lonlat.lon / 20037508.34) * 180;
192         var lat_deg = (lonlat.lat / 20037508.34) * 180;
193         var PI = 3.14159265358979323846;
194         lat_deg = 180/PI * (2 * Math.atan(Math.exp(lat_deg * PI / 180)) - PI / 2);
195         var homerow = document.getElementById( 'homerow' );
196         var home_lat = document.getElementById( 'home_lat' );
197         var home_lon = document.getElementById( 'home_lon' );
198         homerow.className = '';
199         home_lat.value = lat_deg;
200         home_lon.value = lon_deg;
201         if( marker ) {
202             markers.removeMarker(marker);
203         }
204         marker = new OpenLayers.Marker(lonlat);
205         markers.addMarker(marker);
206     }
207 window.onload = init;
208 // -->
209 </script>
210
211 <h2>Privacy</h2>
212 <% if @user.data_public? %>
213   All your edits are public.
214 <% else %>
215   Currently your edits are anonymous and people can't find out where you are located. To show what you edited and allow people to contact you through the website, click the button below. This action cannot be reversed.
216   <br /><br />
217   <%= start_form_tag :controller => 'user', :action => 'go_public'%>
218   <%= submit_tag 'Make all my edits public, forever' %>
219   <%= end_form_tag %>
220 <% end %>