· 5 years ago · May 12, 2020, 05:42 PM
1/**
2 * NOTICE OF LICENSE.
3 *
4 * @file Get Google Maps Place API and select your path
5 *
6 * This source file is subject to a commercial license from Agence Malttt SAS
7 * Use, copy, modification or distribution of this source file without written
8 * license agreement from the Agence Malttt SAS is strictly forbidden.
9 * INFORMATION SUR LA LICENCE D'UTILISATION
10 * L'utilisation de ce fichier source est soumise a une licence commerciale
11 * concedee par la societe Agence Malttt SAS
12 * Toute utilisation, reproduction, modification ou distribution du present
13 * fichier source sans contrat de licence ecrit de la part d'Agence Malttt SAS est expressement interdite.
14 *
15 * @author Matthieu Deroubaix
16 * @copyright Copyright (c) 2015-2016 Agence Malttt SAS - 90 Rue faubourg saint martin - 75010 Paris
17 * @license Commercial license
18 * Support by mail : support@agence-malttt.fr
19 * Phone : +33.972535133
20 */
21
22var placeSearch, autocomplete, autocompleteListener;
23window.autogoogleplace = [];
24
25var componentForm = {
26 street_number: 'short_name',
27 premise: 'short_name',
28 route: 'short_name',
29 sublocality_level_1: 'long_name',
30 locality: 'long_name',
31 sublocality: 'long_name',
32 neighborhood: 'long_name',
33 postal_code: 'short_name',
34 administrative_area_level_1: 'long_name',
35 administrative_area_level_2: 'short_name',
36 country: 'long_name'
37};
38
39function initialize_autogoogleplace() {
40 if(document.getElementById(window.autogoogleplace.id_address_input)){
41
42 if(typeof google == "undefined"){
43 return false;
44 }
45
46 resetGoogleAutocomplete();
47
48 /*Reestricción por pais*/
49 var restriction = {
50 types: ["geocode"], /*Listar todas las ciudades, estados y regiones del país.*/
51 componentRestrictions: {country: "pe"} /*pais*/
52 };
53
54
55 /*if (typeof autogoogleplace_country_filter !== 'undefined' && typeof autogoogleplace_countries !== 'undefined' && autogoogleplace_countries.length > 0 && parseInt(autogoogleplace_country_filter) == 1) {
56 var restriction = { types: ['geocode'], componentRestrictions: { country: autogoogleplace_countries } };
57 } else {
58 var restriction = { types: ['geocode'] };
59 }*/
60
61 autocomplete = new google.maps.places.Autocomplete(
62 (document.getElementById(window.autogoogleplace.id_address_input)),
63 restriction
64
65
66 );
67
68 // Future v2
69 // geoPlace(window.autogoogleplace.id_address_input);
70
71 autocompleteListener = google.maps.event.addListener(autocomplete, 'place_changed', function() {
72
73 var inputAutocomplete = document.getElementById(window.autogoogleplace.id_address_input);
74
75
76
77
78 // binding and resetting values
79 if($('#'+window.autogoogleplace.id_address_input).closest('form').find('input[type="text"][id*="city"]').length > 0){
80
81 window.autogoogleplace.city_input = $('#'+window.autogoogleplace.id_address_input).closest('form').find('input[type="text"][id*="city"]').eq(0).attr('id');
82 document.getElementById(window.autogoogleplace.city_input).value = "";
83 $('#'+window.autogoogleplace.city_input).prop('readonly', true);
84 }
85
86 if($('#'+window.autogoogleplace.id_address_input).closest('form').find('input[type="text"][id*="address2"]').length > 0){
87 window.autogoogleplace.address2_input = $('#'+window.autogoogleplace.id_address_input).closest('form').find('input[type="text"][id*="address2"]').eq(0).attr('id');
88 document.getElementById(window.autogoogleplace.address2_input).value = "";
89 }
90
91 if($('#'+window.autogoogleplace.id_address_input).closest('form').find('input[type="text"][id*="postcode"]').length > 0){
92 window.autogoogleplace.postcode_input = $('#'+window.autogoogleplace.id_address_input).closest('form').find('input[type="text"][id*="postcode"]').eq(0).attr('id');
93 document.getElementById(window.autogoogleplace.postcode_input).value = "";
94 }
95
96 if($('#'+window.autogoogleplace.id_address_input).closest('form').find('select[id*="country"]').length > 0){
97
98 window.autogoogleplace.country_input = $('#'+window.autogoogleplace.id_address_input).closest('form').find('select[id*="country"]').eq(0).attr('id');
99 }
100
101 var returnFill = fillInAddress();
102 google.maps.event.clearListeners(inputAutocomplete, "focus");
103 google.maps.event.clearListeners(inputAutocomplete, "blur");
104
105
106
107 return loadAddressHelper();
108
109 });
110
111 }
112}
113
114function resetGoogleAutocomplete() {
115 if (autocomplete !== undefined) {
116 google.maps.event.removeListener(autocompleteListener);
117 google.maps.event.clearInstanceListeners(autocomplete);
118 $(".pac-container").remove();
119 }
120 $('#'+window.autogoogleplace.city_input).prop('readonly', true);
121}
122
123function fillInAddress() {
124
125 var place = autocomplete.getPlace();
126 var street = false;
127 var city = false;
128 var state = false;
129 var temp_array = [];
130
131 for (var component in componentForm) {
132
133 if(document.getElementById(component)){
134
135 document.getElementById(component).value = '';
136 document.getElementById(component).disabled = false;
137
138 }
139
140 }
141
142 if(typeof place !== 'undefined' && typeof place.address_components !== 'undefined'){
143
144 for (var i = 0; i < place.address_components.length; i++) {
145
146 var addressType = place.address_components[i].types[0];
147
148 if (componentForm[addressType]) {
149
150 var val = place.address_components[i][componentForm[addressType]];
151
152 if (typeof val != "undefined" && val){
153
154 if (addressType == "premise") {
155 temp_array.push(val + "/");
156 }
157
158 if (addressType == "street_number") {
159 temp_array.push(val + " ");
160 }
161
162 if (addressType == "route") {
163 temp_array.push(val);
164 }
165
166 if (addressType == "locality") {
167 city = val;
168 //$('#'+window.autogoogleplace.city_input).prop('readonly', true);
169 }
170
171 if (typeof window.autogoogleplace.address2_input !== 'undefined' && addressType == "sublocality_level_1") {
172 document.getElementById(window.autogoogleplace.address2_input).value = val;
173 $('#'+window.autogoogleplace.address2_input).trigger('keypress').trigger('blur');
174 }
175
176 if (typeof window.autogoogleplace.postcode_input !== 'undefined' && addressType == "postal_code") {
177 document.getElementById(window.autogoogleplace.postcode_input).value = val;
178 $('#'+window.autogoogleplace.postcode_input).trigger('keypress').trigger('blur');
179 }
180
181 if (typeof window.autogoogleplace.country_input !== 'undefined' && addressType == "country") {
182
183 $("#"+window.autogoogleplace.country_input+' option:contains('+val+')').prop('selected', true).click().change();
184 }
185
186 /*if (addressType == "administrative_area_level_1") {
187 state = val;
188 }*/
189
190 // For second area, not used in most country but can't harm to indicate it
191 if (typeof autogoogleplace_active_address2 !== 'undefined' && parseInt(autogoogleplace_active_address2) == 1) {
192 if (typeof window.autogoogleplace.address2_input !== 'undefined' && addressType == "administrative_area_level_2") {
193 document.getElementById(window.autogoogleplace.address2_input).value = val;
194 $(window.autogoogleplace.address2_input).trigger('keyup').trigger('keypress').trigger('blur');
195 }
196 }
197
198 }
199 }
200 }
201
202 street = temp_array.join('');
203
204 }
205
206 // Better version, not always available, so we kept fallback
207 if (typeof place.name !== 'undefined') {
208
209 street = place.name;
210
211 }
212
213 if (typeof place.adr_address !== 'undefined') {
214
215 // It's HTML
216 var html_place = $('<div />').html(place.adr_address);
217 var res_street = html_place.find('.street-address');
218 var res_city = html_place.find('.locality');
219
220 if( res_street.length >= 1 && res_street.text().length > 1 ) {
221 street = res_street.text();
222 }
223
224 if( res_city.length >= 1 && res_city.text().length > 1 ) {
225 city = res_city.text();
226 }
227
228 }
229
230 /*if (city) {
231 document.getElementById(window.autogoogleplace.city_input).value = city;
232 $('#'+window.autogoogleplace.city_input).trigger('keyup').trigger('keypress').trigger('blur');
233 }*/
234
235 if (street) {
236 document.getElementById(window.autogoogleplace.id_address_input).value = street;
237 $('#'+window.autogoogleplace.id_address_input+',#'+window.autogoogleplace.city_input+',#'+window.autogoogleplace.postcode_input).addClass('input-success');
238 }
239
240 if (state) {
241
242 // Wait for UI update
243 $temp_state = state;
244 setTimeout(function(){ setStateInput($temp_state); }, 2500);
245 }
246
247 // Bugfix uniform.js
248 if (typeof $.uniform == 'object') {
249 $.uniform.update();
250 }
251
252
253}
254
255function setStateInput(state) {
256
257 $state_input = $('#'+window.autogoogleplace.id_address_input).closest('form').find('select[id*="state"]');
258
259 if ($state_input.length) {
260
261 $selected_option = $state_input.find("option:contains('"+state.replace('-', ' ')+"'), option:contains('"+state+"')")
262
263 if ($selected_option.length) {
264
265 $selected_option
266 .prop('selected', true)
267 .click()
268 .change();
269
270 }
271
272 }
273
274}
275
276/*
277Future version v3, activate at your own risk
278function geoPlace(window.autogoogleplace.id_address_input) {
279
280 if(window.autogoogleplace.id_address_input && typeof google.maps !== 'undefined' && typeof google.maps.Geocoder !== "undefined") {
281
282 var geocoder = new google.maps.Geocoder;
283
284 if (typeof navigator.geolocation !== "undefined") {
285 navigator.geolocation.getCurrentPosition(function(position) {
286 var pos = {
287 lat: position.coords.latitude,
288 lng: position.coords.longitude
289 };
290 geocoder.geocode({'location': pos}, function(results, status) {
291 if (status === 'OK') {
292 if (typeof results[0] !== 'undefined' && results[0].formatted_address) {
293 document.getElementById(window.autogoogleplace.id_address_input).value = results[0].formatted_address;
294 }
295 }
296 });
297 }, function() {
298 console.log('unable to detect location');
299 });
300 }
301
302 }
303
304}
305*/
306
307function loadAddressHelper(){
308
309 if($('#address1').length > 0){
310 window.autogoogleplace.id_address_input = 'address1';
311
312 } else if ($('input[name*="address1"]').length > 0) {
313
314 // 1.7 classic theme ?
315 var inputs_to_check = ['address1','address2','city','postcode']
316 var selects_to_check = ['country', 'state'];
317
318 for (var i = inputs_to_check.length - 1; i >= 0; i--) {
319 if ($('input[name*="'+inputs_to_check[i]+'"]').length > 0 && typeof $('input[name*="'+inputs_to_check[i]+'"]').attr('id') == 'undefined') {
320 $('input[name*="'+inputs_to_check[i]+'"]').attr('id','autogoogleplace-'+inputs_to_check[i]);
321 }
322 }
323
324 for (var i = selects_to_check.length - 1; i >= 0; i--) {
325 if ($('select[name*="'+selects_to_check[i]+'"]').length > 0 && typeof $('select[name*="'+selects_to_check[i]+'"]').attr('id') == 'undefined') {
326 $('select[name*="'+selects_to_check[i]+'"]').attr('id','autogoogleplace-'+selects_to_check[i]);
327 }
328 }
329
330 window.autogoogleplace.id_address_input = $('input[name*="address1"]').attr('id');
331
332 }else if($('input#address').length > 0){
333 window.autogoogleplace.id_address_input = 'address';
334 }else if($('#street').length > 0){
335 window.autogoogleplace.id_address_input = 'street';
336 }else if($('#road').length > 0){
337 window.autogoogleplace.id_address_input = 'road';
338 }else if($('input[type="text"][id*="address"]').length > 0){
339 window.autogoogleplace.id_address_input = $('input[type="text"][id*="address"]').eq(0).attr('id');
340 }else if($('textarea[id*="address"]').length > 0){
341 window.autogoogleplace.id_address_input = $('textarea[id*="address"]').eq(0).attr('id');
342 }
343
344 if(typeof window.autogoogleplace.id_address_input != 'undefined'){
345 initialize_autogoogleplace();
346
347 var gmap_input_selected = document.getElementById(window.autogoogleplace.id_address_input);
348 google.maps.event.addDomListener(gmap_input_selected, 'keydown', function(e) {
349 if (e.keyCode == 13) {
350 e.preventDefault();
351 }
352 });
353 // Prevent some misunderstanding
354 $(window.autogoogleplace.id_address_input).attr('autocomplete','off');
355 }
356}
357
358function loadAutogoogleWrapper() {
359
360 if (checkGooglePlaceCompatibility() === true) {
361
362 // CSS Fix with Prestashop 1.7 stretching some places
363 if ($('body#checkout .container').css('min-height') == '100%') {
364 $('body#checkout .container').css({ minHeight: 'auto' });
365 }
366
367 loadAddressHelper();
368
369 // Hack ajax loading in authentication page for certain configuration
370 // with 5 step checkout and address when ajax on authentication
371 $(document)
372 .on('click keypress', '#SubmitCreate', function() {
373
374 resetGoogleAutocomplete();
375
376 setTimeout(function() {
377 loadAddressHelper();
378 }, 3500);
379
380 })
381 .on('change', 'select[name="id_country"]', function() {
382
383 // Bugfix after some late JS loading in prestashop 1.7
384 setTimeout(function() {
385 loadAddressHelper();
386 }, 2500);
387
388 });
389
390 }
391
392}
393
394function checkGooglePlaceCompatibility() {
395 if (typeof google !== 'undefined' && typeof google.maps !== 'undefined' && typeof google.maps.places !== 'undefined' && typeof google.maps.places.Autocomplete !== 'undefined') {
396 return true;
397 } else {
398 return false;
399 }
400}
401
402(function(app) {
403
404 app.loadAutoPlace = function() {
405 loadAutogoogleWrapper();
406 };
407
408 app.loadGoogleMapsScript = function () {
409
410 if (typeof mapsapikey !== 'undefined') {
411
412 if (checkGooglePlaceCompatibility() === false) {
413
414 var script = document.createElement('script');
415 script.type = 'text/javascript';
416 script.src = 'https://maps.googleapis.com/maps/api/js?libraries=places&' +
417 'callback=app.loadAutoPlace' +
418 '&key='+mapsapikey;
419 document.body.appendChild(script);
420
421 } else {
422 loadAutogoogleWrapper();
423 }
424
425 } else {
426 alert('Please define your Google Maps API Key in Autogooglesuggest module backoffice.');
427 }
428
429 };
430
431}(window.app = window.app || {}));
432
433window.onload = app.loadGoogleMapsScript;
434
435setTimeout(function() {
436 // Hack againts late loader
437 if (typeof loadAutogoogleWrapper !== 'undefined') {
438 window.app.loadGoogleMapsScript();
439 }
440}, 750);