PageSourceSearch

https://blackchamberaz.org/wp-content/plugins/eventin-pro/assets/js/etn-public.js?ver=4.1.26

js blackchamberaz.org collected 2026-10-09 21:33:49 UTC 12,025 bytes, 391 lines download raw bytes

1"use strict";
2jQuery(document).ready(function ($) {
3  //Added active class in the eventin menu in dokan leftmenu
4  const _pathname = window.location.pathname.toString();
5  const create_event = "/eventin/create_event/";
6  const vendor_event = "/eventin/vendor_event/";
7  if (_pathname.includes(create_event) || _pathname.includes(vendor_event)) {
8    $(".dokan-dashboard-menu").find("li.eventin").addClass("active");
9  }
10
11  /*================================
12        speaker slider
13    ===================================*/
14  var $scope = $(".speaker_shortcode_slider");
15  if ($scope.length > 0) {
16    $($scope).each(function () {
17      var $this = $(this);
18      speaker_sliders_pro($, $this);
19    });
20  }
21
22  /*================================
23        speaker slider
24    ===================================*/
25  var $scope = $(".event-slider-shortcode");
26  event_sliders_pro($, $scope);
27
28  /*================================
29    Event accordion
30    ===================================*/
31
32  $(".etn-content-item > .etn-accordion-heading").on("click", function (e) {
33    e.preventDefault();
34    if ($(this).hasClass("active")) {
35      $(this).removeClass("active");
36      $(this).siblings(".etn-acccordion-contents").slideUp(200);
37      $(".etn-content-item > .etn-accordion-heading i")
38        .removeClass("etn-minus")
39        .addClass("etn-plus");
40    } else {
41      $(".etn-content-item > .etn-accordion-heading i")
42        .removeClass("etn-minus")
43        .addClass("etn-plus");
44      $(this).find("i").removeClass("etn-plus").addClass("etn-minus");
45      $(".etn-content-item > .etn-accordion-heading").removeClass("active");
46      $(this).addClass("active");
47      $(".etn-acccordion-contents").slideUp(200);
48      $(this).siblings(".etn-acccordion-contents").slideDown(200);
49    }
50  });
51
52  /*================================
53      // countdown 
54    ===================================*/
55  const main_block = $(".count_down_block");
56  if (main_block.length) {
57    count_down($, main_block);
58  }
59
60  /*================================
61      // Advanced search toggle
62    ===================================*/
63  if ($(".etn-filter-icon").length > 0) {
64    $(".etn-filter-icon").on("click", function () {
65      $(this).parents().find(".etn_event_inline_form_bottom").slideToggle();
66    });
67  }
68
69  /*================================
70       // Certificate generate
71    ===================================*/
72  const certificateButton = $(".etn-certificate-download");
73  certificateButton.on("click", function (e) {
74    e.preventDefault();
75    etnCreateCertificate(certificateButton);
76  });
77
78  /*====================================================
79   * // Event bulk attendee field value update script
80   * ====================================================*/
81  $("#etn_bulk_attendee").on("change", function () {
82    const totalVariations = $(".etn-ticket-single-variation-details").length;
83    const submitButton = $(".attendee_submit");
84    const isChecked = $(this).is(":checked");
85    const checkbox = $(this);
86    checkbox.prop("checked", isChecked);
87
88    for (
89      let variationIndex = 0;
90      variationIndex < totalVariations;
91      variationIndex++
92    ) {
93      const totalTicketQuantity = checkbox.data(`total_ticket_quantity`);
94
95      for (
96        let quantityIndex = 0;
97        quantityIndex < totalTicketQuantity;
98        quantityIndex++
99      ) {
100        const element = quantityIndex + 1;
101        const nameElement = $(
102          `#ticket_${variationIndex}_attendee_name_${element}`
103        );
104        const emailElement = $(
105          `#ticket_${variationIndex}_attendee_email_${element}`
106        );
107        const phoneElement = $(
108          `#ticket_${variationIndex}_attendee_phone_${element}`
109        );
110        const fields = [nameElement, emailElement, phoneElement];
111
112        fields.forEach((field) => {
113          if (isChecked) {
114            field.removeClass("attendee_error");
115            const fieldType = field.attr("type");
116            if (fieldType === "email") {
117              emailElement.val(`attendee${element}@test.com`);
118            } else if (fieldType === "tel") {
119              field.val(`0123456789${element}`);
120            } else {
121              field.val(`Attendee ${element}`);
122            }
123          } else {
124            field.val("").addClass("attendee_error");
125          }
126        });
127      }
128    }
129    submitButton
130      .prop("disabled", !isChecked)
131      .toggleClass("attendee_submit_disable", !isChecked);
132  });
133});
134
135// etnCreateCertificate.js
136async function generateCertificateImage(element) {
137  // Wait for all images to load first
138  await Promise.all(
139    Array.from(element.querySelectorAll("img")).map((img) => {
140      if (img.complete) return Promise.resolve();
141      return new Promise((resolve) => {
142        img.onload = resolve;
143        img.onerror = resolve;
144      });
145    })
146  );
147
148  // Use html2canvas with proper config
149  const canvas = await window.html2canvas(element, {
150    useCORS: true, // Handle cross-origin images
151    allowTaint: true, // Allow loading cross-origin images
152    scrollX: 0, // Ensure proper positioning
153    scrollY: 0,
154    scale: 1.5, // Higher quality
155    logging: true, // Help debug issues
156    width: element.offsetWidth,
157    height: element.offsetHeight,
158    backgroundColor: "#ffffff", // Ensure white background
159  });
160
161  return canvas.toDataURL("image/png");
162}
163
164async function etnCreateCertificate(downloadButton) {
165  'use strict';
166
167  const jsPDF = window.jspdf.jsPDF;
168
169  if(downloadButton) downloadButton.addClass("loading");
170
171  // Try both new and legacy selectors
172  const element =
173  document.querySelector(".etn-downloadable-container") || document.querySelector(".eventin-container-block") ||
174  document.querySelector(".etn-pdf-content");
175 if (!element) {
176   throw new Error("Certificate container not found");
177 }
178
179 	// Wait for all images to load
180   await Promise.all(
181		Array.from(element.querySelectorAll('img')).map((img) => {
182			if (img.complete) return Promise.resolve();
183			return new Promise((resolve) => {
184				img.onload = resolve;
185				img.onerror = resolve;
186			});
187		})
188	);
189
190  try {
191    
192    // Get dimensions from element
193    const computedStyle = window.getComputedStyle(element);
194    const elementWidth = element.offsetWidth || parseFloat(computedStyle.width);
195    const elementHeight =
196      element.offsetHeight || parseFloat(computedStyle.height);
197
198    const dataUrl = await generateCertificateImage(element);
199    const img = new Image();
200
201    return new Promise((resolve) => {
202      img.onload = () => {
203      
204        const orientation = elementWidth > elementHeight ? "l" : "p";
205
206        const doc = new jsPDF({
207          orientation,
208          unit: "px",
209          format: "a4",
210        });
211
212        const pageWidth = doc.internal.pageSize.getWidth();
213        const pageHeight = doc.internal.pageSize.getHeight();
214
215        const scale = Math.min(
216          (pageWidth - 20) / elementWidth,
217          (pageHeight - 20) / elementHeight
218        );
219
220        const width = elementWidth * scale;
221        const height = elementHeight * scale;
222
223        const x = (pageWidth - width) / 2;
224        const y = (pageHeight - height) / 2;
225
226        doc.addImage(img, "PNG", x, y, width, height,undefined, "FAST");
227        const filename = `document-${new Date().toISOString().slice(0, 10)}.pdf`;
228        doc.save(filename);
229        downloadButton.removeClass("loading");
230      };
231
232      img.onerror = (error) => {
233        console.error("Certificate image generation failed:", error);
234        downloadButton.removeClass("loading");
235        resolve(false);
236      };
237
238      img.src = dataUrl;
239    });
240  } catch (error) {
241    console.error("Certificate generation failed:", error);
242    downloadButton.removeClass("loading");
243  }
244}
245
246// Event Countdown Function
247
248function count_down($, $scope) {
249  const countdownContainer = $scope.find(".etn-event-countdown-wrap");
250  if (countdownContainer.length) {
251    $scope.find(".etn-countdown-parent").countdown({
252      date: countdownContainer.data("start-date"),
253      day: countdownContainer.data("date-texts").day,
254      days: countdownContainer.data("date-texts").days,
255      hour: countdownContainer.data("date-texts").hr,
256      hours: countdownContainer.data("date-texts").hrs,
257      minute: countdownContainer.data("date-texts").min,
258      minutes: countdownContainer.data("date-texts").mins,
259      second: countdownContainer.data("date-texts").sec,
260      seconds: countdownContainer.data("date-texts").secs,
261      hideOnComplete: true,
262      offset: countdownContainer.data("date-texts").offset,
263    });
264  }
265}
266
267// print order details
268function etn_pro_pirnt_content_area(divContents) {
269  "use strict";
270  var mywindow = window.open("", "PRINT", "height=400,width=800");
271  mywindow.document.write(
272    '<style type="text/css">' +
273      ".woocommerce-column--1, .woocommerce-column--2{display:inline-block; float: none; width: 300px; vertical-align: top;}  .woocommerce-table tr th{text-align:left; width: 300px; }" +
274      "</style>"
275  );
276
277  var contentToPrint =
278    document.getElementsByClassName(divContents)[0].innerHTML;
279  contentToPrint = contentToPrint.split('<div class="extra-buttons">')[0];
280  mywindow.document.write("</head><body >");
281  mywindow.document.write(contentToPrint);
282  mywindow.document.write("</body></html>");
283  mywindow.document.close(); // necessary for IE >= 10
284  mywindow.focus(); // necessary for IE >= 10*/
285  mywindow.print();
286  return true;
287}
288
289//download pdf
290function etn_pro_download_pdf() {
291  var contentToPrint =
292    document.getElementsByClassName("woocommerce-order")[0].innerHTML;
293  var source = contentToPrint.split('<div class="extra-buttons">')[0];
294  var filename = "invoice";
295  jQuery(".woocommerce-order").html(source);
296  var divToPrint = jQuery(".woocommerce-order")[0];
297
298  // create custom canvas for a better resolution
299  var w = 1000;
300  var h = 1000;
301  var canvas = document.createElement("canvas");
302  canvas.width = w * 5;
303  canvas.height = h * 5;
304  canvas.style.width = w + "px";
305  canvas.style.height = h + "px";
306  var context = canvas.getContext("2d");
307  context.scale(5, 5);
308
309  html2canvas(divToPrint, {
310    scale: 4,
311    dpi: 288,
312    onrendered: function (canvas) {
313      var data = canvas.toDataURL("image/png", 1);
314      var docDefinition = {
315        content: [
316          {
317            image: data,
318            width: 500,
319          },
320        ],
321      };
322      pdfMake.createPdf(docDefinition).download(filename + ".pdf");
323    },
324  });
325  window.setTimeout(function () {
326    location.reload();
327  }, 500);
328}
329
330function getSwiperOption({ count, space, autoplays }) {
331  return {
332    slidesPerView: count,
333    spaceBetween: space,
334    navigation: {
335      nextEl: ".swiper-button-next",
336      prevEl: ".swiper-button-prev",
337    },
338    pagination: {
339      el: ".swiper-pagination",
340      clickable: true,
341    },
342    autoplay: autoplays,
343
344    paginationClickable: true,
345    breakpoints: {
346      320: {
347        slidesPerView: 1,
348      },
349      600: {
350        slidesPerView: 2,
351      },
352      1024: {
353        slidesPerView: count,
354      },
355    },
356  };
357}
358
359// speaker sliders pro
360function speaker_sliders_pro($, $scope) {
361  var $container = $scope.find(".etn-speaker-slider");
362  var count = $container.data("count");
363  var space = $container.data("space");
364  var autoplay = $container.data("autoplay");
365  var autoplays = autoplay == "yes" ? true : false;
366
367  if ($container.length > 0) {
368    $($container).each(function (index, element) {
369      var mySwiper = new Swiper(
370        element,
371        getSwiperOption({ count, space: 20, autoplays })
372      );
373    });
374  }
375}
376
377// Event sliders pro
378function event_sliders_pro($, $scope) {
379  var $container = $scope.find(".etn-event-slider");
380  var count = $container.data("count");
381  var autoplay = $container.data("autoplay");
382  var autoplays = autoplay == "yes" ? true : false;
383  if ($container.length > 0) {
384    $($container).each(function (index, element) {
385      var mySwiper = new Swiper(
386        element,
387        getSwiperOption({ count, space: 20, autoplays })
388      );
389    });
390  }
391}

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.