184 lines
5.5 KiB
JavaScript
184 lines
5.5 KiB
JavaScript
/**
|
|
* Static functions for creating pagination
|
|
*/
|
|
(function(context, $) {
|
|
|
|
"use strict";
|
|
|
|
context.JK = context.JK || {};
|
|
context.JK.PlaybackControls = function($parentElement){
|
|
var logger = context.JK.logger;
|
|
var $playButton = $('.play-button img.playbutton', $parentElement);
|
|
var $pauseButton = $('.play-button img.pausebutton', $parentElement);
|
|
var $currentTime = $('.recording-current', $parentElement);
|
|
var $duration = $('.duration-time', $parentElement);
|
|
var $sliderBar = $('.recording-playback', $parentElement);
|
|
var $slider = $('.recording-slider', $parentElement);
|
|
var $self = $(this);
|
|
|
|
var playbackPlaying = false;
|
|
var playbackDurationMs = 0;
|
|
var playbackPositionMs = 0;
|
|
var durationChanged = false;
|
|
|
|
var endReached = false;
|
|
var dragging = false;
|
|
var playingWhenDragStart = false;
|
|
var draggingUpdateTimer = null;
|
|
var canUpdateBackend = false;
|
|
|
|
function startPlay() {
|
|
updateIsPlaying(true);
|
|
if(endReached) {
|
|
update(0, playbackDurationMs, playbackPlaying);
|
|
}
|
|
$self.triggerHandler('play');
|
|
}
|
|
|
|
function stopPlay() {
|
|
updateIsPlaying(false);
|
|
$self.triggerHandler('pause');
|
|
}
|
|
|
|
function updateOffsetBasedOnPosition(offsetLeft) {
|
|
var sliderBarWidth = $sliderBar.width();
|
|
|
|
playbackPositionMs = parseInt((offsetLeft / sliderBarWidth) * playbackDurationMs);
|
|
updateCurrentTimeText(playbackPositionMs);
|
|
if(canUpdateBackend) {
|
|
$self.triggerHandler('change-position', {positionMs: playbackPositionMs});
|
|
canUpdateBackend = false;
|
|
}
|
|
}
|
|
|
|
function startDrag(e, ui) {
|
|
dragging = true;
|
|
playingWhenDragStart = playbackPlaying;
|
|
draggingUpdateTimer = setInterval(function() { canUpdateBackend = true; }, 333); // only call backend up to 3 times a second while dragging
|
|
if(playingWhenDragStart) {
|
|
stopPlay();
|
|
}
|
|
}
|
|
|
|
function stopDrag(e, ui) {
|
|
dragging = false;
|
|
|
|
clearInterval(draggingUpdateTimer);
|
|
|
|
canUpdateBackend = true;
|
|
updateOffsetBasedOnPosition(ui.position.left);
|
|
|
|
if(playingWhenDragStart) {
|
|
playingWhenDragStart = false;
|
|
startPlay();
|
|
}
|
|
}
|
|
|
|
function onDrag(e, ui) {
|
|
updateOffsetBasedOnPosition(ui.position.left);
|
|
}
|
|
|
|
$playButton.on('click', function(e) {
|
|
startPlay();
|
|
return false;
|
|
});
|
|
|
|
$pauseButton.on('click', function(e) {
|
|
stopPlay();
|
|
return false;
|
|
});
|
|
|
|
$sliderBar.on('click', function(e) {
|
|
var offset = e.pageX - $(this).offset().left;
|
|
canUpdateBackend = true;
|
|
updateOffsetBasedOnPosition(offset);
|
|
updateSliderPosition(playbackPositionMs);
|
|
return false;
|
|
})
|
|
|
|
$slider.draggable({
|
|
axis: 'x',
|
|
containment: $sliderBar,
|
|
start: startDrag,
|
|
stop: stopDrag,
|
|
drag: onDrag
|
|
});
|
|
|
|
function update(currentTimeMs, durationTimeMs, isPlaying) {
|
|
|
|
if(dragging) {
|
|
return;
|
|
}
|
|
|
|
// at the end of the play, the duration sets to 0, as does currentTime. but isPlaying does not reset to
|
|
if(currentTimeMs == 0 && durationTimeMs == 0) {
|
|
if(isPlaying) {
|
|
isPlaying = false;
|
|
durationTimeMs = playbackDurationMs;
|
|
currentTimeMs = playbackDurationMs;
|
|
stopPlay();
|
|
endReached = true;
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
updateDurationTime(durationTimeMs);
|
|
updateCurrentTime(currentTimeMs);
|
|
updateIsPlaying(isPlaying);
|
|
|
|
durationChanged = false;
|
|
}
|
|
|
|
function updateDurationTime(timeMs) {
|
|
if(timeMs != playbackDurationMs) {
|
|
$duration.text(context.JK.prettyPrintSeconds(parseInt(timeMs / 1000)));
|
|
playbackDurationMs = timeMs;
|
|
durationChanged = true;
|
|
}
|
|
}
|
|
|
|
function updateCurrentTimeText(timeMs) {
|
|
$currentTime.text(context.JK.prettyPrintSeconds(parseInt(timeMs / 1000)));
|
|
}
|
|
|
|
function updateSliderPosition(timeMs) {
|
|
|
|
var slideWidthPx = $sliderBar.width();
|
|
var xPos = Math.ceil(timeMs / playbackDurationMs * slideWidthPx);
|
|
$slider.css('left', xPos);
|
|
}
|
|
|
|
function updateCurrentTime(timeMs) {
|
|
if(timeMs != playbackPositionMs || durationChanged) {
|
|
|
|
updateCurrentTimeText(timeMs);
|
|
updateSliderPosition(timeMs);
|
|
|
|
playbackPositionMs = timeMs;
|
|
}
|
|
}
|
|
|
|
function updateIsPlaying(isPlaying) {
|
|
if(isPlaying != playbackPlaying) {
|
|
if(isPlaying) {
|
|
$playButton.hide();
|
|
$pauseButton.show();
|
|
}
|
|
else {
|
|
$playButton.show();
|
|
$pauseButton.hide();
|
|
}
|
|
|
|
playbackPlaying = isPlaying;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
this.update = update;
|
|
|
|
return this;
|
|
}
|
|
})(window, jQuery); |