1 2 3// The theme renders a single #map. initMap() is re-run on every filter/AJAX 4// refresh, so the live map, its clusterer and its markers are kept here and 5// replaced wholesale; the document-level handlers at the bottom of this block 6// are bound once and read from this state instead of closing over it. 7let nunspeetMapState = null; 8 9// Bumped on every initMap() call. Because initMap() awaits importLibrary(), a 10// slow earlier call could otherwise publish its state after a newer one. 11let nunspeetMapGeneration = 0; 12 13function nunspeetMarkerIconUrl(city) { 14 switch (String(city).toLowerCase()) { 15 case "elspeet": 16 return nunsp_ajax_object.theme_url + "/assets/images/map-pin-1.svg"; 17 case "hulshorst": 18 return nunsp_ajax_object.theme_url + "/assets/images/map-pin-2.svg"; 19 case "vierhouten": 20 return nunsp_ajax_object.theme_url + "/assets/images/map-pin-3.svg"; 21 default: 22 return nunsp_ajax_object.theme_url + "/assets/images/map-pin.svg"; 23 } 24} 25 26function nunspeetInfoWindowContent(markerData, btnText) { 27 return ( 28 '<div class="mapsec-box"><div class="mapbox"><a href="' + 29 markerData.pageUrl + 30 '"> <span class="close"><i class="fal fa-times"></i></span></a>' + 31 '<div class="mapbox-img"> <img src="' + 32 markerData.image + 33 '" alt="img">' + 34 '</div> <div class="mapbox-txt"> <h6>' + 35 markerData.title + 36 '</h6> <span class="label">' + 37 markerData.address.city + 38 "</span>" + 39 "<p></p>" + 40 '<a href="' + 41 markerData.pageUrl + 42 '" class="common-btn btn">' + 43 btnText + 44 ' <i class="far fa-chevron-right"></i></a>' + 45 "</div></div></div>" 46 ); 47} 48 49// Builds the AdvancedMarkerElements for one set of API markers and returns them 50// together with the bounds that enclose them. 51function nunspeetBuildMarkers(markerDataList, context) { 52 const { map, AdvancedMarkerElement, infowindow, btnText } = context; 53 const bounds = new google.maps.LatLngBounds(); 54 55 const gmarkers = markerDataList.map((markerData) => { 56 const pos = new google.maps.LatLng( 57 markerData.latitude, 58 markerData.longitude 59 ); 60 const contentString = nunspeetInfoWindowContent(markerData, btnText); 61 62 // Create a div element for the custom icon 63 const iconDiv = document.createElement("div"); 64 iconDiv.innerHTML = `<img src="${nunspeetMarkerIconUrl( 65 markerData.address.city 66 )}" alt="Marker Icon" style="width: 50px; height: 50px;">`; 67 68 const marker = new AdvancedMarkerElement({ 69 map, 70 position: pos, 71 content: iconDiv, 72 title: markerData.title, 73 }); 74 75 // Marker click listener 76 marker.addListener("click", () => { 77 infowindow.setContent(contentString); 78 infowindow.open(map, marker); 79 }); 80 81 bounds.extend(marker.position); 82 return marker; 83 }); 84 85 return { gmarkers, bounds }; 86} 87 88async function initMap(markers) { 89 // functions.php omits the Maps loader when no API key is configured; without 90 // it there is nothing to initialise and the list view has to stay usable. 91 if (!window.google || !google.maps || !google.maps.importLibrary) { 92 return; 93 } 94 95 const mapElement = document.getElementById("map"); 96 if (!mapElement) { 97 return; 98 } 99 100 const generation = ++nunspeetMapGeneration; 101 102 // Request needed libraries. 103 const { Map } = await google.maps.importLibrary("maps"); 104 const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); 105 106 // A newer rebuild started while we were awaiting â let that one win. 107 if (generation !== nunspeetMapGeneration) { 108 return; 109 } 110 111 const jsonObject = markers.map(JSON.stringify); 112 const uniqueSet = new Set(jsonObject); 113 markers = Array.from(uniqueSet).map(JSON.parse); 114 115 // Create an object to keep track of seen coordinates 116 let seenCoordinates = {}; 117 118 // Filter the array to remove duplicates based on latitude and longitude 119 const uniqueData = markers.filter(function (item) { 120 const key = item.latitude + "-" + item.longitude; 121 122 // If we haven't seen this coordinate before, mark it as seen and keep the item 123 if (!seenCoordinates[key]) { 124 seenCoordinates[key] = true; 125 return true; 126 } 127 return false;
128 }); 129 130 markers = uniqueData; 131 132 const mapOptions = { 133 zoom: 3, 134 center: { lat: -28.024, lng: 140.887 }, 135 mapTypeId: "roadmap", 136 fullscreenControl: false, 137 streetViewControl: false, 138 mapTypeControl: false, 139 mapId: "8b2776595e5c47f2", 140 }; 141 142 const map = new Map(mapElement, mapOptions); 143 144 let btnText; 145 146 switch (nunsp_ajax_object.wpml_current_language) { 147 case "en": 148 btnText = "Read more"; 149 break; 150 case "de": 151 btnText = "Weiterlesen"; 152 break; 153 default: 154 btnText = "Lees meer"; 155 } 156 157 const infowindow = new google.maps.InfoWindow(); 158 const context = { map, AdvancedMarkerElement, infowindow, btnText }; 159 const { gmarkers, bounds } = nunspeetBuildMarkers(markers, context); 160 161 map.fitBounds(bounds); 162 163 let clusterAlgo = new markerClusterer.SuperClusterAlgorithm({ 164 maxZoom: 15, 165 }); 166 167 const svg = window.btoa( 168 `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30"><path fill="#23397c" stroke="#23397c" stroke-width="3" stroke-opacity="0.25" d="M15,5c5.524,0,10,4.478,10,10s-4.478,10-10,10S5,20.522,5,15S9.478,5,15,5z"/></svg>` 169 ); 170 171 const renderer = { 172 render: ({ count, position }) => 173 new google.maps.Marker({ 174 label: { 175 text: String(count), 176 color: "#FFFFFF", 177 fontSize: "16px", 178 fontWeight: "600", 179 }, 180 icon: { 181 url: `data:image/svg+xml;base64,${svg}`, 182 scaledSize: new google.maps.Size(65, 65), 183 }, 184 position, 185 // adjust zIndex to be above other markers 186 zIndex: Number(google.maps.Marker.MAX_ZINDEX) + count, 187 }), 188 }; 189 190 // Marker clusterer 191 let cluster = new markerClusterer.MarkerClusterer({ 192 map: map, 193 markers: gmarkers, 194 algorithm: clusterAlgo, 195 renderer, 196 }); 197 198 // Publish the live map so the list/map view switch and the filter handlers 199 // below can reach it. The map is often built while #map is still 200 // display:none, which makes this first fitBounds() run against a zero-sized 201 // container â refitNunspeetMap() corrects that once the map view is shown. 202 nunspeetMapState = { 203 map, 204 cluster, 205 infowindow, 206 btnText, 207 AdvancedMarkerElement, 208 markers, 209 bounds, 210 }; 211} 212 213// Bound once: initMap() runs again on every AJAX refresh, so registering these 214// inside it would stack up a handler per rebuild. 215jQuery(document).on( 216 "change", 217 ".mapsec .location_filter input:checkbox[name^='location']", 218 function () { 219 const state = nunspeetMapState; 220 if (!state) { 221 return; 222 } 223 224 let filters = []; 225 jQuery( 226 ".mapsec .location_filter input:checkbox[name^='location']:checked" 227 ).each(function (index, elem) { 228 filters.push(jQuery(elem).val()); 229 }); 230 231 const filteredMarkers = filterByCity(state.markers, filters); 232 233 state.cluster.clearMarkers(); 234 235 const { gmarkers, bounds } = nunspeetBuildMarkers(filteredMarkers, state); 236 237 state.map.fitBounds(bounds); 238 state.bounds = bounds; 239 240 state.cluster.addMarkers(gmarkers); 241 } 242); 243 244jQuery(document).on("click", "button#reset", function (event) { 245 const state = nunspeetMapState; 246 if (!state) { 247 return; 248 } 249 if (document.querySelector('input[name="location[]"]:checked') !== null) { 250 state.cluster.clearMarkers(); 251 initMap(state.markers); 252 } 253}); 254 255jQuery(function ($) { 256 //Home slider// 257 var swiper = new Swiper(".homepage-banner", {}); 258 $( 259 ".home .about-txt .moreless-button, .innerpageabsec.aboutsec .about-txt .moreless-button" 260 ).click(function () { 261 $( 262 ".home .about-txt .moretext, .innerpageabsec.aboutsec .about-txt .moretext" 263 ).slideToggle(); 264 }); 265 266 $(".about-txt .moreless-button").click(function () { 267 if ($(".about-txt .moreless-button").text() == "Lees meer") { 268 $(this).text("Lees minder"); 269 $(this).addClass("active"); 270 $(".moretext").addClass("autoheight"); 271 } else { 272 $(this).text("Lees meer"); 273 $(this).removeClass("active"); 274 $(".moretext").removeClass("autoheight"); 275 } 276 }); 277 278 $(".innerpageabsec.aboutsec.listsec .moretext .moreless-button").on( 279 "click", 280 function () { 281 $(".innerpageabsec.aboutsec.listsec .moretext").clearQueue(); 282 $(".innerpageabsec.aboutsec.listsec .moretext").stop(); 283 e.stopPropagation(); 284 } 285 ); 286 287 $(".reservation-lists .moreless-button").click(function () { 288 $(".reservation-lists .extratxt").slideToggle(); 289 if ($(".reservation-lists .moreless-button").text() == "Lees meer") { 290 $(this).text("Lees minder"); 291 $(this).addClass("active"); 292 } else { 293 $(this).text("Lees meer"); 294 $(this).removeClass("active"); 295 } 296 }); 297 //menu// 298 $("header .navbar-toggler").click(function () { 299 $(this).toggleClass("active"); 300 $("header").toggleClass("nav-show"); 301 $(".navbar").toggleClass("show"); 302 $("body").toggleClass("overflow_body"); 303 }); 304 //search// 305 $(".searchbox").click(function () { 306 $(".search-mainbar").addClass("show"); 307 }); 308 $(".search-mainbar .close").click(function () { 309 $(".search-mainbar").removeClass("show"); 310 }); 311 // stickyHeader 312 $(function () { 313 var shrinkHeader = 100; 314 $(window).scroll(function () { 315 var scroll = getCurrentScroll(); 316 if (scroll >= shrinkHeader) { 317 $("header").addClass("sticky"); 318 } else { 319 $("header").removeClass("sticky"); 320 } 321 }); 322 function getCurrentScroll() { 323 return window.pageYOffset || document.documentElement.scrollTop; 324 } 325 326 $("header ul.navbar-nav li.menu-item-has-children > a").prepend( 327 '<span class="parent_arrow"></span>' 328 ); 329 330 jQuery( 331 "#menu-header-menu > li.menu-item-has-children > a > .parent_arrow" 332 ).click(function (e) { 333 e.preventDefault(); 334 jQuery("ul.sub-menu").slideUp(); 335 if (jQuery(this).hasClass("isOpen")) { 336 jQuery(this).removeClass("isOpen"); 337 } else { 338 jQuery(".parent_arrow").removeClass("isOpen"); 339 jQuery(this).addClass("isOpen"); 340 jQuery(this).parent().parent().children("ul.sub-menu").slideDown(); 341 } 342 }); 343 344 jQuery("#menu-header-menu ul.sub-menu li a .parent_arrow").click(function ( 345 e 346 ) { 347 e.preventDefault(); 348 if (jQuery(this).hasClass("isOpen")) { 349 jQuery(this).parent().next().slideUp(); 350 } else { 351 jQuery(this).parent().next().slideDown(); 352 } 353 354 jQuery(this).toggleClass("isOpen"); 355 }); 356 });
357 //slider// 358 var swiperTech = new Swiper(".eventslider", { 359 slidesPerView: 1, 360 spaceBetween: 30, 361 loop: true, 362 spaceBetween: 30, 363 slidesPerGroup: 1, 364 navigation: { 365 nextEl: ".eventslider .swiper-arrows .swiper-button-next", 366 prevEl: ".eventslider .swiper-arrows .swiper-button-prev", 367 }, 368 pagination: { 369 el: ".eventslider .swiper-pagination", 370 clickable: true, 371 }, 372 373 breakpoints: { 374 767: { 375 slidesPerView: 2, 376 spaceBetween: 30, 377 slidesPerGroup: 2, 378 }, 379 1100: { 380 slidesPerView: 2, 381 spaceBetween: 30, 382 slidesPerGroup: 2, 383 }, 384 1280: { 385 slidesPerView: 4, 386 spaceBetween: 30, 387 slidesPerGroup: 4, 388 }, 389 1990: { 390 slidesPerView: 4, 391 spaceBetween: 30, 392 slidesPerGroup: 4, 393 }, 394 }, 395 }); 396 var swiperTech = new Swiper(".whatslider", { 397 slidesPerView: 1, 398 spaceBetween: 30, 399 loop: true, 400 spaceBetween: 30, 401 slidesPerGroup: 1, 402 navigation: { 403 nextEl: ".whatslider .swiper-arrows .swiper-button-next", 404 prevEl: ".whatslider .swiper-arrows .swiper-button-prev", 405 }, 406 pagination: { 407 el: ".whatslider .swiper-pagination", 408 clickable: true, 409 }, 410 411 breakpoints: { 412 767: { 413 slidesPerView: 2, 414 spaceBetween: 30, 415 slidesPerGroup: 2, 416 }, 417 1280: { 418 slidesPerView: 2, 419 spaceBetween: 30, 420 slidesPerGroup: 2, 421 }, 422 1990: { 423 slidesPerView: 2, 424 spaceBetween: 30, 425 slidesPerGroup: 2, 426 }, 427 }, 428 }); 429 430 var ovlslides = $(".overviewlistslider .swiper-slide").length; 431 var swiperTech = new Swiper(".overviewlistslider", { 432 slidesPerView: 1, 433 spaceBetween: 30, 434 loop: ovlslides > 3 ? true : false, 435 spaceBetween: 30, 436 autoHeight: true, 437 slidesPerGroup: 1, 438 navigation: { 439 nextEl: ".overviewlistslider .swiper-arrows .swiper-button-next", 440 prevEl: ".overviewlistslider .swiper-arrows .swiper-button-prev", 441 }, 442 pagination: { 443 el: ".overviewlistslider .swiper-pagination", 444 clickable: true, 445 }, 446 447 breakpoints: { 448 767: { 449 slidesPerView: 2, 450 spaceBetween: 30, 451 slidesPerGroup: 2, 452 }, 453 1100: { 454 slidesPerView: 3, 455 spaceBetween: 30, 456 slidesPerGroup: 3, 457 }, 458 1280: { 459 slidesPerView: 4, 460 spaceBetween: 30, 461 slidesPerGroup: 4, 462 }, 463 1990: { 464 slidesPerView: 4, 465 spaceBetween: 30, 466 slidesPerGroup: 4, 467 }, 468 }, 469 }); 470 471 var swiper = new Swiper(".listthumbslider", { 472 spaceBetween: 20, 473 slidesPerView: 3, 474 freeMode: true, 475 watchSlidesProgress: true, 476 }); 477 // var swiper2 = new Swiper(".listthumbslider2", { 478 // spaceBetween: 10, 479 // navigation: { 480 // nextEl: ".listthumbslider .swiper-button-next", 481 // prevEl: ".listthumbslider .swiper-button-prev", 482 // }, 483 // thumbs: { 484 // swiper: swiper, 485 // }, 486 // }); 487 488 //dropdown// 489 $(".dropdown > .caption").on("click", function () { 490 $(this).parent().toggleClass("open"); 491 }); 492 $(".dropdown > .list > .item").on("click", function () { 493 $(".dropdown > .list > .item").removeClass("selected"); 494 $(this) 495 .addClass("selected") 496 .parent() 497 .parent() 498 .removeClass("open") 499 .children(".caption") 500 .html($(this).html()); 501 502 if ($(this).data("item") == "RUB") { 503 } else if ($(this).data("item") == "UAH") { 504 } else { 505 } 506 }); 507 $(document).on("keyup", function (evt) { 508 if ((evt.keyCode || evt.which) === 27) { 509 $(".dropdown").removeClass("open"); 510 } 511 }); 512 $(document).on("click", function (evt) { 513 if ($(evt.target).closest(".dropdown > .caption").length === 0) { 514 $(".dropdown").removeClass("open"); 515 } 516 }); 517 518 jQuery(".lang-cls").click(function (e) { 519 //e.preventDefault(); 520 var en_slug = jQuery(this).attr("data-en-slug"); 521 var de_slug = jQuery(this).attr("data-de-slug"); 522 var nl_slug = jQuery(this).attr("data-nl-slug"); 523 localStorage.setItem("en_slug", en_slug); 524 localStorage.setItem("de_slug", de_slug); 525 localStorage.setItem("nl_slug", nl_slug); 526 }); 527 528 /*Map Initialize For overnachen sub category */ 529 if ($(".location-category").length) { 530 var canBeLoaded = true, 531 bottomOffset = 2000; // the distance (in px) from the page bottom when you want to load more posts 532 var theLanguage = jQuery("html").attr("lang"); 533 var category = nunsp_ajax_object.category; 534 var lastScrollTop = 0; 535 536 $(window).scroll(function () { 537 if ( 538 $(".overviewsec .container .location_list_loading").length && 539 !$(".overviewsec .container .location_list_loading").hasClass("hide") 540 ) { 541 var total_page = document.getElementsByName("total_page"); 542 var total_count = document.getElementsByName("total_count"); 543 var total_post_count = total_count[0].value; 544 var total_page_count = total_page[0].value; 545 if (jQuery(".location-grid .mappin a").hasClass("active")) { 546 var current_view = "map"; 547 } else { 548 var current_view = "grid"; 549 } 550 551 var st = $(this).scrollTop(); 552 if (st > lastScrollTop) { 553 // downscroll code 554 var location_ids_str = jQuery 555 .map( 556 jQuery(":checkbox[name=location\\[\\]]:checked"), 557 function (n, i) { 558 return n.value; 559 } 560 ) 561 .join(","); 562 563 var data = { 564 action: "get_location_filter_category", 565 location_ids_str: location_ids_str, 566 category: category, 567 lang: theLanguage,
568 page: Number(nunsp_ajax_object.current_page) + 1, 569 current_view: current_view, 570 }; 571 if ( 572 $(document).scrollTop() > $(document).height() - bottomOffset && 573 canBeLoaded == true && 574 total_post_count > 20 575 ) { 576 if (nunsp_ajax_object.current_page < total_page_count) { 577 jQuery(".overviewsec .overlay-loader").show(); 578 $.ajax({ 579 url: nunsp_ajax_object.ajaxurl, 580 data: data, 581 type: "POST", 582 beforeSend: function (xhr) { 583 canBeLoaded = false; 584 }, 585 success: function (data) { 586 if (data.grid_view) { 587 jQuery(".overviewsec .overlay-loader").hide(); 588 jQuery( 589 ".location-list .container .location_list_loading" 590 ).append(data.grid_view); 591 592 if (nunsp_ajax_object.current_page <= total_page_count) { 593 canBeLoaded = true; 594 } else { 595 canBeLoaded = false; 596 } 597 nunsp_ajax_object.current_page++; 598 } 599 }, 600 }); 601 } 602 } 603 } else { 604 // upscroll code 605 } 606 lastScrollTop = st; 607 } 608 }); 609 } 610 611 if ($(".ziendoen-subcategories").length) { 612 var canBeLoaded = true, 613 bottomOffset = 1500; // the distance (in px) from the page bottom when you want to load more posts 614 var theLanguage = jQuery("html").attr("lang"); 615 var category = nunsp_ajax_object.category; 616 var category_id = jQuery("#category_id_zoen").val(); 617 var hide_filter = jQuery("#hide_filter").val(); 618 var lastScrollTop = 0; 619 $(window).on("load", function () { 620 nunsp_ajax_object.current_page = 1; 621 jQuery.ajax({ 622 type: "post", 623 dataType: "html", 624 url: nunsp_ajax_object.ajaxurl, 625 data: { 626 action: "get_location_filter_map", 627 lang: nunsp_ajax_object.wpml_current_language, 628 }, 629 success: function (response) { 630 const result = jQuery.parseJSON(response); 631 const myObj = JSON.parse(result.map_view); 632 633 if (myObj.status == 200) { 634 initMap(myObj.body); 635 } 636 }, 637 }); 638 }); 639 $(window).scroll(function () { 640 if ( 641 $(".overviewsec .container .location_list_loading").length && 642 !$(".overviewsec .container .location_list_loading").hasClass("hide") 643 ) { 644 var total_page = document.getElementsByName("total_page"); 645 var total_count = document.getElementsByName("total_count"); 646 var total_post_count = total_count[0].value; 647 var total_page_count = total_page[0].value; 648 if (jQuery(".location-grid .mappin a").hasClass("active")) { 649 var current_view = "map"; 650 } else { 651 var current_view = "grid"; 652 } 653 654 var st = $(this).scrollTop(); 655 if (st > lastScrollTop) { 656 // downscroll code 657 var location_ids_str = jQuery 658 .map( 659 jQuery(":checkbox[name=location\\[\\]]:checked"), 660 function (n, i) { 661 return n.value; 662 } 663 ) 664 .join(","); 665 666 var data = { 667 action: "get_location_filter_category", 668 location_ids_str: location_ids_str, 669 category: category, 670 lang: theLanguage,
671 page: Number(nunsp_ajax_object.current_page) + 1, 672 current_view: current_view, 673 id: category_id, 674 is_filter: hide_filter, 675 }; 676 if ( 677 $(document).scrollTop() > $(document).height() - bottomOffset && 678 canBeLoaded == true && 679 Number(nunsp_ajax_object.current_page) < total_page_count 680 ) { 681 if (hide_filter != 0) { 682 console.log(hide_filter); 683 if (nunsp_ajax_object.current_page <= total_page_count) { 684 jQuery(".overviewsec .overlay-loader").show(); 685 $.ajax({ 686 url: nunsp_ajax_object.ajaxurl, 687 data: data, 688 type: "POST", 689 beforeSend: function (xhr) { 690 canBeLoaded = false; 691 }, 692 success: function (data) { 693 if (data.grid_view) { 694 jQuery(".overviewsec .overlay-loader").hide(); 695 jQuery( 696 ".location-list .container .location_list_loading" 697 ).append(data.grid_view); 698 699 if (nunsp_ajax_object.current_page <= total_page_count) { 700 canBeLoaded = true; 701 } else { 702 canBeLoaded = false; 703 } 704 nunsp_ajax_object.current_page++; 705 } 706 }, 707 }); 708 } 709 } 710 } 711 } else { 712 // upscroll code 713 } 714 lastScrollTop = st; 715 } 716 }); 717 } 718 719 // The agenda overview page has a different slug per language 720 // (agenda-overzicht / events-calendar / veranstaltungskalender), so detect it 721 // by the markup the 'agenda_lijst' layout renders instead of by body class. 722 if ($(".agenda-filter").length) {
723 let canBeLoaded = true; // allow AJAX call only if necessary 724 let isLoading = false; // flag to prevent multiple AJAX calls 725 let current_id = ""; 726 var updateMap = true; // flag to manage map updates 727 var bottomOffset = 2500; 728 729 var firstLoad = true; 730 $(window).on("load", function () { 731 nunsp_ajax_object.total_pages = jQuery("#total_page").val(); 732 jQuery("#from").datepicker({ 733 changeMonth: true, 734 dateFormat: "dd-mm-yy", 735 }); 736 737 jQuery.ajax({ 738 type: "post", 739 dataType: "html", 740 url: nunsp_ajax_object.ajaxurl, 741 cache: false, 742 data: { 743 action: "get_events_map", 744 }, 745 success: function (response) { 746 if (response) { 747 const result = jQuery.parseJSON(response); 748 const myObj = JSON.parse(result.map_view); 749 if (myObj.status === 200) { 750 initMap(myObj.body); 751 } 752 } 753 }, 754 }); 755 756 nunsp_ajax_object.current_page = 2; 757 }); 758 function loadAgendaData() { 759 let product_ids_str = jQuery 760 .map(jQuery(":checkbox[name=category\\[\\]]:checked"), function (n, i) { 761 return n.value; 762 }) 763 .join(","); 764 let location_ids_str = jQuery 765 .map(jQuery(":checkbox[name=location\\[\\]]:checked"), function (n, i) { 766 return n.value; 767 }) 768 .join(","); 769 let from_date = jQuery("#from").val(); 770 771 let current_view = jQuery(".location-grid .mappin a").hasClass("active") 772 ? "map" 773 : "grid"; 774 775 jQuery.ajax({ 776 type: "post", 777 dataType: "html", 778 url: nunsp_ajax_object.ajaxurl, 779 cache: false, 780 data: { 781 action: "get_event_filter", 782 product_ids_str: product_ids_str, 783 location_ids_str: location_ids_str, 784 from_date: from_date, 785 lang: nunsp_ajax_object.wpml_current_language, 786 page: 1, // Always fetch the first page of results 787 current_view: current_view, 788 current_id: current_id, 789 }, 790 beforeSend: function (xhr) { 791 canBeLoaded = false; 792 isLoading = true; 793 }, 794 success: function (response) { 795 if (response) { 796 const result = jQuery.parseJSON(response); 797 798 // Replace content in the event list 799 jQuery(".agenda-filter > .container").html(result.grid_view); 800 801 // Rebuild the markers so the map view reflects the same filters. 802 if (result.map_view) { 803 const mapObj = JSON.parse(result.map_view); 804 if (mapObj.status === 200) { 805 initMap(mapObj.body); 806 } 807 } 808 809 if (current_view === "map") { 810 jQuery(".location-grid .mappin a").addClass("active"); 811 jQuery(".location-grid .grid a").removeClass("active"); 812 jQuery(".agenda-filter #map").show(); 813 } 814 815 var elementf = document.getElementById("from"); 816 if (typeof elementf !== "undefined" && elementf !== null) { 817 jQuery("#from").datepicker({ 818 changeMonth: true, 819 dateFormat: "dd-mm-yy", 820 }); 821 } 822 823 jQuery(".overviewsec .overlay-loader").hide(); 824 } 825 isLoading = false; 826 }, 827 error: function () { 828 isLoading = false; 829 }, 830 }); 831 } 832 833 // Remove scrolling-based lazy loading by commenting out this code 834 /* 835$(window).scroll(function () { 836 if (!$(".overviewsec .container .event_list_loading").hasClass("hide")) { 837 if ((canBeLoaded == true) && $(window).scrollTop() + $(window).height() >= $(document).height() - bottomOffset && !isLoading && (nunsp_ajax_object.current_page <= nunsp_ajax_object.total_pages)) { 838 updateMap = false; 839 loadAgendaData(); 840 } 841 } 842}); 843*/ 844 845 // Keep filter functionality 846 jQuery(document).on("change", "#from", function (event) { 847 nunsp_ajax_object.current_page = 1; 848 firstLoad = false; 849 updateMap = true; 850 loadAgendaData(); 851 }); 852 jQuery(document).on( 853 "click", 854 "#Vandaag, #Morgen, #Ditweekend", 855 function (event) { 856 event.preventDefault(); 857 current_id = jQuery(this).attr("id"); 858 nunsp_ajax_object.current_page = 1; 859 firstLoad = false;
860 updateMap = true; 861 loadAgendaData(); 862 } 863 ); 864 jQuery(document).on( 865 "change", 866 '.agenda-filter input[type="checkbox"]', 867 function (event) { 868 nunsp_ajax_object.current_page = 1; 869 firstLoad = false; 870 updateMap = true; 871 loadAgendaData(); 872 } 873 ); 874 jQuery(document).on("click", ".agenda-filter #reset", function (event) { 875 event.preventDefault(); 876 jQuery(".agenda-filter .location_filter input[type=checkbox]").prop( 877 "checked", 878 false 879 ); 880 jQuery(".agenda-filter .category_filter input[type=checkbox]").prop( 881 "checked", 882 false 883 ); 884 jQuery("#from").val(""); 885 nunsp_ajax_object.current_page = 1; 886 firstLoad = false; 887 updateMap = true; 888 loadAgendaData(); 889 }); 890 } 891 892 /*Map Js call for home page map */ 893 if ($("body").hasClass("home")) { 894 jQuery.ajax({ 895 type: "post", 896 dataType: "html", 897 url: nunsp_ajax_object.ajaxurl, 898 data: { 899 action: "get_location_filter_map", 900 lang: nunsp_ajax_object.wpml_current_language, 901 }, 902 success: function (response) { 903 const result = jQuery.parseJSON(response); 904 const myObj = JSON.parse(result.map_view); 905 906 if (myObj.status == 200) { 907 initMap(myObj.body); 908 } 909 }, 910 }); 911 } 912}); 913 914/*Mobile Menu*/ 915jQuery(".down-arrow").click(function () { 916 jQuery(this).toggleClass("active").next().toggle(500); 917}); 918jQuery(".respo_btn").click(function () { 919 jQuery("body").toggleClass("overflow_body"); 920 jQuery(this).next("ul").slideToggle(300); 921 if (!jQuery(this).hasClass("active")) { 922 jQuery(this).find("img").attr("src", "images/close_menu.png"); 923 jQuery(this).addClass("active"); 924 } else { 925 jQuery(this).find("img").attr("src", "images/menu.png"); 926 jQuery(this).removeClass("active"); 927 } 928}); 929/*Mobile Menu*/ 930const slidesCount = document.querySelectorAll( 931 ".eventlistslider .swiper-slide" 932).length; 933 934// find the max slidesPerView from your breakpoints 935const breakpoints = { 936 767: 2, 937 1100: 3, 938 1280: 4, 939 1990: 4, 940}; 941const maxSlidesPerView = Math.max(...Object.values(breakpoints), 1); 942 943var swiperTech = new Swiper(".eventlistslider", { 944 slidesPerView: 1, 945 spaceBetween: 30, 946 loop: slidesCount > maxSlidesPerView, // only loop if more slides than can be shown 947 autoHeight: true, 948 slidesPerGroup: 1, 949 navigation: { 950 nextEl: ".eventlistslider .swiper-arrows .swiper-button-next", 951 prevEl: ".eventlistslider .swiper-arrows .swiper-button-prev", 952 }, 953 pagination: { 954 el: ".eventlistslider .swiper-pagination", 955 clickable: true, 956 }, 957 breakpoints: { 958 767: { 959 slidesPerView: 2, 960 spaceBetween: 30, 961 slidesPerGroup: 2, 962 }, 963 1100: { 964 slidesPerView: 3, 965 spaceBetween: 30, 966 slidesPerGroup: 3, 967 }, 968 1280: { 969 slidesPerView: 4, 970 spaceBetween: 30, 971 slidesPerGroup: 4, 972 }, 973 1990: { 974 slidesPerView: 4, 975 spaceBetween: 30, 976 slidesPerGroup: 4, 977 }, 978 }, 979}); 980 981jQuery("#projectKey").on("change", function () { 982 url = this.value; 983 window.location = url; 984}); 985 986jQuery(document).on( 987 "click", 988 ".ziendoen-subcategories #reset", 989 function (event) { 990 event.preventDefault(); 991 if ( 992 jQuery(".combo-filter .location_filter input[type=checkbox]").is( 993 ":checked" 994 ) 995 ) { 996 jQuery(".combo-filter .location_filter input[type=checkbox]").prop( 997 "checked", 998 false 999 ); 1000 nunsp_ajax_object.current_page = 1; 1001 loadMapData(); 1002 } 1003 } 1004); 1005 1006jQuery(document).on("change", ".combo-filter", function (event) { 1007 if ( 1008 event.target.matches( 1009 '.location-list .location_filter input[type="checkbox"]' 1010 ) 1011 ) { 1012 nunsp_ajax_object.current_page = 1; 1013 loadMapData(); 1014 } 1015}); 1016 1017function loadMapData() { 1018 var subcat = nunsp_ajax_object.category; 1019 var id = nunsp_ajax_object.name; 1020 var category = subcat ? subcat : id; 1021 var category_id = jQuery("#category_id_zoen").val(); 1022 var theLanguage = jQuery("html").attr("lang"); 1023 var location_ids_str = jQuery 1024 .map(jQuery(":checkbox[name=location\\[\\]]:checked"), function (n, i) { 1025 return n.value; 1026 }) 1027 .join(","); 1028 1029 jQuery(".overviewsec .overlay-loader").show(); 1030 1031 if (jQuery(".location-grid .mappin a").hasClass("active")) { 1032 var current_view = "map"; 1033 } else { 1034 var current_view = "grid"; 1035 } 1036 jQuery.ajax({ 1037 type: "post", 1038 dataType: "html", 1039 url: nunsp_ajax_object.ajaxurl, 1040 data: { 1041 action: "get_location_filter_category", 1042 location_ids_str: location_ids_str, 1043 category: category, 1044 lang: theLanguage, 1045 current_view: current_view, 1046 id: category_id, 1047 }, 1048 success: function (response) { 1049 let result = jQuery.parseJSON(response); 1050 result.grid_view = jQuery(result.grid_view).filter(function () { 1051 return !jQuery(this).hasClass("aboutsec"); 1052 }); 1053 jQuery(".location-list").replaceWith(result.grid_view); 1054 1055 var myObj = JSON.parse(result.map_view); 1056 1057 if (myObj.status == 200) { 1058 initMap(myObj.body); 1059 } 1060 1061 if (current_view == "map") { 1062 jQuery(".overviewsec .container .event_list_loading").hide(); 1063 jQuery(".overviewsec .container .location_list_loading").hide(); 1064 jQuery(".overviewsec .container .event_list_loading").addClass("hide"); 1065 jQuery(".overviewsec .container .location_list_loading").addClass( 1066 "hide" 1067 ); 1068 jQuery(".location-grid .mappin a").addClass("active"); 1069 jQuery(".overviewsec.overview-subcatsec").addClass("overlap"); 1070 jQuery(".location-list").addClass("overlap"); 1071 jQuery(".overviewsec #map").show(); 1072 jQuery(".location-category.overviewsec").addClass("listmap-viewshow"); 1073 refitNunspeetMap(); 1074 } else { 1075 jQuery(".location-grid .grid a").addClass("active"); 1076 } 1077 jQuery(".overviewsec .overlay-loader").hide(); 1078 }, 1079 }); 1080} 1081 1082function filterByCity(data, cities) { 1083 if (cities && Array.isArray(cities) && cities.length > 0) { 1084 // Filter the array based on the specified cities 1085 return data.filter((item) => 1086 cities 1087 .map((city) => city.toLowerCase()) 1088 .includes(item.address.city.toLowerCase()) 1089 ); 1090 } else { 1091 // If no cities are specified, return the original array 1092 return data; 1093 } 1094} 1095 1096jQuery(document).on("click", ".location-grid .grid a", function (event) { 1097 jQuery(".overviewsec .container .event_list_loading").css("display", "flex"); 1098 jQuery(".overviewsec .container .location_list_loading").css( 1099 "display", 1100 "flex" 1101 ); 1102 jQuery(".overviewsec .container .event_list_loading").removeClass("hide"); 1103 jQuery(".overviewsec .container .location_list_loading").removeClass("hide"); 1104 jQuery(this).addClass("active"); 1105 jQuery(".location-grid .mappin a").removeClass("active"); 1106 jQuery(".overviewsec.overview-subcatsec").removeClass("overlap"); 1107 jQuery(".location-list").removeClass("overlap"); 1108 jQuery(".location-category.overviewsec").removeClass("listmap-viewshow"); 1109 jQuery(".ziendoen-subcategories.overviewsec").removeClass("listmap-viewshow"); 1110 jQuery(".overviewsec #map").hide(); 1111}); 1112 1113jQuery(document).on("click", ".location-grid .mappin a", function (event) { 1114 jQuery(".overviewsec .container .event_list_loading").hide(); 1115 jQuery(".overviewsec .container .location_list_loading").hide(); 1116 jQuery(".overviewsec .container .event_list_loading").addClass("hide"); 1117 jQuery(".overviewsec .container .location_list_loading").addClass("hide"); 1118 jQuery(this).addClass("active"); 1119 jQuery(".location-grid .grid a").removeClass("active"); 1120 jQuery(".overviewsec.overview-subcatsec").addClass("overlap"); 1121 jQuery(".location-list").addClass("overlap"); 1122 jQuery(".overviewsec #map").show(); 1123 jQuery(".location-category.overviewsec").addClass("listmap-viewshow"); 1124 jQuery(".ziendoen-subcategories.overviewsec").addClass("listmap-viewshow"); 1125 refitNunspeetMap(); 1126}); 1127 1128// #map is hidden while the grid view is active, so the map instance was sized 1129// against a 0x0 container. Re-fit it once the container is visible. 1130function refitNunspeetMap() { 1131 const state = nunspeetMapState; 1132 if (!state || typeof google === "undefined") { 1133 return; 1134 } 1135 google.maps.event.trigger(state.map, "resize"); 1136 if (state.bounds && !state.bounds.isEmpty()) { 1137 state.map.fitBounds(state.bounds); 1138 } 1139} 1140 1141jQuery(document).ready(function ($) { 1142 $(".socialicon ul li a[href]").attr("target", "_blank"); 1143 $(".heateor_sss_horizontal_sharing .heateor_sss_sharing_ul a[href]").attr( 1144 "target", 1145 "_blank" 1146 ); 1147}); 1148 1149/////////////////// ANTI SPAM EMAIL FORM
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.