PageSourceSearch

https://www.ib.edu.ar/wp-content/plugins/eventon-lite/assets/js/eventon_functions.js?ver=2.4.9

js ib.edu.ar collected 2026-10-03 17:34:12 UTC 44,753 bytes, 1,488 lines download raw bytes

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