/* 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