\n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitEditSchedule()
///
/// \brief submits changes to schedule and notifies user
///
////////////////////////////////////////////////////////////////////////////////
function submitEditSchedule() {
$data = processScheduleInput(0);
updateSchedule($data);
viewSchedules();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitAddSchedule()
///
/// \brief adds the schedule and notifies user
///
////////////////////////////////////////////////////////////////////////////////
function submitAddSchedule() {
$data = processScheduleInput(0);
if($id = addSchedule($data)) {
$_POST["scheduleid"] = $id;
$_SESSION['userresources'] = array();
editOrAddSchedule(0);
}
else {
abort(10);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn confirmDeleteSchedule()
///
/// \brief prints a form to confirm the deletion of a schedule
///
////////////////////////////////////////////////////////////////////////////////
function confirmDeleteSchedule() {
$scheduleid = getContinuationVar("scheduleid");
$schedules = getSchedules();
$days = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday");
$name = $schedules[$scheduleid]["name"];
$owner = $schedules[$scheduleid]["owner"];
print "
\n";
print "
Delete Schedule
\n";
print "Delete the following schedule?
\n";
print "
\n";
print " \n";
print " Name: | \n";
print " $name | \n";
print "
\n";
print " \n";
print " Owner: | \n";
print " $owner | \n";
print "
\n";
print "
\n";
if(count($schedules[$scheduleid]["times"])) {
print "
\n";
print " \n";
print " Start | \n";
print " | \n";
print " End | \n";
print "
\n";
foreach($schedules[$scheduleid]["times"] as $time) {
print "
\n";
print " " . minToDaytime($time["start"]) . " | \n";
print " | \n";
print " " . minToDaytime($time["end"]) . " | \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";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitDeleteSchedule()
///
/// \brief deletes a schedule from the database and notifies the user
///
////////////////////////////////////////////////////////////////////////////////
function submitDeleteSchedule() {
$scheduleid = getContinuationVar("scheduleid");
doQuery("DELETE FROM schedule WHERE id = $scheduleid", 210);
doQuery("DELETE FROM scheduletimes WHERE scheduleid = $scheduleid", 210);
doQuery("DELETE FROM resource WHERE resourcetypeid = 15 AND subid = $scheduleid", 210);
$_SESSION['userresources'] = array();
$_SESSION['usersessiondata'] = array();
viewSchedules();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitScheduleGroups()
///
/// \brief updates schedule groupings
///
////////////////////////////////////////////////////////////////////////////////
function submitScheduleGroups() {
$groupinput = processInputVar("schedulegroup", ARG_MULTINUMERIC);
$schedules = getSchedules();
# build an array of memberships currently in the db
$tmp = getUserResources(array("groupAdmin"), array("administer"), 1);
$schedulegroupsIDs = array_keys($tmp["schedule"]); // ids of groups that user can administer
$resources = getUserResources(array("scheduleAdmin"),
array("administer"), 0, 0);
$userScheduleIDs = array_keys($resources["schedule"]); // ids of schedules that user can administer
$schedulemembership = getResourceGroupMemberships("schedule");
$baseschedulegroups = $schedulemembership["schedule"]; // all schedule group memberships
$schedulegroups = array();
foreach(array_keys($baseschedulegroups) as $scheduleid) {
if(in_array($scheduleid, $userScheduleIDs)) {
foreach($baseschedulegroups[$scheduleid] as $grpid) {
if(in_array($grpid, $schedulegroupsIDs)) {
if(array_key_exists($scheduleid, $schedulegroups))
array_push($schedulegroups[$scheduleid], $grpid);
else
$schedulegroups[$scheduleid] = array($grpid);
}
}
}
}
# build an array of posted in memberships
$newmembers = array();
foreach(array_keys($groupinput) as $key) {
list($scheduleid, $grpid) = explode(':', $key);
if(array_key_exists($scheduleid, $newmembers)) {
array_push($newmembers[$scheduleid], $grpid);
}
else {
$newmembers[$scheduleid] = array($grpid);
}
}
$adds = array();
$removes = array();
foreach(array_keys($schedules) as $scheduleid) {
$id = $schedules[$scheduleid]["resourceid"];
// if $scheduleids not in $userScheduleIds, don't bother with it
if(! in_array($scheduleid, $userScheduleIDs))
continue;
// if $scheduleid is not in $newmembers or $schedulegroups, do nothing
if(! array_key_exists($scheduleid, $newmembers) &&
! array_key_exists($scheduleid, $schedulegroups)) {
continue;
}
// check that $scheduleid is in $newmembers, if not, remove it from all groups
if(! array_key_exists($scheduleid, $newmembers)) {
$removes[$id] = $schedulegroups[$scheduleid];
continue;
}
// check that $scheduleid is in $schedulegroups, if not, add all groups in
// $newmembers
if(! array_key_exists($scheduleid, $schedulegroups)) {
$adds[$id] = $newmembers[$scheduleid];
continue;
}
// adds are groupids that are in $newmembers, but not in $schedulegroups
$adds[$id] = array_diff($newmembers[$scheduleid], $schedulegroups[$scheduleid]);
if(count($adds[$id]) == 0) {
unset($adds[$id]);
}
// removes are groupids that are in $schedulegroups, but not in $newmembers
$removes[$id] = array_diff($schedulegroups[$scheduleid], $newmembers[$scheduleid]);
if(count($removes[$id]) == 0) {
unset($removes[$id]);
}
}
foreach(array_keys($adds) as $scheduleid) {
foreach($adds[$scheduleid] as $grpid) {
$query = "INSERT INTO resourcegroupmembers "
. "(resourceid, resourcegroupid) "
. "VALUES ($scheduleid, $grpid)";
doQuery($query, 291);
}
}
foreach(array_keys($removes) as $scheduleid) {
foreach($removes[$scheduleid] as $grpid) {
$query = "DELETE FROM resourcegroupmembers "
. "WHERE resourceid = $scheduleid AND "
. "resourcegroupid = $grpid";
doQuery($query, 292);
}
}
viewSchedules();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn processScheduleInput($checks)
///
/// \param $checks - (optional) 1 to perform validation, 0 not to
///
/// \return an array with the following indexes:\n
/// scheduleid, name, owner, submode, selrow, count, startDay, startTime,
/// endDay, endTime
///
/// \brief validates input from the previous form; if anything was improperly
/// submitted, sets submitErr and submitErrMsg
///
////////////////////////////////////////////////////////////////////////////////
function processScheduleInput($checks=1) {
global $submitErr, $submitErrMsg;
$return = array();
$return["start"] = array();
$return["end"] = array();
$return["scheduleid"] = getContinuationVar("scheduleid", processInputVar("scheduleid" , ARG_NUMERIC));
$return["name"] = getContinuationVar("name", processInputVar("name", ARG_STRING));
$return["owner"] = getContinuationVar("owner", processInputVar("owner", ARG_STRING));
$return["submode"] = processInputVar("submode", ARG_STRING);
$return["selrow"] = processInputVar("selrow", ARG_NUMERIC);
$return["count"] = getContinuationVar("count", processInputVar("count", ARG_NUMERIC, 0));
$return["startDay"] = processInputVar("startDay", ARG_MULTINUMERIC);
$return["startTime"] = processInputVar("startTime", ARG_MULTISTRING);
$return["endDay"] = processInputVar("endDay", ARG_MULTINUMERIC);
$return["endTime"] = processInputVar("endTime", ARG_MULTISTRING);
if(! $checks) {
return $return;
}
if(strlen($return["name"]) > 25 || strlen($return["name"]) < 2) {
$submitErr |= SCHNAMEERR;
$submitErrMsg[SCHNAMEERR] = "Name must be from 2 to 30 characters";
}
if(! ($submitErr & SCHNAMEERR) &&
checkForScheduleName($return["name"], $return["scheduleid"])) {
$submitErr |= SCHNAMEERR;
$submitErrMsg[SCHNAMEERR] = "A schedule already exists with this name.";
}
if(! validateUserid($return["owner"])) {
$submitErr |= SCHOWNERERR;
$submitErrMsg[SCHOWNERERR] = "The submitted unity ID is invalid.";
}
for($i = 0; $i < $return["count"]; $i++) {
if((! ereg('^((0?[1-9])|(1[0-2])):([0-5][0-9]) (am|pm)$', $return["startTime"][$i])) ||
(! ereg('^((0?[1-9])|(1[0-2])):([0-5][0-9]) (am|pm)$', $return["endTime"][$i]))) {
$submitErr |= (1 << $i);
$submitErrMsg[1 << $i] = "Time must be of the form [H]H:MM am/pm";
}
elseif(daytimeToMin($return["startDay"][$i], $return["startTime"][$i], "start") >=
daytimeToMin($return["endDay"][$i], $return["endTime"][$i], "end")) {
$submitErr |= (1 << $i);
$submitErrMsg[1 << $i] = "The start day/time must be before the end day/time";
}
}
for($i = 0; $i < $return["count"] - 1; $i++) {
for($j = $i + 1; $j < $return["count"]; $j++) {
if(daytimeToMin($return["startDay"][$i], $return["startTime"][$i], "start") <
daytimeToMin($return["endDay"][$j], $return["endTime"][$j], "end") &&
daytimeToMin($return["endDay"][$i], $return["endTime"][$i], "end") >
daytimeToMin($return["startDay"][$j], $return["startTime"][$j], "start")) {
$submitErr |= OVERLAPERR;
$submitErrMsg[OVERLAPERR] = "At least 2 of the time periods overlap. Please combine them into a single entry.";
break(2);
}
}
}
return $return;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn checkForScheduleName($name, $id)
///
/// \param $name - the name of a schedule
/// \param $id - id of a schedule to ignore
///
/// \return 1 if $name is already in the schedule table, 0 if not
///
/// \brief checks for $name being in the schedule table except for $id
///
////////////////////////////////////////////////////////////////////////////////
function checkForScheduleName($name, $id) {
$query = "SELECT id FROM schedule "
. "WHERE name = '$name'";
if(! empty($id))
$query .= " AND id != $id";
$qh = doQuery($query, 101);
if(mysql_num_rows($qh))
return 1;
return 0;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn updateSchedule($data)
///
/// \param $data - an array returned from processScheduleInput
///
/// \return number of rows affected by the update\n
/// \b NOTE: mysql reports that no rows were affected if none of the fields
/// were actually changed even if the update matched a row
///
/// \brief performs a query to update the schedule with data from $data
///
////////////////////////////////////////////////////////////////////////////////
function updateSchedule($data) {
$ownerid = getUserlistID($data["owner"]);
$query = "UPDATE schedule "
. "SET name = '" . $data["name"] . "', "
. "ownerid = $ownerid "
. "WHERE id = " . $data["scheduleid"];
$qh = doQuery($query, 215);
return mysql_affected_rows($GLOBALS["mysql_link_vcl"]);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn addSchedule($data)
///
/// \param $data - an array returned from processScheduleInput
///
/// \return number of rows affected by the insert\n
///
/// \brief performs a query to insert the schedule with data from $data
///
////////////////////////////////////////////////////////////////////////////////
function addSchedule($data) {
$ownerid = getUserlistID($data["owner"]);
$query = "INSERT INTO schedule "
. "(name, "
. "ownerid) "
. "VALUES ('" . $data["name"] . "', "
. "$ownerid)";
doQuery($query, 220);
$affectedrows = mysql_affected_rows($GLOBALS["mysql_link_vcl"]);
$qh = doQuery("SELECT LAST_INSERT_ID() FROM schedule", 221);
if(! $row = mysql_fetch_row($qh)) {
abort(222);
}
$query = "INSERT INTO resource "
. "(resourcetypeid, "
. "subid) "
. "VALUES (15, "
. $row[0] . ")";
doQuery($query, 223);
return $row[0];
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn printStartEndTimeForm($min, $count, $startend)
///
/// \param $min - minute in the week, pass empty string to get an empty text
/// entry field
/// \param $count - counter value - used to keep track of which row this is
/// \param $startend - "start" or "end"
///
/// \brief prints a select input for the day of week and a text entry field
/// for the time to be entered
///
////////////////////////////////////////////////////////////////////////////////
function printStartEndTimeForm($min, $count, $startend) {
$days = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday");
if($min == "") {
print "
\n";
printSelectInput("$startend" . "Day[$count]", $days);
$name = $startend . "Time[$count]";
print " \n";
print " | \n";
return;
}
$time = minuteToTime($min % 1440);
if((int)($min / 1440) == 0) {
$day = 0;
}
elseif((int)($min / 1440) == 1) {
$day = 1;
}
elseif((int)($min / 1440) == 2) {
$day = 2;
}
elseif((int)($min / 1440) == 3) {
$day = 3;
}
elseif((int)($min / 1440) == 4) {
$day = 4;
}
elseif((int)($min / 1440) == 5) {
$day = 5;
}
elseif((int)($min / 1440) == 6) {
$day = 6;
}
elseif((int)($min / 1440) > 6) {
$day = 0;
}
print "
\n";
printSelectInput("$startend" . "Day[$count]", $days, $day);
$name = $startend . "Time[$count]";
print " \n";
print " | \n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn printStartEndTimeForm2($day, $time, $count, $startend)
///
/// \param $day - numeric day of week with Sunday being 0
/// \param $time - time of day in string format HH:MM am/pm
/// \param $count - counter value - used to keep track of which row this is
/// \param $startend - "start" or "end"
///
/// \brief prints a select input for the day of week and a text entry field
/// for the time to be entered
///
////////////////////////////////////////////////////////////////////////////////
function printStartEndTimeForm2($day, $time, $count, $startend) {
$days = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday");
print "
\n";
printSelectInput("$startend" . "Day[$count]", $days, $day);
$name = $startend . "Time[$count]";
print " \n";
print " | \n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitScheduleTime()
///
/// \brief handles submitting date/time form for schedule times and calls
/// editOrAddSchedule(0) again
///
////////////////////////////////////////////////////////////////////////////////
function submitScheduleTime() {
global $submitErr, $contdata;
if($_POST["submode"] == "Save changes") {
$data = processScheduleInput(1);
if($submitErr) {
editOrAddSchedule(0);
return;
}
}
else {
$data = processScheduleInput(0);
if($data["selrow"] == "") {
editOrAddSchedule(0);
return;
}
}
if($data["submode"] == "Delete selected row") {
// delete entry from db
$start = daytimeToMin($data["startDay"][$data["selrow"]], $data["startTime"][$data["selrow"]], "start");
$end = daytimeToMin($data["endDay"][$data["selrow"]], $data["endTime"][$data["selrow"]], "end");
$query = "DELETE FROM scheduletimes "
. "WHERE scheduleid = {$data["scheduleid"]} AND "
. "start = $start AND "
. "end = $end";
doQuery($query, 101);
// decrease all values by 1 that are > deleted row
for($i = 0; $i < $data["count"] - 1; $i++) {
if($i >= $data["selrow"]) {
$_POST["startDay"][$i] = $_POST["startDay"][$i + 1];
$_POST["startTime"][$i] = $_POST["startTime"][$i + 1];
$_POST["endDay"][$i] = $_POST["endDay"][$i + 1];
$_POST["endTime"][$i] = $_POST["endTime"][$i + 1];
}
}
unset($_POST["startDay"][$i]);
unset($_POST["startTime"][$i]);
unset($_POST["endDay"][$i]);
unset($_POST["endTime"][$i]);
$contdata["count"]--;
editOrAddSchedule(0);
}
elseif($data["submode"] == "Insert before selected row") {
editOrAddSchedule(0);
}
elseif($data["submode"] == "Insert after selected row") {
editOrAddSchedule(0);
}
elseif($data["submode"] == "Save changes") {
$query = "DELETE FROM scheduletimes WHERE scheduleid = {$data["scheduleid"]}";
doQuery($query, 101);
for($i = 0; $i < $data["count"]; $i++) {
$start = daytimeToMin($data["startDay"][$i], $data["startTime"][$i], "start");
$end = daytimeToMin($data["endDay"][$i], $data["endTime"][$i], "end");
$query = "INSERT INTO scheduletimes "
. "(scheduleid, "
. "start, "
. "end) "
. "VALUES ({$data["scheduleid"]}, "
. "$start, "
. "$end)";
doQuery($query, 101);
}
editOrAddSchedule(0);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn daytimeToMin($day, $time, $startend)
///
/// \param $day - number of day of week (0-6) with 0 being Sunday
/// \param $time - time of day in 'HH:MM mm' format
/// \param $startend - "start" or "end" - need to know if 12:00 am on Sunday
/// is a the beginning of the week or end of the week
///
/// \return minute of the week
///
/// \brief computes minute of the week from the input params - if Sunday at
/// 12:00 am, return 0 if $startend == "start" or 10080 if $startend == "end"
///
////////////////////////////////////////////////////////////////////////////////
function daytimeToMin($day, $time, $startend) {
if(! ereg('^(((0)?([1-9]))|(1([0-2]))):([0-5][0-9]) ((am)|(pm))', $time))
return -1;
list($hour, $other) = explode(':', $time);
list($min, $meridian) = explode(' ', $other);
if($meridian == "am" && $hour == 12) {
if($startend == "end" && $day == 0 && $min == 0)
$day = 7;
$hour = 0;
}
elseif($meridian == "pm" && $hour != 12) {
$hour += 12;
}
return (($hour * 60) + $min) + ($day * 1440);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn minToDaytime($min)
///
/// \param $min - minute of the week
///
/// \return day of week and time of day
///
/// \brief calculates day of week and time of day from $min and returns a
/// nicely formatted string of "Weekday HH:MM am/pm"
///
////////////////////////////////////////////////////////////////////////////////
function minToDaytime($min) {
$days = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday");
$time = minuteToTime($min % 1440);
if((int)($min / 1440) == 0) {
$day = 0;
}
elseif((int)($min / 1440) == 1) {
$day = 1;
}
elseif((int)($min / 1440) == 2) {
$day = 2;
}
elseif((int)($min / 1440) == 3) {
$day = 3;
}
elseif((int)($min / 1440) == 4) {
$day = 4;
}
elseif((int)($min / 1440) == 5) {
$day = 5;
}
elseif((int)($min / 1440) == 6) {
$day = 6;
}
elseif((int)($min / 1440) > 6) {
$day = 0;
}
return $days[$day] . " $time";
}
?>