1/** 2 * @package EmbedPress 3 * @author EmbedPress <[email protected]> 4 * @copyright Copyright (C) 2023 EmbedPress. All rights reserved. 5 * @license GPLv2 or later 6 * @since 1.7.0 7 */ 8 9 10 11let epGlobals = {}; 12 13(function ($) { 14 'use strict'; 15 // function equivalent to jquery ready() 16 function ready(fn) { 17 if (document.readyState !== 'loading') { 18 fn(); 19 } else { 20 document.addEventListener('DOMContentLoaded', fn); 21 } 22 } 23 24 ready(function () { 25 let option = { 26 forceObject: true, 27 }; 28 let selector = document.querySelectorAll('.embedpress-embed-document-pdf'); 29 if (selector.length) { 30 selector.forEach((function (value, index, thisArg) { 31 let id = value.dataset['emid']; 32 let src = value.dataset['emsrc']; 33 PDFObject?.embed(src, "." + id, option); 34 })); 35 } 36 if (typeof epGlobals.youtubeChannelGallery === 'function') { 37 epGlobals.youtubeChannelGallery(); 38 } 39 }); 40 41 /** 42 * 43 * Make embeds responsive so they don't overflow their container. 44 */ 45 46 /** 47 * Add max-width & max-height to <iframe> elements, depending on their width & height props. 48 * 49 * 50 * @return {void} 51 */ 52 function embedPressResponsiveEmbeds() { 53 var proportion, parentWidth; 54 55 // Loop iframe elements. 56 document.querySelectorAll('iframe').forEach(function (iframe) { 57 // Only continue if the iframe has a width & height defined. 58 if (iframe.width && iframe.height) { 59 // Calculate the proportion/ratio based on the width & height. 60 proportion = parseFloat(iframe.width) / parseFloat(iframe.height); 61 // Get the parent element's width. 62 parentWidth = parseFloat(window.getComputedStyle(iframe.parentElement, null).width.replace('px', '')); 63 // Set the max-width & height. 64 iframe.style.maxWidth = '100%'; 65 iframe.style.maxHeight = Math.round(parentWidth / proportion).toString() + 'px'; 66 } 67 }); 68 } 69 70 epGlobals.handlePosterImageLoad = function () { 71 var posterImages = document.querySelectorAll(".plyr__poster"); 72 posterImages.forEach(function (posterImage) { 73 if (posterImage) { 74 var videoWrappers = document.querySelectorAll("[data-playerid]"); 75 videoWrappers.forEach(function (videoWrapper) { 76 var observer = new MutationObserver(function (mutationsList, observer) { 77 var posterImageStyle = window.getComputedStyle(posterImage); 78 if (posterImageStyle.getPropertyValue('background-image') !== 'none') { 79 setTimeout(function () { 80 videoWrapper.style.opacity = "1"; 81 }, 200); 82 observer.disconnect(); 83 } 84 }); 85 86 observer.observe(posterImage, { attributes: true, attributeFilter: ['style'] }); 87 }); 88 } 89 }); 90 } 91 92 93 94 // Run on initial load. 95 embedPressResponsiveEmbeds(); 96 97 // Run on resize. 98 window.onresize = embedPressResponsiveEmbeds; 99 100 101 function hasClass(ele, cls) { 102 return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); 103 } 104 105 function addClass(ele, cls) { 106 if (!hasClass(ele, cls)) ele.className += " " + cls; 107 } 108 109 function removeClass(ele, cls) { 110 if (hasClass(ele, cls)) { 111 var reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); 112 ele.className = ele.className.replace(reg, " "); 113 } 114 } 115 if (!Element.prototype.matches) { 116 Element.prototype.matches = 117 Element.prototype.matchesSelector || 118 Element.prototype.webkitMatchesSelector || 119 Element.prototype.mozMatchesSelector || 120 Element.prototype.msMatchesSelector || 121 Element.prototype.oMatchesSelector || 122 function (s) { 123 var matches = (this.document || this.ownerDocument).querySelectorAll(s), 124 i = matches.length; 125 while (--i >= 0 && matches.item(i) !== this) { } 126 return i > -1; 127 }; 128 } 129 var delegate = function (el, evt, sel, handler) { 130 el.addEventListener(evt, function (event) { 131 var t = event.target; 132 while (t && t !== this) { 133 if (t.matches(sel)) { 134 handler.call(t, event); 135 } 136 t = t.parentNode; 137 } 138 }); 139 }; 140 141 function sendRequest(url, postData, callback) { 142 var req = createXMLHTTPObject(); 143 if (!req) return; 144 var method = postData ? "POST" : "GET"; 145 req.open(method, url, true); 146 if (postData) { 147 req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 148 } 149 req.onreadystatechange = function () { 150 if (req.readyState != 4) return; 151 if (req.status != 200 && req.status != 304) { 152 return; 153 } 154 callback(req); 155 }; 156 if (req.readyState == 4) return; 157 req.send(postData); 158 } 159 160 var XMLHttpFactories = [ 161 function () { 162 return new XMLHttpRequest(); 163 }, 164 function () { 165 return new ActiveXObject("Msxml3.XMLHTTP"); 166 }, 167 function () { 168 return new ActiveXObject("Msxml2.XMLHTTP.6.0"); 169 }, 170 function () { 171 return new ActiveXObject("Msxml2.XMLHTTP.3.0"); 172 }, 173 function () { 174 return new ActiveXObject("Msxml2.XMLHTTP"); 175 }, 176 function () { 177 return new ActiveXObject("Microsoft.XMLHTTP"); 178 }, 179 ]; 180 181 function createXMLHTTPObject() { 182 var xmlhttp = false;
183 for (var i = 0; i < XMLHttpFactories.length; i++) { 184 try { 185 xmlhttp = XMLHttpFactories[i](); 186 } catch (e) { 187 continue; 188 } 189 break; 190 } 191 return xmlhttp; 192 } 193 194 epGlobals.youtubeChannelGallery = function () { 195 var playerWraps = document.getElementsByClassName("ep-player-wrap"); 196 if (playerWraps && playerWraps.length) { 197 for (var i = 0, im = playerWraps.length; im > i; i++) { 198 youtubeChannelEvents(playerWraps[i]) 199 } 200 } 201 } 202 203 function youtubeChannelEvents(playerWrap) { 204 205 delegate(playerWrap, "click", ".item", function (event) { 206 var embed = "https://www.youtube.com/embed/"; 207 var vid = this.getAttribute("data-vid"); 208 var iframe = playerWrap.getElementsByTagName("iframe"); 209 if (vid) { 210 if (iframe) { 211 var vidSrc = iframe[0].src.replace(/(.*\/embed\/)([^\?&"'>]+)(.+)?/, `\$1${vid}\$3`); 212 if (vidSrc.indexOf('autoplay') > 0) { 213 vidSrc = vidSrc.replace('autoplay=0', 'autoplay=1'); 214 } 215 else { 216 vidSrc += '&autoplay=1'; 217 } 218 iframe[0].src = vidSrc; 219 playerWrap.scrollIntoView(); 220 } 221 } 222 }); 223 224 var currentPage = 1; 225 226 let nearestEpContentId = playerWrap.querySelector('.ep-youtube__content__block').getAttribute('data-unique-id'); 227 228 let epContentBlock = playerWrap.querySelector('.ep-youtube__content__block'); 229 let parentElement = epContentBlock.parentElement; 230 231 // Get the value of data-channel-url attribute from a sibling 232 let channelUrl = parentElement.querySelector('[data-channel-url]').getAttribute('data-channel-url'); 233 234 235 delegate(playerWrap, "click", ".ep-next, .ep-prev", function (event) { 236 const totalPages = event.target.closest('.ose-youtube').getAttribute('data-total-pages'); 237 const closestClass = event.target.closest('.ose-youtube').classList; 238 239 const activePage = document.querySelector(`.${closestClass[1]} .embedpress-page-active`); 240 if (activePage) { 241 document.querySelector(`.${closestClass[1]} .embedpress-page-active`).classList.remove('embedpress-page-active'); 242 } 243 244 245 246 var isNext = this.classList.contains("ep-next"); 247 248 if (isNext) { 249 currentPage++; 250 } else { 251 currentPage--; 252 } 253 254 var data = { 255 action: "youtube_rest_api", 256 playlistid: this.getAttribute("data-playlistid"), 257 pagetoken: this.getAttribute("data-pagetoken"), 258 pagesize: this.getAttribute("data-pagesize"), 259 channelUrl: channelUrl, 260 currentpage: currentPage 261 }; 262 263 var formBody = []; 264 for (var property in data) { 265 var encodedKey = encodeURIComponent(property); 266 var encodedValue = encodeURIComponent(data[property]); 267 formBody.push(encodedKey + "=" + encodedValue); 268 } 269 formBody = formBody.join("&"); 270 271 var galleryWrapper = playerWrap.getElementsByClassName( 272 "ep-youtube__content__block" 273 ); 274 275 playerWrap.setAttribute('data-current-page', currentPage); 276 277 278 let x = 1; 279 280 sendRequest("/wp-admin/admin-ajax.php", formBody, function (request) { 281 if (galleryWrapper && galleryWrapper[0] && request.responseText) { 282 var response = JSON.parse(request.responseText); 283 galleryWrapper[0].outerHTML = response.html; 284 285 var currentPageNode = 286 galleryWrapper[0].getElementsByClassName("current-page"); 287 if (currentPageNode && currentPageNode[0]) { 288 currentPageNode[0].textContent = currentPage; 289 290 } 291 } 292 }); 293 294 const intervalID = setInterval(() => { 295 x++ 296 297 if (playerWrap.querySelector('.ep-youtube__content__block')) { 298 const newNearestEpContentId = playerWrap 299 .querySelector('.ep-youtube__content__block') 300 .getAttribute('data-unique-id'); 301 302 if (newNearestEpContentId !== nearestEpContentId && playerWrap.querySelector(`[data-
302page="${currentPage}"]`)) { 303 playerWrap.querySelector(`[data-page="${currentPage}"]`).classList.add('embedpress-page-active'); 304 nearestEpContentId = newNearestEpContentId; 305 clearInterval(intervalID); 306 } 307 } 308 309 if (x > 100) { 310 clearInterval(intervalID); 311 } 312 }, 100); 313 314 }); 315 } 316 317 //Load more for OpenaSea collection 318 const epLoadMore = () => { 319 320 $('.embedpress-gutenberg-wrapper .ep-nft-gallery-wrapper').each(function () { 321 let selctorEl = `[data-nftid='${$(this).data('nftid')}']`; 322 323 let loadmorelabel = $(selctorEl).data('loadmorelabel'); 324 let iconcolor = $(selctorEl + " .nft-loadmore").data('iconcolor'); 325 326 let spinicon = `<svg width="18" height="18" fill="${iconcolor || '#fff'}" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.spinner_GuJz{transform-origin:center;animation:spinner_STY6 1.5s linear infinite}@keyframes spinner_STY6{100%{transform:rotate(360deg)}}</style><g class="spinner_GuJz"><circle cx="3" cy="12" r="2"/><circle cx="21" cy="12" r="2"/><circle cx="12" cy="21" r="2"/><circle cx="12" cy="3" r="2"/><circle cx="5.64" cy="5.64" r="2"/><circle cx="18.36" cy="18.36" r="2"/><circle cx="5.64" cy="18.36" r="2"/><circle cx="18.36" cy="5.64" r="2"/></g></svg>`; 327 328 $(selctorEl + ` .ep_nft_item`).slice(0, $(selctorEl).data('itemparpage')).show(); 329 $('.embedpress-gutenberg-wrapper .ep-nft-gallery-wrapper .ep-loadmore-wrapper button').css('display', 'flex'); 330 331 $(selctorEl + " .nft-loadmore").click(function (e) { 332 //change the text of the button 333 $(this).html(loadmorelabel + spinicon); 334 //disable the button 335 $(this).prop("disabled", true); 336 //wait for 1 seconds 337 setTimeout(function () { 338 //change the text back 339 $(selctorEl + " .nft-loadmore").text(loadmorelabel); 340 //enable the button 341 $(selctorEl + " .nft-loadmore").prop("disabled", false); 342 $(selctorEl + " .ep_nft_item:hidden").slice(0, $(selctorEl).data('itemparpage')).fadeIn("slow"); 343 if ($(selctorEl + " .ep_nft_item:hidden").length == 0) { 344 $(selctorEl + " .nft-loadmore").fadeOut("slow"); 345 } 346 }, 500); 347 }); 348 }); 349 }; 350 351 if ($('.embedpress-gutenberg-wrapper .ep-nft-gallery-wrapper').length > 0) { 352 epLoadMore(); 353 } 354 355 // Content protection system function 356 const unlockSubmitHander = (perentSel, that) => { 357 var ep_client_id = jQuery(that).closest('form').find('input[name="ep_client_id"]').val(); 358 var password = jQuery(`input[name="pass_${ep_client_id}"]`).val(); 359 var post_id = jQuery(`input[name="post_id"]`).val(); 360 const buttonText = jQuery(that).closest('.password-form-container').find('input[type="submit"]').val(); 361 const unlokingText = jQuery(that).data('unlocking-text'); 362 363 364 var data = { 365 'action': 'lock_content_form_handler', 366 'client_id': ep_client_id, 367 'password': password, 368 'post_id': post_id, 369 }; 370 371 jQuery('#' + perentSel + '-' + ep_client_id + ' .password-form input[type="submit"]').val(unlokingText); 372 373 jQuery.post(eplocalize.ajaxurl, data, function (response) { 374 if (response.success) { 375 if (!response.embedHtml) { 376 377 jQuery('#' + perentSel + '-' + ep_client_id + ' .password-form input[type="submit"]').val(buttonText); 378 jQuery('#' + perentSel + '-' + ep_client_id + ' .password-form input[type="password"]').val(''); 379 jQuery(that).closest('.password-form-container').find('.error-message').removeClass('hidden'); 380 } 381 else { 382 jQuery('#' + perentSel + '-' + ep_client_id + ' .ep-embed-content-wraper').html(response.embedHtml); 383 384 if (jQuery('#' + perentSel + '-' + ep_client_id + ' .ose-youtube').length > 0) { 385 epGlobals.youtubeChannelGallery(); 386 } 387 388 if ($('.embedpress-gutenberg-wrapper .ep-nft-gallery-wrapper').length > 0) { 389 epLoadMore(); 390 } 391 392 // Custom player initialization when content protection enabled 393 document.querySelector('#' + perentSel + '-' + ep_client_id + ' .ep-embed-content-wraper').classList.remove('plyr-initialized'); 394 395 initPlayer(document.querySelector('#' + perentSel + '-' + ep_client_id + ' .ep-embed-content-wraper')); 396 397 if (eplocalize.is_pro_plugin_active) { 398 const adIdEl = document.querySelector('#' + perentSel + '-' + ep_client_id + ' [data-sponsored-id]'); 399 adInitialization(adIdEl, adIdEl?.getAttribute('data-ad-index')); 400 } 401 402 } 403 } else { 404 jQuery('#password-error_' + ep_client_id).html(response.form); 405 jQuery('#password-error_' + ep_client_id).show(); 406 } 407 }, 'json'); 408 } 409 410 // unlockSubmitHander called for gutentberg 411 jQuery('.ep-gutenberg-content .password-form').submit(function (e) { 412 e.preventDefault(); // Prevent the default form submission 413 unlockSubmitHander('ep-gutenberg-content', this); 414 }); 415 416 window.addEventListener('load', function (e) {
417 const urlParams = new URLSearchParams(window.location.search); 418 const hash = urlParams.get('hash'); 419 420 // find the element with the matching id 421 const element = document.getElementById(hash); 422 423 if (element) { 424 element.scrollIntoView({ behavior: 'smooth' }); 425 } 426 427 }); 428 429 // Get the insta-gallery container element 430 const getPopupTemplate = (instPost, hashtag = '', accountType) => { 431 432 let instaPostData = JSON.parse(instPost); 433 434 435 let likeIcon = '<svg aria-label="Like" class="x1lliihq x1n2onr6" color="#262626" fill="#262626" height="24" viewBox="0 0 24 24" width="24"><path d="M16.792 3.904A4.989 4.989 0 0 1 21.5 9.122c0 3.072-2.652 4.959-5.197 7.222-2.512 2.243-3.865 3.469-4.303 3.752-.477-.309-2.143-1.823-4.303-3.752C5.141 14.072 2.5 12.167 2.5 9.122a4.989 4.989 0 0 1 4.708-5.218 4.21 4.21 0 0 1 3.675 1.941c.84 1.175.98 1.763 1.12 1.763s.278-.588 1.11-1.766a4.17 4.17 0 0 1 3.679-1.938m0-2a6.04 6.04 0 0 0-4.797 2.127 6.052 6.052 0 0 0-4.787-2.127A6.985 6.985 0 0 0 .5 9.122c0 3.61 2.55 5.827 5.015 7.97.283.246.569.494.853.747l1.027.918a44.998 44.998 0 0 0 3.518 3.018 2 2 0 0 0 2.174 0 45.263 45.263 0 0 0 3.626-3.115l.922-.824c.293-.26.59-.519.885-.774 2.334-2.025 4.98-4.32 4.98-7.94a6.985 6.985 0 0 0-6.708-7.218Z"/></svg>'; 436 437 if (instaPostData.like_count > 0) { 438 likeIcon = '<svg aria-label="Unlike" class="x1lliihq x1n2onr6" color="#FF3040" fill="#FF3040" height="24" viewBox="0 0 48 48" width="24"><path d="M34.6 3.1c-4.5 0-7.9 1.8-10.6 5.6-2.7-3.7-6.1-5.5-10.6-5.5C6 3.1 0 9.6 0 17.6c0 7.3 5.4 12 10.6 16.5.6.5 1.3 1.1 1.9 1.7l2.3 2c4.4 3.9 6.6 5.9 7.6 6.5.5.3 1.1.5 1.6.5s1.1-.2 1.6-.5c1-.6 2.8-2.2 7.8-6.8l2-1.8c.7-.6 1.3-1.2 2-1.7C42.7 29.6 48 25 48 17.6c0-8-6-14.5-13.4-14.5z"/></svg>'; 439 } 440 441 const commentsIcon = '<svg aria-label="Comment" class="x1lliihq x1n2onr6" color="#000" height="24" viewBox="0 0 24 24" width="24"><path d="M20.656 17.008a9.993 9.993 0 1 0-3.59 3.615L22 22Z" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/></svg>'; 442 443 const shareIcon = '<svg width="20" height="20" viewBox="0 0 0.6 0.6" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg"><path stroke-width="1" d="m.543.282-.2-.2A.025.025 0 0 0 .3.1v.089a.275.275 0 0 0-.25.274V.5a.025.025 0 0 0 .045.015.3.3 0 0 1 .197-.101L.3.413V.5a.025.025 0 0 0 .043.018l.2-.2a.025.025 0 0 0 0-.035M.35.44V.388A.025.025 0 0 0 .325.363L.286.365a.35.35 0 0 0-.185.074.225.225 0 0 1 .224-.201A.025.025 0 0 0 .35.213V.16L.49.3Z"/></svg>'; 444 445 const instaIcon = '<svg width="18" height="18" viewBox="0 0 0.338 0.338" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M.248.079H.27M.102.012h.135a.09.09 0 0 1 .09.09v.135a.09.09 0 0 1-.09.09H.102a.09.09 0 0 1-.09-.09V.102a.09.09 0 0 1 .09-.09ZM.17.237a.068.068 0 1 1 0-.135.068.068 0 0 1 0 .135Z" stroke="#000" stroke-width=".032"/></svg>'; 446 447 448 449 const instaUserInfo = instPost.user_info; 450 451 let getDate = new Date(instaPostData.timestamp); 452 getDate = getDate.toLocaleString('en-US', { day: 'numeric', month: 'short', year: 'numeric' }); 453 454 let getTime = new Date(instaPostData.timestamp); 455 getTime = getTime.toLocaleString('en-US', { hour12: false, hour: 'numeric', minute: 'numeric', second: 'numeric' }); 456 457 let captionText = instaPostData.caption ? instaPostData.caption : ''; 458 const tagRegex = /(#\w+)/g; 459 460 const wrapTag = (match) => { 461 const tag = match.substring(1); // Remove the '#' character 462 const tagUrl = `https://www.instagram.com/explore/tags/${tag}`; 463 return `<span class="tag-wrapper"><a target="_blank" href="${tagUrl}">${match}</a></span>`; 464 }; 465 466 captionText = captionText.replace(tagRegex, wrapTag); 467 468 let carouselTemplate = ''; 469 if (instaPostData.media_type === 'CAROUSEL_ALBUM') { 470 carouselTemplate += `<div class="popup-carousel"><div class="cg-carousel__track js-carousel__track">`; 471 472 instaPostData.children.data?.map((item) => { 473 if (item.media_type?.toLowerCase() === 'video') { 474 carouselTemplate += `<video width="630" class="popup-media-image cg-carou
474sel__slide js-carousel__slide" controls src="${item.media_url || ''}" alt="${item.caption || ''}" controlsList="nodownload"></video>`; 475 } 476 else { 477 carouselTemplate += `<img width="630" class="popup-media-image cg-carousel__slide js-carousel__slide" src="${item.media_url || ''}" alt="${item.caption || ''}" />`; 478 } 479 }); 480 481 carouselTemplate += `</div></div>`; 482 483 carouselTemplate += `<div class="cg-carousel__btns"> 484 <button class="cg-carousel__btn js-carousel__prev-1"><svg width="20" height="30" viewBox="-5 0 23 23" xmlns="http://www.w3.org/2000/svg"><path d="M11.24.29.361 10.742l-.06.054a.97.97 0 0 0-.301.642v.124a.97.97 0 0 0 .3.642l.054.044L11.239 22.71a1.061 1.061 0 0 0 1.459 0 .964.964 0 0 0 0-1.402l-10.15-9.746 10.15-9.87a.964.964 0 0 0 0-1.402 1.061 1.061 0 0 0-1.459 0Z" fill="#fff"/></svg></button> 485 486 <button class="cg-carousel__btn js-carousel__next-1"><svg width="20" height="30" viewBox="-5 0 23 23" xmlns="http://www.w3.org/2000/svg"><path d="m1.76.29 10.879 10.452.06.054a.97.97 0 0 1 .301.642v.124a.97.97 0 0 1-.3.642l-.054.044L1.761 22.71a1.061 1.061 0 0 1-1.459 0 .964.964 0 0 1 0-1.402l10.15-9.746-10.15-9.87a.964.964 0 0 1 0-1.402 1.061 1.061 0 0 1 1.459 0Z" fill="#fff"/></svg></button> 487 </div>` 488 } 489 else { 490 if (instaPostData.media_type?.toLowerCase() === 'video') { 491 carouselTemplate += `<video width="630" class="popup-media-image" controls src="${instaPostData.media_url || ''}" alt="${instaPostData.caption || ''}"></video>`; 492 } 493 else { 494 carouselTemplate += `<img width="630" class="popup-media-image" src="${instaPostData.media_url || ''}" alt="${instaPostData.caption || ''}" />`; 495 } 496 } 497 498 let srcUrl = `https://www.instagram.com/${instaPostData.username}/`; 499 500 if (hashtag) { 501 instaPostData.username = '#' + hashtag; 502 srcUrl = `https://www.instagram.com/explore/tags/${hashtag}/`; 503 } 504 505 506 let likeComments = ''; 507 508 if (eplocalize.is_pro_plugin_active && accountType === 'business') { 509 if (instaPostData.show_likes_count == 'true') { 510 likeComments += ` 511 <div class="embedpress-inline popup-like-button"><a target="_blank" href="${instaPostData.permalink}">${likeIcon} ${instaPostData.like_count || 0}</a></div> 512 `; 513 } 514 if (instaPostData.show_comments_count == 'true') { 515 likeComments += ` 516 <div class="embedpress-inline"><a target="_blank" href="${instaPostData.permalink}">${commentsIcon} ${instaPostData.comments_count || 0}</a></div> 517 `; 518 } 519 } 520 521 522 let followBtn = ''; 523 if (instaPostData.popup_follow_button_text == 'false') { 524 instaPostData.popup_follow_button_text = ''; 525 } 526 if (instaPostData.popup_follow_button == 'true' || instaPostData.popup_follow_button == 'yes') { 527 followBtn = `<div class="insta-followbtn"> 528 <a target="_new" href="${srcUrl}" type="button" class="btn btn-primary">${instaPostData.popup_follow_button_text}</a> 529 </div>`; 530 } 531 532 let popupHtml = ''; 533 popupHtml += ` 534 <div class="popup-container"> 535 <div class="popup-md-9 white"> 536 <div class="embedpress-popup-block embedpress-popup-img" id="post-${instaPostData.id}"> 537 ${carouselTemplate} 538 </div> 539 </div> 540 <div class="popup-md-3 red"> 541 <div class="embedpress-popup-block embedpress-popup-info"> 542 <div class="embedpress-popup-header"> 543 <div class="embedpress-popup-header-img"> <a target="_blank" href="${srcUrl}" 544 target="_blank" class="embedpress-href"> 545 <img decoding="async" loading="lazy" class="embedpress-popup-round" src="${instaPostData.profile_picture_url}" width="30" height="30"> <span class="embedpress-popup-username">${instaPostData.username}</span> 546 </a> 547 </div> 548 ${followBtn} 549 </div> 550 <div class="embedpress-popup-text">${captionText}</div> 551 <div class="embedpress-popup-stats"> 552 ${likeComments} 553 <div class="embedpress-inline"> 554 <div class="embedpress-popup-share-buttons"> <a 555 href="https://www.facebook.com/sharer/sharer.php?u=${instaPostData.permalink}" target="_blank">
556 <span class="dashicons dashicons-facebook"></span></a> <a 557 href="https://twitter.com/intent/tweet?url=${instaPostData.permalink}" 558 target="_blank"><span> 559 <svg viewBox="0 0 18 18" aria-hidden="true" class="r-4qtqp9 r-yyyyoo r-dnmrzs r-bnwqim r-1plcrui r-lrvibr r-lrsllp r-18jsvk2 r-16y2uox r-8kz0gk" width="18" height="18"><path d="M13.683 1.688h2.481l-5.42 6.195 6.377 8.43h-4.993L8.217 11.2l-4.474 5.113H1.26l5.798-6.626L.941 1.688H6.06l3.535 4.673zm-.871 13.14h1.375L5.313 3.095H3.838z"/></svg> 560 </span></a> 561 <a href="https://www.linkedin.com/shareArticle?mini=true&url=${instaPostData.permalink}" 562 target="_blank"><span class="dashicons dashicons-linkedin"></span></a> <a 563 href="https://pinterest.com/pin/create/button/?url=${instaPostData.permalink}" 564 target="_blank"><span class="dashicons dashicons-pinterest"></span></a></div> 565 <div class="embedpress-href embedpress-popup-share">${shareIcon}</div> 566 </div><div class="embedpress-inline embedpress-popup-instagram-buttons"><a 567 href="${instaPostData.permalink}" target="_blank" 568 class="embedpress-href">${instaIcon}</a></div> 569 </div> 570 571 </div> 572 </div> 573 </div> 574 `; 575 576 // INIT CAROUSEL 577 578 579 return popupHtml; 580 } 581 582 // Add a click event listener to the insta-gallery container 583 epGlobals.instaPopup = (container) => { 584 container?.addEventListener('click', function (event) { 585 // Check if the clicked element has the class insta-gallery-item 586 const instaItem = event.target.closest('.insta-gallery-item'); 587 588 if (instaItem) { 589 590 const postData = instaItem.dataset.postdata; 591 592 const postid = instaItem.getAttribute('data-insta-postid'); 593 const accountType = container?.closest('.instagram-container')?.getAttribute('data-connected-acc-type'); 594 595 let hashtag = ''; 596 597 if (instaItem.closest('.instagram-container').getAttribute('data-hashtag')) { 598 hashtag = instaItem?.closest('.instagram-container')?.getAttribute('data-hashtag'); 599 } 600 601 const closestPopup = event.target.closest('.ose-instagram-feed')?.querySelector('.insta-popup'); 602 603 if (closestPopup) { 604 closestPopup.style.display = 'block'; 605 } 606 607 608 var feedElement = event.target.closest('.ose-instagram-feed'); 609 if (feedElement) { 610 var popupElement = feedElement.querySelector('.popup-is-initialized'); 611 if (popupElement) { 612 popupElement.innerHTML = getPopupTemplate(postData, hashtag, accountType); 613 } 614 } 615 616 if (!document.querySelector(`#post-${postid}`)?.classList.contains('carousel-is-initialized')) { 617 const carousel = new CgCarousel(`#post-${postid}`, { slidesPerView: 1, loop: true }, {}); 618 619 const next = document.querySelector(`#post-${postid} .js-carousel__next-1`); 620 next?.addEventListener('click', () => carousel.next()); 621 622 const prev = document.querySelector(`#post-${postid} .js-carousel__prev-1`); 623 prev?.addEventListener('click', () => carousel.prev()); 624 625 document.querySelector(`#post-${postid}`)?.classList.add('carousel-is-initialized'); 626 } 627 628 } 629 }); 630 } 631 632 633 const instaContainers = document.querySelectorAll('.embedpress-gutenberg-wrapper .insta-gallery'); 634 if (instaContainers.length > 0) {
635 instaContainers.forEach((container) => { 636 epGlobals.instaPopup(container); 637 }); 638 } 639 640 $('.popup-close').click(function (e) { 641 // Hide the popup by setting display to none 642 $('.insta-popup').hide(); 643 $('.popup-container').remove(); 644 }); 645 646 $(document).on('click', function (e) { 647 if (e.target.classList.contains('popup-wrapper')) { 648 $('.insta-popup').hide(); 649 $('.popup-container').remove(); 650 } 651 }); 652 653 654 const instafeeds = document.querySelectorAll('.ose-instagram-feed'); 655 656 epGlobals.initializeTabs = (containerEl) => { 657 658 // Initial tab selection 659 showItems('ALL'); 660 661 containerEl.addEventListener('click', function (event) { 662 const clickedElement = event.target; 663 if (!clickedElement) { 664 return; // No element clicked, ignore the event 665 } 666 667 if (containerEl.querySelector('.load-more-button-container') && (clickedElement.getAttribute('data-media-type') === 'VIDEO' || clickedElement.getAttribute('data-media-type') === 'CAROUSEL_ALBUM')) { 668 containerEl.querySelector('.load-more-button-container').style.display = 'none'; 669 } 670 else if (containerEl.querySelector('.load-more-button-container') && (clickedElement.getAttribute('data-media-type') === 'ALL')) { 671 containerEl.querySelector('.load-more-button-container').style.display = 'flex'; 672 } 673 674 // Handle tab click 675 if (clickedElement.matches('.tabs li')) { 676 if (clickedElement.classList.contains('active')) { 677 return; 678 } else { 679 const mediaType = clickedElement.getAttribute('data-media-type'); 680 showItems(mediaType); 681 682 const tabs = containerEl.querySelectorAll('.tabs li');
683 tabs.forEach(t => t.classList.remove('active')); 684 clickedElement.classList.add('active'); 685 } 686 } 687 688 }); 689 690 function showItems(mediaType) { 691 const items = containerEl.getElementsByClassName('insta-gallery-item'); 692 for (let i = 0; i < items.length; i++) { 693 const item = items[i]; 694 if (mediaType === 'ALL' || item.getAttribute('data-media-type') === mediaType) { 695 item.style.display = 'block'; 696 } else { 697 item.style.display = 'none'; 698 } 699 } 700 } 701 } 702 703 epGlobals.instaLoadMore = () => { 704 // Unbind any previously bound click event to avoid multiple bindings 705 $('.insta-load-more-button').off('click').on('click', function (e) { 706 const that = $(this); 707 const loadmoreBtn = that.closest('.load-more-button-container'); 708 const loadmoreKey = loadmoreBtn.data('loadmorekey'); 709 const connectedAccount = that.closest('.instagram-container').data('connected-acc-type'); 710 const feedType = that.closest('.instagram-container').data('feed-type'); 711 const hashtagId = that.closest('.instagram-container').data('hashtag-id'); 712 const userId = that.closest('.instagram-container').data('uid'); 713 let loadedPosts = loadmoreBtn.data('loaded-posts') || 0; 714 let postsPerPage = loadmoreBtn.data('posts-per-page') || 0; 715 const params = JSON.stringify(that.closest('.instagram-container').data('params')); 716 717 718 const instaContainer = that.closest('.instagram-container'); 719 720 const spinicon = `<svg class="insta-loadmore-spinicon" width="18" height="18" fill="${'#fff'}" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.spinner_GuJz{transform-origin:center;animation:spinner_STY6 1.5s linear infinite}@keyframes spinner_STY6{100%{transform:rotate(360deg)}}</style><g class="spinner_GuJz"><circle cx="3" cy="12" r="2"/><circle cx="21" cy="12" r="2"/><circle cx="12" cy="21" r="2"/><circle cx="12" cy="3" r="2"/><circle cx="5.64" cy="5.64" r="2"/><circle cx="18.36" cy="18.36" r="2"/><circle cx="5.64" cy="18.36" r="2"/><circle cx="18.36" cy="5.64" r="2"/></g></svg>`; 721 722 // Check if no spinicon exists 723 if (instaContainer.find('.insta-loadmore-spinicon').length === 0) { 724 that.append(spinicon); 725 } 726 727 that.attr('disabled', true); 728 729 var data = { 730 'action': 'loadmore_data_handler', 731 'user_id': userId, 732 'loaded_posts': loadedPosts, 733 'posts_per_page': postsPerPage, 734 'feed_type': feedType, 735 'connected_account_type': connectedAccount,
736 'loadmore_key': loadmoreKey, 737 'params': params, 738 '_nonce': eplocalize.nonce 739 }; 740 741 if (feedType === 'hashtag_type') { 742 data.hashtag_id = hashtagId; 743 } 744 745 jQuery.post(eplocalize.ajaxurl, data, function (response) { 746 if (response.total_feed_posts >= response.next_post_index) { 747 var $responseHtml = $(response.html); 748 749 instaContainer.find('.insta-gallery').append($responseHtml); 750 that.removeAttr('disabled'); 751 752 instaContainer.find('.insta-loadmore-spinicon').remove(); 753 754 loadedPosts = response.next_post_index; 755 756 loadmoreBtn.data('loaded-posts', loadedPosts); 757 758 // After loading more items, reinitialize the tabs for the specific container 759 const containerEl = loadmoreBtn.closest('.ose-instagram-feed')[0]; 760 epGlobals.initializeTabs(containerEl); 761 762 if (response.total_feed_posts === response.next_post_index) { 763 loadmoreBtn.remove(); 764 } 765 } else { 766 loadmoreBtn.remove(); 767 } 768 }); 769 }); 770 } 771 772 773 if (instafeeds.length > 0) { 774 instafeeds.forEach(function (feed) { 775 epGlobals.initializeTabs(feed); 776 }); 777 } 778 779 if ($('.embedpress-gutenberg-wrapper .ose-instagram-feed').length > 0) { 780 epGlobals.instaLoadMore(); 781 } 782 783 $(document).on({ 784 mouseenter: function () { 785 $('.embedpress-popup-share-buttons').addClass('show'); 786 }, 787 mouseleave: function () { 788 var buttons = $('.embedpress-popup-share-buttons'); 789 setTimeout(function () { 790 if (!buttons.is(':hover')) buttons.removeClass('show'); 791 }, 200); 792 } 793 }, '.embedpress-href.embedpress-popup-share, .embedpress-popup-share-buttons'); 794 795 $(document).on({ 796 mouseenter: function () { 797 $(this).addClass('show'); 798 }, 799 mouseleave: function () { 800 $(this).removeClass('show'); 801 } 802 }, '.embedpress-popup-share-buttons'); 803 804 805 806 807 808})(jQuery); 809 810 811 812document.addEventListener('DOMContentLoaded', function () { 813 814 epGlobals.initCarousel = (carouselSelector, options, carouselId) => { 815 816 const carouselOptions = { 817 slidesPerView: options.slideshow, 818 spacing: options.spacing, 819 loop: options.loop, 820 autoplay: options.autoplay, 821 transitionSpeed: options.transitionspeed, 822 autoplaySpeed: options.autoplayspeed, 823 arrows: options.arrows, 824 breakpoints: { 825 768: { 826 slidesPerView: parseInt(options.slideshow) - 1 827 }, 828 1024: { 829 slidesPerView: parseInt(options.slideshow) 830 } 831 } 832 }; 833 834 // INIT CAROUSEL 835 const carousel = new CgCarousel(carouselSelector, carouselOptions, {}); 836 837 // Navigation 838 const next = document.querySelector(`[data-carouselid="${carouselId}"] #js-carousel__next-1`); 839 next?.addEventListener('click', () => carousel.next()); 840 841 const prev = document.querySelector(`[data-carouselid="${carouselId}"] #js-carousel__prev-1`); 842 prev?.addEventListener('click', () => carousel.prev()); 843 } 844 845 const instaWrappers = document.querySelectorAll('.ep-embed-content-wraper'); 846 847 if (instaWrappers.length > 0) { 848 instaWrappers.forEach((wrapper) => { 849 const carouselId = wrapper.getAttribute('data-carouselid'); 850 851 if (!carouselId) return; 852 853 let options = wrapper.getAttribute(`data-carousel-options`); 854 855 options = JSON.parse(options); 856 const carouselSelector = `[data-carouselid="${carouselId}"] .embedpress-insta-container`; 857 858 if (options.arrows) { 859 document.querySelector(`[data-carouselid="${carouselId}
859"] .cg-carousel__btns`).classList.remove('hidden'); 860 } 861 862 epGlobals.initCarousel(carouselSelector, options, carouselId); 863 864 }); 865 } 866 867 // Youtube Channel Carousel 868 869 const youtubeCarouselWraper = document.querySelectorAll('[data-youtube-channel-carousel]'); 870 871 if (youtubeCarouselWraper.length > 0) { 872 youtubeCarouselWraper.forEach((wrapper) => { 873 const carouselId = wrapper.getAttribute('data-youtube-channel-carousel'); 874 if (!carouselId) return; 875 876 // let options = wrapper.getAttribute(`data-carousel-options`); 877 878 // options = JSON.parse(options); 879 880 const carouselSelector = `[data-youtube-channel-carousel="${carouselId}"] .youtube__content__body`; 881 882 // if (options.arrows) { 883 // document.querySelector(`[data-youtube-channel-carousel="${carouselId}"] .cg-carousel__btns`).classList.remove('hidden'); 884 // } 885 886 const options = { 887 slidesPerView: 2, 888 autoplay: true, 889 loop: true, 890 breakpoints: { 891 768: { 892 slidesPerView: 2 893 }, 894 1024: { 895 slidesPerView: 4 896 } 897 } 898 } 899 900 // epGlobals.initCarousel(carouselSelector, options, {}); 901 902 }); 903 } 904 905 906 907}); 908 909document.addEventListener('DOMContentLoaded', () => { 910 const carousel = document.querySelector('.youtube-carousel'); 911 912 if (!carousel) { 913 return; 914 } 915 916 const items = document.querySelectorAll('.item'); 917 const prevButton = document.querySelector('.preview'); 918 const nextButton = document.querySelector('.next'); 919 920 let itemsToShow = getItemsToShow(); // Determine items to show based on screen width 921 922 const totalItems = items.length; 923 let currentIndex = 0; 924 925 function updateCarousel() { 926 const offset = -currentIndex * (100 / itemsToShow); 927 carousel.style.transform = `translateX(${offset}%)`; 928 } 929 930 function nextSlide() { 931 const remainingItems = totalItems - (currentIndex + itemsToShow); 932 if (remainingItems >= itemsToShow) { 933 currentIndex += itemsToShow; 934 } else if (remainingItems > 0) { 935 currentIndex += remainingItems; 936 } else { 937 currentIndex = 0; 938 } 939 updateCarousel(); 940 } 941 942 function prevSlide() { 943 if (currentIndex > 0) { 944 currentIndex -= itemsToShow; 945 if (currentIndex < 0) { 946 currentIndex = 0; 947 } 948 } else { 949 currentIndex = totalItems - itemsToShow; 950 } 951 updateCarousel(); 952 } 953 954 nextButton?.addEventListener('click', nextSlide); 955 prevButton?.addEventListener('click', prevSlide); 956 957 // Optional: Autoplay 958 let autoplay = false; 959 const autoplayInterval = 3000; // Change the time as needed 960 let autoplayId; 961 962 function startAutoplay() { 963 autoplayId = setInterval(nextSlide, autoplayInterval); 964 } 965 966 function stopAutoplay() { 967 clearInterval(autoplayId); 968 } 969 970 if (autoplay) { 971 startAutoplay(); 972 973 // Stop autoplay on mouseover, resume on mouseout 974 carousel.addEventListener('mouseover', stopAutoplay); 975 carousel.addEventListener('mouseout', startAutoplay); 976 } 977 978 // Handle responsive behavior 979 window.addEventListener('resize', () => { 980 itemsToShow = getItemsToShow(); 981 updateCarousel(); 982 983 }); 984 985 function getItemsToShow() { 986 const width = window.innerWidth; 987 if (width >= 1024) { 988 return 3; 989 } else if (width >= 768) { 990 return 2; 991 } else { 992 return 1; 993 } 994 } 995}); 996 997 998 999 1000jQuery(window).on("elementor/frontend/init", function () { 1001 1002 var filterableGalleryHandler = function ($scope, $) { 1003 1004 // Get the Elementor unique selector for this widget 1005 let classes = $scope[0].className; 1006 let selectorEl = '.' + classes.split(' ').join('.'); 1007 1008 const epElLoadMore = () => { 1009 1010 const spinicon = '<svg width="18" height="18" fill="#fff" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.spinner_GuJz{transform-origin:center;animation:spinner_STY6 1.5s linear infinite}@keyframes spinner_STY6{100%{transform:rotate(360deg)}}</style><g class="spinner_GuJz"><circle cx="3" cy="12" r="2"/><circle cx="21" cy="12" r="2"/><circle cx="12" cy="21" r="2"/><circle cx="12" cy="3" r="2"/><circle cx="5.64" cy="5.64" r="2"/><circle cx="18.36" cy="18.36" r="2"/><circle cx="5.64" cy="18.36" r="2"/><circle cx="18.36" cy="5.64" r="2"/></g></svg>'; 1011 1012 $('.elementor-widget-container .ep-nft-gallery-wrapper').each(function () { 1013 let selctorEl = `.elementor-widget-container [data-nftid='${$(this).data('nftid')}
1013']`; 1014 let loadmorelabel = $(selctorEl).data('loadmorelabel'); 1015 $(selctorEl + ` .ep_nft_item`).slice(0, $(selctorEl).data('itemparpage')).show(); 1016 $('.elementor-widget-container .ep-nft-gallery-wrapper .ep-loadmore-wrapper button').css('display', 'flex'); 1017 1018 $(selctorEl + " .nft-loadmore").click(function (e) { 1019 //change the text of the button 1020 $(this).html(loadmorelabel + spinicon); 1021 1022 //disable the button 1023 $(this).prop("disabled", true); 1024 //wait for 1 seconds 1025 setTimeout(function () { 1026 //change the text back 1027 $(selctorEl + " .nft-loadmore").text(loadmorelabel); 1028 //enable the button 1029 $(selctorEl + " .nft-loadmore").prop("disabled", false); 1030 $(selctorEl + " .ep_nft_item:hidden").slice(0, $(selctorEl).data('itemparpage')).fadeIn("slow"); 1031 if ($(selctorEl + " .ep_nft_item:hidden").length == 0) { 1032 $(selctorEl + " .nft-loadmore").fadeOut("slow"); 1033 } 1034 }, 500); 1035 }); 1036 }); 1037 }; 1038 1039 if ($('.elementor-widget-container .ep-nft-gallery-wrapper').length > 0) { 1040 epElLoadMore(); 1041 } 1042 1043 // Content protection system function 1044 const unlockElSubmitHander = (perentSel, that) => { 1045 var ep_client_id = jQuery(that).closest('form').find('input[name="ep_client_id"]').val(); 1046 var password = jQuery(`input[name="pass_${ep_client_id}"]`).val(); 1047 var post_id = jQuery(`input[name="post_id"]`).val(); 1048 const buttonText = jQuery(that).closest('.password-form-container').find('input[type="submit"]').val(); 1049 const unlokingText = jQuery(that).data('unlocking-text'); 1050 1051 var data = { 1052 'action': 'lock_content_form_handler', 1053 'client_id': ep_client_id, 1054 'password': password, 1055 'post_id': post_id, 1056 }; 1057 1058 jQuery('#' + perentSel + '-' + ep_client_id + ' .password-form input[type="submit"]').val(unlokingText); 1059 1060 jQuery.post(eplocalize.ajaxurl, data, function (response) { 1061 if (response.success) { 1062 if (!response.embedHtml) { 1063 jQuery('#' + perentSel + '-' + ep_client_id + ' .password-form input[type="submit"]').val(buttonText); 1064 jQuery('#' + perentSel + '-' + ep_client_id + ' .password-form input[type="password"]').val(''); 1065 jQuery(that).closest('.password-form-container').find('.error-message').removeClass('hidden'); 1066 } 1067 else { 1068 if ($('.ep-content-locked').has('#' + perentSel + '-' + ep_client_id).length) { 1069 $('.ep-content-locked').removeClass('ep-content-locked'); 1070 } 1071 1072 jQuery('#' + perentSel + '-' + ep_client_id + ' .ep-embed-content-wraper').html(response.embedHtml); 1073 1074 $('#' + perentSel + '-' + ep_client_id).removeClass('ep-content-protection-enabled'); 1075 1076 if (jQuery('#' + perentSel + '-' + ep_client_id + ' .ose-youtube').length > 0) { 1077 epGlobals.youtubeChannelGallery(); 1078 } 1079 1080 if ($('.elementor-widget-container .ep-nft-gallery-wrapper').length > 0) { 1081 epElLoadMore(); 1082 } 1083 } 1084 } else { 1085 jQuery('#password-error_' + ep_client_id).html(response.form); 1086 jQuery('#password-error_' + ep_client_id).show(); 1087 } 1088 }, 'json'); 1089 } 1090 1091 // unlockElSubmitHander called for Elementor 1092 jQuery('.ep-elementor-content .password-form').submit(function (e) { 1093 e.preventDefault(); // Prevent the default form submission 1094 unlockElSubmitHander('ep-elementor-content', this); 1095 }); 1096 1097 1098 const instaWrappers = document.querySelectorAll('.ep-embed-content-wrapper'); 1099 1100 if (instaWrappers.length > 0) { 1101
1102 instaWrappers.forEach((wrapper) => { 1103 wrapper.classList.add('class-content-wrapper'); 1104 const carouselId = wrapper.getAttribute('data-carouselid'); 1105 1106 if (!carouselId) return; 1107 1108 let options = wrapper.getAttribute(`data-carousel-options`); 1109 1110 options = JSON.parse(options); 1111 const carouselSelector = `[data-carouselid="${carouselId}"] .embedpress-insta-container`; 1112 1113 1114 if (options.arrows) { 1115 document.querySelector(`[data-carouselid="${carouselId}"] .cg-carousel__btns`).classList.remove('hidden'); 1116 } 1117 1118 epGlobals.initCarousel(carouselSelector, options, carouselId); 1119 1120 }); 1121 } 1122 1123 1124 const instaFeed = document.querySelector(`${selectorEl} .ose-instagram-feed`); 1125 const instaGallery = document.querySelector(`${selectorEl} .insta-gallery`); 1126 if (instaFeed) { 1127 epGlobals.initializeTabs(instaFeed); 1128 } 1129 if (instaGallery) { 1130 epGlobals.instaPopup(instaGallery); 1131 1132 $('.popup-close').click(function (e) { 1133 // Hide the popup by setting display to none 1134 $('.insta-popup').hide(); 1135 $('.popup-container').remove(); 1136 }); 1137 1138 } 1139 1140 if ($('.elementor-widget-container .ose-instagram-feed').length > 0) { 1141 epGlobals.instaLoadMore(); 1142 } 1143 1144 }; 1145 1146 const adsHandler = function ($scope, $) { 1147 window.epAdIndex = typeof (window.epAdIndex) === 'undefined' ? 0 : window.epAdIndex + 1; 1148 let classes = $scope[0].className; 1149 let classJoint = '.' + classes.split(' ').join('.'); 1150 const selectorEl = document.querySelector(classJoint + ' [data-sponsored-id]'); 1151 1152 if (jQuery('body').hasClass('elementor-editor-active') && eplocalize.is_pro_plugin_active) { 1153 adInitialization(selectorEl, window.epAdIndex); 1154 } 1155 1156 } 1157 1158 elementorFrontend.hooks.addAction("frontend/element_ready/embedpres_elementor.default", filterableGalleryHandler); 1159 elementorFrontend.hooks.addAction("frontend/element_ready/embedpress_pdf.default", filterableGalleryHandler); 1160 elementorFrontend.hooks.addAction("frontend/element_ready/embedpres_document.default", filterableGalleryHandler); 1161 elementorFrontend.hooks.addAction("frontend/element_ready/embedpres_elementor.default", adsHandler); 1162 elementorFrontend.hooks.addAction("frontend/element_ready/embedpres_elementor.default", epGlobals.handlePosterImageLoad); 1163}); 1164 1165 1166function presentationModeForIOS(iframes) { 1167 iframes?.forEach(function (iframe) { 1168 iframe.onload = function () { 1169 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; 1170 var button = iframeDoc?.querySelector('#presentationMode.presentationMode'); 1171 button?.addEventListener('click', function () { 1172 iframe.classList.toggle('presentationModeEnabledIosDevice'); 1173 }); 1174 iframeDoc?.addEventListener('keydown', function (event) { 1175 if (event.keyCode === 27) { 1176 iframe.classList.remove('presentationModeEnabledIosDevice'); 1177 } 1178 }); 1179 }; 1180 }); 1181} 1182 1183function isIOSDevice() { 1184 return /iPhone|iPad|iPod/i.test(navigator.userAgent); 1185} 1186 1187if (isIOSDevice()) { 1188 var iframes = document.querySelectorAll('.embedpress-embed-document-pdf'); 1189 presentationModeForIOS(iframes) 1190} 1191 1192document.addEventListener("DOMContentLoaded", epGlobals.handlePosterImageLoad); 1193 1194 1195 1196// document.addEventListener('DOMContentLoaded', function () { 1197// const videoPopup = document.getElementById('videoPopup'); 1198// const videoIframe = document.getElementById('videoIframe'); 1199// const videoDescription = document.getElementById('videoDescription'); 1200// const closeBtn = document.querySelector('.close'); 1201// const nextBtn = document.getElementById('nextVideo'); 1202// const prevBtn = document.getElementById('prevVideo'); 1203 1204// let currentIndex = -1; 1205 1206// function openVideoPopup(index) { 1207// const items = document.querySelectorAll('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1208// if (index >= 0 && index < items.length) { 1209// currentIndex = index; 1210// const videoId = items[currentIndex].getAttribute('data-vid'); 1211// const description = items[currentIndex].querySelector('.video-description').innerHTML; 1212 1213// if (videoId) { 1214// videoIframe.src = `https://www.youtube.com/embed/${videoId}?autoplay=1`; 1215// videoDescription.innerHTML = description; 1216// videoPopup.style.display = 'block'; 1217 1218// // Update navigation buttons visibility 1219// updateNavigationButtons(); 1220// } 1221// } 1222// } 1223 1224// function closeVideoPopup() { 1225// videoPopup.style.display = 'none'; 1226// videoIframe.src = ''; 1227// videoDescription.innerHTML = ''; 1228// } 1229 1230// function updateNavigationButtons() { 1231// const items = document.querySelectorAll('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1232// if (currentIndex <= 0) { 1233// prevBtn.style.display = 'none'; 1234// } else { 1235// prevBtn.style.display = 'block'; 1236// } 1237 1238// if (currentIndex >= items.length - 1) { 1239// nextBtn.style.display = 'none'; 1240// } else { 1241// nextBtn.style.display = 'block'; 1242// } 1243// } 1244 1245// document.addEventListener('click', function (event) { 1246// const items = document.querySelectorAll('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1247// const item = event.target.closest('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1248// if (item) { 1249// const index = Array.prototype.indexOf.call(items, item); 1250// openVideoPopup(index); 1251// } 1252// }); 1253 1254// closeBtn.addEventListener('click', closeVideoPopup); 1255 1256// window.addEventListener('click', function (event) { 1257// if (event.target === videoPopup) { 1258// closeVideoPopup(); 1259// } 1260// }); 1261 1262// nextBtn.addEventListener('click', function () { 1263// const items = document.querySelectorAll('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1264// if (currentIndex >= 0 && currentIndex < items.length - 1) { 1265// openVideoPopup(currentIndex + 1); 1266// } 1267// }); 1268 1269// prevBtn.addEventListener('click', function () { 1270// if (currentIndex > 0) { 1271// openVideoPopup(currentIndex - 1); 1272// } 1273// }); 1274// }); 1275 1276 1277jQuery(document).ready(function ($) { 1278
1279 let currentIndex = -1; 1280 1281 function createVideoPopup() { 1282 const videoPopupHtml = ` 1283 <div id="videoPopup" class="video-popup"> 1284 <div class="video-popup-content"> 1285 <span class="close">×</span> 1286 <div class="video-popup-inner-content"> 1287 <iframe id="videoIframe" frameborder="0" allowfullscreen allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe> 1288 <div id="videoDescription"></div> 1289 </div> 1290 <div class="popup-controls"> 1291 <span id="prevVideo" class="nav-icon prev-icon">❮</span> 1292 <span id="nextVideo" class="nav-icon next-icon">❯</span> 1293 </div> 1294 </div> 1295 </div>`; 1296 return $(videoPopupHtml).appendTo('body'); 1297 } 1298 1299 function openVideoPopup(index) { 1300 const items = $('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1301 if (index >= 0 && index < items.length) { 1302 // Remove any existing video popup before creating a new one 1303 $('#videoPopup').remove(); 1304 1305 currentIndex = index; 1306 const videoId = $(items[currentIndex]).data('vid'); 1307 const videoPopup = createVideoPopup(); 1308 const videoIframe = videoPopup.find('#videoIframe'); 1309 const videoDescriptionContainer = videoPopup.find('#videoDescription'); 1310 const closeBtn = videoPopup.find('.close'); 1311 const nextBtn = videoPopup.find('#nextVideo'); 1312 const prevBtn = videoPopup.find('#prevVideo'); 1313 1314 if (videoId) { 1315 fetchVideoData(videoId, videoIframe, videoDescriptionContainer); 1316 videoPopup.show(); 1317 updateNavigationButtons(nextBtn, prevBtn, items); 1318 1319 closeBtn.on('click', () => { 1320 closeVideoPopup(videoPopup); 1321 }); 1322 1323 $(window).on('click', function (event) { 1324 if ($(event.target).is(videoPopup)) { 1325 closeVideoPopup(videoPopup); 1326 } 1327 }); 1328 1329 nextBtn.on('click', function () { 1330 if (currentIndex >= 0 && currentIndex < items.length - 1) { 1331 openVideoPopup(currentIndex + 1); 1332 } 1333 }); 1334 1335 prevBtn.on('click', function () { 1336 if (currentIndex > 0) { 1337 openVideoPopup(currentIndex - 1); 1338 } 1339 }); 1340 } 1341 } 1342 } 1343 1344 1345 function closeVideoPopup(videoPopup) { 1346 videoPopup.remove(); 1347 currentIndex = -1; // Reset the index 1348 } 1349 1350 function updateNavigationButtons(nextBtn, prevBtn, items) { 1351 prevBtn.toggle(currentIndex > 0); 1352 nextBtn.toggle(currentIndex < items.length - 1); 1353 } 1354 1355 function fetchVideoData(videoId, videoIframe, videoDescriptionContainer) { 1356 const data = { 1357 action: 'fetch_video_description', 1358 vid: videoId 1359 }; 1360 1361 $.post(eplocalize.ajaxurl, data, function (response) { 1362 if (response.success) { 1363 videoIframe.attr('src', `https://www.youtube.com/embed/${videoId}?autoplay=1`); 1364 videoDescriptionContainer.html(response.data.description); 1365 } else { 1366 console.error('Error fetching video data:', response?.data?.error); 1367 } 1368 }); 1369 } 1370 1371 $(document).on('click', '.layout-grid .item, .layout-list .item, .layout-carousel .item', function () { 1372 const items = $('.layout-grid .item, .layout-list .item, .layout-carousel .item'); 1373 const index = items.index(this); 1374 openVideoPopup(index); 1375 }); 1376}); 1377 1378 1379 1380// pause audio/video 1381 1382jQuery(document).ready(function () { 1383 const players = jQuery('.enabled-auto-pause audio, .enabled-auto-pause video'); 1384 1385 function pauseAllExcept(currentPlayer) { 1386 players.each(function () { 1387 if (this !== currentPlayer[0]) { 1388 this.pause(); 1389 } 1390 }); 1391 } 1392 1393 players.on('play', function () { 1394 pauseAllExcept(jQuery(this)); 1395 }); 1396});
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.