2020-09-07 02:09:23 +00:00
|
|
|
(function () {
|
2020-09-10 23:35:10 +00:00
|
|
|
var hidden = function () {
|
|
|
|
return document.hidden || document.msHidden || document.webkitHidden;
|
|
|
|
}
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// "hydrate" div.gallery with play/pause and nav behaviors
|
2020-09-07 02:09:23 +00:00
|
|
|
var process_gallery = function (g) {
|
2020-09-07 16:49:16 +00:00
|
|
|
var
|
|
|
|
// milliseconds to wait before switch to next slide
|
2020-09-10 23:35:10 +00:00
|
|
|
NEXT_SLIDE_TIMEOUT = 5000;
|
2020-09-07 16:49:16 +00:00
|
|
|
|
|
|
|
var
|
2020-09-10 23:35:10 +00:00
|
|
|
// will be resized to the height of currently selected image
|
2020-09-10 03:09:57 +00:00
|
|
|
images_container = g.querySelector('.images'),
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// images in this gallery
|
|
|
|
images = g.querySelectorAll('.images img'),
|
|
|
|
|
|
|
|
// container for nav buttons
|
|
|
|
gallery_nav = g.querySelector('nav'),
|
|
|
|
|
|
|
|
// clickable buttons, one per image
|
|
|
|
// computed below
|
|
|
|
navs = [],
|
2020-09-07 02:09:23 +00:00
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// index of the currently selected image
|
|
|
|
selected_index = 0,
|
|
|
|
|
|
|
|
// play control consists of a label and a checkbox
|
|
|
|
// defer computing because nav innerHTML gets clobbered
|
|
|
|
play_checkbox,
|
|
|
|
|
|
|
|
// handle to setInterval
|
|
|
|
play_interval;
|
|
|
|
|
2020-09-10 03:09:57 +00:00
|
|
|
/*
|
|
|
|
+--------+--------+--------+
|
|
|
|
| image1 | image2 | image3 |
|
|
|
|
| |selected| |
|
|
|
|
+--------+--------+--------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
var adjust_height = function (index) {
|
|
|
|
images_container.style.height = images[index].offsetHeight + 'px';
|
|
|
|
}
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// show image at index
|
|
|
|
// update nav controls accordingly
|
2020-09-07 02:09:23 +00:00
|
|
|
var select_image = function (index) {
|
2020-09-10 03:09:57 +00:00
|
|
|
if (selected_index === index) return;
|
|
|
|
|
|
|
|
var slide = function () {
|
|
|
|
images[selected_index].classList.remove('transition');
|
|
|
|
images[index].classList.remove('transition');
|
|
|
|
|
|
|
|
navs[selected_index].classList.remove('selected');
|
|
|
|
|
2020-09-07 02:09:23 +00:00
|
|
|
selected_index = index;
|
|
|
|
}
|
2020-09-10 03:09:57 +00:00
|
|
|
|
2020-09-10 23:35:10 +00:00
|
|
|
if (hidden()) return;
|
|
|
|
images[selected_index].addEventListener('transitionend', slide, {once: true});
|
|
|
|
|
|
|
|
navs[index].classList.add('selected');
|
2020-09-10 03:09:57 +00:00
|
|
|
|
|
|
|
if (index < selected_index) {
|
|
|
|
setTimeout(function () {
|
|
|
|
images[index].classList.remove('right');
|
|
|
|
images[index].classList.add('left');
|
|
|
|
|
|
|
|
adjust_height(index);
|
|
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
images[index].classList.add('transition');
|
|
|
|
images[selected_index].classList.add('transition');
|
|
|
|
images[index].classList.remove('left');
|
|
|
|
images[index].classList.add('center');
|
|
|
|
images[selected_index].classList.add('right');
|
|
|
|
images[selected_index].classList.remove('center');
|
|
|
|
},1)
|
|
|
|
},1)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
setTimeout(function () {
|
|
|
|
images[index].classList.remove('left');
|
|
|
|
images[index].classList.add('right');
|
|
|
|
|
|
|
|
adjust_height(index);
|
|
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
images[index].classList.add('transition');
|
|
|
|
images[selected_index].classList.add('transition');
|
|
|
|
images[index].classList.remove('right');
|
|
|
|
images[index].classList.add('center');
|
|
|
|
images[selected_index].classList.add('left');
|
|
|
|
images[selected_index].classList.remove('center');
|
|
|
|
},1);
|
|
|
|
},1);
|
|
|
|
|
|
|
|
}
|
2020-09-07 02:09:23 +00:00
|
|
|
}
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// show next image
|
2020-09-07 02:09:23 +00:00
|
|
|
var next_image = function () {
|
2020-09-10 23:35:10 +00:00
|
|
|
if (hidden()) return;
|
2020-09-07 02:09:23 +00:00
|
|
|
if (selected_index >= images.length-1) {
|
|
|
|
select_image(0);
|
|
|
|
} else {
|
|
|
|
select_image(selected_index+1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// handler for nav buttons
|
|
|
|
// selects an image corresponding to the clicked nav button
|
2020-09-07 02:09:23 +00:00
|
|
|
var nav_to_image = function () {
|
|
|
|
select_image(Array.from(navs).indexOf(this));
|
|
|
|
}
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
// play/pause slideshow
|
|
|
|
var toggle_play = function () {
|
|
|
|
if (play_checkbox.checked===true) {
|
|
|
|
clearInterval(play_interval);
|
|
|
|
} else {
|
|
|
|
play_interval = setInterval(next_image, NEXT_SLIDE_TIMEOUT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-10 03:09:57 +00:00
|
|
|
// build nav bullets
|
2020-09-07 02:09:23 +00:00
|
|
|
var navHtml = '';
|
|
|
|
for (var i=0; i<images.length; ++i) {
|
|
|
|
var image = images[i]
|
|
|
|
image.addEventListener('click', next_image)
|
|
|
|
navHtml += '<i class="' + (i===0? 'selected' : '') + '" data-target="' + image.id + '"></i>'
|
|
|
|
}
|
2020-09-07 14:00:23 +00:00
|
|
|
gallery_nav.innerHTML += navHtml;
|
2020-09-07 02:09:23 +00:00
|
|
|
|
2020-09-10 03:09:57 +00:00
|
|
|
// attach nav bullet listeners
|
2020-09-07 02:09:23 +00:00
|
|
|
navs = gallery_nav.querySelectorAll('i');
|
|
|
|
for (var i=0; i<navs.length; ++i) {
|
|
|
|
var nav = navs[i];
|
|
|
|
nav.addEventListener('click', nav_to_image)
|
|
|
|
}
|
2020-09-07 16:49:16 +00:00
|
|
|
|
2020-09-10 03:09:57 +00:00
|
|
|
// play button
|
2020-09-07 16:49:16 +00:00
|
|
|
play_checkbox = g.querySelector('.play input[type=checkbox]');
|
|
|
|
play_checkbox.addEventListener('change', toggle_play);
|
2020-09-10 03:09:57 +00:00
|
|
|
|
|
|
|
// resize image container when initial image loads
|
|
|
|
if (images[selected_index].complete) {
|
|
|
|
adjust_height(selected_index);
|
|
|
|
} else {
|
|
|
|
images[selected_index].addEventListener('load', function () {
|
|
|
|
adjust_height(selected_index);
|
|
|
|
});
|
|
|
|
images[selected_index].addEventListener('error', function() {
|
|
|
|
console.warn('error loading image', arguments, images[selected_index].src, images[selected_index])
|
|
|
|
});
|
|
|
|
}
|
2020-09-07 02:09:23 +00:00
|
|
|
}
|
|
|
|
|
2020-09-07 16:49:16 +00:00
|
|
|
var galleries = document.getElementsByClassName('gallery');
|
|
|
|
|
2020-09-07 02:09:23 +00:00
|
|
|
for (var i=0; i<galleries.length; ++i) {
|
|
|
|
var g = galleries[i];
|
|
|
|
process_gallery(g);
|
|
|
|
}
|
|
|
|
})();
|