jQuery(document).ready(function (e){
const actionCityPaq='SearchCityPaqByPostalCode';
const actionOffice='SearchOfficeByPostalCode';
const actionPudoCEX='SearchPudoCEXByPostalCode';
const LOCALSTORAGE_KEY='correosoficial_pickup_location';
let googleMap=new Array();
let carriersData=new Array();
function saveToLocalStorage(productType, instanceId, data){
try {
const storageData={
productType,
instanceId,
searchPostalCode: data.searchPostalCode,
selectedPickupLocationOption: data.selectedPickupLocationOption,
pickupLocation: data.pickupLocation,
pickupLocationsOptions: data.pickupLocationsOptions,
allPickupLocations: data.allPickupLocations||[],
timestamp: new Date().getTime()
};
localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(storageData));
} catch (error){
console.error('Error saving to localStorage:', error);
}}
function loadFromLocalStorage(productType, instanceId){
try {
const stored=localStorage.getItem(LOCALSTORAGE_KEY);
if(stored){
const data=JSON.parse(stored);
const twentyFourHours=24 * 60 * 60 * 1000;
if(data.productType===productType &&
data.instanceId===instanceId &&
(new Date().getTime() - data.timestamp < twentyFourHours)){
return data;
}}
} catch (error){
console.error('Error loading from localStorage:', error);
}
return null;
}
function clearLocalStorage(){
try {
localStorage.removeItem(LOCALSTORAGE_KEY);
} catch (error){
console.error('Error clearing localStorage:', error);
}}
function getProductTypeFromAction(action){
if(action===actionCityPaq) return 'citypaq';
if(action===actionOffice) return 'office';
if(action===actionPudoCEX) return 'pudocex';
return null;
}
switch (varsAjax.whereAmI){
case 'cart':
initLoad();
jQuery(document.body).on('updated_shipping_method', function (){
initLoad();
});
break;
case 'checkout':
jQuery(document.body).on('updated_checkout', function (){
initLoad();
if(jQuery('.search-citypaq-by-cp-input').val()==''||jQuery('.search-office-by-cp-input').val()==''){
setTimeout(function (){
initLoad();
}, 3000);
}});
break;
}
jQuery(document.body).on('updated_wc_div', function (){
initLoad();
});
function initLoad(){
let carrierSelected=jQuery('input[type="radio"][name^="shipping_method["][name$="]"]:checked');
let radioButtonsCarriers=jQuery('input[type="radio"][name^="shipping_method["][name$="]"]');
radioButtonsCarriers.on('change', function (){
cleanCheckoutMetadata();
carrierSelected=jQuery(this).val();
let newCarrierId=parseInt(carrierSelected.split(':')[1])||parseInt(carrierSelected);
let carrierData=carriersData[newCarrierId];
const storedData=localStorage.getItem(LOCALSTORAGE_KEY);
if(storedData){
const parsed=JSON.parse(storedData);
if(parsed.instanceId!==newCarrierId.toString()&&parsed.instanceId!==newCarrierId){
clearLocalStorage();
if(parsed.instanceId){
delete carriersData[parseInt(parsed.instanceId)];
}}
}
if(carrierData!=undefined){
if(carrierData.action==actionCityPaq){
insertCityPaq(carrierData.selected_location, carrierSelected);
}
if(carrierData.action==actionOffice){
insertOffice(carrierData.selected_location, carrierSelected);
}
if(carrierData.action==actionPudoCEX){
insertPudoCEX(carrierData.selected_location, carrierId);
}}else{
clearLocalStorage();
Object.keys(carriersData).forEach(function(key){
if(carriersData[key] &&
(carriersData[key].action===actionCityPaq ||
carriersData[key].action===actionOffice ||
carriersData[key].action===actionPudoCEX)){
delete carriersData[key];
}});
}});
let citypaqCarriers=jQuery('[id^="citypaq_selector_"]');
let officeCarriers=jQuery('[id^="office_selector_"]');
citypaqCarriers.each(function (index, element){
let carrierId=jQuery(element).val();
let currentReference=jQuery('#citypaq_reference_' + carrierId);
let currentPostcode=jQuery('#citypaq_postcode_' + carrierId);
let inputSearch=jQuery('#SearchCityPaqByCPInput_' + carrierId);
let buttonSearch=jQuery('#SearchCityPaqByCpButton_' + carrierId);
let selectCityPaqs=jQuery('#CityPaqSelect_' + carrierId);
let scheduleAndMap=jQuery('#scheduleAndMap_' + carrierId);
let checkoutMetadata=getCheckoutMetadata();
if(checkoutMetadata.CarrierID==carrierId){
currentReference.val(checkoutMetadata.SelectedReference);
}else if(!currentReference.val()){
let carrierData=carriersData[carrierId];
if(carrierData!=undefined){
currentReference.val(carrierData.selected_location.reference);
}}
scheduleAndMap.hide();
inputSearch.val(currentPostcode.val());
inputSearch.keydown(function (event){
if(event.key==='Enter'){
event.preventDefault();
buttonSearch.click();
}});
if(inputSearch.val().length >=5){
setLocations(actionCityPaq, currentPostcode.val(), carrierId, selectCityPaqs, currentReference.val());
}
buttonSearch.on('click', async function (){
let searchPostcode=inputSearch.val();
let searchPostalCodeSub;
let shippingAddressPostalCodeSub;
if(searchPostcode){
searchPostalCodeSub=searchPostcode.substring(0, 2);
}
if(currentPostcode.val()){
let shippingAddressPostalCode=currentPostcode.val();
shippingAddressPostalCodeSub=shippingAddressPostalCode.substring(0, 2);
}
if(searchPostalCodeSub&&shippingAddressPostalCodeSub){
if(searchPostalCodeSub!=shippingAddressPostalCodeSub){
alert(pickupPointSameProvince);
return false;
}}
try {
let locations=await setLocations(actionCityPaq, searchPostcode, carrierId, selectCityPaqs, null);
let selected_location=locations[0];
insertCityPaq(selected_location, carrierId);
currentReference.val(selected_location.reference);
currentPostcode.val(searchPostcode);
saveToLocalStorage('citypaq', carrierId, {
searchPostalCode: searchPostcode,
selectedPickupLocationOption: selected_location.reference,
pickupLocation: selected_location.full,
pickupLocationsOptions: locations.map(loc=> ({ label: loc.terminal, value: loc.reference })),
allPickupLocations: locations.map(loc=> loc.full)
});
} catch (error){
alert(cityPaqPostCodeNotFound);
inputSearch.val(currentPostcode.val());
}});
if(defined_google_api_key==1){
if(typeof google!=='undefined'){
let newGoogleMaps=new google.maps.Map(document.getElementById('GoogleMapCorreos_' + carrierId), {
center: { lat: 40.234013044698884, lng: -3.768710630003362 },
zoom: 13,
});
googleMap[carrierId]={
map: newGoogleMaps,
markers: [],
};}}
});
officeCarriers.each(function (index, element){
let carrierId=jQuery(element).val();
let currentReference=jQuery('#office_reference_' + carrierId);
let currentPostcode=jQuery('#office_postcode_' + carrierId);
let inputSearch=jQuery('#SearchOfficeByCPInput_' + carrierId);
let buttonSearch=jQuery('#SearchOfficeByCpButton_' + carrierId);
let selectOffices=jQuery('#OfficeSelect_' + carrierId);
let scheduleAndMap=jQuery('#scheduleAndMap_' + carrierId);
let checkoutMetadata=getCheckoutMetadata();
if(checkoutMetadata.CarrierID==carrierId){
currentReference.val(checkoutMetadata.SelectedReference);
}else if(!currentReference.val()){
let carrierData=carriersData[carrierId];
if(carrierData!=undefined){
currentReference.val(carrierData.selected_location.reference);
}}
scheduleAndMap.hide();
inputSearch.val(currentPostcode.val());
inputSearch.keydown(function (event){
if(event.key==='Enter'){
event.preventDefault();
buttonSearch.click();
}});
if(inputSearch.val().length >=5){
setLocations(actionOffice, currentPostcode.val(), carrierId, selectOffices, currentReference.val());
}
buttonSearch.on('click', async function (){
let searchPostcode=inputSearch.val();
let searchPostalCodeSub;
let shippingAddressPostalCodeSub;
if(searchPostcode){
searchPostalCodeSub=searchPostcode.substring(0, 2);
}
if(currentPostcode.val()){
let shippingAddressPostalCode=currentPostcode.val();
shippingAddressPostalCodeSub=shippingAddressPostalCode.substring(0, 2);
}
if(searchPostalCodeSub&&shippingAddressPostalCodeSub){
if(searchPostalCodeSub!=shippingAddressPostalCodeSub){
alert(pickupPointSameProvince);
return false;
}}
try {
let locations=await setLocations(actionOffice, searchPostcode, carrierId, selectOffices, null);
let selected_location=locations[0];
insertOffice(selected_location, carrierId);
currentReference.val(selected_location.reference);
currentPostcode.val(searchPostcode);
saveToLocalStorage('office', carrierId, {
searchPostalCode: searchPostcode,
selectedPickupLocationOption: selected_location.reference,
pickupLocation: selected_location.full,
pickupLocationsOptions: locations.map(loc=> ({ label: loc.terminal, value: loc.reference })),
allPickupLocations: locations.map(loc=> loc.full)
});
} catch (error){
alert(officePostCodeNotFound);
inputSearch.val(currentPostcode.val());
}});
if(defined_google_api_key==1){
if(typeof google!=='undefined'){
let newGoogleMaps=new google.maps.Map(document.getElementById('GoogleMapCorreos_' + carrierId), {
center: { lat: 40.234013044698884, lng: -3.768710630003362 },
zoom: 13,
});
googleMap[carrierId]={
map: newGoogleMaps,
markers: [],
};}}
});
let pudocexCarriers=jQuery('[id^="pudocex_selector_"]');
pudocexCarriers.each(function (index, element){
let carrierId=jQuery(element).val();
let currentReference=jQuery('#pudocex_reference_' + carrierId);
let currentPostcode=jQuery('#pudocex_postcode_' + carrierId);
let inputSearch=jQuery('#SearchPudoCEXByCPInput_' + carrierId);
let buttonSearch=jQuery('#SearchPudoCEXByCpButton_' + carrierId);
let selectPudoCEX=jQuery('#PudoCEXSelect_' + carrierId);
let scheduleAndMap=jQuery('#scheduleAndMap_' + carrierId);
let checkoutMetadata=getCheckoutMetadata();
if(checkoutMetadata.CarrierID==carrierId){
currentReference.val(checkoutMetadata.SelectedReference);
}else if(!currentReference.val()){
let carrierData=carriersData[carrierId];
if(carrierData!=undefined){
currentReference.val(carrierData.selected_location.reference);
}}
scheduleAndMap.hide();
inputSearch.val(currentPostcode.val());
inputSearch.keydown(function (event){
if(event.key==='Enter'){
event.preventDefault();
buttonSearch.click();
}});
if(inputSearch.val().length >=5){
setLocations(actionPudoCEX, currentPostcode.val(), carrierId, selectPudoCEX, currentReference.val());
}
buttonSearch.on('click', async function (){
let searchPostcode=inputSearch.val();
let searchPostalCodeSub;
let shippingAddressPostalCodeSub;
if(searchPostcode){
searchPostalCodeSub=searchPostcode.substring(0, 2);
}
if(currentPostcode.val()){
let shippingAddressPostalCode=currentPostcode.val();
shippingAddressPostalCodeSub=shippingAddressPostalCode.substring(0, 2);
}
if(searchPostalCodeSub&&shippingAddressPostalCodeSub){
if(searchPostalCodeSub!=shippingAddressPostalCodeSub){
alert(pickupPointSameProvince);
return false;
}}
try {
let locations=await setLocations(actionPudoCEX, searchPostcode, carrierId, selectPudoCEX, null);
let selected_location=locations[0];
insertPudoCEX(selected_location, carrierId);
currentReference.val(selected_location.reference);
currentPostcode.val(searchPostcode);
saveToLocalStorage('pudocex', carrierId, {
searchPostalCode: searchPostcode,
selectedPickupLocationOption: selected_location.reference,
pickupLocation: selected_location.full,
pickupLocationsOptions: locations.map(loc=> ({ label: loc.terminal, value: loc.reference })),
allPickupLocations: locations.map(loc=> loc.full)
});
} catch (error){
alert(pudoCEXPostCodeNotFound);
inputSearch.val(currentPostcode.val());
}});
if(defined_google_api_key==1){
if(typeof google!=='undefined'){
let newGoogleMaps=new google.maps.Map(document.getElementById('GoogleMapCorreos_' + carrierId), {
center: { lat: 40.234013044698884, lng: -3.768710630003362 },
zoom: 13,
});
googleMap[carrierId]={
map: newGoogleMaps,
markers: [],
};}}
});
}
function setLocations(action, postcode, id_carrier, select, currentReference){
return new Promise(function (resolve, reject){
let results=new Array();
let selectedOutput=null;
jQuery.ajax({
url: varsAjax.ajaxUrl,
type: 'POST',
data: {
action: 'correosOficialDispacher',
_nonce: varsAjax.nonce,
dispatcher: {
controller: 'CorreosOficialCheckoutModuleFrontController',
action: action,
id_carrier: id_carrier,
postcode: postcode,
shortcode: true,
},
},
cache: false,
processData: true,
success: function (parsed_data){
if(!Array.isArray(parsed_data)){
console.error('Correos: Invalid response format', parsed_data);
reject(false);
return;
}
if(action==actionCityPaq){
selectedOutput=jQuery('#citypaq_reference_' + id_carrier);
parsed_data.forEach(function (location){
let data={
reference: location.reference,
address: location.address,
city: location.city,
cp: location.zipcode,
terminal: location.data.alias,
schedule: location.schedule,
lat: parseFloat(location.lat),
lng: parseFloat(location.long),
raw: location,
full: location
};
results.push(data);
});
if(results.length > 0){
fillSelect(id_carrier, action, select, results, currentReference, selectedOutput);
resolve(results);
}else{
cleanCheckoutMetadata();
alert(cityPaqPostCodeNotFound);
}}
if(action==actionOffice){
selectedOutput=jQuery('#office_reference_' + id_carrier);
parsed_data.forEach(function (location){
let data={
reference: location.reference,
address: location.address,
city: location.city,
cp: location.zipcode,
terminal: location.name,
schedule: {
horarioLV: location.scheduleLV,
horarioS: location.scheduleS,
horarioF: location.scheduleF,
},
lat: parseFloat(location.lat),
lng: parseFloat(location.long),
raw: location,
full: location
};
results.push(data);
});
if(results.length > 0){
fillSelect(id_carrier, action, select, results, currentReference, selectedOutput);
resolve(results);
}else{
cleanCheckoutMetadata();
alert(officePostCodeNotFound);
}}
if(action==actionPudoCEX){
selectedOutput=jQuery('#pudocex_reference_' + id_carrier);
parsed_data.forEach(function (location){
let data={
reference: location.reference,
address: location.address,
city: location.city,
cp: location.zipcode,
terminal: location.name,
phone: location.phone,
schedule: {
horarioLV: location.scheduleLV,
horarioS: location.scheduleS,
horarioF: location.scheduleF,
},
lat: parseFloat(location.lat),
lng: parseFloat(location.long),
raw: location,
full: location
};
results.push(data);
});
if(results.length > 0){
fillSelect(id_carrier, action, select, results, currentReference, selectedOutput);
resolve(results);
}else{
cleanCheckoutMetadata();
alert(pudoCEXPostCodeNotFound);
}}
},
error: function (e){
reject(false);
},
});
});
}
function fillSelect(id_carrier, action, select, locations, currentReference, selectedOutput=null){
let currentLocation;
const productType=getProductTypeFromAction(action);
const storedData=loadFromLocalStorage(productType, id_carrier);
if(storedData&&!currentReference){
currentReference=storedData.selectedPickupLocationOption;
}
select.off('change');
select.find('option').remove();
if(currentReference){
currentLocation=locations.find((location)=> location.reference==currentReference);
}
if(!currentReference||currentLocation==undefined){
currentReference=locations[0].reference;
currentLocation=locations.find((location)=> location.reference==currentReference);
if(selectedOutput!=null){
selectedOutput.val(currentReference);
}}
option_selected=locations.find((location)=> location.reference==currentReference);
if(option_selected==undefined&&locations.length > 0){
option_selected=locations[0];
}
updateCarrierData(id_carrier, action, option_selected);
locations.forEach(function (location){
if(location.cart){
currentReference=location.reference;
}
if(currentReference==location.reference){
select.append('<option value=' + location.reference + ' selected>' + location.terminal + '</option>');
let carrierData=carriersData[parseInt(id_carrier)];
if(carrierData!=undefined){
if(action==actionCityPaq){
insertCityPaq(location, id_carrier);
}
if(action==actionOffice){
insertOffice(location, id_carrier);
}
if(action==actionPudoCEX){
insertPudoCEX(location, id_carrier);
}}
}else{
select.append('<option value=' + location.reference + '>' + location.terminal + '</option>');
}});
setScheduleAndMap(id_carrier, locations, currentReference, action);
if(!storedData){
const inputSearch=action===actionCityPaq ? jQuery('#SearchCityPaqByCPInput_' + id_carrier) :
action===actionOffice ? jQuery('#SearchOfficeByCPInput_' + id_carrier) :
jQuery('#SearchPudoCEXByCPInput_' + id_carrier);
saveToLocalStorage(productType, id_carrier, {
searchPostalCode: inputSearch.val(),
selectedPickupLocationOption: currentReference,
pickupLocation: currentLocation ? currentLocation.full:locations[0].full,
pickupLocationsOptions: locations.map(loc=> ({ label: loc.terminal, value: loc.reference })),
allPickupLocations: locations.map(loc=> loc.full)
});
}
select.on('change', function (){
setScheduleAndMap(id_carrier, locations, jQuery(this).val(), action);
let selected_location=locations.find((location)=> location.reference==jQuery(this).val());
const productType=getProductTypeFromAction(action);
if(productType){
const inputSearch=action===actionCityPaq ? jQuery('#SearchCityPaqByCPInput_' + id_carrier) :
action===actionOffice ? jQuery('#SearchOfficeByCPInput_' + id_carrier) :
jQuery('#SearchPudoCEXByCPInput_' + id_carrier);
saveToLocalStorage(productType, id_carrier, {
searchPostalCode: inputSearch.val(),
selectedPickupLocationOption: selected_location.reference,
pickupLocation: selected_location.full,
pickupLocationsOptions: locations.map(loc=> ({ label: loc.terminal, value: loc.reference })),
allPickupLocations: locations.map(loc=> loc.full)
});
}
if(action==actionCityPaq){
insertCityPaq(selected_location, id_carrier);
}
if(action==actionOffice){
insertOffice(selected_location, id_carrier);
}
if(action==actionPudoCEX){
insertPudoCEX(selected_location, id_carrier);
}});
}
function setGoogleMapsMarkers(carrierId, myLatLng, title){
if(defined_google_api_key==1){
let carrierMap=googleMap[carrierId];
if(carrierMap!=undefined){
let map=googleMap[carrierId].map;
let markers=googleMap[carrierId].markers;
if(markers.length > 0){
markers.forEach(function (marker){
marker.setMap(null);
});
}
let marker=new google.maps.Marker({
position: myLatLng,
title: title,
});
marker.setMap(map);
markers.push(marker);
map.setCenter(myLatLng);
map.setZoom(14);
}}
}
function setScheduleAndMap(id_carrier, locations, reference, action){
let scheduleAndMap=jQuery('#scheduleAndMap_' + id_carrier);
let locationSelected=locations.find((location)=> location.reference==reference);
if(locationSelected==undefined&&locations.length > 0){
locationSelected=locations[0];
}
scheduleAndMap.show();
if(action==actionCityPaq&&locationSelected!=undefined){
scheduleAndMap.find('.citypaq-address-info p.address').text(locationSelected.address);
scheduleAndMap.find('.citypaq-address-info p.city').text(locationSelected.city);
scheduleAndMap.find('.citypaq-address-info p.cp').text(locationSelected.cp);
scheduleAndMap.find('.citypaq-terminal-info p').text(locationSelected.terminal);
scheduleAndMap.find('.scheduleInfo p').text(locationSelected.schedule==='1' ? openingInfo:opening24hInfo);
}
if((action==actionOffice||action==actionPudoCEX)&&locationSelected!=undefined){
scheduleAndMap.find('.office-address-info p.address').text(locationSelected.address);
scheduleAndMap.find('.office-address-info p.city').text(locationSelected.city);
scheduleAndMap.find('.office-address-info p.cp').text(locationSelected.cp);
scheduleAndMap.find('.office-address-info p.phone').text(locationSelected.phone);
scheduleAndMap.find('.office-terminal-info p').text(locationSelected.terminal);
scheduleAndMap.find('.scheduleInfo p.timeScheduleLV').text(locationSelected.schedule.horarioLV);
scheduleAndMap.find('.scheduleInfo p.timeScheduleS').text(locationSelected.schedule.horarioS);
scheduleAndMap.find('.scheduleInfo p.timeScheduleF').text(locationSelected.schedule.horarioF);
}
setGoogleMapsMarkers(id_carrier, { lat: locationSelected.lat, lng: locationSelected.lng }, locationSelected.terminal);
}
function updateCarrierData(id_carrier, action, selected_location){
carriersData[id_carrier]={
action: action,
selected_location: selected_location,
};}
function insertCityPaq(selected_location, id_carrier){
updateCarrierData(id_carrier, actionCityPaq, selected_location);
setMetadataCheckout(parseInt(id_carrier), 'CityPaq', selected_location.reference, JSON.stringify(selected_location.raw));
}
function insertOffice(selected_location, id_carrier){
updateCarrierData(id_carrier, actionOffice, selected_location);
setMetadataCheckout(parseInt(id_carrier), 'Oficina', selected_location.reference, JSON.stringify(selected_location.raw));
}
function insertPudoCEX(selected_location, id_carrier){
updateCarrierData(id_carrier, actionPudoCEX, selected_location);
setMetadataCheckout(parseInt(id_carrier), 'pudocex', selected_location.reference, JSON.stringify(selected_location.raw));
}
function setMetadataCheckout(CarrierID, ReferenceType, SelectedReference, SelectedReferenceData){
let metadataArray=[
{ name: 'CarrierID', value: parseInt(CarrierID) },
{ name: 'ReferenceType', value: ReferenceType },
{ name: 'SelectedReference', value: SelectedReference },
{ name: 'SelectedReferenceData', value: SelectedReferenceData },
];
let checkoutMetadata=getCheckoutMetadata();
metadataArray.forEach(function (metadata){
let inputName=metadata.name;
let newValue=metadata.value;
checkoutMetadata[inputName]=newValue;
});
checkoutMetadata=JSON.stringify(checkoutMetadata);
checkoutMetadata=btoa(checkoutMetadata);
document.cookie='correosoficial_checkout=' + checkoutMetadata + '; path=/';
let checkoutForm=jQuery('form[name="checkout"]');
metadataArray.forEach(function (metadata){
let inputName=metadata.name;
let newValue=metadata.value;
let inputExist=jQuery('[name="' + inputName + '"]');
if(inputExist.length > 0){
inputExist.val(newValue);
}else{
let newInput=jQuery('<input>').attr('type', 'hidden').attr('name', inputName).val(newValue);
checkoutForm.append(newInput);
}});
}
function cleanCheckoutMetadata(){
let metadataArray=['CarrierID', 'ReferenceType', 'SelectedReference', 'SelectedReferenceData'];
metadataArray.forEach(function (metadata){
let inputExist=jQuery('[name="' + metadata + '"]');
if(inputExist.length > 0){
inputExist.remove();
}});
let checkoutMetadata=getCheckoutMetadata();
metadataArray.forEach(function (metadata){
checkoutMetadata[metadata]='';
});
checkoutMetadata=JSON.stringify(checkoutMetadata);
checkoutMetadata=btoa(checkoutMetadata);
document.cookie='correosoficial_checkout=' + checkoutMetadata + '; path=/';
}
function getCheckoutMetadata(){
return false;
let checkoutMetadata=getCookie('correosoficial_checkout');
checkoutMetadata=atob(checkoutMetadata);
checkoutMetadata=JSON.parse(checkoutMetadata);
return checkoutMetadata;
}
function getCookie(name){
const nameEQ=name + '=';
const cookies=document.cookie.split(';');
for (let i=0; i < cookies.length; i++){
let cookie=cookies[i];
while (cookie.charAt(0)===' '){
cookie=cookie.substring(1);
}
if(cookie.indexOf(nameEQ)===0){
return decodeURIComponent(cookie.substring(nameEQ.length));
}}
return null;
}});