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.