PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.86
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.86
51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 All 40 releases
← All changes | includes/assets/libraries/grid/grid.js +1288 -0 51.1.2 → 51.1.86 View file →
@@ -1,0 +1,1288 @@
1 +// noinspection JSUnresolvedReference,DuplicatedCode
2 +
3 +"use strict";
4 +(function ($) {
5 + $(window).on("elementor/frontend/init", () => {
6 +
7 + const gridHooks = [
8 + "frontend/element_ready/king-addons-grid.default"
9 + ];
10 +
11 + const gridHandler = ($scope) => {
12 + elementorFrontend.elementsHandler.addHandler(
13 + elementorModules.frontend.handlers.Base.extend({
14 + onInit() {
15 + const $body = $("body");
16 + const isEditor = $body.hasClass("elementor-editor-active");
17 + const $grid = this.$element.find(".king-addons-grid");
18 + if (!$grid.length) return;
19 +
20 + /* ──────────────────────────────────────
21 + * UTILITY FUNCTIONS
22 + * ────────────────────────────────────── */
23 +
24 + // Simple debounce helper.
25 + const debounce = (func, threshold = 100, execAsap) => {
26 + let timeout;
27 + return function (...args) {
28 + const context = this;
29 + const delayed = () => {
30 + if (!execAsap) func.apply(context, args);
31 + timeout = null;
32 + };
33 + if (timeout) clearTimeout(timeout);
34 + else if (execAsap) func.apply(context, args);
35 + timeout = setTimeout(delayed, threshold);
36 + };
37 + };
38 +
39 + // Attach "smartresize" to jQuery.
40 + $.fn.smartresize = function (fn) {
41 + return fn ? this.on("resize", debounce(fn)) : this.trigger("smartresize");
42 + };
43 +
44 + // Parse grid settings.
45 + const settingsData = $grid.attr("data-settings");
46 + const settings = settingsData ? JSON.parse(settingsData) : false;
47 + let pagesLoaded = 0;
48 +
49 + /* ──────────────────────────────────────
50 + * INITIAL EVENT HANDLERS
51 + * ────────────────────────────────────── */
52 +
53 + // Handle WooCommerce orderby form.
54 + if ($scope.find(".king-addons-grid-orderby form").length) {
55 + const $orderbyForm = $scope.find(".king-addons-grid-orderby form");
56 + $scope.find(".orderby").on("change", () => $orderbyForm.trigger("submit"));
57 + }
58 +
59 + // Adjust result count text if WooCommerce count element exists.
60 + if (settings && $scope.find(".woocommerce-result-count").length) {
61 + adjustResultCount($scope, $grid, settings, isEditor);
62 + }
63 +
64 + // Helper to schedule a delayed isotope layout.
65 + const scheduleIsotopeLayout = (delay) =>
66 + setTimeout(() => isotopeLayout(settings), delay);
67 +
68 + if (settings) {
69 + // Perform initial layout.
70 + isotopeLayout(settings);
71 + scheduleIsotopeLayout(100);
72 + if (isEditor) {
73 + scheduleIsotopeLayout(500);
74 + scheduleIsotopeLayout(1000);
75 + }
76 + $(window).on("load", () => scheduleIsotopeLayout(100));
77 + $(document).ready(() => scheduleIsotopeLayout(100));
78 + $(window).smartresize(() => scheduleIsotopeLayout(200));
79 +
80 + // If dynamic grid settings exist, set up filtering and “load more” experiments.
81 + if (settings.grid_settings) {
82 + loadMoreExperiment();
83 + filtersExperiment(settings);
84 + }
85 + isotopeFilters(settings);
86 +
87 + let initialItems = 0;
88 + $grid.on("arrangeComplete", (e, filteredItems) => {
89 + animateGridItems(filteredItems, settings, $grid);
90 + initialItems = filteredItems.length;
91 + });
92 +
93 + // Once images load, set grid opacity and equalize item heights.
94 + $grid.imagesLoaded(() => {
95 + if ($grid.css("opacity") !== "1") $grid.css("opacity", "1");
96 + setTimeout(() => $grid.addClass("grid-images-loaded"), 500);
97 + setEqualHeight(settings);
98 + });
99 +
100 + // Pagination: load-more or infinite-scroll.
101 + if (["load-more", "infinite-scroll"].includes(settings.pagination_type)) {
102 + if ($scope.find(".king-addons-grid-pagination").length && !isEditor) {
103 + setupInfiniteScroll(settings);
104 + } else {
105 + $scope.find(".king-addons-load-more-btn").on("click", () =>
106 + alert(
107 + "Load More is Disabled in the Editor! Please Preview this Page to see it in action"
108 + )
109 + );
110 + }
111 + }
112 + } else {
113 + // Fallback: initialize Slick slider.
114 + $grid.animate({ opacity: "1" }, 1000);
115 + initSlickSlider();
116 + }
117 +
118 + // Additional features.
119 + if ($grid.find(".king-addons-grid-item-add-to-cart").length) {
120 + setupAddToCart();
121 + }
122 + postSharing();
123 + mediaHoverLink();
124 + if (
125 + !$scope.hasClass("elementor-widget-king-addons-woocommerce-category-grid-pro") &&
126 + !$scope.hasClass("elementor-widget-king-addons-category-grid-pro")
127 + ) {
128 + // lightboxPopup(settings);
129 + }
130 + postLikes(settings);
131 +
132 + /* ──────────────────────────────────────
133 + * FUNCTION DEFINITIONS
134 + * ────────────────────────────────────── */
135 +
136 + // Adjust WooCommerce result count.
137 + function adjustResultCount($scope, $grid, s, isEditor) {
138 + const $resultCount = $scope.find(".woocommerce-result-count");
139 + let text = $resultCount.text();
140 + const scopeId = $scope.data("id");
141 + const storageKey = `king-addons-cached-items-length-${scopeId}`;
142 + let cachedLength = localStorage.getItem(storageKey);
143 + if (!cachedLength || isEditor) {
144 + cachedLength = $scope.find(".king-addons-grid-item").length;
145 + localStorage.setItem(storageKey, cachedLength);
146 + }
147 + const itemsPerPage = s.query_posts_per_page || parseInt(cachedLength, 10);
148 + if (isNaN(itemsPerPage) || itemsPerPage <= 0) return;
149 + let currentPage = 1;
150 + const $currentPage = $scope.find(".king-addons-grid-current-page");
151 + if ($currentPage.length) {
152 + currentPage = parseInt($currentPage.text().trim(), 10) || 1;
153 + }
154 + const totalMatch = text.match(/of (\d+) results/);
155 + const totalItems = totalMatch ? parseInt(totalMatch[1].trim(), 10) : itemsPerPage;
156 + if (isNaN(totalItems) || totalItems <= 0) return;
157 + const startItem = (currentPage - 1) * itemsPerPage + 1;
158 + const endItem = Math.min(startItem + itemsPerPage - 1, totalItems);
159 + text = text.replace(/\d+\u2013\d+/, `${startItem}\u2013${endItem}`);
160 + $resultCount.text(text);
161 + }
162 +
163 + // Layout the grid using Isotope (or its custom wrapper).
164 + function isotopeLayout(s, $response = "") {
165 + const layout = s.layout;
166 + const columnsDesktop = parseInt(s.columns_desktop, 10);
167 + let items = $response ? $response : $grid.find(".king-addons-grid-item"),
168 + contWidth = $grid.width() + s.gutter_hr - 0.3,
169 + viewportWidth = $(window).outerWidth(),
170 + columns,
171 + gutterHr,
172 + gutterVr;
173 +
174 + // Breakpoints.
175 + const { mobile, mobile_extra, tablet, tablet_extra, laptop, widescreen } =
176 + elementorFrontend.config.responsive.breakpoints;
177 + const activeBps = elementorFrontend.config.responsive.activeBreakpoints;
178 + let cMobile = 1,
179 + cMobileExtra,
180 + cTablet = 2,
181 + cTabletExtra,
182 + cLaptop,
183 + cWideScreen;
184 + $scope
185 + .attr("class")
186 + .split(" ")
187 + .forEach((cl) => {
188 + if (/mobile\d/.test(cl)) cMobile = parseInt(cl.slice(-1), 10);
189 + if (/mobile_extra\d/.test(cl)) cMobileExtra = parseInt(cl.slice(-1), 10);
190 + if (/tablet\d/.test(cl)) cTablet = parseInt(cl.slice(-1), 10);
191 + if (/tablet_extra\d/.test(cl)) cTabletExtra = parseInt(cl.slice(-1), 10);
192 + if (/widescreen\d/.test(cl)) cWideScreen = parseInt(cl.slice(-1), 10);
193 + if (/laptop\d/.test(cl)) cLaptop = parseInt(cl.slice(-1), 10);
194 + });
195 +
196 + if (viewportWidth <= mobile.value && activeBps.mobile) {
197 + columns = cMobile;
198 + gutterHr = s.gutter_hr_mobile;
199 + gutterVr = s.gutter_vr_mobile;
200 + } else if (viewportWidth <= mobile_extra.value && activeBps.mobile_extra) {
201 + columns = cMobileExtra || cTablet;
202 + gutterHr = s.gutter_hr_mobile_extra;
203 + gutterVr = s.gutter_vr_mobile_extra;
204 + } else if (viewportWidth <= tablet.value && activeBps.tablet) {
205 + columns = cTablet;
206 + gutterHr = s.gutter_hr_tablet;
207 + gutterVr = s.gutter_vr_tablet;
208 + } else if (viewportWidth <= tablet_extra.value && activeBps.tablet_extra) {
209 + columns = cTabletExtra || cTablet;
210 + gutterHr = s.gutter_hr_tablet_extra;
211 + gutterVr = s.gutter_vr_tablet_extra;
212 + } else if (viewportWidth <= laptop.value && activeBps.laptop) {
213 + columns = cLaptop || columnsDesktop;
214 + gutterHr = s.gutter_hr_laptop;
215 + gutterVr = s.gutter_vr_laptop;
216 + } else if (viewportWidth <= widescreen.value) {
217 + columns = columnsDesktop;
218 + gutterHr = s.gutter_hr;
219 + gutterVr = s.gutter_vr;
220 + } else {
221 + columns = cWideScreen || columnsDesktop;
222 + gutterHr = s.gutter_hr_widescreen;
223 + gutterVr = s.gutter_vr_widescreen;
224 + }
225 + if (columns > 8) columns = 8;
226 + items.outerWidth(Math.floor(contWidth / columns - gutterHr));
227 + items.css("margin-bottom", `${gutterVr}px`);
228 +
229 + if (layout === "list") {
230 + handleListLayout(s, items);
231 + }
232 +
233 + const isoLayoutMode = layout === "list" ? "fitRows" : layout;
234 + const transDuration = s.filters_animation === "default" ? 400 : 0;
235 +
236 + $grid.isotopekng({
237 + layoutMode: isoLayoutMode,
238 + masonry: { gutter: gutterHr },
239 + fitRows: { gutter: gutterHr },
240 + transitionDuration: transDuration,
241 + percentPosition: true,
242 + });
243 + }
244 +
245 + // Handle "list" layout adjustments.
246 + function handleListLayout(s, items) {
247 + const imageHeight = items.find(".king-addons-grid-image-wrap").outerHeight();
248 + items.find(".king-addons-grid-item-below-content").css("min-height", `${imageHeight}px`);
249 +
250 + if ($body.width() < 480) {
251 + items.find(".king-addons-grid-media-wrap").css({ float: "none", width: "100%" });
252 + items.find(".king-addons-grid-item-below-content").css({
253 + float: "none",
254 + width: "100%",
255 + "min-height": "0",
256 + });
257 + } else {
258 + const { media_align: align, media_width: mWidth, media_distance: mDistance } = s;
259 + if (align === "zigzag") {
260 + handleZigzag(items, mWidth, mDistance);
261 + } else {
262 + items.find(".king-addons-grid-media-wrap").css({
263 + float: align,
264 + width: `${mWidth}%`,
265 + [`margin-${align === "left" ? "right" : "left"}`]: `${mDistance}px`,
266 + });
267 + items.find(".king-addons-grid-item-below-content").css({
268 + float: align,
269 + width: `calc((100% - ${mWidth}%) - ${mDistance}px)`,
270 + });
271 + }
272 + }
273 + }
274 +
275 + // Alternate ("zigzag") layout for list items.
276 + function handleZigzag(items, mWidth, mDistance) {
277 + items.filter(":even").each(function () {
278 + $(this).find(".king-addons-grid-media-wrap").css({
279 + float: "left",
280 + width: `${mWidth}%`,
281 + "margin-right": `${mDistance}px`,
282 + });
283 + $(this).find(".king-addons-grid-item-below-content").css({
284 + float: "left",
285 + width: `calc((100% - ${mWidth}%) - ${mDistance}px)`,
286 + });
287 + });
288 + items.filter(":odd").each(function () {
289 + $(this).find(".king-addons-grid-media-wrap").css({
290 + float: "right",
291 + width: `${mWidth}%`,
292 + "margin-left": `${mDistance}px`,
293 + });
294 + $(this).find(".king-addons-grid-item-below-content").css({
295 + float: "right",
296 + width: `calc((100% - ${mWidth}%) - ${mDistance}px)`,
297 + });
298 + });
299 + }
300 +
301 + // Equalize grid item heights for "fitRows" layout.
302 + function setEqualHeight(s) {
303 + if (s.layout === "fitRows") {
304 + const $items = $grid.children("article");
305 + const columns = Math.floor($grid.outerWidth() / $items.outerWidth());
306 + if (columns > 1) {
307 + const maxH = Math.max(...$items.map((_, el) => $(el).outerHeight()).get());
308 + $items.css("height", `${maxH}px`);
309 + if (s.stick_last_element_to_bottom === "yes") {
310 + $scope.addClass("king-addons-grid-last-element-yes");
311 + }
312 + }
313 + }
314 + }
315 +
316 + // Update filter counts and set up filtering behavior.
317 + function isotopeFilters(s, ev = "load") {
318 +
319 + // console.log("isotopeFilters");
320 +
321 + if (s.filters_count === "yes") {
322 + $scope.find(".king-addons-grid-filters a, .king-addons-grid-filters span").each(function () {
323 + const $el = $(this);
324 + if (s.grid_settings && ev === "load") {
325 + const thisTaxonomy =
326 + $el.attr("data-filter") !== "*" ? $el.data("ajax-filter")[0] : "*";
327 + const thisFilter =
328 + $el.attr("data-filter") !== "*" ? $el.data("ajax-filter")[1] : "*";
329 + // console.log('CURRENT OFFSET = ' + (+s.grid_settings.query_offset + $grid.find(".king-addons-grid-item").length))
330 + $.ajax({
331 + type: "POST",
332 + url: KingAddonsGridData.ajaxUrl,
333 + data: {
334 + action: s.grid_settings
335 + ? "king_addons_get_filtered_count"
336 + : "king_addons_get_filtered_count",
337 + // king_addons_offset: 0,
338 + king_addons_offset: +s.grid_settings.query_offset + $grid.find(".king-addons-grid-item").length,
339 + king_addons_filter: thisFilter,
340 + king_addons_taxonomy: thisTaxonomy,
341 + grid_settings: s.grid_settings,
342 + },
343 + success: (response) => {
344 + // console.log('ISOTOPE GRID');
345 + $el.find("sup").text(response.data.query_found);
346 + },
347 + });
348 + } else {
349 + if ($el.attr("data-filter") === "*") {
350 + $el.find("sup").text(
351 + $scope.find(".king-addons-grid-filters").next().find("article").length
352 + );
353 + } else {
354 + $el.find("sup").text($scope.find($el.attr("data-filter")).length);
355 + }
356 + }
357 + });
358 + }
359 +
360 + if (s.filters_linkable === "yes") return;
361 +
362 + // Deeplinking support.
363 + if (s.deeplinking === "yes") {
364 + let deepLink = window.location.hash.replace("#filter:", ".");
365 + if (window.location.hash.match("#filter:all")) deepLink = "*";
366 + const activeFilter = $scope
367 + .find(`.king-addons-grid-filters span[data-filter="${deepLink}"]`)
368 + .not(".king-addons-back-filter");
369 + $scope.find(".king-addons-grid-filters span").removeClass("king-addons-active-filter");
370 + activeFilter.addClass("king-addons-active-filter");
371 + $grid.isotopekng({ filter: deepLink });
372 + s.lightbox.selector =
373 + deepLink === "*" ? ".king-addons-grid-image-wrap" : `${deepLink} .king-addons-grid-image-wrap`;
374 + // lightboxPopup(s);
375 + }
376 +
377 + // Hide empty filters.
378 + if (s.filters_hide_empty === "yes" && !s.grid_settings) {
379 + $scope.find(".king-addons-grid-filters span").each(function () {
380 + const filterClass = $(this).attr("data-filter");
381 + if (filterClass !== "*" && $grid.find(filterClass).length === 0) {
382 + $(this).parent("li").addClass("king-addons-hidden-element");
383 + } else {
384 + $(this).parent("li").removeClass("king-addons-hidden-element");
385 + }
386 + });
387 + }
388 +
389 + // Default filter.
390 + if (
391 + !$scope.hasClass("elementor-widget-king-addons-woocommerce-category-grid-pro") &&
392 + !$scope.hasClass("elementor-widget-king-addons-category-grid-pro") &&
393 + s.filters_default_filter
394 + ) {
395 + setTimeout(() => {
396 + const filterEl = $scope
397 + .find(".king-addons-grid-filters")
398 + .find(`span[data-filter*="-${s.filters_default_filter}"]`);
399 + if (filterEl.length) filterEl[0].click();
400 + }, 100);
401 + }
402 +
403 + // Filter click behavior.
404 + if (!s.grid_settings) {
405 + $scope.find(".king-addons-grid-filters span").on("click", function () {
406 + const filterClass = $(this).data("filter");
407 + $scope.find(".king-addons-grid-filters span").removeClass("king-addons-active-filter");
408 + $(this).addClass("king-addons-active-filter");
409 + if (s.deeplinking === "yes") {
410 + const filterHash =
411 + filterClass === "*" ? "#filter:all" : `#filter:${filterClass.replace(".", "")}`;
412 + window.location.href =
413 + window.location.pathname + window.location.search + filterHash;
414 + }
415 + if (["infinite-scroll", "load-more"].includes(s.pagination_type)) {
416 + if ($grid.find($(this).attr("data-filter")).length === 0) {
417 + $grid.infiniteScroll("loadNextPage");
418 + }
419 + }
420 + if (s.filters_animation !== "default") {
421 + $scope.find(".king-addons-grid-item-inner").css({
422 + opacity: "0",
423 + transition: "none",
424 + });
425 + if (s.filters_animation === "fade-slide") {
426 + $scope.find(".king-addons-grid-item-inner").css("top", "20px");
427 + } else if (s.filters_animation === "zoom") {
428 + $scope.find(".king-addons-grid-item-inner").css("transform", "scale(0.01)");
429 + }
430 + }
431 + $grid.isotopekng({ filter: filterClass });
432 + s.lightbox.selector =
433 + filterClass === "*" ? ".king-addons-grid-image-wrap" : `${filterClass} .king-addons-grid-image-wrap`;
434 + $grid.data("lightGallery").destroy(true);
435 + $grid.lightGallery(s.lightbox);
436 + });
437 + }
438 + }
439 +
440 + // Experiment: dynamic filtering via AJAX.
441 + function filtersExperiment(settings) {
442 + const countAction = $scope.hasClass("elementor-widget-king-addons-woocommerce-grid")
443 + ? "king_addons_get_woocommerce_filtered_count"
444 + : "king_addons_get_filtered_count";
445 + const contentAction = $scope.hasClass("elementor-widget-king-addons-woocommerce-grid")
446 + ? "king_addons_filter_woocommerce_products"
447 + : "king_addons_filter_grid_posts";
448 + const $pagination = $scope.find(".king-addons-grid-pagination");
449 +
450 + let isLoading = false;
451 +
452 + $scope.find(".king-addons-grid-filters").on("click", "span", function (e) {
453 + e.preventDefault();
454 + e.stopPropagation();
455 + e.stopImmediatePropagation();
456 +
457 + if (isLoading) {
458 + e.preventDefault();
459 + return;
460 + }
461 +
462 + isLoading = true;
463 +
464 + const filterClass = $(this).data("filter");
465 + const thisTaxonomy = filterClass !== "*" ? $(this).data("ajax-filter")[0] : "*";
466 + const thisFilter = filterClass !== "*" ? $(this).data("ajax-filter")[1] : "*";
467 + const loader = `<div class="king-addons-grid-loader-wrap"><div class="king-addons-ring"><div></div><div></div><div></div><div></div></div></div>`;
468 +
469 +
470 + // let thisTaxonomy = "*";
471 + // let thisFilter = "*";
472 + // const $activeFilter = $scope.find(".king-addons-active-filter");
473 + // if ($activeFilter.length && $activeFilter.data("filter") !== "*") {
474 + // thisTaxonomy = $activeFilter.data("ajax-filter")[0];
475 + // thisFilter = $activeFilter.data("ajax-filter")[1];
476 + // }
477 +
478 + $scope.find(".king-addons-grid-filters span").removeClass("king-addons-active-filter");
479 + $(this).addClass("king-addons-active-filter");
480 +
481 + $pagination.find(".king-addons-load-more-btn").hide();
482 +
483 + $grid.infiniteScroll("destroy");
484 + // setupInfiniteScroll(settings);
485 + // $grid.isotopekng("destroy");
486 + pagesLoaded = 0;
487 + // $grid.isotopekng("destroy");
488 +
489 + $grid.html(loader);
490 +
491 + // console.log('FILTER');
492 +
493 + $.ajax({
494 + type: "POST",
495 + url: KingAddonsGridData.ajaxUrl,
496 + data: {
497 + action: countAction,
498 + king_addons_offset:
499 + +settings.grid_settings.query_offset +
500 + $scope.find(".king-addons-grid-item").length,
501 + king_addons_filter: thisFilter,
502 + king_addons_taxonomy: thisTaxonomy,
503 + grid_settings: settings.grid_settings,
504 + },
505 + success: function (res) {
506 + // console.log("settings.grid_settings.query_offset = " + settings.grid_settings.query_offset);
507 + $.ajax({
508 + type: "POST",
509 + url: KingAddonsGridData.ajaxUrl,
510 + data: {
511 + action: contentAction,
512 + king_addons_item_length:
513 + +settings.grid_settings.query_offset +
514 + $scope.find(".king-addons-grid-item").length,
515 + king_addons_filter: thisFilter,
516 + king_addons_taxonomy: thisTaxonomy,
517 + grid_settings: settings.grid_settings,
518 + },
519 + success: function (resp) {
520 + // setTimeout(() => {
521 + $grid.addClass("king-addons-zero-opacity");
522 +
523 + // console.log("FILTER pagesLoaded = " + pagesLoaded);
524 + // $grid.infiniteScroll("destroy");
525 + $grid.isotopekng("destroy");
526 +
527 + $grid.html($(resp));
528 +
529 + isotopeLayout(settings, $(resp));
530 + $grid.imagesLoaded().progress(() => {
531 + isotopeLayout(settings);
532 + window.dispatchEvent(new Event("resize"));
533 + window.dispatchEvent(new Event("scroll"));
534 +
535 + $pagination.find(".king-addons-pagination-finish").hide();
536 + if (res.data.page_count > 1) {
537 + $pagination.find(".king-addons-load-more-btn").show();
538 + $pagination.show();
539 + } else {
540 + $pagination.find(".king-addons-pagination-finish").fadeIn(1000);
541 + $pagination.delay(2000).fadeOut(1000);
542 + setTimeout(() => $pagination.find(".king-addons-pagination-loading").hide(), 500);
543 + }
544 +
545 + setupInfiniteScroll(settings);
546 + loadMoreExperiment();
547 +
548 + mediaHoverLink();
549 + $grid.removeClass("king-addons-zero-opacity");
550 + });
551 + // }, 800);
552 + },
553 + });
554 + },
555 + complete: function () {
556 + isLoading = false;
557 + }
558 + });
559 + });
560 + }
561 +
562 + // Experiment: load-more via AJAX.
563 + function loadMoreExperiment() {
564 + const countAction = $scope.hasClass("elementor-widget-king-addons-woocommerce-grid")
565 + ? "king_addons_get_woocommerce_filtered_count"
566 + : "king_addons_get_filtered_count";
567 + const contentAction = $scope.hasClass("elementor-widget-king-addons-woocommerce-grid")
568 + ? "king_addons_filter_woocommerce_products"
569 + : "king_addons_filter_grid_posts";
570 + const $pagination = $scope.find(".king-addons-grid-pagination");
571 +
572 + let isLoading = false;
573 +
574 + $scope.find(".king-addons-load-more-btn").on("click", function (e) {
575 + e.preventDefault();
576 + e.stopPropagation();
577 + e.stopImmediatePropagation();
578 +
579 + if (isLoading) {
580 + e.preventDefault();
581 + return;
582 + }
583 +
584 + isLoading = true;
585 +
586 + let thisTaxonomy = "*";
587 + let thisFilter = "*";
588 + const $activeFilter = $scope.find(".king-addons-active-filter");
589 + if ($activeFilter.length && $activeFilter.data("filter") !== "*") {
590 + thisTaxonomy = $activeFilter.data("ajax-filter")[0];
591 + thisFilter = $activeFilter.data("ajax-filter")[1];
592 + }
593 +
594 + $pagination.find(".king-addons-load-more-btn").hide();
595 + $pagination.find(".king-addons-pagination-loading").css("display", "inline-block");
596 +
597 + $.ajax({
598 + type: "POST",
599 + url: KingAddonsGridData.ajaxUrl,
600 + data: {
601 + action: countAction,
602 + king_addons_offset:
603 + +settings.grid_settings.query_offset +
604 + $grid.find(".king-addons-grid-item").length,
605 + king_addons_filter: thisFilter,
606 + king_addons_taxonomy: thisTaxonomy,
607 + grid_settings: settings.grid_settings,
608 + },
609 + success: function (responseCountAction) {
610 + $.ajax({
611 + type: "POST",
612 + url: KingAddonsGridData.ajaxUrl,
613 + data: {
614 + action: contentAction,
615 + king_addons_offset:
616 + +settings.grid_settings.query_offset +
617 + $grid.find(".king-addons-grid-item").length,
618 + king_addons_filter: thisFilter,
619 + king_addons_taxonomy: thisTaxonomy,
620 + grid_settings: settings.grid_settings,
621 + },
622 + success: function (responseContentAction) {
623 + const $items = $(responseContentAction);
624 + $grid.infiniteScroll("appendItems", $items);
625 + $grid.isotopekng("appended", $items);
626 + $items.imagesLoaded().progress(() => {
627 + isotopeLayout(settings);
628 + setTimeout(() => isotopeLayout(settings), 100);
629 + setTimeout(() => $grid.addClass("grid-images-loaded"), 500);
630 + });
631 + $pagination.find(".king-addons-pagination-loading").hide();
632 + if (responseCountAction.data.page_count > 1) {
633 + $pagination.find(".king-addons-load-more-btn").fadeIn();
634 + } else {
635 + $pagination.find(".king-addons-pagination-finish").fadeIn(1000);
636 + $pagination.delay(2000).fadeOut(1000);
637 + setTimeout(() => $pagination.find(".king-addons-pagination-loading").hide(), 500);
638 + }
639 + // lightboxPopup(settings);
640 + $grid.data("lightGallery").destroy(true);
641 + $grid.lightGallery(settings.lightbox);
642 + mediaHoverLink();
643 + postSharing();
644 + window.dispatchEvent(new Event("resize"));
645 + window.dispatchEvent(new Event("scroll"));
646 + },
647 + });
648 + },
649 + complete: function () {
650 + isLoading = false;
651 + }
652 + });
653 +
654 +
655 + });
656 + }
657 +
658 + // Setup Infinite Scroll.
659 + function setupInfiniteScroll(s) {
660 +
661 +
662 + const countAction = $scope.hasClass("elementor-widget-king-addons-woocommerce-grid")
663 + ? "king_addons_get_woocommerce_filtered_count"
664 + : "king_addons_get_filtered_count";
665 + const contentAction = $scope.hasClass("elementor-widget-king-addons-woocommerce-grid")
666 + ? "king_addons_filter_woocommerce_products"
667 + : "king_addons_filter_grid_posts";
668 +
669 + const $pagination = $scope.find(".king-addons-grid-pagination");
670 +
671 + const scopeClass = `.elementor-element-${$scope.attr("data-id")}`;
672 +
673 + let navClass = false,
674 + threshold = false;
675 + if (s.pagination_type === "infinite-scroll") {
676 + threshold = 300;
677 + navClass = `${scopeClass} .king-addons-load-more-btn`;
678 + }
679 + // todo
680 + $grid.infiniteScroll({
681 + path: `${scopeClass} .king-addons-grid-pagination a`,
682 + hideNav: navClass,
683 + append: false,
684 + history: false,
685 + scrollThreshold: threshold,
686 + status: `${scopeClass} .page-load-status`,
687 + onInit() {
688 + this.on("load", () => $grid.removeClass("grid-images-loaded"));
689 + },
690 + });
691 + $grid.on("request.infiniteScroll", () => {
692 + $pagination.find(".king-addons-load-more-btn").hide();
693 + $pagination.find(".king-addons-pagination-loading").css("display", "inline-block");
694 + });
695 +
696 + $grid.on("load.infiniteScroll", (event, response) => {
697 + // console.log("pagesLoaded = " + pagesLoaded);
698 +
699 + pagesLoaded++;
700 +
701 + const $items = $(response).find(scopeClass).find(".king-addons-grid-item");
702 +
703 + // console.log("$items = " + $items);
704 + // console.log("$items.length = " + $items.length);
705 +
706 + if ($scope.find(".woocommerce-result-count").length) {
707 + let updatedCount = $scope.find(".woocommerce-result-count").text();
708 + updatedCount = updatedCount.replace(
709 + /\d\u2013\d+/,
710 + `1–${$scope.find(".king-addons-grid-item").length + $items.length}`
711 + );
712 + $scope.find(".woocommerce-result-count").text(updatedCount);
713 + }
714 +
715 +
716 + $grid.infiniteScroll("appendItems", $items);
717 + $grid.isotopekng("appended", $items);
718 + $items.imagesLoaded().progress(() => {
719 + isotopeLayout(s);
720 + setTimeout(() => {
721 + // isotopeLayout(s);
722 + // isotopeFilters(s);
723 + // ===============================
724 +
725 + // ================================
726 + }, 10);
727 + setTimeout(() => $grid.addClass("grid-images-loaded"), 500);
728 + });
729 +
730 + // =====================
731 +
732 +
733 + // let thisTaxonomy = "*";
734 + // let thisFilter = "*";
735 + // const $activeFilter = $scope.find(".king-addons-active-filter");
736 + // if ($activeFilter.length && $activeFilter.data("filter") !== "*") {
737 + // thisTaxonomy = $activeFilter.data("ajax-filter")[0];
738 + // thisFilter = $activeFilter.data("ajax-filter")[1];
739 + // }
740 + //
741 + // $pagination.find(".king-addons-load-more-btn").hide();
742 + // $pagination.find(".king-addons-pagination-loading").css("display", "inline-block");
743 + //
744 + // $.ajax({
745 + // type: "POST",
746 + // url: KingAddonsGridData.ajaxUrl,
747 + // data: {
748 + // action: countAction,
749 + // king_addons_offset:
750 + // +settings.grid_settings.query_offset +
751 + // $grid.find(".king-addons-grid-item").length,
752 + // king_addons_filter: thisFilter,
753 + // king_addons_taxonomy: thisTaxonomy,
754 + // grid_settings: settings.grid_settings,
755 + // },
756 + // success: function (responseCountAction) {
757 + // console.log('responseCountAction = ' + responseCountAction.data.page_count);
758 + // $.ajax({
759 + // type: "POST",
760 + // url: KingAddonsGridData.ajaxUrl,
761 + // data: {
762 + // action: contentAction,
763 + // king_addons_offset:
764 + // +settings.grid_settings.query_offset +
765 + // $grid.find(".king-addons-grid-item").length,
766 + // king_addons_filter: thisFilter,
767 + // king_addons_taxonomy: thisTaxonomy,
768 + // grid_settings: settings.grid_settings,
769 + // },
770 + // success: function (responseContentAction) {
771 + // const $items = $(responseContentAction);
772 + // $grid.infiniteScroll("appendItems", $items);
773 + // $grid.isotopekng("appended", $items);
774 + // $items.imagesLoaded().progress(() => {
775 + // isotopeLayout(settings);
776 + // setTimeout(() => isotopeLayout(settings), 100);
777 + // setTimeout(() => $grid.addClass("grid-images-loaded"), 500);
778 + // });
779 + // $pagination.find(".king-addons-pagination-loading").hide();
780 + // if (responseCountAction.data.page_count > 1) {
781 + // $pagination.find(".king-addons-load-more-btn").fadeIn();
782 + // } else {
783 + // $pagination.find(".king-addons-pagination-finish").fadeIn(1000);
784 + // $pagination.delay(2000).fadeOut(1000);
785 + // setTimeout(() => $pagination.find(".king-addons-pagination-loading").hide(), 500);
786 + // }
787 + // lightboxPopup(settings);
788 + // $grid.data("lightGallery").destroy(true);
789 + // $grid.lightGallery(settings.lightbox);
790 + // mediaHoverLink();
791 + // postSharing();
792 + // window.dispatchEvent(new Event("resize"));
793 + // window.dispatchEvent(new Event("scroll"));
794 + //
795 + // },
796 + // });
797 + // },
798 + // // complete: function () {
799 + // // isLoading = false;
800 + // // }
801 + // });
802 +
803 + // =====================
804 + $pagination.find(".king-addons-pagination-loading").hide();
805 + if (pagesLoaded < s.pagination_max_pages) {
806 + if (s.pagination_type === "load-more") {
807 + $pagination.find(".king-addons-load-more-btn").fadeIn();
808 + if ($scope.find(".king-addons-grid-filters").length) {
809 + const activeF = $scope.find(".king-addons-active-filter");
810 + if (activeF.length && activeF.attr("data-filter") !== "*") {
811 + const filterClass = activeF.attr("data-filter").slice(1);
812 + let foundOne = false;
813 + $items.each(function () {
814 + if ($(this).hasClass(filterClass)) {
815 + foundOne = true;
816 + return false;
817 + }
818 + });
819 + if (!foundOne) $grid.infiniteScroll("loadNextPage");
820 + }
821 + }
822 + }
823 + } else {
824 + $pagination.find(".king-addons-pagination-finish").fadeIn(1000);
825 + $pagination.delay(2000).fadeOut(1000);
826 + setTimeout(() => $pagination.find(".king-addons-pagination-loading").hide(), 500);
827 + }
828 + // lightboxPopup(s);
829 + $grid.data("lightGallery").destroy(true);
830 + $grid.lightGallery(s.lightbox);
831 + mediaHoverLink();
832 + postSharing();
833 + setTimeout(() => {
834 + setEqualHeight(s);
835 + window.dispatchEvent(new Event("resize"));
836 + }, 500);
837 + });
838 + $pagination.find(".king-addons-load-more-btn").on("click", () => {
839 + $grid.infiniteScroll("loadNextPage");
840 + return false;
841 + });
842 + }
843 +
844 + // Initialize the Slick slider.
845 + function initSlickSlider() {
846 + const settingsSlick = JSON.parse($grid.attr("data-slick") || "{}");
847 + $grid.slick({
848 + appendDots: $scope.find(".king-addons-grid-slider-dots"),
849 + rows: settingsSlick.sliderRows,
850 + customPaging: () => `<span class="king-addons-grid-slider-dot"></span>`,
851 + slidesToShow: getSliderColumns("desktop"),
852 + responsive: getSliderResponsiveOptions(settingsSlick),
853 + });
854 + handleSlickArrows();
855 + handleSlickDots();
856 + }
857 +
858 + // Get the number of slider columns.
859 + function getSliderColumns(type) {
860 + const match = $scope.attr("class").match(/king-addons-grid-slider-columns-(\d)/);
861 + return type === "desktop" ? (match ? parseInt(match[1], 10) : 2) : 2;
862 + }
863 +
864 + // Get responsive slider options.
865 + function getSliderResponsiveOptions(sl) {
866 + const className = $scope.attr("class");
867 + const colDesktop = getSliderColumns("desktop");
868 + const colWide = extractColumns(className, "widescreen") || colDesktop;
869 + const colLaptop = extractColumns(className, "laptop") || colDesktop;
870 + const colTablet = extractColumns(className, "tablet") || 2;
871 + const colTabletExtra = extractColumns(className, "tablet_extra") || colTablet;
872 + const colMobileExtra = extractColumns(className, "mobile_extra") || colTablet;
873 + const colMobile = extractColumns(className, "mobile") || 1;
874 + const slidesToScroll = sl.sliderSlidesToScroll;
875 + const adjust = (cols) => (slidesToScroll > cols ? 1 : slidesToScroll);
876 + return [
877 + { breakpoint: 10000, settings: { slidesToShow: colWide, slidesToScroll: adjust(colWide) } },
878 + { breakpoint: 2399, settings: { slidesToShow: colDesktop, slidesToScroll: adjust(colDesktop) } },
879 + { breakpoint: 1221, settings: { slidesToShow: colLaptop, slidesToScroll: adjust(colLaptop) } },
880 + { breakpoint: 1200, settings: { slidesToShow: colTabletExtra, slidesToScroll: adjust(colTabletExtra) } },
881 + { breakpoint: 1024, settings: { slidesToShow: colTablet, slidesToScroll: adjust(colTablet) } },
882 + { breakpoint: 880, settings: { slidesToShow: colMobileExtra, slidesToScroll: adjust(colMobileExtra) } },
883 + { breakpoint: 768, settings: { slidesToShow: colMobile, slidesToScroll: adjust(colMobile) } },
884 + ];
885 + }
886 +
887 + // Extract a number of columns from a class name.
888 + function extractColumns(className, type) {
889 + const match = className.match(new RegExp(`columns--${type}(\\d)`));
890 + return match ? parseInt(match[1], 10) : false;
891 + }
892 +
893 + // Adjust the slider arrows based on available space.
894 + function handleSlickArrows() {
895 + const $prevArrow = $scope.find(".king-addons-grid-slider-prev-arrow");
896 + const $nextArrow = $scope.find(".king-addons-grid-slider-next-arrow");
897 + if (!$prevArrow.length || !$nextArrow.length) return;
898 + const positionSum = $prevArrow.position().left * -2;
899 + $(window).on("load", checkArrows);
900 + $(window).smartresize(checkArrows);
901 + function checkArrows() {
902 + if (
903 + $(window).width() <=
904 + $scope.outerWidth() +
905 + $prevArrow.outerWidth() +
906 + $nextArrow.outerWidth() +
907 + positionSum
908 + ) {
909 + $prevArrow.addClass("king-addons-adjust-slider-prev-arrow");
910 + $nextArrow.addClass("king-addons-adjust-slider-next-arrow");
911 + } else {
912 + $prevArrow.removeClass("king-addons-adjust-slider-prev-arrow");
913 + $nextArrow.removeClass("king-addons-adjust-slider-next-arrow");
914 + }
915 + }
916 + }
917 +
918 + // Adjust slider dots if needed.
919 + function handleSlickDots() {
920 + if (
921 + $scope.find(".slick-dots").length &&
922 + $scope.hasClass("king-addons-grid-slider-dots-horizontal")
923 + ) {
924 + resizeDots();
925 + $(window).smartresize(() => setTimeout(resizeDots, 300));
926 + }
927 + function resizeDots() {
928 + const $dots = $scope.find(".slick-dots li");
929 + const marginRight = parseInt($dots.find("span").css("margin-right"), 10);
930 + const width = $dots.outerWidth() * $dots.length - marginRight;
931 + $scope.find(".slick-dots").css("width", width);
932 + }
933 + }
934 +
935 + // Setup "Add to Cart" behavior.
936 + function setupAddToCart() {
937 + const $addCartIcon = $grid.find(".king-addons-grid-item-add-to-cart i");
938 + let addCartIconClass = $addCartIcon.attr("class") || "";
939 + if (addCartIconClass) {
940 + addCartIconClass = addCartIconClass.substring(
941 + addCartIconClass.indexOf("fa-")
942 + );
943 + }
944 + $body.on("adding_to_cart", (ev, btn) => btn.fadeTo("slow", 0));
945 + $body.on("added_to_cart", (ev, fragments, hash, btn) => {
946 + const productId = btn.data("product_id");
947 + btn.next().fadeTo(700, 1).css("display", "inline-block");
948 + btn.css("display", "none");
949 + if (btn.data("atc-popup") === "sidebar") {
950 + $(".king-addons-mini-cart-toggle-wrap a").each(function () {
951 + const $miniCart = $(this)
952 + .closest(".king-addons-mini-cart-inner")
953 + .find(".king-addons-mini-cart");
954 + if ($miniCart.css("display") === "none") $(this).trigger("click");
955 + });
956 + } else if (btn.data("atc-popup") === "popup") {
957 + addToCartPopup(btn, productId);
958 + }
959 + if (addCartIconClass) {
960 + btn.find("i").removeClass(addCartIconClass).addClass("fa-check");
961 + setTimeout(() => {
962 + btn.find("i").removeClass("fa-check").addClass(addCartIconClass);
963 + }, 3500);
964 + }
965 + });
966 +
967 + function addToCartPopup(btn, productId) {
968 + const $popupItem = btn.closest(".king-addons-grid-item");
969 + const popupText = $popupItem.find(".king-addons-grid-item-title").text();
970 + const popupLink = btn.next().attr("href");
971 + const popupImageSrc = $popupItem.find(".king-addons-grid-image-wrap").data("src");
972 + const popupAnimation = btn.data("atc-animation");
973 + const fadeOutIn = btn.data("atc-fade-out-in");
974 + const animTime = btn.data("atc-animation-time");
975 + let animationClass = "king-addons-added-to-cart-default",
976 + removeAnimationClass = "king-addons-added-to-cart-popup-hide";
977 + const popupImage = popupImageSrc
978 + ? `<div class="king-addons-added-tc-popup-img"><img src="${popupImageSrc}" alt="" /></div>`
979 + : "";
980 + switch (popupAnimation) {
981 + case "slide-left":
982 + animationClass = "king-addons-added-to-cart-slide-in-left";
983 + removeAnimationClass = "king-addons-added-to-cart-slide-out-left";
984 + break;
985 + case "scale-up":
986 + animationClass = "king-addons-added-to-cart-scale-up";
987 + removeAnimationClass = "king-addons-added-to-cart-scale-down";
988 + break;
989 + case "skew":
990 + animationClass = "king-addons-added-to-cart-skew";
991 + removeAnimationClass = "king-addons-added-to-cart-skew-off";
992 + break;
993 + case "fade":
994 + animationClass = "king-addons-added-to-cart-fade";
995 + removeAnimationClass = "king-addons-added-to-cart-fade-out";
996 + break;
997 + }
998 + if (!$scope.find(`#king-addons-added-to-cart-${productId}`).length) {
999 + $scope
1000 + .find(".king-addons-grid")
1001 + .append(
1002 + `<div id="king-addons-added-to-cart-${productId}" class="king-addons-added-to-cart-popup ${animationClass}">
1003 + ${popupImage}
1004 + <div class="king-addons-added-tc-title">
1005 + <p>${popupText} ${KingAddonsGridData.addedToCartText}</p>
1006 + <p><a href="${popupLink}">${KingAddonsGridData.viewCart}</a></p>
1007 + </div>
1008 + </div>`
1009 + );
1010 + setTimeout(() => {
1011 + $scope
1012 + .find(`#king-addons-added-to-cart-${productId}`)
1013 + .addClass(removeAnimationClass);
1014 + setTimeout(() => {
1015 + $scope.find(`#king-addons-added-to-cart-${productId}`).remove();
1016 + }, animTime * 1000);
1017 + }, fadeOutIn * 1000);
1018 + }
1019 + }
1020 + }
1021 +
1022 + // Setup post sharing behavior.
1023 + function postSharing() {
1024 + if (!$scope.find(".king-addons-sharing-trigger").length) return;
1025 + const $sharingTrigger = $scope.find(".king-addons-sharing-trigger");
1026 + const $sharingInner = $scope.find(".king-addons-post-sharing-inner");
1027 + let sharingWidth = 5;
1028 + $sharingInner.first().find("a").each(function () {
1029 + sharingWidth += $(this).outerWidth() + parseInt($(this).css("margin-right"), 10);
1030 + });
1031 + const direction = $sharingTrigger.attr("data-direction");
1032 + if (direction === "left" || direction === "right") {
1033 + $sharingInner.css("width", `${sharingWidth}px`);
1034 + if (direction === "left") {
1035 + $sharingInner.css(
1036 + "left",
1037 + -(parseInt($sharingInner.find("a").css("margin-right"), 10) + sharingWidth) + "px"
1038 + );
1039 + } else {
1040 + $sharingInner.css({ left: $sharingTrigger.css("margin-right") });
1041 + }
1042 + } else if (direction === "top") {
1043 + const margin = parseInt($sharingInner.find("a").css("margin-right"), 10);
1044 + $sharingInner.find("a").css({ "margin-right": "0", "margin-top": `${margin}px` });
1045 + $sharingInner.css({
1046 + top: `-${margin}px`,
1047 + left: "50%",
1048 + transform: "translate(-50%, -100%)",
1049 + });
1050 + } else if (direction === "bottom") {
1051 + const margin = parseInt($sharingInner.find("a").css("margin-right"), 10);
1052 + $sharingInner.find("a").css({ "margin-right": "0", "margin-bottom": `${margin}px` });
1053 + $sharingInner.css({
1054 + bottom: `-${margin}px`,
1055 + left: "50%",
1056 + transform: "translate(-50%, 100%)",
1057 + });
1058 + }
1059 + if ($sharingTrigger.attr("data-action") === "click") {
1060 + $sharingTrigger.on("click", function () {
1061 + const $inner = $(this).next();
1062 + if ($inner.css("visibility") === "hidden") {
1063 + $inner.css("visibility", "visible").find("a").css({ opacity: "1", top: "0" });
1064 + setTimeout(() => $inner.find("a").addClass("king-addons-no-transition-delay"), $inner.find("a").length * 100);
1065 + } else {
1066 + $inner.find("a").removeClass("king-addons-no-transition-delay").css({
1067 + opacity: "0",
1068 + top: "-5px",
1069 + });
1070 + setTimeout(() => $inner.css("visibility", "hidden"), $inner.find("a").length * 100);
1071 + }
1072 + });
1073 + } else {
1074 + $sharingTrigger.on("mouseenter", function () {
1075 + const $inner = $(this).next();
1076 + $inner.css("visibility", "visible").find("a").css({ opacity: "1", top: "0" });
1077 + setTimeout(() => $inner.find("a").addClass("king-addons-no-transition-delay"), $inner.find("a").length * 100);
1078 + });
1079 + $scope.find(".king-addons-grid-item-sharing").on("mouseleave", function () {
1080 + const $inner = $(this).find(".king-addons-post-sharing-inner");
1081 + $inner.find("a").removeClass("king-addons-no-transition-delay").css({
1082 + opacity: "0",
1083 + top: "-5px",
1084 + });
1085 + setTimeout(() => $inner.css("visibility", "hidden"), $inner.find("a").length * 100);
1086 + });
1087 + }
1088 + }
1089 +
1090 + // Setup media hover behavior and overlay clickable links.
1091 + function mediaHoverLink() {
1092 + const $wrap = $grid.find(".king-addons-grid-image-wrap");
1093 + if ($wrap.data("img-on-hover") === "yes") {
1094 + $grid.find(".king-addons-grid-media-wrap").hover(
1095 + function () {
1096 + const $secondImg = $(this).find("img:nth-of-type(2)");
1097 + if ($secondImg.attr("src")) {
1098 + $(this).find("img:first-of-type").addClass("king-addons-hidden-img");
1099 + $secondImg.removeClass("king-addons-hidden-img");
1100 + }
1101 + },
1102 + function () {
1103 + const $secondImg = $(this).find("img:nth-of-type(2)");
1104 + if ($secondImg.attr("src")) {
1105 + $secondImg.addClass("king-addons-hidden-img");
1106 + $(this).find("img:first-of-type").removeClass("king-addons-hidden-img");
1107 + }
1108 + }
1109 + );
1110 + }
1111 + if ($wrap.attr("data-overlay-link") === "yes" && !isEditor) {
1112 + $wrap.css("cursor", "pointer").on("click", function (e) {
1113 + const cn = e.target.className;
1114 + if (
1115 + cn.indexOf("inner-block") !== -1 ||
1116 + cn.indexOf("king-addons-cv-inner") !== -1 ||
1117 + cn.indexOf("king-addons-grid-media-hover") !== -1
1118 + ) {
1119 + e.preventDefault();
1120 + let itemUrl = $(this)
1121 + .find(".king-addons-grid-media-hover-bg")
1122 + .attr("data-url")
1123 + .replace("#new_tab", "");
1124 + if ($grid.find(".king-addons-grid-item-title a").attr("target") === "_blank") {
1125 + window.open(itemUrl, "_blank").focus();
1126 + } else {
1127 + window.location.href = itemUrl;
1128 + }
1129 + }
1130 + });
1131 + }
1132 + }
1133 +
1134 + // Initialize lightbox popups.
1135 + function lightboxPopup(s) {
1136 + if ($scope.find(".king-addons-grid-item-lightbox").length < 0) return;
1137 + $grid.find(".king-addons-grid-item-lightbox").each(function () {
1138 + const source = $(this).find(".inner-block > span").attr("data-src");
1139 + const $article = $(this).closest("article").not(".slick-cloned");
1140 + if (!$grid.hasClass("king-addons-media-grid")) {
1141 + $article.find(".king-addons-grid-image-wrap").attr("data-src", source);
1142 + }
1143 + });
1144 + $grid.lightGallery(s.lightbox);
1145 + $grid.on("onAfterOpen.lg", () => {
1146 + $(".lg-outer")
1147 + .find(".lg-thumb-item")
1148 + .each(function () {
1149 + const $img = $(this).find("img");
1150 + let src = $img.attr("src");
1151 + const extIndex = src.lastIndexOf(".");
1152 + const ext = src.slice(extIndex);
1153 + const cropIndex = src.lastIndexOf("-");
1154 + const cropCandidate = src.substring(cropIndex, extIndex);
1155 + const isStandardCrop = /\d{3,}x\d{3,}/.test(cropCandidate);
1156 + if (!isStandardCrop && cropCandidate.length > 0) {
1157 + src = src.slice(0, extIndex) + "-150x150" + ext;
1158 + } else {
1159 + src = src.replace(cropCandidate, "-150x150");
1160 + }
1161 + $img.attr("src", src);
1162 + });
1163 + });
1164 + $grid.on("onAferAppendSlide.lg onAfterSlide.lg", () => {
1165 + const download = $("#lg-download").attr("href");
1166 + const $controls = $("#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download");
1167 + if (download && download.indexOf("wp-content") === -1) {
1168 + $controls.addClass("king-addons-hidden-element");
1169 + } else {
1170 + $controls.removeClass("king-addons-hidden-element");
1171 + }
1172 + if (!s.lightbox.autoplay) {
1173 + $(".lg-autoplay-button").css({ width: "0", height: "0", overflow: "hidden" });
1174 + }
1175 + });
1176 + const $overlay = $scope.find(".king-addons-grid-lightbox-overlay");
1177 + if ($overlay.length) {
1178 + $scope.find(".king-addons-grid-media-hover-bg").after($overlay.remove());
1179 + $scope.find(".king-addons-grid-lightbox-overlay").on("click", function () {
1180 + if (!isEditor) {
1181 + $(this).closest("article").find(".king-addons-grid-image-wrap").trigger("click");
1182 + } else {
1183 + alert(
1184 + "Lightbox is Disabled in the Editor! Please Preview this Page to see it in action."
1185 + );
1186 + }
1187 + });
1188 + } else {
1189 + $scope.find(".king-addons-grid-item-lightbox .inner-block > span").on("click", function () {
1190 + if (!isEditor) {
1191 + $(this).closest("article").find(".king-addons-grid-image-wrap").trigger("click");
1192 + } else {
1193 + alert(
1194 + "Lightbox is Disabled in the Editor! Please Preview this Page to see it in action."
1195 + );
1196 + }
1197 + });
1198 + }
1199 + }
1200 +
1201 + // Handle post likes.
1202 + function postLikes() {
1203 + if (!$scope.find(".king-addons-post-like-button").length) return;
1204 + $scope.on("click", ".king-addons-post-like-button", function (e) {
1205 + e.preventDefault();
1206 + const $btn = $(this);
1207 + if (!$btn.attr("data-post-id")) return false;
1208 + $.ajax({
1209 + type: "POST",
1210 + url: $btn.attr("data-ajax"),
1211 + data: {
1212 + action: "king_addons_likes_init",
1213 + post_id: $btn.attr("data-post-id"),
1214 + nonce: $btn.attr("data-nonce"),
1215 + },
1216 + beforeSend: () => $btn.fadeTo(500, 0.5),
1217 + success: function (response) {
1218 + let iconClass = $btn.attr("data-icon");
1219 + let countHTML = response.count;
1220 + if (!countHTML.replace(/<\/?[^>]+(>|$)/g, "")) {
1221 + countHTML = `<span class="king-addons-post-like-count">${$btn.attr("data-text")}</span>`;
1222 + $btn.addClass("king-addons-likes-zero");
1223 + } else {
1224 + $btn.removeClass("king-addons-likes-zero");
1225 + }
1226 + if ($btn.hasClass("king-addons-already-liked")) {
1227 + $btn.prop("title", "Like").removeClass("king-addons-already-liked");
1228 + $btn.html(`<i class="${iconClass.replace("fas", "far")}"></i>${countHTML}`);
1229 + } else {
1230 + $btn.prop("title", "Unlike").addClass("king-addons-already-liked");
1231 + $btn.html(`<i class="${iconClass.replace("far", "fas")}"></i>${countHTML}`);
1232 + }
1233 + $btn.fadeTo(500, 1);
1234 + },
1235 + });
1236 + return false;
1237 + });
1238 + }
1239 +
1240 + // Animate grid items after layout.
1241 + function animateGridItems(filteredItems, s, $grid) {
1242 + let initStager = 0,
1243 + filterStager = 0,
1244 + deepLinkStager = 0;
1245 + if (!$grid.hasClass("grid-images-loaded")) $grid.css("opacity", "1");
1246 + filteredItems.forEach((item) => {
1247 + initStager += s.animation_delay;
1248 + $(item.element)
1249 + .find(".king-addons-grid-item-inner")
1250 + .css({
1251 + opacity: "1",
1252 + top: "0",
1253 + transform: "scale(1)",
1254 + transition: `all ${s.animation_duration}s ease-in ${initStager}s`,
1255 + });
1256 + filterStager += s.filters_animation_delay;
1257 + if ($grid.hasClass("grid-images-loaded")) {
1258 + $(item.element)
1259 + .find(".king-addons-grid-item-inner")
1260 + .css({
1261 + transition: `all ${s.filters_animation_duration}s ease-in ${filterStager}s`,
1262 + });
1263 + }
1264 + let deepLink = window.location.hash;
1265 + if (deepLink.includes("#filter:") && !deepLink.includes("#filter:*")) {
1266 + deepLink = deepLink.replace("#filter:", "");
1267 + if ($(item.element).hasClass(deepLink)) {
1268 + deepLinkStager += s.filters_animation_delay;
1269 + $(item.element)
1270 + .find(".king-addons-grid-item-inner")
1271 + .css({ "transition-delay": `${deepLinkStager}s` });
1272 + }
1273 + }
1274 + });
1275 + }
1276 + },
1277 + }),
1278 + { $element: $scope }
1279 + );
1280 + }
1281 +
1282 +
1283 + gridHooks.forEach((hook) => {
1284 + elementorFrontend.hooks.addAction(hook, gridHandler);
1285 + });
1286 +
1287 + });
1288 +})(jQuery);