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