PageSourceSearch

https://africawrites.org/wp-content/plugins/eventON/assets/js/eventon_functions.js?ver=4.7.1

js africawrites.org collected 2026-10-02 11:21:27 UTC 43,525 bytes, 1,458 lines download raw bytes

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