You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

199 lines
5.3 KiB
JavaScript

class Controller {
constructor(model, view) {
this.model = model;
this.view = view;
// Get video code
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
let videoToLoad = urlParams.get("v");
let video = document.getElementById("video");
if (videoToLoad != null && videoToLoad != "") {
this.model.loadXml(videoToLoad).then(
function (v) {
this.model.parseXML(v);
let comments = this.model.comments;
let videoFileName = this.model.getVideoFileName(v);
this.view.drawCommentTitles(comments);
this.addEventListeners();
this.loadVideo(videoFileName).then(
function () {
video.addEventListener(
"loadedmetadata",
function () {
this.view.videoPlayer.updateVideoDuration();
this.view.drawCommentsToVideo(comments);
this.addEventListenersToVideoControls();
}.bind(this)
);
}.bind(this)
);
}.bind(this)
);
} else {
this.view.showAddVideo();
this.addEventListenersToAddVideo();
}
}
addEventListenersToAddVideo() {
let form = document.getElementById("form");
form.addEventListener(
"submit",
function () {
document.getElementById("xmlFile").value = this.view.editor.getValue();
}.bind(this)
);
}
// Přidání listenerů
addEventListenersToVideoControls() {
const video = document.getElementById("video");
const videoControls = document.getElementById("video-controls");
const togleButton = document.getElementById("togglePlayIcon");
videoControls.addEventListener(
"click",
function (e) {
if (e.target !== videoControls && e.target !== togleButton) {
return;
}
this.view.videoPlayer.togglePlay();
}.bind(this)
);
video.addEventListener(
"timeupdate",
function () {
this.view.videoPlayer.updateProgress();
this.getActiveComment();
this.getActivePopup();
}.bind(this)
);
video.addEventListener(
"ended",
function () {
this.view.videoPlayer.showButton();
}.bind(this)
);
const seek = document.getElementById("seek");
seek.addEventListener(
"input",
function () {
this.view.videoPlayer.skipAhead(seek.value);
}.bind(this)
);
const volume = document.getElementById("volume");
volume.addEventListener("input", this.view.videoPlayer.updateVolume);
document.addEventListener(
"keyup",
function (e) {
if (e.keyCode == 32) {
this.view.videoPlayer.togglePlay();
}
}.bind(this)
);
}
addEventListeners() {
let comments = document.getElementsByClassName("comment");
for (let i = 0; i < comments.length; i++) {
comments[i].addEventListener(
"mouseover",
function () {
this.view.commentHover(comments[i].firstChild);
}.bind(this)
);
comments[i].addEventListener(
"mouseout",
function () {
if (!comments[i].classList.contains("activeComment"))
this.view.commentHover(comments[i].firstChild, false);
}.bind(this)
);
}
}
async loadVideo(v) {
let video = document.getElementById("video");
let source = document.createElement("source");
video.classList.remove("hidden");
source.setAttribute("src", "./videos/" + v);
video.append(source);
await video.load();
this.view.createVideoPlayerObject();
}
getActiveComment() {
const video = document.getElementById("video");
let currentTime = video.currentTime;
for (let i = 0; i < this.model.comments.length; i++) {
if (
currentTime >= this.model.comments[i].start &&
currentTime <= this.model.comments[i].end
) {
this.activeComment = i;
break;
}
if (i == this.model.comments.length - 1) {
this.activeComment = null;
}
}
if (this.activeComment !== this.lastActiveComment) {
this.view.activateComment(null);
this.view.activateCommentText(null);
if (this.activeComment !== null) {
this.view.activateComment(this.activeComment);
for (
let i = 0;
i < this.model.comments[this.activeComment].text.length;
i++
) {
this.view.activateCommentText(
this.model.comments[this.activeComment].text[i]
);
}
}
}
this.lastActiveComment = this.activeComment;
}
getActivePopup() {
const video = document.getElementById("video");
let currentTime = video.currentTime;
for (let i = 0; i < this.model.popups.length; i++) {
if (
currentTime >= this.model.popups[i].start &&
currentTime <= this.model.popups[i].end
) {
this.activePopup = i;
break;
}
if (i == this.model.popups.length - 1) {
this.activePopup = null;
}
}
if (this.activePopup !== this.lastActivePopup) {
if (this.activePopup !== null) {
this.view.activatePopup(this.model.popups[this.activePopup].text);
} else {
this.view.activatePopup(null);
}
}
this.lastActivePopup = this.activePopup;
}
}