[10/11/2025] Correction du problème de conflit entre MondialRelay et ColissimoPickupPoint

This commit is contained in:
2025-11-10 23:47:00 +01:00
parent 27d20b1344
commit ce08cfdfb7
3 changed files with 326 additions and 265 deletions

View File

@@ -54,7 +54,8 @@
// Define MAP
var mapOptions = {
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
mapTypeId: google.maps.MapTypeId.ROADMAP,
mapId: "COLISSIMO_MAP_ID"
}
// On va créer la map dans la div qui a l'id relaymap
mapSOC.map = new google.maps.Map(document.getElementById('colissimopickuppointmap'), mapOptions);
@@ -71,11 +72,12 @@
if (status == google.maps.GeocoderStatus.OK) {
// Et on centre la map sur cette position
mapSOC.map.setCenter(results[0].geometry.location);
marker = new google.maps.Marker({
marker = new google.maps.marker.AdvancedMarkerElement({
position: new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng()),
map: mapSOC.map,
icon: "{image file='assets/img/maison.png' source='ColissimoPickupPoint'}"
map: mapSOC.map/*,
icon: "{image file='assets/img/maison.png' source='ColissimoPickupPoint'}"*/
});
if (mapSOC.position != null){
mapSOC.position.setMap(null);
}
@@ -145,10 +147,11 @@
'</td>' +
'</tr>';
marker = new google.maps.Marker({
marker = new google.maps.marker.AdvancedMarkerElement({
position: new google.maps.LatLng(loc.lat, loc.lng),
map: mapSOC.map,
map: mapSOC.map/*,
icon: mapSOC.images[loc.type]
*/
});
mapSOC.listMarker.push(marker);
@@ -397,11 +400,8 @@
</div>
</div>
</div>
<!-- // Search city -->
</div>
</div>
</div>
{/ifloop}
@@ -412,20 +412,52 @@
</tr>
<script>
function loadScript() {
console.log("loadScript");
function loadScript() {
console.log("loadScript ColissimoPickupPoint");
if (window.ModulesGoogleMaps.loading) {
// Si déjà en cours de chargement, ajouter le callback
window.ModulesGoogleMaps.callbacks.push(ColissimoPickupPointInitialize);
return;
}
window.ModulesGoogleMaps.loading = true;
// Callback global qui sera appelé par Google Maps
window.ModulesGoogleMapsCallback = function() {
window.ModulesGoogleMaps.loaded = true;
window.ModulesGoogleMaps.loading = false;
// Exécuter tous les callbacks en attente
window.ModulesGoogleMaps.callbacks.forEach(function(callback) {
callback();
});
window.ModulesGoogleMaps.callbacks = [];
};
var script = document.createElement('script');
script.type = 'text/javascript';
script.defer = true;
script.src = 'https://maps.googleapis.com/maps/api/js'
+ '?callback=ColissimoPickupPointInitialize'
+ '&key={colissimoPickupPointGoogleApiKey}';
+ '?callback=ModulesGoogleMapsCallback'
+ '&libraries=marker'
+ '&key={colissimoPickupPointGoogleApiKey}';
document.body.appendChild(script);
}
if (typeof(google) == 'undefined') {
loadScript();
if (typeof(google) == 'undefined' || typeof(google.maps) == 'undefined') {
if (!window.ModulesGoogleMaps.loaded && !window.ModulesGoogleMaps.loading) {
// Ajouter le callback et charger le script
window.ModulesGoogleMaps.callbacks.push(ColissimoPickupPointInitialize);
loadScript();
console.log('Colissimo : Maps pas encore déclarée');
} else if (window.ModulesGoogleMaps.loading) {
// Script en cours de chargement, ajouter juste le callback
window.ModulesGoogleMaps.callbacks.push(ColissimoPickupPointInitialize);
console.log('Colissimo : Maps déjà déclaré');
}
} else {
ColissimoPickupPointInitialize();
}

View File

@@ -1,135 +1,136 @@
<script type="text/html" id="mondialrelay_ui">
<td colspan="3">
<input type="hidden" name="mondial-relay-selected-delivery-mode" value="none">
{$withHome = false}
{loop type="mondialrelay.delivery-price" name="home-prices" mode="home" country_id=$country state_id=$state}
{$withHome = true}
<div class="row">
<div class="col-sm-4">
<label for="mondialrelay_home">
{form name="thelia.order.delivery"}
{form_field field='delivery-module'}
<label for="delivery-method_{$module_id}_home">
<input type="radio" data-mondial-relay-delivery-mode="home" name="{$name}" id="delivery-method_{$module_id}_home" value="{$module_id}">
<strong>{intl d="mondialrelay.fo.default" l="Mondial Relay home delivery"}</strong>
<br>
<span class="help-block">
{$withHome = true}
<div class="row">
<div class="col-sm-6">
<label for="mondialrelay_home">
{form name="thelia.order.delivery"}
{form_field field='delivery-module'}
<label for="delivery-method_{$module_id}_home">
<input type="radio" data-mondial-relay-delivery-mode="home" name="{$name}" id="delivery-method_{$module_id}_home" value="{$module_id}">
<strong>{intl d="mondialrelay.fo.default" l="Mondial Relay home delivery"}</strong>
<br>
<span class="help-block">
{intl l="Expected delivery date: %delivery_date" delivery_date={format_date date=$DELIVERY_DATE output="date"} d="mondialrelay.fo.default" }
</span>
</label>
{/form_field}
{/form}
</label>
</div>
<div class="col-sm-4 hidden-xs text-center">
{loop type="image" name="deliveryspicture" source="module" source_id=$module_id force_return="true" width="100" height="72"}
<img src="{$IMAGE_URL nofilter}" alt="{$TITLE}">
{/loop}
</div>
<div class="col-sm-4">
<div class="price text-right">
{format_money number=$PRICE symbol={currency attr='symbol'}}
</div>
</div>
{/form_field}
{/form}
</label>
</div>
{/loop}
{$withRelay = false}
{loop type="mondialrelay.delivery-price" name="relay-prices" mode="relay" country_id=$country state_id=$state}
<div {if $withHome}class="pickup-home-separator"{/if}></div>
{$withRelay = true}
<div class="row">
<div class="col-sm-4">
<label for="mondialrelay_pickup">
{form name="thelia.order.delivery"}
{form_field field='delivery-module'}
<label for="delivery-method_{$module_id}_pickup">
<input type="radio" data-mondial-relay-delivery-mode="pickup" name="{$name}" id="delivery-method_{$module_id}_pickup" value="{$module_id}">
<strong>{intl d="mondialrelay.fo.default" l="Mondial Relay pickup location"}</strong>
<br>
<span class="help-block">
{intl l="Expected delivery date: %delivery_date" delivery_date={format_date date=$DELIVERY_DATE output="date"} d="mondialrelay.fo.default" }
</span>
</label>
{/form_field}
{/form}
</label>
</div>
<div class="col-sm-4 hidden-xs text-center">
{loop type="image" name="deliveryspicture" source="module" source_id=$module_id force_return="true" width="100" height="72"}
<img src="{$IMAGE_URL nofilter}" alt="{$TITLE}">
{/loop}
</div>
<div class="col-sm-4">
<div class="price text-right">
{format_money number=$PRICE symbol={currency attr='symbol'}}
</div>
</div>
</div>
<div id="mondial-relay-pickup">
<div class="row">
<div class="location-form clearfix">
<div class="col-md-12">
<h4>{intl d="mondialrelay.fo.default" l="Find a pickup location around you"}</h4>
</div>
{loop type="address" name="adr" id=$address_id}
<div class="col-sm-2">
<input type="text" required class="form-control" id="mondial_relay_zipcode" name="mondial_relay_zipcode" placeholder="{intl l="Zip code" d="mondialrelay.fo.default"}" value="{$ZIPCODE}">
</div>
<div class="col-sm-4">
<input type="text" class="form-control" id="mondial_relay_city" name="mondial_relay_city" placeholder="{intl l="City" d="mondialrelay.fo.default"}" value="{$CITY}">
</div>
<div class="col-sm-3">
<select class="form-control" id="mondial_relay_country_id" name="mondial_relay_country_id">
{loop type="country" name="cntry"}
<option value="{$ID}"{if $COUNTRY == $ID} selected{/if}>{$TITLE}</option>
{/loop}
</select>
</div>
<div class="col-sm-2">
<div class="input-group">
<input type="text" class="form-control" id="mondial_relay_radius" name="mondial_relay_radius" placeholder="{intl l="Search radius" d="mondialrelay.fo.default"}" value="10">
<span class="input-group-addon">{intl d="mondialrelay.fo.default" l="km"}</span>
</div>
</div>
<div class="col-sm-1">
<button id="search-mr-relay" class="form-submit-button btn btn-block btn-default" type="button">{intl d="mondialrelay.fo.default" l="Find"}</button>
</div>
{/loop}
<div class="col-sm-2 hidden-xs text-center">
{loop type="image" name="deliveryspicture" source="module" source_id=$module_id force_return="true" width="100" height="72"}
<img src="{$IMAGE_URL nofilter}" alt="{$TITLE}">
{/loop}
</div>
<div class="col-sm-4">
<div class="price text-right">
{format_money number=$PRICE symbol={currency attr='symbol'}}
</div>
</div>
</div>
{/loop}
{$withRelay = false}
{loop type="mondialrelay.delivery-price" name="relay-prices" mode="relay" country_id=$country state_id=$state}
<div {if $withHome}class="pickup-home-separator"{/if}></div>
{$withRelay = true}
<div class="row">
<div class="col-sm-6">
<label for="mondialrelay_pickup">
{form name="thelia.order.delivery"}
{form_field field='delivery-module'}
<label for="delivery-method_{$module_id}_pickup">
<input type="radio" data-mondial-relay-delivery-mode="pickup" name="{$name}" id="delivery-method_{$module_id}_pickup" value="{$module_id}">
<strong>{intl d="mondialrelay.fo.default" l="Mondial Relay pickup location"}</strong>
<br>
<span class="help-block">
{intl l="Expected delivery date: %delivery_date" delivery_date={format_date date=$DELIVERY_DATE output="date"} d="mondialrelay.fo.default" }
</span>
</label>
{/form_field}
{/form}
</label>
</div>
<div class="col-sm-2 hidden-xs text-center">
{loop type="image" name="deliveryspicture" source="module" source_id=$module_id force_return="true" width="100" height="72"}
<img src="{$IMAGE_URL nofilter}" alt="{$TITLE}">
{/loop}
</div>
<div class="col-sm-4">
<div class="price text-right">
{format_money number=$PRICE symbol={currency attr='symbol'}}
</div>
</div>
</div>
<div id="mondial-relay-pickup">
<div class="row">
<div class="location-form clearfix">
<div class="col-md-12">
<h4>{intl d="mondialrelay.fo.default" l="Find a pickup location around you"}</h4>
</div>
{loop type="address" name="adr" id=$address_id}
<div class="col-sm-2">
<input type="text" required class="form-control" id="mondial_relay_zipcode" name="mondial_relay_zipcode" placeholder="{intl l="Zip code" d="mondialrelay.fo.default"}" value="{$ZIPCODE}">
</div>
<div class="col-sm-4">
<input type="text" class="form-control" id="mondial_relay_city" name="mondial_relay_city" placeholder="{intl l="City" d="mondialrelay.fo.default"}" value="{$CITY}">
</div>
<div class="col-sm-3">
<select class="form-control" id="mondial_relay_country_id" name="mondial_relay_country_id">
{loop type="country" name="cntry"}
<option value="{$ID}"{if $COUNTRY == $ID} selected{/if}>{$TITLE}</option>
{/loop}
</select>
</div>
<div class="col-sm-2">
<div class="input-group">
<input type="text" class="form-control" id="mondial_relay_radius" name="mondial_relay_radius" placeholder="{intl l="Search radius" d="mondialrelay.fo.default"}" value="10">
<span class="input-group-addon">{intl d="mondialrelay.fo.default" l="km"}</span>
</div>
</div>
<div class="col-sm-1">
<button id="search-mr-relay" class="form-submit-button btn btn-block btn-default" type="button">{intl d="mondialrelay.fo.default" l="Find"}</button>
</div>
{/loop}
</div>
</div>
<div class="row">
<div class="col-md-5">
<div id="relay_info">
<p>{intl d="mondialrelay.fo.default" l="Loading..."}</p>
</div>
</div>
<div class="row">
<div class="col-md-5">
<div id="relay_info">
<p>{intl d="mondialrelay.fo.default" l="Loading..."}</p>
</div>
</div>
<div class="col-md-7">
<div id="mondialrelay_map" style="width: 100%; height: 450px;">
</div>
<div class="col-md-7">
<div id="mondialrelay_map" style="width: 100%; height: 450px;">
</div>
</div>
</div>
</div>
{/loop}
</td>
</script>
<script>
$("#delivery-module-{$module_id}").html($('#mondialrelay_ui').html());
jQuery.fn.scrollTo = function(elem, speed) {
@@ -138,8 +139,8 @@
}, speed === undefined ? 1000 : speed);
return this;
};
{if $withRelay}
{if $withRelay}
var MRData = {
markers: [],
map: null,
@@ -151,198 +152,216 @@
{/for}
]
};
/*
function loadScript() {
console.log("loadScript ColissimoPickupPoint");
if (window.ModulesGoogleMaps.loading) {
// Si déjà en cours de chargement, ajouter le callback
window.ModulesGoogleMaps.callbacks.push(mondialRelaySetup);
return;
}
window.ModulesGoogleMaps.loading = true;
// Callback global qui sera appelé par Google Maps
window.ModulesGoogleMapsCallback = function() {
window.ModulesGoogleMaps.loaded = true;
window.ModulesGoogleMaps.loading = false;
// Exécuter tous les callbacks en attente
window.ModulesGoogleMaps.callbacks.forEach(function(callback) {
callback();
});
window.ModulesGoogleMaps.callbacks = [];
};
var script = document.createElement('script');
script.type = 'text/javascript';
script.defer = true;
script.src = 'https://maps.googleapis.com/maps/api/js'
+ '?callback=mondialRelaySetup'
+ '?callback=ModulesGoogleMapsCallback'
+ '&libraries=marker'
+ '&key={module_config module="MondialRelay" key="google_maps_api_key" locale="en_US"}';
script.async = true;
document.body.appendChild(script);
}
*/
function loadRelayMap() {
var $relayInfo = $('#relay_info');
MRData.bounds = new google.maps.LatLngBounds();
MRData.bounds = new google.maps.LatLngBounds();
for(var idx = 0; idx < MRData.markers.length; idx++) {
MRData.markers[idx].setMap(null);
}
MRData.markers.length = 0;
$relayInfo.html('');
$.ajax({
url: "{url path="MondialRelay/relay-map"}",
data : {
country_id: $('#mondial_relay_country_id').val(),
country_id: $('#mondial_relay_country_id').val(),
city: $('#mondial_relay_city').val(),
zipcode: $('#mondial_relay_zipcode').val(),
radius: $('#mondial_relay_radius').val()
},
success: function(data) {
var html, item, opening, marker;
if (data.error !== '') {
var errMsg = "{intl d="mondialrelay.fo.default" l="Sorry, we failed to get pickup locations. Error is : __ERR__." js=1}";
alert(errMsg.replace('__ERR__', data.error));
} else if (data.points.length === 0) {
html = '<div class="alert alert-danger">{intl d="mondialrelay.fo.default" l="No pickup locations were found for this address." js=1}</div>';
} else {
html = '<table class="pickup-points">';
// Build point data and map points from json data
for (var idx = 0; idx < data.points.length; idx++) {
item = data.points[idx];
marker = new google.maps.Marker({
map: MRData.map,
position: new google.maps.LatLng(item.latitude, item.longitude),
title: (idx + 1) + ' : ' + item.name,
icon: MRData.pinImages[idx],
relay_id: item.id
});
google.maps.event.addListener(marker, 'click', function () {
$relayInfo.scrollTo("#pickup-point-" + this.relay_id);
});
MRData.bounds.extend(marker.getPosition());
MRData.markers.push(marker);
html +=
'<tr class="pickup-point" data-pickup-id="' + item.id + '" id="pickup-point-' + item.id + '">'
+ '<td>'
+ ' <label for="" class="name">'
+ ' <span class="numero">' + (idx + 1) + '</span> ' + item.name + ' (' + item.distance_km + ' km)'
+ ' </label>'
+ ' <div class="address">' + item.address + '</div>'
+ ' <div class="zipcode">' + item.zipcode + ' ' + item.city + '</div>'
;
if (item.openings.length > 0) {
html += '<table class="opening-hours">';
for (var jdx = 0; jdx < item.openings.length; jdx++) {
opening = item.openings[jdx];
html += '<tr>';
html += '<td class="day">' + opening.day + '</td> ';
if (opening.opening_time_1 !== undefined) {
html += '<td>' + opening.opening_time_1 + ' - ' + opening.closing_time_1 + '</td>';
}
if (opening.opening_time_2 !== undefined) {
html += '<td>' + opening.opening_time_2 + ' - ' + opening.closing_time_2 + '</td>';
}
html += '</tr>';
},
success: function(data) {
var html, item, opening, marker;
if (data.error !== '') {
var errMsg = "{intl d="mondialrelay.fo.default" l="Sorry, we failed to get pickup locations. Error is : __ERR__." js=1}";
alert(errMsg.replace('__ERR__', data.error));
} else if (data.points.length === 0) {
html = '<div class="alert alert-danger">{intl d="mondialrelay.fo.default" l="No pickup locations were found for this address." js=1}</div>';
} else {
html = '<table class="pickup-points">';
// Build point data and map points from json data
for (var idx = 0; idx < data.points.length; idx++) {
item = data.points[idx];
marker = new google.maps.marker.AdvancedMarkerElement({
map: MRData.map,
position: new google.maps.LatLng(item.latitude, item.longitude),
title: (idx + 1) + ' : ' + item.name
});
google.maps.event.addListener(marker, 'click', function () {
$relayInfo.scrollTo("#pickup-point-" + this.relay_id);
});
MRData.bounds.extend(marker.position);
MRData.markers.push(marker);
html +=
'<tr class="pickup-point" data-pickup-id="' + item.id + '" id="pickup-point-' + item.id + '">'
+ '<td>'
+ ' <label for="" class="name">'
+ ' <span class="numero">' + (idx + 1) + '</span> ' + item.name + ' (' + item.distance_km + ' km)'
+ ' </label>'
+ ' <div class="address">' + item.address + '</div>'
+ ' <div class="zipcode">' + item.zipcode + ' ' + item.city + '</div>'
;
if (item.openings.length > 0) {
html += '<table class="opening-hours">';
for (var jdx = 0; jdx < item.openings.length; jdx++) {
opening = item.openings[jdx];
html += '<tr>';
html += '<td class="day">' + opening.day + '</td> ';
if (opening.opening_time_1 !== undefined) {
html += '<td>' + opening.opening_time_1 + ' - ' + opening.closing_time_1 + '</td>';
}
html += '</table>';
if (opening.opening_time_2 !== undefined) {
html += '<td>' + opening.opening_time_2 + ' - ' + opening.closing_time_2 + '</td>';
}
html += '</tr>';
}
html += '</td>';
html += '<td><input type="radio" name="mondialrelay_relay" value="' + item.id + '"></td>';
html += '</tr>';
html += '</table>';
}
html += '</table>';
html += '</td>';
html += '<td><input type="radio" name="mondialrelay_relay" value="' + item.id + '"></td>';
html += '</tr>';
}
$relayInfo.html(html);
// View all markers
MRData.map.fitBounds(MRData.bounds);
},
error: function() {
alert("{intl d="mondialrelay.fo.default" l="Oops, something goes wrong, please try again." js=1}")
html += '</table>';
}
});
$relayInfo.html(html);
// View all markers
MRData.map.fitBounds(MRData.bounds);
},
error: function() {
alert("{intl d="mondialrelay.fo.default" l="Oops, something goes wrong, please try again." js=1}")
}
});
}
/*
if (typeof(google) === 'undefined') {
loadScript();
if (typeof(google) == 'undefined' || typeof(google.maps) == 'undefined') {
if (!window.ModulesGoogleMaps.loaded && !window.ModulesGoogleMaps.loading) {
// Ajouter le callback et charger le script
window.ModulesGoogleMaps.callbacks.push(mondialRelaySetup);
loadScript();
console.log('MR : Maps pas encore déclarée');
} else if (window.ModulesGoogleMaps.loading) {
// Script en cours de chargement, ajouter juste le callback
window.ModulesGoogleMaps.callbacks.push(mondialRelaySetup);
console.log('MR : Maps déjà déclaré');
}
} else {
mondialRelaySetup();
}
*/
function mondialRelaySetup() {
// Google Map
var MRData_mapOptions = {
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
mapTypeId: google.maps.MapTypeId.ROADMAP,
mapId: "MONDIALRELAY_MAP_ID"
};
MRData.map = new google.maps.Map(document.getElementById('mondialrelay_map'), MRData_mapOptions);
MRData.geocoder = new google.maps.Geocoder();
// Center map on the current customer address
{loop type="address" name="adr" id=$address_id}
var MRDataAddress = [];
MRDataAddress['address'] = "{$ADDRESS1|replace:'"':'\\"'}, {$ZIPCODE} {$CITY|replace:'"':'\\"'}";
MRData.geocoder.geocode(MRDataAddress, function (results, status) {
if (status === google.maps.GeocoderStatus.OK) {
MRData.map.setCenter(results[0].geometry.location);
marker = new google.maps.Marker({
marker = new google.maps.marker.AdvancedMarkerElement({
position: new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng()),
map: MRData.map,
icon: "{image file='mondialrelay/assets/img/maison.png' source='MondialRelay'}"
map: MRData.map/*,
icon: "{image file='mondialrelay/assets/img/maison.png' source='MondialRelay'}"*/
});
} else {
// Sinon on met le centre de la map sur Clermont-Ferrand ;)
alert("{intl d="mondialrelay.fo.default" l="Current address can't be geolocated" js=1}");
var myLatLng = new google.maps.LatLng(45.7789, 3.0782);
MRData.map.setCenter(myLatLng);
MRData.map.setZoom(3);
}
});
{/loop}
loadRelayMap();
$(document).on('click', '.pickup-point', function(ev) {
var pointId = $(this).data('pickup-id');
$('input[value='+pointId+']').prop("checked", true)
});
$('#search-mr-relay').off().click(function(ev) {
loadRelayMap();
});
$("#form-cart-delivery").off('submit').submit(function(ev) {
if ($('[data-mondial-relay-delivery-mode=pickup]').is(':checked')
&&
$('input[name=mondialrelay_relay]:checked').length === 0) {
alert("{intl d="mondialrelay.fo.default" l="Please select a pickup location." js=1}");
ev.preventDefault();
}
});
}
{/if}
$('[data-mondial-relay-delivery-mode]').change(function() {
$('input[name=mondial-relay-selected-delivery-mode]').val($(this).data('mondial-relay-delivery-mode'));
});
// Hide / Show pickeup selection UI
$('input[type=radio]').click(function() {
if ($('[data-mondial-relay-delivery-mode=pickup]').is(':checked')) {
$('#mondial-relay-pickup').slideDown('fast');
// Show a descent map
MRData.map.fitBounds(MRData.bounds);
} else {
$('#mondial-relay-pickup').slideUp('fast');
$(document).on('click', '.pickup-point', function(ev) {
var pointId = $(this).data('pickup-id');
$('input[value='+pointId+']').prop("checked", true)
});
$('#search-mr-relay').off().click(function(ev) {
loadRelayMap();
});
$("#form-cart-delivery").off('submit').submit(function(ev) {
if ($('[data-mondial-relay-delivery-mode=pickup]').is(':checked')
&&
$('input[name=mondialrelay_relay]:checked').length === 0) {
alert("{intl d="mondialrelay.fo.default" l="Please select a pickup location." js=1}");
ev.preventDefault();
}
});
}
});
{/if}
$('[data-mondial-relay-delivery-mode]').change(function() {
$('input[name=mondial-relay-selected-delivery-mode]').val($(this).data('mondial-relay-delivery-mode'));
});
// Hide / Show pickeup selection UI
$('input[type=radio]').click(function() {
if ($('[data-mondial-relay-delivery-mode=pickup]').is(':checked')) {
$('#mondial-relay-pickup').slideDown('fast');
// Show a descent map
MRData.map.fitBounds(MRData.bounds);
} else {
$('#mondial-relay-pickup').slideUp('fast');
}
});
</script>

View File

@@ -151,6 +151,16 @@
{block name="javascript-initialization"}
<script>
// Namespace global pour gérer Google Maps entre modules
window.ModulesGoogleMaps = window.ModulesGoogleMaps || {
loaded: false,
loading: false,
callbacks: []
};
</script>
<script type="text/javascript">
jQuery(function($) {
$('.js-change-delivery-address').change(function(e) {