(function () { if (typeof NodeList.prototype.forEach === "function") return false; NodeList.prototype.forEach = Array.prototype.forEach; })(); function stylePlayer(player, video) { let skin = attachSkin(video.dataset.ckin); player.classList.add(skin); let html = buildControls(skin); player.insertAdjacentHTML('beforeend', html); let updateInterval = 0; let elapsed = 0; let prevTime = 0; if (skin === 'default') { var progress = player.querySelector('.progress');; var progressBar = player.querySelector('.progress__filled'); var toggle = player.querySelectorAll('.toggle'); var fullScreenButton = player.querySelector('.fullscreen'); var seek = player.querySelector('#seek'); var timeElapsed = player.querySelector('#time-elapsed'); var timeDuration = player.querySelector('#time-duration'); timeDuration.innerHTML = String(video.duration | 0).toHHMMSS(); toggle.forEach((button) => { return button.addEventListener('click', () => { togglePlay(video, player); }); }); video.addEventListener('click', function () { togglePlay(this, player); }); video.addEventListener('play', function () { updateButton(this, toggle); updateInterval = setInterval(function () { if (video.paused) return; //chtob ne prigal seek pri peremotke //elapsed += 0.02; // Increase with timer interval if (video.currentTime != prevTime) { elapsed = video.currentTime; // Update if getCurrentTime was changed prevTime = video.currentTime; } let scaleX = (elapsed / video.duration); progressBar.style.transform = 'scaleX(' + scaleX + ')'; if (video.paused) clearInterval(updateInterval); seek.value = video.currentTime * 1000; }, 20); }); video.addEventListener('ended', function () { progressBar.style.transform = 'scaleX(1)'; seek.value = video.currentTime * 1000; }); video.addEventListener('pause', function () { updateButton(this, toggle); clearInterval(updateInterval); }); video.addEventListener('dblclick', function () { return toggleFullScreen(player, fullScreenButton); }) let mousedown = false; let stopAndScrubTimeout = 0; progress.addEventListener('mousemove', (e) => { return mousedown && scrub(e, video, progress, progressBar); }); progress.addEventListener('mousedown', (e) => { scrub(e, video, progress, progressBar, updateInterval); //Таймер для того, чтобы стопать видео, если зажал мышку и не отпустил клик stopAndScrubTimeout = setTimeout(function () { togglePlay(video, player, 1); }, 150); return mousedown = true; }); progress.addEventListener('mouseup', () => { if (typeof stopAndScrubTimeout !== 'undefined') { clearTimeout(stopAndScrubTimeout); } togglePlay(video, player, 0); return mousedown = false; }); fullScreenButton.addEventListener('click', (e) => { return toggleFullScreen(player, fullScreenButton); }); addListenerMulti(player, 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange', (e) => { return onFullScreen(e, player); }); } if (skin === 'circle') { let wrapper = document.createElement('div'); wrapper.classList.add('circle-time-left'); video.parentNode.insertBefore(wrapper, video); wrapper.innerHTML = '
'; var circle = player.querySelector('.progress-ring__circle'); var radius = circle.r.baseVal.value; var circumference = 2 * Math.PI * radius; var timeDuration = player.querySelector('.circle-time'); var iconVolume = player.querySelector('.iconVolume'); circle.style.strokeDasharray = circumference + ' ' + circumference; circle.style.strokeDashoffset = circumference; circle.addEventListener('click', () => { togglePlay(video, player); }); video.addEventListener('play', () => { iconVolume.style.display = 'none'; updateInterval = setInterval(function () { //elapsed += 0.02; // Increase with timer interval if (video.currentTime != prevTime) { elapsed = video.currentTime; // Update if getCurrentTime was changed prevTime = video.currentTime; } let offset = circumference - elapsed / video.duration * circumference; circle.style.strokeDashoffset = offset; if (video.paused) clearInterval(updateInterval); }, 20); }); video.addEventListener('pause', () => { iconVolume.style.display = ''; }); } //Для хрома timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS(); if (skin === 'default') seek.setAttribute('max', video.duration * 1000); //Для Opera / Safari / IE video.addEventListener('loadeddata', function () { timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS(); if (skin === 'default') seek.setAttribute('max', video.duration * 1000); }) video.addEventListener('timeupdate', function () { updateInterval = handleProgress(this, skin, timeDuration, circumference, circle, progressBar, seek, timeElapsed, updateInterval); }); } function showControls(video) { video.setAttribute("controls", "controls"); } function togglePlay(video, player, stop) { if (stop == 1) { video['pause'](); player.classList.remove('is-playing'); return; } else if (stop == 0) { video['play'](); player.classList.add('is-playing'); return; } let method = video.paused ? 'play' : 'pause'; video[method](); video.paused ? player.classList.remove('is-playing') : player.classList.add('is-playing'); } function updateButton(video, toggle) { let icon = video.paused ? 'tgico-play' : 'tgico-pause'; toggle.forEach((button) => { button.classList.remove('tgico-play', 'tgico-pause'); button.classList.add(icon); }); } function handleProgress(video, skin, timeDuration, circumference, circle, progressBar, seek, timeElapsed, updateInterval, mousemove) { clearInterval(updateInterval); let elapsed = 0; let prevTime = 0; if (skin === 'default') { updateInterval = setInterval(function () { if (video.paused) return; if (video.currentTime != prevTime) { elapsed = video.currentTime; // Update if getCurrentTime was changed prevTime = video.currentTime; } let scaleX = (elapsed / video.duration); progressBar.style.transform = 'scaleX(' + scaleX + ')'; if (video.paused) clearInterval(updateInterval); seek.value = video.currentTime * 1000; }, 20); timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS(); return updateInterval; } else if (skin === 'circle') { updateInterval = setInterval(function () { if (video.currentTime != prevTime) { elapsed = video.currentTime; // Update if getCurrentTime was changed prevTime = video.currentTime; } let offset = circumference - elapsed / video.duration * circumference; circle.style.strokeDashoffset = offset; if (video.paused) clearInterval(updateInterval); }, 20); let timeLeft = String((video.duration - video.currentTime) | 0).toHHMMSS(); if (timeLeft != 0 | 0) timeDuration.innerHTML = timeLeft; } } function scrub(e, video, progress, progressBar) { let scrubTime = e.offsetX / progress.offsetWidth * video.duration; video.currentTime = scrubTime; let scaleX = scrubTime / video.duration; if (scaleX > 1) scaleX = 1; if (scaleX < 0) scaleX = 0; progressBar.style.transform = 'scaleX(' + scaleX + ')'; } export function wrapPlayer(video) { let wrapper = document.createElement('div'); wrapper.classList.add('ckin__player'); video.parentNode.insertBefore(wrapper, video); wrapper.appendChild(video); stylePlayer(wrapper, video); return wrapper; } function buildControls(skin) { let html = []; if (skin === 'default') { html.push(''); html.push(''); html.push('