codevise/pageflow

View on GitHub
entry_types/paged/packages/pageflow-paged/src/frontend/jqueryUiWidgets/playerControls.js

Summary

Maintainability
B
6 hrs
Test Coverage
import $ from 'jquery';

$.widget('pageflow.playerControls', {
  _create: function() {
    var player = this.options.player;

    var playButton = this.element.find('.vjs-play-control');
    var progressHolder = this.element.find('.vjs-progress-holder');
    var playProgress = this.element.find('.vjs-play-progress');
    var currentTimeDisplay = this.element.find('.vjs-current-time-display');
    var durationDisplay = this.element.find('.vjs-duration-display');
    var progressHandler = this.element.find('.vjs-slider-handle');
    var smallTimestamp = durationDisplay.html().length === 5 && durationDisplay.html().charAt(0) === "0";

    if(smallTimestamp) {
      durationDisplay.html("0:00");
      currentTimeDisplay.html(currentTimeDisplay.html().substr(1));
    }
    else {
      durationDisplay.html("00:00");
    }

    player.on('timeupdate', function (position, duration) {
      var percent = duration > 0 ? (player.position / player.duration) * 100 : 0;

      if (!isNaN(position)) {
        if (player.duration < 600) {
          $(currentTimeDisplay).html(player.formatTime(position).substr(1));
          $(durationDisplay).html(player.formatTime(duration).substr(1));
        }
        else {
          $(currentTimeDisplay).html(player.formatTime(position));
          $(durationDisplay).html(player.formatTime(duration));
        }
      }

      var handlerLeft = ((progressHolder.width() - progressHandler.width()) * percent / 100);

      progressHandler.css({left: handlerLeft + 'px'});
      playProgress.css({width: percent + "%"});
    });

    player.on('play', function (position, duration) {
      $(playButton).removeClass('vjs-play');
      $(playButton).addClass('vjs-pause vjs-playing');
    });

    player.on('pause', function (position, duration) {
      $(playButton).removeClass('vjs-pause vjs-playing');
      $(playButton).addClass('vjs-play');
    });

    player.on('ended', function (position, duration) {
      $(playButton).removeClass('vjs-pause vjs-playing');
      $(playButton).addClass('vjs-play');
    });

    function togglePlay() {
      if (player.playing) {
        player.pause();
      }
      else {
        player.play();
      }
    }

    playButton.on({
      'mousedown touchstart': function() {
        $(this).addClass('pressed');
      },
      'mouseup touchend': function() {
        $(this).removeClass('pressed');
      },
      'click': function() {
        togglePlay();
      },
      'keypress': function(e) {
        if (e.which == 13) {
          var that = this;

          togglePlay();
          setTimeout(function() {
            $(that).focus();
          }, 20);
        }
      }
    });

    $(progressHolder).on('mousedown touchstart', function(event) {
      player.seek(getSeekPosition(event));

      $('body').on({
        'mousemove touchmove': onMouseMove,
        'mouseup touchend': onMouseUp
      });

      function onMouseMove(event) {
        player.seek(getSeekPosition(event));
      }

      function onMouseUp() {
        $('body').off({
          'mousemove touchmove': onMouseMove,
          'mouseup touchend': onMouseUp
        });
      }

      function getSeekPosition(event) {
        var position = getPointerPageX(event) - $(progressHolder).offset().left;
        var fraction = position / $(progressHolder).width();

        return Math.min(Math.max(fraction, 0), 1) * player.duration;
      }

      function getPointerPageX(event) {
        if (event.originalEvent.changedTouches) {
          return event.originalEvent.changedTouches[0].pageX;
        } else {
          return event.pageX;
        }
      }
    });
  }
});