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.