import Slider from './slider'; const $ = require('jquery'); class Timeline { constructor(section) { this.section = section; this.itemSlider = section.find('.item-slider'); this.yearsWrapper = section.find('.years-wrapper'); this.yearsContainer = section.find('.years .container'); this.years = this.yearsWrapper.find('.year-item'); this.initResize(); this.initDragging(); this.buildSlider(); this.initYearClick(); this.activateItem(0); this.initSwitch(); // this.initDocking(); } initDocking() { this.winPosition = 0; this.secPosition = $(this.section.parent()).offset().top; this.scrolling = false; $(window).on('scroll', () => { if (this.scrolling) { return false; } const st = $(window).scrollTop(); if (st > this.winPosition && st < this.secPosition - 100) { this.scrolling = true; $('html, body').animate({scrollTop: this.secPosition - 100}, 200, () => { this.scrolling = false; }) } this.winPosition = st; }) } initSwitch() { this.switches = this.section.siblings('.timeline-tabs').find('a'); this.switchSlides = []; this.switches.each((index, tab) => { const href = tab.href; const id = href.substr(href.indexOf('#')); const target = parseInt($(id).attr('data-index')); this.switchSlides.push(target); tab.setAttribute('data-index', index); tab.setAttribute('data-target', target); }) this.slider.section.on('slide-change', () => { this.switches.removeClass('active'); const cs = this.slider.currentSlide; let i = this.switchSlides.length - 1; while (i >= 0) { if (cs >= this.switchSlides[i]) { this.switches.eq(i).addClass('active'); break; } i--; } }) this.switches.on('click', (e) => { e.preventDefault(); const target = parseInt(e.currentTarget.getAttribute('data-target')); this.slider.goTo(target, false); }) } initResize() { this.resizeTimeout = null; $(window).on('resize', () => { if (this.resizeTimeout) { clearTimeout(this.resizeTimeout); } this.resizeTimeout = setTimeout(() => { this.handleResize(); }, 200) }) this.handleResize(); } handleResize() { this.containerWidth = this.yearsContainer.width(); this.wrapperWidth = this.yearsWrapper.get(0).scrollWidth; this.scrollWidth = this.containerWidth - this.wrapperWidth; this.yearsWrapper.css({'width': this.wrapperWidth + 'px'}); } initDragging() { this.dragOffset = 0; this.wrapperOffset = 0; this.yearsWrapper.get(0).onmousedown = (e) => { this.dragStart(e) }; this.yearsWrapper.get(0).addEventListener('touchstart', (e) => {this.dragStart(e)}); this.yearsWrapper.get(0).addEventListener('touchend', (e) => {this.dragEnd(e)}); this.yearsWrapper.get(0).addEventListener('touchmove', (e) => {this.dragMove(e)}); } dragStart(e) { this.dragOffset = 0; this.dragLast = 0; if (e.type === 'touchstart') { this.dragOrigin = e.touches[0].clientX; } else { this.dragOrigin = e.clientX; document.onmouseup = (e) => { this.dragEnd(e) }; document.onmousemove = (e) => { this.dragMove(e) }; } } dragMove(e) { if (e.type === 'touchmove') { this.dragLast = this.dragOffset; this.dragOffset = this.dragOrigin - e.touches[0].clientX; } else { this.dragLast = this.dragOffset; this.dragOffset = this.dragOrigin - e.clientX; } if (Math.abs(this.dragOffset) > 3) { this.yearsWrapper.addClass('dragging'); } this.wrapperTarget = this.wrapperOffset - this.dragOffset; if (this.wrapperTarget > 0) { this.wrapperTarget = this.wrapperTarget / 4; } else if (this.wrapperTarget < this.scrollWidth) { this.wrapperTarget = this.scrollWidth + (this.wrapperTarget - this.scrollWidth) / 4; } this.yearsWrapper.css({'transform': 'translateX(' + this.wrapperTarget + 'px)'}); } dragEnd() { const velocity = this.dragOffset - this.dragLast; if (Math.abs(velocity) > 5) { this.wrapperTarget = this.wrapperTarget - velocity * 10; } const bounceBack = this.checkScrollEnd(); this.yearsWrapper.removeClass('dragging'); this.wrapperOffset = this.wrapperTarget; if (bounceBack || Math.abs(velocity) > 5) { this.animateToPosition(); } document.onmouseup = null; document.onmousemove = null; } animateToPosition() { this.yearsWrapper.addClass('animate'); requestAnimationFrame(() => { this.yearsWrapper.css({'transform': 'translateX(' + this.wrapperTarget + 'px)'}); setTimeout(() => { this.yearsWrapper.removeClass('animate'); }, 300); }) } buildSlider() { const slides = this.itemSlider.addClass('slider').appendTo(this.itemSlider); this.years.find('.items > li').each((i, li) => { const listItem = $(li); listItem.attr('data-index', i).find('.slide').appendTo(slides); listItem.on('click', () => { this.slider.goTo(i, true); this.activateItem(i); }) }) this.slider = new Slider(slides); this.slider.section.on('slide-change', () => { this.activateItem(this.slider.currentSlide); }) this.slides = this.slider.section.find('.slide'); } initYearClick() { this.years.children('.year').on('click', (e) => { $(e.currentTarget).next('.items').children('li').first().trigger('click'); }) } activateItem(index) { this.years.removeClass('current').find('li.active').removeClass('active'); const yearItem = this.years.find('li[data-index="' + index + '"]').addClass('active').closest('.year-item').addClass('current'); const ww = $(window).width(); const iw = yearItem.outerWidth() * 1.5; if (yearItem.offset().left + iw > ww || yearItem.offset().left < 50) { this.wrapperOffset = this.wrapperTarget = yearItem.position().left * -1; this.checkScrollEnd(); this.animateToPosition(); } if (this.slides.eq(index).hasClass('has-image')) { this.slider.section.addClass('hide-circle'); } else { this.slider.section.removeClass('hide-circle'); } } checkScrollEnd() { if (this.wrapperTarget > 0) { this.wrapperTarget = 0; return true; } else if (this.wrapperTarget < this.scrollWidth) { this.wrapperTarget = this.scrollWidth; return true; } return false; } } $('body').on('ihk-init dynamic-component-loaded gfi-dynamic-init', function () { $('.timeline:not(.initiated)').each((i, el) => { new Timeline($(el)); }) })