Site Maintenance\n"; $rt .= "
\n"; } $rt .= "
\n"; if(count($items)) { $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; foreach($items as $item) { $tmp = datetimeToUnix($item['start']); $start = date('g:i&\n\b\s\p;A n/j/Y', $tmp); $tmp = datetimeToUnix($item['end']); $end = date('g:i&\n\b\s\p;A n/j/Y', $tmp); $tmp = datetimeToUnix($item['created']); $created = date('g:i&\n\b\s\p;A n/j/Y', $tmp); $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; if(strlen($item['reason']) < 30) $rt .= "\n"; else { $rt .= "\n"; } if(strlen($item['usermessage']) < 30) $rt .= "\n"; else { $rt .= "\n"; } $hours = $item['informhoursahead'] % 24; if($hours == 1) $hours = (int)($item['informhoursahead'] / 24) . " days, 1 hour"; else $hours = (int)($item['informhoursahead'] / 24) . " days, $hours hours"; $rt .= "\n"; if($item['allowreservations']) $rt .= "\n"; else $rt .= "\n"; $rt .= "\n"; } $rt .= "
StartEndOwnerCreatedReason (hover for more)User Message (hover for more)Inform Hours AheadAllow Reservations
\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "\n"; $rt .= "$start$end{$item['owner']}$created{$item['reason']}\n"; $reason = substr($item['reason'], 0, 30) . '...'; $rt .= " $reason\n"; $rt .= "
\n"; $reason = preg_replace('/(.{1,50}[ \n])/', '\1
', $item['reason']); $reason = preg_replace('/\n
\n/', "

\n", $reason); $rt .= "$reason
\n"; $rt .= "
{$item['usermessage']}\n"; $msg = substr($item['usermessage'], 0, 30) . '...'; $rt .= " $msg\n"; $rt .= "
\n"; $msg = preg_replace('/(.{1,50}[ \n])/', '\1
', $item['usermessage']); $msg = preg_replace('/\n
\n/', "

\n", $msg); $rt .= "$msg
\n"; $rt .= "
$hoursYesNo
\n"; } if($update) { $send = str_replace("\n", '', $rt); $send = str_replace("'", "\'", $send); $send = preg_replace("/>\s*<", $send); print setAttribute('maintenancediv', 'innerHTML', $send); print "AJdojoCreate('maintenancediv');"; return; } print $rt; print "
\n"; # end maintenancediv print "
\n"; print "

\n"; print "

\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Start:\n"; print "
\n"; print "
\n"; print "
End:\n"; print "
\n"; print "
\n"; print "
Inform Hours Ahead:\n"; print " \n"; print " \n"; print "
Allow Reservations:\n"; print " \n"; print "
\n"; print "Reason (this is not displayed to any users and is just for your records):
\n"; print "
\n"; print "User Message (this will be displayed on the site during the maintenance window):
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; # edit dialog print "
\n"; print "

Delete Site Maintenance

\n"; print "Click Delete Entry to delete this site maintenance entry

\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Start:
End:
Owner:
Created:
Inform Hours Ahead:
Allow Reservations:
Reason:
User Message:
\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; # confirm dialog } //////////////////////////////////////////////////////////////////////////////// /// /// \fn AJcreateSiteMaintenance() /// /// \brief creates an file in the maintenance directory, creates an entry in /// the sitemaintenance table and does a javascript page reload /// //////////////////////////////////////////////////////////////////////////////// function AJcreateSiteMaintenance() { global $user; $data = processSiteMaintenanceInput(); if($data['err']) return; if(! writeMaintenanceFile($data['startts'], $data['endts'], $data['usermessage'])) { print "alert('Failed to create maintenance file on web server.\\n"; print "Please have sysadmin check permissions on maintenance directory.');\n"; return; } $reason = mysql_real_escape_string($data['reason']); $usermessage = mysql_real_escape_string($data['usermessage']); $query = "INSERT INTO sitemaintenance " . "(start, " . "end, " . "ownerid, " . "created, " . "reason, " . "usermessage, " . "informhoursahead, " . "allowreservations) " . "VALUES " . "('{$data['startdt']}', " . "'{$data['enddt']}', " . "{$user['id']}, " . "NOW(), " . "'$reason', " . "'$usermessage', " . "{$data['hoursahead']}, " . "{$data['allowreservations']})"; doQuery($query, 101); $_SESSION['usersessiondata'] = array(); print "window.location.href = '" . BASEURL . SCRIPT . "?mode=siteMaintenance';"; #print "clearEdit();"; #siteMaintenance(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn AJgetSiteMaintenanceData() /// /// \brief gets info about a sitemaintenance entry and returns it in JSON format /// //////////////////////////////////////////////////////////////////////////////// function AJgetSiteMaintenanceData() { $id = getContinuationVar('id'); $tmp = getMaintItems($id); $data = $tmp[$id]; $start = datetimeToUnix($data['start']) * 1000; $end = datetimeToUnix($data['end']) * 1000; $cdata = array('id' => $id, 'update' => 1); $cont = addContinuationsEntry('AJeditSiteMaintenance', $cdata, SECINDAY, 1, 0); $arr = array('start' => $start, 'end' => $end, 'hoursahead' => $data['informhoursahead'], 'allowreservations' => $data['allowreservations'], 'reason' => $data['reason'], 'usermessage' => $data['usermessage'], 'cont' => $cont); sendJSON($arr); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn AJgetDelSiteMaintenanceData() /// /// \brief gets info about a sitemaintenance entry to be displayed on the /// confirm delete dialog and returns it in JSON format /// //////////////////////////////////////////////////////////////////////////////// function AJgetDelSiteMaintenanceData() { $id = getContinuationVar('id'); $tmp = getMaintItems($id); $data = $tmp[$id]; $cdata = array('id' => $id, 'update' => 1, 'start' => datetimeToUnix($data['start'])); $cont = addContinuationsEntry('AJdeleteSiteMaintenance', $cdata, SECINDAY, 1, 0); $tmp = datetimeToUnix($data['start']); $start = date('g:i A, n/j/Y', $tmp); $tmp = datetimeToUnix($data['end']); $end = date('g:i A, n/j/Y', $tmp); $tmp = datetimeToUnix($data['created']); $created = date('g:i A, n/j/Y', $tmp); $hours = $data['informhoursahead'] % 24; if($hours == 1) $hours = (int)($data['informhoursahead'] / 24) . " days, 1 hour"; else $hours = (int)($data['informhoursahead'] / 24) . " days, $hours hours"; $hours = "{$data['informhoursahead']} ($hours)"; if($data['allowreservations']) $allowres = 'Yes'; else $allowres = 'No'; $reason = preg_replace('/(.{1,50}[ \n])/', '\1
', $data['reason']); $reason = preg_replace('/\n
\n/', "

\n", $reason); $usermsg = preg_replace('/(.{1,50}[ \n])/', '\1
', $data['usermessage']); $usermsg = preg_replace('/\n
\n/', "

\n", $usermsg); $arr = array('start' => $start, 'end' => $end, 'owner' => $data['owner'], 'created' => $created, 'hoursahead' => $hours, 'allowreservations' => $allowres, 'reason' => $reason, 'usermessage' => $usermsg, 'cont' => $cont); sendJSON($arr); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn AJeditSiteMaintenance() /// /// \brief removes/adds file in maintenances directory and updates entry in /// sitemaintenance table /// //////////////////////////////////////////////////////////////////////////////// function AJeditSiteMaintenance() { global $user; $id = getContinuationVar('id'); $data = processSiteMaintenanceInput(); $olddata = getMaintItems($id); $start = datetimeToUnix($olddata[$id]['start']); if(! deleteMaintenanceFile($start) || ! writeMaintenanceFile($data['startts'], $data['endts'], $data['usermessage'])) { print "alert('Failed to modify maintenance file on web server.\\n"; print "Please have sysadmin check permissions on maintenance directory.');\n"; print "dijit.byId('confirmDialog').hide();"; $data['err'] = 1; } if($data['err']) { $data = array('id' => $id, 'update' => 1); $cont = addContinuationsEntry('AJeditSiteMaintenance', $data, SECINDAY, 1, 0); print "dojo.byId('submitcont').value = '$cont';"; return; } $reason = mysql_real_escape_string($data['reason']); $usermessage = mysql_real_escape_string($data['usermessage']); $query = "UPDATE sitemaintenance " . "SET start = '{$data['startdt']}', " . "end = '{$data['enddt']}', " . "ownerid = {$user['id']}, " . "created = NOW(), " . "reason = '$reason', " . "usermessage = '$usermessage', " . "informhoursahead = {$data['hoursahead']}, " . "allowreservations = {$data['allowreservations']} " . "WHERE id = $id"; doQuery($query, 101); $_SESSION['usersessiondata'] = array(); print "window.location.href = '" . BASEURL . SCRIPT . "?mode=siteMaintenance';"; #print "clearEdit();"; #siteMaintenance(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn processSiteMaintenanceInput() /// /// \return array with these keys:\n /// \b hoursahead - corresponds to sitemaintenance table\n /// \b allowreservations - corresponds to sitemaintenance table\n /// \b reason - corresponds to sitemaintenance table\n /// \b usermessage - corresponds to sitemaintenance table\n /// \b startdt - datetime format for start of maintenance\n /// \b startts - unix timestamp format for start of maintenance\n /// \b enddt - datetime format for end of maintenance\n /// \b endts - unix timestamp format for end of maintenance\n /// \b err - whether or not an entry was found to be invalid /// /// \brief validates form data for site maintenance items /// //////////////////////////////////////////////////////////////////////////////// function processSiteMaintenanceInput() { $start = processInputVar('start', ARG_NUMERIC); $end = processInputVar('end', ARG_NUMERIC); $data['hoursahead'] = processInputVar('hoursahead', ARG_NUMERIC); $data['allowreservations'] = processInputVar('allowreservations', ARG_NUMERIC); $data['reason'] = processInputVar('reason', ARG_STRING); $data['usermessage'] = processInputVar('usermessage', ARG_STRING); $err = 0; $now = time(); $data['startdt'] = numdatetimeToDatetime($start . '00'); $data['startts'] = datetimeToUnix($data['startdt']); $data['enddt'] = numdatetimeToDatetime($end . '00'); $data['endts'] = datetimeToUnix($data['enddt']); $reg = "/^[-0-9a-zA-Z\.,\?:;_@!#\(\)\n ]+$/"; if(! preg_match($reg, $data['reason'])) { $errmsg = "Reason can only contain letters, numbers, spaces,\\nand these characters: . , ? : ; - _ @ ! # ( )"; $err = 1; } if(! preg_match($reg, $data['usermessage'])) { $errmsg = "User Message can only contain letters, numbers, spaces,\\nand these characters: . , ? : ; - _ @ ! # ( )"; $err = 1; } if(! $err && $data['startts'] < $now) { $errmsg = 'The start time and date must be later than the current time.'; $err = 1; } if(! $err && $data['endts'] <= $data['startts']) { $errmsg = 'The end time and date must be later than the start time and date.'; $err = 1; } if(! $err && $data['hoursahead'] < 1) { $errmsg = 'Inform Hours Ahead must be at least 1.'; $err = 1; } if(! $err && $data['hoursahead'] > 65535) { $errmsg = 'Inform Hours Ahead must be less than 65536.'; $err = 1; } if(! $err && ($data['allowreservations'] != 0 && $data['allowreservations'] != 1)) $data['allowreservations'] = 0; if(! $err && ! preg_match('/[A-Za-z]{2,}/', $data['usermessage'])) { $errmsg = 'Something must be filled in for the User Message.'; $err = 1; } if($err) print "alert('$errmsg');"; $data['err'] = $err; return $data; } //////////////////////////////////////////////////////////////////////////////// /// /// \fn AJdeleteSiteMaintenance() /// /// \brief removes file from maintenance directory and deletes entry from /// sitemaintenance table /// //////////////////////////////////////////////////////////////////////////////// function AJdeleteSiteMaintenance() { $id = getContinuationVar('id'); $start = getContinuationVar('start'); if(! deleteMaintenanceFile($start)) { print "alert('Failed to delete maintenance file on web server.\\n"; print "Please have sysadmin check permissions on maintenance directory.');\n"; print "dijit.byId('confirmDialog').hide();"; return; } $query = "DELETE FROM sitemaintenance WHERE id = $id"; doQuery($query, 101); $_SESSION['usersessiondata'] = array(); print "window.location.href = '" . BASEURL . SCRIPT . "?mode=siteMaintenance';"; #print "dijit.byId('confirmDialog').hide();"; #siteMaintenance(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn writeMaintenanceFile($start, $end, $msg) /// /// \param $start - start time of maintenance entry in unix timestamp format /// \param $end - end time of maintenance entry in unix timestamp format /// \param $msg - user message for maintenance entry /// /// \return true if file created; false if not /// /// \brief creates a file in the maintenance directory /// //////////////////////////////////////////////////////////////////////////////// function writeMaintenanceFile($start, $end, $msg) { $name = date('YmdHi', $start); $reg = "|" . SCRIPT . "$|"; $file = preg_replace($reg, '', $_SERVER['SCRIPT_FILENAME']); $file .= "/.ht-inc/maintenance/$name"; if(! $fh = fopen($file, 'w')) { return false; } $numend = date('YmdHi', $end); fwrite($fh, "END=$numend\n"); fwrite($fh, "$msg\n"); fclose($fh); return true; } //////////////////////////////////////////////////////////////////////////////// /// /// \fn deleteMaintenanceFile($start) /// /// \param $start - start time of maintenance entry in unix timestamp format /// /// \return true if file deleted; false if not /// /// \brief removes a file from the maintenance directory /// //////////////////////////////////////////////////////////////////////////////// function deleteMaintenanceFile($start) { $name = date('YmdHi', $start); $reg = "|" . SCRIPT . "$|"; $file = preg_replace($reg, '', $_SERVER['SCRIPT_FILENAME']); $file .= "/.ht-inc/maintenance/$name"; if(! file_exists($file)) return true; if(! @unlink($file)) return false; return true; } ?>