PageSourceSearch

https://pridecorpuschristi.com/wp-content/plugins/eventON/assets/js/eventon_functions.js?ver=4.8.2

js pridecorpuschristi.com collected 2026-09-24 20:57:19 UTC 52,708 bytes, 1,776 lines download raw bytes

1/*
2 * Javascript: EventON functions for all calendars
3 * @version: 4.8.2
4 */
5(function($){
6
7	// Basics
8		// Calendar function s
9			$.fn.evo_cal_functions = function(O){
10				el = this;
11				switch(O.action){
12					// load shortcodes inside calendar data
13					case 'load_shortcodes':
14						return el.find('.evo_cal_data').data('sc');		
15					break;
16					case 'update_json':
17						//console.log(O.json);
18						el.find('.evo_cal_events').data('events', O.json);		
19					break;
20					case 'update_shortcodes':
21						//console.log(O.SC);
22						el.find('.evo_cal_data').data( 'sc', O.SC );
23					break;
24				}
25			};
26
27		// access page GLOBALS
28			$.fn.evo_get_global = function(opt){
29				var defaults = { S1:'', S2:''};
30				var OPT = $.extend({}, defaults, opt);
31
32				var BUS = $('#evo_global_data').data('d');
33
34				if(!(OPT.S1 in BUS)) return false;
35				if(!(OPT.S2 in BUS[OPT.S1])) return false;
36				return BUS[OPT.S1][OPT.S2];
37			}
38			$.fn.evo_get_txt = function(opt){
39				var defaults = { V:''}
40				var OPT = $.extend({}, defaults, opt);
41
42				var BUS = $('#evo_global_data').data('d');
43				//console.log(BUS);
44				if(!('txt' in BUS)) return false;
45				if(!(OPT.V in BUS.txt)) return false;
46				return BUS.txt[OPT.V];
47			}
48
49			// get translated text strings from ajax loaded data @4.6.4
50			$.fn.evo_lang = function(text){
51				var t = text.toLowerCase()
52				    .replace(/ /g, "_")
53				    .replace(/[^\w-]+/g, "");
54
55				var BUS = $('#evo_global_data').data('d');
56
57				if(!('txt' in BUS)) return text;
58				if(!(t in BUS.txt)) return text;
59				return BUS.txt[ t ];
60
61			}
62			$.fn.evo_get_cal_def = function(opt){
63				var defaults = { V:''}
64				var OPT = $.extend({}, defaults, opt);
65
66				var BUS = $('#evo_global_data').data('d');
67				if(!('cal_def' in BUS)) return false;
68				if(!(OPT.V in BUS.cal_def)) return false;
69				return BUS.cal_def[OPT.V];
70			}
71
72			// return dms translates values from global data
73			// added 4.0
74			$.fn.evo_get_dms_vals = function(opt){
75				// type = d, d1,d3, m, m3
76				// V = 0-x
77				var defaults = { type:'d', V:''}
78				var OPT = $.extend({}, defaults, opt);
79
80				var BUS = $('#evo_global_data').data('d');			
81				if(!('dms' in BUS)) return false;
82				if(!(OPT.type in BUS.dms)) return false;
83
84				return BUS.dms[ OPT.type ][ OPT.V ];
85				
86			}
87
88	// GENERAL AJAX ACCESS @4.7.2
89		$.fn.evo_admin_get_ajax = function(opt){
90
91			var el = $(this);
92
93  			var OO = this.evo_process_ajax_params( opt );
94
95  			var _lbdata = OO.lbdata;
96			var _adata = OO.adata;	
97			var _populate_id = OO._populate_id;	
98
99			var ajax_url = el.evo_get_ajax_url({a: _adata.a, e: _adata.end, type: _adata.ajax_type});
100
101			// for lightbox
102				var LB = false;
103	  			if( _lbdata.class != '') LB = $('body').find('.evo_lightbox.'+ _lbdata.class );
104
105	  		//console.log( OO );
106
107	  		// Run AJAX
108  			$.ajax({
109				beforeSend: function(){
110					el.evo_perform_ajax_run_loader( OO, LB, 'start'  );
111				},
112				type: 'POST', url: ajax_url, data: _adata.data,	dataType:'json',
113				success:function(data){	
114
115					el.evo_perform_ajax_success( OO, data, LB );
116
117				},complete:function(){
118					el.evo_perform_ajax_run_loader( OO, LB, 'end'  );
119					
120				}
121			});				
122		}
123
124		// submit forms via ligtbox
125		// @since 4.2.2		@updated 4.8
126		$.fn.evo_ajax_lightbox_form_submit = function(opt , formObj ){
127			
128  			const el = this;
129
130  			var OO = this.evo_process_ajax_params( opt );
131
132  			console.log(OO);
133
134  			var _lbdata = OO.lbdata;
135			var _adata = OO.adata;	
136			var _populate_id = OO._populate_id;	
137  			
138  			var form = this.closest('form');
139  			if( formObj !== undefined ) form = formObj;
140
141  			// for lightbox
142				var LB = false;
143	  			if( _lbdata.class != '') LB = $('body').find('.evo_lightbox.'+ _lbdata.class );
144
145  			// reset LB message
146  			if( LB) LB.evo_lightbox_hide_msg();
147
148  			var ajax_url = el.evo_get_ajax_url({a: _adata.a, e: _adata.end, type: _adata.ajax_type});
149
150  			// Add passed on data from ajax object @4.8.2
151			var extra_ajax_data = ('data' in _adata ) ? _adata.data : null;
152	  			
153  			// Submit form
154			form.ajaxSubmit({
155				beforeSubmit: function(opt, xhr){
156					el.evo_perform_ajax_run_loader( OO, LB, 'start'  );
157				},
158				dataType: 	'json',	
159				url: ajax_url,	type: 	'POST',
160				data: extra_ajax_data,
161				success:function(data){
162					el.evo_perform_ajax_success( OO, data, LB );
163				},
164				complete:function(){	
165					el.evo_perform_ajax_run_loader( OO, LB, 'end'  );
166				}
167			});
168		}
169
170	// perform ajax functions / type = start/end
171		$.fn.evo_perform_ajax_run_loader = function( OO , LB, type ){
172			var el = this;
173			var _lbdata = OO.lbdata;
174			var _adata = OO.adata;	
175
176			//console.log(OO);
177
178			var customer_loader_elm = false;
179			var loader_btn_el = false;
180
181  			if( _adata.loader_el !='')	customer_loader_elm = _adata.loader_el;
182  			if( 'loader_class' in _adata && _adata.loader_class != '') 
183  				customer_loader_elm = $('.' + _adata.loader_class);
184  			if( _adata.loader_btn_el != '' && _adata.loader_btn_el !== undefined ) loader_btn_el = el;
185  			
186  			var LB_loader = false;
187  			if( LB && 'loader' in _lbdata && _lbdata.loader ) LB_loader = true;
188
189  			if( type == 'start'){
190
191  				var trigger_id = ( 'uid' in OO && OO.uid != '' ) ? OO.uid : OO.ajax_action; // @4.8
192  				$('body').trigger('evo_ajax_beforesend_' + trigger_id ,[ OO, el ]);
193
194				if( LB_loader ){
195					LB.find('.ajde_popup_text').addClass( 'evoloading loading'); // legacy
196					LB.evo_lightbox_start_inloading();
197				}
198				if( customer_loader_elm ) $( customer_loader_elm ).addClass('evoloading loading');
199				if( loader_btn_el ) el.addClass('evobtn_loader'); // loader on button
200  			}else{
201
202  				var trigger_id = ( 'uid' in OO && OO.uid != '' ) ? OO.uid : OO.ajax_action; // @4.8
203
204  				$('body').trigger('evo_ajax_complete_' + trigger_id ,[ OO , el ]);
205			
206				if( LB_loader ){
207					LB.find('.ajde_popup_text').removeClass( 'evoloading loading');
208					LB.evo_lightbox_stop_inloading();	
209				}
210				if( customer_loader_elm ) $( customer_loader_elm ).removeClass('evoloading loading');
211				if( loader_btn_el ) el.removeClass('evobtn_loader'); // loader on button
212
213				
214  			}
215
216			return {
217				'l1': customer_loader_elm,
218				'l2':LB_loader
219			};
220		}
221
222		$.fn.evo_perform_ajax_success = function ( OO, data, LB ){
223			var el = this;
224			var _lbdata = OO.lbdata;
225			var _adata = OO.adata;	
226			var _populate_id = OO._populate_id;	
227
228			//console.log( OO);
229
230			// if inside lightbox
231			if( LB ){
232				// show message
233					if( data && 'msg' in data && data.msg != '' ){
234						LB.evo_lightbox_show_msg({'type': data.status, 
235							'message':data.msg, 
236							hide_lightbox: ( data.status == 'bad' ? false : _lbdata.hide ),	
237							hide_message: _lbdata.hide_msg
238						});
239					}	
240
241				// populate lightbox
242				if( data && _lbdata.new_content && 'content' in data && data.content != '' ){
243					// populate a specific dom element with content
244					if( _populate_id ){
245						$('body').find('#'+_populate_id ).replaceWith( data.content );
246					}else{
247						LB.evo_lightbox_populate_content({content: data.content});
248					}
249				}	
250								
251			}else{
252				// populate content
253				if( data && _populate_id && 'content' in data && data.content != ''){
254					$('body').find('#'+_populate_id ).html( data.content );
255				}						
256			}
257
258			// Show snackbar message
259				if( 'show_snackbar' in  _adata && ('msg' in data)  && data.msg != '' ) 
260					el.evo_snackbar({message: data.msg});
261
262			// populate content with matching DOM class names, will set new html @4.7.2
263				if( 'populate_dom_classes' in data){
264					$.each( data.populate_dom_classes, function( domclass, content){
265						$('body').find('.'+ domclass).html( content );
266					} );
267				}
268
269			// if ajax data pass dom content to be replaced with run through each and replace - @4.2.3
270				if( 'refresh_dom_content' in data ){
271					$.each(data.refresh_dom_content, function(domid, content){
272						$('body').find('#'+ domid).replaceWith( content);
273					});
274				}
275
276
277			// for SP content @since 4.5.2
278				if(data &&  'sp_content' in data){
279					$("body").find('#evops_content').html( data.sp_content);
280				}
281			// SP footer content @since 4.5.2
282				if( data && 'sp_content_foot' in data){
283					$("body").find('.evosp_foot').html( data.sp_content_foot);
284				}
285			// process trumbowyg editors
286				$('body').trigger('evo_elm_load_interactivity');
287
288
289			// assign dynamic vals to DOM element
290				setTimeout(function(){
291					if( 'evoelms' in data ){
292						$.each( data.evoelms , function( uniqueid, elm_data ){
293
294							$('body').find('.has_dynamic_vals').each(function(){
295
296								if( $(this).attr('id') != uniqueid ) return;
297								var dynamic_elm = $(this);
298
299								$.each( elm_data , function( elm_key, elmv){
300									dynamic_elm.data( elm_key, elmv );
301								});
302							});
303						});
304					}
305				},200);
306
307
308			//console.log(OO);
309			$('body').trigger('evo_ajax_success_' + OO.uid,[ OO, data , el]);	
310		}
311
312	// Process ajax and lightbox values @4.7.2
313		$.fn.evo_process_ajax_params = function ( opt ){
314			// defaults
315			var defz = { 
316				'uid':'',
317
318				// @since 4.7.2
319				'adata':{}, // @4.7.2 include all ajax data in here, type (ajax,rest,endpoint),action/a, other data
320				'lbdata':{},// @4.7.2 lightbox data all in one place, class, title, size, padding
321				'_populate_id':'', // loading new content into matching elements outside of lightbox
322				
323				// legacy values
324				'content':'',// passed on dynamic content
325				'content_id' :'',// id to get dynamic content from page		
326								
327				't':'', //title
328				'lbc':'',// * lightbox class - REQUIRED
329				'lbac':'',// ligthbox additional class 4.6
330				'lbsz':'',// lightbox size = mid small, s400, s500, s700, s800
331				'lightbox_loader': true,
332				'preload_temp_key': 'init', // 4.6
333				'load_new_content': true, // @since 4.3.5
334				'lb_padding': '', // @4.3.5
335				'load_new_content_id':'',
336
337				'ajax':'no',// use ajax to load content yes no
338				'ajax_url':'',// load content from ajax file
339				'end':'admin',// admin or client end
340				'ajax_action':'', // @4.4 pass on ajax endpoint action key
341				'a':'',
342				'ajax_type':'ajax', // @4.4 ajax type, ajax, rest or endpoint
343				'd':'', // data object for ajax
344				'other_data':'',
345				'ajaxdata':'',				
346			};
347
348
349			// extend passed with defaults
350			var OO = $.extend({}, defz, opt);
351
352			// Build processed object
353				var processed = {};
354				processed['uid'] = OO.uid;
355
356			// Ajax	
357				var _adata = ( OO.adata == '') ? {}: OO.adata;
358
359				// type passed value fix
360				var passed_type_val = false;
361				if( 'type' in _adata && _adata.type != '' &&
362					!['ajax', 'rest', 'endpoint'].includes(_adata.type)
363				){
364					passed_type_val = _adata.type;
365					_adata.type = '';
366				}
367
368				// set default needed values
369				var def_avals = { 
370					'a':'',
371					'type':'ajax',
372					'end':'admin',
373					'data': '',
374					'loader_el':'',
375					'loader_btn_el':'',//4.8
376					'loader_class':'',
377					'url':'',
378				}
379				
380				// set default values
381				$.each( def_avals, function(key, value) {					
382					if( key == 'data' && !( 'a' in _adata ) && ('data' in _adata ) && 'a' in _adata.data ) return;
383					if( !(key in _adata ) && value != '' ) _adata[ key ] = value;
384				});	
385
386				//console.log( _adata );
387
388				// map old to new
389				var def_adata_mapping = { 
390					'a' : 'a',
391					'ajax_action' : 'a',
392					'ajax_type':'type',
393					'end': 'end',
394					'ajax_url': 'url',
395					'ajaxdata':'data',
396					'd':'data',
397				}
398				$.each( def_adata_mapping, function(oldV, newV) {					
399					if( newV in _adata && _adata[ newV ] != '' ) return;
400
401					if(  oldV in OO && OO[oldV] !== '' ) {
402						_adata[newV] = OO[oldV];
403					}  
404				});	
405
406				//console.log( _adata );			
407
408				// Move additional values in _adata to _adata.data
409					$.each(_adata, function(key, value) {
410						if ( !(key in def_avals)) {
411							//_adata.data[key] = value; // Move any extra values to _adata.data
412							//delete _adata[key]; // Remove them from the main _adata object
413						}
414					});
415
416				if( 'data' in _adata ){
417					//_adata['data']['nn'] = ( _adata.end == 'client' ) ? evo_general_params.n : evo_admin_ajax_handle.postnonce; 
418					
419					_adata['data']['nn'] = (typeof evo_admin_ajax_handle !== 'undefined' && evo_admin_ajax_handle !== null) 
420					    ? evo_admin_ajax_handle.postnonce 
421					    : evo_general_params.n;
422
423
424					_adata['data']['uid'] = processed['uid'];
425					if( passed_type_val ) _adata['data']['type'] = passed_type_val;
426					if( 'action' in _adata.data ) _adata['a'] =  _adata.data.action;
427					if( 'a' in _adata.data ) _adata['a'] =  _adata.data.a;
428					if( 'ajaxdata' in OO ) processed['ajaxdata'] = _adata.data;
429				}		
430
431				processed['adata'] = _adata;
432				
433
434			// lightbox
435				var _lbdata = ( OO.lbdata == '') ? {}: OO.lbdata;
436
437				// if legacy values exists > convert them to new
438				var def_lbdata_mapping = {
439					'lbc':'class',
440				    'lbsz':'size',
441				    'lbac' :'additional_class',
442				    't':'title',
443				    'lb_padding': 'padding',
444				    'load_new_content':'new_content',
445				    'lightbox_loader': 'loader',
446				    'content_id':'content_id',
447				    'content':'content',
448				    'hide_lightbox':'hide',
449				    'hide_message':'hide_msg',
450				    'lightbox_key': 'class',
451				}
452				$.each( def_lbdata_mapping, function(oldV, newV) {
453					// if _lbdata has new value > skip
454					if (newV in _lbdata && _lbdata[newV] !== '' && _lbdata[newV] !== null && _lbdata[newV] !== undefined) {
455				        return; 
456				    }
457					if(  oldV in OO && OO[oldV] !== '' ) {
458						_lbdata[newV] = OO[oldV];
459					} 
460				});	
461
462				// set default needed values
463				var def_lbvals = {
464					'padding':'evopad30',
465					'loader': false,
466					'preload_temp_key':'init',
467					'new_content': true,
468					'additional_class':'',
469					'title':'',
470					'hide':false,
471					'hide_msg':2000,
472					'content':'', // content for lightbox
473					'content_id':'', // content id in DOM to grab content for lightbox
474				}
475				// set default values
476				$.each( def_lbvals, function(key, value) {
477					if(  key in _lbdata )  return;
478					if( value == '') return;
479					_lbdata[ key ] = value;
480				});
481
482
483				//console.log( _lbdata.new_content ) ;
484
485				// load lightbox content legacy
486				if( OO.ajaxdata.load_lbcontent ) _lbdata['new_content'] = true;
487				if( OO.ajaxdata.load_new_content ) _lbdata['new_content'] = true;
488
489				// populate new content @4.7.3
490					processed['_populate_id'] =  false;
491					if( OO.load_new_content_id != '')  processed['_populate_id'] = OO.load_new_content_id;
492					if( 'new_content_id' in _lbdata && _lbdata.new_content_id != '')  processed['_populate_id'] = _lbdata.new_content_id;
493
494				processed['lbdata'] = _lbdata;
495
496			// make sure uid is moved to main level
497				if( processed.uid == '' && 'uid' in processed['lbdata'] ) processed['uid'] = processed['lbdata']['uid'];
498
499			// add legacy variables for backward compatibility
500				$.each(opt, function(oldkey, oldval){
501					if( oldkey in processed ) return;
502					processed[ oldkey ] = oldval;
503				});
504
505			//console.log( processed );
506
507			return processed;
508		}
509
510	// LIGHTBOX triggers
511		// @version 4.2
512		$('body').on('click','.evolb_trigger', function(event){
513			if( event !== undefined ){
514				event.preventDefault();
515				event.stopPropagation();
516			}
517			
518			$(this).evo_lightbox_open($(this).data('lbvals')  );
519		});
520		$('body').on('click','.evolb_close_btn', function (){
521			const LB = $(this).closest('.evo_lightbox');
522			LB.evo_lightbox_close();
523		});
524
525		// @since 4.2.2
526		$('body').on('click','.evolb_trigger_save, .evo_submit_form', function(event){
527			if( event !== undefined ){
528				event.preventDefault();
529				event.stopPropagation();
530			}
531			$(this).evo_ajax_lightbox_form_submit( $(this).data('d') );
532		});
533
534		$('body').on('click','.evo_trigger_ajax_run', function(event){
535			if( event !== undefined ){
536				event.preventDefault();
537				event.stopPropagation();
538			}
539
540			//console.log($(this).data('d') );
541			$(this).evo_admin_get_ajax( $(this).data('d') );
542		});
543		// @since 4.3.3
544		$('body').on('evo_lightbox_trigger', function(event, data){
545			//console.log( data );
546			$('body').evo_lightbox_open(data);
547		});
548
549	// Lightbox opening
550		$.fn.evo_lightbox_open = function (opt ){
551
552			var OO = this.evo_process_ajax_params( opt );
553			
554			var _lbdata = OO.lbdata;
555			var _adata = OO.adata;
556			var _populate_id = OO._populate_id;
557			
558
559			// check if required values missing for lightbox
560			if( !('class' in _lbdata) || _lbdata.class == '' ) return;
561
562
563			const fl_footer = _adata.end == 'client' ? '<div class="evolb_footer"></div>' :'';
564
565			// create lightbox HTML
566				var __lb_size = _lbdata.size === undefined ? '' : _lbdata.size;
567
568				var html = '<div class="evo_lightbox '+_lbdata.class+' '+_adata.end+' '+ ( _lbdata.additional_class !== undefined ? _lbdata.additional_class :'') +'" data-lbc="'+_lbdata.class+'"><div class="evolb_content_in"><div class="evolb_content_inin"><div class="evolb_box '+_lbdata.class+' '+ __lb_size +'"><div class="evolb_header"><a class="evolb_backbtn" style="display:none"><i class="fa fa-angle-left"></i></a>';
569				if( _lbdata.title !== undefined ) html += '<p class="evolb_title">' + _lbdata.title + '</p>';
570				html += '<span class="evolb_close_btn evolbclose "><i class="fa fa-xmark"><i></span></div><div class="evolb_content '+ _lbdata.padding +'"></div><p class="message"></p>'+fl_footer+'</div></div></div></div>';
571
572			$('#evo_lightboxes').append( html );	
573			var LIGHTBOX = $('.evo_lightbox.'+ _lbdata.class );		
574
575			
576			// Open lightbox on page
577				setTimeout( function(){ 
578					$('#evo_lightboxes').show();
579					LIGHTBOX.addClass('show');	
580					$('body').addClass('evo_overflow');
581					$('html').addClass('evo_overflow');
582				},300);
583
584				// show loading animation
585				LIGHTBOX.evo_lightbox_show_open_animation(OO);
586				
587			// Load content locally from DOM
588				// dynamic content within the site
589					if(_lbdata.content_id != ''){					
590						var content = $('#'+ _lbdata.content_id ).html();					
591						LIGHTBOX.find('.evolb_content').html( content);
592					}
593				// load passed on content
594					if(_lbdata.content != ''){
595						LIGHTBOX.find('.evolb_content').html( _lbdata.content);
596					}
597
598			// run ajax to load content for the lightbox inside
599				if( 'a' in _adata  && _adata.a != ''){ // @4.7.2
600					LB.evo_admin_get_ajax( OO );
601				}
602				
603			// load content from a AJAX file			
604				if( 'url' in _adata && _adata.url != '' ){
605					$.ajax({
606						beforeSend: function(){},
607						url:	OO.ajax_url,
608						success:function(data){
609							LIGHTBOX.find('.evolb_content').html( data);							
610						},complete:function(){}
611					});
612				}
613			
614			$('body').trigger('evo_lightbox_processed', [ OO, LIGHTBOX]);
615		}
616
617		$.fn.evo_lightbox_close = function (opt){
618			var LB = this;
619			var defaults = { 
620				'delay':500, 
621				'remove_from_dom':true,
622			};
623
624			if( !(LB.hasClass('show')) ) return;
625
626			var OO = $.extend({}, defaults, opt);
627
628			var hide_delay = parseInt( OO.delay);
629
630			complete_close = (LB.parent().find('.evo_lightbox.show').length == 1)? true: false;
631
632			if( hide_delay > 500){
633				setTimeout( function(){ 
634					LB.removeClass('show');
635				}, ( hide_delay - 500  ) );
636			}else{
637				LB.removeClass('show');
638			}
639			
640			setTimeout( function(){ 
641				if(complete_close){
642					$('body').removeClass('evo_overflow');
643					$('html').removeClass('evo_overflow');
644				}
645				// remove lightbox HTML from DOM
646				if( OO.remove_from_dom) LB.remove();
647			}, hide_delay);	
648		}
649
650
651		// Other LB functions
652			$.fn.evo_lightbox_populate_content = function(opt){
653				LB = this;
654				var defaults = { 
655					'content':'',
656				}; var OO = $.extend({}, defaults, opt);
657				LB.find('.evolb_content').html( OO.content );
658			}
659			
660			$.fn.evo_lightbox_show_msg = function(opt){
661				LB = this;
662				var defaults = { 
663					'type':'good',
664					'message':'',
665					'hide_message': false,// hide message after some time pass time or false
666					'hide_lightbox': false, // hide lightbox after some time of false
667				}; var OO = $.extend({}, defaults, opt);
668				LB.find('.message').removeClass('bad good').addClass( OO.type ).html( OO.message ).fadeIn();
669
670				if( OO.hide_message ) setTimeout(function(){  LB.evo_lightbox_hide_msg() }, OO.hide_message );
671
672				if( OO.hide_lightbox ) LB.evo_lightbox_close({ delay: OO.hide_lightbox });
673			}
674			$.fn.evo_lightbox_hide_msg = function(opt){
675				LB = this;
676				LB.find('p.message').hide();
677			}
678
679
680			// add preload animations to lightbox u4.6
681			$.fn.evo_lightbox_show_open_animation = function(opt){
682				LB = this;
683				var defaults = { 
684					'animation_type':'initial', // animation type initial or saving
685					'preload_temp_key': 'init', // 4.6 passed on preload template key
686					'end':'admin',
687				};
688				var OO = $.extend({}, defaults, opt);
689
690				if( OO.animation_type == 'initial'){
691
692					passed_data = (  typeof evo_admin_ajax_handle !== 'undefined') ? evo_admin_ajax_handle: evo_general_params;
693
694					//console.log( passed_data);
695
696					html = passed_data.html.preload_general;
697					if( OO.preload_temp_key != 'init') html = passed_data.html[ OO.preload_temp_key ];
698					LB.find('.evolb_content').html( html );
699				}
700
701				if( OO.animation_type == 'saving')
702					LB.find('.evolb_content').addClass('loading');
703			}
704
705		// eventcard Lightbox function v4.6
706			$.fn.evo_cal_lightbox_trigger = function( SC_data , obj, CAL ){
707				var additional_classes = '';
708
709				if( obj.hasClass('cancel_event')) additional_classes +=  ' cancel_event';
710
711				additional_classes += ' ' + SC_data.additional_class;
712				additional_classes += ' ' + SC_data.calendar_type; // 4.6.6
713
714				
715				var other_data = {
716					extra_classes: 'evo_lightbox_body eventon_list_event evo_pop_body evcal_eventcard event_'+SC_data.event_id +'_'+ SC_data.repeat_interval + additional_classes,
717					CAL:CAL,
718					obj: obj,
719					et_data: obj.find('.evoet_data').data(),// @4.5.5
720					SC: SC_data
721				};
722				
723				// generate a random ID for this 
724					maximum = 99;
725					minimum = 10;
726					var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
727
728				// lightbox additional class
729					lbac = '';
730					if( evo_general_params.cal.lbs == 'sc1') lbac = 'within';
731					if( evo_general_params.cal.lbs == 'sc2') lbac = 'within ecSCR';
732
733				// AJAX via lightbox
734				if(SC_data.ux_val == '3a'){
735
736					var new_content = '';
737					new_content += '<div class="evo_cardlb" style="padding:10px 10px 0 10px">';
738					new_content += '<div style="margin-bottom:20px; width:100%; height:200px" class="evo_preloading"></div>';
739					const box = '<div style="display:flex;justify-content: space-between;margin-bottom:10px"><div style="width:40px;height:40px; margin-right:20px" class="evo_preloading"></div> <div style="flex:1 0 auto"> <div class="evo_preloading" style="width:70%; height:20px; margin-bottom:10px"></div><div class="evo_preloading" style="width:100%; height:80px; margin-bottom:10px"></div>  </div> </div>';
740					new_content += box + box + box;
741					new_content += '</div>';
742
743					
744					var data_arg = {};
745					data_arg['event_id'] = SC_data.event_id;
746					data_arg['ri'] = SC_data.repeat_interval;
747					data_arg['SC'] = SC_data;
748					data_arg['load_lbcontent'] = true;
749					data_arg['action'] = 'eventon_load_single_eventcard_content';
750					data_arg['uid'] = 'load_single_eventcard_content_3a';
751					if( CAL ) data_arg['calid'] = CAL.attr('id');
752
753					
754					//reset view to match
755						if( data_arg.SC.tile_style == '2') data_arg.SC.eventtop_style = '0';
756						data_arg.SC.tile_style = '0';
757						data_arg.SC.tile_bg = '0';
758						data_arg.SC.tiles = 'no';
759						
760					$('body').evo_lightbox_open({
761						uid:'evo_open_eventcard_lightbox',
762						//uid:'load_single_eventcard_content_3a',
763						lbc:'evo_eventcard_'+ randomnumber,lbac: lbac,
764						end:'client',
765						content: new_content,
766						ajax:'yes',
767						ajax_type: 'endpoint',
768						ajax_action: 'eventon_load_single_eventcard_content',
769						d: 	data_arg,
770						other_data: other_data
771					});
772					
773				// open lightbox using page event content
774				}else{
775
776					var content = obj.closest('.eventon_list_event').find('.event_description').html();
777					var _content = $(content).not('.evcal_close');
778
779					clrW = obj.closest('.eventon_list_event').hasClass('clrW') ? 'clrW':'clrD';//4.8  
780									
781					CAL.evo_lightbox_open({
782						uid:'evo_open_eventcard_lightbox',
783						lbc:'evo_eventcard_'+ randomnumber,lbac: lbac,
784						end:'client',
785						content: '<div class="evopop_top '+clrW+'">'+ obj.html() +'</div><div class="evopop_body">' + content +'</div>',
786						other_data: other_data
787					});
788
789					return;
790				}	
791			}
792
793			// listerners for lightbox on eventcard
794			$.fn.evo_cal_lb_listeners = function(){
795				// Listerners
796				// process various lightbox types
797				$('body')
798				.on('evo_lightbox_processed', function(event, OO, LIGHTBOX){
799					if( OO.uid != 'evo_open_eventcard_lightbox') return false;
800
801					var CAL = OO.other_data.CAL;
802
803					LIGHTBOX.addClass('eventcard eventon_events_list');
804					LIGHTBOX_content = LIGHTBOX.find('.evolb_content');
805					LIGHTBOX_content.attr('class', 'evolb_content '+ OO.other_data.extra_classes );
806					
807					var SC = OO.other_data.SC;
808					var obj = OO.other_data.obj;
809
810					//console.log(SC);
811
812					// update border color and eventtop color
813						const evoet_data = OO.other_data.et_data;
814						
815						bgcolor = bggrad ='';
816						if( evoet_data ){
817							bgcolor = evoet_data.bgc;
818							bggrad = evoet_data.bggrad;
819						}
820						
821
822						// if tiles and eventtop style set to clean
823						var show_lightbox_color = ( SC.eventtop_style == '0' || SC.eventtop_style == '4') ? false: true;
824						
825						if( (CAL && CAL.hasClass('color') && show_lightbox_color) ||
826							(!CAL && show_lightbox_color)
827
828						){
829							LIGHTBOX_content.addClass('color');
830							LIGHTBOX_content.find('.evopop_top').css({
831								'background-color':bgcolor,
832								'background-image': bggrad,
833							});
834						}else{
835							LIGHTBOX_content.addClass('clean');
836							LIGHTBOX_content.find('.evopop_top').css({'border-left':'3px solid '+bgcolor});
837						}
838
839					// trigger 
840					if( obj.data('runjs')){
841						$('body').trigger('evo_load_single_event_content',[ SC.event_id, OO.other_data.obj]);
842					}
843									
844					
845					// RTL
846					if( SC.evortl =='yes')	LIGHTBOX.addClass('evortl');
847
848					$('body').trigger('evolightbox_end', [ LIGHTBOX , CAL, OO]);	// @s4.6
849
850				})
851
852				// after eventcard content is loaded to lightbox via 3a - @since 4.2.3
853					.on('evo_ajax_success_evo_open_eventcard_lightbox', function (event, OO, data){
854						
855						if( OO.ajaxdata.uid != "load_single_eventcard_content_3a") return false;
856						
857						LIGHTBOX = $('.evo_lightbox.'+ OO.lightbox_key);
858
859						CAL = $('body').find('#'+ OO.ajaxdata.calid);
860						
861						$('body').trigger('evolightbox_end', [ LIGHTBOX , CAL, OO]);	// @s4.6	
862					})
863				;			
864			}
865
866	// Get Ajax url @since 4.4 @u 4.5.5
867		$.fn.evo_get_ajax_url = function(opt){
868			var defaults = { 
869				a:'', // action key
870				e:'client', // end
871				type: 'ajax'};
872			var OO = $.extend({}, defaults, opt);
873
874			
875
876			// end point url
877			if( OO.type == 'endpoint'){
878				var evo_ajax_url = ( OO.e == 'client' || typeof evo_general_params !== 'undefined' )? 
879					evo_general_params.evo_ajax_url : evo_admin_ajax_handle.evo_ajax_url;
880				return  evo_ajax_url.toString().replace( '%%endpoint%%', OO.a );
881			// rest api url
882			}else if( OO.type == 'rest' ){
883				var evo_ajax_url = ( OO.e == 'client' || typeof evo_general_params !== 'undefined')? 
884					evo_general_params.rest_url : evo_admin_ajax_handle.rest_url;
885					//console.log(evo_ajax_url);
886					//console.log(OO);
887				return  evo_ajax_url.toString().replace( '%%endpoint%%', OO.a );
888			}else{
889				action_add = OO.a != '' ? '?action='+ OO.a: '';
890				return ( OO.e == 'client' || typeof evo_general_params !== 'undefined') ? 
891					evo_general_params.ajaxurl + action_add : evo_admin_ajax_handle.ajaxurl + action_add;
892			}	
893		}
894
895	// loading animations @4.7.2
896		$.fn.evo_start_loading = function( opt ){
897			var defaults = { type:'1'};
898			var OPT = $.extend({}, defaults, opt);
899			var el = this;
900
901			if( OPT.type == '1') el.addClass('evoloading loading');
902			if( OPT.type == '2') el.addClass('evoloading_2');
903		}
904		$.fn.evo_stop_loading = function( opt ){
905			var el = this;
906			var defaults = { type:'1'};
907			var OPT = $.extend({}, defaults, opt);
908
909			if( OPT.type == '1') el.removeClass('evoloading loading');
910			if( OPT.type == '2') el.removeClass('evoloading_2');
911		}
912		$.fn.evo_lightbox_start_inloading = function(opt){
913			LB = this;
914			LB.find('.evolb_content').addClass('loading');
915		}
916		$.fn.evo_lightbox_stop_inloading = function(opt){
917			LB = this;
918			LB.find('.evolb_content').removeClass('loading');
919		}
920	
921	// Count down	// @+ 4.5
922		$.fn.evo_countdown_get = function(opt){
923			var defaults = { gap:'', endutc: ''};
924			var OPT = $.extend({}, defaults, opt);
925			var gap = OPT.gap;
926
927			// if gap not provided use endutc
928			if( gap == '' ){				
929				var Mnow = moment().utc();
930				var M = moment();
931				M.set('millisecond', OPT.endutc );
932
933				gap = OPT.endutc - Mnow.unix();
934			}
935			
936			// if negative gap
937			if( gap < 0){
938				return {
939					'd': 0,
940					'h':0,
941					'm':0,
942					's':0
943				}; 
944			}
945		
946			distance = ( gap * 1000);
947
948			var days = Math.floor(distance / (1000 * 60 * 60 * 24));
949			var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
950			var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
951			var seconds = Math.floor((distance % (1000 * 60)) / 1000);
952
953			minutes = minutes<10? '0'+minutes : minutes;
954			seconds = seconds<10? '0'+seconds : seconds;
955
956			return {
957				'd': days,
958				'h':hours,
959				'm':minutes,
960				's':seconds
961			}; 
962		};
963		// @u 4.5.2
964		$.fn.evo_countdown = function(opt){
965			var defaults = { S1:''};
966			var OPT = $.extend({}, defaults, opt);
967			var el = $(this);
968
969			const day_text = ( el.data('d') !== undefined && el.data('d') != '' )? el.data('d'):'Day';
970			const days_text = ( el.data('ds') !== undefined && el.data('ds') != '' )? el.data('ds'):'Days';
971
972			// intial run
973			//var gap = parseInt(el.data('gap'));
974			var duration = el.data('dur');
975			var endutc = parseInt(el.data('endutc'));
976			var text = el.data('t');
977			
978			if(text === undefined) text = '';
979
980			if( el.hasClass('evo_cd_on')) return;
981
982			// get gap using end time utc
983				var Mnow = moment().utc();
984				var M = moment();
985				M.set('millisecond', OPT.endutc );
986
987				//console.log(Mnow.unix());
988				//console.log(endutc);
989
990				gap = endutc - Mnow.unix();
991
992
993			// on initial run - event hasnt happened yet
994			if( gap > 0 ){
995
996				// initial
997				dd = el.evo_countdown_get({ 'gap': gap });
998				
999				el.html( ( dd.d>0 ? dd.d + ' ' + ( dd.d >1 ? days_text: day_text ) + " "  :'') + dd.h + ":" + dd.m +':'+ dd.s +'  '+text );
1000				
1001				el.data('gap', ( gap - 1)  );	// save new gap value
1002				el.addClass('evo_cd_on');
1003				
1004				// set intervals
1005				var CD = setInterval(function(){
1006					
1007					gap = el.data('gap'); // get gap for this cycle
1008					duration = el.data('dur');	
1009
1010					const bar_elm = el.closest('.evo_event_progress').find('.evo_ep_bar');	
1011
1012					// when timer is ticking
1013					if( gap > 0 ){
1014
1015						// increase bar width if exists
1016						if( duration !== undefined && bar_elm.length){
1017							perc = ( (duration - gap)/ duration ) * 100;
1018							bar_elm.find('b').css('width',perc+'%');							
1019						}
1020						
1021						dd = el.evo_countdown_get({ 'gap': gap });	
1022
1023						el.html( ( dd.d>0 ? dd.d + ' '  + ( dd.d >1 ? days_text: day_text ) + " ":'') + dd.h + ":" + dd.m +':'+ dd.s +' '+text );
1024						el.data('gap', ( gap - 1)  );
1025
1026					// when timer expired
1027					}else{
1028
1029						const expire_timer_action = el.data('exp_act');
1030
1031						// perform ajax task after expiration
1032						if(expire_timer_action !== undefined){
1033							$('body').trigger('runajax_refresh_now_cal',[ 
1034								el , 
1035								el.data('n'),
1036							]);
1037						}
1038
1039						const _complete_text = el.evo_get_txt({V:'event_completed'});
1040
1041						// live now text
1042						if(bar_elm.length){
1043							bar_elm.addClass('evo_completed');
1044							//el.siblings('.evo_ep_pre').html( _complete_text );
1045						}
1046
1047
1048						// event tag & live elements
1049						if( el.closest('.evcal_desc').length){
1050							el.closest('.evcal_desc').find('.eventover').html( _complete_text);
1051							el.closest('.evcal_desc').find('.evo_live_now').remove();
1052						}
1053
1054						// event card
1055						if( el.closest('.eventon_list_event').length){
1056							el.closest('.eventon_list_event').find('span.evo_live_now').hide();
1057						}
1058
1059						el.html('');
1060						clearInterval(CD);
1061					}
1062
1063				},1000);
1064			// event has already passed
1065			}else{
1066				// if gap is less
1067				el.closest('.evo_event_progress').find('.evo_ep_bar').hide();
1068				clearInterval(CD);
1069			}
1070		};	
1071
1072	// Handlebar process template data into html
1073		$.fn.evo_HB_process_template = function(opt){
1074			var defaults = { TD:'', part:''}
1075			var OPT = $.extend({}, defaults, opt);
1076
1077			BUS = $('#evo_global_data').data('d');
1078						
1079			template = Handlebars.compile( BUS.temp[ OPT.part ] );
1080			return template( OPT.TD );
1081		}
1082
1083	// Date range and events @4.6.7
1084		// Date range and events - from webpage
1085		$.fn.evo_cal_events_in_range = function(opt){
1086			var defaults = { S:'', E:'', 
1087				hide: true, 
1088				closeEC:true,
1089				showEV: false, // show events
1090				showEVL: false, // show events list
1091				showAllEvs: false // show all events regardless of the range
1092			};
1093			var OPT = $.extend({}, defaults, opt);
1094			var CAL = $(this);
1095
1096			var eJSON = CAL.find('.evo_cal_events').data('events');
1097			var SC = CAL.evo_shortcode_data();
1098
1099			R = {};
1100			html = '';
1101			json = {};
1102
1103			show = 0;
1104
1105			// using events JSON data
1106			if( eJSON && eJSON.length > 0){
1107				$.each(eJSON, function(ind, ED){
1108					eO = CAL.find('#event_'+ ED._ID);
1109					if(eO === undefined || eO.length==0) return;
1110
1111					if(OPT.hide)	eO.hide(); // pre hide
1112					this_show = false;
1113
1114					// month long or year long events
1115					if( ED.month_long || ED.year_long ){
1116						this_show = true;
1117
1118					}else{
1119						if(CAL.evo_is_in_range({
1120							'S': OPT.S,	'E': OPT.E,	'start': ED.unix_start ,	'end':ED.unix_end 
1121						})){						
1122							this_show = true;
1123						} 
1124					}
1125
1126					if( OPT.showAllEvs) this_show = true;
1127					
1128					if( this_show){	
1129						// show event
1130						if( OPT.showEV) eO.show();
1131
1132						// close open event cards
1133						if(OPT.closeEC && SC.evc_open == 'no') eO.find('.event_description').hide().removeClass('open');
1134
1135						html += eO[0].outerHTML;
1136						json[ ED._ID] = ED;
1137						show++;	
1138					} 
1139				});
1140			}else{	
1141				// get all the events in the events list
1142				var cal_events = CAL.find('.eventon_list_event');
1143
1144				cal_events.each(function(index, elm){
1145					var ED = $(elm).evo_cal_get_basic_eventdata();
1146					if( !ED) return;
1147
1148					if(OPT.hide)	$(elm).hide(); // pre hide
1149					this_show = false;
1150
1151					// month long or year long events
1152					if( $(elm).hasClass('month_long') || $(elm).hasClass('year_long') ){
1153						this_show = true;
1154
1155					}else{
1156						if(CAL.evo_is_in_range({
1157							'S': OPT.S,	'E': OPT.E,	'start': ED.unix_start ,	'end':ED.unix_end 
1158						})){						
1159							this_show = true;
1160						} 
1161					}
1162
1163					if( OPT.showAllEvs) this_show = true;
1164					
1165					if( this_show){	
1166						// show event
1167						if( OPT.showEV) $(elm).show();
1168
1169						// close open event cards
1170						if(OPT.closeEC && SC.evc_open == 'no') 
1171							$(elm).find('.event_description').hide().removeClass('open');
1172
1173						html += $(elm)[0].outerHTML;
1174						json[ ED.uID ] = ED;
1175						show++;	
1176					} 
1177				});
1178			}
1179
1180
1181			// No events
1182			if( OPT.showEV){
1183
1184				no_event_content = CAL.evo_get_global({S1: 'html', S2:'no_events'});
1185
1186				tx_noevents = CAL.evo_get_txt({V:'no_events'});
1187				EL = CAL.find('.eventon_events_list');
1188				EL.find('.eventon_list_event.no_events').remove();
1189				if( show == 0 )
1190					EL.append('<div class="eventon_list_event no_events">'+ no_event_content +'</div>');
1191			}
1192
1193			// if show events list
1194			if( OPT.showEVL){
1195				CAL.find('.eventon_events_list').show().removeClass('evo_hide');
1196			}
1197
1198			R['count'] = show;
1199			R['html'] = html;
1200			R['json'] = json;
1201
1202			return R;
1203		}
1204
1205		// check if an event is in the given date range
1206			$.fn.evo_is_in_range = function(opt){
1207				var defaults = { S:'', E:'', start:'',end:''}
1208				var OPT = $.extend({}, defaults, opt);
1209
1210				S = parseInt(OPT.S);
1211				E = parseInt(OPT.E);
1212				start = parseInt(OPT.start);
1213				end = parseInt(OPT.end);
1214
1215				return (
1216					( start <= S && end >= E ) ||
1217					( start <= S && end >= S && end <= E) ||
1218					( start <= E && end >= E ) ||
1219					( start >= S && end <= E )
1220				) ? true: false;
1221			}
1222			$.fn.evo_cal_hide_events = function(){
1223				CAL = $(this);
1224				CAL.find('.eventon_list_event').hide();
1225			}
1226
1227	// get event data basics from html event on page 
1228	// ~@version 4.0.3
1229		$.fn.evo_cal_get_basic_eventdata = function(){
1230			var ELM = $(this);
1231
1232			var _time = ELM.data('time');
1233			if( _time === undefined ) return false;
1234
1235			const time = _time.split('-');
1236			const ri = ELM.data('ri').replace('r','');
1237			const eID = ELM.data('event_id');
1238
1239			var _event_title = ELM.find('.evcal_event_title').text();
1240			_event_title = _event_title.replace(/'/g, '&apos;');
1241
1242
1243			var RR = {
1244				'uID': eID + '_' + ri,
1245				'ID': eID ,
1246				'event_id': eID ,
1247				'ri': ri,
1248				'event_start_unix': parseInt(time[0]),
1249				'event_end_unix': parseInt(time[1]),
1250				'ux_val': ELM.find('.evcal_list_a').data('ux_val'),
1251				'event_title': _event_title,
1252				'hex_color': ELM.data('colr'),
1253				'hide_et': ELM.hasClass('no_et') ? 'y':'n', // hide endtime
1254				'evcal_event_color': ELM.data('colr'),
1255				'unix_start': parseInt(time[0]),// @4.5.7
1256				'unix_end': parseInt(time[1]),// @4.5.7
1257			};
1258
1259			// event type
1260			RR['ett1'] = {};
1261			ELM.find('.evoet_eventtypes.ett1 .evoetet_val').each(function(){
1262				RR['ett1'][ $(this).data('id')] = $(this).data('v');
1263			});
1264
1265			// since 4.3.5
1266			const eventtop_data = ELM.find('.evoet_data').data('d');
1267
1268			// location
1269			if('loc.n' in eventtop_data && eventtop_data['loc.n'] != ''){
1270				RR['location'] = eventtop_data['loc.n'];
1271			}
1272
1273			// organizer
1274			if('orgs' in eventtop_data && eventtop_data.orgs !== undefined ){
1275				var org_names = '';
1276				$.each(eventtop_data.orgs, function(index, value){
1277					org_names += value +' ';
1278				});
1279				RR['organizer'] = org_names;
1280			}
1281
1282			// event tags @s 4.5.2
1283			if( 'tags' in eventtop_data && eventtop_data.tags !== undefined ){
1284				//console.log(eventtop_data.tags);
1285				RR['event_tags'] = eventtop_data.tags;
1286			}
1287
1288
1289			return RR;
1290
1291		}
1292
1293
1294	// DATE time functions @+2.8		
1295		$.fn.evo_day_in_month = function(opt){
1296			var defaults = { M:'', Y:''}
1297			var OPT = $.extend({}, defaults, opt);
1298
1299			return new Date(OPT.Y, OPT.M, 0).getDate();
1300		}
1301		$.fn.evo_get_day_name_index = function(opt){
1302			var defaults = { M:'', Y:'', D:''}
1303			var OPT = $.extend({}, defaults, opt);
1304
1305			//return moment(OPT.Y+'-'+OPT.M+'-'+OPT.D).utc().day();
1306
1307			return new Date(  Date.UTC(OPT.Y, OPT.M-1, OPT.D) ).getUTCDay();
1308		}
1309
1310	// LIGHTBOX
1311	// page Lightbox functions @+2.8
1312	// append to the lightbox main class name .evo_lightbox		
1313		// Legacy
1314			$.fn.evo_prepare_lb = function(){
1315				$(this).find('.evo_lightbox_body').html('');
1316			}
1317			$.fn.evo_show_lb = function(opt){
1318				var defaults = { RTL:'', calid:''}
1319				var OPT = $.extend({}, defaults, opt);
1320
1321				$(this).addClass('show '+ OPT.RTL).attr('data-cal_id', OPT.calid);
1322				$('body').trigger('evolightbox_show');
1323			}
1324			$.fn.evo_append_lb = function(opt){
1325				var defaults = { C:'', CAL:''}
1326				var OPT = $.extend({}, defaults, opt);
1327				$(this).find('.evo_lightbox_body').html( OPT.C);
1328
1329				if(  OPT.CAL!= '' && OPT.CAL !== undefined && OPT.CAL.hasClass('color')){
1330					const LIST = $(this).find('.eventon_events_list');
1331					if( LIST.length>0){
1332						LIST.find('.eventon_list_event').addClass('color');
1333					}				
1334				}
1335			}
1336
1337	// event image gallery @4.6
1338		// adjust event image height on lightbox
1339		$.fn.eventon_check_img_size_on_lb = function(  ){
1340			LB = this;
1341			winH = parseInt($( window ).height());
1342			winW = parseInt($( window ).width());
1343
1344			var pad = 50;
1345			if( winW < 650) pad = 20;
1346			if( winW < 500) pad = 10;
1347
1348			winH -= pad*2;
1349			winW -= pad*2;
1350
1351			LB = $('body').find('.evolb_ft_img');
1352			WINratio = winH/winW;
1353
1354			const IMG = LB.find('img');
1355			IMGratio = parseInt( IMG.data('h') )/ parseInt( IMG.data('w') );
1356			img_relative_w = parseInt(winH/IMGratio);
1357
1358			if(WINratio < 1 ){// wider window
1359				if(IMGratio<1){// wider image
1360					if(img_relative_w > winW){ // image wider than window
1361						IMG.css({'width': winW ,'height': 'auto' } );
1362					}else{// image smaller than window width
1363						newIH = winH>parseInt(IMG.data('h'))? parseInt(IMG.data('h')): winH;
1364						newIW = (winH>parseInt(IMG.attr('h')) )? '100%': img_relative_w;
1365						IMG.css({'width': newIW ,'height': newIH } );
1366					}
1367				}else{
1368					winH = winH > 1001 ? 1000 : winH;
1369					IMG.css({'width': 'auto' ,'height': winH } );
1370				}
1371			}else{// taller window
1372				if(IMGratio<1){// wider image
1373					IMG.css({'width': winW ,'height': 'auto' } );
1374				}else{// taller image
1375					winW = winW > 1001 ? 1000 : winW;
1376					if(img_relative_w > winW){ // relative image wider than window
1377						IMG.css({'width': winW ,'height': 'auto' } );
1378					}else{
1379						IMG.css({'width': 'auto' ,'height': winH } );
1380					}
1381				}
1382			}
1383
1384			//console.log(WINratio +' '+IMGratio);
1385		}
1386
1387		$.fn.eventon_process_main_ft_img = function(OO){
1388			IMG = this;
1389			img_sty = 'def';
1390			if( IMG.hasClass('fit') ) img_sty = 'fit';
1391			if( IMG.hasClass('full') ) img_sty = 'full';
1392
1393			box_width = IMG.width();
1394			box_height = IMG.height();
1395
1396			img_height = parseInt( IMG.data('h') );
1397			img_width = parseInt( IMG.data('w') );
1398			img_ratio = IR = img_height / img_width; // image ratio
1399
1400			// fit style
1401			if( IMG.hasClass('fit')){
1402				new_width = box_height / img_ratio;
1403				//console.log(new_width+' '+box_height +' '+img_ratio);
1404				new_height = box_height;
1405				if( new_width > box_width ){// width is wider than box
1406
1407					if( IR <1 ){
1408						new_width = box_width; new_height = IR * new_width;
1409					}else{
1410						new_height = box_height; new_width = new_height / IR;
1411					}
1412				} 				
1413				IMG.find('span').css({'width':new_width, 'height': new_height} );
1414			}
1415
1416			// full style
1417			if( IMG.hasClass('full')){
1418				new_height = img_ratio * box_width;
1419				new_width = box_width;
1420				IMG.find('span').css({'width':new_width, 'height': new_height} );
1421				IMG.css({'height': new_height} );
1422			}
1423
1424			//console.log(box_width +' '+img_width+' '+new_width);
1425		}
1426
1427
1428	/**
1429	 * Form functions
1430	 * @version 4.8.2
1431	 */
1432		$.fn.evo_RealTime_form_validation = function() {
1433	        return this.each(function() {
1434	            var form = $(this);
1435	            var req_fields = form.find('.input.req');
1436	            var email_fields = form.find('.input.email');
1437	            var humanvalid_fields = form.find('.input.evoelm_hval_val');
1438
1439	            function validateField(field, type) {
1440	                var errorElement = field.siblings('em');
1441	                var hasError = false;
1442	                var fieldValue = field.val().trim();
1443
1444		            if (type === 'email') {		   
1445		            	if (field.hasClass('req')) {
1446		                    // Required email: Check if filled AND valid
1447		                    hasError = fieldValue === '' || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(fieldValue);
1448		                } else {
1449		                    // Optional email: Only check if it’s not empty
1450		                    hasError = fieldValue !== '' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(fieldValue);
1451		                }
1452                         	
1453		            } else if (type === 'humanvalid') {
1454		                var correctAnswer =  field.data('val'); // Expected answer from data attribute
1455		                hasError = ( '89r329' +field.val().trim()+ '8932ufe' ) !== correctAnswer;
1456		            } else {
1457		                hasError = field.val().trim() === '';
1458		            }                
1459
1460		            if (hasError) {
1461		                if (errorElement.length === 0) {
1462		                    errorElement = $('<em class="evoelm_field_errmsg evopadt5"></em>');
1463		                    field.after(errorElement);
1464		                }
1465		                errorElement.html(getErrorMessage(type === 'email' ? 'err2' : type === 'humanvalid' ? 'err3' : 'err1'))
1466		                    .removeClass('evodn')
1467		                    .addClass('evodib');
1468		                field.addClass('err');
1469		            } else {
1470		                errorElement.remove();
1471		                field.removeClass('err');
1472		            }	                
1473
1474	                return hasError;
1475	            }
1476	            
1477
1478	            function getErrorMessage(type) {
1479		            const messages = {
1480		                err1: evo_general_params.text.err1, // Required field error
1481		                err2: evo_general_params.text.err2, // Email format error
1482		                err3: evo_general_params.text.err3  // Human validation error (e.g., "Incorrect answer")
1483		            };
1484		            return messages[type] || "";
1485		        }
1486
1487		        function validateForm() {
1488		            var hasErrors = false;
1489		            req_fields.each(function() {
1490		                if (validateField($(this), 'text')) hasErrors = true;
1491		            });
1492		            email_fields.each(function() {
1493		                if (validateField($(this), 'email')) hasErrors = true;
1494		            });
1495		            humanvalid_fields.each(function() {
1496		                if (validateField($(this), 'humanvalid')) hasErrors = true;
1497		            });
1498		            return !hasErrors;
1499		        }
1500
1501	            req_fields.on('input blur', function() { validateField($(this), 'text'); });
1502            	email_fields.on('input blur', function() { validateField($(this), 'email'); });
1503            	humanvalid_fields.on('input blur', function() { validateField($(this), 'humanvalid'); });
1504
1505            	// attach validation to custom submittions
1506            	$('body').on('evo_elm_form_presubmit_validation', function(event, callback){
1507            		event.preventDefault();
1508            		var isValid = validateForm();
1509	                if (typeof callback === "function") {
1510	                    callback(isValid); // Return true/false to the callback
1511	                }
1512            	});
1513	        });
1514	    }
1515
1516
1517	// Calendar Data & Shortcodes
1518		// get shortcodes from evo bottom
1519		$.fn.evo_shortcode_data = function(){			
1520			var ev_cal = $(this);
1521			return ev_cal.find('.evo_cal_data').data('sc');			
1522		}
1523
1524		// get filter data @4.6
1525			$.fn.evo_get_filter_data = function(){			
1526				return $(this).find('.evo_cal_data').data('filter_data');			
1527			}
1528			$.fn.evo_cal_get_filter_sub_data = function( tax , key){
1529				newdata = $(this).evo_get_filter_data();
1530
1531				return newdata[ tax ][ key ];
1532			}
1533			$.fn.evo_cal_update_filter_data = function(tax, new_val, key){
1534
1535				newdata = $(this).evo_get_filter_data();
1536
1537				if( key === undefined) key = 'nterms';
1538
1539				newdata[ tax ][ key ] = new_val;
1540
1541				$(this).find('.evo_cal_data').data('filter_data', newdata );
1542			}
1543			$.fn.evo_cal_get_footer_data = function( key ){
1544				data = $(this).find('.evo_cal_data').data();
1545
1546				//console.log(data);
1547
1548				if( data === undefined ) return false; // 4.6.2
1549				if( key in data ) return data[ key ];
1550				return false;		
1551			}
1552
1553		// hide cal data from view
1554		$.fn.evo_cal_hide_data = function(){			
1555			$(this).find('.evo_cal_data').attr({
1556				'data-sc':'',
1557				'data-filter_data':'',
1558				'data-nav_data':'',
1559			});			
1560		}
1561
1562		// update shortcode values from filter changes @u4.6
1563		$.fn.evo_update_sc_from_filters = function(){
1564			var el = $(this); 	
1565			SC = el.evo_shortcode_data();
1566
1567
1568			$.each( el.evo_get_filter_data() , function(index, value){
1569				var default_val 	= value.terms;
1570				var filter_val 		= value.nterms;
1571				const NOT_values 	= value.__notvals;
1572
1573				filter_val = filter_val == ''? 'NOT-all': filter_val;	
1574				
1575				var not_string = '';
1576
1577				// if NOT filter in place > include that in tax value for query
1578				if( NOT_values!== undefined && NOT_values.length >0 && filter_val != default_val ){	
1579					
1580					$.each(NOT_values, function(index, value){
1581						not_string += 'NOT-'+ value +',';
1582					});
1583				}		
1584
1585				SC[ index ] = not_string + filter_val;
1586			});
1587			
1588
1589			el.find('.evo_cal_data').data( 'sc', SC );
1590		}
1591		
1592		
1593
1594		// get shortcode single value
1595		$.fn.evo_get_sc_val = function(opt){
1596			var defaults = {	F:''}
1597			var OPT = $.extend({}, defaults, opt);
1598			var ev_cal = $(this); 
1599
1600			if(OPT.F=='') return false;
1601			SC = ev_cal.find('.evo_cal_data').data('sc');
1602
1603			if(!(SC[ OPT.F])) return false;
1604			return SC[ OPT.F];
1605		}
1606		// UPDATE Single value
1607		$.fn.evo_update_cal_sc = function(opt){
1608			var defaults = {
1609				F:'', V:''
1610			}
1611			var OPT = $.extend({}, defaults, opt);
1612			var ev_cal = $(this); 
1613			SC = ev_cal.find('.evo_cal_data').data('sc');
1614
1615			SC[ OPT.F ] = OPT.V;
1616
1617			ev_cal.find('.evo_cal_data').data( 'sc', SC );
1618		}
1619		// UPDATE all shortcode values
1620		$.fn.evo_update_all_cal_sc = function(opt){
1621			var defaults = {SC:''}
1622			var OPT = $.extend({}, defaults, opt);
1623			var CAL = $(this);
1624			CAL.find('.evo_cal_data').data( 'sc', OPT.SC );
1625		}
1626
1627		
1628
1629	// OTHERS
1630		// hex colors // @+2.8 @updated 4.7.2
1631		$.fn.evo_is_hex_dark = function(opt){
1632			var defaults = { hex:'808080'}
1633			var OPT = $.extend({}, defaults, opt);
1634
1635			hex = OPT.hex;
1636
1637			var c = hex.replace('#','');
1638			var is_hex = typeof c === 'string' && c.length === 6 && !isNaN(Number('0x' + c));
1639
1640			if(is_hex){	
1641				var values = c.split('');
1642				r = parseInt(values[0].toString() + values[1].toString(), 16);
1643			    g = parseInt(values[2].toString() + values[3].toString(), 16);
1644			    b = parseInt(values[4].toString() + values[5].toString(), 16);
1645			}else{
1646				var vals = c.substring(c.indexOf('(') +1, c.length -1).split(', ');
1647				var r = vals[0]  // extract red
1648				var g = vals[1];  // extract green
1649				var b = vals[2];
1650			}
1651
1652			var luma = ((r * 299) + (g * 587) + (b * 114)) / 1000; // per ITU-R BT.709
1653
1654			return luma> 128? true:false;
1655		}
1656
1657		// get rgb from hex code @4.5
1658			$.fn.evo_rgb_process = function(opt){
1659				var defaults = { data:'808080',type:'rgb', method:'rgb_to_val'}
1660				var opt = $.extend({}, defaults, opt);
1661
1662				const color = opt.data;
1663
1664				// RGB => hex
1665				if( opt.method == 'rgb_to_hex'){
1666					if(color == '1'){
1667						return;
1668					}else{
1669						if(color !=='' && color){
1670							rgb = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
1671							
1672							return "#" +
1673							("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
1674							("0" + parseInt(rgb[2],10).toString(16)).slice(-2) +
1675							("0" + parseInt(rgb[3],10).toString(16)).slice(-2);
1676						}
1677					}
1678				}
1679
1680				// RGB => rgb val
1681				if( opt.method == 'rgb_to_val'){
1682					if( opt.type == 'hex'){
1683						var rgba = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);	
1684						var rgb = new Array();
1685						rgb['r']= parseInt(rgba[1], 16);			
1686						rgb['g']= parseInt(rgba[2], 16);			
1687						rgb['b']= parseInt(rgba[3], 16);
1688						
1689					}else{
1690						rgb = color;
1691					}
1692					
1693					return parseInt((rgb['r'] + rgb['g'] + rgb['b'])/3);
1694				}				
1695			}
1696
1697		// Other data
1698			$.fn.evo_get_OD = function(){			
1699				var ev_cal = $(this);
1700				return ev_cal.find('.evo_cal_data').data('od');			
1701			}
1702
1703	
1704
1705		// get evo data for a given calendar
1706		$.fn.evo_getevodata = function(){
1707
1708			var ev_cal = $(this);
1709			var evoData = {};
1710			
1711			ev_cal.find('.evo-data').each(function(){
1712				$.each(this.attributes, function(i, attrib){
1713					var name = attrib.name;
1714					if(attrib.name!='class' && attrib.name!='style' ){
1715						name__ = attrib.name.split('-');
1716						evoData[name__[1]] = attrib.value;	
1717					}
1718				});
1719			});	
1720
1721			return evoData;
1722		}
1723
1724		// check if mobile device v4.6
1725		$.fn.evo_is_mobile = function(){
1726			return ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) )? true: false;		
1727		}
1728
1729	// eventon loading functions
1730	// v 2.4.5 -- deprecating
1731		$.fn.evo_loader_animation = function(opt){
1732			var defaults = {
1733				direction:'start'
1734			}
1735			var OPT = $.extend({}, defaults, opt);
1736
1737			if(OPT.direction == 'start'){
1738				$(this).find('#eventon_loadbar').slideDown();
1739			}else{
1740				$(this).find('#eventon_loadbar').slideUp();
1741			}
1742		}
1743
1744	// DEPRECATED functions
1745		$.fn.evo_item_shortcodes = function(){			
1746			var OBJ = $(this);
1747			var shortcode_array ={};			
1748			OBJ.each(function(){	
1749				$.each(this.attributes, function(i, attrib){
1750					var name = attrib.name;
1751					if(attrib.name!='class' && attrib.name!='style' && attrib.value !=''){
1752						name__ = attrib.name.split('-');
1753						shortcode_array[name__[1]] = attrib.value;	
1754					}
1755				});
1756			});
1757			return shortcode_array;
1758		}
1759		$.fn.evo_shortcodes = function(){			
1760			var ev_cal = $(this);
1761			var shortcode_array ={};
1762					
1763			ev_cal.find('.cal_arguments').each(function(){
1764				$.each(this.attributes, function(i, attrib){
1765					var name = attrib.name;
1766					if(attrib.name!='class' && attrib.name!='style' && attrib.value !=''){
1767						name__ = attrib.name.split('-');
1768						shortcode_array[name__[1]] = attrib.value;	
1769					}
1770				});
1771			});	
1772			return shortcode_array;
1773		}
1774		
1775
1776}(jQuery));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.