PageSourceSearch

https://www.cbd.fr/modules/storelocator/views/js/stores_17.js?v=1790061811

js cbd.fr collected 2026-09-26 15:49:04 UTC 24,044 bytes, 621 lines download raw bytes

1/*
2*
3* DISCLAIMER
4*
5* Do not edit or add to this file.
6* You are not authorized to modify, copy or redistribute this file.
7* Permissions are reserved by FME Modules.
8*
9*  @author    FMM Modules
10*  @copyright FME Modules 2021
11*  @license   Single domain
12*/
13
14var $_slBox = $('.fmeSearchbyProduct');//$('#fmeSearchProduct');
15var sl_url = search_link;
16var autocompleteOptions = {
17    url: search_url,
18    dataType: 'json',
19    theme: "bootstrap",
20    ajaxSettings : {
21        method : 'POST',
22    },
23    placeholder: placeholder_label,
24    requestDelay: 300,
25    preparePostData: function(data, inputPhrase) {
26        data = {
27            ajax: true,
28            s: inputPhrase,
29            resultsPerPage: 10,
30            action: 'searchStoreProduct',
31        };
32        return data;
33    },
34    getValue:function(element) {
35        return element.name;
36    },
37    list: {
38        maxNumberOfElements: 10,
39        onClickEvent: function() {
40            var responseData = $_slBox.getSelectedItemData();
41            var _id_sl = responseData.id_product;
42            var _name_sl = responseData.name;
43            $('#fmeSearchProduct').attr('value', _name_sl);
44            $('#fmeSearchProduct').attr('name',_id_sl);
45            $('#fmeSearchProduct').attr('placeholder',_name_sl);
46        },
47    },
48};
49
50$(document).ready(function () {
51    initMap();
52
53    $_slBox.easyAutocomplete(autocompleteOptions);
54
55    // check if pickup from store is enabled
56    if (FMESL_PICKUP_STORE == 1) {
57        if ($.inArray(st_page, ['order', 'orderopc']) >= 0) {
58            checkCarrier($('.delivery-options').find('input[type=radio]:checked').val());
59        }
60
61        prestashop.on('updatedDeliveryForm', function(event) {
62            checkCarrier(event.dataForm[0].value);
63        });
64    }
65});
66
67$(document).on('change', '#locationSelect', function(e){
68    fmmSlTriggerStore($(this).val());
69});
70
71function initMarkers() {
72    searchUrl += '?ajax=1&all=1';
73    downloadUrl(searchUrl, function(data) {
74        var xml = parseXml($.trim(data));
75        var markerNodes = xml.documentElement.getElementsByTagName('marker');
76        var bounds = new google.maps.LatLngBounds();
77        if (FMESL_LAYOUT_THEME > 0) {
78            $('#fmmsl_split_list').html('<ul></ul>');
79            clearLocations(markerNodes.length);
80        }
81        for (var i = 0; i < markerNodes.length; i++) {
82            var name = markerNodes[i].getAttribute('name');
83            var address = markerNodes[i].getAttribute('address');
84            var addressNoHtml = markerNodes[i].getAttribute('addressNoHtml');
85            var other = markerNodes[i].getAttribute('other');
86            var id_store = markerNodes[i].getAttribute('id_store');
87            var phone = markerNodes[i].getAttribute('phone');
88            var link = markerNodes[i].getAttribute('link');
89            var email = markerNodes[i].getAttribute('email');
90            var fax = markerNodes[i].getAttribute('fax');
91            var note = markerNodes[i].getAttribute('note');
92            var has_store_picture = markerNodes[i].getAttribute('has_store_picture');
93            var latlng = new google.maps.LatLng(
94            parseFloat(markerNodes[i].getAttribute('lat')),
95            parseFloat(markerNodes[i].getAttribute('lng')));
96            createMarker(latlng, name, address, other, id_store, has_store_picture, email, fax, note);
97            if (FMESL_LAYOUT_THEME > 0) {
98            $('#fmmsl_split_list ul').append('<li><a href="javascript:void(0);" onclick="fmmSlTriggerStore('+i+');" title="'+name+'">'+name+'</a><p>'+
99                addressNoHtml+(FMESL_STORE_FAX && fax !== '' ? '<br />'+translation_8+' '+fax : '')+'</p>'+(FMESL_MAP_LINK > 0 ? '<br /><a href="'+link+'" class="button btn btn-primary fmmsl_storeview">'+translation_11+'</a></li>' : ''));
100            }
101            bounds.extend(latlng);
102        }
103    });
104}
105
106function searchLocations() {
107    $('#stores_loader').show();
108    var address = document.getElementById('addressInput').value;
109    var geocoder = new google.maps.Geocoder();
110
111    geocoder.geocode({address: address}, function(results, status) {
112        if (status === google.maps.GeocoderStatus.OK){
113            searchLocationsNear(results[0].geometry.location);
114        } else {
115            alert(address + ' ' + translation_6);
116        }
117        $('#stores_loader').hide();
118    });
119}
120
121function clearLocations(n, clear) {
122    infoWindow.close();
123    for (var i = 0; i < markers.length; i++) {
124        markers[i].setMap(null);
125    }
126    markers.length = 0;
127
128    if (parseInt(FMESL_LAYOUT_THEME) <= 0 || (typeof locationSelect != 'undefined')) {
129
130        if (typeof clear !== 'undefined' && clear && $('#locationSelect').length) {
131            clearShopOptions('locationSelect');
132        }
133
134        $(locationSelect).show();
135        var option = $("<option></option>");
136            $(option).val('none');
137            $(option).html('--');
138        if (!n) {
139            $(option).html(translation_1);
140        } else {
141            if (n === 1) {
142                $(option).html(`1 ${translation_2}`);
143            } else {
144                $(option).html(`${n} ${translation_3}`);
145            }
146        }
147        $(locationSelect).append(option);
148        //locationSelect.appendChild(option);
149        $('#stores-table tr.node').remove();
150    }
151}
152
153function searchLocationsNear(center) {
154    var radius = document.getElementById('radiusSelect').value;
155    var productID = $('#fmeSearchProduct').attr('name');
156    if (typeof(productID) == 'undefined' || productID == null) {
157        productID = '';
158    }
159    //var searchUrl = prestashop.urls.current_url + '?ajax=1&latitude=' + center.lat() + '&longitude=' + center.lng() + '&radius=' + radius+'&product='+productID;
160    searchUrl += '?ajax=1&all=0&latitude=' + center.lat() + '&longitude=' + center.lng() + '&radius=' + radius+'&product='+productID;
161    downloadUrl(searchUrl, function(data) {
162        var xml = parseXml($.trim(data));
163        var markerNodes = xml.documentElement.getElementsByTagName('marker');
164        var bounds = new google.maps.LatLngBounds();
165
166        clearLocations(markerNodes.length, true);
167        $('#fmmsl_split_list').html('<ul></ul>');
168        for (var i = 0; i < markerNodes.length; i++)
169        {
170            var name = markerNodes[i].getAttribute('name');
171            var address = markerNodes[i].getAttribute('address');
172            var addressNoHtml = markerNodes[i].getAttribute('addressNoHtml');
173            var other = markerNodes[i].getAttribute('other');
174            var distance = parseFloat(markerNodes[i].getAttribute('distance'));
175            var id_store = parseFloat(markerNodes[i].getAttribute('id_store'));
176            var phone = markerNodes[i].getAttribute('phone');
177            var email = markerNodes[i].getAttribute('email');
178            var fax = markerNodes[i].getAttribute('fax');
179            var note = markerNodes[i].getAttribute('note');
180            var has_store_picture = markerNodes[i].getAttribute('has_store_picture');
181            var latlng = new google.maps.LatLng(
182            parseFloat(markerNodes[i].getAttribute('lat')),
183            parseFloat(markerNodes[i].getAttribute('lng')));
184
185            createOption(name, distance, i, id_store);
186            createMarker(latlng, name, address, other, id_store, has_store_picture, email, fax, note);
187            bounds.extend(latlng);
188            if (FMESL_LAYOUT_THEME > 0) {
189                $('#fmmsl_split_list ul').append('<li><a href="javascript:void(0);" onclick="fmmSlTriggerStore('+i+');" title="'+name+'">'+name+'</a><p>'+
190                addressNoHtml+(FMESL_STORE_FAX && fax !== '' ? '<br />'+translation_8+' '+fax : '')+
191                '<br />'+translation_10+' '+distance+' '+distance_unit+'</p></li>');
192            }
193            else {
194                $('#stores-table tr:last').after('<tr class="node">'+
195                    '<td class="num">'+parseInt(i + 1)+'</td>'+
196                    '<td><b>'+name+'</b>'+(has_store_picture === 1 ? '<br /><img src="'+img_store_dir+parseInt(id_store)+'-medium.jpg" alt="" />' : '')+'</td>'+
197                    '<td>'+address+
198                    (FMESL_STORE_EMAIL && email !== '' ? '<br /><br />'+translation_7+' '+email : '')+
199                    (FMESL_STORE_FAX && fax !== '' ? '<br /><br />'+translation_8+' '+fax : '')+
200                    (FMESL_STORE_NOTE && note !== '' ? '<br /><br />'+translation_9+' '+note : '')+
201                    '</td>'+
202                    '<td class="distance">'+distance+' '+distance_unit+'</td>'+
203                '</tr>');
204                $('#stores-table').show();
205            }
206        }
207
208        if (markerNodes.length)
209        {
210            // map.fitBounds(bounds);
211            map.setZoom(15); 
212            var listener = google.maps.event.addListener(map, "idle", function() {
213                // if (map.getZoom() > 13) map.setZoom(13);
214                google.maps.event.removeListener(listener); 
215            });
216        }
217        if (FMESL_LAYOUT_THEME <= 0) {
218            locationSelect.style.visibility = 'visible';
219            $(locationSelect).show();
220            locationSelect.onchange = function() {
221                var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
222                google.maps.event.trigger(markers[markerNum], 'click');
223            };
224        }
225    });
226}
227
228function createMarker(latlng, name, address, other, id_store, has_store_picture, email, fax, note) {
229    var html = '<b>'+name+'</b><br/>' +
230        address +
231        (FMESL_STORE_EMAIL && email !== '' ? '<br />' + translation_7 + ' ' + email : '') +
232        (FMESL_STORE_FAX && fax !== '' ? '<br />' + translation_8 + ' ' + fax : '') +
233        (FMESL_STORE_NOTE && note !== '' ? '<br />' + translation_9 + ' ' + note : '') +
234        (has_store_picture > 0 ? '<br /><br /><img src="'+img_store_dir+parseInt(id_store) + '-stores_default.jpg" alt="'+name+'" style="max-width:125px" />' : '') +
235        '<br />' + other +
236        '<br /><a class="store_direction" href="https://maps.google.com/maps?saddr=&daddr='+latlng+'" target="_blank">'+translation_5+'<\/a>';
237
238    if (typeof st_page !== 'undefined' && ($.inArray(st_page, ['order', 'orderopc']) >= 0)) {
239        html += '<a class="store_selection" href="javascript:;" onclick="selectStore(' + id_store + ')">'+translation_store_sel+'<\/a>';
240    }
241
242    var img_path = img_ps_dir + logo_store;
243    if (FMESL_STORE_GLOBAL_ICON > 0) {
244        img_path = img_ps_dir + 'st/icon_' + id_store + '.png';
245    }
246
247    var image = new google.maps.MarkerImage(img_path);
248    var markerOptions = {
249        map: map,
250        position: latlng
251    }
252    if (hasStoreIcon) {
253        markerOptions.icon = image;
254    }
255
256    var marker = new google.maps.Marker(markerOptions);
257    google.maps.event.addListener(marker, 'click', function() {
258        infoWindow.setContent(html);
259        infoWindow.open(map, marker);
260    });
261
262    markers.push(marker);
263    var _id_store = CurrentUrl;
264    if (_id_store > 0) {
265        google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
266            $('select#locationSelect > option[data-value="'+_id_store+'"]').prop('selected', true);
267            $('select#locationSelect').trigger('change');
268        });
269    }
270}
271
272function createOption(name, distance, num, id_store) {
273    if (parseInt(FMESL_LAYOUT_THEME) <= 0 || (typeof locationSelect != 'undefined')) {
274       $('#locationSelect').append($('<option>', {
275            value: num,
276            'data-value': id_store,
277            text: `${name} (${distance.toFixed(1)} ${distance_unit})`
278        }));
279    }
280}
281
282function downloadUrl(url, callback) {
283    var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
284    request.onreadystatechange = function() {
285        if (request.readyState === 4) {
286            request.onreadystatechange = doNothing;
287            callback(request.responseText, request.status);
288        }
289    };
290    request.open('GET', url, true);
291    request.send(null);
292}
293
294function parseXml(str) {
295    if (window.ActiveXObject) {
296        var doc = new ActiveXObject('Microsoft.XMLDOM');
297        doc.loadXML(str);
298        return doc;
299    } else if (window.DOMParser) {
300        return (new DOMParser()).parseFromString(str, 'text/xml');
301    }
302}
303
304function doNothing() {}
305
306function PosLoc(position) {
307    // Centre the map on the new location
308    var coords = position.coords || position.coordinate || position;
309    var LtLnPos = new google.maps.LatLng(coords.latitude, coords.longitude);
310    map.setCenter(LtLnPos);
311    map.setZoom(10);
312    var marker = new google.maps.Marker({
313        map: map,
314        position: LtLnPos,
315        title: translation_06
316    });
317    markers.push(marker);
318
319    // And reverse geocode.
320    (new google.maps.Geocoder()).geocode({latLng: LtLnPos}, function(resp) {
321          var place = translation_07; //You're around here somewhere!
322          if (resp[0]) {
323              var bits = [];
324              for (var i = 0, I = resp[0].address_components.length; i < I; ++i) {
325                  var component = resp[0].address_components[i];
326                  if (jQuery.inArray(component.types, 'political') >= 0) {
327                      bits.push(component.long_name);
328                    }
329                }
330                if (bits.length) {
331                    place = bits;
332                }
333                marker.setTitle(resp[0].formatted_address);
334            }
335            document.getElementById('addressInput').value = place;
336            map.setZoom(5);
337      });
338}
339
340function PosUnSuccess(issue) {
341    var message;
342    switch(issue.code) {
343      case issue.UNKNOWN_ERROR:
344        message = translation_01; // Unable to find your location
345        break;
346      case issue.PERMISSION_DENINED:
347        message = translation_02; //Permission denied
348        break;
349      case issue.POSITION_UNAVAILABLE:
350        message = translation_03; //Your location unknown
351        break;
352      case issue.BREAK:
353        message = translation_04; //Timeout error
354        break;
355      default:
356        message = translation_05; //Location detection not supported in browser
357    }
358}
359
360//Reset MAP
361function ResetMap(n) {
362    infoWindow.close();
363    map.setZoom(defaultZoom);
364    initMarkers();
365    var LtLnPos = new google.maps.LatLng(defaultLat, defaultLong);
366    map.setCenter(LtLnPos);
367    if (FMESL_LAYOUT_THEME <= 0) {
368        locationSelect.innerHTML = '';
369        var option = document.createElement('option');
370        option.value = 'none';
371        if (!n) {
372            option.innerHTML = translation_1;
373        } else {
374            if (n === 1) {
375                option.innerHTML = '1' + ' ' + translation_2;
376            } else {
377                option.innerHTML = n + ' ' + translation_3;
378            }
379        }
380        locationSelect.appendChild(option);
381        $('#stores-table tr.node').remove();
382        $('#locationSelect').hide();
383    }
384}
385
386function initMap() {
387    var map_elements = $('.store_map');
388    if (map_elements.length) {
389        map_elements.each(function(e) {
390            initGoogleMap($(this).get(0));
391        });
392        if (typeof default_store !== 'undefined' && default_store) {
393            setTimeout(function(){
394                fmmSlTriggerStore($('#locationSelect option:selected').val());
395            }, 1500);
396        }
397    }
398}
399
400function initGoogleMap(mapElement) {
401    //var mapElement = document.getElementById('map');
402    if (typeof mapElement !== 'undefined' && typeof mapElement !== 'null' && mapElement) {
403        var styles = '';
404        if ((typeof map_theme !== 'undefined') && (typeof map_theme !== 'object')) {
405            styles = JSON.parse(map_theme);
406        } else {
407            styles = map_theme;
408        }
409        var mapOptions = {
410            center: new google.maps.LatLng(defaultLat, defaultLong),
411            zoom: defaultZoom,
412            mapTypeId: 'roadmap',
413            mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
414            styles: styles,
415        }
416        map = new google.maps.Map(mapElement, mapOptions);
417        infoWindow = new google.maps.InfoWindow();
418
419        //if (typeof locationSelect !== 'undefined' && typeof locationSelect !== 'null' && locationSelect) {
420        if (FMESL_LAYOUT_THEME <= 0) {
421            locationSelect = document.getElementById('locationSelect');
422            $('#locationSelect').hide();
423            locationSelect.onchange = function () {
424                var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
425                if (markerNum !== 'none') {
426                    google.maps.event.trigger(markers[markerNum], 'click');
427                }
428            };
429        }
430        $('#addressInput').keypress(function (e) {
431            code = e.keyCode ? e.keyCode : e.which;
432            if (code.toString() === 13) {
433                searchLocations();
434            }
435        });
436        //}
437
438        google.maps.event.addListenerOnce(map, 'tilesloaded', function () {
439            //IF autolocation is enabled ask user's Permission
440            if (autolocateUser) {
441                navigator.geolocation.getCurrentPosition(PosLoc, PosUnSuccess);
442            }
443        });
444        initMarkers();
445    }
446}
447
448function fmmSlTriggerStore(id) {
449    if (typeof initPickupDate !== 'undefined') {
450        var id_store = $('#locationSelect option:selected').attr('data-value');
451        initPickupDate(id_store);
452        selectStore(id_store);
453        //console.log(document.querySelector("#storelocator_pickup_date")._flatpickr)
454    }
455    google.maps.event.trigger(markers[id], 'click');
456}
457
458function checkCarrier(id_carrier) {
459    $('#stores').remove();
460    $('#storelocator-delivery-button').remove();
461    // hidden coninue button - fix
462    $('#js-delivery').find('button').show();
463    if (typeof id_carrier !== 'undefined' && id_carrier && (typeof sl_carrier !== 'undefined' || typeof sl_carrier !== 'null')) {
464        id_carrier = id_carrier.replace(/,\s*$/, '');
465        if (id_carrier === sl_carrier) {
466            getMapStores();
467            moveShippingFormButton();
468        }
469    }
470    selectStore(0);
471}
472
473function getMapStores() {
474    var jsonData = {
475        url: searchUrl,
476        method: 'get',
477        dataType: 'json',
478        data: {
479            action: 'getMapStores'
480        },
481        success: function(response) {
482            if (response.success) {
483                var html = (typeof response.html !== 'undefined')? $.trim(response.html.replace(/<\!--.*?-->/g, "")) : '';
484                if ($('#stores').length) {
485                    $('#stores').remove();
486                }
487                $('#js-delivery').after(html);
488                initMap();
489                $('.fmeSearchbyProduct').easyAutocomplete(autocompleteOptions);
490
491                if (typeof initPickupDate !== 'undefined') {
492                    initPickupDate();
493                }
494            }
495        },
496        error: function(jqXHR, textStatus, errorThrown) {
497            alert('Error: ' + textStatus + '<br>' + errorThrown);
498        }
499    }
500    $.ajax(jsonData);
501}
502
503/**
504 * on store dropdown change, get store pickup time
505 * @param {int} id_store
506 */
507function selectStore(id_store) {
508    if (typeof id_store === 'undefined' || !is_store_selction) {
509        return false
510    }
511
512    var jsonData = {
513        url: searchUrl,
514        method: 'post',
515        dataType: 'json',
516        data: {
517            id_store: id_store,
518            action: 'selectStore',
519            id_carrier: $('.delivery-options').find('input[type=radio]:checked').val().replace(/,\s*$/, ''),
520        },
521        success: function(response) {
522            console.log(response);
523            //To do - get and append pickup data
524            //initPickupDate(id_store);
525        },
526        error: function(jqXHR, textStatus, errorThrown) {
527            alert('Error: ' + textStatus + '<br>' + errorThrown);
528        }
529    }
530    $.ajax(jsonData);
531}
532
533
534$(document).on('click', "#confirmDeliveryOptionFake", function(event) {
535    event.preventDefault();
536    event.stopImmediatePropagation();
537
538    var pickupTime = null;
539    var pickupDate = $.trim($('#storelocator_pickup_date').val());
540    var id_store = parseInt($('select#locationSelect option:selected').attr('data-value'));
541
542    if (id_store === -1) {
543        $('#fmeStorePage').after('<div id="fmeStorePage-error" class="alert alert-danger danger">' + store_page_error_label + '</div>');
544        $('html, body').animate({
545            scrollTop: $("#stores").offset().top
546        }, 300);
547    } else {
548        var proceed = true;
549        $('#fmeStorePage-error').remove();
550        if (FMESL_PICKUP_DATE) {
551            if (!moment( pickupDate, 'YYYY-MM-DD' ).isValid()) {
552                $('#storelocator_pickup_date').attr('placeholder', invalid_pickupdate_label);
553                proceed = false;
554            } else {
555                proceed = true;
556                $('#storelocator_pickup_date').removeAttr('placeholder');
557                if ($('#storelocator_pickup_time').length) {
558                    pickupTime = $.trim($('#storelocator_pickup_time').val());
559                    if (!moment(pickupTime, 'H:i' ).isValid()) {
560                        proceed = false;
561                        $('#storelocator_pickup_time').attr('placeholder', invalid_pickuptime_label);
562                    } else {
563                        proceed = true;
564                        $('#storelocator_pickup_time').removeAttr('placeholder');
565                    }
566                }
567            }
568        }
569
570        if (!proceed) {
571            $('html, body').animate({
572                scrollTop: $("#storelocatore-cal-wrapper").offset().top
573            }, 300);
574        } else {
575            var resquest = {
576                url: searchUrl,
577                type: 'get',
578                dataType: 'json',
579                async: false,
580                data: {
581                    action: 'savePickup',
582                    id_store: id_store,
583                    pickupTime: pickupTime,
584                    pickupDate: pickupDate,
585                },
586                success: function(response) {
587                    $('#pickup-response-error').remove();
588                    if (typeof response !== 'undefined' && response.hasError) {
589                        $('#stores').after('<div id="pickup-response-error" class="alert alert-danger danger">' + response.msg + '</div>');
590                    } else {
591                        $('#js-delivery').find('button[name=confirmDeliveryOption]').click();
592                    }
593                },
594                error: function(jqXHR, textStatus, errorThrown) {
595                    alert('Error: ' + textStatus + '<br>' + errorThrown);
596                }
597            };
598            $.ajax(resquest);
599        }
600    }
601});
602
603/**
604 * move shipping form buuton to end
605 */
606function moveShippingFormButton() {
607    $('#storelocator-delivery-button').remove();
608    $('#extra_carrier').after('<div id="storelocator-delivery-button" class="clearfix"></div>');
609    $('#js-delivery').find('button').hide().clone().attr({
610      id:'confirmDeliveryOptionFake',
611      name:'confirmDeliveryOptionFake'
612    }).appendTo('#storelocator-delivery-button').show();
613}
614
615function clearShopOptions(id) {
616    var selectObj = document.getElementById(id);
617    var selectParentNode = selectObj.parentNode;
618    var newSelectObj = selectObj.cloneNode(false); // Make a shallow copy
619    selectParentNode.replaceChild(newSelectObj, selectObj);
620    return newSelectObj;
621}

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.