/**
* Javascript: EventON functions for all calendars
* @version: 5.0
* @license EventON JavaScript Assets
* Copyright (C) 2014-2025 Ashan Jay, AshanJay Designs LLC.
*
* PROPRIETARY LICENSE - All Rights Reserved
*
* Permission granted solely for personal use with valid EventON license.
* YOU MAY NOT: redistribute, resell, sublicense, or publish these Assets.
*
* Trademark: "EventON" is a trademark of AshanJay Designs LLC.
* Contact: info@myeventon.com
*
* PROVIDED "AS IS" WITHOUT WARRANTY. VIOLATION MAY RESULT IN LEGAL ACTION.
*/
jQuery(document).ready(function($) {
const BB = $('body');
// Basics
// Calendar function s
$.fn.evo_cal_functions = function(O){
const el = this;
switch(O.action){
// load shortcodes inside calendar data
case 'load_shortcodes':
return el.find('.evo_cal_data').data('sc');
break;
case 'update_json':
//console.log(O.json);
el.find('.evo_cal_events').data('events', O.json);
break;
case 'update_shortcodes':
//console.log(O.SC);
el.find('.evo_cal_data').data( 'sc', O.SC );
break;
}
};
// access page GLOBALS
$.fn.evo_get_global = function(opt){
var defaults = { S1:'', S2:''};
var OPT = $.extend({}, defaults, opt);
var BUS = $('#evo_global_data').data('d');
if(!(OPT.S1 in BUS)) return false;
if(!(OPT.S2 in BUS[OPT.S1])) return false;
return BUS[OPT.S1][OPT.S2];
}
$.fn.evo_get_txt = function(opt){
var defaults = { V:''}
var OPT = $.extend({}, defaults, opt);
var BUS = $('#evo_global_data').data('d');
//console.log(BUS);
if(!('txt' in BUS)) return false;
if(!(OPT.V in BUS.txt)) return false;
return BUS.txt[OPT.V];
}
// get translated text strings from ajax loaded data @4.6.4
$.fn.evo_lang = function(text){
var t = text.toLowerCase()
.replace(/ /g, "_")
.replace(/[^\w-]+/g, "");
var BUS = $('#evo_global_data').data('d');
if(!('txt' in BUS)) return text;
if(!(t in BUS.txt)) return text;
return BUS.txt[ t ];
}
$.fn.evo_get_cal_def = function(opt){
var defaults = { V:''}
var OPT = $.extend({}, defaults, opt);
var BUS = $('#evo_global_data').data('d');
if(!('cal_def' in BUS)) return false;
if(!(OPT.V in BUS.cal_def)) return false;
return BUS.cal_def[OPT.V];
}
// return dms translates values from global data
// added 4.0
$.fn.evo_get_dms_vals = function(opt){
// type = d, d1,d3, m, m3
// V = 0-x
var defaults = { type:'d', V:''}
var OPT = $.extend({}, defaults, opt);
var BUS = $('#evo_global_data').data('d');
if(!('dms' in BUS)) return false;
if(!(OPT.type in BUS.dms)) return false;
return BUS.dms[ OPT.type ][ OPT.V ];
}
// GENERAL AJAX ACCESS @4.7.2 updated @4.9.2
$.fn.evo_admin_get_ajax = function(opt){
var el = $(this);
var OO = this.evo_process_ajax_params( opt );
var _lbdata = OO.lbdata;
var _adata = OO.adata;
var _populate_id = OO._populate_id;
// Allow custom success callback to be passed in opt -- 4.9.2
var customBefore = typeof opt.onBefore === 'function' ? opt.onBefore : null; // New onBefore callback
var customSuccess = typeof opt.onSuccess === 'function' ? opt.onSuccess : (typeof opt.success === 'function' ? opt.success : null);
// Rename to onSuccess, keep backward compatibility with 'success'
var customSuccess_Extra = typeof opt.successExtra === 'function' ? opt.successExtra : null; // this will run with default ajax
var customComplete = typeof opt.onComplete === 'function' ? opt.onComplete : null; // New onComplete callback
var ajax_url = el.evo_get_ajax_url({a: _adata.a, e: _adata.end, type: _adata.ajax_type});
// for lightbox
var LB = false;
if( _lbdata.class != '') LB = $('body').find('.evo_lightbox.'+ _lbdata.class );
// Run AJAX
$.ajax({
beforeSend: function(){
if (customBefore) { customBefore.call(el, OO, LB); } // Call with onBefore:function(OO, LB){}
el.evo_perform_ajax_run_loader( OO, LB, 'start' );
},
type: 'POST', url: ajax_url, data: _adata.data, dataType:'json',
success:function(data){
//console.log(data);
// If a custom success callback is provided, use it
if (customSuccess) {
customSuccess.call(el, OO, data, LB); // Call with onSuccess:function( OO, data, LB){}
// call data with data.data
// Trigger a custom event for onSuccess - 4.9.11
$('body').trigger('evo_ajax_success_' + OO.uid,[ OO, data , el]);
} else {
// Otherwise, use the default success behavior
el.evo_perform_ajax_success(OO, data, LB);
if( customSuccess_Extra ) customSuccess_Extra.call( el, OO, data, LB );
}
},complete:function(){
if (customComplete) { customComplete.call(el, OO, data, LB); } // Call with onSuccess:function( OO, data, LB){}
el.evo_perform_ajax_run_loader( OO, LB, 'end' );
}
});
}
// submit forms via ligtbox
// @since 4.2.2 @updated 4.8
$.fn.evo_ajax_form_submit = function( opt , boxtype , formObj){
const el = this;
var OO = this.evo_process_ajax_params( opt );
//console.log(OO);
var _lbdata = OO.lbdata;
var _spdata = OO.spdata;
var _adata = OO.adata;
var _populate_id = OO._populate_id;
// get parent element
var parent = '';
if( boxtype == 'sp') parent = el.closest('.evosp_in');
if( boxtype == 'lb'){
parent = el.closest('.evo_lightbox');
if( _lbdata.class != '') parent = $('body').find('.evo_lightbox.'+ _lbdata.class );
}
var form = parent.find('form');
if( formObj !== undefined ) form = formObj;
// form required fields validation - @4.9
if( el.hasClass('validate')){
var hasError = false;
$('body').trigger('evo_elm_form_presubmit_validation', [form, function(isValid) {
hasError = isValid ? false: true;
}]);
if( hasError){
el.evo_snackbar( 'Required fields missing' );
//LB.evo_lightbox_show_msg({message:'Required fields missing'});
return;
}
}
// reset LB message
if( boxtype == 'lb') parent.evo_lightbox_hide_msg();
var ajax_url = el.evo_get_ajax_url({a: _adata.a, e: _adata.end, type: _adata.ajax_type});
// Add passed on data from ajax object @4.8.2
var extra_ajax_data = ('data' in _adata ) ? _adata.data : null;
// Submit form
form.ajaxSubmit({
beforeSubmit: function(opt, xhr){
el.evo_perform_ajax_run_loader( OO, parent, 'start', boxtype );
},
dataType: 'json',
url: ajax_url, type: 'POST',
data: extra_ajax_data,
success:function(data){
el.evo_perform_ajax_success( OO, data, parent , boxtype);
},
complete:function(){
el.evo_perform_ajax_run_loader( OO, parent, 'end' , boxtype );
}
});
}
$.fn.evo_ajax_lightbox_form_submit = function(opt , formObj ){
this.evo_ajax_form_submit( opt, 'lb', formObj );
}
// perform ajax functions / type = start/end
$.fn.evo_perform_ajax_run_loader = function( OO , LB, type , boxtype){
var el = this;
var _lbdata = OO.lbdata;
var _adata = OO.adata;
var _spdata = OO.spdata;
//console.log(OO);
var customer_loader_elm = false;
var loader_btn_el = false;
var loader_in_icon = false;
if( _adata.loader_el !='') customer_loader_elm = _adata.loader_el;
if( 'loader_class' in _adata && _adata.loader_class != '')
customer_loader_elm = $('.' + _adata.loader_class);
if( _adata.loader_btn_el != '' && _adata.loader_btn_el !== undefined ) loader_btn_el = el;
if( _adata.loader_in_icon != '' && _adata.loader_in_icon !== undefined ) loader_in_icon = el;
var LB_loader = false;
if( LB && 'loader' in _lbdata && _lbdata.loader ) LB_loader = true;
if( type == 'start'){
var trigger_id = ( 'uid' in OO && OO.uid != '' ) ? OO.uid : OO.ajax_action; // @4.8
$('body').trigger('evo_ajax_beforesend_' + trigger_id ,[ OO, el ]);
if( LB_loader ){
LB.find('.ajde_popup_text').addClass( 'evoloading'); // legacy
LB.evo_lightbox_start_inloading();
}
if( customer_loader_elm ) $( customer_loader_elm ).addClass('evoloading ');
if( loader_btn_el ) el.addClass('evobtn_loader'); // loader on button
if( loader_in_icon ) el.addClass('evoloader_icon'); // Loader in Icon (replace i.fa child with loader elm) @5.0.3
}else{
var trigger_id = ( 'uid' in OO && OO.uid != '' ) ? OO.uid : OO.ajax_action; // @4.8
if( trigger_id === undefined ) trigger_id = OO.adata.a;
//console.log(OO);
$('body').trigger('evo_ajax_complete_' + trigger_id ,[ OO , el ]);
if( LB_loader ){
LB.find('.ajde_popup_text').removeClass( 'evoloading');
LB.evo_lightbox_stop_inloading();
}
if( customer_loader_elm ) $( customer_loader_elm ).removeClass('evoloading');
if( loader_btn_el ) el.removeClass('evobtn_loader'); // loader on button
if( 'loader_btn_el_done' in _adata && _adata.loader_btn_el_done ) el.addClass('evobtn_loader success' );
if( loader_in_icon ) el.removeClass('evoloader_icon'); // Loader in Icon (replace i.fa child with loader elm) @5.0.3
}
return {
'l1': customer_loader_elm,
'l2':LB_loader
};
}
$.fn.evo_perform_ajax_success = function ( OO, data, LB , boxtype){
var el = this;
var _lbdata = OO.lbdata;
var _adata = OO.adata;
var _spdata = OO.spdata;
var _populate_id = OO._populate_id;
if( !data || data === undefined ) return;
//console.log(OO);
// if json is passing data object @4.9
var _success = ('success' in data) ? data.success : (data.status === 'good');
var extractedContent = 'content' in data ? data.content: '';
if( 'data' in data && 'content' in data.data) extractedContent = data.data.content;
var extractedData = ('data' in data) ? data.data : data;
extractedData['content'] = extractedContent;
// Ensure extractedData is an object for property checks; if it’s a string, wrap it
if (typeof extractedData !== 'object' || extractedData === null) {
extractedData = { msg: extractedData }; // Convert string to object
}
// Assign success and status to the extracted data
extractedData.success = _success;
extractedData.status = ('status' in extractedData) ? extractedData.status : (_success ? 'good' : 'bad');
// Replace original data with processed data
data = extractedData;
//console.log(data);
//console.log( OO);
// if inside lightbox
if( LB.length > 0 ){
// show message
if (data && typeof data === 'object' && !Array.isArray(data) && 'msg' in data && data.msg !== '') {
LB.evo_lightbox_show_msg({
'type': ( _success ? 'good':'bad'),
'message':data.msg,
hide_lightbox: ( _success ? _lbdata.hide : false ),
hide_message: _lbdata.hide_msg
});
}
// populate lightbox
if( data && _lbdata.new_content && 'content' in data && data.content != '' ){
// populate a specific dom element with content
if( _populate_id ){
$('body').find('#'+_populate_id ).replaceWith( data.content );
}else{
LB.evo_lightbox_populate_content({content: data.content});
}
}
}else{
// populate content
if( data && _populate_id && 'content' in data && data.content != ''){
$('body').find('#'+_populate_id ).html( data.content );
}
}
// Show snackbar message
if( 'show_snackbar' in _adata && ('msg' in data) && data.msg != '' )
el.evo_snackbar({message: data.msg});
// populate content with matching DOM class names, will set new html @4.7.2
if( data && 'populate_dom_classes' in data){
$.each( data.populate_dom_classes, function( domclass, content){
$('body').find('.'+ domclass).html( content );
} );
}
// if ajax data pass dom content to be replaced with run through each and replace - @4.2.3
if(data && 'refresh_dom_content' in data ){
$.each(data.refresh_dom_content, function(domid, content){
$('body').find('#'+ domid).replaceWith( content);
});
}
// Trigger success actions @5.0.3
// call like 'trig_success'=> [ ['evosp_trig_close', ['delay'=> 2000] ] ]
if( _success && 'trig_success' in _adata ){
$.each( _adata.trig_success, function(i, item) {
var event_name = item[0];
var extra_data = item[1] || {}; // parameters object (or {} if none)
$('body').trigger( event_name, extra_data );
});
}
// for SP content @since 4.5.2
if(data && 'sp_content' in data){
$("body").find('#evops_content').html( data.sp_content);
}
// SP footer content @since 4.5.2
if( data && 'sp_content_foot' in data){
$("body").find('.evosp_foot_in').html( data.sp_content_foot);
}
// SP Show message
if( data && 'sp_show_msg' in data){
BB.evo_showmsg_sidepanel( data.sp_show_msg );
}
// process trumbowyg editors
$('body').trigger('evo_elm_load_interactivity');
// assign dynamic vals to DOM element
setTimeout(function(){
if( 'evoelms' in data ){
$.each( data.evoelms , function( uniqueid, elm_data ){
$('body').find('.has_dynamic_vals').each(function(){
if( $(this).attr('id') != uniqueid ) return;
var dynamic_elm = $(this);
$.each( elm_data , function( elm_key, elmv){
dynamic_elm.data( elm_key, elmv );
});
});
});
}
},200);
// call like $('body').on('evo_ajax_success_X', function(event, OO, data, el){
$('body').trigger('evo_ajax_success_' + OO.uid,[ OO, data , el]);
}
// Process ajax and lightbox values @4.7.2
$.fn.evo_process_ajax_params = function ( opt ){
// defaults
var defz = {
'uid':'',
// @since 4.7.2
'adata':{}, // @4.7.2 include all ajax data in here, type (ajax,rest,endpoint),action/a, other data
'lbdata':{},// @4.7.2 lightbox data all in one place, class, title, size, padding
'spdata':{},// @5.0.3 side panel data all in one place, class, title, size, padding, ajax_data
'_populate_id':'', // loading new content into matching elements outside of lightbox
// legacy values
'content':'',// passed on dynamic content
'content_id' :'',// id to get dynamic content from page
't':'', //title
'lbc':'',// * lightbox class - REQUIRED
'lbac':'',// ligthbox additional class 4.6
'lbsz':'',// lightbox size = mid small, s400, s500, s700, s800
'lightbox_loader': true,
'preload_temp_key': 'init', // 4.6
'load_new_content': true, // @since 4.3.5
'lb_padding': '', // @4.3.5
'load_new_content_id':'',
'ajax':'no',// use ajax to load content yes no
'ajax_url':'',// load content from ajax file
'end':'admin',// admin or client end
'ajax_action':'', // @4.4 pass on ajax endpoint action key
'a':'',
'ajax_type':'ajax', // @4.4 ajax type, ajax, rest or endpoint
'd':'', // data object for ajax
'other_data':'',
'ajaxdata':'',
};
// extend passed with defaults
var OO = $.extend({}, defz, opt);
// Build processed object
var processed = {};
processed['uid'] = OO.uid;
// Ajax
var _adata = ( OO.adata == '') ? {}: OO.adata;
// type passed value fix
var passed_type_val = false;
if( 'type' in _adata && _adata.type != '' &&
!['ajax', 'rest', 'endpoint'].includes(_adata.type)
){
passed_type_val = _adata.type;
_adata.type = '';
}
// set default needed values
var def_avals = {
'a':'',
'type':'ajax',
'end':'admin',
'data': '',
'loader_el':'',
'loader_btn_el':'',//4.8
'loader_class':'',
'url':'',
'trig_success':[], // @5.0.3 trigger actions to run on success
}
// set default values
$.each( def_avals, function(key, value) {
if( key == 'data' && !( 'a' in _adata ) && ('data' in _adata ) && 'a' in _adata.data ) return;
if( !(key in _adata ) && value != '' ) _adata[ key ] = value;
});
//console.log( _adata );
// map old to new
var def_adata_mapping = {
'a' : 'a',
'ajax_action' : 'a',
'ajax_type':'type',
'end': 'end',
'ajax_url': 'url',
'ajaxdata':'data',
'ajax_data':'data',
'd':'data',
}
$.each( def_adata_mapping, function(oldV, newV) {
if( newV in _adata && _adata[ newV ] != '' ) return;
if( oldV in OO && OO[oldV] !== '' ) {
_adata[newV] = OO[oldV];
}
});
if( _adata.data === undefined ) _adata.data = {};
//console.log( _adata );
// Move additional values in _adata to _adata.data
$.each(_adata, function(key, value) {
if ( !(key in def_avals)) {
//_adata.data[key] = value; // Move any extra values to _adata.data
//delete _adata[key]; // Remove them from the main _adata object
}
});
if( 'data' in _adata ){
//_adata['data']['nn'] = ( _adata.end == 'client' ) ? evo_general_params.n : evo_admin_ajax_handle.postnonce;
_adata['data']['nn'] = (typeof evo_admin_ajax_handle !== 'undefined' && evo_admin_ajax_handle !== null)
? evo_admin_ajax_handle.postnonce
: evo_general_params.n;
_adata['data']['uid'] = processed['uid'];
if( passed_type_val ) _adata['data']['type'] = passed_type_val;
if( 'action' in _adata.data ) _adata['a'] = _adata.data.action;
if( 'a' in _adata.data ) _adata['a'] = _adata.data.a;
if( 'ajaxdata' in OO ) processed['ajaxdata'] = _adata.data;
}
processed['adata'] = _adata;
// lightbox
var _lbdata = ( OO.lbdata == '') ? {}: OO.lbdata;
// if legacy values exists > convert them to new
var def_lbdata_mapping = {
'lbc':'class',
'lbsz':'size',
'lbac' :'additional_class',
't':'title',
'lb_padding': 'padding',
'load_new_content':'new_content',
'lightbox_loader': 'loader',
'content_id':'content_id',
'content':'content',
'hide_lightbox':'hide',
'hide_message':'hide_msg',
'lightbox_key': 'class',
}
$.each( def_lbdata_mapping, function(oldV, newV) {
// if _lbdata has new value > skip
if (newV in _lbdata && _lbdata[newV] !== '' && _lbdata[newV] !== null && _lbdata[newV] !== undefined) {
return;
}
if( oldV in OO && OO[oldV] !== '' ) {
_lbdata[newV] = OO[oldV];
}
});
// set default needed values
var def_lbvals = {
'padding':'evopad30',
'loader': false,
'preload_temp_key':'init',
'new_content': true,
'additional_class':'',
'title':'',
'hide':false,
'hide_msg':2000,
'content':'', // content for lightbox
'content_id':'', // content id in DOM to grab content for lightbox
}
// set default values
$.each( def_lbvals, function(key, value) {
if( key in _lbdata ) return;
if( value == '') return;
_lbdata[ key ] = value;
});
//console.log( _lbdata.new_content ) ;
// load lightbox content legacy
if( OO.ajaxdata.load_lbcontent ) _lbdata['new_content'] = true;
if( OO.ajaxdata.load_new_content ) _lbdata['new_content'] = true;
// populate new content @4.7.3
processed['_populate_id'] = false;
if( OO.load_new_content_id != '') processed['_populate_id'] = OO.load_new_content_id;
if( 'new_content_id' in _lbdata && _lbdata.new_content_id != '') processed['_populate_id'] = _lbdata.new_content_id;
if( 'content_id' in _lbdata && _lbdata.content_id != '') processed['_populate_id'] = _lbdata.content_id;
processed['lbdata'] = _lbdata;
// make sure uid is moved to main level
if( processed.uid == '' && 'uid' in processed['lbdata'] ) processed['uid'] = processed['lbdata']['uid'];
// add legacy variables for backward compatibility
$.each(opt, function(oldkey, oldval){
if( oldkey in processed ) return;
processed[ oldkey ] = oldval;
});
// Side Panel
var _spdata = ( OO.spdata == '' ) ? {} : OO.spdata;
// set default needed values
var def_spvals = {
'class':'',
'loader': false,
'new_content': true,
'additional_class':'',
'title':'',
'hide':false,
'hide_msg':2000,
'content':'', // content for sp
'content_id':'', // content id in DOM to grab content for sp
'size':'',
}
// set default values
$.each( def_spvals, function(key, value) {
if( key in _lbdata ) return;
if( value == '') return;
_lbdata[ key ] = value;
});
//console.log( processed );
return processed;
}
// LIGHTBOX triggers
// @version 4.2
$('body').on('click','.evolb_trigger', function(event){
if( event !== undefined ){
event.preventDefault();
event.stopPropagation();
}
$(this).evo_lightbox_open(
$(this).data('lbvals') ?? $(this).data('d')
);
});
$('body').on('click','.evolb_close_btn', function (){
const LB = $(this).closest('.evo_lightbox');
LB.evo_lightbox_close();
});
// save form content - @since 4.2.2
$('body').on('click','.evolb_trigger_save, .evo_submit_form', function(event){
if( event !== undefined ){ event.preventDefault(); event.stopPropagation(); }
$(this).evo_ajax_lightbox_form_submit( $(this).data('d') );
});
$('body').on('click','.evo_trigger_ajax_run', function(event){
if( event !== undefined ){
event.preventDefault();
event.stopPropagation();
}
//console.log($(this).data('d') );
$(this).evo_admin_get_ajax( $(this).data('d') );
});
// @since 4.3.3
$('body').on('evo_lightbox_trigger', function(event, data){
event.preventDefault();
//console.log( data );
$('body').evo_lightbox_open(data);
});
// Lightbox opening
// @updated 4.9.11
$.fn.evo_alert = function(opt){ // @since 4.9.2
var defz = {
'title': 'Confirmation Action',
'message': '',
'yes_text': 'Proceed',
'no_text': 'No',
'on_yes': function() {}, // Callback for Yes
'on_no': function() {} // Callback for No
};
// Extend passed options with defaults
var options = $.extend({}, defz, opt);
// Create alert HTML content
var alertHtml = '
' +
'
' + options.message + '
' +
'
' +
'' +
'' +
'
';
// Define lightbox options with the alert content
var lightboxOptions = {
lbdata: {
class: 'evo_alert_lightbox',
title: options.title || 'Alert',
content: alertHtml, // Set the alert HTML as the lightbox content
padding: 'pad20', // Optional: Add padding class if needed
size:'small',
},
};
// Open the lightbox with the alert content
$(this).evo_lightbox_open(lightboxOptions);
// After the lightbox is opened, attach event handlers
setTimeout(function() {
var LIGHTBOX = $('.evo_lightbox.evo_alert_lightbox');
LIGHTBOX.find('.evo_alert_yes').on('click', function() {
var shouldClose = options.on_yes(LIGHTBOX);// Execute Yes callback
console.log(shouldClose);
if (shouldClose !== false) {
LIGHTBOX.evo_lightbox_close(); // Close the lightbox
}
removeKeyListeners(); // Remove key listeners
});
LIGHTBOX.find('.evo_alert_no').on('click', function() {
options.on_no(LIGHTBOX); // Execute No callback
LIGHTBOX.evo_lightbox_close(); // Close the lightbox
removeKeyListeners(); // Remove key listeners
});
// Keypress handler function
function handleKeyPress(event) {
if (event.key === 'Escape') { // Esc key
options.on_no(LIGHTBOX); // Execute No callback
LIGHTBOX.remove(); // Close the lightbox
removeKeyListeners(); // Remove key listeners
} else if (event.key === 'Enter') { // Enter key
options.on_yes(LIGHTBOX); // Execute Yes callback
LIGHTBOX.remove(); // Close the lightbox
removeKeyListeners(); // Remove key listeners
}
}
// Add keypress listener
$(document).on('keydown', handleKeyPress);
// Function to remove key listeners
function removeKeyListeners() {
$(document).off('keydown', handleKeyPress);
}
// Ensure key listeners are removed when lightbox is closed manually (e.g., via close button)
LIGHTBOX.find('.evolb_close_btn').on('click', function() {
removeKeyListeners();
});
}, 350); // Delay to ensure lightbox is fully rendered
}
$.fn.evo_lightbox_open = function (opt ){
var OO = this.evo_process_ajax_params( opt );
var _lbdata = OO.lbdata;
var _adata = OO.adata;
var _populate_id = OO._populate_id;
//console.log(opt);
//console.log(OO);
// check if required values missing for lightbox
if( !('class' in _lbdata) || _lbdata.class == '' ) return;
const fl_footer = _adata.end == 'client' ? '' :'';
// create lightbox HTML
var __lb_size = _lbdata.size === undefined ? '' : _lbdata.size;
var html = '';
$('#evo_lightboxes').append( html );
var LIGHTBOX = $('.evo_lightbox.'+ _lbdata.class );
// Open lightbox on page
setTimeout( function(){
$('#evo_lightboxes').show();
LIGHTBOX.addClass('show');
$('body').addClass('evo_overflow');
$('html').addClass('evo_overflow');
},300);
// show loading animation
LIGHTBOX.evo_lightbox_show_open_animation(OO);
// Load content locally from DOM
if (_lbdata.content_id != '') {
var content = $('#' + _lbdata.content_id).html();
LIGHTBOX.find('.evolb_content').html(content);
}
if (_lbdata.content != '') {
LIGHTBOX.find('.evolb_content').html(_lbdata.content);
}
// run ajax to load content for the lightbox inside
if( 'a' in _adata && _adata.a != ''){ // @4.7.2
LB.evo_admin_get_ajax( OO );
}
// load content from a AJAX file
if( 'url' in _adata && _adata.url != '' ){
$.ajax({
beforeSend: function(){},
url: OO.ajax_url,
success:function(data){
LIGHTBOX.find('.evolb_content').html( data);
},complete:function(){}
});
}
$('body').trigger('evo_lightbox_processed', [ OO, LIGHTBOX]);
}
$.fn.evo_lightbox_close = function(opt) {
if (!this.hasClass('show')) return;
const defaults = { delay: 500, remove_from_dom: true };
const OO = $.extend({}, defaults, opt);
const hideDelay = parseInt(OO.delay);
const completeClose = this.parent().find('.evo_lightbox.show').length === 1;
// Remove 'show' class with delay if needed
hideDelay > 500 ? setTimeout(() => this.removeClass('show'), hideDelay - 500) : this.removeClass('show');
// Final cleanup after delay
setTimeout(() => {
if (completeClose) {
$('body, html').removeClass('evo_overflow');
}
if (OO.remove_from_dom) this.remove();
}, hideDelay);
};
// Other LB functions
$.fn.evo_lightbox_populate_content = function(opt){
LB = this;
var defaults = {
'content':'',
}; var OO = $.extend({}, defaults, opt);
LB.find('.evolb_content').html( OO.content );
}
$.fn.evo_lightbox_show_msg = function(opt){
LB = this;
var defaults = {
'type':'good',
'message':'',
'hide_message': false,// hide message after some time pass time or false
'hide_lightbox': false, // hide lightbox after some time of false
}; var OO = $.extend({}, defaults, opt);
LB.find('.message').removeClass('bad good').addClass( OO.type ).html( OO.message ).fadeIn();
if( OO.hide_message ) setTimeout(function(){ LB.evo_lightbox_hide_msg() }, OO.hide_message );
if( OO.hide_lightbox ) LB.evo_lightbox_close({ delay: OO.hide_lightbox });
}
$.fn.evo_lightbox_hide_msg = function(opt){
LB = this;
LB.find('p.message').hide();
}
// add preload animations to lightbox u4.6
$.fn.evo_lightbox_show_open_animation = function(opt){
LB = this;
var defaults = {
'animation_type':'initial', // animation type initial or saving
'preload_temp_key': 'init', // 4.6 passed on preload template key
'end':'admin',
};
var OO = $.extend({}, defaults, opt);
if( OO.animation_type == 'initial'){
passed_data = ( typeof evo_admin_ajax_handle !== 'undefined') ? evo_admin_ajax_handle: evo_general_params;
//console.log( passed_data);
html = passed_data.html.preload_general;
if( OO.preload_temp_key != 'init') html = passed_data.html[ OO.preload_temp_key ];
LB.find('.evolb_content').html( html );
}
if( OO.animation_type == 'saving')
LB.find('.evolb_content').addClass('evoloading');
}
// eventcard Lightbox function v4.6
$.fn.evo_cal_lightbox_trigger = function( SC_data , obj, CAL , LB = null){
const event = obj.closest('.eventon_list_event');
const classes = ['cancel_event', SC_data.additional_class, SC_data.calendar_type]
.filter(cls => cls && (cls !== 'cancel_event' || obj.hasClass('cancel_event')))
.join(' ');
//console.log( SC_data);
const other_data = {
extra_classes: `evo_lightbox_body eventon_list_event evo_pop_body evcal_eventcard event_${SC_data.event_id}_${SC_data.repeat_interval} ${classes}`,
CAL,
obj,
et_data: obj.find('.evoet_data').data(),
SC: SC_data
};
const randomId = `evo_eventcard_${Math.floor(Math.random() * 90) + 10}`;
const lbac = { 'sc1': 'within', 'sc2': 'within ecSCR' }[evo_general_params.cal.lbs] || '';
const openLightbox = (content, ajaxData = null) => {
const config = {
//uid: ajaxData?.uid || 'evo_open_eventcard_lightbox',
uid: 'evo_open_eventcard_lightbox',
lbc: randomId,
lbc: LB ? LB.data('lbc') || randomId : randomId,
lbac,
end: 'client',
content,
other_data
};
if (ajaxData) {
Object.assign(config, {
ajax: 'yes',
ajax_type: 'endpoint',
ajax_action: 'eventon_load_single_eventcard_content',
d: ajaxData
});
}
// if LB is passed populate that LB @4.9
if( LB ){
if( ajaxData){
var OO = this.evo_process_ajax_params( config );
LB.evo_admin_get_ajax( OO );
$('body').trigger('evo_lightbox_processed', [ config, LB]);
return;
}
LB.evo_lightbox_populate_content({content: content});
$('body').trigger('evo_lightbox_processed', [ config, LB]);
return;
}
//console.log( config);
$('body').evo_lightbox_open(config);
};
if (SC_data.ux_val === '3a') {
const placeholder = `
${Array(3).fill('
').join('')}
`;
const ajaxData = {
event_id: SC_data.event_id,
ri: SC_data.repeat_interval,
SC: { ...SC_data, tile_style: '0', tile_bg: '0', tiles: 'no', eventtop_style: SC_data.tile_style == '2' ? '0' : SC_data.eventtop_style },
load_lbcontent: true,
action: 'eventon_load_single_eventcard_content',
uid: 'load_single_eventcard_content_3a',
calid: ( CAL ? CAL.attr('id') : '' ),
};
openLightbox(placeholder, ajaxData);
} else {
const content = event.find('.event_description').html();
const clrW = event.hasClass('clrW') ? 'clrW' : 'clrD';
openLightbox(`${obj.html()}
${content}
`);
}
}
// listerners for lightbox on eventcard
$.fn.evo_cal_lb_listeners = function(){
// Listerners
// process various lightbox types
$('body')
.on('evo_lightbox_processed', function(event, OO, LIGHTBOX){
if( OO.uid != 'evo_open_eventcard_lightbox') return false;
var CAL = OO.other_data.CAL;
LIGHTBOX.addClass('eventcard eventon_events_list');
LIGHTBOX_content = LIGHTBOX.find('.evolb_content');
LIGHTBOX_content.attr('class', 'evolb_content '+ OO.other_data.extra_classes );
var SC = OO.other_data.SC;
var obj = OO.other_data.obj;
//console.log(SC);
// update border color and eventtop color
const evoet_data = OO.other_data.et_data;
bgcolor = bggrad ='';
if( evoet_data ){
bgcolor = evoet_data.bgc;
bggrad = evoet_data.bggrad;
}
// if tiles and eventtop style set to clean
var show_lightbox_color = ( SC.eventtop_style == '0' || SC.eventtop_style == '4') ? false: true;
if( (CAL && CAL.hasClass('color') && show_lightbox_color) ||
(!CAL && show_lightbox_color)
){
LIGHTBOX_content.addClass('color');
LIGHTBOX_content.find('.evopop_top').css({
'background-color':bgcolor,
'background-image': bggrad,
});
}else{
LIGHTBOX_content.addClass('clean');
LIGHTBOX_content.find('.evopop_top').css({'border-left':'3px solid '+bgcolor});
}
// trigger
if( obj.data('runjs')){
$('body').trigger('evo_load_single_event_content',[ SC.event_id, OO.other_data.obj]);
}
// RTL
if( SC.evortl =='yes') LIGHTBOX.addClass('evortl');
$('body').trigger('evolightbox_end', [ LIGHTBOX , CAL, OO]); // @s4.6
})
// after eventcard content is loaded to lightbox via 3a - @since 4.2.3
.on('evo_ajax_success_evo_open_eventcard_lightbox', function (event, OO, data){
if( OO.ajaxdata.uid != "load_single_eventcard_content_3a") return false;
LIGHTBOX = $('.evo_lightbox.'+ OO.lightbox_key);
CAL = $('body').find('#'+ OO.ajaxdata.calid);
$('body').trigger('evolightbox_end', [ LIGHTBOX , CAL, OO]); // @s4.6
})
;
}
// Side Panel for admin
// @since 4.5.2 @updated 5.0
BB
.on('click', '.evosp_trigger', function(e){
e.preventDefault(); e.stopPropagation();
const $el = $(this);
$el.addClass('evo_sp_trig_on');
$el.evo_open_sidepanel($el.data('d'), $el.data('spv'));
})
.on('click', '.evosp_close', function(e){ e.preventDefault(); e.stopPropagation(); $(this).evo_close_sidepanel() })
.on('click', '.evosp_trigger_save', function(e){ e.preventDefault(); e.stopPropagation(); $(this).evo_ajax_form_submit( $(this).data('d'), 'sp'); })
.on('evosp_trig_close', function(e, opt){ $(this).evo_close_sidepanel( opt ); });
/**
* Side panel for eventON
* @version 4.9
*/
$.fn.evo_open_sidepanel = function(opt, spv){
var defs = {
'uid':'',
'end':'admin', // admin or client
'hide_sp':false,
'hide_message':false,
'title':'',
'sp_title':'',
'sp_class':'',
'sp_id':'',// identifier for side panel @5.0.3
'content_id':'', // only to load dynamic content
'content':'',// @5.0.3 populate passed on content with delay
'content_load_delay':0,// 1000
'ajax':'no',
'ajax_data':'',
'adata':{},
'other_data':{},
'spdata':{}, // in progress pass all sidepanel data in one
'size': 'sm', // sm |
'movepage': false,// in complete -- idea to move the entire page
end:'admin'
}
var OO = $.extend({}, defs, opt);
//console.log(OO);
const SP = $('body').find('.evo_sp');
// structure
const load_html = "";
const footer_html = ``;
SP.html(`${OO.sp_title}
${load_html}
${footer_html}
`);
SP.addClass('show');
SP.removeClass('med lar sm').addClass( OO.size );
// if move page as well
//if( OO.movepage ) $('body').find('.editor-editor-interface').addClass('evotrans pagemoved').css('right', '400px');
const SP_body = SP.find('.evosp_body');
const SP_head = SP.find('.evosp_head');
const SP_foot = SP.find('.evosp_foot');
// load using content
if( OO.content_id != ''){
if( OO.content_load_delay > 0){
setTimeout(function(){
SP.evo_populate_sidepanel( BB.find('#'+ OO.content_id ).html() );
}, OO.content_load_delay );
}else{
SP.evo_populate_sidepanel( BB.find('#'+ OO.content_id ).html() );
}
}
// run ajax to load content for the lightbox inside
if( ( OO.ajax == 'yes' && OO.ajax_data != '') || ( OO.adata != '' && 'a' in OO.adata) ){
var passing_data = {
adata: OO.adata,
ajaxdata: OO.ajax_data,
uid: OO.uid ,
end: OO.end,
load_new_content: true,
load_new_content_id: 'evops_content',
lightbox_loader:false,
end: OO.end,
};
SP.evo_admin_get_ajax( passing_data );
}else{
setTimeout(()=> BB.trigger('evo_sp_stop_loading'),OO.content_load_delay);
}
// populate with passed on content with delay @5.0.3
if( OO.content != ''){
setTimeout(()=> SP.evo_populate_sidepanel( OO.content ),OO.content_load_delay);
}
// populate new content with spv values
if( spv != ''){
BB.on('evo_ajax_success_'+ OO.uid , function(){
$('#evops_content').find('input, select').each(function(){
var fel = $(this);
$.each(spv,function(index, val){
if( fel.attr('name') == index){
if( val == 'no' || val == 'yes') fel.evo_elm_change_yn_btn( val );
fel.val( val );
}
});
});
});
}
BB.trigger('evo_sp_opened_'+OO.uid, OO);
BB.trigger('evo_sp_opened', OO);
}
BB.on('evo_sp_stop_loading',function(){
$('body').find('.evo_sp').find('.evo_loading_bar_holder').remove();
});
$.fn.evo_savevals_sidepanel = function(spv){
const el = BB.find('.evo_sp_trig_on');
el.data('spv', spv);
el.removeClass('evo_sp_trig_on');
}
$.fn.evo_populate_sidepanel = function(content){
const SP = $('body').find('.evo_sp');
SP.find('.evosp_body').html( content );
console.log('Populate SP');
}
// populate sidepanel footer @5.0.3
$.fn.evo_populate_sidepanel_footer = function(content ){
const SP = $('body').find('.evo_sp');
SP.find('.evosp_foot_in').html( content );
}
// CLOSE sidepanel
$.fn.evo_close_sidepanel = function(opt){
SP = BB.find('.evo_sp');
var defaults = { 'delay':200};
if( !(SP.hasClass('show')) ) return;
var OO = $.extend({}, defaults, opt);
setTimeout(function(){
BB.trigger('evo_sp_closed',[ SP ]);
SP.removeClass('show');
$('body').find('.editor-editor-interface.pagemoved').removeClass('pagemoved').css('right', 'auto');
BB.find('.evo_sp_trig_on').removeClass('evo_sp_trig_on');
}, OO.delay );
setTimeout(function(){ SP.html(''); }, ( OO.delay + 100 ) );
}
$.fn.evo_showmsg_sidepanel = function(opt){
var defaults = {
'type':'good',
'message':'',
'hide_message': false,// hide message after some time pass time or false
'hide_sp': false, // hide lightbox after some time of false
}; var OO = $.extend({}, defaults, opt);
const SP = $('body').find('#evo_sp');
SP.find('.message').removeClass('bad good').addClass( OO.type ).html( OO.message ).fadeIn();
if( OO.hide_message ) setTimeout(function(){ SP.evo_hidemsg_sidepanel() }, OO.hide_message );
if( OO.hide_sp ) SP.evo_close_sidepanel({ delay: OO.hide_sp });
}
$.fn.evo_hidemsg_sidepanel = function(opt){
SP = this;
SP.find('p.message').hide();
}
// Get Ajax url @since 4.4 @u 4.5.5
$.fn.evo_get_ajax_url = function(opt){
var defaults = {
a:'', // action key
e:'client', // end
type: 'ajax'};
var OO = $.extend({}, defaults, opt);
// end point url
if( OO.type == 'endpoint'){
var evo_ajax_url = ( OO.e == 'client' || typeof evo_general_params !== 'undefined' )?
evo_general_params.evo_ajax_url : evo_admin_ajax_handle.evo_ajax_url;
return evo_ajax_url.toString().replace( '%%endpoint%%', OO.a );
// rest api url
}else if( OO.type == 'rest' ){
var evo_ajax_url = ( OO.e == 'client' || typeof evo_general_params !== 'undefined')?
evo_general_params.rest_url : evo_admin_ajax_handle.rest_url;
//console.log(evo_ajax_url);
//console.log(OO);
return evo_ajax_url.toString().replace( '%%endpoint%%', OO.a );
}else{
action_add = OO.a != '' ? '?action='+ OO.a: '';
return ( OO.e == 'client' || typeof evo_general_params !== 'undefined') ?
evo_general_params.ajaxurl + action_add : evo_admin_ajax_handle.ajaxurl + action_add;
}
}
// loading animations @4.7.2
$.fn.evo_start_loading = function( opt ){
var defaults = { type:'1'};
var OPT = $.extend({}, defaults, opt);
var el = this;
if( OPT.type == '1') el.addClass('evoloading loading');
if( OPT.type == '2') el.addClass('evoloading_2');
}
$.fn.evo_stop_loading = function( opt ){
var el = this;
var defaults = { type:'1'};
var OPT = $.extend({}, defaults, opt);
if( OPT.type == '1') el.removeClass('evoloading loading');
if( OPT.type == '2') el.removeClass('evoloading_2');
}
$.fn.evo_lightbox_start_inloading = function(opt){
LB = this;
LB.find('.evolb_content').addClass('loading evoloading');
}
$.fn.evo_lightbox_stop_inloading = function(opt){
LB = this;
LB.find('.evolb_content').removeClass('loading evoloading');
}
// Count down // @+ 4.5
$.fn.evo_countdown_get = function(opt){
var defaults = { gap:'', endutc: ''};
var OPT = $.extend({}, defaults, opt);
var gap = OPT.gap;
// if gap not provided use endutc
if( gap == '' ){
var Mnow = moment().utc();
var M = moment();
M.set('millisecond', OPT.endutc );
gap = OPT.endutc - Mnow.unix();
}
// if negative gap
if( gap < 0){
return {
'd': 0,
'h':0,
'm':0,
's':0
};
}
distance = ( gap * 1000);
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
minutes = minutes<10? '0'+minutes : minutes;
seconds = seconds<10? '0'+seconds : seconds;
return {
'd': days,
'h':hours,
'm':minutes,
's':seconds
};
};
// @u 4.5.2
$.fn.evo_countdown = function(opt){
var defaults = { S1:''};
var OPT = $.extend({}, defaults, opt);
var el = $(this);
const day_text = ( el.data('d') !== undefined && el.data('d') != '' )? el.data('d'):'Day';
const days_text = ( el.data('ds') !== undefined && el.data('ds') != '' )? el.data('ds'):'Days';
// intial run
//var gap = parseInt(el.data('gap'));
var duration = el.data('dur');
var endutc = parseInt(el.data('endutc'));
var text = el.data('t');
if(text === undefined) text = '';
if( el.hasClass('evo_cd_on')) return;
// get gap using end time utc
var Mnow = moment().utc();
var M = moment();
M.set('millisecond', OPT.endutc );
//console.log(Mnow.unix());
//console.log(endutc);
gap = endutc - Mnow.unix();
// on initial run - event hasnt happened yet
if( gap > 0 ){
// initial
dd = el.evo_countdown_get({ 'gap': gap });
el.html( ( dd.d>0 ? dd.d + ' ' + ( dd.d >1 ? days_text: day_text ) + " " :'') + dd.h + ":" + dd.m +':'+ dd.s +' '+text );
el.data('gap', ( gap - 1) ); // save new gap value
el.addClass('evo_cd_on');
//return;
// set intervals
var CD = setInterval(function(){
gap = el.data('gap'); // get gap for this cycle
duration = el.data('dur');
const bar_elm = el.closest('.evo_event_progress').find('.evo_ep_bar');
// when timer is ticking
if( gap > 0 ){
// increase bar width if exists
if( duration !== undefined && bar_elm.length){
perc = ( (duration - gap)/ duration ) * 100;
bar_elm.find('b').css('width',perc+'%');
}
dd = el.evo_countdown_get({ 'gap': gap });
el.html( ( dd.d>0 ? dd.d + ' ' + ( dd.d >1 ? days_text: day_text ) + " ":'') + dd.h + ":" + dd.m +':'+ dd.s +' '+text );
el.data('gap', ( gap - 1) );
// when timer expired
}else{
const expire_timer_action = el.data('exp_act');
// perform ajax task after expiration
if(expire_timer_action !== undefined){
$('body').trigger('runajax_refresh_now_cal',[
el ,
el.data('n'),
]);
}
const _complete_text = el.evo_get_txt({V:'event_completed'});
// live now text
if(bar_elm.length){
bar_elm.addClass('evo_completed');
//el.siblings('.evo_ep_pre').html( _complete_text );
}
// event tag & live elements
if( el.closest('.evcal_desc').length){
el.closest('.evcal_desc').find('.eventover').html( _complete_text);
el.closest('.evcal_desc').find('.evo_live_now').remove();
}
// event card
if( el.closest('.eventon_list_event').length){
el.closest('.eventon_list_event').find('span.evo_live_now').hide();
}
el.html('');
clearInterval(CD);
}
},1000);
// event has already passed
}else{
// if gap is less
el.closest('.evo_event_progress').find('.evo_ep_bar').hide();
clearInterval(CD);
}
};
// Handlebar process template data into html
$.fn.evo_HB_process_template = function(opt){
var defaults = { TD:'', part:''}
var OPT = $.extend({}, defaults, opt);
BUS = $('#evo_global_data').data('d');
template = Handlebars.compile( BUS.temp[ OPT.part ] );
return template( OPT.TD );
}
// Date range and events @4.6.7
// Date range and events - from webpage
$.fn.evo_cal_events_in_range = function(opt){
var defaults = { S:'', E:'',
hide: true,
closeEC:true,
showEV: false, // show events
showEVL: false, // show events list
showAllEvs: false // show all events regardless of the range
};
var OPT = $.extend({}, defaults, opt);
var CAL = $(this);
var eJSON = CAL.find('.evo_cal_events').data('events');
var SC = CAL.evo_shortcode_data();
R = {};
html = '';
json = {};
show = 0;
// using events JSON data
if( eJSON && eJSON.length > 0){
$.each(eJSON, function(ind, ED){
eO = CAL.find('#event_'+ ED._ID);
if(eO === undefined || eO.length==0) return;
if(OPT.hide) eO.hide(); // pre hide
this_show = false;
// month long or year long events
if( ED.month_long || ED.year_long ){
this_show = true;
}else{
if(CAL.evo_is_in_range({
'S': OPT.S, 'E': OPT.E, 'start': ED.unix_start , 'end':ED.unix_end
})){
this_show = true;
}
}
if( OPT.showAllEvs) this_show = true;
if( this_show){
// show event
if( OPT.showEV) eO.show();
// close open event cards
if(OPT.closeEC && SC.evc_open == 'no') eO.find('.event_description').hide().removeClass('open');
html += eO[0].outerHTML;
json[ ED._ID] = ED;
show++;
}
});
}else{
// get all the events in the events list
var cal_events = CAL.find('.eventon_list_event');
cal_events.each(function(index, elm){
var ED = $(elm).evo_cal_get_basic_eventdata();
if( !ED) return;
if(OPT.hide) $(elm).hide(); // pre hide
this_show = false;
// month long or year long events
if( $(elm).hasClass('month_long') || $(elm).hasClass('year_long') ){
this_show = true;
}else{
if(CAL.evo_is_in_range({
'S': OPT.S, 'E': OPT.E, 'start': ED.unix_start , 'end':ED.unix_end
})){
this_show = true;
}
}
if( OPT.showAllEvs) this_show = true;
if( this_show){
// show event
if( OPT.showEV) $(elm).show();
// close open event cards
if(OPT.closeEC && SC.evc_open == 'no')
$(elm).find('.event_description').hide().removeClass('open');
html += $(elm)[0].outerHTML;
json[ ED.uID ] = ED;
show++;
}
});
}
// No events
if( OPT.showEV){
no_event_content = CAL.evo_get_global({S1: 'html', S2:'no_events'});
tx_noevents = CAL.evo_get_txt({V:'no_events'});
EL = CAL.find('.eventon_events_list');
EL.find('.eventon_list_event.no_events').remove();
if( show == 0 )
EL.append(''+ no_event_content +'
');
}
// if show events list
if( OPT.showEVL){
CAL.find('.eventon_events_list').show().removeClass('evo_hide');
}
R['count'] = show;
R['html'] = html;
R['json'] = json;
return R;
}
// check if an event is in the given date range
$.fn.evo_is_in_range = function(opt){
var defaults = { S:'', E:'', start:'',end:''}
var OPT = $.extend({}, defaults, opt);
S = parseInt(OPT.S);
E = parseInt(OPT.E);
start = parseInt(OPT.start);
end = parseInt(OPT.end);
return (
( start <= S && end >= E ) ||
( start <= S && end >= S && end <= E) ||
( start <= E && end >= E ) ||
( start >= S && end <= E )
) ? true: false;
}
$.fn.evo_cal_hide_events = function(){
CAL = $(this);
CAL.find('.eventon_list_event').hide();
}
// get event data basics from html event on page
// ~@version 4.0.3 @updated 4.9.8
$.fn.evo_cal_get_basic_eventdata = function(){
var ELM = $(this);
var _time = ELM.data('time');
if( _time === undefined ) return false;
const time = _time.split('-');
const ri = ELM.data('ri').replace('r','');
const eID = ELM.data('event_id');
var _event_title = ELM.find('.evcal_event_title').text();
_event_title = _event_title.replace(/'/g, ''');
// extract text time
let timeRange = '';
const timeElement = ELM.find('.evo_tz_time');
if( timeElement.length > 0){
const timeClone = timeElement.clone();
// Remove the span.evo_tz and its contents
timeClone.find('.evo_tz').remove();
// Get the text, trim it, and remove any remaining icon-related characters
let timeText = timeClone.text().trim();
// Remove any lingering non-time characters (e.g., leftover from tags)
timeText = timeText.replace(/[^\d:\s-]/g, '');
// Trim again to remove any extra spaces
timeRange = timeText.trim() || 'N/A';
}
var RR = {
'uID': eID + '_' + ri,
'ID': eID ,
'event_id': eID ,
'ri': ri,
'event_start_unix': parseInt(time[0]),
'event_end_unix': parseInt(time[1]),
'time_text': timeRange, // @since 4.9.8
'ux_val': ELM.find('.evcal_list_a').data('ux_val'),
'event_title': _event_title,
'hex_color': ELM.data('colr'),
'hide_et': ELM.hasClass('no_et') ? 'y':'n', // hide endtime
'evcal_event_color': ELM.data('colr'),
'unix_start': parseInt(time[0]),// @4.5.7
'unix_end': parseInt(time[1]),// @4.5.7
};
// event type
RR['ett1'] = {};
ELM.find('.evoet_eventtypes.ett1 .evoetet_val').each(function(){
RR['ett1'][ $(this).data('id')] = $(this).data('v');
});
// since 4.3.5
const eventtop_data = ELM.find('.evoet_data').data('d');
// location
if(eventtop_data && 'loc.n' in eventtop_data && eventtop_data['loc.n'] != ''){
RR['location'] = eventtop_data['loc.n'];
}
// organizer
if(eventtop_data && 'orgs' in eventtop_data && eventtop_data.orgs !== undefined ){
var org_names = '';
$.each(eventtop_data.orgs, function(index, value){
org_names += value +' ';
});
RR['organizer'] = org_names;
}
// event image
if( ELM.find('.evo_event_schema').length > 0){
imgObj = ELM.find('.evo_event_schema').find('meta[itemprop=image]').attr('content');
RR['image_url'] = imgObj;
}
// event tags @s 4.5.2
if( eventtop_data && 'tags' in eventtop_data && eventtop_data.tags !== undefined ){
//console.log(eventtop_data.tags);
RR['event_tags'] = eventtop_data.tags;
}
return RR;
}
// Calendar Helper functions @+2.8 @updated 4.9
$.fn.evo_cal_oneevent_onload = function(type){// @since 4.9
if( type != 'complete') return;
const bodyClasses = $('body').attr('class') || '';
const match = bodyClasses.match(/one_event_\d+_\d+/);
if (match) {
const className = match[0];
const [, x, y] = className.match(/one_event_(\d+)_(\d+)/);
const event_obj = $('body').find('#event_'+ x +'_'+ y);
const $cal = event_obj.closest('.ajde_evcal_calendar');
const SC = $cal.evo_shortcode_data();
if( event_obj.length > 1 ) return;
const new_SC_data = {
...SC,
repeat_interval: y,
event_id: x,
ux_val: '3a',
evortl: event_obj.find('.eventon_events_list').hasClass('evortl') ? 'yes' : 'no',
ajax_eventtop_show_content: true,
additional_class: CAL.attr('class').match(/etttc_\w+/)?.[0] || '',
};
console.log( new_SC_data);
$cal.evo_cal_lightbox_trigger(new_SC_data, event_obj, $cal);
}
}
$.fn.evo_cal_event_get_uxval = function(SC, obj){
const CAL = this;
var ux_val = obj.data('ux_val');
if(SC && 'ux_val' in SC && SC.ux_val!='' && SC.ux_val!== undefined && SC.ux_val!='0'){
ux_val = SC.ux_val;
}
// special mobile only user interaction
if( SC && SC.ux_val_mob !== undefined && SC.ux_val_mob != '' &&
SC.ux_val_mob != '-' && SC.ux_val_mob != ux_val){
if( CAL.evo_is_mobile() ) ux_val = SC.ux_val_mob;
}
return ux_val;
}
// to run before cal ajax is performed @4.6
$.fn.evo_pre_cal = function(options){
var el = this;
var cal = {};
var OO = $.extend({}, options);
var run = function(){
cal_width_assoc();
cal_load_nav_html();
}
var cal_width_assoc = function(){
cal_w = el.width();
if( cal_w <300) el.addClass('szS');
if( cal_w >300 && cal_w <600) el.addClass('szM');
if( cal_w >600 && cal_w <900) el.addClass('szL');
if( cal_w >900) el.addClass('szX');
}
// load nav html into cal
var cal_load_nav_html = function(){
nav_data = el.evo_cal_get_footer_data('nav_data');
if( nav_data && 'month_title' in nav_data){
__html = nav_data.month_title;
if( 'arrows' in nav_data ) __html += nav_data.arrows;
el.find('.evo_header_mo').html( __html );
el.find('.evo_footer_nav').html( __html );
}
}
run();
}
// localize time @4.6.7 @u 4.9
$.fn.evo_cal_localize_time = function(){
this.find('.evo_loct_inprocess').each(function(e){ $(this).evo_localize_time(); });
}
$.fn.evo_localize_time = function( ){
const eventcard = this.closest('.eventon_list_event');
const hideEnd = eventcard.hasClass('no_et');
const textLocal = evo_general_params.text.local_time;
eventcard.find('.evo_mytime').each(function() {
const $el = $(this);
const isEventCard = $el.hasClass('evocard');
const { times, __f: fullFormat, __tf: timeOnlyFormat, tzo: utcOffset = 0 } = $el.data();
const [start, end] = times.split('-').map(Number);
const startMoment = moment.unix(start).utc().local();
const endMoment = moment.unix(end).utc().local();
const sameMonth = startMoment.format('YYYY/M') === endMoment.format('YYYY/M');
const sameDay = sameMonth && startMoment.format('DD') === endMoment.format('DD');
const startText = startMoment.format(fullFormat);
const endText = endMoment.format(sameDay ? timeOnlyFormat : fullFormat);
const html = `${startText}${hideEnd ? '' : ' - ' + endText}` +
(isEventCard ? `(${textLocal})` : '');
$el.replaceWith(`${html}`);
});
}
$.fn.evo_day_in_month = function(opt){
var defaults = { M:'', Y:''}
var OPT = $.extend({}, defaults, opt);
return new Date(OPT.Y, OPT.M, 0).getDate();
}
$.fn.evo_get_day_name_index = function(opt){
var defaults = { M:'', Y:'', D:''}
var OPT = $.extend({}, defaults, opt);
//return moment(OPT.Y+'-'+OPT.M+'-'+OPT.D).utc().day();
return new Date( Date.UTC(OPT.Y, OPT.M-1, OPT.D) ).getUTCDay();
}
// scrollbar
// Function to initialize custom scrollbar
$.fn.evo_init_scrollbars = function(options){
const defaults = { scrollSpeed: 50 };
const settings = $.extend({}, defaults, options);
return this.each(function() {
const $scope = $(this);
$scope.find('.evo-scrollbar').each(function() {
const $container = $(this);
if ($container.hasClass('evo-scroll-container')) return;
$container.addClass('evo-scroll-container');
const $parent = $container.parent();
if (!$parent.css('height') || $parent.css('height') === 'auto') {
$parent.css('height', '300px');
}
const $content = $container.children().wrapAll('').parent();
$container.append('');
const $tabContainer = $container.find('.evo-scroll-tab-container');
const $tab = $tabContainer.find('.evo-scroll-tab');
const $scrollContent = $container.find('.evo-scroll-content');
// Dynamic tab height and visibility
const updateTabHeight = () => {
const height = $container.height();
const contentHeight = $scrollContent[0].scrollHeight;
const maxScroll = contentHeight - height;
const tabHeight = Math.max(height * (height / contentHeight), 20);
$tab.css('height', `${tabHeight}px`);
$tab.toggleClass('scroll-needed', maxScroll > 0); // Show tab only if scrollable
console.log(height+' '+contentHeight+' '+maxScroll+' '+tabHeight);
};
$container.on('mouseenter', updateTabHeight);
// Click to scroll
$tab.on('click', (e) => {
const height = $container.height();
const maxScroll = $scrollContent[0].scrollHeight - height;
const current = $container.scrollTop();
$container.scrollTop(current < maxScroll ? current + settings.scrollSpeed : current - settings.scrollSpeed);
});
// Drag events
let isDragging = false;
let startY, startScrollTop;
// Drag events
$tab.on('mousedown', (e) => {
isDragging = true;
$tab.addClass('dragging');
startY = e.pageY;
startScrollTop = $container.scrollTop();
e.preventDefault();
});
$(document).on('mouseup', () => {
isDragging = false;
$tab.removeClass('dragging');
});
$(document).on('mousemove', (e) => {
if (!isDragging) return;
const height = $container.height();
const maxScroll = $scrollContent[0].scrollHeight - height;
const tabHeight = $tab.height();
const tabMaxTravel = height - tabHeight;
const deltaY = e.pageY - startY;
const scrollPercent = deltaY / tabMaxTravel;
$container.scrollTop(Math.max(0, Math.min(startScrollTop + (scrollPercent * maxScroll), maxScroll)));
});
// Scroll event with requestAnimationFrame
$container.on('scroll', () => {
const height = $container.height();
const contentHeight = $scrollContent[0].scrollHeight;
const maxScroll = contentHeight - height;
const tabHeight = $tab.height();
const tabMaxTravel = height - tabHeight;
const scrollPosition = $container.scrollTop();
const scrollPercent = maxScroll > 0 ? scrollPosition / maxScroll : 0;
requestAnimationFrame(() => {
$tabContainer.css('top', `${scrollPosition}px`);
$tab.css('top', `${scrollPercent * tabMaxTravel}px`);
});
});
});
});
}
/*
// Run on page load for all elements with .evo-scrollbar
initCustomScrollbar($('body').find('.evo-scrollbar'));
// Expose function globally for on-demand use
window.initCustomScrollbar = function(selector) {
const $elements = selector ? $(selector) : $('body').find('.evo-scrollbar');
initCustomScrollbar($elements);
};
*/
// LIGHTBOX
// page Lightbox functions @+2.8
// append to the lightbox main class name .evo_lightbox
// Legacy
$.fn.evo_prepare_lb = function(){
$(this).find('.evo_lightbox_body').html('');
}
$.fn.evo_show_lb = function(opt){
var defaults = { RTL:'', calid:''}
var OPT = $.extend({}, defaults, opt);
$(this).addClass('show '+ OPT.RTL).attr('data-cal_id', OPT.calid);
$('body').trigger('evolightbox_show');
}
$.fn.evo_append_lb = function(opt){
var defaults = { C:'', CAL:''}
var OPT = $.extend({}, defaults, opt);
$(this).find('.evo_lightbox_body').html( OPT.C);
if( OPT.CAL!= '' && OPT.CAL !== undefined && OPT.CAL.hasClass('color')){
const LIST = $(this).find('.eventon_events_list');
if( LIST.length>0){
LIST.find('.eventon_list_event').addClass('color');
}
}
}
// event image gallery @4.6
$.fn.eventon_process_main_ft_img = function(OO){
const IMG = this;
var img_sty = 'def';
if( IMG.hasClass('fit') ) img_sty = 'fit';
if( IMG.hasClass('full') ) img_sty = 'full';
// Initialize box dimensions
let box_width = IMG.width();
let box_height = IMG.height();
// Ensure valid box dimensions
box_width = box_width > 0 ? box_width : 100; // Fallback to prevent errors
box_height = box_height > 0 ? box_height : 100;
// Get image dimensions from data attributes
const img_width = parseInt(IMG.data('w')) || 100; // Fallback to prevent division by zero
const img_height = parseInt(IMG.data('h')) || 100;
const img_ratio = img_height / img_width; // Image aspect ratio
let new_width, new_height;
// Handle 'fit' style
if( IMG.hasClass('fit')){
// Scale to fit within box while maintaining aspect ratio
new_width = box_height / img_ratio;
new_height = box_height;
if( new_width > box_width ){// width is wider than box
if( img_ratio <1 ){
new_width = box_width; new_height = img_ratio * new_width;
}else{
new_height = box_height; new_width = new_height / img_ratio;
}
}
IMG.find('span').css({'width':new_width, 'height': new_height} );
}
// full style
if( IMG.hasClass('full')){
new_height = img_ratio * box_width;
new_width = box_width;
IMG.find('span').css({'width':new_width, 'height': new_height} );
IMG.css({'height': new_height} );
}
//console.log(box_width +' '+img_width+' '+new_width);
}
/**
* Form functions
* @version 4.8.2
* @updated 4.9.6
*/
$.fn.evo_RealTime_form_validation = function() {
return this.each(function() {
var form = $(this);
var req_fields = form.find('.input.req');
var email_fields = form.find('.input.email');
var humanvalid_fields = form.find('.input.evoelm_hval_val');
req_fields.on('input blur', function() { $(this).evo_form_validate_field( 'text'); });
email_fields.on('input blur', function() { $(this).evo_form_validate_field( 'email'); });
humanvalid_fields.on('input blur', function() { $(this).evo_form_validate_field( 'humanvalid'); });
});
}
$.fn.evo_form_validation_check = function(){
var form = this;
var req_fields = form.find('.input.req'); // Define here for use in validateForm
var email_fields = form.find('.input.email');
var humanvalid_fields = form.find('.input.evoelm_hval_val');
function validateForm() {
var hasErrors = false;
req_fields.each(function() {
if ( $(this).evo_form_validate_field( 'text')) hasErrors = true;
});
email_fields.each(function() {
if ($(this).evo_form_validate_field( 'email')) hasErrors = true;
});
humanvalid_fields.each(function() {
if ($(this).evo_form_validate_field( 'humanvalid')) hasErrors = true;
});
return !hasErrors;
}
return validateForm();
}
$.fn.evo_form_validate_field = function(type){
var field = this;
var errorElement = field.siblings('em');
var hasError = false;
var fieldValue = field.val().trim();
if (type === 'email') {
if (field.hasClass('req')) {
// Required email: Check if filled AND valid
hasError = fieldValue === '' || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(fieldValue);
} else {
// Optional email: Only check if it’s not empty
hasError = fieldValue !== '' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(fieldValue);
}
} else if (type === 'humanvalid') {
var correctAnswer = field.data('val'); // Expected answer from data attribute
hasError = ( '89r329' +field.val().trim()+ '8932ufe' ) !== correctAnswer;
} else {
hasError = field.val().trim() === '';
}
if (hasError) {
if (errorElement.length === 0) {
errorElement = $('');
field.after(errorElement);
}
errorElement.html(getErrorMessage(type === 'email' ? 'err2' : type === 'humanvalid' ? 'err3' : 'err1'))
.removeClass('evodn')
.addClass('evodib');
field.addClass('err');
} else {
errorElement.remove();
field.removeClass('err');
}
function getErrorMessage(type) {
const messages = {
err1: evo_general_params.text.err1, // Required field error
err2: evo_general_params.text.err2, // Email format error
err3: evo_general_params.text.err3 // Human validation error (e.g., "Incorrect answer")
};
return messages[type] || "";
}
return hasError;
}
$('body').on('evo_elm_form_presubmit_validation', function(event, form, callback){
event.preventDefault();
var $form = $(form);
var isValid = $form.evo_form_validation_check();
if (typeof callback === "function") {
callback(isValid); // Return true/false to the callback
}
});
// Calendar Data & Shortcodes
// get shortcodes from evo bottom
$.fn.evo_shortcode_data = function(){
var ev_cal = $(this);
return ev_cal.find('.evo_cal_data').data('sc');
}
// get filter data @4.6
$.fn.evo_get_filter_data = function(){
return $(this).find('.evo_cal_data').data('filter_data');
}
$.fn.evo_cal_get_filter_sub_data = function( tax , key){
newdata = $(this).evo_get_filter_data();
return newdata[ tax ][ key ];
}
$.fn.evo_cal_update_filter_data = function(tax, new_val, key){
newdata = $(this).evo_get_filter_data();
if( key === undefined) key = 'nterms';
newdata[ tax ][ key ] = new_val;
$(this).find('.evo_cal_data').data('filter_data', newdata );
}
$.fn.evo_cal_get_footer_data = function( key ){
data = $(this).find('.evo_cal_data').data();
//console.log(data);
if( data === undefined ) return false; // 4.6.2
if( key in data ) return data[ key ];
return false;
}
// hide cal data from view
$.fn.evo_cal_hide_data = function(){
$(this).find('.evo_cal_data').attr({
'data-sc':'',
'data-filter_data':'',
'data-nav_data':'',
});
}
// update shortcode values from filter changes @u4.6
$.fn.evo_update_sc_from_filters = function(){
var el = $(this);
SC = el.evo_shortcode_data();
$.each( el.evo_get_filter_data() , function(index, value){
var default_val = value.terms;
var filter_val = value.nterms;
const NOT_values = value.__notvals;
filter_val = filter_val == ''? 'NOT-all': filter_val;
var not_string = '';
// if NOT filter in place > include that in tax value for query
if( NOT_values!== undefined && NOT_values.length >0 && filter_val != default_val ){
$.each(NOT_values, function(index, value){
not_string += 'NOT-'+ value +',';
});
}
SC[ index ] = not_string + filter_val;
});
el.find('.evo_cal_data').data( 'sc', SC );
}
// get shortcode single value
$.fn.evo_get_sc_val = function(opt){
var defaults = { F:''}
var OPT = $.extend({}, defaults, opt);
var ev_cal = $(this);
if(OPT.F=='') return false;
SC = ev_cal.find('.evo_cal_data').data('sc');
if(!(SC[ OPT.F])) return false;
return SC[ OPT.F];
}
// UPDATE Single value
$.fn.evo_update_cal_sc = function(opt){
var defaults = {
F:'', V:''
}
var OPT = $.extend({}, defaults, opt);
var ev_cal = $(this);
SC = ev_cal.find('.evo_cal_data').data('sc');
SC[ OPT.F ] = OPT.V;
ev_cal.find('.evo_cal_data').data( 'sc', SC );
}
// UPDATE all shortcode values
$.fn.evo_update_all_cal_sc = function(opt){
var defaults = {SC:''}
var OPT = $.extend({}, defaults, opt);
var CAL = $(this);
CAL.find('.evo_cal_data').data( 'sc', OPT.SC );
}
// OTHERS
// hex colors // @+2.8 @updated 4.7.2
$.fn.evo_is_hex_dark = function(opt){
var defaults = { hex:'808080'}
var OPT = $.extend({}, defaults, opt);
hex = OPT.hex;
var c = hex.replace('#','');
var is_hex = typeof c === 'string' && c.length === 6 && !isNaN(Number('0x' + c));
if(is_hex){
var values = c.split('');
r = parseInt(values[0].toString() + values[1].toString(), 16);
g = parseInt(values[2].toString() + values[3].toString(), 16);
b = parseInt(values[4].toString() + values[5].toString(), 16);
}else{
var vals = c.substring(c.indexOf('(') +1, c.length -1).split(', ');
var r = vals[0] // extract red
var g = vals[1]; // extract green
var b = vals[2];
}
var luma = ((r * 299) + (g * 587) + (b * 114)) / 1000; // per ITU-R BT.709
return luma> 128? true:false;
}
// get rgb from hex code @4.5
$.fn.evo_rgb_process = function(opt){
var defaults = { data:'808080',type:'rgb', method:'rgb_to_val'}
var opt = $.extend({}, defaults, opt);
const color = opt.data;
// RGB => hex
if( opt.method == 'rgb_to_hex'){
if(color == '1'){
return;
}else{
if(color !=='' && color){
rgb = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
return "#" +
("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
("0" + parseInt(rgb[2],10).toString(16)).slice(-2) +
("0" + parseInt(rgb[3],10).toString(16)).slice(-2);
}
}
}
// RGB => rgb val
if( opt.method == 'rgb_to_val'){
if( opt.type == 'hex'){
var rgba = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
var rgb = new Array();
rgb['r']= parseInt(rgba[1], 16);
rgb['g']= parseInt(rgba[2], 16);
rgb['b']= parseInt(rgba[3], 16);
}else{
rgb = color;
}
return parseInt((rgb['r'] + rgb['g'] + rgb['b'])/3);
}
}
// Other data
$.fn.evo_get_OD = function(){
var ev_cal = $(this);
return ev_cal.find('.evo_cal_data').data('od');
}
// get evo data for a given calendar
$.fn.evo_getevodata = function(){
var ev_cal = $(this);
var evoData = {};
ev_cal.find('.evo-data').each(function(){
$.each(this.attributes, function(i, attrib){
var name = attrib.name;
if(attrib.name!='class' && attrib.name!='style' ){
name__ = attrib.name.split('-');
evoData[name__[1]] = attrib.value;
}
});
});
return evoData;
}
// check if mobile device v4.6
$.fn.evo_is_mobile = function(){
return ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) )? true: false;
}
// eventon loading functions
// v 2.4.5 -- deprecating
$.fn.evo_loader_animation = function(opt){
var defaults = {
direction:'start'
}
var OPT = $.extend({}, defaults, opt);
if(OPT.direction == 'start'){
$(this).find('#eventon_loadbar').slideDown();
}else{
$(this).find('#eventon_loadbar').slideUp();
}
}
// DEPRECATED functions
$.fn.evo_item_shortcodes = function(){
var OBJ = $(this);
var shortcode_array ={};
OBJ.each(function(){
$.each(this.attributes, function(i, attrib){
var name = attrib.name;
if(attrib.name!='class' && attrib.name!='style' && attrib.value !=''){
name__ = attrib.name.split('-');
shortcode_array[name__[1]] = attrib.value;
}
});
});
return shortcode_array;
}
$.fn.evo_shortcodes = function(){
var ev_cal = $(this);
var shortcode_array ={};
ev_cal.find('.cal_arguments').each(function(){
$.each(this.attributes, function(i, attrib){
var name = attrib.name;
if(attrib.name!='class' && attrib.name!='style' && attrib.value !=''){
name__ = attrib.name.split('-');
shortcode_array[name__[1]] = attrib.value;
}
});
});
return shortcode_array;
}
});