/* global $ */ var Private = { addControls: function() { var self = this; this.$audioControl = $('
'); this.$videoControl = $('
'); this.$audioControl.on('click', function () { Handlers.audioControlClick.call(self); }); this.$videoControl.on('click', function () { Handlers.videoControlClick.call(self); }); this.$container.append(this.$audioControl); this.$container.append(this.$videoControl); }, cancelClick: function() { this.mouseIsDown = false; if (this.hasMoved) { } $(document).trigger(VideoView.events.dragEnd); } }; var Handlers = { mousedown: function(event) { this.mouseIsDown = true; this.hasMoved = false; this.mouseMoveStart = { x: event.pageX, y: event.pageY }; this.posStart = { x: parseInt(this.$container.css('left'), '10'), y: parseInt(this.$container.css('top'), '10') } $(document).trigger(VideoView.events.mousedown); }, mouseup: function(event) { $(document).trigger(VideoView.events.mouseup, [this]); var storedTime = this.lastClick; var now = Date.now(); this.lastClick = now; if (now - storedTime < this.config.DOUBLE_CLICK_TOLERANCE) { $(document).trigger(VideoView.events.doubleClick, [this]); } }, mousemove: function(event) { var diffX, diffY, newX, newY; if (this.$parent && this.mouseIsDown) { this.manuallyPositioned = true; this.hasMoved = true; diffX = event.pageX - this.mouseMoveStart.x; diffY = this.mouseMoveStart.y - event.pageY; newX = this.posStart.x + diffX; newY = this.posStart.y - diffY; this.$container.css({ top: newY, left: newX }); } }, audioControlClick: function() { if (this.audioStatus) { this.audioOff(); } else { this.audioOn(); } $(document).trigger(VideoView.events.audioControlClick, [this]); }, videoControlClick: function() { if (this.videoStatus) { this.videoOff(); } else { this.videoOn(); } $(document).trigger(VideoView.events.videoControlClick, [this]); }, }; var VideoView = function(video, $parent, id, isMyself, config) { var self = this; this.$parent = $parent; // mapView this.video = video; this.id = id; this.config = config; this.mouseIsDown = false; this.mouseDownOffset = { x: 0, y: 0 }; this.lastClick = null; this.hasMoved = false; this.audioStatus = true; this.videoStatus = true; this.$container = $('
'); this.$container.addClass('collaborator-video' + (isMyself ? ' my-video' : '')); this.$container.attr('id', 'container_' + id); var $vidContainer = $('
'); $vidContainer.addClass('video-cutoff'); $vidContainer.append(this.video); this.avatar = config.avatar; this.$avatar = $(''); $vidContainer.append(this.$avatar); this.$container.append($vidContainer); this.$container.on('mousedown', function (event) { Handlers.mousedown.call(self, event); }); if (isMyself) { Private.addControls.call(this); } // suppress contextmenu this.video.oncontextmenu = function () { return false; }; if (this.$parent) this.setParent(this.$parent); }; VideoView.prototype.setParent = function($parent) { var self = this; this.$parent = $parent; this.$parent.off('.video' + this.id); this.$parent.on('mouseup.video' + this.id, function (event) { Handlers.mouseup.call(self, event); Private.cancelClick.call(self); }); this.$parent.on('mousemove.video' + this.id, function (event) { Handlers.mousemove.call(self, event); }); } VideoView.prototype.setAvatar = function (src) { this.$avatar.attr('src', src); this.avatar = src; } VideoView.prototype.remove = function () { this.$container.off(); if (this.$parent) this.$parent.off('.video' + this.id); this.$container.remove(); } VideoView.prototype.videoOff = function () { this.$videoControl.addClass('active'); this.$avatar.show(); this.videoStatus = false; } VideoView.prototype.videoOn = function () { this.$videoControl.removeClass('active'); this.$avatar.hide(); this.videoStatus = true; } VideoView.prototype.audioOff = function () { this.$audioControl.addClass('active'); this.audioStatus = false; } VideoView.prototype.audioOn = function () { this.$audioControl.removeClass('active'); this.audioStatus = true; } /** * @class * @static */ VideoView.events = { mousedown: "VideoView:mousedown", mouseup: "VideoView:mouseup", doubleClick: "VideoView:doubleClick", dragEnd: "VideoView:dragEnd", audioControlClick: "VideoView:audioControlClick", videoControlClick: "VideoView:videoControlClick", }; export default VideoView