diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 29ca7aedf..5a24121a3 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -31,6 +31,88 @@ function vjsReplay(endTime) { }); } +$j.ajaxSetup ({timeout: AJAX_TIMEOUT }); //sets timeout for all getJSON. + +var cueFrames = null; //make cueFrames availaible even if we don't send another ajax query + +function initialAlarmCues () { + $j.getJSON("api/events/"+eventData.Id+".json", setAlarmCues); //get frames data for alarmCues and inserts into html +} + +function setAlarmCues (data) { + cueFrames = data.event.Frame; + alarmHtml = '
' + renderAlarmCues() + '
'; + $j(".vjs-progress-control").append(alarmHtml); + $j(".vjs-control-bar").addClass("vjs-zm"); +} + +function renderAlarmCues () { + if (cueFrames) { + var cueRatio = $j("#videoobj").width() / (cueFrames[cueFrames.length - 1].Delta * 100); + var minAlarm = Math.ceil(1/cueRatio); + var spanTimeStart = 0; + var spanTimeEnd = 0; + var alarmed = 0; + var alarmHtml = ""; + var pixSkewNone = 0; + var pixSkewAlarm = 0; + var skip = 0; + for (let i = 0; i < cueFrames.length; i++) { + skip = 0; + frame = cueFrames[i]; + if (frame.Type == "Alarm" && alarmed == 0) { //From nothing to alarm. End nothing and start alarm. + alarmed = 1; + if (frame.Delta == 0) continue; //If event starts with an alarm or too few for a nonespan + spanTimeEnd = frame.Delta * 100; + spanTime = spanTimeEnd - spanTimeStart; + let pix = cueRatio * spanTime; + pixSkewNone += pix - Math.round(pix);//average out the rounding errors. + pix = Math.round(pix); + if ((pixSkewNone > 1 || pixSkewNone < -1) && pix + Math.round(pixSkewNone) > 0) { //add skew if it's a pixel and won't zero out span. + pix += Math.round(pixSkewNone); + pixSkewNone = pixSkewNone - Math.round(pixSkewNone); + } + alarmHtml += ''; + spanTimeStart = spanTimeEnd; + } else if (frame.Type !== "Alarm" && alarmed == 1) { //from alarm to nothing. End alarm and start nothing. + futNone = 0; + indexPlus = i+1; + if (((frame.Delta * 100) - spanTimeStart) < minAlarm && indexPlus < cueFrames.length) continue; //alarm is too short and there is more event + while (futNone < minAlarm) { //check ahead to see if there's enough for a nonespan + if (indexPlus >= cueFrames.length) break; //check if end of event. + futNone = (cueFrames[indexPlus].Delta *100) - (frame.Delta *100); + if (cueFrames[indexPlus].Type == "Alarm") { + i = --indexPlus; + skip = 1; + break; + } + indexPlus++; + } + if (skip == 1) continue; //javascript doesn't support continue 2; + spanTimeEnd = frame.Delta *100; + spanTime = spanTimeEnd - spanTimeStart; + alarmed = 0; + pix = cueRatio * spanTime; + pixSkewAlarm += pix - Math.round(pix); + pix = Math.round(pix); + if ((pixSkewAlarm > 1 || pixSkewAlarm < -1) && pix + Math.round(pixSkewAlarm) > 0) { + pix += Math.round(pixSkewAlarm); + pixSkewAlarm = pixSkewAlarm - Math.round(pixSkewAlarm); + } + alarmHtml += ''; + spanTimeStart = spanTimeEnd; + } else if (frame.Type == "Alarm" && alarmed == 1 && i + 1 >= cueFrames.length) { //event ends on an alarm + spanTimeEnd = frame.Delta * 100; + spanTime = spanTimeEnd - spanTimeStart; + alarmed = 0; + pix = Math.round(cueRatio * spanTime); + alarmHtml += ''; + } + } + return alarmHtml; + } +} + function setButtonState( element, butClass ) { if ( element ) { element.className = butClass; @@ -841,6 +923,7 @@ function initPage() { //FIXME prevent blocking...not sure what is happening or best way to unblock if ( $('videoobj') ) { vid = videojs("videoobj"); + initialAlarmCues(); //call ajax+renderAlarmCues after videojs is. should be only call to initialAlarmCues } if ( vid ) { /*