1(function ($, window) { 2 3 var default_latlong = new google.maps.LatLng(41.415,2.082); 4 var input_group = '<div class="input-group locationpicker-group"><div class="dropdown-menu dropdown_map"><div class="map-wrapper"></div></div><div class="input-group-addon"><span class="glyphicon glyphicon-map-marker"></span></div></div>'; 5 var map_height = 200; 6 var initial_zoom = 13; 7 var map_position = 'bottom'; 8 var re_coords = /^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/i; 9 10 var location_fields = ['street_number', 'route', 'locality', 'administrative_area_level_2', 'country', 'postal_code']; 11 //administrative_area_level_2 = city 12 var location_mapping = { 13 'id_street': 'route', 14 'id_street_number': 'street_number', 15 'id_city': 'locality', 16 'id_country': 'country', 17 'id_zip': 'postal_code' 18 } 19 var methods = { 20 init: function(options) { 21 return this.each(function (){ 22 var self = $(this); 23 24 var is_event_form = self.closest('form').attr('id') == 'add_event_form' ? true : false; 25 26 var original_border_radius = self.css('border-bottom-left-radius'); 27 var locationpicker_group = self.parent().parent(); 28 var map_element = locationpicker_group.find('.map_container > .map'); 29 self.data('original_border_radius', original_border_radius ); 30 var input_map = $("#pac-input"); //self.closest('.box-body').find('input[id^=pac-input]'); 31 32 var geocoder = new google.maps.Geocoder; 33 34 methods.hide_map.apply( self ); 35 36 // Init map (and put marker) 37 map_element.css('height', map_height+'px'); 38 39 var gmap = new google.maps.Map( map_element[0], 40 { zoom: initial_zoom, 41 center: default_latlong, 42 mapTypeId: google.maps.MapTypeId.ROADMAP, 43 panControl:false, 44 streetViewControl:false, 45 mapTypeControl:true }); 46 47 var marker = new google.maps.Marker({ map: gmap }); 48 gmap.setZoom(initial_zoom); 49 self.data('gmap', gmap); 50 51 // Set right position 52 methods.check_correct_position.apply( self ); 53 54 // Marker handler 55 google.maps.event.addListener(gmap, 'click', function(evt){ 56 57 deleteAllMarkers(gmap); 58 59 marker = self.data('marker'); 60 if(marker){ 61 marker.setPosition(evt.latLng); 62 } 63 else{ 64 marker = new google.maps.Marker({ position: evt.latLng, map: gmap }); 65 } 66 self.data('marker', marker); 67 var lat = evt.latLng.lat().toFixed(7); 68 var lng = evt.latLng.lng().toFixed(7); 69 self.val( lat+', '+lng ); 70 71 //Reverse geocode 72 var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)}; 73 geocoder.geocode({'location': latlng}, function(results, status){ 74 if (status === google.maps.GeocoderStatus.OK) { 75 if (results[0]) { 76 methods.fill_location_inputs.apply( self.closest('.location-form'), [results[0]]) 77 input_map.val(results[0].formatted_address); 78 } 79 } 80 }) 81 }); 82 83 //autocomplete 84 gmap.controls[google.maps.ControlPosition.TOP_LEFT].push(input_map[0]); 85 // Only Basic Data fields (fill_location_inputs reads address_components): 86 // without 'fields' Google bills every field of the place 87 var autocomplete = new google.maps.places.Autocomplete(input_map[0], { 88 fields: ['address_components', 'geometry', 'name'] 89 }); 90 91 autocomplete.addListener('place_changed', function() { 92 var place = autocomplete.getPlace(); 93 94 if (is_event_form) { 95 methods.fill_location_inputs.apply( self.closest('.location-form'), [place]) 96 } 97 if (place.name != "") { 98 var lat = place.geometry.location.lat().toFixed(7); 99 var lng = place.geometry.location.lng().toFixed(7); 100 101 if (place.geometry.viewport) { 102 gmap.fitBounds(place.geometry.viewport); 103 } else { 104 gmap.setCenter(place.geometry.location); 105 gmap.setZoom(14); 106 } 107 108 marker.setPosition(place.geometry.location); 109 marker.setVisible(true); 110 self.data('marker', marker); 111 self.val(lat+', '+lng) 112 113 methods.update_marker.apply( self ); 114 } 115 }); 116 117 // Focus 118 self.off().on('focus', function(e){ 119 methods.show_map.apply( self ); 120 }) 121 .on('keyup', function(e){ 122 methods.update_marker.apply( self ); 123 }); 124 locationpicker_group.find('.input-group-addon').on('click', function(e){ 125 methods.show_map.apply( $(self) ); 126 }); 127
128 self.on('focus', 'input[id^=pac-input]',function(event) { 129 $(this).keypress(function(event){ 130 if (event.keyCode === 10 || event.keyCode === 13){event.preventDefault()} 131 }) 132 }); 133 134 // Blur 135 $(window).click(function(e){ 136 var lpg = $(e.target).closest('.locationpicker-group'); 137 var me = $(e.target).closest('.map'); 138 if( !lpg.length && !me.length ){ 139 methods.hide_map.apply( self ); 140 } 141 }); 142 }); 143 }, 144 show_map: function(options){ 145 return this.each(function (){ 146 var self = $(this); 147 var gmap = $(this).data('gmap'); 148 var locationpicker_group = $(this).parent().parent(); 149 var input_group_addon = self.parent().find('.input-group-addon'); 150 151 // Round corners 152 if(map_position=='bottom'){ 153 self.css('border-bottom-left-radius', '0px'); 154 input_group_addon.css('border-bottom-right-radius', '0px'); 155 } 156 else if(map_position=='top'){ 157 self.css('border-top-left-radius', '0px'); 158 input_group_addon.css('border-top-right-radius', '0px'); 159 } 160 // Show and refresh 161 locationpicker_group.find('.map_container').show(); 162 $('#pac-input').css('display','block'); 163 google.maps.event.trigger(gmap,'resize'); 164 165 // If value, set initial marker 166 if( self.val().length && re_coords.test(self.val()) ){ 167 var parts = self.val().split(','); 168 var marker_coords = new google.maps.LatLng(parts[0],parts[1]); 169 var marker = self.data('marker'); 170 if(marker){ marker.setPosition(marker_coords); } 171 else{ marker = new google.maps.Marker({ position: marker_coords, map: gmap }); } 172 gmap.setCenter( marker_coords ); 173 self.data('marker', marker); 174 } 175 }); 176 }, 177 update_marker: function(options){ 178 return this.each(function (){ 179 var self = $(this); 180 var gmap = $(this).data('gmap'); 181 var current_position = self.val(); 182 if( self.val().length && re_coords.test(self.val()) ){ 183 var parts = self.val().split(','); 184 var marker_coords = new google.maps.LatLng(parts[0],parts[1]); 185 var marker = self.data('marker'); 186 if(marker){ marker.setPosition(marker_coords); } 187 else{ marker = new google.maps.Marker({ position: marker_coords, map: gmap }); } 188 gmap.setCenter( marker_coords ); 189 self.data('marker', marker); 190 } 191 }); 192 }, 193 hide_map: function(options){ 194 return this.each(function (){ 195 var self = $(this); 196 var locationpicker_group = self.parent().parent(); 197 var input_group_addon = self.parent().find('.input-group-addon'); 198 var original_border_radius = self.data('original_border_radius'); 199 200 locationpicker_group.find('.map_container').hide(); 201 // Round Corners 202 if(map_position=='bottom'){ 203 self.css('border-bottom-left-radius', original_border_radius); 204 input_group_addon.css('border-bottom-right-radius', original_border_radius); 205 } 206 else if(map_position=='top'){ 207 self.css('border-top-left-radius', original_border_radius); 208 input_group_addon.css('border-top-right-radius', original_border_radius); 209 } 210 }); 211 }, 212 check_correct_position: function(options){ 213 return this.each(function (){ 214 var locationpicker_group = $(this).parent().parent(); 215 var map_element = locationpicker_group.find('.map_container > .map'); 216 var bottom_line = $(this).offset().top+$(this).outerHeight(true)+map_height; 217 var window_height = $(window).height(); 218 if( bottom_line > window_height ){ 219 map_position = 'top'; 220 //var to_top = ($(this).outerHeight(true)+map_height)*(-1); 221 //locationpicker_group.find('.map_container').css('margin-top', to_top+'px'); 222 map_element.css('border-bottom-left-radius', 0); 223 map_element.css('border-bottom-right-radius', 0); 224 map_element.css('border-bottom', 0); 225 } 226 else{ 227 map_element.css('border-top-left-radius', 0); 228 map_element.css('border-top-right-radius', 0); 229 map_element.css('border-top', 0); 230 } 231 }); 232 }, 233 234 fill_location_inputs: function(place_object){ 235 var self = $(this); 236 $.each(location_mapping, function(index, el) { 237 var value = get_field_map(place_object.address_components, el); 238 if (value != undefined) { 239 if (el == 'street_number') { 240 var route = self.closest('.box-body').find('#id_street').val(); 241 route = route + ', ' + value; 242 self.closest('.box-body').find('#id_street').val(route); 243 }else{ 244 self.closest('.box-body').find('#'+index).val(value); 245 } 246 } 247 self.closest('.box-body').find('#'+index).prop('readonly', true); 248 }); 249 } 250 } 251 252 function get_field_map(adress_object, type){ 253 var street_number; 254 var val; 255 for (var i in adress_object) { 256 if (adress_object[i].types[0] == type) { 257 if (adress_object[i].long_name != undefined || adress_object[i].long_name != "") { 258 val = adress_object[i].long_name; 259 } 260 } 261 } 262 return val; 263 } 264 265 function deleteAllMarkers(map){ 266 var markers = [] 267 for (var i = 0; i < markers.length; i++) {
268 markers[i].setMap(map); 269 } 270 } 271 272 $.fn.locationpicker = function(methodOrOptions) { 273 if ( methods[methodOrOptions] ) { 274 return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); 275 } 276 else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) { 277 return methods.init.apply( this, arguments ); 278 } 279 else { 280 $.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.tooltip' ); 281 } 282 }; 283 284})(jQuery, window);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.