var videoExtension function setVideoSrc(video, src) { var ext if (!videoExtension) { [ ['video/mp4; codecs="avc1.42E01E, mp4a.40.2"', '.mp4'], ['video/webm; codecs="vp8, vorbis"', '.webm'], ].forEach(opt => { if (videoExtension) { return } if (video.canPlayType(opt[0]).replace('no', '')) { videoExtension = opt[1] } }) } src = src.replace('.webm', videoExtension) if (src != video.src) { //console.log(video.src, '->', src) video.src = src } } function scrollTo(element) { var delta = element.offsetTop - document.scrollingElement.scrollTop, duration = 1000, t = 40, n = duration / t, step = delta / n; function scroll() { if (document.scrollingElement.scrollTop + step > element.offsetTop) { document.scrollingElement.scrollTop = element.offsetTop n = 0 } else { document.scrollingElement.scrollTop += step } n-- if (n) setTimeout(scroll, t) } scroll() } function showOverlay(event) { //console.log('show overlay', event.target, event) event.stopPropagation() event.preventDefault() document.querySelectorAll('#video-overlay').forEach(element => element.remove()) var video = event.target var rect = video.getBoundingClientRect(); if (video._frame) { rect = video._frame.getBoundingClientRect(); } var overlay = document.createElement('div') overlay.id = 'video-overlay' overlay.style.top = video.style.top overlay.style.width = rect.width + 'px' overlay.style.height = rect.height + 'px' overlay.style.position = 'absolute' overlay.style.display = 'flex' overlay.style.alignItems = 'center' overlay.style.justifyContent = 'center' //overlay.style.fontSize = '45px' video.controls = false var off = `` var on = `` if (video.muted) { overlay.innerHTML = off } else { overlay.innerHTML = on } overlay.addEventListener('click', event=> { const muted = video.muted document.querySelectorAll('pandora-scroll').forEach(el => el.mute() ) video.muted = !muted if (video.muted) { overlay.innerHTML = off } else { overlay.innerHTML = on } }) var timeout = setTimeout(() => { video.controls = false overlay.remove() }, 3000) overlay.addEventListener('mousemove', event=> { clearTimeout(timeout) timeout = setTimeout(() => { video.controls = false overlay.remove() }, 500) }) video.parentElement.appendChild(overlay) } function isInside(config, annotation) { if (!config['in'] && !config['out']) { return true } if (annotation['in'] < config['out'] && annotation['out'] > config['in']) { annotation['in'] = Math.max(annotation['in'], config['in']) annotation['out'] = Math.min(annotation['out'], config['out']) return true } return false } function isElementInViewport (el) { var rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */ Math.floor(rect.right) <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */ ); } function onVisibilityChange(el, callback) { var old_visible; return function () { var visible = isElementInViewport(el); if (visible != old_visible) { old_visible = visible; if (visible) { el.classList.add('visible') } else { el.classList.remove('visible') } if (typeof callback == 'function') { callback(visible); } } } } function parseTime(value) { return value.split(":").map(p => parseFloat(p)).reduce((c, p) => { return c*60 + p}, 0) } function splitText(text, duration) { var parts = [] text = text.replace(//g, '
').replace(//g, '
') var length = text.replace(/
/g, '').length var texts = text.split('
') texts.forEach(part => { parts.push({ value: part.trim(), duration: duration / length * part.length }) }) return parts }