import {Lightbox} from "./Lightbox";
import * as Util from "../Util";
import {Core} from "../Core";
export class PhotonicPhotoSwipe5 extends Lightbox {
constructor() {
super();
}
soloImages() {
const a = document.querySelectorAll('a[href]');
const solos = Array.from(a).filter(elem => /(\.jpg|\.jpeg|\.bmp|\.gif|\.png)/i.test(elem.getAttribute('href')))
.filter(elem => !elem.classList.contains('photonic-lb'));
solos.forEach(solo => {
solo.classList.add("photonic-photoswipe");
solo.classList.add("photonic-photoswipe-solo");
});
return solos;
};
hostedVideo(a) {
const html5 = a.getAttribute('href').match(new RegExp(/(\.mp4|\.webm|\.ogg)/i));
let css = a.classList.contains('photonic-lb');
if (html5 !== null && !css) {
a.classList.add("photoswipe-html5-video");
let videos = document.querySelector('#photonic-html5-videos');
if (videos === null) {
videos = document.createElement('div');
videos.style.display = 'none';
videos.setAttribute('id', 'photonic-html5-videos');
document.body.appendChild(videos);
}
videos.insertAdjacentHTML('beforeend', '
');
a.setAttribute('data-html5-href', a.getAttribute('href'));
a.setAttribute('href', '#photonic-html5-video-' + this.videoIndex);
if (!a.getAttribute('id')) {
a.setAttribute('id', 'photonic-html5-video-a-' + this.videoIndex);
}
this.videoIndex++;
}
};
changeVideoURL(element, regular, embed) {
element.setAttribute('href', embed);
};
modifyAdditionalVideoProperties(anchor) {
if (anchor != null && anchor instanceof Element && anchor.tagName === 'A') {
if (anchor.classList.contains('photoswipe5-video')) {
anchor.classList.remove('photoswipe5-video');
anchor.classList.add('photoswipe-video');
}
if (anchor.getAttribute('id') == null) {
anchor.setAttribute('id', 'photonic-photoswipe-video-' + this.videoIndex);
this.videoIndex++;
}
}
}
setLightboxCaption(lightbox) {
const self = this;
lightbox.on('uiRegister', function() {
lightbox.pswp.ui.registerElement({
name: 'custom-caption',
order: 9,
isButton: false,
appendTo: 'root',
html: 'View',
onInit: (el, pswp) => {
lightbox.pswp.on('change', () => {
const currSlideElement = lightbox.pswp.currSlide.data.element;
let captionHTML = '';
if (currSlideElement) {
const hiddenCaption = Util.HTMLSanitizer.SanitizeHTML(currSlideElement.getAttribute('data-title'));
if (hiddenCaption) {
captionHTML = hiddenCaption;
}
else if (currSlideElement.getAttribute('title')) {
captionHTML = Util.getText(currSlideElement.getAttribute('title'));
}
else {
captionHTML = Util.getText(currSlideElement.querySelector('img').getAttribute('alt'));
}
}
if (captionHTML) {
el.innerHTML = '' + captionHTML + '
';
}
else {
el.innerHTML = '';
}
});
}
});
lightbox.pswp.ui.registerElement({
name: 'download-button',
order: 8,
isButton: true,
tagName: 'a',
// SVG with outline
html: {
isCustomSVG: true,
inner: '',
outlineID: 'pswp__icn-download'
},
onInit: (el, pswp) => {
el.setAttribute('download', '');
el.setAttribute('target', '_blank');
el.setAttribute('rel', 'noopener');
pswp.on('change', () => {
if (pswp.currSlide.data.element) {
el.href = pswp.currSlide.data.element.getAttribute('data-photonic-download') ? pswp.currSlide.data.element.getAttribute('data-photonic-download') : pswp.currSlide.data.src;
}
});
}
});
lightbox.pswp.ui.registerElement({
name: 'social-sharing',
order: 7,
isButton: false,
html: 'Share',
onInit: (el, pswp) => {
lightbox.pswp.on('change', () => {
if (Photonic_JS.social_media) {
const currSlideElement = lightbox.pswp.currSlide.data.element;
let url = location.href;
if (currSlideElement) {
let title = Util.getText(currSlideElement.getAttribute('data-title'));
let image = currSlideElement.href;
const social = self.socialIcons.replace(/{photonic_share_link}/g, encodeURIComponent(url))
.replace(/{photonic_share_title}/g, encodeURIComponent(title))
.replace(/{photonic_share_image}/g, encodeURIComponent(image));
el.innerHTML = '' + social + '
';
}
}
else {
el.innerHTML = '';
}
});
}
});
});
}
initialize(selector) {
this.handleSolos();
const self = this;
let selection;
if (selector == null) {
selection = document.querySelectorAll('.photonic-level-1-container');
}
else if (selector instanceof NodeList) {
selection = selector;
}
else if (selector instanceof Element) {
selection = [selector];
}
else {
selection = document.querySelectorAll(selector);
}
selection.forEach(function (current) {
const galleryId = current.getAttribute('id');
const lightbox = new PhotoSwipeLightbox({
gallery: '#' + galleryId,
children: 'a.photonic-lb',
pswpModule: PhotoSwipe,
});
lightbox.on('itemData', (e) => {
let thumbnail = e.itemData.element;
if (thumbnail && thumbnail.dataset.photonicMediaType === 'video') {
let href = thumbnail.getAttribute('href');
let html = document.querySelector(href).cloneNode(true);
html.removeAttribute('id');
html.classList.add('photonic-video');
e.itemData = {
html: html.outerHTML
}
}
self.setHash(thumbnail);
});
lightbox.on('close', () => {
self.unsetHash();
});
self.setLightboxCaption(lightbox);
lightbox.init();
});
document.querySelectorAll('.photonic-photoswipe-solo').forEach((current, idx) => {
const href = current.href;
let itemData = {
src: href
};
if (current.getAttribute('data-pswp-width') && current.getAttribute('data-pswp-height')) {
itemData.width = current.getAttribute('data-pswp-width');
itemData.height = current.getAttribute('data-pswp-height');
}
const lightbox = new PhotoSwipeLightbox({
dataSource: [
itemData
],
pswpModule: PhotoSwipe,
});
lightbox.on('beforeOpen', (e) => {
const { pswp } = lightbox;
let itemWidth, itemHeight;
function soloImageDim() {
return new Promise(resolve => {
const img = new Image();
img.onload = () => {
itemWidth = img.naturalWidth;
itemHeight = img.naturalHeight;
resolve();
};
img.src = href;
});
}
async function waitForDim() {
await soloImageDim();
}
waitForDim().then(() => {
pswp.options.dataSource = [
{
src: href,
width: itemWidth,
height: itemHeight,
},
];
pswp.refreshSlideContent(pswp.currSlide.index);
});
});
self.setLightboxCaption(lightbox);
lightbox.init();
current.onclick = (e) => {
e.preventDefault();
lightbox.loadAndOpen(0);
};
});
document.querySelectorAll('.photoswipe-video, .photoswipe-html5-video').forEach((current, idx) => {
const href = current.href;
const anchorId = current.getAttribute('id');
const lightbox = new PhotoSwipeLightbox({
gallery: '#' + anchorId,
pswpModule: PhotoSwipe,
});
let html;
if (current.classList.contains('photoswipe-video')) {
html = '';
}
else {
html = document.querySelector(current.getAttribute('href')).cloneNode(true);
html.removeAttribute('id');
html.classList.add('photonic-video');
html = html.outerHTML;
}
lightbox.on('itemData', (e) => {
e.itemData = {
html: html
};
});
self.setLightboxCaption(lightbox);
lightbox.init();
});
}
initializeForNewContainer(containerId) {
this.initialize(containerId);
}
}