let FgGallery = function(selector) {
isTrue = false;
this.argumens = arguments;
this.gallerySelector = document.querySelectorAll(selector);
this.activeImage; // active (open) image
this.bodyCover = document.createElement('div');
if (!document.querySelector('.body-cover')) {
document.body.appendChild(this.bodyCover);
this.bodyCover.classList.add('body-cover');
document.body.appendChild(this.bodyCover);
var bodyCoverDeps = `
`;
bodyCoverDeps = document.createRange().createContextualFragment(bodyCoverDeps).firstElementChild
this.bodyCover.appendChild(bodyCoverDeps);
}
this.nextBtn = document.querySelector('.next-btn'); // next button
this.prevBtn = document.querySelector('.prev-btn'); // previous button
this.closeBtb = document.querySelector('.close-btn'); // close image button
this.gallerySequence = 0; // gallery
this.galleryItemSequence = 0; // gallery image
// Adding cols class
this.gallerySelector[0].classList.add(`cols-${this.argumens[1].cols}`);
// Original images
this.originalImages = {} // galleries with images
// init functions
this.generateItems();
this.closeImage();
this.styles();
}
// Generate image items
FgGallery.prototype.generateItems = function() {
let This = this;
this.gallerySelector.forEach(function(galleryContainer, i) {
This.originalImages[`gallery${i}`] = []
galleryContainer.querySelectorAll('img').forEach(function(imageItems, key) {
This.originalImages[`gallery${i}`].push(imageItems); // Save original images
// create new image elements
var newImages = '';
newImages += ``
newImages = galleryContainer.appendChild(document.createRange().createContextualFragment(newImages).firstElementChild);
imageItems.remove(); // Remove original images
// open image
newImages.onclick = function() {
This.galleryItemSequence = key;
This.gallerySequence = i;
This.next();
This.back();
This.bodyCover.classList.add('active'); // active background cover
This.activeImage = This.originalImages[`gallery${i}`][key].cloneNode(true);
This.bodyCover.appendChild(This.activeImage);
imagePopResize(This.activeImage);
}
// sizing image on window resize
window.addEventListener('resize', function() {
if (This.activeImage) {
imagePopResize(This.activeImage);
}
})
// sizing image
function imagePopResize(elem) {
if (elem.naturalWidth < window.innerWidth && elem.naturalHeight < window.innerHeight ) {
elem.style.width = 'auto';
elem.style.height = 'auto';
}
if (elem.offsetWidth > window.innerWidth) {
elem.style.width = '80%';
elem.style.height = 'auto';
}
if (elem.offsetHeight > window.innerHeight) {
elem.style.width = 'auto';
elem.style.height = '80%';
}
}
})
})
}
// next
FgGallery.prototype.next = function() {
this.nextBtn.onclick = () => {
this.galleryItemSequence++
if (this.galleryItemSequence < this.originalImages[`gallery${this.gallerySequence}`].length) {
this.activeImage.src = this.originalImages[`gallery${this.gallerySequence}`][this.galleryItemSequence].src;
} else {
this.galleryItemSequence = 0
this.activeImage.src = this.originalImages[`gallery${this.gallerySequence}`][0].src;
}
}
}
// back
FgGallery.prototype.back = function() {
this.prevBtn.onclick = () => {
this.galleryItemSequence--;
if (this.galleryItemSequence > -1) {
this.activeImage.src = this.originalImages[`gallery${this.gallerySequence}`][this.galleryItemSequence].src
} else {
this.galleryItemSequence = this.originalImages[`gallery${this.gallerySequence}`].length - 1
this.activeImage.src = this.originalImages[`gallery${this.gallerySequence}`][this.galleryItemSequence].src
}
}
}
// close image
FgGallery.prototype.closeImage = function() {
this.bodyCover.onclick = (e) => {
if (e.target.classList.contains('active') || e.target.classList.contains('close-btn') || e.target.classList.contains('close-svg')) {
this.bodyCover.classList.remove('active');
this.bodyCover.querySelector('img').remove();
}
}
}
// applying styles
FgGallery.prototype.styles = function() {
if (typeof this.argumens[1].style) {
for (const key in this.argumens[1].style) {
document.querySelectorAll(`${this.argumens[0]} .gallery-items`).forEach(items => {
items.style[key] = this.argumens[1].style[key]
})
}
}
}