PageSourceSearch

https://www.inesad.edu.bo/wp-content/plugins/eventON/assets/js/eventon_functions.js

js inesad.edu.bo collected 2026-10-02 08:37:30 UTC 49,095 bytes, 1,647 lines download raw bytes

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