var Packlink = window.Packlink || {};
(function () {
let hookedUpdate = false;
let modal;
let closeButton;
let updateButton;
let privateData = {
locations: [],
endpoint: null,
selectedLocation: null,
isCart: false,
translations: {},
locale: 'en'
};
Packlink.checkout = {};
Packlink.checkout.init = initialize;
Packlink.checkout.setIsCart = setIsCart;
Packlink.checkout.setLocations = setLocations;
Packlink.checkout.setLocale = setLocale;
Packlink.checkout.setTranslations = setTranslations;
Packlink.checkout.setSaveEndpoint = setSaveEndpoint;
Packlink.checkout.setDropOffAddress = setDropOffAddress;
Packlink.checkout.setSelectedLocationId = setSelectedLocationId;
Packlink.checkout.setNoDropOffLocationsMessage = setNoDropOffLocationsMessage;
function initialize() {
modal = document.getElementById( 'pl-picker-modal' );
closeButton = document.getElementById( 'pl-picker-modal-close' );
updateButton = document.querySelector( "[name='calc_shipping']" );
let templates = document.getElementById("packlink-js-templates");
[].forEach.call(
document.getElementsByName( 'packlink_show_image' ),
function (item) {
let parent = item.parentElement;
let showImage = item.value;
let imageInput = parent.querySelector( 'input[name="packlink_image_url"]' );
let button = parent.querySelector( '#packlink-drop-off-picker' );
let isDropOff = parent.querySelector( 'input[name="packlink_is_drop_off"]' );
let isCOD = parent.querySelector('input[name="packlink_cash_on_delivery"]');
if (isCOD && isCOD.value === 'yes') {
const codFeeInput = parent.querySelector('input[name="packlink_cash_on_delivery_fee"]');
let codNameInput = parent.querySelector('input[name="packlink_cash_on_delivery_name"]');
const codName = codNameInput ? codNameInput.value : '';
const codFee = codFeeInput ? parseFloat(codFeeInput.value) : 0;
const shippingInput = parent.querySelector('input[name^="shipping_method"]');
if (shippingInput && shippingInput.checked) {
addCODMessage(parent, codName, codFee);
}
}
if (showImage === 'yes' && imageInput && parent.querySelector('.pl-checkout-carrier-image') === null) {
injectImage( imageInput );
}
if (isDropOff && button) {
button.addEventListener('click', handleSelectDropOffLocationAction);
button.removeAttribute('style');
}
}
);
if (modal) {
closeButton.addEventListener(
'click',
function () {
modal.style.display = 'none';
}
);
initLocationPicker();
let errorMessage = document.getElementById('no-drop-off-locations-message');
if (privateData.locations.length > 0) {
errorMessage.style.display = 'none';
}
}
if ( ! hookedUpdate && updateButton && jQuery) {
jQuery( document.body ).on( 'updated_wc_div', initialize );
hookedUpdate = true;
}
document.addEventListener( 'DOMContentLoaded', setDropOffAddress );
}
function setDropOffAddress() {
if ( ! privateData.selectedLocation || privateData.isCart) {
return;
}
let selected = findLocationById( privateData.selectedLocation );
if ( ! selected) {
return;
}
setHiddenFields( selected );
let button = document.querySelector( '#packlink-drop-off-picker' );
let element = document.querySelector( 'p.woocommerce-shipping-destination' );
if ( ! element) {
element = document.createElement( 'p' );
element.className = 'woocommerce-shipping-destination';
}
element.innerHTML = '' + privateData.translations.dropOffTitle + '
'
+ [selected.name, selected.address, selected.city].join( ', ' );
if (button) {
button.parentNode.insertBefore( element, button.nextSibling );
}
}
function setHiddenFields(location) {
let dropOffId = document.querySelector('input[name="packlink_drop_off_id"]');
let dropOffExtra = document.querySelector('input[name="packlink_drop_off_extra"]');
if (dropOffId && dropOffExtra) {
dropOffId.value = location.id;
dropOffExtra.value = JSON.stringify( location );
}
}
function addCODMessage(dataDiv, codName, codFee) {
if (!dataDiv) return;
if (!codName || !codFee || codFee <= 0) return;
if (dataDiv.querySelector('.packlink-cod-message')) return;
const messageDiv = document.createElement('div');
messageDiv.className = 'packlink-cod-message';
messageDiv.innerHTML = `This service supports ${codName}. If you choose the ${codName} payment method, an additional fee of ${codFee} will be applied.`;
messageDiv.style.marginTop = '8px';
messageDiv.style.fontSize = '12px';
messageDiv.style.color = '#555';
dataDiv.lastChild.before(messageDiv);
}
/**
* Sets locations.
*
* @param {array} locations
*/
function setLocations(locations) {
privateData.locations = locations;
}
/**
* Sets save selected endpoint.
*
* @param {string} endpoint
*/
function setSaveEndpoint(endpoint) {
privateData.endpoint = endpoint;
}
/**
* Sets selected drop-off id.
*
* @param {int} locationId
*/
function setSelectedLocationId(locationId) {
privateData.selectedLocation = '' + locationId;
}
/**
* Sets is cart flag.
*
* @param {boolean} isCart
*/
function setIsCart(isCart) {
privateData.isCart = isCart;
}
/**
* Sets package delivery translations.
*
* @param {object} translations
*/
function setTranslations(translations) {
privateData.translations = translations;
}
/**
* Sets locale.
*
* @param {string} locale
*/
function setLocale(locale) {
privateData.locale = locale;
}
/**
* Returns location with provided id.
*
* @param {int|string} id
*
* @returns {object}
*/
function findLocationById(id) {
id = '' + id;
return privateData.locations.find(
function (a) {
return a.id === id;
}
);
}
/**
* @param {HTMLElement} imageSrcInput
*/
function injectImage(imageSrcInput) {
let image = document.createElement( 'img' );
image.src = imageSrcInput.value;
image.alt = 'carrier image';
image.className = 'pl-checkout-carrier-image';
let label = imageSrcInput.parentElement.querySelector( 'label' );
if ( label ) {
label.prepend( image );
} else {
imageSrcInput.parentElement.prepend( image );
}
}
function initLocationPicker() {
Packlink.locationPicker.display(
privateData.locations,
function (id) {
let selected;
privateData.selectedLocation = id;
selected = findLocationById( id );
Packlink.ajaxService.post(
privateData.endpoint,
selected,
function () {
let button = document.querySelector( '#packlink-drop-off-picker' );
if (button) {
button.innerHTML = privateData.translations.changeDropOff;
}
if ( ! privateData.isCart) {
setHiddenFields( selected );
}
},
function () {
}
);
setDropOffAddress();
modal.style.display = 'none';
},
privateData.selectedLocation,
privateData.locale
);
}
function setNoDropOffLocationsMessage(message) {
if (document.getElementById('no-drop-off-locations-message')) {
return;
}
let info = document.createElement('div');
info.className = 'woocommerce-info';
info.innerHTML = message;
let noticeWrapper = document.createElement('div');
noticeWrapper.id = 'no-drop-off-locations-message';
noticeWrapper.appendChild(info);
let checkoutElement = document.querySelector('[name="checkout"]');
if (checkoutElement) {
checkoutElement.insertAdjacentElement('beforebegin', noticeWrapper);
}
noticeWrapper.style.display = 'none';
}
function handleSelectDropOffLocationAction() {
initLocationPicker();
let errorMessage = document.getElementById('no-drop-off-locations-message');
if (privateData.locations.length > 0) {
modal.style.display = 'block';
}
if (errorMessage) {
errorMessage.style.display = privateData.locations.length > 0 ? 'none' : 'block';
}
}
})();