import scrollTo from './scroll'
import {$id, $create, ajax, capitalize , sliderClasses, paginationClasses} from './utils'
import {startLoading, endLoading} from './loader'
# Gallery element
gallery = $id 'gallery'
overlay = $id('overlay')
modal = $id('gallery-modal')
createGallery = (sliders) ->
gallery.classList.add 'gallery_initiated'
frames = gallery.getElementsByClassName 'frame'
# Immediately load all frames in view
loadFrames frames, sliders
# Galleries should always be in a scroller element
scroller = gallery.parentNode.parentNode
sections = gallery.getElementsByClassName 'gallery__title'
bullets = scroller.getElementsByClassName 'pagination__bullet'
# Immediately add active to first bullet
bullets[0].classList.add 'pagination__bullet_active'
gallery.parentNode.addEventListener 'scroll', (e) ->
scroller.querySelector('.mouse').classList.add 'mouse_hidden'
for i in [0...sections.length]
section = sections[i]
# If scrolled past the section title or if reached the bottom
if e.target.scrollTop > section.offsetTop or (i is sections.length - 1 and e.target.scrollTop + e.target.clientHeight is e.target.scrollHeight)
for bullet in bullets
bullet.classList.remove 'pagination__bullet_active'
if section.id is do "gallery-#{bullet.dataset.section}".toLowerCase
bullet.classList.add 'pagination__bullet_active'
# Load frames as the scroll into view
loadFrames frames, sliders
# Assign each pagination bullet to a section
for bullet in bullets
do (bullet) ->
bullet.addEventListener 'click', ->
# Smooth scroll to section title
scrollTo scroller.querySelector('.scroller__wrapper'), $id(do "gallery-#{bullet.dataset.section}".toLowerCase).offsetTop, 500
# Hide modal when clicked "Close" or outside of it
overlay.addEventListener 'click', ->
hideModal sliders.horizontalSlider
modal.querySelector('.modal__close').addEventListener 'click', ->
hideModal sliders.horizontalSlider
modal.addEventListener 'click', (e) ->
do e.stopPropagation
false
# Load frames if they get into view when the window is resized
window.addEventListener 'resize', ->
loadFrames frames, sliders
return
loadFrames = (frames, sliders) ->
for frame in frames
do (frame, sliders) ->
frame.addEventListener 'click', (e) ->
# Disable horizontal slider
sliders.horizontalSlider.allowSlidePrev = false
sliders.horizontalSlider.allowSlideNext = false
slider = sliders.gallerySlider
# Show modal
overlay.classList.remove 'overlay_hidden'
modal.classList.remove 'modal_hidden'
# Slide index
index = parseInt frame.dataset.index
# Target slide
slide = slider.slides[index]
# Force load if slide doesn't transition
if index is slider.realIndex and not slide.classList.contains 'modal__item_loaded'
slider.eventsListeners.slideChangeTransitionEnd[0] slider, true
slider.slideToLoop index, 0
# If frame is in view and hasnt started loading yet
if frame.getBoundingClientRect().top < window.innerHeight and not frame.classList.contains 'frame_loaded'
spinner = frame.querySelector '.loader__spinner'
# Start spinning loader
startLoading spinner
# Add loaded class so that it doesnt try to load the frame again
frame.classList.add 'frame_loaded'
img = frame.querySelector 'img'
do (spinner) ->
img.onload = ->
# Stop spinning loader
endLoading spinner
# Show image
@classList.remove 'frame__image_loading'
return
return
# Every frame has the image source in the data-src attribute
img.src = "/public/images/galleries/thumbnails/#{frame.dataset.src.replace /\.\w+$/, '.jpg'}"
return
hideModal = (slider) ->
overlay.classList.add 'overlay_hidden'
modal.classList.add 'modal_hidden'
# Enable horizontal slider
slider.allowSlidePrev = true
slider.allowSlideNext = true
return
# Export main function
export default createGallery