Commit 6de8cf433d34aca538ca11c03e3fbea0ff212aef
1 parent
2f584417
Exists in
master
and in
29 other branches
File edit_location javascript and some fixes
Showing
4 changed files
with
255 additions
and
288 deletions
Show diff stats
app/controllers/my_profile/maps_controller.rb
... | ... | @@ -0,0 +1,246 @@ |
1 | + | |
2 | +var geocoder; | |
3 | +var map; | |
4 | +var marker; | |
5 | +var center; | |
6 | +var move = true; | |
7 | +var previousCenter; | |
8 | + | |
9 | +function getAddress(latlng) { | |
10 | + $('location-fields').addClassName("loading"); | |
11 | + | |
12 | + if (latlng != null) { | |
13 | + geocoder.geocode( {'latLng': latlng}, showAddress); | |
14 | + } | |
15 | +} | |
16 | + | |
17 | +function codeAddress() { | |
18 | + $('location-fields').addClassName("loading"); | |
19 | + | |
20 | + var country_option = $('profile_data_country').value; | |
21 | + var address = $('profile_data_address').value + "-" + $('profile_data_zip_code').value + "," + $('profile_data_city').value+ "-" + $('profile_data_state').value + "," + country_option; | |
22 | + | |
23 | + if (geocoder) { | |
24 | + geocoder.geocode( { 'address': address}, function(results, status) { | |
25 | + if (status == google.maps.GeocoderStatus.OK) { | |
26 | + map.setCenter(results[0].geometry.location); | |
27 | + marker.setPosition(results[0].geometry.location); | |
28 | + $('profile_data_lat').value = results[0].geometry.location.lat(); | |
29 | + $('profile_data_lng').value = results[0].geometry.location.lng(); | |
30 | + $('location-fields').removeClassName("loading"); | |
31 | + enable_save(); | |
32 | + } else { | |
33 | + $('location-fields').removeClassName("loading"); | |
34 | + alert('<%=_("Address not found, reason:")%>' + translate_status(status)); | |
35 | + } | |
36 | + }); | |
37 | + } | |
38 | + | |
39 | + map.setZoom(11); | |
40 | + | |
41 | + return false; | |
42 | +} | |
43 | + | |
44 | +function translate_status(status) | |
45 | +{ | |
46 | + var translated_status = ''; | |
47 | + | |
48 | + if (google.maps.GeocoderStatus.INVALID_REQUEST == status) | |
49 | + translated_status = '<%= _('Invalid address') %>'; | |
50 | + else if (google.maps.GeocoderStatus.REQUEST_DENIED == status) | |
51 | + translated_status = '<%= _('Request denied') %>'; | |
52 | + else if (google.maps.GeocoderStatus.OVER_QUERY_LIMIT == status) | |
53 | + translated_status = '<%= _('Over query limit') %>'; | |
54 | + else if (google.maps.GeocoderStatus.ZERO_RESULTS == status) | |
55 | + translated_status = "<%= _('Address do not exist') %>"; | |
56 | + | |
57 | + return translated_status; | |
58 | +} | |
59 | + | |
60 | +function getAddressData() { | |
61 | + var text = ''; | |
62 | + var fields = [ | |
63 | + 'profile_data_country', | |
64 | + 'profile_data_state', | |
65 | + 'profile_data_city', | |
66 | + 'profile_data_address', | |
67 | + 'profile_data_zip_code' | |
68 | + ]; | |
69 | + for (var i = 0; i < fields.length; i++) { | |
70 | + var field = fields[i]; | |
71 | + if ($(field)) { | |
72 | + text += $(field).value + " "; | |
73 | + } | |
74 | + } | |
75 | + return text; | |
76 | +} | |
77 | + | |
78 | +function showAddress(results, status) { | |
79 | + | |
80 | + if (status == google.maps.GeocoderStatus.OK) { | |
81 | + map.setCenter(results[0].geometry.location); | |
82 | + updateFields(results[0]); | |
83 | + | |
84 | + } else { | |
85 | + alert("<%=_("Address not found, reason:")%>" + translate_status(status)); | |
86 | + } | |
87 | + | |
88 | +} | |
89 | + | |
90 | +function updateFields(place) { | |
91 | + var position = marker.getPosition(); | |
92 | + $('profile_data_lat').value = position.lat(); | |
93 | + $('profile_data_lng').value = position.lng(); | |
94 | + $('location-fields').removeClassName("loading"); | |
95 | + | |
96 | + var components_len = place.address_components.size(); | |
97 | + | |
98 | + if(components_len < 2) | |
99 | + { | |
100 | + return false; | |
101 | + } | |
102 | + | |
103 | + var components = place.address_components; | |
104 | + var address = ""; | |
105 | + var zip_code = ""; | |
106 | + var city = ""; | |
107 | + var state = ""; | |
108 | + var country_code = ""; | |
109 | + var i = 0; | |
110 | + | |
111 | + for( i =0 ; i < components_len; i ++) | |
112 | + { | |
113 | + | |
114 | + if (components[i].types[0] == 'country') | |
115 | + country_code = components[i].short_name; | |
116 | + else if (components[i].types[0] == 'administrative_area_level_1') | |
117 | + state = components[i].long_name; | |
118 | + else if (components[i].types[0] == 'locality') | |
119 | + city = components[i].long_name; | |
120 | + else if (components[i].types[0] == 'sublocality') | |
121 | + address = components[i].long_name + "-" + address; | |
122 | + else if (components[i].types[0] == "route") | |
123 | + address = components[i].long_name + address; | |
124 | + else if (components[i].types[0] == "street_number") | |
125 | + address = address + "," + components[i].short_name ; | |
126 | + else if (components[i].types[0] == 'postal_code') | |
127 | + zip_code = components[i].short_name; | |
128 | + } | |
129 | + | |
130 | + $('profile_data_country').value = country_code; | |
131 | + $('profile_data_state').value = state; | |
132 | + $('profile_data_address').value = address; | |
133 | + $('profile_data_city').value = city; | |
134 | + $('profile_data_zip_code').value = zip_code; | |
135 | +} | |
136 | + | |
137 | + | |
138 | +function initialize_map() { | |
139 | + geocoder = new google.maps.Geocoder(); | |
140 | + | |
141 | + var lat = <%= profile.lat || 'false' %>; | |
142 | + var lng = <%= profile.lng || 'false' %>; | |
143 | + | |
144 | + if ( !(lat && lng) ) { | |
145 | + lat = -15.7605361485013; | |
146 | + lng = -47.933349609375; | |
147 | + } | |
148 | + | |
149 | + var latlng = new google.maps.LatLng(lat,lng); | |
150 | + | |
151 | + var myOptions = { | |
152 | + zoom: 8, | |
153 | + center: latlng, | |
154 | + mapTypeId: google.maps.MapTypeId.ROADMAP | |
155 | + } | |
156 | + | |
157 | + center = latlng; | |
158 | + | |
159 | + map = new google.maps.Map(document.getElementById("location-map"), myOptions); | |
160 | + | |
161 | + continueLoadMapV3() | |
162 | +} | |
163 | + | |
164 | +function continueLoadMapV3() { | |
165 | + | |
166 | + marker = new google.maps.Marker({ | |
167 | + position: center, | |
168 | + map: map, | |
169 | + draggable: true | |
170 | + }); | |
171 | + | |
172 | + google.maps.event.addListener(marker, "dragend", function() { | |
173 | + move = false; | |
174 | + getAddress(marker.getPosition()); | |
175 | + enable_save(); | |
176 | + }); | |
177 | + | |
178 | +} | |
179 | + | |
180 | +window.onload = initialize_map; | |
181 | + | |
182 | +var delay_autocomplete = 500; | |
183 | + | |
184 | +jQuery.noConflict(); | |
185 | +jQuery(document).ready(function (){ | |
186 | + | |
187 | + jQuery.widget( "custom.catcomplete",jQuery.ui.autocomplete, { | |
188 | + _renderMenu: function( ul, items ) { | |
189 | + var self = this, | |
190 | + currentCategory = ""; | |
191 | + jQuery.each( items, function( index, item ) { | |
192 | + if ( item.category != currentCategory ) { | |
193 | + ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" ); | |
194 | + currentCategory = item.category; | |
195 | + } | |
196 | + self._renderItem( ul, item ); | |
197 | + }); | |
198 | + } | |
199 | + }); | |
200 | + | |
201 | + | |
202 | + jQuery("#profile_data_city").catcomplete({ | |
203 | + source: "../maps/search_city", | |
204 | + minLength: 3, | |
205 | + delay: delay_autocomplete, | |
206 | + select: function( event, ui ) { $('profile_data_state').value =( ui.item ? ui.item.category : this.value ); } | |
207 | + }); | |
208 | + | |
209 | + jQuery("#profile_data_state").autocomplete({ | |
210 | + source: "../maps/search_state", | |
211 | + minLength: 3, | |
212 | + delay: delay_autocomplete | |
213 | + }); | |
214 | + | |
215 | + jQuery("#profile_data_city").keyup(function(){ | |
216 | + | |
217 | + disable_save(); | |
218 | + | |
219 | + }); | |
220 | + | |
221 | + jQuery("#profile_data_state").keyup(function(){ | |
222 | + | |
223 | + disable_save(); | |
224 | + | |
225 | + }); | |
226 | + | |
227 | + jQuery("#profile_data_country").change(function(){ | |
228 | + | |
229 | + disable_save(); | |
230 | + | |
231 | + }); | |
232 | + | |
233 | +}); | |
234 | + | |
235 | +function disable_save() | |
236 | +{ | |
237 | + jQuery('input[type="submit"]').attr("disabled", "true"); | |
238 | + jQuery('input[type="submit"]').val('<%=_("Localize before save")%>'); | |
239 | + jQuery('input[type="submit"]').addClass('disabled'); | |
240 | +} | |
241 | +function enable_save() | |
242 | +{ | |
243 | + jQuery('input[type="submit"]').removeAttr("disabled"); | |
244 | + jQuery('input[type="submit"]').val('<%=_("Save")%>'); | |
245 | + jQuery('input[type="submit"]').removeClass('disabled'); | |
246 | +} | ... | ... |
app/views/maps/_google_map.rhtml
... | ... | @@ -1,282 +0,0 @@ |
1 | -<%= content_tag('script', '', :src => "http://maps.googleapis.com/maps/api/js?sensor=false", :type => 'text/javascript') %> | |
2 | - | |
3 | -<script type="text/javascript" > | |
4 | - | |
5 | - var geocoder; | |
6 | - var map; | |
7 | - var marker; | |
8 | - var center; | |
9 | - var move = true; | |
10 | - var previousCenter; | |
11 | - | |
12 | - function getAddress(latlng) { | |
13 | - $('location-fields').addClassName("loading"); | |
14 | - | |
15 | - if (latlng != null) { | |
16 | - geocoder.geocode( {'latLng': latlng}, showAddress); | |
17 | - } | |
18 | - } | |
19 | - | |
20 | - function codeAddress() { | |
21 | - $('location-fields').addClassName("loading"); | |
22 | - | |
23 | - var country_option = $('profile_data_country').value; | |
24 | - var address = $('profile_data_address').value + "-" + $('profile_data_zip_code').value + "," + $('profile_data_city').value+ "-" + $('profile_data_state').value + "," + country_option; | |
25 | - | |
26 | - if (geocoder) { | |
27 | - geocoder.geocode( { 'address': address}, function(results, status) { | |
28 | - if (status == google.maps.GeocoderStatus.OK) { | |
29 | - map.setCenter(results[0].geometry.location); | |
30 | - marker.setPosition(results[0].geometry.location); | |
31 | - $('profile_data_lat').value = results[0].geometry.location.lat(); | |
32 | - $('profile_data_lng').value = results[0].geometry.location.lng(); | |
33 | - $('location-fields').removeClassName("loading"); | |
34 | - enable_save(); | |
35 | - } else { | |
36 | - $('location-fields').removeClassName("loading"); | |
37 | - alert('<%=_("Address not found, reason:")%>' + translate_status(status)); | |
38 | - } | |
39 | - }); | |
40 | - } | |
41 | - | |
42 | - return false; | |
43 | - } | |
44 | - | |
45 | - function translate_status(status) | |
46 | - { | |
47 | - var translated_status = ''; | |
48 | - | |
49 | - if(google.maps.GeocoderStatus.INVALID_REQUEST == status) | |
50 | - { | |
51 | - translated_status = '<%= _('Invalid address') %>'; | |
52 | - } | |
53 | - | |
54 | - if(google.maps.GeocoderStatus.REQUEST_DENIED == status) | |
55 | - { | |
56 | - translated_status = '<%= _('Request denied') %>'; | |
57 | - } | |
58 | - | |
59 | - if(google.maps.GeocoderStatus.OVER_QUERY_LIMIT == status) | |
60 | - { | |
61 | - translated_status = '<%= _('Over query limit') %>'; | |
62 | - } | |
63 | - | |
64 | - if(google.maps.GeocoderStatus.ZERO_RESULTS == status) | |
65 | - { | |
66 | - translated_status = "<%= _('Address do not exist') %>"; | |
67 | - } | |
68 | - | |
69 | - return translated_status; | |
70 | - } | |
71 | - | |
72 | - function getAddressData() { | |
73 | - var text = ''; | |
74 | - var fields = [ | |
75 | - 'profile_data_country', | |
76 | - 'profile_data_state', | |
77 | - 'profile_data_city', | |
78 | - 'profile_data_address', | |
79 | - 'profile_data_zip_code' | |
80 | - ]; | |
81 | - for (var i = 0; i < fields.length; i++) { | |
82 | - var field = fields[i]; | |
83 | - if ($(field)) { | |
84 | - text += $(field).value + " "; | |
85 | - } | |
86 | - } | |
87 | - return text; | |
88 | - } | |
89 | - | |
90 | - function showAddress(results, status) { | |
91 | - | |
92 | - if (status == google.maps.GeocoderStatus.OK) { | |
93 | - map.setCenter(results[0].geometry.location); | |
94 | - updateFields(results[0]); | |
95 | - | |
96 | - } else { | |
97 | - alert("<%=_("Address not found, reason:")%>" + translate_status(status)); | |
98 | - } | |
99 | - | |
100 | - } | |
101 | - | |
102 | - function updateFields(place) { | |
103 | - var position = marker.getPosition(); | |
104 | - $('profile_data_lat').value = position.lat(); | |
105 | - $('profile_data_lng').value = position.lng(); | |
106 | - $('location-fields').removeClassName("loading"); | |
107 | - | |
108 | - var components_len = place.address_components.size(); | |
109 | - | |
110 | - if(components_len < 2) | |
111 | - { | |
112 | - return false; | |
113 | - } | |
114 | - | |
115 | - var components = place.address_components; | |
116 | - var address = ""; | |
117 | - var zip_code = ""; | |
118 | - var city = ""; | |
119 | - var state = ""; | |
120 | - var country_code = ""; | |
121 | - var i = 0; | |
122 | - | |
123 | - for( i =0 ; i < components_len; i ++) | |
124 | - { | |
125 | - | |
126 | - if(components[i].types[0] == 'country') | |
127 | - { | |
128 | - country_code = components[i].short_name; | |
129 | - } | |
130 | - | |
131 | - if(components[i].types[0] == 'administrative_area_level_1') | |
132 | - { | |
133 | - state = components[i].long_name; | |
134 | - } | |
135 | - | |
136 | - if(components[i].types[0] == 'locality') | |
137 | - { | |
138 | - city = components[i].long_name; | |
139 | - } | |
140 | - | |
141 | - if(components[i].types[0] == 'sublocality') | |
142 | - { | |
143 | - address = components[i].long_name + "-" + address; | |
144 | - } | |
145 | - | |
146 | - if(components[i].types[0] == "route") | |
147 | - { | |
148 | - address = components[i].long_name + address; | |
149 | - } | |
150 | - | |
151 | - | |
152 | - if(components[i].types[0] == "street_number") | |
153 | - { | |
154 | - address = address + "," + components[i].short_name ; | |
155 | - } | |
156 | - | |
157 | - if(components[i].types[0] == 'postal_code') | |
158 | - { | |
159 | - zip_code = components[i].short_name; | |
160 | - } | |
161 | - | |
162 | - } | |
163 | - | |
164 | - $('profile_data_country').value = country_code; | |
165 | - $('profile_data_state').value = state; | |
166 | - $('profile_data_address').value = address; | |
167 | - $('profile_data_city').value = city; | |
168 | - $('profile_data_zip_code').value = zip_code; | |
169 | - } | |
170 | - | |
171 | - | |
172 | - function initialize_map() { | |
173 | - geocoder = new google.maps.Geocoder(); | |
174 | - | |
175 | - var lat = <%= profile.lat || 'false' %>; | |
176 | - var lng = <%= profile.lng || 'false' %>; | |
177 | - | |
178 | - if ( !(lat && lng) ) { | |
179 | - lat = -15.7605361485013; | |
180 | - lng = -47.933349609375; | |
181 | - } | |
182 | - | |
183 | - var latlng = new google.maps.LatLng(lat,lng); | |
184 | - | |
185 | - var myOptions = { | |
186 | - zoom: 8, | |
187 | - center: latlng, | |
188 | - mapTypeId: google.maps.MapTypeId.ROADMAP | |
189 | - } | |
190 | - | |
191 | - center = latlng; | |
192 | - | |
193 | - map = new google.maps.Map(document.getElementById("location-map"), myOptions); | |
194 | - | |
195 | - continueLoadMapV3() | |
196 | - } | |
197 | - | |
198 | - function continueLoadMapV3() { | |
199 | - | |
200 | - marker = new google.maps.Marker({ | |
201 | - position: center, | |
202 | - map: map, | |
203 | - draggable: true | |
204 | - }); | |
205 | - | |
206 | - google.maps.event.addListener(marker, "dragend", function() { | |
207 | - move = false; | |
208 | - getAddress(marker.getPosition()); | |
209 | - }); | |
210 | - | |
211 | - } | |
212 | - | |
213 | - window.onload = initialize_map; | |
214 | - | |
215 | - var delay_autocomplete = 500; | |
216 | - | |
217 | - jQuery.noConflict(); | |
218 | - jQuery(document).ready(function (){ | |
219 | - | |
220 | - jQuery.widget( "custom.catcomplete",jQuery.ui.autocomplete, { | |
221 | - _renderMenu: function( ul, items ) { | |
222 | - var self = this, | |
223 | - currentCategory = ""; | |
224 | - jQuery.each( items, function( index, item ) { | |
225 | - if ( item.category != currentCategory ) { | |
226 | - ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" ); | |
227 | - currentCategory = item.category; | |
228 | - } | |
229 | - self._renderItem( ul, item ); | |
230 | - }); | |
231 | - } | |
232 | - }); | |
233 | - | |
234 | - | |
235 | - jQuery("#profile_data_city").catcomplete({ | |
236 | - source: "../maps/search_city", | |
237 | - minLength: 3, | |
238 | - delay: delay_autocomplete, | |
239 | - select: function( event, ui ) { $('profile_data_state').value =( ui.item ? ui.item.category : this.value ); } | |
240 | - }); | |
241 | - | |
242 | - jQuery("#profile_data_state").autocomplete({ | |
243 | - source: "../maps/search_state", | |
244 | - minLength: 3, | |
245 | - delay: delay_autocomplete | |
246 | - }); | |
247 | - | |
248 | - jQuery("#profile_data_city").keyup(function(){ | |
249 | - | |
250 | - disable_save(); | |
251 | - | |
252 | - }); | |
253 | - | |
254 | - jQuery("#profile_data_state").keyup(function(){ | |
255 | - | |
256 | - disable_save(); | |
257 | - | |
258 | - }); | |
259 | - | |
260 | - jQuery("#profile_data_country").change(function(){ | |
261 | - | |
262 | - disable_save(); | |
263 | - | |
264 | - }); | |
265 | - | |
266 | - }); | |
267 | - | |
268 | - function disable_save() | |
269 | - { | |
270 | - jQuery('input[type="submit"]').attr("disabled", "true"); | |
271 | - jQuery('input[type="submit"]').attr("value", '<%=_("Localize before save")%>'); | |
272 | - jQuery('input[type="submit"]').attr("class", "disabled button icon-save submit"); | |
273 | - } | |
274 | - function enable_save() | |
275 | - { | |
276 | - jQuery('input[type="submit"]').attr("value", '<%=_("Save")%>'); | |
277 | - jQuery('input[type="submit"]').removeAttr("disabled"); | |
278 | - jQuery('input[type="submit"]').attr("class", "button icon-save submit"); | |
279 | - } | |
280 | -</script> | |
281 | - | |
282 | - |
app/views/maps/edit_location.rhtml
... | ... | @@ -17,18 +17,17 @@ |
17 | 17 | <% end %> |
18 | 18 | </div> |
19 | 19 | |
20 | + <p><%= _('Drag the balloon to find the exact location.') %> </p> | |
21 | + | |
20 | 22 | <div style='overflow: hidden'> |
21 | 23 | <p><div id="location-map"></div></p> |
22 | 24 | </div> |
23 | 25 | |
24 | 26 | <%= f.hidden_field(:lat) %> |
25 | 27 | <%= f.hidden_field(:lng) %> |
26 | - | |
27 | - <% button_bar do %> | |
28 | - <%= submit_button 'save', _('Save') %> | |
29 | - <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %> | |
30 | - <% end %> | |
31 | 28 | |
32 | 29 | <% end %> |
33 | 30 | |
34 | -<%= render :partial => 'google_map'%> | |
31 | +<%= content_tag('script', '', :src => "http://maps.googleapis.com/maps/api/js?sensor=false", :type => 'text/javascript') %> | |
32 | +<%= content_tag('script', '', :src => url_for(:controller => :maps, :action => :google_map), :type => 'text/javascript') %> | |
33 | + | ... | ... |