100 are pixel counts; convert them using the zone's pixel area. $thresholdFields = array('MinAlarmPixels', 'MaxAlarmPixels', 'MinFilterPixels', 'MaxFilterPixels', 'MinBlobPixels', 'MaxBlobPixels'); if (isset($_REQUEST['newZone']['Coords'])) { $points = coordsToPoints($_REQUEST['newZone']['Coords']); if ($points) { $zoneArea = getPolyArea($points); $zonePixelArea = $zoneArea / 10000.0 * $monitor->ViewWidth() * $monitor->ViewHeight(); if ($zonePixelArea > 0) { foreach ($thresholdFields as $field) { if (isset($_REQUEST['newZone'][$field]) && $_REQUEST['newZone'][$field] !== '' && floatval($_REQUEST['newZone'][$field]) > 100) { $_REQUEST['newZone'][$field] = round(floatval($_REQUEST['newZone'][$field]) / $zonePixelArea * 100, 2); } } } } } foreach ($thresholdFields as $field) { if (isset($_REQUEST['newZone'][$field]) && $_REQUEST['newZone'][$field] !== '') { $_REQUEST['newZone'][$field] = max(0, min(100, floatval($_REQUEST['newZone'][$field]))); } } unset($_REQUEST['newZone']['Points']); # convert these fields to integer e.g. NULL -> 0 $types = array( 'OverloadFrames' => 'integer', 'ExtendAlarmFrames' => 'integer', ); $changes = getFormChanges($zone, $_REQUEST['newZone'], $types); if ( count($changes) ) { if ( $zid > 0 ) { dbQuery('UPDATE Zones SET '.implode(', ', $changes).' WHERE MonitorId=? AND Id=?', array($mid, $zid)); } else { dbQuery('INSERT INTO Zones SET MonitorId=?, '.implode(', ', $changes), array($mid)); } ZM\AuditAction(($zid > 0 ? 'update' : 'create'), 'zone', $zid, 'MonitorId: '.$mid); if ( daemonCheck() && ($monitor->Type() != 'WebSite') ) { $monitor->zmcControl('reload'); } if ( ($_REQUEST['newZone']['Type'] == 'Privacy') && $monitor->Controllable() ) { $monitor->sendControlCommand('quit'); } } // end if changes # HTTP_REFERER will typically be ?view=zone so no good. # if a referer is passed in $_REQUEST then use it otherwise go to ?view=zones $redirect = isset($_REQUEST['REFERER']) ? $_REQUEST['REFERER'] : '?view=zones'; } // end if action } // end if $mid and canEdit($mid) ?>