From 6840031ee30122f94c3f0700cfed4917083e15ea Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 27 Sep 2016 11:51:55 -0400 Subject: [PATCH] fix auth timeout and user session[username] when checking auth hash for speedup --- web/ajax/stream.php | 22 +- web/includes/functions.php | 14 +- web/skins/classic/views/js/watch.js | 1058 ++++++++++++--------------- 3 files changed, 512 insertions(+), 582 deletions(-) diff --git a/web/ajax/stream.php b/web/ajax/stream.php index 637c43dc9..bb7453646 100644 --- a/web/ajax/stream.php +++ b/web/ajax/stream.php @@ -108,7 +108,16 @@ switch ( $data['type'] ) $data['rate'] /= RATE_BASE; $data['delay'] = round( $data['delay'], 2 ); $data['zoom'] = round( $data['zoom']/SCALE_BASE, 1 ); - $data['auth'] = generateAuthHash( ZM_AUTH_HASH_IPS ); + if ( ZM_OPT_USE_AUTH && ZM_AUTH_RELAY == "hashed" ) { + $time = time(); + // Regenerate auth hash after 1 hour + if ( $_SESSION['AuthHashGeneratedAt'] < $time - 3600 ) { + // generateAuthHash needs to be able to set $_SESSION['AuthHashGeneratedAt'] so we need to reopen the session + session_start(); + $data['auth'] = generateAuthHash( ZM_AUTH_HASH_IPS ); + session_write_close(); + } + } ajaxResponse( array( 'status'=>$data ) ); break; } @@ -118,7 +127,16 @@ switch ( $data['type'] ) //$data['progress'] = sprintf( "%.2f", $data['progress'] ); $data['rate'] /= RATE_BASE; $data['zoom'] = round( $data['zoom']/SCALE_BASE, 1 ); - $data['auth'] = generateAuthHash( ZM_AUTH_HASH_IPS ); + if ( ZM_OPT_USE_AUTH && ZM_AUTH_RELAY == "hashed" ) { + $time = time(); + // Regenerate auth hash after 1 hour + if ( $_SESSION['AuthHashGeneratedAt'] < $time - 3600 ) { + // generateAuthHash needs to be able to set $_SESSION['AuthHashGeneratedAt'] so we need to reopen the session + session_start(); + $data['auth'] = generateAuthHash( ZM_AUTH_HASH_IPS ); + session_write_close(); + } + } ajaxResponse( array( 'status'=>$data ) ); break; } diff --git a/web/includes/functions.php b/web/includes/functions.php index a3e3834dc..df13e36a5 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -109,16 +109,23 @@ function CORSHeaders() { function getAuthUser( $auth ) { if ( ZM_OPT_USE_AUTH && ZM_AUTH_RELAY == "hashed" && !empty($auth) ) { - $remoteAddr = ""; + $remoteAddr = ''; if ( ZM_AUTH_HASH_IPS ) { $remoteAddr = $_SERVER['REMOTE_ADDR']; if ( !$remoteAddr ) { Error( "Can't determine remote address for authentication, using empty string" ); - $remoteAddr = ""; + $remoteAddr = ''; } } - $sql = "select Username, Password, Enabled, Stream+0, Events+0, Control+0, Monitors+0, System+0, MonitorIds from Users where Enabled = 1"; + if ( $_SESSION['username'] ) { + # Most of the time we will be logged in already and the session will have our username, so we can significantly speed up our hash testing by only looking at our user. + # Only really important if you have a lot of users. + $sql = "SELECT Username, Password FROM Users WHERE Enabled = 1 AND Username='".$_SESSION['username']."'"; + } else { + $sql = "SELECT Username, Password FROM Users WHERE Enabled = 1"; + } + foreach ( dbFetchAll( $sql ) as $user ) { $now = time(); for ( $i = 0; $i < 2; $i++, $now -= (60*60) ) { // Try for last two hours @@ -145,6 +152,7 @@ function generateAuthHash( $useRemoteAddr ) { $authKey = ZM_AUTH_HASH_SECRET.$_SESSION['username'].$_SESSION['passwordHash'].$time[2].$time[3].$time[4].$time[5]; } $auth = md5( $authKey ); + $_SESSION{'AuthHashGeneratedAt'} = time(); } else { $auth = ""; } diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 139b0cec5..071c51259 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -1,106 +1,96 @@ -function setButtonState( element, butClass ) -{ - element.className = butClass; - element.disabled = (butClass != 'inactive'); +function setButtonState( element, butClass ) { + element.className = butClass; + element.disabled = (butClass != 'inactive'); } -function showEvents() -{ - $('ptzControls').addClass( 'hidden' ); - $('events').removeClass( 'hidden' ); - if ( $('eventsControl') ) - $('eventsControl').addClass('hidden'); - if ( $('controlControl') ) - $('controlControl').removeClass('hidden'); - showMode = "events"; +function showEvents() { + $('ptzControls').addClass( 'hidden' ); + $('events').removeClass( 'hidden' ); + if ( $('eventsControl') ) + $('eventsControl').addClass('hidden'); + if ( $('controlControl') ) + $('controlControl').removeClass('hidden'); + showMode = "events"; } -function showPtzControls() -{ - $('events').addClass( 'hidden' ); - $('ptzControls').removeClass( 'hidden' ); - if ( $('eventsControl') ) - $('eventsControl').removeClass('hidden'); - if ( $('controlControl') ) - $('controlControl').addClass('hidden'); - showMode = "control"; +function showPtzControls() { + $('events').addClass( 'hidden' ); + $('ptzControls').removeClass( 'hidden' ); + if ( $('eventsControl') ) + $('eventsControl').removeClass('hidden'); + if ( $('controlControl') ) + $('controlControl').addClass('hidden'); + showMode = "control"; } -function changeScale() -{ - var scale = $('scale').get('value'); - var newWidth = ( monitorWidth * scale ) / SCALE_BASE; - var newHeight = ( monitorHeight * scale ) / SCALE_BASE; +function changeScale() { + var scale = $('scale').get('value'); + var newWidth = ( monitorWidth * scale ) / SCALE_BASE; + var newHeight = ( monitorHeight * scale ) / SCALE_BASE; - Cookie.write( 'zmWatchScale'+monitorId, scale, { duration: 10*365 } ); + Cookie.write( 'zmWatchScale'+monitorId, scale, { duration: 10*365 } ); - /*Stream could be an applet so can't use moo tools*/ - var streamImg = document.getElementById('liveStream'+monitorId); - if ( streamImg ) { - streamImg.style.width = newWidth + "px"; - streamImg.style.height = newHeight + "px"; + /*Stream could be an applet so can't use moo tools*/ + var streamImg = document.getElementById('liveStream'+monitorId); + if ( streamImg ) { + streamImg.style.width = newWidth + "px"; + streamImg.style.height = newHeight + "px"; - streamImg.src = streamImg.src.replace(/scale=\d+/i,'scale='+scale); - } else { - console.error("No element found for liveStream."); - } + streamImg.src = streamImg.src.replace(/scale=\d+/i,'scale='+scale); + } else { + console.error("No element found for liveStream."); + } } var alarmState = STATE_IDLE; var lastAlarmState = STATE_IDLE; -function setAlarmState( currentAlarmState ) -{ - alarmState = currentAlarmState; +function setAlarmState( currentAlarmState ) { + alarmState = currentAlarmState; - var stateString = "Unknown"; - var stateClass = ""; - if ( alarmState == STATE_ALARM ) - stateClass = "alarm"; - else if ( alarmState == STATE_ALERT ) - stateClass = "alert"; - $('stateValue').set( 'text', stateStrings[alarmState] ); - if ( stateClass ) - $('stateValue').setProperty( 'class', stateClass ); - else - $('stateValue').removeProperty( 'class' ); + var stateString = "Unknown"; + var stateClass = ""; + if ( alarmState == STATE_ALARM ) + stateClass = "alarm"; + else if ( alarmState == STATE_ALERT ) + stateClass = "alert"; + $('stateValue').set( 'text', stateStrings[alarmState] ); + if ( stateClass ) + $('stateValue').setProperty( 'class', stateClass ); + else + $('stateValue').removeProperty( 'class' ); - var isAlarmed = ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ); - var wasAlarmed = ( lastAlarmState == STATE_ALARM || lastAlarmState == STATE_ALERT ); + var isAlarmed = ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ); + var wasAlarmed = ( lastAlarmState == STATE_ALARM || lastAlarmState == STATE_ALERT ); - var newAlarm = ( isAlarmed && !wasAlarmed ); - var oldAlarm = ( !isAlarmed && wasAlarmed ); + var newAlarm = ( isAlarmed && !wasAlarmed ); + var oldAlarm = ( !isAlarmed && wasAlarmed ); - if ( newAlarm ) - { - if ( SOUND_ON_ALARM ) - { - // Enable the alarm sound - if ( !canPlayPauseAudio ) - $('alarmSound').removeClass( 'hidden' ); - else - $('MediaPlayer').Play(); - } - if ( POPUP_ON_ALARM ) - { - window.focus(); - } + if ( newAlarm ) { + if ( SOUND_ON_ALARM ) { + // Enable the alarm sound + if ( !canPlayPauseAudio ) + $('alarmSound').removeClass( 'hidden' ); + else + $('MediaPlayer').Play(); } - if ( SOUND_ON_ALARM ) - { - if ( oldAlarm ) - { - // Disable alarm sound - if ( !canPlayPauseAudio ) - $('alarmSound').addClass( 'hidden' ); - else - $('MediaPlayer').Stop(); - } + if ( POPUP_ON_ALARM ) { + window.focus(); } - if ( oldAlarm) //done with an event do a refresh - eventCmdQuery(); + } + if ( SOUND_ON_ALARM ) { + if ( oldAlarm ) { + // Disable alarm sound + if ( !canPlayPauseAudio ) + $('alarmSound').addClass( 'hidden' ); + else + $('MediaPlayer').Stop(); + } + } + if ( oldAlarm) //done with an event do a refresh + eventCmdQuery(); - lastAlarmState = alarmState; + lastAlarmState = alarmState; } var streamCmdParms = "view=request&request=stream&connkey="+connKey; @@ -109,339 +99,294 @@ var streamCmdTimer = null; var streamStatus; -function getStreamCmdResponse( respObj, respText ) -{ - watchdogOk("stream"); - if ( streamCmdTimer ) - streamCmdTimer = clearTimeout( streamCmdTimer ); +function getStreamCmdResponse( respObj, respText ) { + watchdogOk("stream"); + if ( streamCmdTimer ) + streamCmdTimer = clearTimeout( streamCmdTimer ); - if ( respObj.result == 'Ok' ) - { - streamStatus = respObj.status; - $('fpsValue').set( 'text', streamStatus.fps ); + if ( respObj.result == 'Ok' ) { + streamStatus = respObj.status; + $('fpsValue').set( 'text', streamStatus.fps ); - setAlarmState( streamStatus.state ); + setAlarmState( streamStatus.state ); - $('levelValue').set( 'text', streamStatus.level ); - if ( streamStatus.level > 95 ) - $('levelValue').className = "alarm"; - else if ( streamStatus.level > 80 ) - $('levelValue').className = "alert"; + $('levelValue').set( 'text', streamStatus.level ); + if ( streamStatus.level > 95 ) + $('levelValue').className = "alarm"; + else if ( streamStatus.level > 80 ) + $('levelValue').className = "alert"; + else + $('levelValue').className = "ok"; + + var delayString = secsToTime( streamStatus.delay ); + + if ( streamStatus.paused == true ) { + $('modeValue').set( 'text', "Paused" ); + $('rate').addClass( 'hidden' ); + $('delayValue').set( 'text', delayString ); + $('delay').removeClass( 'hidden' ); + $('level').removeClass( 'hidden' ); + streamCmdPause( false ); + } else if ( streamStatus.delayed == true ) { + $('modeValue').set( 'text', "Replay" ); + $('rateValue').set( 'text', streamStatus.rate ); + $('rate').removeClass( 'hidden' ); + $('delayValue').set( 'text', delayString ); + $('delay').removeClass( 'hidden' ); + $('level').removeClass( 'hidden' ); + if ( streamStatus.rate == 1 ) { + streamCmdPlay( false ); + } else if ( streamStatus.rate > 0 ) { + if ( streamStatus.rate < 1 ) + streamCmdSlowFwd( false ); else - $('levelValue').className = "ok"; - - var delayString = secsToTime( streamStatus.delay ); - - if ( streamStatus.paused == true ) - { - $('modeValue').set( 'text', "Paused" ); - $('rate').addClass( 'hidden' ); - $('delayValue').set( 'text', delayString ); - $('delay').removeClass( 'hidden' ); - $('level').removeClass( 'hidden' ); - streamCmdPause( false ); - } - else if ( streamStatus.delayed == true ) - { - $('modeValue').set( 'text', "Replay" ); - $('rateValue').set( 'text', streamStatus.rate ); - $('rate').removeClass( 'hidden' ); - $('delayValue').set( 'text', delayString ); - $('delay').removeClass( 'hidden' ); - $('level').removeClass( 'hidden' ); - if ( streamStatus.rate == 1 ) - { - streamCmdPlay( false ); - } - else if ( streamStatus.rate > 0 ) - { - if ( streamStatus.rate < 1 ) - streamCmdSlowFwd( false ); - else - streamCmdFastFwd( false ); - } - else - { - if ( streamStatus.rate > -1 ) - streamCmdSlowRev( false ); - else - streamCmdFastRev( false ); - } - } - else - { - $('modeValue').set( 'text', "Live" ); - $('rate').addClass( 'hidden' ); - $('delay').addClass( 'hidden' ); - $('level').addClass( 'hidden' ); - streamCmdPlay( false ); - } - $('zoomValue').set( 'text', streamStatus.zoom ); - if ( streamStatus.zoom == "1.0" ) - setButtonState( $('zoomOutBtn'), 'unavail' ); + streamCmdFastFwd( false ); + } else { + if ( streamStatus.rate > -1 ) + streamCmdSlowRev( false ); else - setButtonState( $('zoomOutBtn'), 'inactive' ); + streamCmdFastRev( false ); + } // rate + } else { + $('modeValue').set( 'text', "Live" ); + $('rate').addClass( 'hidden' ); + $('delay').addClass( 'hidden' ); + $('level').addClass( 'hidden' ); + streamCmdPlay( false ); + } // end if paused or delayed - if ( canEditMonitors ) - { - if ( streamStatus.enabled ) - { - $('enableAlarmsLink').addClass( 'hidden' ); - $('disableAlarmsLink').removeClass( 'hidden' ); - if ( streamStatus.forced ) - { - $('forceAlarmLink').addClass( 'hidden' ); - $('cancelAlarmLink').removeClass( 'hidden' ); - } - else - { - $('forceAlarmLink').removeClass( 'hidden' ); - $('cancelAlarmLink').addClass( 'hidden' ); - } - $('forceCancelAlarm').removeClass( 'hidden' ); - } - else - { - $('enableAlarmsLink').removeClass( 'hidden' ); - $('disableAlarmsLink').addClass( 'hidden' ); - $('forceCancelAlarm').addClass( 'hidden' ); - } - $('enableDisableAlarms').removeClass( 'hidden' ); - } - if ( streamStatus.auth ) { - // Try to reload the image stream. - var streamImg = document.getElementById('liveStream'); - if ( streamImg ) - streamImg.src = streamImg.src.replace( /auth=\w+/i, 'auth='+streamStatus.auth ); - } // end if haev a new auth hash - } - else { - checkStreamForErrors("getStreamCmdResponse",respObj);//log them - // Try to reload the image stream. - var streamImg = document.getElementById('liveStream'+monitorId); - if ( streamImg ) { - streamImg.src = streamImg.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); - console.log("Changing lviestream src to " + streamImg.src); + $('zoomValue').set( 'text', streamStatus.zoom ); + if ( streamStatus.zoom == "1.0" ) + setButtonState( $('zoomOutBtn'), 'unavail' ); + else + setButtonState( $('zoomOutBtn'), 'inactive' ); + + if ( canEditMonitors ) { + if ( streamStatus.enabled ) { + $('enableAlarmsLink').addClass( 'hidden' ); + $('disableAlarmsLink').removeClass( 'hidden' ); + if ( streamStatus.forced ) { + $('forceAlarmLink').addClass( 'hidden' ); + $('cancelAlarmLink').removeClass( 'hidden' ); } else { - console.log("Unable to find streamImg liveStream"); + $('forceAlarmLink').removeClass( 'hidden' ); + $('cancelAlarmLink').addClass( 'hidden' ); } - } + $('forceCancelAlarm').removeClass( 'hidden' ); + } else { + $('enableAlarmsLink').removeClass( 'hidden' ); + $('disableAlarmsLink').addClass( 'hidden' ); + $('forceCancelAlarm').addClass( 'hidden' ); + } + $('enableDisableAlarms').removeClass( 'hidden' ); + } // end if canEditMonitors - var streamCmdTimeout = statusRefreshTimeout; - if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) - streamCmdTimeout = streamCmdTimeout/5; - streamCmdTimer = streamCmdQuery.delay( streamCmdTimeout ); + if ( streamStatus.auth ) { + console.log("Haev a new auth hash" + streamStatus.auth); + // Try to reload the image stream. + var streamImg = document.getElementById('liveStream'); + if ( streamImg ) + streamImg.src = streamImg.src.replace( /auth=\w+/i, 'auth='+streamStatus.auth ); + } // end if haev a new auth hash + } else { + checkStreamForErrors("getStreamCmdResponse",respObj);//log them + // Try to reload the image stream. + var streamImg = document.getElementById('liveStream'+monitorId); + if ( streamImg ) { + streamImg.src = streamImg.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); + console.log("Changing lviestream src to " + streamImg.src); + } else { + console.log("Unable to find streamImg liveStream"); + } + } + + var streamCmdTimeout = statusRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + streamCmdTimeout = streamCmdTimeout/5; + streamCmdTimer = streamCmdQuery.delay( streamCmdTimeout ); } -function streamCmdPause( action ) -{ - setButtonState( $('pauseBtn'), 'active' ); - setButtonState( $('playBtn'), 'inactive' ); +function streamCmdPause( action ) { + setButtonState( $('pauseBtn'), 'active' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_PAUSE ); +} + +function streamCmdPlay( action ) { + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'active' ); + if ( streamStatus.delayed == true ) { setButtonState( $('stopBtn'), 'inactive' ); setButtonState( $('fastFwdBtn'), 'inactive' ); setButtonState( $('slowFwdBtn'), 'inactive' ); setButtonState( $('slowRevBtn'), 'inactive' ); setButtonState( $('fastRevBtn'), 'inactive' ); - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_PAUSE ); -} - -function streamCmdPlay( action ) -{ - setButtonState( $('pauseBtn'), 'inactive' ); - setButtonState( $('playBtn'), 'active' ); - if ( streamStatus.delayed == true ) - { - setButtonState( $('stopBtn'), 'inactive' ); - setButtonState( $('fastFwdBtn'), 'inactive' ); - setButtonState( $('slowFwdBtn'), 'inactive' ); - setButtonState( $('slowRevBtn'), 'inactive' ); - setButtonState( $('fastRevBtn'), 'inactive' ); - } - else - { - setButtonState( $('stopBtn'), 'unavail' ); - setButtonState( $('fastFwdBtn'), 'unavail' ); - setButtonState( $('slowFwdBtn'), 'unavail' ); - setButtonState( $('slowRevBtn'), 'unavail' ); - setButtonState( $('fastRevBtn'), 'unavail' ); - } - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_PLAY ); -} - -function streamCmdStop( action ) -{ - setButtonState( $('pauseBtn'), 'inactive' ); - setButtonState( $('playBtn'), 'unavail' ); - setButtonState( $('stopBtn'), 'active' ); + } else { + setButtonState( $('stopBtn'), 'unavail' ); setButtonState( $('fastFwdBtn'), 'unavail' ); setButtonState( $('slowFwdBtn'), 'unavail' ); setButtonState( $('slowRevBtn'), 'unavail' ); setButtonState( $('fastRevBtn'), 'unavail' ); - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_STOP ); - setButtonState( $('stopBtn'), 'unavail' ); - setButtonState( $('playBtn'), 'active' ); + } + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_PLAY ); } -function streamCmdFastFwd( action ) -{ - setButtonState( $('pauseBtn'), 'inactive' ); - setButtonState( $('playBtn'), 'inactive' ); - setButtonState( $('stopBtn'), 'inactive' ); - setButtonState( $('fastFwdBtn'), 'inactive' ); - setButtonState( $('slowFwdBtn'), 'inactive' ); - setButtonState( $('slowRevBtn'), 'inactive' ); - setButtonState( $('fastRevBtn'), 'inactive' ); - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_FASTFWD ); +function streamCmdStop( action ) { + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'unavail' ); + setButtonState( $('stopBtn'), 'active' ); + setButtonState( $('fastFwdBtn'), 'unavail' ); + setButtonState( $('slowFwdBtn'), 'unavail' ); + setButtonState( $('slowRevBtn'), 'unavail' ); + setButtonState( $('fastRevBtn'), 'unavail' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_STOP ); + setButtonState( $('stopBtn'), 'unavail' ); + setButtonState( $('playBtn'), 'active' ); } -function streamCmdSlowFwd( action ) -{ - setButtonState( $('pauseBtn'), 'inactive' ); - setButtonState( $('playBtn'), 'inactive' ); - setButtonState( $('stopBtn'), 'inactive' ); - setButtonState( $('fastFwdBtn'), 'inactive' ); - setButtonState( $('slowFwdBtn'), 'active' ); - setButtonState( $('slowRevBtn'), 'inactive' ); - setButtonState( $('fastRevBtn'), 'inactive' ); - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_SLOWFWD ); - setButtonState( $('pauseBtn'), 'active' ); - setButtonState( $('slowFwdBtn'), 'inactive' ); +function streamCmdFastFwd( action ) { + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_FASTFWD ); } -function streamCmdSlowRev( action ) -{ - setButtonState( $('pauseBtn'), 'inactive' ); - setButtonState( $('playBtn'), 'inactive' ); - setButtonState( $('stopBtn'), 'inactive' ); - setButtonState( $('fastFwdBtn'), 'inactive' ); - setButtonState( $('slowFwdBtn'), 'inactive' ); - setButtonState( $('slowRevBtn'), 'active' ); - setButtonState( $('fastRevBtn'), 'inactive' ); - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_SLOWREV ); - setButtonState( $('pauseBtn'), 'active' ); - setButtonState( $('slowRevBtn'), 'inactive' ); +function streamCmdSlowFwd( action ) { + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'active' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_SLOWFWD ); + setButtonState( $('pauseBtn'), 'active' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); } -function streamCmdFastRev( action ) -{ - setButtonState( $('pauseBtn'), 'inactive' ); - setButtonState( $('playBtn'), 'inactive' ); - setButtonState( $('stopBtn'), 'inactive' ); - setButtonState( $('fastFwdBtn'), 'inactive' ); - setButtonState( $('slowFwdBtn'), 'inactive' ); - setButtonState( $('slowRevBtn'), 'inactive' ); - setButtonState( $('fastRevBtn'), 'inactive' ); - if ( action ) - streamCmdReq.send( streamCmdParms+"&command="+CMD_FASTREV ); +function streamCmdSlowRev( action ) { + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'active' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_SLOWREV ); + setButtonState( $('pauseBtn'), 'active' ); + setButtonState( $('slowRevBtn'), 'inactive' ); } -function streamCmdZoomIn( x, y ) -{ - streamCmdReq.send( streamCmdParms+"&command="+CMD_ZOOMIN+"&x="+x+"&y="+y ); +function streamCmdFastRev( action ) { + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_FASTREV ); } -function streamCmdZoomOut() -{ - streamCmdReq.send( streamCmdParms+"&command="+CMD_ZOOMOUT ); +function streamCmdZoomIn( x, y ) { + streamCmdReq.send( streamCmdParms+"&command="+CMD_ZOOMIN+"&x="+x+"&y="+y ); } -function streamCmdScale( scale ) -{ - streamCmdReq.send( streamCmdParms+"&command="+CMD_SCALE+"&scale="+scale ); +function streamCmdZoomOut() { + streamCmdReq.send( streamCmdParms+"&command="+CMD_ZOOMOUT ); } -function streamCmdPan( x, y ) -{ - streamCmdReq.send( streamCmdParms+"&command="+CMD_PAN+"&x="+x+"&y="+y ); +function streamCmdScale( scale ) { + streamCmdReq.send( streamCmdParms+"&command="+CMD_SCALE+"&scale="+scale ); } -function streamCmdQuery() -{ - streamCmdReq.send( streamCmdParms+"&command="+CMD_QUERY ); +function streamCmdPan( x, y ) { + streamCmdReq.send( streamCmdParms+"&command="+CMD_PAN+"&x="+x+"&y="+y ); +} + +function streamCmdQuery() { + streamCmdReq.send( streamCmdParms+"&command="+CMD_QUERY ); } var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate"; var statusCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', data: statusCmdParms, timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getStatusCmdResponse } ); var statusCmdTimer = null; -function getStatusCmdResponse( respObj, respText ) -{ - watchdogOk("status"); - if ( statusCmdTimer ) - statusCmdTimer = clearTimeout( statusCmdTimer ); +function getStatusCmdResponse( respObj, respText ) { + watchdogOk("status"); + if ( statusCmdTimer ) + statusCmdTimer = clearTimeout( statusCmdTimer ); - if ( respObj.result == 'Ok' ) - { - $('fpsValue').set( 'text', respObj.monitor.FrameRate ); - setAlarmState( respObj.monitor.Status ); - } - else - checkStreamForErrors("getStatusCmdResponse",respObj); + if ( respObj.result == 'Ok' ) { + $('fpsValue').set( 'text', respObj.monitor.FrameRate ); + setAlarmState( respObj.monitor.Status ); + } else + checkStreamForErrors("getStatusCmdResponse",respObj); - var statusCmdTimeout = statusRefreshTimeout; - if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) - statusCmdTimeout = statusCmdTimeout/5; - statusCmdTimer = statusCmdQuery.delay( statusCmdTimeout ); + var statusCmdTimeout = statusRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + statusCmdTimeout = statusCmdTimeout/5; + statusCmdTimer = statusCmdQuery.delay( statusCmdTimeout ); } -function statusCmdQuery() -{ - statusCmdReq.send(); +function statusCmdQuery() { + statusCmdReq.send(); } var alarmCmdParms = "view=request&request=alarm&id="+monitorId; var alarmCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getAlarmCmdResponse, onTimeout: streamCmdQuery } ); var alarmCmdFirst = true; -function getAlarmCmdResponse( respObj, respText ) -{ - checkStreamForErrors("getAlarmCmdResponse",respObj); +function getAlarmCmdResponse( respObj, respText ) { + checkStreamForErrors("getAlarmCmdResponse",respObj); } -function cmdDisableAlarms() -{ - alarmCmdReq.send( alarmCmdParms+"&command=disableAlarms" ); +function cmdDisableAlarms() { + alarmCmdReq.send( alarmCmdParms+"&command=disableAlarms" ); } -function cmdEnableAlarms() -{ - alarmCmdReq.send( alarmCmdParms+"&command=enableAlarms" ); +function cmdEnableAlarms() { + alarmCmdReq.send( alarmCmdParms+"&command=enableAlarms" ); } -function cmdForceAlarm() -{ - alarmCmdReq.send( alarmCmdParms+"&command=forceAlarm" ); +function cmdForceAlarm() { + alarmCmdReq.send( alarmCmdParms+"&command=forceAlarm" ); } -function cmdCancelForcedAlarm() -{ - alarmCmdReq.send( alarmCmdParms+"&command=cancelForcedAlarm" ); +function cmdCancelForcedAlarm() { + alarmCmdReq.send( alarmCmdParms+"&command=cancelForcedAlarm" ); } -function getActResponse( respObj, respText ) -{ - if ( respObj.result == 'Ok' ) - { - if ( respObj.refreshParent ) - { - window.opener.location.reload(); - } +function getActResponse( respObj, respText ) { + if ( respObj.result == 'Ok' ) { + if ( respObj.refreshParent ) { + window.opener.location.reload(); } - eventCmdQuery(); + } + eventCmdQuery(); } -function deleteEvent( event, eventId ) -{ - var actParms = "view=request&request=event&action=delete&id="+eventId; - var actReq = new Request.JSON( { url: thisUrl, method: 'post', timeout: 3000, data: actParms, onSuccess: getActResponse } ); - actReq.send(); - event.stop(); +function deleteEvent( event, eventId ) { + var actParms = "view=request&request=event&action=delete&id="+eventId; + var actReq = new Request.JSON( { url: thisUrl, method: 'post', timeout: 3000, data: actParms, onSuccess: getActResponse } ); + actReq.send(); + event.stop(); } var eventCmdParms = "view=request&request=status&entity=events&id="+monitorId+"&count="+maxDisplayEvents+"&sort=Id%20desc"; @@ -449,288 +394,247 @@ var eventCmdReq = new Request.JSON( { url: thisUrl, method: 'post', timeout: AJA var eventCmdTimer = null; var eventCmdFirst = true; -function highlightRow( row ) -{ - $(row).toggleClass( 'highlight' ); +function highlightRow( row ) { + $(row).toggleClass( 'highlight' ); } -function getEventCmdResponse( respObj, respText ) -{ - watchdogOk("event"); - if ( eventCmdTimer ) - eventCmdTimer = clearTimeout( eventCmdTimer ); +function getEventCmdResponse( respObj, respText ) { + watchdogOk("event"); + if ( eventCmdTimer ) + eventCmdTimer = clearTimeout( eventCmdTimer ); - if ( respObj.result == 'Ok' ) - { - var dbEvents = respObj.events.reverse(); - var eventList = $('eventList'); - var eventListBody = $(eventList).getElement( 'tbody' ); - var eventListRows = $(eventListBody).getElements( 'tr' ); + if ( respObj.result == 'Ok' ) { + var dbEvents = respObj.events.reverse(); + var eventList = $('eventList'); + var eventListBody = $(eventList).getElement( 'tbody' ); + var eventListRows = $(eventListBody).getElements( 'tr' ); - eventListRows.each( function( row ) { row.removeClass( 'updated' ); } ); + eventListRows.each( function( row ) { row.removeClass( 'updated' ); } ); - for ( var i = 0; i < dbEvents.length; i++ ) - { - var event = dbEvents[i]; - var row = $('event'+event.Id); - var newEvent = (row == null ? true : false); - if ( newEvent ) - { - row = new Element( 'tr', { 'id': 'event'+event.Id } ); - new Element( 'td', { 'class': 'colId' } ).inject( row ); - new Element( 'td', { 'class': 'colName' } ).inject( row ); - new Element( 'td', { 'class': 'colTime' } ).inject( row ); - new Element( 'td', { 'class': 'colSecs' } ).inject( row ); - new Element( 'td', { 'class': 'colFrames' } ).inject( row ); - new Element( 'td', { 'class': 'colScore' } ).inject( row ); - new Element( 'td', { 'class': 'colDelete' } ).inject( row ); + for ( var i = 0; i < dbEvents.length; i++ ) { + var event = dbEvents[i]; + var row = $('event'+event.Id); + var newEvent = (row == null ? true : false); + if ( newEvent ) { + row = new Element( 'tr', { 'id': 'event'+event.Id } ); + new Element( 'td', { 'class': 'colId' } ).inject( row ); + new Element( 'td', { 'class': 'colName' } ).inject( row ); + new Element( 'td', { 'class': 'colTime' } ).inject( row ); + new Element( 'td', { 'class': 'colSecs' } ).inject( row ); + new Element( 'td', { 'class': 'colFrames' } ).inject( row ); + new Element( 'td', { 'class': 'colScore' } ).inject( row ); + new Element( 'td', { 'class': 'colDelete' } ).inject( row ); - var cells = row.getElements( 'td' ); + var cells = row.getElements( 'td' ); - var link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&trms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1', event.Width, event.Height ] ) } }); - link.set( 'text', event.Id ); - link.inject( row.getElement( 'td.colId' ) ); + var link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&trms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1', event.Width, event.Height ] ) } }); + link.set( 'text', event.Id ); + link.inject( row.getElement( 'td.colId' ) ); - link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&trms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1', event.Width, event.Height ] ) } }); - link.set( 'text', event.Name ); - link.inject( row.getElement( 'td.colName' ) ); + link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&trms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1', event.Width, event.Height ] ) } }); + link.set( 'text', event.Name ); + link.inject( row.getElement( 'td.colName' ) ); - row.getElement( 'td.colTime' ).set( 'text', event.StartTime ); - row.getElement( 'td.colSecs' ).set( 'text', event.Length ); + row.getElement( 'td.colTime' ).set( 'text', event.StartTime ); + row.getElement( 'td.colSecs' ).set( 'text', event.Length ); - link = new Element( 'a', { 'href': '#', 'events': { 'click': createFramesPopup.pass( [ event.Id, event.Width, event.Height ] ) } }); - link.set( 'text', event.Frames+'/'+event.AlarmFrames ); - link.inject( row.getElement( 'td.colFrames' ) ); + link = new Element( 'a', { 'href': '#', 'events': { 'click': createFramesPopup.pass( [ event.Id, event.Width, event.Height ] ) } }); + link.set( 'text', event.Frames+'/'+event.AlarmFrames ); + link.inject( row.getElement( 'td.colFrames' ) ); - link = new Element( 'a', { 'href': '#', 'events': { 'click': createFramePopup.pass( [ event.Id, '0', event.Width, event.Height ] ) } }); - link.set( 'text', event.AvgScore+'/'+event.MaxScore ); - link.inject( row.getElement( 'td.colScore' ) ); + link = new Element( 'a', { 'href': '#', 'events': { 'click': createFramePopup.pass( [ event.Id, '0', event.Width, event.Height ] ) } }); + link.set( 'text', event.AvgScore+'/'+event.MaxScore ); + link.inject( row.getElement( 'td.colScore' ) ); - link = new Element( 'a', { 'href': '#', 'title': deleteString, 'events': { 'click': function( event ) { deleteEvent( event, event.Id ); }.bind( link ), 'mouseover': highlightRow.pass( row ), 'mouseout': highlightRow.pass( row ) } }); - link.set( 'text', 'X' ); - link.inject( row.getElement( 'td.colDelete' ) ); + link = new Element( 'a', { 'href': '#', 'title': deleteString, 'events': { 'click': function( event ) { deleteEvent( event, event.Id ); }.bind( link ), 'mouseover': highlightRow.pass( row ), 'mouseout': highlightRow.pass( row ) } }); + link.set( 'text', 'X' ); + link.inject( row.getElement( 'td.colDelete' ) ); - if ( i == 0 ) - row.inject( $(eventListBody) ); - else - { - row.inject( $(eventListBody), 'top' ); - if ( !eventCmdFirst ) - row.addClass( 'recent' ); - } - } - else - { - row.getElement( 'td.colName a' ).set( 'text', event.Name ); - row.getElement( 'td.colSecs' ).set( 'text', event.Length ); - row.getElement( 'td.colFrames a' ).set( 'text', event.Frames+'/'+event.AlarmFrames ); - row.getElement( 'td.colScore a' ).set( 'text', event.AvgScore+'/'+event.MaxScore ); - row.removeClass( 'recent' ); - } - row.addClass( 'updated' ); - } - - var rows = $(eventListBody).getElements( 'tr' ); - for ( var i = 0; i < rows.length; i++ ) - { - if ( !rows[i].hasClass( 'updated' ) ) - { - rows[i].destroy(); - rows.splice( i, 1 ); - i--; - } - } - while ( rows.length > maxDisplayEvents ) - { - rows[rows.length-1].destroy(); - rows.length--; + if ( i == 0 ) + row.inject( $(eventListBody) ); + else { + row.inject( $(eventListBody), 'top' ); + if ( !eventCmdFirst ) + row.addClass( 'recent' ); } + } else { + row.getElement( 'td.colName a' ).set( 'text', event.Name ); + row.getElement( 'td.colSecs' ).set( 'text', event.Length ); + row.getElement( 'td.colFrames a' ).set( 'text', event.Frames+'/'+event.AlarmFrames ); + row.getElement( 'td.colScore a' ).set( 'text', event.AvgScore+'/'+event.MaxScore ); + row.removeClass( 'recent' ); + } + row.addClass( 'updated' ); } - else - checkStreamForErrors("getEventCmdResponse",respObj); - var eventCmdTimeout = eventsRefreshTimeout; - if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) - eventCmdTimeout = eventCmdTimeout/5; - eventCmdTimer = eventCmdQuery.delay( eventCmdTimeout ); - eventCmdFirst = false; + var rows = $(eventListBody).getElements( 'tr' ); + for ( var i = 0; i < rows.length; i++ ) { + if ( !rows[i].hasClass( 'updated' ) ) { + rows[i].destroy(); + rows.splice( i, 1 ); + i--; + } + } + while ( rows.length > maxDisplayEvents ) { + rows[rows.length-1].destroy(); + rows.length--; + } + } else + checkStreamForErrors("getEventCmdResponse",respObj); + + var eventCmdTimeout = eventsRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + eventCmdTimeout = eventCmdTimeout/5; + eventCmdTimer = eventCmdQuery.delay( eventCmdTimeout ); + eventCmdFirst = false; } -function eventCmdQuery() -{ - if ( eventCmdTimer ) //avoid firing another if we are firing one - eventCmdTimer = clearTimeout( eventCmdTimer ); - eventCmdReq.send(); +function eventCmdQuery() { + if ( eventCmdTimer ) //avoid firing another if we are firing one + eventCmdTimer = clearTimeout( eventCmdTimer ); + eventCmdReq.send(); } var controlParms = "view=request&request=control&id="+monitorId; var controlReq = new Request.JSON( { url: thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getControlResponse } ); -function getControlResponse( respObj, respText ) -{ - if ( !respObj ) - return; - //console.log( respText ); - if ( respObj.result != 'Ok' ) - { - alert( "Control response was status = "+respObj.status+"\nmessage = "+respObj.message ); - } +function getControlResponse( respObj, respText ) { + if ( !respObj ) + return; + //console.log( respText ); + if ( respObj.result != 'Ok' ) { + alert( "Control response was status = "+respObj.status+"\nmessage = "+respObj.message ); + } } -function controlCmd( control, event, xtell, ytell ) -{ - var locParms = ""; - if ( event && (xtell || ytell) ) - { - var xEvent = new Event( event ); - var target = xEvent.target; - var coords = $(target).getCoordinates(); +function controlCmd( control, event, xtell, ytell ) { + var locParms = ""; + if ( event && (xtell || ytell) ) { + var xEvent = new Event( event ); + var target = xEvent.target; + var coords = $(target).getCoordinates(); - var l = coords.left; - var t = coords.top; - var x = xEvent.page.x - l; - var y = xEvent.page.y - t; + var l = coords.left; + var t = coords.top; + var x = xEvent.page.x - l; + var y = xEvent.page.y - t; - if ( xtell ) - { - var xge = parseInt( (x*100)/coords.width ); - if ( xtell == -1 ) - xge = 100 - xge; - else if ( xtell == 2 ) - xge = 2*(50 - xge); - locParms += "&xge="+xge; - } - if ( ytell ) - { - var yge = parseInt( (y*100)/coords.height ); - if ( ytell == -1 ) - yge = 100 - yge; - else if ( ytell == 2 ) - yge = 2*(50 - yge); - locParms += "&yge="+yge; - } + if ( xtell ) { + var xge = parseInt( (x*100)/coords.width ); + if ( xtell == -1 ) + xge = 100 - xge; + else if ( xtell == 2 ) + xge = 2*(50 - xge); + locParms += "&xge="+xge; } - controlReq.send( controlParms+"&control="+control+locParms ); - if ( streamMode == "single" ) - fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); + if ( ytell ) { + var yge = parseInt( (y*100)/coords.height ); + if ( ytell == -1 ) + yge = 100 - yge; + else if ( ytell == 2 ) + yge = 2*(50 - yge); + locParms += "&yge="+yge; + } + } + controlReq.send( controlParms+"&control="+control+locParms ); + if ( streamMode == "single" ) + fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); } -function controlCmdImage( x, y ) -{ - var imageControlParms = controlParms; - imageControlParms += "&scale="+scale; - imageControlParms += "&control="+imageControlMode; +function controlCmdImage( x, y ) { + var imageControlParms = controlParms; + imageControlParms += "&scale="+scale; + imageControlParms += "&control="+imageControlMode; - controlReq.send( imageControlParms+"&x="+x+"&y="+y ); - if ( streamMode == "single" ) - fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); + controlReq.send( imageControlParms+"&x="+x+"&y="+y ); + if ( streamMode == "single" ) + fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); } -function fetchImage( streamImage ) -{ +function fetchImage( streamImage ) { streamImage.src = streamImage.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); } -function handleClick( event ) -{ - var target = event.target; - var x = event.page.x - $(target).getLeft(); - var y = event.page.y - $(target).getTop(); - - if ( showMode == "events" || !imageControlMode ) - { - if ( event.shift ) - streamCmdPan( x, y ); - else - streamCmdZoomIn( x, y ); - } +function handleClick( event ) { + var target = event.target; + var x = event.page.x - $(target).getLeft(); + var y = event.page.y - $(target).getTop(); + + if ( showMode == "events" || !imageControlMode ) { + if ( event.shift ) + streamCmdPan( x, y ); else - { - controlCmdImage( x, y ); - } + streamCmdZoomIn( x, y ); + } else { + controlCmdImage( x, y ); + } } -function appletRefresh() -{ - if ( streamStatus && (!streamStatus.paused && !streamStatus.delayed) ) - { - var streamImg = $('liveStream'); - var parent = streamImg.getParent(); - streamImg.dispose(); - streamImg.inject( parent ); - if ( appletRefreshTime ) - appletRefresh.delay( appletRefreshTime*1000 ); - } - else - { - appletRefresh.delay( 15*1000 ); //if we are paused or delayed check every 15 seconds if we are live yet... - } +function appletRefresh() { + if ( streamStatus && (!streamStatus.paused && !streamStatus.delayed) ) { + var streamImg = $('liveStream'); + var parent = streamImg.getParent(); + streamImg.dispose(); + streamImg.inject( parent ); + if ( appletRefreshTime ) + appletRefresh.delay( appletRefreshTime*1000 ); + } else { + appletRefresh.delay( 15*1000 ); //if we are paused or delayed check every 15 seconds if we are live yet... + } } var watchdogInactive = { - 'stream': false, - 'status': false, - 'event': false + 'stream': false, + 'status': false, + 'event': false }; var watchdogFunctions = { - 'stream': streamCmdQuery, - 'status': statusCmdQuery, - 'event': eventCmdQuery + 'stream': streamCmdQuery, + 'status': statusCmdQuery, + 'event': eventCmdQuery }; //Make sure the various refreshes are still taking effect -function watchdogCheck( type ) -{ - if ( watchdogInactive[type] ) -{ - console.log( "Detected streamWatch of type: " + type + " stopped, restarting" ); - watchdogFunctions[type](); - watchdogInactive[type] = false; - } - else - { - watchdogInactive[type] = true; - } -} - -function watchdogOk( type ) -{ +function watchdogCheck( type ) { + if ( watchdogInactive[type] ) { + console.log( "Detected streamWatch of type: " + type + " stopped, restarting" ); + watchdogFunctions[type](); watchdogInactive[type] = false; + } else { + watchdogInactive[type] = true; + } } -function initPage() -{ - if ( streamMode == "single" ) - { - statusCmdTimer = statusCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); - watchdogCheck.pass('status').periodical(statusRefreshTimeout*2); - } - else - { - streamCmdTimer = streamCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); - watchdogCheck.pass('stream').periodical(statusRefreshTimeout*2); - } - - eventCmdTimer = eventCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); - watchdogCheck.pass('event').periodical(eventsRefreshTimeout*2); +function watchdogOk( type ) { + watchdogInactive[type] = false; +} - if ( canStreamNative || streamMode == "single" ) - { - var streamImg = $('imageFeed').getElement('img'); - if ( !streamImg ) - streamImg = $('imageFeed').getElement('object'); - if ( streamMode == "single" ) - { - streamImg.addEvent( 'click', fetchImage.pass( streamImg ) ); - fetchImage.pass( streamImg ).periodical( imageRefreshTimeout ); - } - else - streamImg.addEvent( 'click', function( event ) { handleClick( event ); } ); - } +function initPage() { + if ( streamMode == "single" ) { + statusCmdTimer = statusCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('status').periodical(statusRefreshTimeout*2); + } else { + streamCmdTimer = streamCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('stream').periodical(statusRefreshTimeout*2); + } - if ( refreshApplet && appletRefreshTime ) - appletRefresh.delay( appletRefreshTime*1000 ); + eventCmdTimer = eventCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('event').periodical(eventsRefreshTimeout*2); + + if ( canStreamNative || streamMode == "single" ) { + var streamImg = $('imageFeed').getElement('img'); + if ( !streamImg ) + streamImg = $('imageFeed').getElement('object'); + if ( streamMode == "single" ) { + streamImg.addEvent( 'click', fetchImage.pass( streamImg ) ); + fetchImage.pass( streamImg ).periodical( imageRefreshTimeout ); + } else + streamImg.addEvent( 'click', function( event ) { handleClick( event ); } ); + } + + if ( refreshApplet && appletRefreshTime ) + appletRefresh.delay( appletRefreshTime*1000 ); } // Kick everything off