function sanitizeElptCaption(caption){
if(typeof caption!=='string') return caption;
var tempDiv=jQuery('<div>');
tempDiv.text(caption);
return tempDiv.html();
}
function safeDecodeHtml(str){
if(typeof str!=='string') return str;
var dangerousPatterns=[
/&lt;script/i,
/&lt;img[^&]*onerror/i,
/&lt;[^&]*on\w+=/i,
/javascript:/i,
/&lt;iframe/i,
/&lt;object/i,
/&lt;embed/i
];
for (var i=0; i < dangerousPatterns.length; i++){
if(dangerousPatterns[i].test(str)){
return str.replace(/&[#\w]+;/g, '').replace(/[<>]/g, '');
}}
var txt=document.createElement('textarea');
txt.innerHTML=str;
var decoded=txt.value;
decoded=decoded.replace(/<[^>]*>/g, '');
return decoded;
}
function sanitizeAllImages(){
jQuery('.elpt-portfolio img[title], a.elpt-portfolio-lightbox img[title]').each(function(){
var $img=jQuery(this);
var originalTitle=$img.attr('title');
if(originalTitle){
var decodedTitle=safeDecodeHtml(originalTitle);
var sanitizedTitle=sanitizeElptCaption(decodedTitle);
$img.attr('title', sanitizedTitle);
}});
}
jQuery(document).ready(function(){
sanitizeAllImages();
});
jQuery(window).on('load', function (){
sanitizeAllImages();
if(jQuery(".elpt-portfolio-content").length){
jQuery('a.elpt-portfolio-video-lightbox').each(function(){
var videoUrl=jQuery(this).attr('data-video');
if(videoUrl){
jQuery(this).on('click', function(e){
e.preventDefault();
if(videoUrl.indexOf('youtube.com') > -1||videoUrl.indexOf('youtu.be') > -1){
var videoId=getYoutubeId(videoUrl);
if(videoId){
var embedUrl='https://www.youtube.com/embed/' + videoId + '?autoplay=1&rel=0';
openVideoLightbox(embedUrl);
}}else if(videoUrl.indexOf('vimeo.com') > -1){
var videoId=getVimeoId(videoUrl);
if(videoId){
var embedUrl='https://player.vimeo.com/video/' + videoId + '?autoplay=1&title=0&byline=0&portrait=0';
openVideoLightbox(embedUrl);
}}
return false;
});
}});
jQuery('a.elpt-portfolio-lightbox, a.elpt-portfolio-video-lightbox').each(function(){
jQuery(this).removeClass('elementor-clickable');
jQuery(this).attr('data-elementor-open-lightbox', 'no');
if(!jQuery(this).hasClass('elpt-portfolio-video-lightbox')||!jQuery(this).attr('data-video')){
jQuery(this).on('click', function(e){
e.stopPropagation();
});
}});
sanitizeAllImages();
var lightboxInstance=jQuery('a.elpt-portfolio-lightbox').simpleLightbox({
captions: true,
disableScroll: false,
rel: true,
additionalHtml: false
});
var originalAppendTo=jQuery.fn.appendTo;
jQuery.fn.appendTo=function(selector){
var result=originalAppendTo.apply(this, arguments);
if(this.hasClass&&this.hasClass('sl-caption')){
var captionContent=this.html();
if(captionContent){
var decodedContent=safeDecodeHtml(captionContent);
var sanitizedContent=sanitizeElptCaption(decodedContent);
this.text(sanitizedContent);
}}
return result;
};
var observer=new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
if(mutation.addedNodes){
mutation.addedNodes.forEach(function(node){
if(node.nodeType===1){
var $node=jQuery(node);
if($node.hasClass('sl-caption')||$node.find('.sl-caption').length > 0){
var $caption=$node.hasClass('sl-caption') ? $node:$node.find('.sl-caption');
var captionHtml=$caption.html();
if(captionHtml){
var decodedCaption=safeDecodeHtml(captionHtml);
var sanitizedCaption=sanitizeElptCaption(decodedCaption);
$caption.text(sanitizedCaption);
}}
}});
}});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
function getYoutubeId(url){
var regExp=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
var match=url.match(regExp);
return (match&&match[7].length==11) ? match[7]:false;
}
function getVimeoId(url){
var regExp=/^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?([0-9]+)/;
var match=url.match(regExp);
return match ? match[5]:false;
}
function openVideoLightbox(embedUrl){
var overlay=jQuery('<div id="elpt-video-overlay"></div>')
.css({
'position': 'fixed',
'top': 0,
'left': 0,
'width': '100%',
'height': '100%',
'background-color': 'rgba(0,0,0,0.9)',
'z-index': 9999,
'display': 'flex',
'justify-content': 'center',
'align-items': 'center'
})
.appendTo('body');
var videoContainer=jQuery('<div id="elpt-video-container"></div>')
.css({
'position': 'relative',
'width': '80%',
'max-width': '900px',
'padding-top': '56.25%',
'box-sizing': 'border-box'
})
.appendTo(overlay);
var iframe=jQuery('<iframe></iframe>')
.attr({
'src': embedUrl,
'frameborder': '0',
'allowfullscreen': 'true',
'allow': 'autoplay; fullscreen'
})
.css({
'position': 'absolute',
'top': 0,
'left': 0,
'width': '100%',
'height': '100%'
})
.appendTo(videoContainer);
var closeButton=jQuery('<div id="elpt-video-close">×</div>')
.css({
'position': 'absolute',
'top': '-40px',
'right': '0',
'color': 'white',
'font-size': '30px',
'cursor': 'pointer',
'z-index': 10000
})
.appendTo(videoContainer);
closeButton.on('click', function(){
overlay.remove();
});
overlay.on('click', function(e){
if(e.target===this){
overlay.remove();
}});
jQuery(document).on('keydown.elptVideo', function(e){
if(e.keyCode===27){
overlay.remove();
jQuery(document).off('keydown.elptVideo');
}});
}});