KB.component('image-slideshow', function (containerElement, options) { var currentImage; function onKeyDown(e) { switch (e.keyCode) { case 27: destroySlide(); break; case 39: renderNextSlide(); break; case 37: renderPreviousSlide(); break; } } function onOverlayClick(element) { if (element.matches('.slideshow-next-icon')) { renderNextSlide(); } else if (element.matches('.slideshow-previous-icon')) { renderPreviousSlide(); } else if (element.matches('.slideshow-download-icon')) { window.location.href = element.href; } else { destroySlide(); } } function onClick(element) { var imageId = KB.dom(element).data('imageId'); var image = getImage(imageId); renderSlide(image); } function renderNextSlide() { destroySlide(); for (var i = 0; i < options.images.length; i++) { if (options.images[i].id === currentImage.id) { var index = i + 1; if (index >= options.images.length) { index = 0; } currentImage = options.images[index]; break; } } renderSlide(); } function renderPreviousSlide() { destroySlide(); for (var i = 0; i < options.images.length; i++) { if (options.images[i].id === currentImage.id) { var index = i - 1; if (index < 0) { index = options.images.length - 1; } currentImage = options.images[index]; break; } } renderSlide(); } function renderSlide() { var closeElement = KB.dom('div') .attr('class', 'fa fa-window-close slideshow-icon slideshow-close-icon') .build(); var downloadElement = KB.dom('a') .attr('class', 'fa fa-download slideshow-icon slideshow-download-icon') .attr('href', getUrl(currentImage, 'download')) .build(); var previousElement = KB.dom('div') .attr('class', 'fa fa-chevron-circle-left slideshow-icon slideshow-previous-icon') .build(); var nextElement = KB.dom('div') .attr('class', 'fa fa-chevron-circle-right slideshow-icon slideshow-next-icon') .build(); var imageElement = KB.dom('img') .attr('src', getUrl(currentImage, 'image')) .attr('alt', currentImage.name) .attr('title', currentImage.name) .style('maxHeight', (window.innerHeight - 50) + 'px') .build(); var captionElement = KB.dom('figcaption') .text(currentImage.name) .build(); var figureElement = KB.dom('figure') .add(imageElement) .add(captionElement) .build(); var overlayElement = KB.dom('div') .addClass('image-slideshow-overlay') .add(closeElement) .add(downloadElement) .add(previousElement) .add(nextElement) .add(figureElement) .click(onOverlayClick) .build(); document.body.appendChild(overlayElement); document.addEventListener('keydown', onKeyDown, false); } function destroySlide() { var overlayElement = KB.find('.image-slideshow-overlay'); if (overlayElement !== null) { document.removeEventListener('keydown', onKeyDown, false); overlayElement.remove(); } } function getImage(imageId) { for (var i = 0; i < options.images.length; i++) { if (options.images[i].id === imageId) { return options.images[i]; } } return null; } function getUrl(image, type) { var regex = new RegExp(options.regex, 'g'); return options.url[type].replace(regex, image.id); } function buildThumbnailElement(image) { return KB.dom('img') .attr('src', getUrl(image, 'thumbnail')) .attr('alt', image.name) .attr('title', image.name) .data('imageId', image.id) .click(onClick) .build(); } this.render = function () { currentImage = options.image; containerElement.appendChild(buildThumbnailElement(currentImage)); }; });