[Back] function latepoint_timestamped_ajaxurl(){
let url = latepoint_helper.ajaxurl;
let timestamp = Date.now();
// Check if the URL already has GET parameters
if (url.includes('?')) {
return `${url}&t=${timestamp}`;
} else {
return `${url}?t=${timestamp}`;
}
}
function latepoint_random_generator() {
var S4 = function () {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}
function latepoint_validate_form($form) {
let errors = [];
$form.find('select[data-os-validate], input[data-os-validate], textarea[data-os-validate]').each(function () {
let validations = jQuery(this).data('os-validate').split(' ');
let $input = jQuery(this);
let label = $input.closest('.os-form-group').find('label').text();
let field_has_errors = false;
if (validations) {
for (let i = 0; i < validations.length; i++) {
switch (validations[i]) {
case 'presence':
if($input.is(':checkbox')){
if (!$input.is(':checked')) {
errors.push({message: label + ' ' + latepoint_helper.msg_validation_presence_checkbox});
field_has_errors = true;
}
}else{
if (!$input.val()) {
errors.push({message: label + ' ' + latepoint_helper.msg_validation_presence});
field_has_errors = true;
}
}
break;
case 'phone':
if (!window.lp_intlTelInputGlobals.getInstance($input[0]).isValidNumber()) {
errors.push({message: label + ' ' + latepoint_helper.msg_validation_invalid});
field_has_errors = true;
}
break;
}
}
}
if (field_has_errors) {
$input.closest('.os-form-group').addClass('os-invalid');
} else {
$input.closest('.os-form-group').removeClass('os-invalid');
}
});
return errors;
}
function latepoint_create_form_data_from_non_form_element($elem) {
let formData = new FormData();
// create objecte from all input fields that are inside of the element
let fields = $elem.find('select, input, textarea').serializeArray();
if (fields) {
fields.forEach(field => formData.append(field.name, field.value));
}
return formData;
}
function latepoint_create_form_data($form, route_name = false, extra_params = false) {
let form_data = new FormData();
let params = new FormData($form[0]);
if (extra_params) {
Object.keys(extra_params).forEach(key => {
params.set(key, extra_params[key]);
});
}
// get values from phone number fields
if (('lp_intlTelInputGlobals' in window) && ('lp_intlTelInputUtils' in window)) {
$form.find('input.os-mask-phone').each(function () {
const phoneInputName = this.getAttribute('name');
const phoneInputValue = window.lp_intlTelInputGlobals.getInstance(this).getNumber(window.lp_intlTelInputUtils.numberFormat.E164);
// override value generated automatically by formdata with a formatted value of a phone field with country code
params.set(phoneInputName, phoneInputValue);
});
}
form_data.append('params', latepoint_formdata_to_url_encoded_string(params));
form_data.append('action', latepoint_helper.route_action);
form_data.append('route_name', route_name ? route_name : $form.data('route-name'));
form_data.append('layout', 'none');
form_data.append('return_format', 'json');
let file_data;
// put file data into main form_data object, since we can't send them in "params" string
$form.find('input[type="file"]').each(function () {
file_data = this.files; // get multiple files from input file
let file_name = this.getAttribute("name");
for (let i = 0; i < file_data.length; i++) {
form_data.append(file_name + '[]', file_data[i]);
}
});
return form_data;
}
function latepoint_mask_timefield($elem) {
if (jQuery().inputmask) {
$elem.inputmask({
'mask': '99:99',
'placeholder': 'HH:MM'
});
}
}
function latepoint_formdata_to_url_encoded_string(form_data) {
let filtered_form_data = new FormData();
// remove file fields from params, so we can serialize it into string,
// !important, this will not include file fields into the form_data, so you have to include them manually, see latepoint_create_form_data() that does it
// note: we don't use form_data.remove(key) on original object because we might want to preserve it
for (const [key, value] of form_data) {
if (value instanceof File) continue;
if (key.slice(-2) === '[]') {
// expecting array, append
filtered_form_data.append(key, value);
} else {
filtered_form_data.set(key, value);
}
}
return new URLSearchParams(filtered_form_data).toString();
}
function latepoint_mask_percent($elem) {
if (jQuery().inputmask) {
$elem.inputmask({
'alias': 'decimal',
'radixPoint': latepoint_helper.decimal_separator,
'digits': 4,
'digitsOptional': false,
'suffix': '%',
'placeholder': '0',
'rightAlign': false
});
}
}
function latepoint_mask_minutes($elem) {
if (jQuery().inputmask) {
$elem.inputmask({
'removeMaskOnSubmit': true,
'alias': 'numeric',
'digits': 0,
'suffix': latepoint_helper.msg_minutes_suffix,
'placeholder': '0',
'rightAlign': false
});
}
}
function latepoint_mask_money($elem) {
if (jQuery().inputmask) {
$elem.inputmask({
'alias': 'currency',
'groupSeparator': latepoint_helper.thousand_separator,
'radixPoint': latepoint_helper.decimal_separator,
'digits': latepoint_helper.number_of_decimals,
'digitsOptional': false,
'prefix': latepoint_helper.currency_symbol_before ? latepoint_helper.currency_symbol_before + ' ' : '',
'suffix': latepoint_helper.currency_symbol_after ? ' ' + latepoint_helper.currency_symbol_after : '',
'placeholder': '0',
'rightAlign': false
});
}
}
function latepoint_mask_date($elem) {
if (jQuery().inputmask) {
$elem.inputmask({
'alias': 'datetime',
'inputFormat': latepoint_helper.date_format_for_js
});
}
}
function latepoint_init_phone_masking_from_placeholder($input) {
if (!latepoint_helper.mask_phone_number_fields) return;
let format = $input.attr('placeholder');
if (format && jQuery().inputmask) {
$input.inputmask(format.replace(/[0-9]/g, 9));
}
}
function latepoint_mask_phone($elem) {
let jsElem = $elem[0];
// First priority is to prevent duplicates (common in non-document.body contexts)
if (jsElem && !window.lp_intlTelInputGlobals.getInstance(jsElem)) {
let dropdownContainer = document.body;
let onlyCountries = JSON.parse(latepoint_helper.included_phone_countries);
// Remedy a quirk with json_encode(EMPTY_ARRAY)
if (onlyCountries.length === 1 && onlyCountries[0] === "") {
onlyCountries = [];
}
const preferredCountries = onlyCountries.length ? [] : window.lp_intlTelInputGlobals.defaults.preferredCountries;
// remove country name in english and only use names in country language
var countryData = window.lp_intlTelInputGlobals.getCountryData();
for (var i = 0; i < countryData.length; i++) {
var country = countryData[i];
country.name = country.name.replace(/ *\([^)]*\) */g, "");
}
let defaultCountryCode = latepoint_helper.default_phone_country;
if (onlyCountries.length && !onlyCountries.includes(defaultCountryCode)) {
defaultCountryCode = onlyCountries[0];
}
let iti = window.lp_intlTelInput(jsElem, {
dropdownContainer: dropdownContainer,
formatOnDisplay: true,
nationalMode: true,
autoPlaceholder: 'aggressive',
initialCountry: defaultCountryCode,
geoIpLookup: function (callback) {
const cookieName = 'latepoint_phone_country';
if (latepoint_has_cookie(cookieName)) {
callback(latepoint_get_cookie(cookieName));
} else {
jQuery.get('https://ipinfo.io', function () {
}, 'jsonp').always(function (response) {
// Sensible default
let countryCode = defaultCountryCode;
if (response && response.country) {
countryCode = response.country.toLowerCase();
latepoint_set_cookie(cookieName, countryCode);
}
callback(countryCode);
})
}
},
allowDropdown: onlyCountries.length != 1,
onlyCountries: onlyCountries,
preferredCountries: preferredCountries,
separateDialCode: latepoint_helper.is_enabled_show_dial_code_with_flag
});
iti.promise.then(function () {
latepoint_init_phone_masking_from_placeholder($elem);
});
$elem.on("countrychange", function (event) {
latepoint_init_phone_masking_from_placeholder(jQuery(this));
});
}
}
function latepoint_show_booking_end_time() {
return (latepoint_helper.show_booking_end_time == 'yes');
}
function latepoint_set_cookie(name, value, days) {
let date = new Date;
date.setTime(date.getTime() + 24 * 60 * 60 * 1000 * days);
document.cookie = name + "=" + value + ";path=/;expires=" + date.toGMTString();
}
function latepoint_get_cookie(name) {
let cookie = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return cookie ? cookie[2] : null;
}
function latepoint_has_cookie(name) {
return latepoint_get_cookie(name) !== null;
}
function latepoint_delete_cookie(name) {
latepoint_set_cookie(name, '', -1);
}