Source: VideoPlayer.js

/** A video player
 * @constructor
 */
hui.ui.VideoPlayer = function(options) {
  this.options = options;
  this.element = hui.get(options.element);
  this.placeholder = hui.get.firstByTag(this.element, 'div');
  this.name = options.name;
  this.state = {
    duration: 0,
    time: 0,
    loaded: 0
  };
  this.handlers = [hui.ui.VideoPlayer.HTML5, hui.ui.VideoPlayer.QuickTime, hui.ui.VideoPlayer.Embedded];
  this.handler = null;
  hui.ui.extend(this);
  if (this.options.video) {
    if (this.placeholder) {
      hui.listen(this.placeholder, 'click', function() {
        this.setVideo(this.options.video);
      }.bind(this));
    } else {
      hui.ui.onReady(function() {
        this.setVideo(this.options.video);
      }.bind(this));
    }
  }
};

hui.ui.VideoPlayer.prototype = {
  setVideo: function(video) {
    if (this.placeholder) {
      this.placeholder.style.display = 'none';
    }
    this.handler = this.getHandler(video);
    this.element.appendChild(this.handler.element);
    if (this.handler.showController()) {
      this.buildController();
    }
  },
  getHandler: function(video) {
    for (var i = 0; i < this.handlers.length; i++) {
      var handler = this.handlers[i];
      if (handler.isSupported(video)) {
        return new handler(video, this);
      }
    }
  },
  buildController: function() {
    var e = hui.build('div', {
      'class': 'hui_videoplayer_controller',
      parent: this.element
    });
    this.playButton = hui.build('a', {
      href: '#',
      'class': 'hui_videoplayer_playpause',
      text: 'wait!',
      parent: e
    });
    hui.listen(this.playButton, 'click', this.playPause.bind(this));
    this.status = hui.build('span', {
      'class': 'hui_videoplayer_status',
      parent: e
    });
  },
  onCanPlay: function() {
    this.playButton.update('Play');
  },
  onLoad: function() {
    this.state.loaded = this.state.duration;
    this.updateStatus();
  },
  onDurationChange: function(duration) {
    this.state.duration = duration;
    this.updateStatus();
  },
  onTimeChange: function(time) {
    this.state.time = time;
    this.updateStatus();
  },
  onLoadProgressChange: function(progress) {
    this.state.loaded = progress;
    this.updateStatus();
  },
  playPause: function() {
    if (this.handler.isPlaying()) {
      this.pause();
    } else {
      this.play();
    }
  },
  play: function() {
    this.handler.play();
  },
  pause: function() {
    this.handler.pause();
  },
  updateStatus: function() {
    this.status.innerHTML = this.state.time + ' / ' + this.state.duration + ' / ' + this.state.loaded;
  }
};

///////// HTML5 //////////

hui.ui.VideoPlayer.HTML5 = function(video, player) {
  var e = this.element = hui.build('video', {
    width: video.width,
    height: video.height,
    src: video.src
  });
  hui.listen(e, 'load', player.onLoad.bind(player));
  hui.listen(e, 'canplay', player.onCanPlay.bind(player));
  hui.listen(e, 'durationchange', function(x) {
    player.onDurationChange(e.duration);
  });
  hui.listen(e, 'timeupdate', function() {
    player.onTimeChange(this.element.currentTime);
  }.bind(this));
};

hui.ui.VideoPlayer.HTML5.isSupported = function(video) {
  if (hui.browser.webkitVersion > 528 && (video.type === 'video/quicktime' || video.type === 'video/mp4')) {
    return true;
  }
  return false;
};

hui.ui.VideoPlayer.HTML5.prototype = {
  showController: function() {
    return true;
  },
  pause: function() {
    this.element.pause();
  },
  play: function() {
    this.element.play();
  },
  getTime: function() {
    return this.element.currentTime;
  },
  isPlaying: function() {
    return !this.element.paused;
  }
};

///////// QuickTime //////////

hui.ui.VideoPlayer.QuickTime = function(video, player) {
  this.player = player;
  var e = this.element = hui.build('object', {
    width: video.width,
    height: video.height,
    data: video.src,
    type: 'video/quicktime'
  });
  e.innerHTML = '<param value="false" name="controller"/>' +
    '<param value="true" name="enablejavascript"/>' +
    '<param value="undefined" name="posterframe"/>' +
    '<param value="false" name="showlogo"/>' +
    '<param value="false" name="autostart"/>' +
    '<param value="true" name="cache"/>' +
    '<param value="white" name="bgcolor"/>' +
    '<param value="false" name="aggressivecleanup"/>' +
    '<param value="true" name="saveembedtags"/>' +
    '<param value="true" name="postdomevents"/>';

  hui.listen(e, 'qt_canplay', player.onCanPlay.bind(player));
  hui.listen(e, 'qt_load', player.onLoad.bind(player));
  hui.listen(e, 'qt_progress', function() {
    player.onLoadProgressChange(e.GetMaxTimeLoaded() / 3000);
  });
  hui.listen(e, 'qt_durationchange', function(x) {
    player.onDurationChange(e.GetDuration() / 3000);
  });
  hui.listen(e, 'qt_timechanged', function() {
    player.onTimeChange(e.GetTime());
  });
};

hui.ui.VideoPlayer.QuickTime.isSupported = function(video) {
  return video.html === undefined;
};

hui.ui.VideoPlayer.QuickTime.prototype = {
  showController: function() {
    return true;
  },
  pause: function() {
    window.clearInterval(this.observer);
    this.element.Stop();
  },
  play: function() {
    this.element.Play();
    this.observer = window.setInterval(this.observeVideo.bind(this), 100);
  },
  observeVideo: function() {
    this.player.onTimeChange(this.element.GetTime() / 3000);
  },
  getTime: function() {
    return this.element.GetTime();
  },
  isPlaying: function() {
    return this.element.GetRate() !== 0;
  }
};

///////// Embedded //////////

hui.ui.VideoPlayer.Embedded = function(video, player) {
  this.element = hui.build('div', {
    width: video.width,
    height: video.height,
    html: video.html
  });
};

hui.ui.VideoPlayer.Embedded.isSupported = function(video) {
  return video.html !== undefined;
};

hui.ui.VideoPlayer.Embedded.prototype = {
  showController: function() {
    return false;
  },
  pause: function() {

  },
  play: function() {

  },
  getTime: function() {

  },
  isPlaying: function() {

  }
};