var loadedLiveGrids = {}
var monitorPops = {}
var liveGridElements = {}
var runningJpegStreams = {}
var liveGrid = $('#monitors_live')
var liveGridOpenCountElements = $('.liveGridOpenCount')
var liveGridOpenCount = 0
//
var onLiveStreamInitiateExtensions = []
function onLiveStreamInitiate(callback){
onLiveStreamInitiateExtensions.push(callback)
}
var onLiveStreamCloseExtensions = []
function onLiveStreamClose(callback){
onLiveStreamCloseExtensions.push(callback)
}
var onSignalCheckLiveStreamExtensions = []
function onSignalCheckLiveStream(callback){
onSignalCheckLiveStreamExtensions.push(callback)
}
var onBuildStreamElementExtensions = []
function onBuildStreamElement(callback){
onBuildStreamElementExtensions.push(callback)
}
//
function setLiveGridOpenCount(addOrRemove){
liveGridOpenCount += addOrRemove
liveGridOpenCountElements.text(liveGridOpenCount)
}
function getLiveGridData(){
return liveGrid.data('gridstack')
}
function getMonitorsPerRow(){
var x
switch(dashboardOptions().montage){
case'1':
x = '12'
break;
case'2':
x = '6'
break;
case'3':
x = '4'
break;
case'4':
x = '3'
break;
case'5':
x = '5'
break;
case'6':
x = '2'
break;
default://3
x = '4'
break;
}
return x
}
function saveLiveGridBlockPositions() {
var monitors = {}
liveGrid.find(" .monitor_item").each(function(n,v){
var el = $(v)
var item = {}
item.ke = el.attr('data-ke')
item.mid = el.attr('data-mid')
item.x = el.attr('data-gs-x')
item.y = el.attr('data-gs-y')
item.height = el.attr('data-gs-height')
item.width = el.attr('data-gs-width')
monitors[item.ke+''+item.mid] = item
})
$user.details.monitorOrder = monitors;
mainSocket.f({f:'monitorOrder',monitorOrder:monitors})
}
function buildStreamElementHtml(streamType){
var html = ''
if(window.jpegModeOn === true){
html = '';
}else{
switch(streamType){
case'hls':case'flv':case'mp4':
html = ``;
break;
case'mjpeg':
html = '';
break;
case'jpeg':
html = '
';
break;
default://base64//h265
html = '';
break;
}
$.each(onBuildStreamElementExtensions,function(n,extender){
var newHtml = extender(streamType)
html = newHtml ? newHtml : html
})
}
return html
}
function resetMonitorCanvas(monitorId,initiateAfter,subStreamChannel){
var monitor = loadedMonitors[monitorId]
var details = monitor.details
var streamType = subStreamChannel ? details.substream ? details.substream.output.stream_type : 'hls' : details.stream_type
if(!liveGridElements[monitorId])return;
var streamBlock = liveGridElements[monitorId].monitorItem.find('.stream-block')
closeLiveGridPlayer(monitorId,false)
streamBlock.find('.stream-element').remove()
streamBlock.append(buildStreamElementHtml(streamType))
if(initiateAfter)initiateLiveGridPlayer(monitor,subStreamChannel)
}
function replaceMonitorInfoInHtml(htmlString,monitor){
var monitorMutes = dashboardOptions().monitorMutes || {}
return htmlString
.replaceAll('$GROUP_KEY',monitor.ke)
.replaceAll('$MONITOR_ID',monitor.mid)
.replaceAll('$MONITOR_MODE',monitor.mode)
.replaceAll('$MONITOR_NAME',monitor.name)
.replaceAll('$MONITOR_MUTE_ICON',(monitorMutes[monitor.mid] !== 1 ? 'volume-up' : 'volume-off'));
}
function buildLiveGridBlock(monitor){
if(monitor.mode === 'stop'){
new PNotify({
title: lang.sorryNo,
text: lang[`Cannot watch a monitor that isn't running.`],
type: 'danger'
})
return
}
var monitorDetails = safeJsonParse(monitor.details)
var monitorLiveId = `monitor_live_${monitor.mid}`
var subStreamChannel = monitor.subStreamChannel
var streamType = subStreamChannel ? monitorDetails.substream ? monitorDetails.substream.output.stream_type : 'hls' : monitorDetails.stream_type
var streamElement = buildStreamElementHtml(streamType)
var streamBlockInfo = definitions['Monitor Stream Window']
if(!loadedLiveGrids[monitor.mid])loadedLiveGrids[monitor.mid] = {}
var baseHtml = `