1function getUrlParameter(name) { 2 name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); 3 var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); 4 var results = regex.exec(location.search); 5 return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 6}; 7 8function calculateModalButton(){ 9 if($('#home-events-filter-container a.active').length || $('#home-events-filter-container input.active').length){ 10 $('#modal-clear-button').addClass('is-visible'); 11 } else { 12 $('#modal-clear-button').removeClass('is-visible'); 13 } 14} 15 16function generateFilterList() { 17 var filterList = ''; 18 var displayList = ''; 19 var data = []; 20 var city = $('#home-event-city-filter option:selected').val() || 'all'; 21 var url = ''; 22 var typeUrl = 'type='; 23 var dayUrl = 'eventday='; 24 var cityUrl = 'city='; 25 var openItemsUrl = 'open='; 26 let selectedTypes = []; 27 let selectedDays = []; 28 29 if(!$('#home-events-filter-container').length){ 30 return false; 31 } 32 33 // Handle city 34 if (city != 'all') { 35 var firstChar = city.charAt(0); 36 if (firstChar == '.') { 37 cityName = city.substring(1); 38 } 39 cityUrl += cityName; 40 } 41 42 // Collect selected types 43 $('#home-events-filter-container .event-type-toggle.active').each(function () { 44 var typeId = $(this).attr('data-id'); 45 selectedTypes.push(typeId); 46 typeUrl += typeId + ','; 47 displayList += '<a href="#" data-id="' + typeId + '" class="event-type-toggle">' + $(this).text() + '<span class="icon-close"></span></a>'; 48 }); 49 50 // Collect selected day (radio input logic) 51 var $checkedDay = $('#home-events-filter-container input[name="event-day"]:checked'); 52 if ($checkedDay.length) { 53 var dayId = $checkedDay.attr('data-id'); // or use .val(), since they match 54 var dayLabel = $checkedDay.attr('data-label'); 55 selectedDays.push(dayId); 56 dayUrl += dayId; 57 displayList += '<a href="#" data-id="' + dayId + '" class="event-day-toggle">' + dayLabel + '<span class="icon-close"></span></a>'; 58 } 59 60 // Trim trailing comma from typeUrl 61 if (typeUrl.endsWith(',')) typeUrl = typeUrl.slice(0, -1); 62 63 // Build filterList with inclusive type, exclusive day 64 if (selectedTypes.length > 0) { 65 selectedTypes.forEach(function (type) { 66 if (selectedDays.length > 0) { 67 selectedDays.forEach(function (day) { 68 filterList += '.' + type + '.' + day + ','; 69 }); 70 } else { 71 filterList += '.' + type + ','; 72 } 73 }); 74 } else if (selectedDays.length > 0) { 75 selectedDays.forEach(function (day) { 76 filterList += '.' + day + ','; 77 }); 78 } 79 80 // Handle open-item filter 81 if ($('#open-item-filter').hasClass('active')) { 82 openItemsUrl = 'open=yes'; 83 if (filterList === '') { 84 filterList = '.open-item'; 85 } else { 86 let splitFilters = filterList.split(','); 87 filterList = splitFilters.map(f => f + '.open-item').join(','); 88 } 89 } 90 91 // Prepend city if selected 92 if (city != 'all') { 93 let splitFilters = filterList.split(','); 94 filterList = splitFilters.map(f => city + f).join(','); 95 } 96 97 // Clean up trailing comma 98 if (filterList.endsWith(',')) { 99 filterList = filterList.slice(0, -1); 100 } 101 102 // Default fallback 103 if (filterList === '') { 104 filterList = city != 'all' ? city : 'all'; 105 } 106 107 // Build URL 108 let params = []; 109 if (cityUrl !== 'city=') params.push(cityUrl); 110 if (dayUrl !== 'eventday=') params.push(dayUrl); 111 if (typeUrl !== 'type=') params.push(typeUrl); 112 if (openItemsUrl !== 'open=') params.push(openItemsUrl); 113 url = params.length > 0 ? '?' + params.join('&') : ''; 114 115 // Push URL to history 116 let newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + url; 117 if (history.pushState) { 118 window.history.pushState({ path: newurl }, '', newurl); 119 } 120 121 // Clear button visibility 122 if (selectedTypes.length === 0 && selectedDays.length === 0 && city === 'all' && !$('#open-item-filter').hasClass('active')) { 123 $('#home-event-filters-clear-all, #modal-clear-button').removeClass('is-visible'); 124 } else { 125 $('#home-event-filters-clear-all, #modal-clear-button').addClass('is-visible'); 126 } 127 128 data['filterList'] = filterList;
129 data['displayList'] = displayList; 130 131 return data; 132} 133 134$('.update-resource-item-file').on('change', function(){ 135 var file = this.files[0]; 136 137 var eventId = $(this).data('id'); 138 var index = $(this).data('index'); 139 140 if (!file) return; 141 142 var formData = new FormData(); 143 formData.append('file', file); 144 var username = 'cacpro'; 145 //Dev 146 //var appPassword = 'sQ0e8mK6fMBCUxJefkTa7rfC'; 147 //Live 148 var appPassword = 'e9K6q4FtDEQk4xKgR9nVua1q'; 149 150 $.ajax({ 151 url: '/wp-json/trailsday/v1/resource/upload', // Your custom endpoint 152 method: 'POST', 153 beforeSend: function(xhr) { 154 xhr.setRequestHeader('Authorization', 'Basic ' + btoa(username + ':' + appPassword)); 155 }, 156 data: formData, 157 processData: false, // Don't process the files 158 contentType: false, // Set content type to false 159 success: function(response) { 160 var output = JSON.parse(response); 161 var url = output.url; 162 163 $.ajax({ 164 url: '/wp-json/trailsday/v1/resource/update/', 165 type: "POST", 166 data: { 167 eventId: eventId, 168 index: index, 169 newFile: url 170 }, 171 success: function(response) { 172 location.reload(); 173 }, 174 error: function(xhr, status, error) { 175 console.error("Error:", error); 176 } 177 }); 178 }, 179 error: function(error) { 180 console.error('Upload failed', error); 181 } 182 }); 183}); 184 185$('#new-resource-file').on('change', function(){ 186 var file = this.files[0]; 187 188 var eventId = $(this).data('id'); 189 190 if (!file) return; 191 192 var formData = new FormData(); 193 formData.append('file', file); 194 var username = 'cacpro'; 195 //Dev 196 //var appPassword = 'sQ0e8mK6fMBCUxJefkTa7rfC'; 197 //Live 198 var appPassword = 'e9K6q4FtDEQk4xKgR9nVua1q'; 199 200 $.ajax({ 201 url: '/wp-json/trailsday/v1/resource/upload', // Your custom endpoint 202 method: 'POST', 203 beforeSend: function(xhr) { 204 xhr.setRequestHeader('Authorization', 'Basic ' + btoa(username + ':' + appPassword)); 205 }, 206 data: formData, 207 processData: false, // Don't process the files 208 contentType: false, // Set content type to false 209 success: function(response) { 210 var output = JSON.parse(response); 211 var url = output.url; 212 213 $.ajax({ 214 url: '/wp-json/trailsday/v1/resource/add/', 215 type: "POST", 216 data: { 217 eventId: eventId, 218 newFile: url 219 }, 220 success: function(response) { 221 location.reload(); 222 }, 223 error: function(xhr, status, error) { 224 console.error("Error:", error); 225 } 226 }); 227 }, 228 error: function(error) { 229 console.error('Upload failed', error); 230 } 231 }); 232}); 233 234$(document).on('click', '#add-new-resource', function(e){ 235 e.preventDefault(); 236 237 $('#add-resource-container').slideToggle(500); 238}); 239 240$('.remove-resource').on('click', function(e){ 241 e.preventDefault(); 242 243 var eventId = $(this).data('id'); 244 var index = $(this).data('index'); 245 246 $.ajax({ 247 url: '/wp-json/trailsday/v1/resource/delete/', 248 type: "POST", 249 data: { 250 eventId: eventId, 251 index: index 252 }, 253 success: function(response) { 254 location.reload(); 255 }, 256 error: function(xhr, status, error) { 257 console.error("Error:", error); 258 } 259 }); 260}); 261 262$(document).ready(function(){ 263 //Attach FastClick to eliminate delays for taps on mobile devices. 264 FastClick.attach(document.body); 265 266 //Hide any transitions from appearing before the page completely loads. 267 $(window).load(function() { 268 $("body").removeAttr('id'); 269 }); 270 271 calculateModalButton(); 272 generateFilterList(); 273 274 //Page animations 275 $(".animsition").animsition({ 276 inClass: 'fade-in', 277 outClass: 'fade-out', 278 inDuration: 1400, 279 outDuration: 1000, 280 linkElement: '.animsition-link', 281 // e.g. linkElement: 'a:not([target="_blank"]):not([href^="#"])' 282 loading: true, 283 loadingParentElement: 'html', //animsition wrapper element 284 loadingClass: 'animsition-loading', 285 loadingInner: '<img src="' + window.location.protocol + "//" + window.location.host + '/wp-content/themes/cpfa/images/loading.svg" />', // e.g '<img src="loading.svg" />' 286 timeout: false, 287 timeoutCountdown: 5000, 288 onLoadEvent: true, 289 browser: [ 'animation-duration', '-webkit-animation-duration'], 290 overlay : false, 291 overlayClass : 'animsition-overlay-slide', 292 overlayParentElement : 'body', 293 transition: function(url){ window.location.href = url; } 294 }); 295 296 //Lazy load image setup...
297 lazyLoad = new LazyLoad({ 298 elements_selector: '.lazy' 299 }); 300 301 $("#mobile-menu-icon").on('click', function(e){ 302 e.preventDefault(); 303 304 $(this).toggleClass('active'); 305 $('#mobile-menu').slideToggle(500); 306 }); 307 308 $('#map-button').on('click', function(e){ 309 e.preventDefault(); 310 311 $('#shadow').toggleClass('is-visible'); 312 $('body').toggleClass('nav-menu-open'); 313 setTimeout(function(){ 314 $('#home-modal-container').toggleClass('is-visible'); 315 }, 500); 316 }); 317 318 $('#close-map').on('click', function(e){ 319 e.preventDefault(); 320 321 $('#home-modal-container').toggleClass('is-visible'); 322 $('body').toggleClass('nav-menu-open'); 323 setTimeout(function(){ 324 $('#shadow').toggleClass('is-visible'); 325 }, 500); 326 }); 327 328 $('#home-events-toggle').on('click', function(e){ 329 e.preventDefault(); 330 331 $('#shadow').toggleClass('is-visible'); 332 setTimeout(function(){ 333 $('#home-events-filter-container').toggleClass('is-visible'); 334 $('body').toggleClass('nav-menu-open'); 335 }, 500); 336 }); 337 338 $('#close-filter-container').on('click', function(e){ 339 e.preventDefault(); 340 341 $('body').toggleClass('nav-menu-open'); 342 $('#home-events-filter-container').toggleClass('is-visible'); 343 setTimeout(function(){ 344 $('#shadow').toggleClass('is-visible'); 345 }, 500); 346 }); 347 348 $('.gform_wrapper .ginput_container.ginput_container_select select, .gform_wrapper .ginput_container.ginput_container_time select').selectric({disableOnMobile: false}); 349 350 $(document).on('gform_page_loaded', function(event, form_id, current_page){ 351 $('.gform_wrapper .ginput_container.ginput_container_select select, .gform_wrapper .ginput_container.ginput_container_time select').selectric({disableOnMobile: false}); 352 }); 353 354 //Accordions expand/contract... 355 $('.accordion-header').on('click', function(e){ 356 e.preventDefault(); 357 358 clicked = $(this); 359 360 if($(clicked).hasClass('active')) 361 { 362 $(clicked).next('.accordion-details').slideUp(500); 363 $(clicked).removeClass('active'); 364 } 365 else 366 { 367 if($('.accordion-header.active').length) 368 { 369 active = $('.accordion-header.active'); 370 371 $(active).removeClass('active'); 372 $(active).next('.accordion-details').slideUp(500, function(){ 373 $(clicked).next('.accordion-details').slideDown(500); 374 $(clicked).addClass('active'); 375 }); 376 } 377 else 378 { 379 $(clicked).next('.accordion-details').slideDown(500); 380 $(clicked).addClass('active'); 381 } 382 } 383 }); 384 385 $('#home-event-filter-icon-wrapper a').on('click', function(e){ 386 e.preventDefault(); 387 388 var list = $('#home-events'); 389 var listItems = list.children('.event-list-item'); 390 list.append(listItems.get().reverse()); 391 392 var active = $('#home-event-filter-icon-wrapper a.active'); 393 var inactive = $('#home-event-filter-icon-wrapper a:not(.active)'); 394 395 active.removeClass('active'); 396 inactive.addClass('active'); 397 }); 398 399 $('#home-events-filter-container .event-type-toggle').on('click', function(e){ 400 e.preventDefault(); 401 402 $(this).toggleClass('active'); 403 404 calculateModalButton(); 405 }); 406 407 $('#open-item-filter').on('change', function(e){ 408 $(this).toggleClass('active'); 409 410 var returnData = generateFilterList(); 411 var filterList = returnData['filterList']; 412 var displayList = returnData['displayList']; 413 414 //mixer.destroy(); 415 mixer = mixitup('#home-events', { 416 load: { 417 filter: filterList, 418 }, 419 selectors: { 420 target: '.event-list-item' 421 } 422 }); 423 424 mixer.forceRefresh(); 425 mixer.filter(filterList); 426 mixer.forceRender(); 427 428 $('#home-event-filters-applied').empty(); 429 $('#home-event-filters-applied').append(displayList); 430 }); 431 432 $('#home-events-filter-container .event-day-toggle').on('change', function(e){ 433 if($(this).hasClass('active')) 434 { 435 $(this).removeClass('active'); 436 } 437 else 438 { 439 $(this).toggleClass('active'); 440 } 441 442 calculateModalButton(); 443 }); 444 445 $('#modal-clear-button').on('click', function(e){ 446 e.preventDefault(); 447 window.location.href = window.location.pathname; 448 return false; 449 450 $('#home-events-filter-container a.active').removeClass('active'); 451 $('input[type="radio"][name="event-day"]').prop('checked', false); 452 453 mixer.destroy(); 454 mixer = mixitup('#home-events', { 455 load: { 456 filter: 'all', 457 }, 458 selectors: { 459 target: '.event-list-item' 460 } 461 }); 462 463 mixer.forceRefresh(); 464 mixer.filter('all'); 465 mixer.forceRender(); 466 467 $('#home-event-filters-applied').empty(); 468 469 $(this).removeClass('is-visible'); 470 }); 471 472 $('#home-event-filters-clear').on('click', function(e){ 473 e.preventDefault(); 474 window.location.href = window.location.pathname; 475 return false;
476 477 mixer.destroy(); 478 mixer = mixitup('#home-events', { 479 load: { 480 filter: 'all', 481 }, 482 selectors: { 483 target: '.event-list-item' 484 } 485 }); 486 487 mixer.forceRefresh(); 488 mixer.filter('all'); 489 mixer.forceRender(); 490 491 $('#home-event-filters-applied').empty(); 492 $(this).parent().removeClass('is-visible'); 493 }); 494 495 $('#filter-button').on('click', function(e){ 496 e.preventDefault(); 497 498 var returnData = generateFilterList(); 499 var filterList = returnData['filterList']; 500 var displayList = returnData['displayList']; 501 502 if(filterList == 'all'){ 503 $('#home-event-filters-clear-all').removeClass('is-visible'); 504 } else { 505 if(filterList != '') 506 { 507 $('#home-event-filters-clear-all').addClass('is-visible'); 508 } 509 } 510 511 mixer.destroy(); 512 mixer = mixitup('#home-events', { 513 load: { 514 filter: filterList, 515 }, 516 selectors: { 517 target: '.event-list-item' 518 } 519 }); 520 521 mixer.forceRefresh(); 522 mixer.filter(filterList); 523 mixer.forceRender(); 524 525 $('#home-event-filters-applied').empty(); 526 $('#home-event-filters-applied').append(displayList); 527 $('#home-events-filter-container').toggleClass('is-visible'); 528 $('body').toggleClass('nav-menu-open'); 529 setTimeout(function(){ 530 $('#shadow').toggleClass('is-visible'); 531 }, 500); 532 }); 533 534 $(document).on('click', '#home-event-filters-applied a', function(e){ 535 e.preventDefault(); 536 537 var id = $(this).attr('data-id'); 538 539 $('#home-events-filter-container .event-type-toggle.active').each(function(){ 540 if($(this).attr('data-id') == id){ 541 $(this).toggleClass('active'); 542 } 543 }); 544 545 $('#home-events-filter-container .event-day-toggle.active').each(function(){ 546 if($(this).attr('data-id') == id){ 547 $(this).toggleClass('active'); 548 $(this).prop('checked', false); 549 } 550 }); 551 552 var returnData = generateFilterList(); 553 var filterList = returnData['filterList']; 554 var displayList = returnData['displayList']; 555 556 if(filterList == 'all'){ 557 $('#home-event-filters-clear-all').removeClass('is-visible'); 558 } else { 559 $('#home-event-filters-clear-all').addClass('is-visible'); 560 } 561 562 mixer.destroy(); 563 mixer = mixitup('#home-events', { 564 load: { 565 filter: filterList, 566 }, 567 selectors: { 568 target: '.event-list-item' 569 } 570 }); 571 572 mixer.forceRefresh(); 573 mixer.filter(filterList); 574 mixer.forceRender(); 575 576 $('#home-event-filters-applied').empty(); 577 $('#home-event-filters-applied').append(displayList); 578 }); 579 580 $('#home-event-city-filter').selectric({disableOnMobile: false}).on('change', function(){ 581 var returnData = generateFilterList(); 582 var filterList = returnData['filterList']; 583 584 mixer.destroy(); 585 mixer = mixitup('#home-events', { 586 load: { 587 filter: filterList, 588 }, 589 selectors: { 590 target: '.event-list-item' 591 } 592 }); 593 594 mixer.forceRefresh(); 595 mixer.filter(filterList); 596 mixer.forceRender(); 597 }); 598 599 //Handle sorting on the front-end... 600 if($('#home-events').length) { 601 var filterList = 'all'; 602 603 if(getUrlParameter("open")){ 604 if(getUrlParameter("city")){ 605 filterList = '.' + getUrlParameter("city") + '.open-item'; 606 } 607 608 if(getUrlParameter("eventday")) 609 { 610 var dayList = getUrlParameter("eventday").split(","); 611 var dayListItems = ""; 612 613 for(var i = 0; i< dayList.length; i++){ 614 dayListItems += "." + dayList[i] + ".open-item"; 615 } 616 617 if(filterList != 'all'){ 618 filterList += ', ' + dayListItems; 619 } else { 620 filterList = dayListItems; 621 } 622 } 623 624 if(getUrlParameter("type")) 625 { 626 var typeList = getUrlParameter("type").split(","); 627 var typeListItems = ""; 628 629 for(var i = 0; i< typeList.length; i++){ 630 typeListItems += "." + typeList[i] + ".open-item"; 631 } 632 633 if(filterList != 'all'){ 634 filterList += ', ' + typeListItems; 635 } else { 636 filterList = typeListItems; 637 } 638 } 639 640 if(filterList == 'all'){ 641 filterList =".open-item"; 642 } 643 } 644 else 645 { 646 if(getUrlParameter("city")){ 647 filterList = '.' + getUrlParameter("city"); 648 } 649 650 if(getUrlParameter("eventday")) 651 { 652 var dayList = getUrlParameter("eventday").split(","); 653 var dayListItems = ""; 654 655 for(var i = 0; i< dayList.length; i++){ 656 dayListItems += "." + dayList[i]; 657 } 658 659 if(filterList != 'all'){ 660 filterList += ', ' + dayListItems; 661 } else { 662 filterList = dayListItems; 663 } 664 } 665
666 if(getUrlParameter("type")) 667 { 668 var typeList = getUrlParameter("type").split(","); 669 var typeListItems = ""; 670 671 for(var i = 0; i< typeList.length; i++){ 672 typeListItems += "." + typeList[i]; 673 } 674 675 if(filterList != 'all'){ 676 filterList += ', ' + typeListItems; 677 } else { 678 filterList = typeListItems; 679 } 680 } 681 } 682 683 var mixer = mixitup('#home-events', { 684 load: { 685 filter: filterList, 686 }, 687 selectors: { 688 target: '.event-list-item' 689 } 690 }); 691 } 692 693 $('#single-events-registration-button a.register-button').on('click', function(e){ 694 e.preventDefault(); 695 696 if($(this).hasClass('active')){ 697 $(this).find('.title').text('Register'); 698 } else { 699 $(this).find('.title').text('Close'); 700 } 701 702 $(this).toggleClass('active'); 703 $('#single-events-form').slideToggle(500); 704 }); 705 706 $('#single-event-tabs').responsiveTabs(); 707 708 var singleEventRelatedSlider = new Swiper('#single-event-related-content', { 709 loop: true, 710 speed: 1000, 711 slidesPerView: 4, 712 spaceBetween: 30, 713 navigation: { 714 nextEl: '.single-event-related-next', 715 prevEl: '.single-event-related-prev', 716 }, 717 breakpoints: { 718 1000: { 719 slidesPerView: 3 720 }, 721 800: { 722 slidesPerView: 2 723 }, 724 500: { 725 slidesPerView: 1, 726 spaceBetween: 10 727 } 728 } 729 }); 730 731 $('#update-resources').on('click', function(e){ 732 e.preventDefault(); 733 734 var id = $(this).data('id'); 735 var resources = null; 736 737 $('.resource-item').each(function(){ 738 var resource; 739 740 resource.title = $(this).find('.resource-item-title').val(); 741 }); 742 }); 743});
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.