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 | + | ... | ... |