\r
# includes\r
$(MKDIR) $(DESTDIR)/usr/share/iserv/www/inc/mod_room-reservation\r
- $(LN) includes/*.inc $(DESTDIR)/usr/share/iserv/www/inc/mod_room-reservation/\r
+ $(LN) inc/*.inc $(DESTDIR)/usr/share/iserv/www/inc/mod_room-reservation/\r
if [ ! -e $(DESTDIR)/usr/share/iserv/www/inc/mod_room-reservation/config.inc ] ; then touch $(DESTDIR)/usr/share/iserv/www/inc/mod_room-reservation/config.inc; fi\r
ifeq ($(USER),root)\r
chmod g+w $(DESTDIR)/usr/share/iserv/www/inc/mod_room-reservation/config.inc\r
--- /dev/null
+<?php
+/**\r
+ * @file exceptions.inc
+ * Some custom exceptions\r
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
+ * @date 27.05.2008\r
+ * \r
+ * Copyright © 2007 Roland Hieber\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ * \r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+
+/**
+ * An exception while trying to do a SQL query.
+ */
+class SQLException extends Exception {}
+
+/**
+ * An exception while trying to access something
+ */
+class AccessException extends Exception {}
+
+/**
+ * An exception while trying to write or read something
+ */
+class IOException extends Exception {}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * @file functions.inc
+ * additional functions for iserv-mod-room-reservation
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 22.12.2007
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @todo move some functions into M Class Library
+ */
+
+require_once("share.inc");
+require_once("db.inc");
+require_once("user.inc");
+require_once("sec/secure.inc");
+
+/**
+ * @page errorcodes Error Codes
+ * @{
+ */
+/** Access denied. This can be due to missing access rights. */
+define("MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED",
+ _c("room-reservation:Access denied."));
+/** Error while querying the database */
+define("MOD_ROOM_RESERVATION_ERROR_SQL",
+ _c("room-reservation:Error while trying to query the database."));
+/** Error while trying to open a file */
+define("MOD_ROOM_RESERVATION_ERROR_OPEN_FILE",
+ _c("room-reservation:Could not open file."));
+/** Error while trying to write a file */
+define("MOD_ROOM_RESERVATION_ERROR_WRITE_FILE",
+ _c("room-reservation:Could not write to file."));
+/** Error while trying to lock a file */
+define("MOD_ROOM_RESERVATION_ERROR_LOCK_FILE",
+ _c("room-reservation:Could not lock file."));
+/** Error while trying to unlock a file */
+define("MOD_ROOM_RESERVATION_ERROR_UNLOCK_FILE",
+ _c("room-reservation:Could not unlock file."));
+/** The current booking overlaps with an existing booking */
+define("MOD_ROOM_RESERVATION_ERROR_BOOKING_OVERLAPS", _c("room-reservation:".
+ "The current booking overlaps with an existing booking."));
+/** The booking ends before it begins */
+define("MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN", _c("room-reservation:".
+ "The ending of your booking cannot lie before the beginning."));
+define("MOD_ROOM_RESERVATION_ERROR_NO_REASON", _c("room-reservation:Please ".
+ "give a reason."));
+/** A new timeslice overlaps with an existing timeslice */
+define("MOD_ROOM_RESERVATION_ERROR_CONFIG_OVERLAPPING_TIMESLICE",
+ _c("room-reservation:The period overlaps with an existing one."));
+/** There is no such timeslice */
+define("MOD_ROOM_RESERVATION_ERROR_CONFIG_NO_SUCH_TIMESLICE",
+ _c("room-reservation:The specified period does not exist."));
+/** There is no such account */
+define("MOD_ROOM_RESERVATION_ERROR_NO_SUCH_ACCOUNT", _c("room-reservation:".
+ "The specified account does not exist."));
+/** The room is not available for booking */
+define("MOD_ROOM_RESERVATION_ERROR_ROOM_NOT_WHITELISTED",
+ _c("room-reservation:This room is not available for booking."));
+/**
+ * @}
+ */
+
+/**
+ * Determine if the specified user exists. Throws an SQLException if an error
+ * occured.
+ * @param $strAct (string) Account name of the user
+ * @throws SQLException
+ * @return (bool)
+ */
+function isAct($strAct) {
+ $hQuery = db_query("SELECT * FROM users WHERE act = $1;", $strAct);
+ if(!is_resource($hQuery)) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
+ return null;
+ }
+ return (pg_num_rows($hQuery) > 0);
+}
+
+/**
+ * Get the real user name for an account name
+ * @param $strAct (string) Account name of the user to look up
+ * @return (string) The real name of the user. If the function fails, it returns <tt>null</tt>.
+ * Call getLastError() to get more information about the error.
+ */
+function getRealUserName($strAct) {
+ $hQuery = db_query("SELECT firstname, lastname FROM users WHERE act = $1;", $strAct);
+ if(!is_resource($hQuery)) {
+ // TODO throw exception
+ setLastError(RS_ERROR_SQL);
+ return null;
+ }
+ if(pg_num_rows($hQuery) == 0) {
+ return $strAct; // User not found in database, return account name
+ }
+ $arResult = pg_fetch_array($hQuery);
+ return user_join_name($arResult);
+}
+
+/**
+ * Determine if a specified group exists
+ * @param $strAct (string) Account name of the group
+ * @return (bool / null) If the function fails, it returns <tt>null</tt>. Call getLastError() to
+ * get more information about the error.
+ */
+function isGroup($strAct) {
+ $hQuery = db_query("SELECT * FROM groups WHERE act = $1;", $strAct);
+ if(!is_resource($hQuery)) {
+ // TODO throw exception
+ setLastError(RS_ERROR_SQL);
+ return null;
+ }
+ return (pg_num_rows($hQuery) > 0);
+}
+
+/**
+ * Look up the name of a group
+ * @param $strAct (string) Account name of the group
+ * @return (string) The name of the group. If the function fails, it returns <tt>null</tt>.
+ * Call getLastError() to get more information about the error.
+ */
+function getGroupName($strAct) {
+ $hQuery = db_query("SELECT * FROM groups WHERE act = $1;", $strAct);
+ if(!is_resource($hQuery)) {
+ // TODO throw exception
+ setLastError(RS_ERROR_SQL);
+ return null;
+ }
+ if(pg_num_rows($hQuery) == 0) {
+ return $strAct; // Group not found in database, return account name
+ }
+ $arResult = pg_fetch_array($hQuery);
+ return $arResult["name"];
+}
+
+/**
+ * Create a link to write a mail to the specified account name.
+ * This function returns a link if the specified account exists, otherwise it returns the
+ * account name.
+ * @param $strAct (string) Account name
+ * @param $strColor (string) Background color for icon()
+ * @param $strParams (string) additional URL parameters
+ * @return string
+ */
+function mailToUserLink($strAct, $strColor = "bl", $strParams = "") {
+ if(!isAct($strAct)) {
+ return $strAct;
+ }
+ return popup(relroot("msg/write/?to=".user_mail_addr($strAct).$strParams),
+ 600, 400, nobr(icon("mail-reply-usr", array("size" => 16, "bg" =>
+ $strColor)) . getRealUserName($strAct)));
+}
+
+/**
+ * Determine if a specified string is a valid mail address
+ * @param $strAddr string
+ * @return string
+ */
+function isMailAddress($strAddr) {
+ return ((preg_match("/([a-zA-Z0-9_\-\.]*(@[a-zA-Z0-9\-\.]*)?(\s*,\s*)?)+/", $strAddr) > 0)
+ and (preg_match("/(\s*,\s*)$/", $strAddr) == 0));
+}
+
+/**
+ * Module-specific logging function.
+ * Prefixes the log message with a module-specific string and writes it to the logs.
+ * @param $strLog (string) Log message
+ * @return void
+ */
+function rrInsertLog($strLog) {
+ log_insert($strLog, null, "Room Reservation Schedule");
+}
+
+/**
+ * Get the SQL day number from a given timestamp.
+ * @param $ts (timestamp)
+ * @return (int) 0-6 for Sunday to Monday
+ */
+function rrDateToSQLDayNumber($ts) {
+ $aDays = array("Sun" => 0, "Mon" => 1, "Tue" => 2,
+ "Wed" => 3, "Thu" => 4, "Fri" => 5, "Sat" => 6);
+ return $aDays[date("D", $ts)];
+}
+
+/**
+ * Convert a UNIX timestamp to an SQL date string
+ * @param $ts (timestamp)
+ * @return string
+ */
+function dateToSql($ts) { return date("Y\-m\-d", intval($ts)); }
+
+/**
+ * Calculate the timestamp of the monday in the current week
+ * @param $ts (timestamp) Calculate the value relative to this date
+ * @return timestamp
+ */
+function rrGetMonday($ts = null) {
+ if($ts === null) {
+ $ts = time();
+ }
+ if(date("D", $ts) == "Mon") {
+ // Today is monday
+ return strtotime("00:00", $ts);
+ } else {
+ return strtotime("last monday", $ts);
+ }
+}
+
+/** (array of strings) Additional CSS rules */
+$GLOBALS["rrLocalCss"] = array();
+
+/**
+ * Add CSS rules to the page
+ * @param $s (string)
+ * @return void
+ */
+function rrAddCss($s) {
+ rrDebug("rrAddCss: add \"$s\"");
+ $GLOBALS["rrLocalCss"][] = $s;
+}
+
+/**
+ * Get CSS rules that have been added with rrAddCss()
+ * @return string
+ */
+function rrGetCss() {
+ rrDebug("rrGetCss: Local CSS is ".var_export($GLOBALS["rrLocalCss"], true));
+ return implode("\n", $GLOBALS["rrLocalCss"]);
+}
+
+function rrDebug($s, $bReturn = false) {
+ if(isset($_GET["debug"])) {
+ if(!$bReturn) {
+ echo "<!-- $s -->\n";
+ } else {
+ return $s;
+ }
+ }
+}
+
+/**
+ * sprintf with support for ordinal numbers.
+ * This version of sprintf replaces all substrings of the type <tt>/\\d+#/</tt>
+ * (i.e. a decimal number with a hash sign appended) in the input string with
+ * the corresponding english ordinal number prefices (st, nd, rd, th).
+ * @param $str (string) Input string
+ * @param $args (mixed) Additional parameters to be passed to sprintf()
+ * @return (string)
+ */
+function _sprintf_ord($str, $args /*leave this parameters for doxygen*/) {
+ $args = func_get_args();
+ if(preg_match_all("/%[bcdufosxX]/", $args[0], $temp) != func_num_args()-1) {
+ trigger_error("Too few arguments", E_USER_ERROR);
+ return false;
+ }
+ $str = call_user_func_array("sprintf", $args);
+ while(preg_match("/(.*)(\d+)#(.*)/", $str, $m))
+ $str = $m[1]._(append_ord_suffix($m[2])).$m[3];
+ return $str;
+}
+?>
--- /dev/null
+<?php
+/**
+ * @file globals.inc
+ * Include all the stuff that we need
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 27.01.2008
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once("mod_room-reservation/functions.inc");
+require_once("mod_room-reservation/exceptions.inc");
+require_once("mod_room-reservation/mod_roomReservationBookingsManager.inc");
+require_once("mod_room-reservation/mod_roomReservationRoomsManager.inc");
+require_once("mod_room-reservation/mod_roomReservationConfig.inc");
+
+/** A global instance of the mod_roomReservationConfig class */
+$g_rrCfg = new mod_roomReservationConfig();
+/** A global instance of the mod_roomReservationBookingsManager class */
+$g_rrBm = new mod_roomReservationBookingsManager($g_rrCfg);
+/** A global instance of the mod_roomReservationRoomsManager class */
+$g_rrRm = new mod_roomReservationRoomsManager($g_rrCfg);
+
+/**
+ * @mainpage iserv-mod-room-reservation -- Simple reservation of rooms
+ * The room reservation module allows the users of your IServ Portalserver
+ * to reserve a room, e.g. for meetings, lessons etc.
+ */
+?>
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationBooking.inc
+ * Container class for the representation of a single booking
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 12.11.2007
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/** @todo document */
+/**
+ * Container class for the representation of a single booking
+ */
+class mod_roomReservationBooking {
+
+ /** (int / null) Unique ID in database */
+ protected $nUid;
+ /** (string) Name of the room */
+ protected $strRoom;
+ /** (timestamp) Date when the booking takes place */
+ protected $tsDate;
+ /** (int) Number of the first timeslice */
+ protected $nTsFirst;
+ /** (int) Number of the last timeslice (may be nBegin) */
+ protected $nTsLast;
+ /** (string) Account name of the owner */
+ protected $strAct;
+ /** (string) Reason for the booking */
+ protected $strReason;
+ /** (bool) Recurrence interval in weeks */
+ protected $nInterval;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ */
+ /**
+ * Constructor.
+ * @param $strRoom (string) Name of the room
+ * @param $tsDate (timestamp) Date when the booking takes place
+ * @param $nTsFirst (int) Number of the first timeslice
+ * @param $nTsLast (int) Number of the last timeslice (may be nBegin)
+ * @param $strAct (string) Account name of the owner
+ * @param $strReason (string) Reason for the booking
+ * @param $nInterval (int) Recurrence interval, 0 for no recurrence
+ * @return mod_roomReservationBooking
+ */
+ public function __construct($strRoom, $tsDate, $nTsFirst, $nTsLast, $strAct,
+ $strReason, $nInterval = 0) {
+ $this->setUid(null);
+ $this->setRoom($strRoom);
+ $this->setDate($tsDate);
+ $this->setTsFirst($nTsFirst);
+ $this->setTsLast($nTsLast);
+ $this->setAct($strAct);
+ $this->setReason($strReason);
+ $this->setInterval($nInterval);
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the unique ID in database
+ * @param $n (int) Unique ID in database
+ * @return void
+ */
+ public function setUid($n) {
+ if(is_null($n)) {
+ $this->nUid = null;
+ } else {
+ $this->nUid = intval($n);
+ }
+ }
+
+ /**
+ * Set the name of the room
+ * @param $str (string) Name of the room
+ * @return void
+ */
+ public function setRoom($str) { $this->strRoom = $str; }
+
+ /**
+ * Set the date when the booking takes place
+ * @param $ts (timestamp) Date, only the date part is taken care of
+ * @return void
+ */
+ public function setDate($ts) {
+ // Only take the date part
+ $this->tsDate = intval(strtotime(date("Y\-m\-d", intval($ts)))); }
+
+ /**
+ * Set the first timeslice
+ * @param $n (int) Number of the first timeslice
+ * @return void
+ */
+ public function setTsFirst($n) { $this->nTsFirst = intval($n); }
+
+ /**
+ * Set the end timeslice
+ * @param $n (int) Number of the last timeslice (may be the start timeslice)
+ * @return void
+ */
+ public function setTsLast($n) { $this->nTsLast = intval($n); }
+
+ /**
+ * Set the account name of the owner
+ * @param $str (string) Account name
+ * @return void
+ */
+ public function setAct($str) { $this->strAct = $str; }
+
+ /**
+ * Set the reason for the booking
+ * @param $str (string) Reason
+ * @return void
+ */
+ public function setReason($str) { $this->strReason = $str; }
+
+ /**
+ * Set the flag whether the booking repeates every week
+ * @param $n (int) interval in weeks, 0 for no recurrence
+ * @return void
+ */
+ public function setInterval($n) { $this->nInterval = intval(abs($n)); }
+
+ /**
+ * Get the unique ID in database
+ * @return int / null
+ */
+ public function getUid() { return intval($this->nUid); }
+
+ /**
+ * Get the name of the room
+ * @return string
+ */
+ public function getRoom() { return $this->strRoom; }
+
+ /**
+ * Get the date when the booking takes place
+ * @return timestamp
+ */
+ public function getDate() { return intval($this->tsDate); }
+
+ /**
+ * Get the the number of the first timeslice
+ * @return int
+ */
+ public function getTsFirst() { return intval($this->nTsFirst); }
+
+ /**
+ * Get the number of the last timeslice (may be the start timeslice)
+ * @return int
+ */
+ public function getTsLast() { return intval($this->nTsLast); }
+
+ /**
+ * Get the account name of the owner
+ * @return string
+ */
+ public function getAct() { return $this->strAct; }
+
+ /**
+ * Get the reason for the booking
+ * @return string
+ */
+ public function getReason() { return $this->strReason; }
+
+ /**
+ * Get the recurrence interval
+ * @return int
+ */
+ public function getInterval() { return $this->nInterval; }
+
+ /**@}*/
+}
+?>
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationBookingPage.inc
+ * Page that shows the booking table
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 24.02.2008
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once("share.inc");
+require_once("ctrl.inc");
+require_once("mod_room-reservation/mod_roomReservationPage.inc");
+require_once("mod_room-reservation/mod_roomReservationBookingTable.inc");
+require_once("mod_room-reservation/mod_roomReservationBookingsManager.inc");
+require_once("mod_room-reservation/mod_roomReservationConfig.inc");
+
+/**
+ * Page that shows the booking table
+ * @todo document, don't forget GET parameters
+ */
+class mod_roomReservationBookingPage extends mod_roomReservationPage {
+
+ /** (mod_roomReservationConfig) Reference to the configuration object */
+ protected $oCfg;
+ /**
+ * (mod_roomReservationRoomsManager) Reference to the rooms manager object
+ */
+ protected $oRm;
+ /**
+ * (mod_roomReservationBookingsManager) Reference to the bookings manager
+ * object
+ */
+ protected $oBm;
+ /** (timestamp) Starting date of the booking table */
+ protected $tsStart;
+ /** (int) Name of the room to show in the booking table */
+ protected $strRoom;
+
+ /** (mod_roomReservationBookingTable) The booking table */
+ protected $oBt;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor
+ * @param $oCfg (mod_roomReservationConfig) Reference to the configuration
+ * object
+ * @param $oRm (mod_roomReservationRoomsManager) Reference to the rooms
+ * manager object
+ * @param $oBm (mod_roomReservationBookingsManager) Reference to the
+ * bookings manager object
+ * @return mod_roomReservationBookingPage
+ */
+ public function __construct(mod_roomReservationConfig &$oCfg,
+ mod_roomReservationRoomsManager &$oRm,
+ mod_roomReservationBookingsManager &$oBm) {
+ $this->oCfg = $oCfg;
+ $this->oRm = $oRm;
+ $this->oBm = $oBm;
+
+ // create the booking table here, so the CSS is already added
+ /** @todo maybe move it into beforeAddCSS()... ? */
+ $this->oBt = new mod_roomReservationBookingsTable($this->oCfg, $this->oRm,
+ $this->oBm, "?bookingpage[action]=edit", "?bookingpage[action]=delete");
+
+ parent::__construct($oCfg);
+ $this->setTitle(_c("Room Reservation Schedule"));
+ $this->setIcon("mod_room-reservation_index");
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Initialization
+ * @{
+ */
+
+ /**
+ * Process the REQUEST variables and preset the some variables
+ * @return void
+ */
+ protected function processRequestVariables() {
+ // take all settings from the booking table
+ $this->setRoom($this->oBt->getRoom());
+ $this->setStart($this->oBt->getDate());
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the starting date
+ * @param $ts (timestamp)
+ */
+ public function setStart($ts) { $this->tsStart = intval($ts); }
+
+ /**
+ * Set the room to show in the booking table
+ * @param $str (string) Name of the room
+ */
+ public function setRoom($str) { $this->strRoom = $str; }
+
+ /**
+ * Get the starting date
+ * @return int
+ */
+ public function getStart() { return intval($this->tsStart); }
+
+ /**
+ * Get the name of the room to show in the booking table
+ * @return string
+ */
+ public function getRoom() { return $this->strRoom; }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Output
+ * @{
+ */
+
+ /**
+ * Show the page.
+ * @return void
+ */
+ public function doShow() {
+ // Protect access
+ if(!$this->oCfg->userCanView()) {
+ echo sprintf("<p class='err'>%s</p>",
+ MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
+ _PageBlue();
+ die();
+ }
+
+ Title(_c("room-reservation:Book rooms"));
+
+ // Form for room selection
+ /** @todo checkbox for recurring booking */
+ echo sprintf("<form name='room' method='get' action='%s'>",
+ $_SERVER["PHP_SELF"]);
+ echo sprintf("<input type='hidden' name='mod_roomReservationBookingTable".
+ "[date]' value='%d' />\n", $this->getStart());
+
+ // Show rooms only if it is whitelisted
+ try {
+ $aor = $this->oCfg->getWhitelistedRooms();
+ } catch(SQLException $e) {
+ trigger_error($e->getMessage());
+ }
+ if(count($aor) > 0) {
+ echo _c("room-reservation:Room:") . sprintf(" <select onchange=".
+ "'document.forms[\"room\"].submit()' width='250' ".
+ "name='mod_roomReservationBookingTable[room]'>\n", $this->getStart());
+ foreach($aor as $or) {
+ // note to myself: no qu() here, seems this is being done automagically
+ echo sprintf("<option value='%s'%s>%s</option>\n", $or->getName(),
+ ($or->getName() == $this->getRoom()) ? " selected='selected'" : "",
+ $or->getName());
+ }
+ echo sprintf("</select> <%s value='%s' /></form><p />\n",
+ $GLOBALS["stdbtn"], _("Change"));
+ } else {
+ printf("<p>%s</p>\n", _c("room-reservation:No rooms have been ".
+ "configured yet."));
+ return;
+ }
+
+ // Print line with next 5 or so weeks
+ $strSep = " | ";
+ $strLink = sprintf("<a href='%s?mod_roomReservationBookingTable[date]=%%d".
+ "&mod_roomReservationBookingTable[room]=%%s'>%%s</a>",
+ $_SERVER["PHP_SELF"]);
+ echo "<p>".sprintf($strLink, time(), qu($this->getRoom()),
+ _c("room-reservation:Current Week")) . $strSep;
+ echo sprintf($strLink, strtotime("1 week ago", $this->getStart()),
+ qu($this->getRoom()), _c("room-reservation:< Back")) . $strSep;
+ echo sprintf("<b>%s</b>", _sprintf_ord(_c("room-reservation:%d# week"),
+ date("W", $this->getStart()))) . $strSep;
+ for($i = 1; $i <= 5; $i++) {
+ $nNextWeek = strtotime("$i week", $this->getStart());
+ echo sprintf($strLink, $nNextWeek, qu($this->getRoom()), _sprintf_ord(
+ _c("room-reservation:%d# week"), date("W", $nNextWeek)));
+ echo $strSep;
+ }
+ echo sprintf($strLink, strtotime("1 week", $this->getStart()),
+ qu($this->getRoom()), _c("room-reservation:Next >"))."</p>\n";
+
+ $this->oBt->show();
+ }
+}
+?>
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationBookingTable.inc
+ * A timetable-like representation of bookings
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 03.02.2008
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once("mod_room-reservation/mod_roomReservationConfig.inc");
+require_once("mod_room-reservation/mod_roomReservationBookingsManager.inc");
+require_once("mod_room-reservation/mod_roomReservationRoomsManager.inc");
+
+/*****************************************************************************/
+/**
+ * @page bookingtable_actions Actions of a mod_roomReservationBookingTable
+ * instance
+ * @{
+ * The following constants describe the actions that a
+ * mod_roomReservationBookingTable instance can handle. They are used in
+ * processRequestVariables() to determine the action that should be done when
+ * the table is shown.
+ */
+/** Show the booking table (default action) */
+define("MOD_ROOM_RESERVATION_BT_ACTION_SHOW", 0);
+/** Show the form for a new booking */
+define("MOD_ROOM_RESERVATION_BT_ACTION_BOOK", 1);
+/** The booking form has been submitted, process the booking */
+define("MOD_ROOM_RESERVATION_BT_ACTION_SUBMIT", 2);
+/** Edit a booking */
+define("MOD_ROOM_RESERVATION_BT_ACTION_EDIT", 3);
+/** Show the deletion form */
+define("MOD_ROOM_RESERVATION_BT_ACTION_DELETE", 4);
+/** The deletion form has been submitted, delete the booking */
+define("MOD_ROOM_RESERVATION_BT_ACTION_SUBMITDELETE", 5);
+/** @} */
+
+/*****************************************************************************/
+/**
+ * @page bookingtable_printbooking_flags Flags for
+ * mod_roomReservationBookingTable::printBooking
+ * @{
+ * The following constants describe the flags for the second parameter of
+ * mod_roomReservationBookingTable::printBooking().
+ */
+/**
+ * This booking is new. New bookings are printed with a different background
+ * color.
+ */
+define("MOD_ROOM_RESERVATION_BTPB_NEW", 2);
+/** This booking is requested for deletion. Show delete button. */
+define("MOD_ROOM_RESERVATION_BTPB_DELETE", 4);
+/** @} */
+
+/*****************************************************************************/
+/**
+ * A timetable-like representation of bookings
+ * @todo document
+ */
+class mod_roomReservationBookingsTable /* extends mclWidget */ {
+
+ /** (mod_roomReservationConfig) Reference to the configuration object */
+ protected $oCfg;
+ /**
+ * (mod_roomReservationRoomsManager) Reference to the rooms manager object
+ */
+ protected $oRm;
+ /**
+ * (mod_roomReservationBookingsManager) Reference to the bookings manager
+ * object
+ */
+ protected $oBm;
+ /**
+ * (constant) The action to be performed.
+ * See @ref bookingtable_actions for a list of possible values.
+ */
+ protected $cAction;
+ /**
+ * (timestamp) The date of the requested booking or the date to show in the
+ * booking table
+ */
+ protected $tsDate;
+ /**
+ * (string) The name of the room of the requested booking or the room to be
+ * shown in the booking table
+ */
+ protected $strRoom;
+ /** (int) The starting timeslice of the requested booking */
+ protected $nTsFirst;
+ /** (int) The ending timeslice of the requested booking */
+ protected $nTsLast;
+ /** (string) The reason of the requested booking */
+ protected $strReason;
+ /** (int) UID of the booking to be deleted / edited */
+ protected $nDeleteUid;
+ /** (string) Value of the button that the user clicked */
+ protected $strSubmitButtonValue;
+ /** (string) Account of the owner, POST data */
+ protected $strPostAccount;
+ /** (int) recurrence interval, POST data */
+ protected $nPostInterval;
+ /** (string) Array of error messages */
+ protected $asErrors = array();
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor
+ * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
+ * configuration
+ * @param $oRm (reference to mod_roomReservationRoomsManager) Reference to
+ * the rooms manager object
+ * @param $oBm (reference to mod_roomReservationBookingsManager) Reference
+ * to the bookings manager object
+ * @return mod_roomReservationBookingTable
+ */
+ public function __construct(mod_roomReservationConfig &$oCfg,
+ mod_roomReservationRoomsManager &$oRm,
+ mod_roomReservationBookingsManager &$oBm) {
+ $this->oCfg = $oCfg;
+ $this->oRm = $oRm;
+ $this->oBm = $oBm;
+
+ try {
+ $this->processRequestVariables();
+ } catch(Exception $e) {
+ $this->asErrors[] = $e->getMessage();
+ }
+ $this->addCSS();
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Initialization
+ * @{
+ */
+
+ /**
+ * Process the REQUEST variables and preset the some variables. Throws an
+ * exception if the room provided by the GET data is not allowed for booking
+ * @return void
+ * @throws Exception
+ */
+ protected function processRequestVariables() {
+
+ // default values
+ $aoRooms = $this->oCfg->getWhitelistedRooms();
+ if(count($aoRooms) < 1) {
+ $this->setRoom("");
+ } else {
+ $this->setRoom($aoRooms[0]->getName());
+ }
+ // if weekends are not shown, show the next week already on saturday
+ if(!$this->oCfg->isShowWeekend() and (date("w") == 6 or date("w") == 0)) {
+ $this->setDate(strtotime("monday"));
+ } else {
+ $this->setDate(time());
+ }
+ $this->setAction(MOD_ROOM_RESERVATION_BT_ACTION_SHOW);
+ $this->nPostInterval = 0;
+
+ // handle GET parameters
+ if(isset($_GET["mod_roomReservationBookingTable"])) {
+ $ga = isset($_GET["mod_roomReservationBookingTable"]["action"]) ?
+ $_GET["mod_roomReservationBookingTable"]["action"] : "";
+ $this->setAction(($ga == "book") ?
+ MOD_ROOM_RESERVATION_BT_ACTION_BOOK : (($ga == "edit") ?
+ MOD_ROOM_RESERVATION_BT_ACTION_EDIT : (($ga == "delete") ?
+ MOD_ROOM_RESERVATION_BT_ACTION_DELETE : (($ga == "submit") ?
+ MOD_ROOM_RESERVATION_BT_ACTION_SUBMIT : (($ga == "submitdelete") ?
+ MOD_ROOM_RESERVATION_BT_ACTION_SUBMITDELETE :
+ MOD_ROOM_RESERVATION_BT_ACTION_SHOW)))));
+ $this->setDate(isset($_GET["mod_roomReservationBookingTable"]["date"]) ?
+ intval($_GET["mod_roomReservationBookingTable"]["date"]) : time());
+ if(isset($_GET["mod_roomReservationBookingTable"]["room"])) {
+ $this->setRoom($_GET["mod_roomReservationBookingTable"]["room"]);
+ }
+ $this->setTsFirst(
+ isset($_GET["mod_roomReservationBookingTable"]["tsfirst"]) ?
+ intval($_GET["mod_roomReservationBookingTable"]["tsfirst"]) : 0);
+ $this->setTsLast($this->getTsFirst());
+
+ // if deletion form is requested, set the right date, room etc.
+ if($this->getAction() == MOD_ROOM_RESERVATION_BT_ACTION_DELETE) {
+ if(isset($_GET["mod_roomReservationBookingTable"]["uid"]) &&
+ $_GET["mod_roomReservationBookingTable"]["uid"] >= 0) {
+ $this->setUid(intval(
+ $_GET["mod_roomReservationBookingTable"]["uid"]));
+ } else {
+ trigger_error("The UID is invalid.", E_USER_ERROR);
+ }
+ $ob = mod_roomReservationBookingsManager::getBookingByUid(
+ $this->getUid());
+ $this->setRoom($ob->getRoom());
+ if($ob->getInterval() > 0) {
+ // don't show the first date when the booking was created, but the
+ // date of the page where the user clicked the delete button
+ $this->setDate(
+ isset($_GET["mod_roomReservationBookingTable"]["date"]) ?
+ intval($_GET["mod_roomReservationBookingTable"]["date"]) : time());
+ } else {
+ $this->setDate($ob->getDate());
+ }
+ $this->setTsFirst($ob->getTsFirst());
+ }
+ }
+
+ if(isset($_POST["mod_roomReservationBookingTable"])) {
+ if(isset($_POST["mod_roomReservationBookingTable"]["submitbooking"])) {
+ // submission of the booking form
+ // let POST variables overwrite the variables
+ $this->setDate(
+ isset($_POST["mod_roomReservationBookingTable"]["date"]) ?
+ intval($_POST["mod_roomReservationBookingTable"]["date"]) : time());
+ $this->setRoom(
+ isset($_POST["mod_roomReservationBookingTable"]["room"]) ?
+ $_POST["mod_roomReservationBookingTable"]["room"] : "");
+ $this->setTsFirst(
+ isset($_POST["mod_roomReservationBookingTable"]["tsfirst"]) ?
+ intval($_POST["mod_roomReservationBookingTable"]["tsfirst"]) : 0);
+ $this->setTsLast(
+ isset($_POST["mod_roomReservationBookingTable"]["tslast"]) ?
+ intval($_POST["mod_roomReservationBookingTable"]["tslast"]) :
+ $this->getTsFirst());
+ $this->setReason(
+ isset($_POST["mod_roomReservationBookingTable"]["reason"]) ?
+ $_POST["mod_roomReservationBookingTable"]["reason"] : "");
+ $this->nPostInterval =
+ isset($_POST["mod_roomReservationBookingTable"]["interval"]) ?
+ intval($_POST["mod_roomReservationBookingTable"]["interval"]) : 0;
+ $this->strPostAccount =
+ isset($_POST["mod_roomReservationBookingTable"]["account"]) ?
+ $_POST["mod_roomReservationBookingTable"]["account"] : "";
+ }
+
+ if(isset($_POST["mod_roomReservationBookingTable"]["submitdelete"])) {
+ // submission of the deletion form
+ if(isset($_POST["mod_roomReservationBookingTable"]["uid"]) &&
+ $_POST["mod_roomReservationBookingTable"]["uid"] >= 0) {
+ $this->setUid(
+ intval($_POST["mod_roomReservationBookingTable"]["uid"]));
+ } else {
+ trigger_error("The UID is invalid.", E_USER_ERROR);
+ }
+ // set the right date, room etc.
+ $ob = mod_roomReservationBookingsManager::getBookingByUid(
+ $this->getUid());
+ $this->setRoom($ob->getRoom());
+ $this->setDate($ob->getDate());
+ $this->setTsFirst($ob->getTsFirst());
+ $this->setSubmitButtonValue(isset(
+ $_POST["mod_roomReservationBookingTable"]["submitdelete"]) ?
+ $_POST["mod_roomReservationBookingTable"]["submitdelete"] : "");
+ }
+ }
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the action that should be done
+ * @param $c (constant) See @ref bookingtable_actions for possible values
+ */
+ protected function setAction($c) { $this->cAction = intval($c); }
+
+ /**
+ * Set the starting timeslice of the requested booking
+ * @param $n (int)
+ */
+ protected function setTsFirst($n) { $this->nTsFirst = intval($n); }
+
+ /**
+ * Set the ending timeslice of the requested booking
+ * @param $n (int)
+ */
+ protected function setTsLast($n) { $this->nTsLast = intval($n); }
+
+ /**
+ * Set the date of the requested booking or the date to be shown in the
+ * booking table
+ * @param $ts (timestamp)
+ */
+ public function setDate($ts) { $this->tsDate = intval($ts); }
+
+ /**
+ * Set the room of the requested booking or the room to be shown in the
+ * booking table. Throws an Exception if the room is not allowed for booking.
+ * @param $str (string)
+ * @throws Exception
+ */
+ protected function setRoom($str) {
+ // only allow whitelisted rooms
+ if($this->oCfg->isRoomWhitelisted($str)) {
+ $this->strRoom = $str;
+ } else {
+ throw new Exception(_c("room-reservation:This room is not available ".
+ "for booking."));
+ }
+ }
+
+ /**
+ * Set the reason of the requested booking
+ * @param $str (string)
+ */
+ protected function setReason($str) { $this->strReason = $str; }
+
+ /**
+ * Set the UID of the booking to be deleted / edited
+ * @param $n (int)
+ */
+ protected function setUid($n) { $this->nUid = intval($n); }
+
+ /**
+ * Set the value of the submit button that the user clicked
+ * @param $str (string)
+ */
+ protected function setSubmitButtonValue($str) {
+ $this->strSubmitButtonValue = $str;
+ }
+
+ /**
+ * Get the name of the room of the requested booking or the room to show in
+ * the booking table
+ * @return string
+ */
+ public function getRoom() { return $this->strRoom; }
+
+ /**
+ * Get the action that should be done
+ * @return constant See @ref bookingtable_actions for possible values
+ */
+ public function getAction() { return $this->cAction; }
+
+ /**
+ * Get the the starting timeslice of the requested booking
+ * @return int
+ */
+ public function getTsFirst() { return $this->nTsFirst; }
+
+ /**
+ * Get the the ending timeslice of the requested booking
+ * @return int
+ */
+ public function getTsLast() { return $this->nTsLast; }
+
+ /**
+ * Get the the date of the requested booking or the date to be shown in the
+ * booking table
+ * @return timestamp
+ */
+ public function getDate() { return $this->tsDate; }
+
+ /**
+ * Get the the reason of the requested booking
+ * @return string
+ */
+ public function getReason() { return $this->strReason; }
+
+ /**
+ * Get the UID of the booking to be deleted / edited
+ * @return int
+ */
+ public function getUid() { return $this->nUid; }
+
+ /**
+ * Get the value of the submit button that the user clicked
+ * @return string
+ */
+ public function getSubmitButtonValue() {
+ return $this->strSubmitButtonValue;
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Output
+ * @{
+ */
+
+ /**
+ * Add the CSS rules needed for this page
+ * @return void
+ */
+ protected function addCSS() {
+ $strCss = <<<CSS
+#mod_roomReservationBookingTable .msg { font-weight:800; }
+#mod_roomReservationBookingTable td {
+ vertical-align: middle;
+ height: 5em;
+ border: 1px solid white;
+ padding:0.4em;
+}
+#mod_roomReservationBookingTable td.booking { background-color:#5276AB; }
+#mod_roomReservationBookingTable td.new { background-color:#008015; }
+#mod_roomReservationBookingTable td.recurring { background-color:#1C4174; }
+#mod_roomReservationBookingTable td.recurringnew { background-color:#006010; }
+#mod_roomReservationBookingTable td.heading { font-weight:bold; height:3em; }
+#mod_roomReservationBookingTable td.lesson { width:9%; }
+#mod_roomReservationBookingTable td.today { font-style:italic; }
+#mod_roomReservationBookingTable {
+ border:1px solid white;
+ border-collapse:collapse;
+ text-align:center; width:100%;
+}
+CSS;
+ if($this->oCfg->isShowWeekend()) {
+ $strCss .= "#mod_roomReservationBookingTable td.cell { width:13%; }";
+ } else {
+ $strCss .= "#mod_roomReservationBookingTable td.cell { width:18.2%; }";
+ }
+ rrAddCss($strCss);
+ }
+
+ /**
+ * Show the timetable
+ * @return void
+ * @throws AccessException
+ * @todo increase the height of the cells a little
+ */
+ public function show() {
+ // Protect access
+ if(!$this->oCfg->userCanView()) {
+ throw new AccessException(MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
+ return;
+ }
+
+ // print error messages and return if there are any
+ if(count($this->asErrors) > 0) {
+ printf("<p class='err'>%s</p>", join("<br />\n", $this->asErrors));
+ return;
+ }
+
+ // Print the header with the days
+ $ncTs = sizeof($this->oCfg->getTimeslices());
+ $nDays = ($this->oCfg->isShowWeekend()) ? 7 : 5;
+
+ echo "<table id='mod_roomReservationBookingTable'><tr>";
+
+ // Print header with day names
+ echo "<td class='heading' />";
+ for($ts = rrGetMonday($this->getDate()), $i=0; $i < $nDays;
+ $ts = strtotime("1 day", $ts), $i++) {
+ // Use a different color for the current day
+ $strClass = "heading";
+ $strTitle = strftime("%A<br />%x", $ts);
+ if(date("Ymd") === date("Ymd", $ts)) {
+ $strClass .= " today";
+ $strTitle .= " "._c("room-reservation:(today)");
+ }
+ echo sprintf("<td class='%s'>%s</td>", $strClass, $strTitle);
+ }
+ echo "</tr>\n";
+
+ // Print timetable
+ // To take care of bookings with more than one timeslice, we use an array
+ // that tells us which cell in the current column is the next to fill
+ $anNextRow = array_fill(0, $nDays, 0);
+ // Iterate over the timeslices
+ for($nTs = 0; $nTs < $ncTs; $nTs++) {
+ $strLessons = $this->oCfg->isShowLessons() ?_sprintf_ord(
+ _c("room-reservation:%s# lesson"), $nTs + 1) . "<br />" : "";
+ $oTs = $this->oCfg->getTimeslice($nTs);
+ $strTs = sprintf("%s - %s", gmstrftime(_("%#I:%M %p"), $oTs->getBegin()),
+ gmstrftime(_("%#I:%M %p"), $oTs->getEnd()));
+ // First column: Lesson
+ echo sprintf("<tr><td class='lesson'>%s</td>", $strLessons . $strTs);
+
+ // Iterate over the days
+ for($ts = rrGetMonday($this->getDate()), $i = 0; $i <= $nDays;
+ $ts = strtotime("1 day", $ts), $i++) {
+ // Don't print if there is a spanning booking on the current cell
+ if(isset($anNextRow[$i]) && $anNextRow[$i] == $nTs) {
+ if(($ob = $this->oBm->getBookingByTimeslice($this->getRoom(), $ts,
+ $nTs)) !== null) {
+ // a booking exists here
+ // print booking or deletion form or handle the deletion form
+
+ // deletion form is requested:
+ if(($this->getAction() == MOD_ROOM_RESERVATION_BT_ACTION_DELETE) &&
+ (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
+ ($this->getTsFirst() == $nTs) &&
+ ($this->getRoom() == $this->getRoom())) {
+ $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob,
+ MOD_ROOM_RESERVATION_BTPB_DELETE);
+
+ // deletion form is submitted:
+ } else if(($this->getAction() ==
+ MOD_ROOM_RESERVATION_BT_ACTION_SUBMITDELETE) &&
+ (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
+ ($this->getTsFirst() == $nTs) &&
+ ($this->getRoom() == $this->getRoom())) {
+ if($this->getSubmitButtonValue() == _("Delete")) {
+ // the user clicked the "delete" button
+ $bSuccess = false;
+ try {
+ $bSuccess = $this->oBm->delete($this->getUid());
+ } catch(Exception $e) {
+ $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob, 0,
+ array($e->getMessage()));
+ }
+ // print booking link and a success message
+ if($bSuccess) {
+ $anNextRow[$i] += $this->printBookingLink($nTs, $ts,
+ array(_c("room-reservation:The booking was deleted.")));
+ }
+ } else {
+ // the user cancelled the request
+ $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob);
+ }
+
+ // Something else -- print booking
+ } else {
+ $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob);
+ }
+ } else {
+ // no booking is here
+ // print booking link, booking form or handle booking form
+ $asErrors = array();
+
+ // booking form is requested:
+ if(($this->getAction() == MOD_ROOM_RESERVATION_BT_ACTION_BOOK) &&
+ (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
+ ($this->getTsFirst() == $nTs) &&
+ ($this->getRoom() == $this->getRoom())) {
+ $anNextRow[$i] += $this->printBookingForm($nTs, $ts, $asErrors);
+
+ // booking form is submitted:
+ } else if(($this->getAction() ==
+ MOD_ROOM_RESERVATION_BT_ACTION_SUBMIT) &&
+ // only handle the request if the form was in the current cell
+ (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
+ ($this->getTsFirst() == $nTs) &&
+ ($this->getRoom() == $this->getRoom())) {
+
+ // try writing the booking to the database
+ $nNewUid = -1;
+ $oNewBooking = new mod_roomReservationBooking($this->getRoom(),
+ $this->getDate(), $this->getTsFirst(), $this->getTsLast(),
+ (trim($this->strPostAccount) == "") ? $_SESSION["act"] :
+ $this->strPostAccount, $this->getReason(),
+ $this->nPostInterval);
+ try {
+ $nNewUid = $this->oBm->write($oNewBooking);
+ } catch(Exception $s) {
+ // print the booking form again with the user's input
+ // @todo check for overlapping bookings and print them
+ $asErrors[] = $s->getMessage();
+ $anNextRow[$i] += $this->printBookingForm($nTs, $ts,
+ $asErrors);
+ }
+ if($nNewUid > 0) {
+ // print new booking and increment the "next row" variable by
+ // the current span
+ $oNewBooking->setUid($nNewUid);
+ $anNextRow[$i] += $this->printBooking($nTs, $ts, $oNewBooking,
+ MOD_ROOM_RESERVATION_BTPB_NEW);
+ }
+
+ // Something else -- print booking link:
+ } else {
+ $anNextRow[$i] += $this->printBookingLink($nTs, $ts);
+ }
+ }
+ }
+ }
+ echo "</tr>\n";
+ }
+ echo "</table><br />";
+ }
+
+ /**
+ * Print a single booking in the booking table.
+ * @param $nTs (int) current timeslice
+ * @param $ts (timestamp) current date
+ * @param $ob (mod_roomReservationBooking) the booking
+ * @param $cFlags (constant) Flags,
+ * See @ref bookingtable_printbooking_flags for more information.
+ * @param $asMsgs (array of strings) Additional messages to be printed
+ * inside the cell, one array element per message
+ * @return (int) the span of the booking
+ */
+ protected function printBooking($nTs, $ts, mod_roomReservationBooking $ob,
+ $cFlags = 0, $asMsgs = array()) {
+ $strAfter = "";
+ $strBefore = "";
+
+ // messages
+ if(count($asMsgs) > 0) {
+ $strBefore .= "<p class='msg'>".nl2br(q(join("\n", $asMsgs)))."</p>\n";
+ }
+
+ // calculate the timespan of the current booking
+ $nSpan = $ob->getTsLast() - $ob->getTsFirst() + 1;
+
+ if(($cFlags & MOD_ROOM_RESERVATION_BTPB_DELETE) ==
+ MOD_ROOM_RESERVATION_BTPB_DELETE) {
+
+ // Restrict access
+ if(!($this->oBm->userIsOwner($ob->getUid()) or
+ $this->oCfg->userIsAdmin())) {
+ $strBefore .= "<p class='msg'>" .
+ MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED . "</p>\n";
+ #return $nSpan;
+ } else {
+ // print delete form
+ $strWarning = sprintf("<div>%s%s</div>", icon("dlg-warn",
+ array("bg" =>"gb")), _c("room-reservation:<b>Attention:</b> This ".
+ "booking is a recurring booking. If you delete it, the period will ".
+ "be deallocated for <b>every week</b>, not just this single week!"));
+ $strAfter .= sprintf("<p name='form' id='form' style='".
+ "text-align:center'><form action='%s?".
+ "mod_roomReservationBookingTable[action]=submitdelete#form' ".
+ "method='post'>%s%s<br /><%s name='mod_roomReservationBookingTable".
+ "[submitdelete]' value='%s' /> <%s name='".
+ "mod_roomReservationBookingTable[submitdelete]' value='%s' />".
+ "<input type='hidden' name='mod_roomReservationBookingTable[uid]' ".
+ "value='%d' /></form></p>", $_SERVER["PHP_SELF"],
+ _c("room-reservation:Delete this booking?"),
+ ($ob->getInterval() > 0 ? $strWarning : ""), $GLOBALS["smlbtn"],
+ _("Delete"), $GLOBALS["smlbtn"], _("Cancel"), $ob->getUid(),
+ $this->getRoom(), $this->getDate());
+ }
+ } else {
+ // delete and edit links, show only if user is allowed to
+ if($this->oBm->userIsOwner($ob->getUid()) ||
+ $this->oCfg->userIsAdmin()) {
+ /** @todo edit form */
+ $strAfter .= sprintf("<br />(<!-- <a href='%s?".
+ "mod_roomReservationBookingTable[action]=edit&".
+ "mod_roomReservationBookingTable[uid]=%d&".
+ "mod_roomReservationBookingTable[date]=%d#form' title='%s'>%s</a>, -->".
+ "<a href='%s?mod_roomReservationBookingTable[action]=delete&".
+ "mod_roomReservationBookingTable[uid]=%d&".
+ "mod_roomReservationBookingTable[date]=%d#form' title='%s'>%s</a>)",
+ $_SERVER["PHP_SELF"], $ob->getUid(), $ts,
+ _c("room-reservation:Edit this booking"),
+ _c("room-reservation:edit"), $_SERVER["PHP_SELF"], $ob->getUid(),
+ $ts, _c("room-reservation:Delete this booking"),
+ _c("room-reservation:delete"));
+ }
+ }
+
+ // test if booking is new and should be highlighted
+ $strClass = "cell booking".($ob->getInterval() > 0 ? " recurring" : "");
+ if(($cFlags & MOD_ROOM_RESERVATION_BTPB_NEW) ==
+ MOD_ROOM_RESERVATION_BTPB_NEW) {
+ $strClass .= " new";
+ }
+ // Use a different style for the current day
+ $strClass .= (date("Ymd", $ob->getDate()) == date("Ymd") ? " today" : "");
+ /** @todo: add ?subject=... to mailto link */
+ echo sprintf("<td rowspan='%d' class='%s'>%s<a %s>%s</a><br />%s%s</td>\n",
+ $nSpan, $strClass, $strBefore, mailto($ob->getAct()),
+ q(getRealUserName($ob->getAct())), q($ob->getReason()), $strAfter);
+
+ return $nSpan;
+ }
+
+ /**
+ * Print the booking form.
+ * @param $nTs (int) current timeslice
+ * @param $ts (timestamp) current date
+ * @param $asErrors (array of strings) Additional error message to be printed
+ * inside the cell, one array element per message
+ * @return (int) the span of the booking (i.e., 1)
+ */
+ protected function printBookingForm($nTs, $ts, $asErrors = array()) {
+ // Restrict access
+ if(!($this->oCfg->userCanBook() or $this->oCfg->userIsAdmin())) {
+ printf("<td class='err'>%s</td>\n",
+ MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
+ return 1;
+ }
+
+ $strErrors = "<p class='err'>".nl2br(q(join("\n", $asErrors)))."</p>";
+
+ // form to allow fixed bookings for admins
+ $sWeeklyForm = "";
+ if($this->oCfg->userIsAdmin()) {
+ $sWeeklyForm = sprintf("<label for='interval'>%s</label> %s<br />".
+ "<label for='account'>%s</label> <%s name='".
+ "mod_roomReservationBookingTable[account]' id='account' value='%s' ".
+ "size='15' /><br />", _c("room-reservation:Repetition:"),
+ select("mod_roomReservationBookingTable[interval]",
+ $this->nPostInterval, array(0 => _c("Select:None"), 1 =>
+ _c("room-reservation:every week")), array("add" => "id='interval'")),
+ _c("room-reservation:Account, if not yourself:"), $GLOBALS["stdedt"],
+ $this->strPostAccount);
+ }
+
+ echo sprintf("<td name='form' id='form' style='text-align:left'>%s".
+ "<form action='%s?mod_roomReservationBookingTable[action]=".
+ "submit#form' method='post'><label for='tslast'>%s</label> %s".
+ "<br /><label for='reason'>%s</label> <%s id='reason' size='15' ".
+ "value='%s' name='mod_roomReservationBookingTable[reason]' /><br />%s".
+ "<%s name='mod_roomReservationBookingTable[submitbooking]' value='%s' />".
+ "<input type='hidden' name='mod_roomReservationBookingTable[date]' ".
+ "value='%s' /><input type='hidden' name='".
+ "mod_roomReservationBookingTable[room]' value='%s' /><input ".
+ "type='hidden' name='mod_roomReservationBookingTable[tsfirst]' ".
+ "value='%s' /></form></td>\n", (count($asErrors) > 0) ? $strErrors : "",
+ $_SERVER["PHP_SELF"], _c("room-reservation:until:"),
+ select("mod_roomReservationBookingTable[tslast]", $this->getTsLast(),
+ $this->oCfg->getTimesliceEndings(true)), _c("room-reservation:Reason:"),
+ $GLOBALS["stdedt"], $this->getReason(), $sWeeklyForm, $GLOBALS["smlbtn"],
+ _c("room-reservation:Book"), $this->getDate(), $this->getRoom(),
+ $this->getTsFirst());
+ return 1;
+ }
+
+ /**
+ * Print the booking link
+ * @param $nTs (int) current timeslice
+ * @param $ts (timestamp) current date
+ * @param $asMsgs (array of strings) Additional messages to be printed
+ * inside the cell, one array element per message
+ * @return (int) the span of the booking (i.e., 1)
+ */
+ protected function printBookingLink($nTs, $ts, $asMsgs = array()) {
+
+ // Restrict access
+ if(!($this->oCfg->userCanBook() or $this->oCfg->userIsAdmin())) {
+ echo "<td />\n";
+ return 1;
+ }
+
+ // messages
+ $strBefore = "";
+ if(count($asMsgs) > 0) {
+ $strBefore .= "<p class='msg'>".join("<br />", $asMsgs)."</p>\n";
+ }
+
+ // print link to booking if the timeslice is later than now
+ $oTs = $this->oCfg->getTimeslice($nTs);
+ // note: only the timeslices are in GMT!
+ $tsCur = strtotime(date("Y-m-d ", $ts) . gmdate(" G:i",
+ $oTs->getEnd()));
+ if($tsCur > time()) {
+ $strURL = $_SERVER["PHP_SELF"] .
+ sprintf("?mod_roomReservationBookingTable[action]=book&".
+ "mod_roomReservationBookingTable[date]=%d&".
+ "mod_roomReservationBookingTable[room]=%s&".
+ "mod_roomReservationBookingTable[tsfirst]=%d#form", $ts,
+ qu($this->getRoom()), $nTs);
+ echo sprintf("<td class='cell'>%s<a href='%s' title='%s'>%s</a></td>\n",
+ $strBefore, $strURL, _c("room-reservation:Book this room from here"),
+ _c("room-reservation:(Book from here)"));
+ } else {
+ // only print the messages
+ echo sprintf("<td name='form' id='form' class='cell'>%s</td>\n",
+ $strBefore);
+ }
+ return 1;
+ }
+ /** @} */
+}
+?>
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationBookingsManager.inc
+ * Class to manage a set of bookings
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 23.11.2007
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once("sec/secure.inc");
+require_once("functions.inc");
+require_once("mod_room-reservation/mod_roomReservationConfig.inc");
+require_once("mod_room-reservation/mod_roomReservationBooking.inc");
+require_once("format.inc");
+
+db_query("SET DATESTYLE = ISO;");
+
+/**
+ * Management of a set of bookings
+ * @todo finish, document
+ */
+class mod_roomReservationBookingsManager {
+
+ /** (mod_roomReservationConfig) Reference to the configuration object */
+ protected $oCfg;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor.
+ * @param $oCfg (mod_roomReservationConfig) Reference to the configuration
+ * @return mod_roomReservationBookingsManager
+ */
+ function __construct(mod_roomReservationConfig &$oCfg) {
+ $this->oCfg = $oCfg;
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Retrieving bookings
+ * @{
+ */
+
+ /**
+ * Fetch a booking with the given unique ID from the SQL table
+ * @param $nUid (int) Unique ID of the booking
+ * @return mod_roomReservationBooking
+ */
+ public static function getBookingByUid($nUid) {
+ $h = db_query("SELECT * FROM mod_roomreservation_bookings WHERE rrb_uid = $1;", $nUid);
+ $a = pg_fetch_array($h);
+ $o = new mod_roomReservationBooking($a["rrb_room"], strtotime($a["rrb_date"]),
+ intval($a["rrb_tsfirst"]), intval($a["rrb_tslast"]), $a["rrb_act"],
+ $a["rrb_reason"], intval($a["rrb_interval"]));
+ $o->setUid(intval($a["rrb_uid"]));
+ return $o;
+ }
+
+ /**
+ * Test if there is a booking which takes place on the specified position at
+ * the specified date.
+ * @param $strRoom (string) Name of the room
+ * @param $tsDate (timestamp) The date
+ * @param $nTimeslice (int) The number of the timeslice
+ * @return mod_roomReservationBooking The booking which takes place on the
+ * specified time or <tt>null</tt> if no booking could be found.
+ */
+ public static function getBookingByTimeslice($strRoom, $tsDate,
+ $nTimeslice) {
+ $a = mod_roomReservationBookingsManager::getOverlappingBookings(
+ new mod_roomReservationBooking($strRoom, $tsDate, $nTimeslice,
+ $nTimeslice, null, null));
+ return isset($a[0]) ? $a[0] : null;
+ }
+
+ /**
+ * Get all bookings in database which overlap with the given booking.
+ * @param $ob (mod_roomReservationBooking) New booking that should be tested
+ * if it overlaps
+ * @return array with elements of type mod_roomReservationBooking
+ */
+ public static function getOverlappingBookings(
+ mod_roomReservationBooking $ob) {
+ // TODO: Test for bookings that only take place every n.th week (modulo n)
+
+ // Two bookings overlap, when they are on the same day and if
+ // old beginning < new ending AND old ending > new beginning
+ $hQuery = db_query("SELECT * FROM mod_roomreservation_bookings WHERE ".
+ "rrb_room = $1 AND ((rrb_interval > 0 AND EXTRACT(DOW FROM rrb_date) ".
+ "= $2) OR (rrb_interval = 0 AND rrb_date = $3)) AND rrb_tsfirst <= ".
+ "$4 AND rrb_tslast >= $5 ORDER BY rrb_tsfirst;", $ob->getRoom(),
+ date("w", $ob->getDate()), date("Y-m-d", $ob->getDate()),
+ intval($ob->getTsLast()), intval($ob->getTsFirst()));
+ $aoReturn = array();
+ while($aResult = pg_fetch_array($hQuery)) {
+ $aoReturn[] = mod_roomReservationBookingsManager::getBookingByUid(
+ $aResult["rrb_uid"]);
+ }
+ return $aoReturn;
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Management of bookings
+ * @{
+ */
+
+ /**
+ * Insert or update a booking in the database.
+ * The function throws an AccessException if the user was not allowed to
+ * write the booking, or an SQLException if there was an error while trying
+ * to insert or update the booking into the database.
+ * @param $ob (mod_roomReservationBooking) Booking to write to the database
+ * @return (int) The UID of the written booking
+ * @throws SQLException, AccessException
+ * @todo document
+ */
+ function write(mod_roomReservationBooking $ob) {
+ // protect access
+ if(($ob->getUid() != null and !$this->oCfg->userIsAdmin() and
+ !$this->userIsOwner($ob->nUid)) or
+ ($ob->getUid() == null and !$this->oCfg->userCanBook())) {
+ throw new AccessException(MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
+ }
+
+ // test if room is whitelisted
+ if(!$this->oCfg->isRoomWhitelisted($ob->getRoom())) {
+ throw new Exception(MOD_ROOM_RESERVATION_ERROR_ROOM_NOT_WHITELISTED);
+ }
+
+ $strWhere = null;
+ $strLog = "";
+
+ // check if everything is right and throw exceptions
+ if(trim($ob->getAct()) == "") {
+ $ob->setAct($SESSION["act"]);
+ } elseif(!isAct($ob->getAct())) {
+ throw new Exception(MOD_ROOM_RESERVATION_ERROR_NO_SUCH_ACCOUNT);
+ return false;
+ }
+ if($ob->getTsFirst() > $ob->getTsLast()) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN);
+ return false;
+ }
+ if(trim($ob->getReason()) == "") {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_NO_REASON);
+ return false;
+ }
+
+ // Test for overlapping bookings
+ if($this->getOverlappingBookings($ob) != array()) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_BOOKING_OVERLAPS);
+ return false;
+ }
+
+ // Show real times in log, but don't use the user's locale!
+ $oTsB = $this->oCfg->getTimesliceBeginnings(false);
+ $oTsE = $this->oCfg->getTimesliceEndings(false);
+
+ // Update or insert?
+ if($ob->getUid() == null) {
+ // No UID yet, insert new booking
+ // @todo write interval and user if interval > 0
+ $strLog = sprintf("Raum „%s“ am %s von %s bis %s gebucht ".
+ "(Begründung: %s)", $ob->getRoom(), date("d\.m\.Y", $ob->getDate()),
+ gmdate("G:i", $oTsB[$ob->getTsFirst()]), gmdate("G:i",
+ $oTsE[$ob->getTsLast()]), $ob->getReason());
+ } else {
+ // Update an existing booking
+ // @todo write old and new times into log
+ $strWhere = "rs_uid = ".qdb(intval($ob->getUid()));
+ $strLog = sprintf("Buchung im Raum „%s“ auf %s von %s bis %s ".
+ "geändert (Begründung: „%s“)", $ob->getRoom(), date("d\.m\.Y",
+ $ob->getDate()), gmdate("G:i", $oTsB[$ob->getTsFirst()]), gmdate("G:i",
+ $oTsE[$ob->getTsLast()]), $ob->getReason());
+ }
+ $aPut["rrb_room"] = $ob->getRoom();
+ $aPut["rrb_date"] = date("Y\-m\-d", $ob->getDate());
+ $aPut["rrb_tsfirst"] = intval($ob->getTsFirst());
+ $aPut["rrb_tslast"] = intval($ob->getTsLast());
+ $aPut["rrb_act"] = $ob->getAct();
+ $aPut["rrb_reason"] = $ob->getReason();
+ $aPut["rrb_interval"] = intval($ob->getInterval());
+
+ // @todo test if the foreign keys are being violated and throw an error
+ // message if neccessary
+ db_store("mod_roomreservation_bookings", $aPut, $strWhere);
+
+ $hQuery = db_query("SELECT currval('mod_roomreservation_bookings_rrb_uid_seq');");
+ $nNewUid = pg_fetch_result($hQuery, 0, "currval");
+
+ rrInsertLog($strLog);
+
+ // Return new UID
+ return $nNewUid;
+ }
+
+ /**
+ * Delete a booking from the database
+ * @param $nUid (int) Unique ID of the booking
+ * @return (bool) <tt>true</tt> on success, otherwise <tt>false</tt>.
+ * @todo test
+ */
+ public function delete($nUid) {
+ // Only administrators and owners are allowed to delete bookings
+ if(!($this->oCfg->userIsAdmin() or $this->userIsOwner($nUid))) {
+ throw new AccessException(MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
+ return false;
+ }
+
+ // Don't use the user's locale!
+ $oTsB = $this->oCfg->getTimesliceBeginnings(false);
+ $oTsE = $this->oCfg->getTimesliceEndings(false);
+ $ob = $this->getBookingByUid($nUid);
+ $strLog = sprintf("Buchung in Raum „%s“ am %s von %s bis %s ".
+ "gelöscht (Begründung war: %s)", $ob->getRoom(), date("d\.m\.Y",
+ $ob->getDate()), gmdate("G:i", $oTsB[$ob->getTsFirst()]), gmdate("G:i",
+ $oTsE[$ob->getTsLast()]), $ob->getReason());
+ // Delete it from the database
+ if(!db_query("DELETE FROM mod_roomreservation_bookings WHERE ".
+ "rrb_uid = $1;", $nUid)) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
+ return false;
+ } else {
+ rrInsertLog($strLog);
+ return true;
+ }
+ }
+
+ /**
+ * Determine if the current user is the owner of a specified error report.
+ * If this function fails, call getLastError() to get more information.
+ * @param $nID (int) Unique ID of the error report
+ * @throws SQLException
+ * @return bool
+ */
+ public static function userIsOwner($nID) {
+ if(!isset($_SESSION["act"])) {
+ return false; // user is not logged in
+ } else {
+ $hQuery = db_query("SELECT rrb_act FROM mod_roomreservation_bookings WHERE ".
+ "rrb_uid = $1;", intval($nID));
+ if(!is_resource($hQuery)) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
+ return false;
+ }
+ $arResult = pg_fetch_array($hQuery);
+ return ($arResult["rrb_act"] == $_SESSION["act"]);
+ }
+ }
+}
+?>
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationConfig.inc
+ * Handling of the configuration file
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 10.01.2008
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once("sec/secure.inc");
+require_once("db.inc");
+require_once("mod_room-reservation/functions.inc");
+require_once("mod_room-reservation/mod_roomReservationTimeslice.inc");
+require_once("mod_room-reservation/mod_roomReservationRoomsManager.inc");
+
+/**
+ * Determines if a privilege has been assigned
+ * @param $sPriv (string) Privilege to test
+ * @return bool
+ */
+function rrPrivilegeAssigned($sPriv) {
+ $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1;",
+ $sPriv);
+ return pg_num_rows($h) > 0;
+}
+
+/**
+ * Retrieve all groups that have a privilege assigned
+ * @param $strPriv (string) Privilege to test
+ * @return array
+ */
+function rrPrivilegedGroups($strPriv) {
+ $aReturn = array();
+ $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1 ".
+ "ORDER BY act;", $strPriv);
+ if(pg_num_rows($h) > 0) {
+ while($a = pg_fetch_array($h)) {
+ $aReturn[] = $a["act"];
+ }
+ }
+ return $aReturn;
+}
+
+/**
+ * User-defined compare function to compare timeslices
+ * @param $oTs1 (mod_roomReservationTimeslice)
+ * @param $oTs2 (mod_roomReservationTimeslice)
+ * @return (int) <tt>-1</tt> if $oTs1 begins before $oTs2,
+ * <tt>0</tt> if the $oTs1 and $oTs2 have the same beginning,
+ * <tt>1</tt> if $oTs1 begins after $oTs2.
+ */
+function rrConfigSortTimeslices(mod_roomReservationTimeslice $oTs1,
+ mod_roomReservationTimeslice $oTs2) {
+ if($oTs1->getBegin() == $oTs2->getBegin()) {
+ return 0;
+ } else {
+ return ($oTs1->getBegin() > $oTs2->getBegin()) ? 1 : -1;
+ }
+}
+
+define("MOD_ROOM_RESERVATION_CONFIGFILE_HEADER", "<?php
+/**
+ * configuration file for package iserv-mod-room-reservation
+ * This file is written by the configuration script. Do not change it manually.
+ */\n");
+
+/*****************************************************************************/
+/**
+ * Handling of the configuration file
+ * @todo document
+ */
+class mod_roomReservationConfig {
+
+ /** (array of rmTimeslice's) Timeslices */
+ protected $aoTimeslices;
+ /** (bool) Determine if the weekend is shown */
+ protected $bShowWeekend;
+ /** (bool) Determine if the strings "1. lesson", "2. lesson" etc are shown */
+ protected $bShowLessons;
+ /** (array of strings) error messages */
+ protected $asMessages;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor.
+ * @return mod_roomReservationConfig
+ */
+ public function __construct() {
+ $this->flushTimeslices();
+ $this->setShowWeekend(false);
+ $this->setShowLessons(true);
+ $this->asMessages = array();
+
+ $this->readConfig();
+ }
+
+ /**
+ * **************************************************************************
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Add a timeslice. A check is done that the timeslices do not overlap, and
+ * in this case, an Exception is thrown.
+ * @param $oTs (mod_roomReservationTimeslice)
+ * @throws Exception
+ * @return void
+ */
+ public function addTimeslice(mod_roomReservationTimeslice $oTs) {
+ // Check for overlapping timeslices
+ foreach($this->aoTimeslices as $oOldTs) {
+ if(($oOldTs->getBegin() < $oTs->getEnd() and
+ $oOldTs->getEnd() > $oTs->getBegin())) {
+ throw new Exception(
+ MOD_ROOM_RESERVATION_ERROR_CONFIG_OVERLAPPING_TIMESLICE);
+ }
+ }
+ $this->aoTimeslices[] = $oTs;
+ usort($this->aoTimeslices, "rrConfigSortTimeslices");
+ return;
+ }
+
+ /**
+ * Delete a timeslice
+ * @param $oTs (mod_roomReservationTimeslice) the timeslice to delete. If
+ * the timeslice is not found, an Exception is thrown.
+ * @throws Exception
+ * @return void
+ */
+ public function deleteTimeslice(mod_roomReservationTimeslice $oTs) {
+ for($i = 0; $i < count($this->aoTimeslices); $i++) {
+ if($this->aoTimeslices[$i]->getBegin() == $oTs->getBegin() and
+ $this->aoTimeslices[$i]->getEnd() == $oTs->getEnd()) {
+ // use array_splice because it renumbers the keys
+ array_splice($this->aoTimeslices, $i, 1);
+ return;
+ }
+ }
+ throw new Exception(MOD_ROOM_RESERVATION_ERROR_CONFIG_NO_SUCH_TIMESLICE);
+ }
+
+ /**
+ * Delete all timeslices.
+ * @return void
+ */
+ public function flushTimeslices() { $this->aoTimeslices = array(); }
+
+ /**
+ * Add a room to the list of rooms who can be booked. Throws an SQLException
+ * in case of an error.
+ * @param $sRoom (string) The name of the room
+ * @throws SQLException, Exception
+ * @return void
+ */
+ public function whitelistRoom($sRoom) {
+ if(!$this->isRoomWhitelisted($sRoom)) {
+ $r = db_store("mod_roomreservation_roomswhitelist",
+ array("rrr_name" => $sRoom));
+ if(!$r) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
+ } else {
+ log_insert(sprintf("Raum „%s“ für Buchungen zur Verfügung gestellt",
+ $sRoom));
+ }
+ }
+ }
+
+ /**
+ * Forbid bookings for a room. Throws an SQLException in case of an error.
+ * @param $sRoom The name of the room
+ * @throws SQLException
+ */
+ public function unWhitelistRoom($sRoom) {
+ $h = db_query("DELETE FROM mod_roomreservation_roomswhitelist WHERE ".
+ "rrr_name = $1;", $sRoom);
+ if(!$h) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
+ } else {
+ log_insert(sprintf("Raum „%s“ für Buchungen gesperrt", $sRoom));
+ }
+ }
+
+ /**
+ * Determine if a room is allowed for booking. Throws an SQLException
+ * in case of an error.
+ * @param $sRoom (string) The name of the room
+ * @return bool
+ * @throws SQLException
+ */
+ public function isRoomWhitelisted($sRoom) {
+ $h = db_query("SELECT * FROM mod_roomreservation_roomswhitelist WHERE ".
+ "rrr_name=$1;", $sRoom);
+ if(!$h) {
+ throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
+ }
+ return (pg_num_rows($h) > 0);
+ }
+
+ /**
+ * Get all rooms that are allowed for booking. Throws an SQLException
+ * in case of an error.
+ * @throws SQLException
+ * @return array of mod_roomReservationRoomsManager objects
+ */
+ public function getWhitelistedRooms() {
+ $aor = mod_roomReservationRoomsManager::getRooms();
+ $ar = array();
+ foreach($aor as $key => $or) {
+ if($this->isRoomWhitelisted($or->getName())) {
+ $ar[] = $or;
+ }
+ }
+ return $ar;
+ }
+
+ /**
+ * Show or hide the weekend
+ * @param $b (bool)
+ */
+ public function setShowWeekend($b) { $this->bShowWeekend = ($b == true); }
+
+ /**
+ * Show or hide the lesson strings in the booking table
+ * @param $b (bool)
+ */
+ public function setShowLessons($b) { $this->bShowLessons = ($b == true); }
+
+ /**
+ * Add a message to the internal array of (error) messages
+ * @param $sMessage (string)
+ */
+ public function addMessage($sMessage) {
+ array_merge($this->asMessages, array($sMessage));
+ }
+
+ /**
+ * Get all timeslices in chronological order
+ * @return array of rmTimeslice
+ */
+ public function getTimeslices() { return $this->aoTimeslices; }
+
+ /**
+ * Return the starting times of every timeslice
+ * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
+ * current locale
+ * <tt>false</tt>: return just the timestamps
+ * @return array
+ */
+ public function getTimesliceBeginnings($bFormat = false) {
+ $aot = $this->getTimeslices();
+ $aRet = array();
+ foreach($aot as $ao) {
+ $aRet[] = $bFormat ? gmstrftime(_("%#I:%M %p"), $ao->getBegin()) :
+ $ao->getBegin();
+ }
+ return $aRet;
+ }
+
+ /**
+ * Return the ending times of every timeslice
+ * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
+ * current locale
+ * <tt>false</tt>: return just the timestamps
+ * @return array
+ */
+ public function getTimesliceEndings($bFormat = false) {
+ $aot = $this->getTimeslices();
+ $aRet = array();
+ foreach($aot as $ao) {
+ $aRet[] = $bFormat ? gmstrftime(_("%#I:%M %p"), $ao->getEnd()) :
+ $ao->getEnd();
+ }
+ return $aRet;
+ }
+
+ /**
+ * Get a timeslice
+ * @param $n (int) index of the timeslice in the array
+ * @return rmTimeslice
+ */
+ public function getTimeslice($n) { return $this->aoTimeslices[$n]; }
+
+ /**
+ * Determine if the weekend is shown
+ * @return bool
+ */
+ public function isShowWeekend() { return ($this->bShowWeekend == true); }
+
+ /**
+ * Determine if the lesson strings in the booking table are shown
+ * @return bool
+ */
+ public function isShowLessons() { return ($this->bShowLessons == true); }
+
+ /**
+ * Determine if the current user has admin rights. This function tests
+ * if the user is in a group which has the privilege of admin rights.
+ * @todo test
+ * @return bool
+ */
+ public function userIsAdmin() {
+ return secure_privilege("mod_roomreservation_admin");
+ }
+
+ /**
+ * Determine if the current user can book rooms. This function tests
+ * if the user is in a group which has the privilege to book rooms.
+ * If no group has this privilege, all users can book.
+ * @todo test
+ * @return bool
+ */
+ public function userCanBook() {
+ if(!rrPrivilegeAssigned("mod_roomreservation_book")) {
+ // If the privilege is not assigned to any group, all users can book
+ return true;
+ } else {
+ // If user is admin, it makes sense that he can book rooms ;-)
+ return secure_privilege("mod_roomreservation_book") ||
+ secure_privilege("mod_roomreservation_admin");
+ }
+ }
+
+ /**
+ * Determine if the current user can view bookings. This function tests
+ * if the user is in a group which has been configured as a group who
+ * can view bookings. If no groups are configured, any user can view the
+ * bookings table.
+ * @todo test
+ * @return bool
+ */
+ public function userCanView() {
+ if(!rrPrivilegeAssigned("mod_roomreservation_view")) {
+ // If the privilege is not assigned to any group, all users can view
+ return true;
+ } else {
+ // If user is admin or can book, it makes sense that he can view bookings
+ return secure_privilege("mod_roomreservation_admin") ||
+ secure_privilege("mod_roomreservation_book") ||
+ secure_privilege("mod_roomreservation_view");
+ }
+ }
+
+ /**
+ * Get the messages that have been produced
+ * @return string
+ */
+ public function getMessages() {
+ return join("\n", $this->asMessages);
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Operations
+ * @{
+ */
+
+ /**
+ * Write the current state of this instance to the config file.
+ * @throws IOException
+ * @return bool
+ */
+ public function writeConfig() {
+ // Open config file
+ $hFile = fopen("mod_room-reservation/config.inc", "w", true);
+ if(!is_resource($hFile)) {
+ throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
+ return false;
+ }
+ // Try to lock file repeatedly
+ for($n = 0; !flock($hFile, LOCK_EX); $n++) {
+ if($n > 10) {
+ throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
+ return false; // Give up
+ } else {
+ sleep(0.2); // Retry after 100 ms
+ }
+ }
+
+ // Create text for config file
+ $strFile = MOD_ROOM_RESERVATION_CONFIGFILE_HEADER;
+
+ // Timeslices
+ $strFile .= "\$this->flushTimeslices();\n";
+ foreach($this->getTimeslices() as $oTs) {
+ $strFile .= sprintf("\$this->addTimeslice(new ".
+ "mod_roomReservationTimeslice(%d, %d));\n", $oTs->getBegin(),
+ $oTs->getEnd());
+ }
+
+ // Show weekend
+ $strFile .= sprintf("\$this->setShowWeekend(%s);\n",
+ $this->isShowWeekend() ? "true" : "false");
+
+ // Show lessons
+ $strFile .= sprintf("\$this->setShowLessons(%s);\n",
+ $this->isShowLessons() ? "true" : "false");
+
+ $strFile .= "?>";
+
+ // Write to config file and unlock it
+ if(fwrite($hFile, $strFile) == false) {
+ throw new IOException(MOD_ROOM_RESERVATION_ERROR_WRITE_FILE);
+ return false;
+ }
+ if(!flock($hFile, LOCK_UN)) {
+ throw new IOException(MOD_ROOM_RESERVATION_ERROR_UNLOCK_FILE);
+ return false;
+ }
+
+ rrInsertLog("Konfiguration verändert");
+ return true;
+ }
+
+ /**
+ * Read configuration from file. Returns <tt>false</tt> if an error occured,
+ * in this case getMessages() contains error messages.
+ * @return bool
+ */
+ public function readConfig() {
+ global $g_rmCfg;
+ try {
+ require("mod_room-reservation/config.inc");
+ } catch(Exception $e) {
+ $this->addMessage($e->getMessage());
+ }
+ }
+
+ /** @} */
+}
+?>
--- /dev/null
+<?php
+/**\r
+ * @file mod_roomReservationConfigPage.inc\r
+ * The configuration page\r
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
+ * @date 24.06.2008\r
+ * \r
+ * Copyright © 2007 Roland Hieber\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ * \r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+\r
+require_once("ctrl.inc");
+require_once("mod_room-reservation/mod_roomReservationPage.inc");
+require_once("mod_room-reservation/mod_roomReservationTimesliceListBox.inc");
+require_once("mod_room-reservation/mod_roomReservationRoomWhitelistListBox.inc");
+
+/** @todo document */
+class mod_roomReservationConfigPage extends mod_roomReservationPage {
+
+ protected $bPostShowWeekend;
+ protected $bPostShowLessons;
+ protected $asMessages = array();
+ protected $otlb;
+ protected $orwlb;
+
+ public function __construct(mod_roomReservationConfig &$oCfg) {
+ parent::__construct($oCfg);
+ $this->otlb = new mod_roomReservationTimesliceListBox($this->oCfg);
+ $this->orwlb = new mod_roomReservationRoomWhitelistListBox($this->oCfg);
+ $this->setTitle(_c("room-reservation:Configuration"));
+ $this->setIcon("mod_room-reservation_config");
+ }
+
+ public function processRequestVariables() {
+ // default values
+ $this->bPostShowWeekend = $this->oCfg->isShowWeekend();
+ $this->bPostShowLessons = $this->oCfg->isShowLessons();
+
+ if(isset($_POST["mod_roomReservationConfigPage"])) {
+ if(isset($_POST["mod_roomReservationConfigPage"]["showweekend"])) {
+ $this->bPostShowWeekend =
+ ($_POST["mod_roomReservationConfigPage"]["showweekend"] == true);
+ }
+
+ if(isset($_POST["mod_roomReservationConfigPage"]["showlessons"])) {
+ $this->bPostShowLessons =
+ ($_POST["mod_roomReservationConfigPage"]["showlessons"] == true);
+ }
+
+ // process the request
+ if(isset($_POST["mod_roomReservationConfigPage"]["submit"])) {
+ $this->oCfg->setShowWeekend($this->bPostShowWeekend);
+ $this->oCfg->setShowLessons($this->bPostShowLessons);
+ try {
+ $this->oCfg->writeConfig();
+ } catch(Exception $e) {
+ $this->asMessages[] = $e->getMessage();
+ }
+ }
+ }
+ }
+
+ public function doShow() {
+ // error messages
+ if(count($this->asMessages) > 0) {
+ printf("<p>%s</p>", nl2br(q(join("\n", $this->asMessages))));
+ }
+
+ // first column
+ echo "<table border='0' cellspacing='10' cellpadding='0'><tr>".
+ "<td style='width:50%;'>\n";
+
+ GroupBox(_c("room-reservation:Available rooms"), "host");
+ printf("<p>%s</p>", _c("room-reservation:The following rooms are ".
+ "available for booking:"));
+ echo "<div style='margin:8px;'>";
+ $this->orwlb->show();
+ echo "</div>\n";
+ _GroupBox();
+
+ GroupBox(_("Privileges"), "keys");
+ $asAdminGroups = rrPrivilegedGroups("mod_roomreservation_admin");
+ $asBookGroups = rrPrivilegedGroups("mod_roomreservation_book");
+ $asViewGroups = rrPrivilegedGroups("mod_roomreservation_view");
+ echo sprintf("<p>%s</p>\n<p>%s</p>\n<p>%s</p>", _c("room-reservation:This is ".
+ "a short summary of the privileges related to the room reservation ".
+ "schedulde and the groups which have them assigned."),
+ sprintf(_c("room-reservation:If one of these privileges is not assigned to ".
+ "any group, all users on this server are allowed to perform the specified ".
+ "action. Please use the %sgroup administration%s to assign and revoke ".
+ "privileges."), "<a href='/idesk/admin/act/groups.php'>", "</a>"),
+ _c("room-reservation:Please note that every group with the booking ".
+ "privilege can also implicitly view the booking table and every group with ".
+ "the administration privilege can also implicitly book and view the ".
+ "booking table."));
+ echo "<p><table style='width:100%'><tr>\n";
+ echo sprintf("<td>%s%s</td><td>%s</td>\n", icon("keys"),
+ _("View the booking table").":", $asViewGroups == array() ?
+ _c("room-reservation:all users") : icon("act-group") . join(", ",
+ array_map("getGroupName", $asViewGroups)));
+ echo "</tr><tr>\n";
+ echo sprintf("<td>%s%s</td><td>%s</td>\n", icon("keys"),
+ _("Book rooms").":", $asBookGroups == array() ?
+ _c("room-reservation:all users") : icon("act-group") . join(", ",
+ array_map("getGroupName", $asBookGroups)));
+ echo "</tr><tr>\n";
+ echo sprintf("<td>%s%s</td><td>%s</td>\n", icon("keys"),
+ _("Administration of the room reservation schedule"),
+ $asAdminGroups == array() ? _c("room-reservation:all users") :
+ icon("act-group") . join(", ", array_map("getGroupName", $asAdminGroups)));
+ echo "</tr></table></p>\n";
+ _GroupBox();
+
+ // second column
+ echo "</td><td><!--second row-->\n";
+
+ GroupBox(_c("room-reservation:Periods"), "mod_room-reservation_timeslice");
+ printf("<p>%s</p>", _c("room-reservation:Here you can fill in the ".
+ "periods where bookings can be undertaken. A booking period can ".
+ "e. g. correspond to a lesson."));
+ echo "<div style='margin:8px;'>";
+ $this->otlb->show();
+ echo "</div>\n";
+ _GroupBox();
+
+ GroupBox(_c("room-reservation:Further options"), "manage");
+ printf("<div style='margin:8px;'><form action='%s' method='post'>".
+ "<table><tr>\n", $_SERVER["PHP_SELF"]);
+
+ printf("<td><input type='hidden' name='mod_roomReservationConfigPage".
+ "[showweekend]' value='0' /><%s name='mod_roomReservationConfigPage".
+ "[showweekend]' id='mod_roomReservationConfigPageShowWeekend' ".
+ "value='1' %s /></td><td><label for='".
+ "mod_roomReservationConfigPageShowWeekend'><b>%s</b></label><br />".
+ "<span class='mod_roomReservationConfigPageExplanation'>%s</span></p>",
+ $GLOBALS["smlchk"], $this->bPostShowWeekend ? "checked='checked' " : "",
+ _c("room-reservation:Show weekend"), _c("room-reservation:If ".
+ "selected, the weekdays saturday and sunday are also shown in the ".
+ "booking table."));
+
+ echo "</tr><tr>\n";
+ printf("<td><input type='hidden' name='mod_roomReservationConfigPage".
+ "[showlessons]' value='0' /><%s name='mod_roomReservationConfigPage".
+ "[showlessons]' id='mod_roomReservationConfigPageShowLessons' ".
+ "value='1'%s /></td><td><label for='".
+ "mod_roomReservationConfigPageShowLessons'><b>%s</b></label><br />".
+ "<span class='mod_roomReservationConfigPageExplanation'>%s</span></p>",
+ $GLOBALS["smlchk"], $this->bPostShowLessons ? "checked='checked' " : "",
+ _c("room-reservation:Show „lesson” texts"),
+ _c("room-reservation:Check this box to show texts like ".
+ "„<i>n</i>th lesson&rdquo in the booking page. If this box is ".
+ "unchecked, none of these texts are shown."));
+
+ printf("</tr><tr><td colspan='2'><%s name='mod_roomReservationConfigPage".
+ "[submit]' value='%s' /></td>", $GLOBALS["stdbtn"], _("OK"));
+ echo "</tr></table></form></div>\n";
+ _GroupBox();
+
+ echo "</td></tr></table>\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/**\r
+ * @file mod_roomReservationControl.inc\r
+ * Class that represents an abstract control\r
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
+ * @date 25.07.2008\r
+ * \r
+ * Copyright © 2007 Roland Hieber\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ * \r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+
+require_once("quote.inc");
+require_once("functions.inc");
+\r
+/** @todo document */
+abstract class mod_roomReservationControl {
+ /** (array of strings) Errors that occur while processing the form */
+ protected $asMessages;
+ /** (mod_roomReservationConfig) Reference to the configuration object */
+ protected $oCfg;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor
+ * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
+ * configuration
+ * @return mod_roomReservationBookingTable
+ */
+ public function __construct(mod_roomReservationConfig &$oCfg) {
+ rrAddCss(".blue .treeview .err { color:red !important; }");
+ $this->oCfg = $oCfg;
+ $this->processRequestVariables();
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Initialization
+ * @{
+ */
+
+ /**
+ * Process the REQUEST variables and preset the some variables
+ * @return void
+ */
+ protected function processRequestVariables() { }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Output
+ * @{
+ */
+
+ /**
+ * Get the messages that have been produced. Returns HTML.
+ * @return string
+ */
+ protected function getMessages() {
+ if(count($this->asMessages) > 0) {
+ return sprintf("<div class='err'>%s</p>\n",
+ nl2br(q(join("\n", $this->asMessages))));
+ }
+ }
+
+ /**
+ * Show the beginning of the control.
+ * @return void
+ */
+ protected function beginShow() { }
+
+ /**
+ * Show the control. Override this function to print your HTML code.
+ * @return void
+ */
+ protected abstract function doShow();
+
+ /**
+ * Show the end of the control.
+ * @return void
+ */
+ protected function endShow() { }
+
+ /**
+ * Show the full control. You don't need to override this function. Instead,
+ * override doShow().
+ * @return void
+ */
+ public function show() {
+ $this->beginShow();
+ $this->doShow();
+ $this->endShow();
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/**\r
+ * @file mod_roomReservationPage.inc\r
+ * A generic page class\r
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
+ * @date 24.06.2008\r
+ * \r
+ * Copyright © 2007 Roland Hieber\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ * \r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+\r
+require_once("mod_room-reservation/mod_roomReservationConfig.inc");
+
+/** @todo document */
+abstract class mod_roomReservationPage {
+ /** (mod_roomReservationConfig) Reference to the configuration object */
+ protected $oCfg;
+ /** (string) Page title for PageBlue() */
+ protected $strTitle;
+ /** (string) Title icon for PageBlue() */
+ protected $strIcon;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor
+ * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
+ * configuration
+ * @return mod_roomReservationPage
+ */
+ function __construct(mod_roomReservationConfig &$oCfg) {
+ $this->oCfg = $oCfg;
+
+ $this->processRequestVariables();
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Initialization
+ * @{
+ */
+
+ /**
+ * Process the REQUEST variables and preset the some variables. Override
+ * this function to process GET and POST parameters.
+ * @return void
+ */
+ protected function processRequestVariables() { }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the page title
+ * @param $str (string)
+ * @return void
+ */
+ public function setTitle($str) { $this->strTitle = $str; }
+
+ /**
+ * Set the title icon
+ * @param $str (string)
+ * @return void
+ */
+ public function setIcon($str) { $this->strIcon = $str; }
+
+ /**
+ * Get the page title
+ * @return string
+ */
+ public function getTitle() { return $this->strTitle; }
+
+ /**
+ * Get the title icon
+ * @return string
+ */
+ public function getIcon() { return $this->strIcon; }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Output
+ * @{
+ */
+
+ /**
+ * Show the beginning of the page.
+ * @return void
+ */
+ protected function beginShow() {
+ html_header("<style type='text/css'>\n".rrGetCss()."\n</style>\n");
+ PageBlue(q($this->getTitle()), $this->getIcon());
+
+ // print error messages from the configuration
+ if($s = trim($this->oCfg->getMessages()) != "") {
+ printf("<p class='err'>%s</p>\n", nl2br(q($s)));
+ }
+ }
+
+ /**
+ * Show the beginning of the page. Override this function to print your
+ * HTML code.
+ * @return void
+ */
+ protected abstract function doShow();
+
+ /**
+ * Show the end of the page.
+ * @return void
+ */
+ protected function endShow() {
+ _PageBlue();
+ }
+
+ /**
+ * Show the full page. You don't need to override this function. Instead,
+ * override doShow().
+ * @return void
+ */
+ public function show() {
+ $this->beginShow();
+ $this->doShow();
+ $this->endShow();
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationRoom.inc
+ * Container class for the representation of a room
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 28.12.2007
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @todo move into M Class Library
+ */
+
+/**
+ * Container class for the representation of a room
+ */
+class mod_roomReservationRoom {
+
+ /** (string) Name of the room */
+ protected $strName;
+ /** (string) Room number */
+ protected $strRoomNo;
+ /** (string) Floor */
+ protected $strFloor;
+ /** (string) Building */
+ protected $strBuilding;
+ /** (string) Location */
+ protected $strLocation;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor.
+ * @param $strName (string) Name of the room
+ * @return rmRoom
+ */
+ public function __construct($strName, $strRoomNo = "", $strFloor = "",
+ $strBuilding = "", $strLocation = "") {
+ $this->setName($strName);
+ $this->setRoomNo($strRoomNo);
+ $this->setFloor($strFloor);
+ $this->setBuilding($strBuilding);
+ $this->setLocation($strLocation);
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the name of the room
+ * @param $str (string)
+ * @return void
+ */
+ public function setName($str) { $this->strName = $str; }
+
+ /**
+ * Set the room number
+ * @param $str (string)
+ * @return void
+ */
+ public function setRoomNo($str) { $this->strRoomNo = $str; }
+
+ /**
+ * Set the floor
+ * @param $str (string)
+ * @return void
+ */
+ public function setFloor($str) { $this->strFloor = $str; }
+
+ /**
+ * Set the building
+ * @param $str (string)
+ * @return void
+ */
+ public function setBuilding($str) { $this->strBuilding = $str; }
+
+ /**
+ * Set the location
+ * @param $str (string)
+ * @return void
+ */
+ public function setLocation($str) { $this->strLocation = $str; }
+
+ /**
+ * Get the name of the room
+ * @return string
+ */
+ public function getName() { return $this->strName; }
+
+ /**
+ * Get the room number
+ * @return string
+ */
+ public function geRoomNo() { return $this->strRoomNo; }
+
+ /**
+ * Get the floor
+ * @return string
+ */
+ public function getFloor() { return $this->strFloor; }
+
+ /**
+ * Get the building
+ * @return string
+ */
+ public function getBuilding() { return $this->strBuilding; }
+
+ /**
+ * Get the location
+ * @return string
+ */
+ public function getLocation() { return $this->strLocation; }
+
+ /**
+ * Conversion to string
+ * @return string
+ */
+ public function __toString() { return $this->getName(); /* name is key */ }
+ /**@}*/
+}
+?>
--- /dev/null
+<?php
+/**\r
+ * @file mod_roomReservationRoomWhitelistListBox.inc\r
+ * List box that shows the rooms who can be booked\r
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
+ * @date 24.07.2008\r
+ * \r
+ * Copyright © 2007 Roland Hieber\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ * \r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+
+require_once("mod_roomReservationControl.inc");
+require_once("mod_roomReservationRoomsManager.inc");
+
+/*****************************************************************************/
+/**
+ * @page roomwhitelistlistbox_actions Actions of a
+ * mod_roomReservationRoomWhitelistListBox instance
+ * @{
+ * The following constants describe the actions that a
+ * mod_roomReservationRoomWhitelistListBox instance can handle. They are used
+ * in processRequestVariables() to determine the action that should be done
+ * when the control is shown.
+ */
+/** Show the control (default action) */
+define("MOD_ROOM_RESERVATION_RWLB_ACTION_SHOW", 0);
+/** Show the addition form */
+define("MOD_ROOM_RESERVATION_RWLB_ACTION_ADD", 1);
+/** Process the addition form */
+define("MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITADD", 2);
+/** Show the deletion form */
+define("MOD_ROOM_RESERVATION_RWLB_ACTION_DELETE", 3);
+/** Process the deletion form */
+define("MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITDELETE", 4);
+/** @} */
+\r
+/** @todo document */
+class mod_roomReservationRoomWhitelistListBox
+ extends mod_roomReservationControl {
+ /**
+ * (array of integers) OIDs of the rows in the rooms table that were
+ * selected (POST data)
+ */
+ protected $anPostSelection = array();
+ /** (constant) Display mode, see @ref roomwhitelistlistbox_actions */
+ protected $cMode;
+
+ protected function processRequestVariables() {
+ // default values
+ $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_SHOW;
+
+ // POST data
+ if(isset($_POST["mod_roomReservationRoomWhitelistListBox"])) {
+ $aPost = $_POST["mod_roomReservationRoomWhitelistListBox"];
+ // mode
+ if(isset($aPost["action"])) {
+ if(isset($aPost["action"]["add"])) {
+ if($aPost["action"]["add"] == _("Add")) {
+ $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_ADD;
+ } elseif($aPost["action"]["add"] == _("OK")) {
+ $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITADD;
+ }
+ } elseif(isset($aPost["action"]["delete"])) {
+ if($aPost["action"]["delete"] == _("Delete")) {
+ $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_DELETE;
+ } elseif($aPost["action"]["delete"] == _("OK")) {
+ $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITDELETE;
+ }
+ }
+ }
+ // selection
+ if(isset($aPost["l"])) {
+ foreach($aPost["l"] as $nOid => $bChecked) {
+ if($bChecked) {
+ $this->anPostSelection[] = $nOid;
+ }
+ }
+ }
+ }
+
+ // process the forms
+ if($this->cMode == MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITADD) {
+ $h = db_query("SELECT name FROM rooms WHERE oid IN ".
+ qdb_arr($this->anPostSelection));
+ while($a = pg_fetch_array($h)) {
+ $this->oCfg->whitelistRoom($a["name"]);
+ }
+ }
+
+ if($this->cMode == MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITDELETE) {
+ $h = db_query("SELECT name FROM rooms WHERE oid IN ".
+ qdb_arr($this->anPostSelection));
+ while($a = pg_fetch_array($h)) {
+ $this->oCfg->unWhitelistRoom($a["name"]);
+ }
+ }
+ }
+
+ protected function doShow() {
+ echo "<form method='post'>";
+ TreeView(array(_("Room")));
+ switch($this->cMode) {
+ case MOD_ROOM_RESERVATION_RWLB_ACTION_DELETE:
+ $this->showDeleteForm();
+ break;
+ case MOD_ROOM_RESERVATION_RWLB_ACTION_ADD: $this->showAddForm(); break;
+ default:
+ case MOD_ROOM_RESERVATION_RWLB_ACTION_SHOW: $this->showForm(); break;
+ }
+ _TreeView();
+ echo "</form>\n";
+ }
+
+ /**
+ * Print the form if not delete nor add was requested
+ * @return void
+ */
+ protected function showForm() {
+ $aoRooms = $this->oCfg->getWhitelistedRooms();
+ // only show add button if there are still some unlisted rooms
+ if(count(mod_roomReservationRoomsManager::getRooms()) > count($aoRooms)) {
+ TreeViewLine(sprintf("<%s name='mod_roomReservationRoomWhitelistListBox".
+ "[action][add]' value='%s' /></form>", $GLOBALS["stdbtn"], _("Add")));
+ }
+ $this->showList($aoRooms);
+ // toolbar
+ printf("<tr><td class='tbbtm' colspan='%d'>", $GLOBALS["treeview_cols"]);
+ CheckCombo();
+ printf("<%s name='mod_roomReservationRoomWhitelistListBox[action]".
+ "[delete]' value='%s' />", $GLOBALS["stdbtn"], _("Delete"));
+ echo "</td></tr>\n";
+ }
+
+ /**
+ * Print the addition form
+ * @return void
+ */
+ protected function showAddForm() {
+ // only list rooms that are not already whitelisted
+ $aoRooms = array_diff(mod_roomReservationRoomsManager::getRooms(),
+ $this->oCfg->getWhitelistedRooms());
+ TreeViewSubtitle(_("Add"));
+ $this->showList($aoRooms);
+ TreeViewLine(sprintf("<p><%s name='mod_roomReservationRoomWhitelistList".
+ "Box[action][add]' value='%s' /> <%s name='mod_roomReservationRoom".
+ "WhitelistListBox[action][add]' value='%s' /></p>", $GLOBALS["stdbtn"],
+ _("OK"), $GLOBALS["stdbtn"], _("Cancel")));
+ }
+
+ /**
+ * Show the deletion form
+ * @return void
+ */
+ protected function showDeleteForm() {
+ // list rooms in selection
+ $aoRooms = array();
+ $h = db_query("SELECT name FROM rooms WHERE oid IN ".
+ qdb_arr($this->anPostSelection));
+ foreach($this->anPostSelection as $nOid) {
+ $aoRooms[] = mod_roomReservationRoomsManager::getRoomByOid($nOid);
+ }
+ TreeViewSubtitle(sprintf(_("Following %s will be deleted"),
+ _c("room-reservation:rooms")));
+ $this->showList($aoRooms, false);
+ TreeViewLine(sprintf("<p><%s name='mod_roomReservationRoomWhitelistList".
+ "Box[action][delete]' value='%s' /> <%s name='mod_roomReservationRoom".
+ "WhitelistListBox[action][delete]' value='%s' /></p>",
+ $GLOBALS["stdbtn"], _("OK"), $GLOBALS["stdbtn"], _("Cancel")));
+ }
+
+ /**
+ * Show the list items
+ * @param $aoRooms (array of mod_roomReservationRoom objects) List items
+ * @param $bCheckboxes (bool) Whether to show checkboxes
+ */
+ protected function showList($aoRooms, $bCheckboxes = true) {
+ if(count($aoRooms) > 0) {
+ foreach($aoRooms as $o) {
+ // fetch oid from SQL table
+ $nOid = pg_fetch_result(db_query("SELECT oid FROM ".
+ "rooms WHERE name = $1", $o->getName()), 0, "oid");
+ $sBox = $bCheckboxes ? sprintf("<%s id='box%d' name='mod_room".
+ "ReservationRoomWhitelistListBox[l][%d]' value='1'%s /><label ".
+ "for='box%d'>%s%s</label>", $GLOBALS["smlchk"], $nOid, $nOid,
+ @$this->anPostSelection[$nOid] ? " checked='checked'" : "", $nOid,
+ icon("host"), $o->getName()) :
+ sprintf("<input type='hidden' name='mod_roomReservationRoom".
+ "WhitelistListBox[l][%d]' value='1' />%s%s", $nOid, icon("host"),
+ $o->getName());
+ TreeViewLine($sBox);
+ }
+ } else {
+ TreeViewEmpty();
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationRoomsManager.inc
+ * Class for the management of rooms
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 28.12.2007
+ *
+ * TODO: move into M Class Library
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once("db.inc");
+require_once("mod_room-reservation/functions.inc");
+require_once("mod_room-reservation/mod_roomReservationRoom.inc");
+require_once("mod_room-reservation/mod_roomReservationConfig.inc");
+
+/** Simple class for creating, editing and deleting rooms */
+class mod_roomReservationRoomsManager {
+ /** (mod_roomReservationConfig) Reference to the configuration */
+ protected $oCfg;
+
+ /**
+ * Constructor
+ * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
+ * configuration object
+ * @return rmRoomsManager
+ */
+ public function __construct(mod_roomReservationConfig &$oCfg) {
+ $this->oCfg = $oCfg;
+ }
+
+ /**
+ * Insert or update a room in the database
+ * param $or (rsRoom) Room to store in the database
+ * return (int) The UID of the booking, or <tt>-1</tt> in case of a failure.
+ * Call getLastError() to get more information about the error.
+ */
+/** public function write(rsRoom $or) {
+ // Only administrators are allowed to create and alter rooms
+ if(!$this->oCfg->userIsAdmin()) {
+ // TODO throw exception
+ setLastError(RS_ERROR_ACCESS_DENIED);
+ return -1;
+ }
+
+ $strWhere = "";
+ $strLog = "";
+
+ // Update or insert?
+ if($or->getUid() == null) {
+ // No UID yet, insert new room
+ $strLog = sprintf("Raum „%s“ angelegt", $or->getName());
+ } else {
+ $strWhere = "rsr_uid = ".qp(intval($or->getUid()));
+ $strLog = sprintf("Raum „%s“ geändert", $or->getName());
+ }
+
+ $aPut["rsr_name"] = $or->getName();
+ db_store("rooms", $aPut, $strWhere == "" ? null : $strWhere);
+
+ $hQuery = db_query("SELECT currval('roomschedule_rooms_rsr_uid_seq') ".
+ "FROM roomschedule_rooms;");
+ $nNewUid = pg_fetch_result($hQuery, 0, "currval");
+
+ rrInsertLog($strLog);
+
+ // Return new UID
+ return $nNewUid;
+ }
+ */
+ /**
+ * Delete a room from the database
+ * param $nUid (int) Unique ID of the room
+ * return (bool) <tt>true</tt> on success, otherwise <tt>false</tt>.
+ * Call getLastError() to get more information about the error.
+ */
+/* public function delete($nUid) {
+ // Only administrators are allowed to delete rooms
+ if(!$this->oCfg->userIsAdmin()) {
+ // TODO throw exception
+ setLastError(RS_ERROR_ACCESS_DENIED);
+ return false;
+ }
+ // Delete it from the database
+ $strRoom = $this->getRoomName($nUid);
+ if(!db_query("DELETE FROM roomschedule_rooms WHERE rsr_uid = $1;",
+ intval($nUid))) {
+ // TODO throw exception
+ setLastError(RS_ERROR_SQL);
+ return false;
+ } else {
+ rsInsertLog(sprintf("Raum „%s“ gelöscht", $strRoom));
+ return true;
+ }
+ }
+*/
+
+ /**
+ * Get a room by its OID. Returns <tt>null</tt> if the room was not found.
+ * @param $nOid (integer) The OID of the room
+ * @return mod_roomReservationRoom
+ */
+ static function getRoomByOid($nOid) {
+ $o = null;
+ $h = db_query("SELECT * FROM rooms WHERE oid = $1;", $nOid);
+ if(pg_num_rows($h) > 0) {
+ $arResult = pg_fetch_array($h);
+ $o = new mod_roomReservationRoom($arResult["name"],
+ $arResult["room_no"], $arResult["floor"], $arResult["building"],
+ $arResult["location"]);
+ }
+ return $o;
+ }
+
+ /**
+ * Get a room by its name. Returns <tt>null</tt> if the room was not found.
+ * @param $sName (string) The name of the room
+ * @return mod_roomReservationRoom
+ */
+ static function getRoomByName($sName) {
+ $o = null;
+ $h = db_query("SELECT * FROM rooms WHERE name = $1;", $sName);
+ if(pg_num_rows($h) > 0) {
+ $arResult = pg_fetch_array($h);
+ $o = new mod_roomReservationRoom($arResult["name"],
+ $arResult["room_no"], $arResult["floor"], $arResult["building"],
+ $arResult["location"]);
+ }
+ return $o;
+ }
+
+ /**
+ * Get all rooms from the database
+ * @return array of mod_roomReservationRoom
+ */
+ static function getRooms() {
+ $aoReturn = array();
+ $hQuery = db_query("SELECT * FROM rooms ORDER BY name;");
+ while($arResult = pg_fetch_array($hQuery)) {
+ $aoReturn[] = new mod_roomReservationRoom($arResult["name"],
+ $arResult["room_no"], $arResult["floor"], $arResult["building"],
+ $arResult["location"]);
+ }
+ return $aoReturn;
+ }
+}
+?>
--- /dev/null
+<?php
+/**
+ * @file mod_roomReservationTimeslice.inc
+ * Representation of a timeslice
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
+ * @date 03.02.2008
+ *
+ * Copyright © 2007 Roland Hieber
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/** Implementation of a simple timeslice with beginning and ending time */
+class mod_roomReservationTimeslice {
+
+ /** (timestamp) Time when the timeslice begins */
+ protected $tsBegin = -1;
+ /** (timestamp) Time when the timeslice ends */
+ protected $tsEnd = 86400;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor
+ * @param $tsBegin (timestamp) Time when the timeslice begins. Only the
+ * time part is used, the date part is ignored.
+ * @param $tsEnd (timestamp) Time when the timeslice ends. Only the time
+ * part is used, the date part is ignored.
+ * @return mod_roomReservationTimeslice
+ */
+ public function __construct($tsBegin, $tsEnd) {
+ $this->setBegin($tsBegin);
+ $this->setEnd($tsEnd);
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the beginning. Only the time part is used, the date part is ignored.
+ * If the timestamp is invalid, an Exception is thrown.
+ * @param $ts (timestamp)
+ * @throws Exception
+ */
+ public function setBegin($ts) {
+ if(intval($ts) >= $this->getEnd()) {
+ throw new Exception(MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN);
+ } else {
+ $this->tsBegin = (intval($ts) % 86400);
+ }
+ }
+
+ /**
+ * Set the ending. Only the time part is used, the date part is ignored.
+ * If the timestamp is invalid, an Exception is thrown.
+ * @param $ts (timestamp)
+ * @throws Exception
+ */
+ public function setEnd($ts) {
+ if($this->getBegin() >= intval($ts)) {
+ throw new Exception(MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN);
+ } else {
+ $this->tsEnd = (intval($ts) % 86400);
+ }
+ }
+
+ /**
+ * Get the beginning.
+ * @return timestamp
+ */
+ public function getBegin() { return $this->tsBegin; }
+
+ /**
+ * Get the ending.
+ * @return timestamp
+ */
+ public function getEnd() { return $this->tsEnd; }
+
+ /** @} */
+}
+?>
--- /dev/null
+<?php
+/**\r
+ * @file mod_roomReservationTimesliceListBox.inc\r
+ * A list box that allows the user to add and delete timeslices\r
+ * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
+ * @date 23.06.2008\r
+ * \r
+ * Copyright © 2007 Roland Hieber\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ * \r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+
+require_once("ctrl.inc");
+require_once("mod_room-reservation/mod_roomReservationControl.inc");
+require_once("mod_room-reservation/mod_roomReservationTimeslice.inc");
+
+/*****************************************************************************/
+/**
+ * @page timeslicelistbox_actions Actions of a
+ * mod_roomReservationTimesliceListBox instance
+ * @{
+ * The following constants describe the actions that a
+ * mod_roomReservationTimesliceListBox instance can handle. They are used in
+ * processRequestVariables() to determine the action that should be done when
+ * the control is shown.
+ */
+/** Show the control (default action) */
+define("MOD_ROOM_RESERVATION_TLB_ACTION_SHOW", 0);
+/** Add a timeslice */
+define("MOD_ROOM_RESERVATION_TLB_ACTION_ADD", 1);
+/** Delete a timeslice */
+define("MOD_ROOM_RESERVATION_TLB_ACTION_DELETE", 2);
+/** @} */
+\r
+/** @todo document, add a delete confirmation */
+class mod_roomReservationTimesliceListBox extends mod_roomReservationControl {
+
+ /**
+ * (constant) The action to be done (GET data).
+ * See @ref timeslicelistbox_actions.
+ */
+ protected $cAction;
+ /** (string) The beginning for a new timeslice (GET data) */
+ protected $sNewBegin;
+ /** (string) The ending for a new timeslice (GET data) */
+ protected $sNewEnd;
+
+ /***************************************************************************/
+ /**
+ * @name Constructor
+ * @{
+ * Constructor
+ * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
+ * configuration
+ * @return mod_roomReservationTimesliceListBox
+ */
+ public function __construct(mod_roomReservationConfig &$oCfg) {
+ parent::__construct($oCfg);
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Initialization
+ * @{
+ */
+
+ /**
+ * Process the REQUEST variables and preset the some variables
+ * @return void
+ */
+ protected function processRequestVariables() {
+
+ if(isset($_GET["mod_roomReservationTimesliceListBox"])) {
+ // action
+ if(isset($_GET["mod_roomReservationTimesliceListBox"]["action"])) {
+ $ga = $_GET["mod_roomReservationTimesliceListBox"]["action"];
+ $this->setAction((($ga == "add") ? MOD_ROOM_RESERVATION_TLB_ACTION_ADD :
+ (($ga == "delete") ? MOD_ROOM_RESERVATION_TLB_ACTION_DELETE :
+ MOD_ROOM_RESERVATION_TLB_ACTION_SHOW)));
+ }
+
+ // new beginning and new ending
+ $this->setNewBegin(isset(
+ $_GET["mod_roomReservationTimesliceListBox"]["begin"]) ?
+ $_GET["mod_roomReservationTimesliceListBox"]["begin"] : "");
+ $this->setNewEnd(isset(
+ $_GET["mod_roomReservationTimesliceListBox"]["end"]) ?
+ $_GET["mod_roomReservationTimesliceListBox"]["end"] : "");
+ }
+
+ // perform the requested action
+ if($this->getAction() == MOD_ROOM_RESERVATION_TLB_ACTION_ADD) {
+ // add a timeslice to the configuration file
+
+ $bErrors = false;
+
+ // Note: we want to handle the timestamps in GMT format, hence the "+0000"
+ if(strtotime($this->getNewBegin()." +0000") === false) {
+ $this->asMessages[] = _c("room-reservation:The beginning time is ".
+ "invalid.");
+ $bErrors = true;
+ }
+ if(strtotime($this->getNewEnd()." +0000") === false) {
+ $this->asMessages[] = _c("room-reservation:The ending time is ".
+ "invalid.");
+ $bErrors = true;
+ }
+
+ if(!$bErrors) {
+ try {
+ $this->oCfg->addTimeslice(new mod_roomReservationTimeslice(
+ strtotime($this->getNewBegin()." +0000") % 86400,
+ strtotime($this->getNewEnd()." +0000") % 86400));
+ $this->oCfg->writeConfig();
+ $this->setNewBegin("");
+ $this->setNewEnd("");
+ } catch(Exception $e) {
+ $this->asMessages[] = $e->getMessage();
+ }
+ }
+
+ } elseif($this->getAction() == MOD_ROOM_RESERVATION_TLB_ACTION_DELETE) {
+ // delete a timeslice from the configuration file
+ if(isset($_POST["mod_roomReservationTimesliceListBox"])) {
+ if(isset($_POST["mod_roomReservationTimesliceListBox"]["l"])) {
+ $ao = $this->oCfg->getTimeslices();
+ foreach($_POST["mod_roomReservationTimesliceListBox"]["l"] as
+ $n => $b) {
+ if($b) {
+ $this->oCfg->deleteTimeslice(new mod_roomReservationTimeslice(
+ $ao[$n]->getBegin(), $ao[$n]->getEnd()));
+ }
+ }
+ $this->oCfg->writeConfig();
+ }
+ }
+ }
+ }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Access to attributes
+ * @{
+ */
+
+ /**
+ * Set the action to be done (GET data)
+ * @param $c (constant) Action. See @ref timeslicelistbox_actions.
+ */
+ protected function setAction($c) { $this->cAction = intval($c); }
+
+ /**
+ * Set the beginning for a new timeslice (GET data)
+ * @param $s (string)
+ */
+ protected function setNewBegin($s) { $this->sNewBegin = $s; }
+
+ /**
+ * Set the beginning for a new timeslice (GET data)
+ * @param $s (string)
+ */
+ protected function setNewEnd($s) { $this->sNewEnd = $s; }
+
+ /**
+ * Get the action to be done (GET data). See @ref timeslicelistbox_actions.
+ * @return constant
+ */
+ function getAction() { return $this->cAction; }
+
+ /**
+ * Get the beginning for a new timeslice (GET data)
+ * @return string
+ */
+ public function getNewBegin() { return $this->sNewBegin; }
+
+ /**
+ * Get the beginning for a new timeslice (GET data)
+ * @return string
+ */
+ public function getNewEnd() { return $this->sNewEnd; }
+
+ /***************************************************************************/
+ /**
+ * @}
+ * @name Output
+ * @{
+ */
+
+ /**
+ * Actually show the control
+ * @return void
+ */
+ public function doShow() {
+ TreeView(array(_c("room-reservation:Begin"), _c("room-reservation:End")));
+
+ // addition form
+ printf("<form method='get'>");
+ hidden("mod_roomReservationTimesliceListBox[action]", "add");
+ TreeViewTitle(_("Add"));
+
+ $sMessages = $this->getMessages();
+ if(trim($sMessages) != "") {
+ TreeViewLine($sMessages);
+ }
+
+ TreeViewLine(array(sprintf("<%s name='mod_roomReservationTimesliceListBox".
+ "[begin]' value='%s' size='8'/>", $GLOBALS["stdedt"],
+ $this->getNewBegin()), sprintf("<%s name='".
+ "mod_roomReservationTimesliceListBox[end]' value='%s' size='8'/> <%s ".
+ "name='mod_roomReservationTimesliceListBox[submit]' value='%s' />",
+ $GLOBALS["stdedt"], $this->getNewEnd(), $GLOBALS["stdbtn"], _("Add"))));
+ echo "</form>\n";
+
+ // deletion form
+ TreeViewTitle(_c("room-reservation:Periods"));
+ $aoTs = $this->oCfg->getTimeslices();
+ if(count($aoTs) > 0) {
+ echo "<form action='?mod_roomReservationTimesliceListBox[action]=delete' ".
+ "method='post'>";
+ $i = 0;
+ foreach($aoTs as $oTs) {
+ $sBox = sprintf("<input type='hidden' ".
+ "name='mod_roomReservationTimesliceListBox[l][%d]' value='0' />".
+ "<%s name='mod_roomReservationTimesliceListBox[l][%d]' value='1' />",
+ $i, $GLOBALS["smlchk"], $i);
+ // Note: we have only GMT timestamps in the timeslice objects
+ TreeViewLine(array($sBox . gmstrftime(_("%#I:%M %p"), $oTs->getBegin()),
+ gmstrftime(_("%#I:%M %p"), $oTs->getEnd())));
+ $i++;
+ }
+ // toolbar
+ printf("<tr><td class='tbbtm' colspan='%d'>", $GLOBALS["treeview_cols"]);
+ CheckCombo();
+ printf("<%s name='mod_roomReservationTimesliceListBox[submit]' ".
+ "value='%s' />", $GLOBALS["stdbtn"], _("Delete"));
+ echo "</td></tr>\n";
+ } else {
+ TreeViewEmpty();
+ }
+
+ echo "</form>\n";
+ _TreeView();
+ }
+ /** @} */
+}
+?>
\ No newline at end of file
+++ /dev/null
-<?php
-/**\r
- * @file exceptions.inc
- * Some custom exceptions\r
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
- * @date 27.05.2008\r
- * \r
- * Copyright © 2007 Roland Hieber\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
- * THE SOFTWARE.\r
- */\r
-
-/**
- * An exception while trying to do a SQL query.
- */
-class SQLException extends Exception {}
-
-/**
- * An exception while trying to access something
- */
-class AccessException extends Exception {}
-
-/**
- * An exception while trying to write or read something
- */
-class IOException extends Exception {}
-
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-/**
- * @file functions.inc
- * additional functions for iserv-mod-room-reservation
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 22.12.2007
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @todo move some functions into M Class Library
- */
-
-require_once("share.inc");
-require_once("db.inc");
-require_once("user.inc");
-require_once("sec/secure.inc");
-
-/**
- * @page errorcodes Error Codes
- * @{
- */
-/** Access denied. This can be due to missing access rights. */
-define("MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED",
- _c("room-reservation:Access denied."));
-/** Error while querying the database */
-define("MOD_ROOM_RESERVATION_ERROR_SQL",
- _c("room-reservation:Error while trying to query the database."));
-/** Error while trying to open a file */
-define("MOD_ROOM_RESERVATION_ERROR_OPEN_FILE",
- _c("room-reservation:Could not open file."));
-/** Error while trying to write a file */
-define("MOD_ROOM_RESERVATION_ERROR_WRITE_FILE",
- _c("room-reservation:Could not write to file."));
-/** Error while trying to lock a file */
-define("MOD_ROOM_RESERVATION_ERROR_LOCK_FILE",
- _c("room-reservation:Could not lock file."));
-/** Error while trying to unlock a file */
-define("MOD_ROOM_RESERVATION_ERROR_UNLOCK_FILE",
- _c("room-reservation:Could not unlock file."));
-/** The current booking overlaps with an existing booking */
-define("MOD_ROOM_RESERVATION_ERROR_BOOKING_OVERLAPS", _c("room-reservation:".
- "The current booking overlaps with an existing booking."));
-/** The booking ends before it begins */
-define("MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN", _c("room-reservation:".
- "The ending of your booking cannot lie before the beginning."));
-define("MOD_ROOM_RESERVATION_ERROR_NO_REASON", _c("room-reservation:Please ".
- "give a reason."));
-/** A new timeslice overlaps with an existing timeslice */
-define("MOD_ROOM_RESERVATION_ERROR_CONFIG_OVERLAPPING_TIMESLICE",
- _c("room-reservation:The period overlaps with an existing one."));
-/** There is no such timeslice */
-define("MOD_ROOM_RESERVATION_ERROR_CONFIG_NO_SUCH_TIMESLICE",
- _c("room-reservation:The specified period does not exist."));
-/** There is no such account */
-define("MOD_ROOM_RESERVATION_ERROR_NO_SUCH_ACCOUNT", _c("room-reservation:".
- "The specified account does not exist."));
-/** The room is not available for booking */
-define("MOD_ROOM_RESERVATION_ERROR_ROOM_NOT_WHITELISTED",
- _c("room-reservation:This room is not available for booking."));
-/**
- * @}
- */
-
-/**
- * Determine if the specified user exists. Throws an SQLException if an error
- * occured.
- * @param $strAct (string) Account name of the user
- * @throws SQLException
- * @return (bool)
- */
-function isAct($strAct) {
- $hQuery = db_query("SELECT * FROM users WHERE act = $1;", $strAct);
- if(!is_resource($hQuery)) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
- return null;
- }
- return (pg_num_rows($hQuery) > 0);
-}
-
-/**
- * Get the real user name for an account name
- * @param $strAct (string) Account name of the user to look up
- * @return (string) The real name of the user. If the function fails, it returns <tt>null</tt>.
- * Call getLastError() to get more information about the error.
- */
-function getRealUserName($strAct) {
- $hQuery = db_query("SELECT firstname, lastname FROM users WHERE act = $1;", $strAct);
- if(!is_resource($hQuery)) {
- // TODO throw exception
- setLastError(RS_ERROR_SQL);
- return null;
- }
- if(pg_num_rows($hQuery) == 0) {
- return $strAct; // User not found in database, return account name
- }
- $arResult = pg_fetch_array($hQuery);
- return user_join_name($arResult);
-}
-
-/**
- * Determine if a specified group exists
- * @param $strAct (string) Account name of the group
- * @return (bool / null) If the function fails, it returns <tt>null</tt>. Call getLastError() to
- * get more information about the error.
- */
-function isGroup($strAct) {
- $hQuery = db_query("SELECT * FROM groups WHERE act = $1;", $strAct);
- if(!is_resource($hQuery)) {
- // TODO throw exception
- setLastError(RS_ERROR_SQL);
- return null;
- }
- return (pg_num_rows($hQuery) > 0);
-}
-
-/**
- * Look up the name of a group
- * @param $strAct (string) Account name of the group
- * @return (string) The name of the group. If the function fails, it returns <tt>null</tt>.
- * Call getLastError() to get more information about the error.
- */
-function getGroupName($strAct) {
- $hQuery = db_query("SELECT * FROM groups WHERE act = $1;", $strAct);
- if(!is_resource($hQuery)) {
- // TODO throw exception
- setLastError(RS_ERROR_SQL);
- return null;
- }
- if(pg_num_rows($hQuery) == 0) {
- return $strAct; // Group not found in database, return account name
- }
- $arResult = pg_fetch_array($hQuery);
- return $arResult["name"];
-}
-
-/**
- * Create a link to write a mail to the specified account name.
- * This function returns a link if the specified account exists, otherwise it returns the
- * account name.
- * @param $strAct (string) Account name
- * @param $strColor (string) Background color for icon()
- * @param $strParams (string) additional URL parameters
- * @return string
- */
-function mailToUserLink($strAct, $strColor = "bl", $strParams = "") {
- if(!isAct($strAct)) {
- return $strAct;
- }
- return popup(relroot("msg/write/?to=".user_mail_addr($strAct).$strParams),
- 600, 400, nobr(icon("mail-reply-usr", array("size" => 16, "bg" =>
- $strColor)) . getRealUserName($strAct)));
-}
-
-/**
- * Determine if a specified string is a valid mail address
- * @param $strAddr string
- * @return string
- */
-function isMailAddress($strAddr) {
- return ((preg_match("/([a-zA-Z0-9_\-\.]*(@[a-zA-Z0-9\-\.]*)?(\s*,\s*)?)+/", $strAddr) > 0)
- and (preg_match("/(\s*,\s*)$/", $strAddr) == 0));
-}
-
-/**
- * Module-specific logging function.
- * Prefixes the log message with a module-specific string and writes it to the logs.
- * @param $strLog (string) Log message
- * @return void
- */
-function rrInsertLog($strLog) {
- log_insert($strLog, null, "Room Reservation Schedule");
-}
-
-/**
- * Get the SQL day number from a given timestamp.
- * @param $ts (timestamp)
- * @return (int) 0-6 for Sunday to Monday
- */
-function rrDateToSQLDayNumber($ts) {
- $aDays = array("Sun" => 0, "Mon" => 1, "Tue" => 2,
- "Wed" => 3, "Thu" => 4, "Fri" => 5, "Sat" => 6);
- return $aDays[date("D", $ts)];
-}
-
-/**
- * Convert a UNIX timestamp to an SQL date string
- * @param $ts (timestamp)
- * @return string
- */
-function dateToSql($ts) { return date("Y\-m\-d", intval($ts)); }
-
-/**
- * Calculate the timestamp of the monday in the current week
- * @param $ts (timestamp) Calculate the value relative to this date
- * @return timestamp
- */
-function rrGetMonday($ts = null) {
- if($ts === null) {
- $ts = time();
- }
- if(date("D", $ts) == "Mon") {
- // Today is monday
- return strtotime("00:00", $ts);
- } else {
- return strtotime("last monday", $ts);
- }
-}
-
-/** (array of strings) Additional CSS rules */
-$GLOBALS["rrLocalCss"] = array();
-
-/**
- * Add CSS rules to the page
- * @param $s (string)
- * @return void
- */
-function rrAddCss($s) {
- rrDebug("rrAddCss: add \"$s\"");
- $GLOBALS["rrLocalCss"][] = $s;
-}
-
-/**
- * Get CSS rules that have been added with rrAddCss()
- * @return string
- */
-function rrGetCss() {
- rrDebug("rrGetCss: Local CSS is ".var_export($GLOBALS["rrLocalCss"], true));
- return implode("\n", $GLOBALS["rrLocalCss"]);
-}
-
-function rrDebug($s, $bReturn = false) {
- if(isset($_GET["debug"])) {
- if(!$bReturn) {
- echo "<!-- $s -->\n";
- } else {
- return $s;
- }
- }
-}
-
-/**
- * sprintf with support for ordinal numbers.
- * This version of sprintf replaces all substrings of the type <tt>/\\d+#/</tt>
- * (i.e. a decimal number with a hash sign appended) in the input string with
- * the corresponding english ordinal number prefices (st, nd, rd, th).
- * @param $str (string) Input string
- * @param $args (mixed) Additional parameters to be passed to sprintf()
- * @return (string)
- */
-function _sprintf_ord($str, $args /*leave this parameters for doxygen*/) {
- $args = func_get_args();
- if(preg_match_all("/%[bcdufosxX]/", $args[0], $temp) != func_num_args()-1) {
- trigger_error("Too few arguments", E_USER_ERROR);
- return false;
- }
- $str = call_user_func_array("sprintf", $args);
- while(preg_match("/(.*)(\d+)#(.*)/", $str, $m))
- $str = $m[1]._(append_ord_suffix($m[2])).$m[3];
- return $str;
-}
-?>
+++ /dev/null
-<?php
-/**
- * @file globals.inc
- * Include all the stuff that we need
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 27.01.2008
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-require_once("mod_room-reservation/functions.inc");
-require_once("mod_room-reservation/exceptions.inc");
-require_once("mod_room-reservation/mod_roomReservationBookingsManager.inc");
-require_once("mod_room-reservation/mod_roomReservationRoomsManager.inc");
-require_once("mod_room-reservation/mod_roomReservationConfig.inc");
-
-/** A global instance of the mod_roomReservationConfig class */
-$g_rrCfg = new mod_roomReservationConfig();
-/** A global instance of the mod_roomReservationBookingsManager class */
-$g_rrBm = new mod_roomReservationBookingsManager($g_rrCfg);
-/** A global instance of the mod_roomReservationRoomsManager class */
-$g_rrRm = new mod_roomReservationRoomsManager($g_rrCfg);
-
-/**
- * @mainpage iserv-mod-room-reservation -- Simple reservation of rooms
- * The room reservation module allows the users of your IServ Portalserver
- * to reserve a room, e.g. for meetings, lessons etc.
- */
-?>
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationBooking.inc
- * Container class for the representation of a single booking
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 12.11.2007
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/** @todo document */
-/**
- * Container class for the representation of a single booking
- */
-class mod_roomReservationBooking {
-
- /** (int / null) Unique ID in database */
- protected $nUid;
- /** (string) Name of the room */
- protected $strRoom;
- /** (timestamp) Date when the booking takes place */
- protected $tsDate;
- /** (int) Number of the first timeslice */
- protected $nTsFirst;
- /** (int) Number of the last timeslice (may be nBegin) */
- protected $nTsLast;
- /** (string) Account name of the owner */
- protected $strAct;
- /** (string) Reason for the booking */
- protected $strReason;
- /** (bool) Recurrence interval in weeks */
- protected $nInterval;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- */
- /**
- * Constructor.
- * @param $strRoom (string) Name of the room
- * @param $tsDate (timestamp) Date when the booking takes place
- * @param $nTsFirst (int) Number of the first timeslice
- * @param $nTsLast (int) Number of the last timeslice (may be nBegin)
- * @param $strAct (string) Account name of the owner
- * @param $strReason (string) Reason for the booking
- * @param $nInterval (int) Recurrence interval, 0 for no recurrence
- * @return mod_roomReservationBooking
- */
- public function __construct($strRoom, $tsDate, $nTsFirst, $nTsLast, $strAct,
- $strReason, $nInterval = 0) {
- $this->setUid(null);
- $this->setRoom($strRoom);
- $this->setDate($tsDate);
- $this->setTsFirst($nTsFirst);
- $this->setTsLast($nTsLast);
- $this->setAct($strAct);
- $this->setReason($strReason);
- $this->setInterval($nInterval);
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the unique ID in database
- * @param $n (int) Unique ID in database
- * @return void
- */
- public function setUid($n) {
- if(is_null($n)) {
- $this->nUid = null;
- } else {
- $this->nUid = intval($n);
- }
- }
-
- /**
- * Set the name of the room
- * @param $str (string) Name of the room
- * @return void
- */
- public function setRoom($str) { $this->strRoom = $str; }
-
- /**
- * Set the date when the booking takes place
- * @param $ts (timestamp) Date, only the date part is taken care of
- * @return void
- */
- public function setDate($ts) {
- // Only take the date part
- $this->tsDate = intval(strtotime(date("Y\-m\-d", intval($ts)))); }
-
- /**
- * Set the first timeslice
- * @param $n (int) Number of the first timeslice
- * @return void
- */
- public function setTsFirst($n) { $this->nTsFirst = intval($n); }
-
- /**
- * Set the end timeslice
- * @param $n (int) Number of the last timeslice (may be the start timeslice)
- * @return void
- */
- public function setTsLast($n) { $this->nTsLast = intval($n); }
-
- /**
- * Set the account name of the owner
- * @param $str (string) Account name
- * @return void
- */
- public function setAct($str) { $this->strAct = $str; }
-
- /**
- * Set the reason for the booking
- * @param $str (string) Reason
- * @return void
- */
- public function setReason($str) { $this->strReason = $str; }
-
- /**
- * Set the flag whether the booking repeates every week
- * @param $n (int) interval in weeks, 0 for no recurrence
- * @return void
- */
- public function setInterval($n) { $this->nInterval = intval(abs($n)); }
-
- /**
- * Get the unique ID in database
- * @return int / null
- */
- public function getUid() { return intval($this->nUid); }
-
- /**
- * Get the name of the room
- * @return string
- */
- public function getRoom() { return $this->strRoom; }
-
- /**
- * Get the date when the booking takes place
- * @return timestamp
- */
- public function getDate() { return intval($this->tsDate); }
-
- /**
- * Get the the number of the first timeslice
- * @return int
- */
- public function getTsFirst() { return intval($this->nTsFirst); }
-
- /**
- * Get the number of the last timeslice (may be the start timeslice)
- * @return int
- */
- public function getTsLast() { return intval($this->nTsLast); }
-
- /**
- * Get the account name of the owner
- * @return string
- */
- public function getAct() { return $this->strAct; }
-
- /**
- * Get the reason for the booking
- * @return string
- */
- public function getReason() { return $this->strReason; }
-
- /**
- * Get the recurrence interval
- * @return int
- */
- public function getInterval() { return $this->nInterval; }
-
- /**@}*/
-}
-?>
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationBookingPage.inc
- * Page that shows the booking table
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 24.02.2008
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-require_once("share.inc");
-require_once("ctrl.inc");
-require_once("mod_room-reservation/mod_roomReservationPage.inc");
-require_once("mod_room-reservation/mod_roomReservationBookingTable.inc");
-require_once("mod_room-reservation/mod_roomReservationBookingsManager.inc");
-require_once("mod_room-reservation/mod_roomReservationConfig.inc");
-
-/**
- * Page that shows the booking table
- * @todo document, don't forget GET parameters
- */
-class mod_roomReservationBookingPage extends mod_roomReservationPage {
-
- /** (mod_roomReservationConfig) Reference to the configuration object */
- protected $oCfg;
- /**
- * (mod_roomReservationRoomsManager) Reference to the rooms manager object
- */
- protected $oRm;
- /**
- * (mod_roomReservationBookingsManager) Reference to the bookings manager
- * object
- */
- protected $oBm;
- /** (timestamp) Starting date of the booking table */
- protected $tsStart;
- /** (int) Name of the room to show in the booking table */
- protected $strRoom;
-
- /** (mod_roomReservationBookingTable) The booking table */
- protected $oBt;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor
- * @param $oCfg (mod_roomReservationConfig) Reference to the configuration
- * object
- * @param $oRm (mod_roomReservationRoomsManager) Reference to the rooms
- * manager object
- * @param $oBm (mod_roomReservationBookingsManager) Reference to the
- * bookings manager object
- * @return mod_roomReservationBookingPage
- */
- public function __construct(mod_roomReservationConfig &$oCfg,
- mod_roomReservationRoomsManager &$oRm,
- mod_roomReservationBookingsManager &$oBm) {
- $this->oCfg = $oCfg;
- $this->oRm = $oRm;
- $this->oBm = $oBm;
-
- // create the booking table here, so the CSS is already added
- /** @todo maybe move it into beforeAddCSS()... ? */
- $this->oBt = new mod_roomReservationBookingsTable($this->oCfg, $this->oRm,
- $this->oBm, "?bookingpage[action]=edit", "?bookingpage[action]=delete");
-
- parent::__construct($oCfg);
- $this->setTitle(_c("Room Reservation Schedule"));
- $this->setIcon("mod_room-reservation_index");
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Initialization
- * @{
- */
-
- /**
- * Process the REQUEST variables and preset the some variables
- * @return void
- */
- protected function processRequestVariables() {
- // take all settings from the booking table
- $this->setRoom($this->oBt->getRoom());
- $this->setStart($this->oBt->getDate());
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the starting date
- * @param $ts (timestamp)
- */
- public function setStart($ts) { $this->tsStart = intval($ts); }
-
- /**
- * Set the room to show in the booking table
- * @param $str (string) Name of the room
- */
- public function setRoom($str) { $this->strRoom = $str; }
-
- /**
- * Get the starting date
- * @return int
- */
- public function getStart() { return intval($this->tsStart); }
-
- /**
- * Get the name of the room to show in the booking table
- * @return string
- */
- public function getRoom() { return $this->strRoom; }
-
- /***************************************************************************/
- /**
- * @}
- * @name Output
- * @{
- */
-
- /**
- * Show the page.
- * @return void
- */
- public function doShow() {
- // Protect access
- if(!$this->oCfg->userCanView()) {
- echo sprintf("<p class='err'>%s</p>",
- MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
- _PageBlue();
- die();
- }
-
- Title(_c("room-reservation:Book rooms"));
-
- // Form for room selection
- /** @todo checkbox for recurring booking */
- echo sprintf("<form name='room' method='get' action='%s'>",
- $_SERVER["PHP_SELF"]);
- echo sprintf("<input type='hidden' name='mod_roomReservationBookingTable".
- "[date]' value='%d' />\n", $this->getStart());
-
- // Show rooms only if it is whitelisted
- try {
- $aor = $this->oCfg->getWhitelistedRooms();
- } catch(SQLException $e) {
- trigger_error($e->getMessage());
- }
- if(count($aor) > 0) {
- echo _c("room-reservation:Room:") . sprintf(" <select onchange=".
- "'document.forms[\"room\"].submit()' width='250' ".
- "name='mod_roomReservationBookingTable[room]'>\n", $this->getStart());
- foreach($aor as $or) {
- // note to myself: no qu() here, seems this is being done automagically
- echo sprintf("<option value='%s'%s>%s</option>\n", $or->getName(),
- ($or->getName() == $this->getRoom()) ? " selected='selected'" : "",
- $or->getName());
- }
- echo sprintf("</select> <%s value='%s' /></form><p />\n",
- $GLOBALS["stdbtn"], _("Change"));
- } else {
- printf("<p>%s</p>\n", _c("room-reservation:No rooms have been ".
- "configured yet."));
- return;
- }
-
- // Print line with next 5 or so weeks
- $strSep = " | ";
- $strLink = sprintf("<a href='%s?mod_roomReservationBookingTable[date]=%%d".
- "&mod_roomReservationBookingTable[room]=%%s'>%%s</a>",
- $_SERVER["PHP_SELF"]);
- echo "<p>".sprintf($strLink, time(), qu($this->getRoom()),
- _c("room-reservation:Current Week")) . $strSep;
- echo sprintf($strLink, strtotime("1 week ago", $this->getStart()),
- qu($this->getRoom()), _c("room-reservation:< Back")) . $strSep;
- echo sprintf("<b>%s</b>", _sprintf_ord(_c("room-reservation:%d# week"),
- date("W", $this->getStart()))) . $strSep;
- for($i = 1; $i <= 5; $i++) {
- $nNextWeek = strtotime("$i week", $this->getStart());
- echo sprintf($strLink, $nNextWeek, qu($this->getRoom()), _sprintf_ord(
- _c("room-reservation:%d# week"), date("W", $nNextWeek)));
- echo $strSep;
- }
- echo sprintf($strLink, strtotime("1 week", $this->getStart()),
- qu($this->getRoom()), _c("room-reservation:Next >"))."</p>\n";
-
- $this->oBt->show();
- }
-}
-?>
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationBookingTable.inc
- * A timetable-like representation of bookings
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 03.02.2008
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-require_once("mod_room-reservation/mod_roomReservationConfig.inc");
-require_once("mod_room-reservation/mod_roomReservationBookingsManager.inc");
-require_once("mod_room-reservation/mod_roomReservationRoomsManager.inc");
-
-/*****************************************************************************/
-/**
- * @page bookingtable_actions Actions of a mod_roomReservationBookingTable
- * instance
- * @{
- * The following constants describe the actions that a
- * mod_roomReservationBookingTable instance can handle. They are used in
- * processRequestVariables() to determine the action that should be done when
- * the table is shown.
- */
-/** Show the booking table (default action) */
-define("MOD_ROOM_RESERVATION_BT_ACTION_SHOW", 0);
-/** Show the form for a new booking */
-define("MOD_ROOM_RESERVATION_BT_ACTION_BOOK", 1);
-/** The booking form has been submitted, process the booking */
-define("MOD_ROOM_RESERVATION_BT_ACTION_SUBMIT", 2);
-/** Edit a booking */
-define("MOD_ROOM_RESERVATION_BT_ACTION_EDIT", 3);
-/** Show the deletion form */
-define("MOD_ROOM_RESERVATION_BT_ACTION_DELETE", 4);
-/** The deletion form has been submitted, delete the booking */
-define("MOD_ROOM_RESERVATION_BT_ACTION_SUBMITDELETE", 5);
-/** @} */
-
-/*****************************************************************************/
-/**
- * @page bookingtable_printbooking_flags Flags for
- * mod_roomReservationBookingTable::printBooking
- * @{
- * The following constants describe the flags for the second parameter of
- * mod_roomReservationBookingTable::printBooking().
- */
-/**
- * This booking is new. New bookings are printed with a different background
- * color.
- */
-define("MOD_ROOM_RESERVATION_BTPB_NEW", 2);
-/** This booking is requested for deletion. Show delete button. */
-define("MOD_ROOM_RESERVATION_BTPB_DELETE", 4);
-/** @} */
-
-/*****************************************************************************/
-/**
- * A timetable-like representation of bookings
- * @todo document
- */
-class mod_roomReservationBookingsTable /* extends mclWidget */ {
-
- /** (mod_roomReservationConfig) Reference to the configuration object */
- protected $oCfg;
- /**
- * (mod_roomReservationRoomsManager) Reference to the rooms manager object
- */
- protected $oRm;
- /**
- * (mod_roomReservationBookingsManager) Reference to the bookings manager
- * object
- */
- protected $oBm;
- /**
- * (constant) The action to be performed.
- * See @ref bookingtable_actions for a list of possible values.
- */
- protected $cAction;
- /**
- * (timestamp) The date of the requested booking or the date to show in the
- * booking table
- */
- protected $tsDate;
- /**
- * (string) The name of the room of the requested booking or the room to be
- * shown in the booking table
- */
- protected $strRoom;
- /** (int) The starting timeslice of the requested booking */
- protected $nTsFirst;
- /** (int) The ending timeslice of the requested booking */
- protected $nTsLast;
- /** (string) The reason of the requested booking */
- protected $strReason;
- /** (int) UID of the booking to be deleted / edited */
- protected $nDeleteUid;
- /** (string) Value of the button that the user clicked */
- protected $strSubmitButtonValue;
- /** (string) Account of the owner, POST data */
- protected $strPostAccount;
- /** (int) recurrence interval, POST data */
- protected $nPostInterval;
- /** (string) Array of error messages */
- protected $asErrors = array();
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor
- * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
- * configuration
- * @param $oRm (reference to mod_roomReservationRoomsManager) Reference to
- * the rooms manager object
- * @param $oBm (reference to mod_roomReservationBookingsManager) Reference
- * to the bookings manager object
- * @return mod_roomReservationBookingTable
- */
- public function __construct(mod_roomReservationConfig &$oCfg,
- mod_roomReservationRoomsManager &$oRm,
- mod_roomReservationBookingsManager &$oBm) {
- $this->oCfg = $oCfg;
- $this->oRm = $oRm;
- $this->oBm = $oBm;
-
- try {
- $this->processRequestVariables();
- } catch(Exception $e) {
- $this->asErrors[] = $e->getMessage();
- }
- $this->addCSS();
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Initialization
- * @{
- */
-
- /**
- * Process the REQUEST variables and preset the some variables. Throws an
- * exception if the room provided by the GET data is not allowed for booking
- * @return void
- * @throws Exception
- */
- protected function processRequestVariables() {
-
- // default values
- $aoRooms = $this->oCfg->getWhitelistedRooms();
- if(count($aoRooms) < 1) {
- $this->setRoom("");
- } else {
- $this->setRoom($aoRooms[0]->getName());
- }
- // if weekends are not shown, show the next week already on saturday
- if(!$this->oCfg->isShowWeekend() and (date("w") == 6 or date("w") == 0)) {
- $this->setDate(strtotime("monday"));
- } else {
- $this->setDate(time());
- }
- $this->setAction(MOD_ROOM_RESERVATION_BT_ACTION_SHOW);
- $this->nPostInterval = 0;
-
- // handle GET parameters
- if(isset($_GET["mod_roomReservationBookingTable"])) {
- $ga = isset($_GET["mod_roomReservationBookingTable"]["action"]) ?
- $_GET["mod_roomReservationBookingTable"]["action"] : "";
- $this->setAction(($ga == "book") ?
- MOD_ROOM_RESERVATION_BT_ACTION_BOOK : (($ga == "edit") ?
- MOD_ROOM_RESERVATION_BT_ACTION_EDIT : (($ga == "delete") ?
- MOD_ROOM_RESERVATION_BT_ACTION_DELETE : (($ga == "submit") ?
- MOD_ROOM_RESERVATION_BT_ACTION_SUBMIT : (($ga == "submitdelete") ?
- MOD_ROOM_RESERVATION_BT_ACTION_SUBMITDELETE :
- MOD_ROOM_RESERVATION_BT_ACTION_SHOW)))));
- $this->setDate(isset($_GET["mod_roomReservationBookingTable"]["date"]) ?
- intval($_GET["mod_roomReservationBookingTable"]["date"]) : time());
- if(isset($_GET["mod_roomReservationBookingTable"]["room"])) {
- $this->setRoom($_GET["mod_roomReservationBookingTable"]["room"]);
- }
- $this->setTsFirst(
- isset($_GET["mod_roomReservationBookingTable"]["tsfirst"]) ?
- intval($_GET["mod_roomReservationBookingTable"]["tsfirst"]) : 0);
- $this->setTsLast($this->getTsFirst());
-
- // if deletion form is requested, set the right date, room etc.
- if($this->getAction() == MOD_ROOM_RESERVATION_BT_ACTION_DELETE) {
- if(isset($_GET["mod_roomReservationBookingTable"]["uid"]) &&
- $_GET["mod_roomReservationBookingTable"]["uid"] >= 0) {
- $this->setUid(intval(
- $_GET["mod_roomReservationBookingTable"]["uid"]));
- } else {
- trigger_error("The UID is invalid.", E_USER_ERROR);
- }
- $ob = mod_roomReservationBookingsManager::getBookingByUid(
- $this->getUid());
- $this->setRoom($ob->getRoom());
- if($ob->getInterval() > 0) {
- // don't show the first date when the booking was created, but the
- // date of the page where the user clicked the delete button
- $this->setDate(
- isset($_GET["mod_roomReservationBookingTable"]["date"]) ?
- intval($_GET["mod_roomReservationBookingTable"]["date"]) : time());
- } else {
- $this->setDate($ob->getDate());
- }
- $this->setTsFirst($ob->getTsFirst());
- }
- }
-
- if(isset($_POST["mod_roomReservationBookingTable"])) {
- if(isset($_POST["mod_roomReservationBookingTable"]["submitbooking"])) {
- // submission of the booking form
- // let POST variables overwrite the variables
- $this->setDate(
- isset($_POST["mod_roomReservationBookingTable"]["date"]) ?
- intval($_POST["mod_roomReservationBookingTable"]["date"]) : time());
- $this->setRoom(
- isset($_POST["mod_roomReservationBookingTable"]["room"]) ?
- $_POST["mod_roomReservationBookingTable"]["room"] : "");
- $this->setTsFirst(
- isset($_POST["mod_roomReservationBookingTable"]["tsfirst"]) ?
- intval($_POST["mod_roomReservationBookingTable"]["tsfirst"]) : 0);
- $this->setTsLast(
- isset($_POST["mod_roomReservationBookingTable"]["tslast"]) ?
- intval($_POST["mod_roomReservationBookingTable"]["tslast"]) :
- $this->getTsFirst());
- $this->setReason(
- isset($_POST["mod_roomReservationBookingTable"]["reason"]) ?
- $_POST["mod_roomReservationBookingTable"]["reason"] : "");
- $this->nPostInterval =
- isset($_POST["mod_roomReservationBookingTable"]["interval"]) ?
- intval($_POST["mod_roomReservationBookingTable"]["interval"]) : 0;
- $this->strPostAccount =
- isset($_POST["mod_roomReservationBookingTable"]["account"]) ?
- $_POST["mod_roomReservationBookingTable"]["account"] : "";
- }
-
- if(isset($_POST["mod_roomReservationBookingTable"]["submitdelete"])) {
- // submission of the deletion form
- if(isset($_POST["mod_roomReservationBookingTable"]["uid"]) &&
- $_POST["mod_roomReservationBookingTable"]["uid"] >= 0) {
- $this->setUid(
- intval($_POST["mod_roomReservationBookingTable"]["uid"]));
- } else {
- trigger_error("The UID is invalid.", E_USER_ERROR);
- }
- // set the right date, room etc.
- $ob = mod_roomReservationBookingsManager::getBookingByUid(
- $this->getUid());
- $this->setRoom($ob->getRoom());
- $this->setDate($ob->getDate());
- $this->setTsFirst($ob->getTsFirst());
- $this->setSubmitButtonValue(isset(
- $_POST["mod_roomReservationBookingTable"]["submitdelete"]) ?
- $_POST["mod_roomReservationBookingTable"]["submitdelete"] : "");
- }
- }
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the action that should be done
- * @param $c (constant) See @ref bookingtable_actions for possible values
- */
- protected function setAction($c) { $this->cAction = intval($c); }
-
- /**
- * Set the starting timeslice of the requested booking
- * @param $n (int)
- */
- protected function setTsFirst($n) { $this->nTsFirst = intval($n); }
-
- /**
- * Set the ending timeslice of the requested booking
- * @param $n (int)
- */
- protected function setTsLast($n) { $this->nTsLast = intval($n); }
-
- /**
- * Set the date of the requested booking or the date to be shown in the
- * booking table
- * @param $ts (timestamp)
- */
- public function setDate($ts) { $this->tsDate = intval($ts); }
-
- /**
- * Set the room of the requested booking or the room to be shown in the
- * booking table. Throws an Exception if the room is not allowed for booking.
- * @param $str (string)
- * @throws Exception
- */
- protected function setRoom($str) {
- // only allow whitelisted rooms
- if($this->oCfg->isRoomWhitelisted($str)) {
- $this->strRoom = $str;
- } else {
- throw new Exception(_c("room-reservation:This room is not available ".
- "for booking."));
- }
- }
-
- /**
- * Set the reason of the requested booking
- * @param $str (string)
- */
- protected function setReason($str) { $this->strReason = $str; }
-
- /**
- * Set the UID of the booking to be deleted / edited
- * @param $n (int)
- */
- protected function setUid($n) { $this->nUid = intval($n); }
-
- /**
- * Set the value of the submit button that the user clicked
- * @param $str (string)
- */
- protected function setSubmitButtonValue($str) {
- $this->strSubmitButtonValue = $str;
- }
-
- /**
- * Get the name of the room of the requested booking or the room to show in
- * the booking table
- * @return string
- */
- public function getRoom() { return $this->strRoom; }
-
- /**
- * Get the action that should be done
- * @return constant See @ref bookingtable_actions for possible values
- */
- public function getAction() { return $this->cAction; }
-
- /**
- * Get the the starting timeslice of the requested booking
- * @return int
- */
- public function getTsFirst() { return $this->nTsFirst; }
-
- /**
- * Get the the ending timeslice of the requested booking
- * @return int
- */
- public function getTsLast() { return $this->nTsLast; }
-
- /**
- * Get the the date of the requested booking or the date to be shown in the
- * booking table
- * @return timestamp
- */
- public function getDate() { return $this->tsDate; }
-
- /**
- * Get the the reason of the requested booking
- * @return string
- */
- public function getReason() { return $this->strReason; }
-
- /**
- * Get the UID of the booking to be deleted / edited
- * @return int
- */
- public function getUid() { return $this->nUid; }
-
- /**
- * Get the value of the submit button that the user clicked
- * @return string
- */
- public function getSubmitButtonValue() {
- return $this->strSubmitButtonValue;
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Output
- * @{
- */
-
- /**
- * Add the CSS rules needed for this page
- * @return void
- */
- protected function addCSS() {
- $strCss = <<<CSS
-#mod_roomReservationBookingTable .msg { font-weight:800; }
-#mod_roomReservationBookingTable td {
- vertical-align: middle;
- height: 5em;
- border: 1px solid white;
- padding:0.4em;
-}
-#mod_roomReservationBookingTable td.booking { background-color:#5276AB; }
-#mod_roomReservationBookingTable td.new { background-color:#008015; }
-#mod_roomReservationBookingTable td.recurring { background-color:#1C4174; }
-#mod_roomReservationBookingTable td.recurringnew { background-color:#006010; }
-#mod_roomReservationBookingTable td.heading { font-weight:bold; height:3em; }
-#mod_roomReservationBookingTable td.lesson { width:9%; }
-#mod_roomReservationBookingTable td.today { font-style:italic; }
-#mod_roomReservationBookingTable {
- border:1px solid white;
- border-collapse:collapse;
- text-align:center; width:100%;
-}
-CSS;
- if($this->oCfg->isShowWeekend()) {
- $strCss .= "#mod_roomReservationBookingTable td.cell { width:13%; }";
- } else {
- $strCss .= "#mod_roomReservationBookingTable td.cell { width:18.2%; }";
- }
- rrAddCss($strCss);
- }
-
- /**
- * Show the timetable
- * @return void
- * @throws AccessException
- * @todo increase the height of the cells a little
- */
- public function show() {
- // Protect access
- if(!$this->oCfg->userCanView()) {
- throw new AccessException(MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
- return;
- }
-
- // print error messages and return if there are any
- if(count($this->asErrors) > 0) {
- printf("<p class='err'>%s</p>", join("<br />\n", $this->asErrors));
- return;
- }
-
- // Print the header with the days
- $ncTs = sizeof($this->oCfg->getTimeslices());
- $nDays = ($this->oCfg->isShowWeekend()) ? 7 : 5;
-
- echo "<table id='mod_roomReservationBookingTable'><tr>";
-
- // Print header with day names
- echo "<td class='heading' />";
- for($ts = rrGetMonday($this->getDate()), $i=0; $i < $nDays;
- $ts = strtotime("1 day", $ts), $i++) {
- // Use a different color for the current day
- $strClass = "heading";
- $strTitle = strftime("%A<br />%x", $ts);
- if(date("Ymd") === date("Ymd", $ts)) {
- $strClass .= " today";
- $strTitle .= " "._c("room-reservation:(today)");
- }
- echo sprintf("<td class='%s'>%s</td>", $strClass, $strTitle);
- }
- echo "</tr>\n";
-
- // Print timetable
- // To take care of bookings with more than one timeslice, we use an array
- // that tells us which cell in the current column is the next to fill
- $anNextRow = array_fill(0, $nDays, 0);
- // Iterate over the timeslices
- for($nTs = 0; $nTs < $ncTs; $nTs++) {
- $strLessons = $this->oCfg->isShowLessons() ?_sprintf_ord(
- _c("room-reservation:%s# lesson"), $nTs + 1) . "<br />" : "";
- $oTs = $this->oCfg->getTimeslice($nTs);
- $strTs = sprintf("%s - %s", gmstrftime(_("%#I:%M %p"), $oTs->getBegin()),
- gmstrftime(_("%#I:%M %p"), $oTs->getEnd()));
- // First column: Lesson
- echo sprintf("<tr><td class='lesson'>%s</td>", $strLessons . $strTs);
-
- // Iterate over the days
- for($ts = rrGetMonday($this->getDate()), $i = 0; $i <= $nDays;
- $ts = strtotime("1 day", $ts), $i++) {
- // Don't print if there is a spanning booking on the current cell
- if(isset($anNextRow[$i]) && $anNextRow[$i] == $nTs) {
- if(($ob = $this->oBm->getBookingByTimeslice($this->getRoom(), $ts,
- $nTs)) !== null) {
- // a booking exists here
- // print booking or deletion form or handle the deletion form
-
- // deletion form is requested:
- if(($this->getAction() == MOD_ROOM_RESERVATION_BT_ACTION_DELETE) &&
- (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
- ($this->getTsFirst() == $nTs) &&
- ($this->getRoom() == $this->getRoom())) {
- $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob,
- MOD_ROOM_RESERVATION_BTPB_DELETE);
-
- // deletion form is submitted:
- } else if(($this->getAction() ==
- MOD_ROOM_RESERVATION_BT_ACTION_SUBMITDELETE) &&
- (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
- ($this->getTsFirst() == $nTs) &&
- ($this->getRoom() == $this->getRoom())) {
- if($this->getSubmitButtonValue() == _("Delete")) {
- // the user clicked the "delete" button
- $bSuccess = false;
- try {
- $bSuccess = $this->oBm->delete($this->getUid());
- } catch(Exception $e) {
- $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob, 0,
- array($e->getMessage()));
- }
- // print booking link and a success message
- if($bSuccess) {
- $anNextRow[$i] += $this->printBookingLink($nTs, $ts,
- array(_c("room-reservation:The booking was deleted.")));
- }
- } else {
- // the user cancelled the request
- $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob);
- }
-
- // Something else -- print booking
- } else {
- $anNextRow[$i] += $this->printBooking($nTs, $ts, $ob);
- }
- } else {
- // no booking is here
- // print booking link, booking form or handle booking form
- $asErrors = array();
-
- // booking form is requested:
- if(($this->getAction() == MOD_ROOM_RESERVATION_BT_ACTION_BOOK) &&
- (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
- ($this->getTsFirst() == $nTs) &&
- ($this->getRoom() == $this->getRoom())) {
- $anNextRow[$i] += $this->printBookingForm($nTs, $ts, $asErrors);
-
- // booking form is submitted:
- } else if(($this->getAction() ==
- MOD_ROOM_RESERVATION_BT_ACTION_SUBMIT) &&
- // only handle the request if the form was in the current cell
- (date("Ymd", $this->getDate()) == date("Ymd", $ts)) &&
- ($this->getTsFirst() == $nTs) &&
- ($this->getRoom() == $this->getRoom())) {
-
- // try writing the booking to the database
- $nNewUid = -1;
- $oNewBooking = new mod_roomReservationBooking($this->getRoom(),
- $this->getDate(), $this->getTsFirst(), $this->getTsLast(),
- (trim($this->strPostAccount) == "") ? $_SESSION["act"] :
- $this->strPostAccount, $this->getReason(),
- $this->nPostInterval);
- try {
- $nNewUid = $this->oBm->write($oNewBooking);
- } catch(Exception $s) {
- // print the booking form again with the user's input
- // @todo check for overlapping bookings and print them
- $asErrors[] = $s->getMessage();
- $anNextRow[$i] += $this->printBookingForm($nTs, $ts,
- $asErrors);
- }
- if($nNewUid > 0) {
- // print new booking and increment the "next row" variable by
- // the current span
- $oNewBooking->setUid($nNewUid);
- $anNextRow[$i] += $this->printBooking($nTs, $ts, $oNewBooking,
- MOD_ROOM_RESERVATION_BTPB_NEW);
- }
-
- // Something else -- print booking link:
- } else {
- $anNextRow[$i] += $this->printBookingLink($nTs, $ts);
- }
- }
- }
- }
- echo "</tr>\n";
- }
- echo "</table><br />";
- }
-
- /**
- * Print a single booking in the booking table.
- * @param $nTs (int) current timeslice
- * @param $ts (timestamp) current date
- * @param $ob (mod_roomReservationBooking) the booking
- * @param $cFlags (constant) Flags,
- * See @ref bookingtable_printbooking_flags for more information.
- * @param $asMsgs (array of strings) Additional messages to be printed
- * inside the cell, one array element per message
- * @return (int) the span of the booking
- */
- protected function printBooking($nTs, $ts, mod_roomReservationBooking $ob,
- $cFlags = 0, $asMsgs = array()) {
- $strAfter = "";
- $strBefore = "";
-
- // messages
- if(count($asMsgs) > 0) {
- $strBefore .= "<p class='msg'>".nl2br(q(join("\n", $asMsgs)))."</p>\n";
- }
-
- // calculate the timespan of the current booking
- $nSpan = $ob->getTsLast() - $ob->getTsFirst() + 1;
-
- if(($cFlags & MOD_ROOM_RESERVATION_BTPB_DELETE) ==
- MOD_ROOM_RESERVATION_BTPB_DELETE) {
-
- // Restrict access
- if(!($this->oBm->userIsOwner($ob->getUid()) or
- $this->oCfg->userIsAdmin())) {
- $strBefore .= "<p class='msg'>" .
- MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED . "</p>\n";
- #return $nSpan;
- } else {
- // print delete form
- $strWarning = sprintf("<div>%s%s</div>", icon("dlg-warn",
- array("bg" =>"gb")), _c("room-reservation:<b>Attention:</b> This ".
- "booking is a recurring booking. If you delete it, the period will ".
- "be deallocated for <b>every week</b>, not just this single week!"));
- $strAfter .= sprintf("<p name='form' id='form' style='".
- "text-align:center'><form action='%s?".
- "mod_roomReservationBookingTable[action]=submitdelete#form' ".
- "method='post'>%s%s<br /><%s name='mod_roomReservationBookingTable".
- "[submitdelete]' value='%s' /> <%s name='".
- "mod_roomReservationBookingTable[submitdelete]' value='%s' />".
- "<input type='hidden' name='mod_roomReservationBookingTable[uid]' ".
- "value='%d' /></form></p>", $_SERVER["PHP_SELF"],
- _c("room-reservation:Delete this booking?"),
- ($ob->getInterval() > 0 ? $strWarning : ""), $GLOBALS["smlbtn"],
- _("Delete"), $GLOBALS["smlbtn"], _("Cancel"), $ob->getUid(),
- $this->getRoom(), $this->getDate());
- }
- } else {
- // delete and edit links, show only if user is allowed to
- if($this->oBm->userIsOwner($ob->getUid()) ||
- $this->oCfg->userIsAdmin()) {
- /** @todo edit form */
- $strAfter .= sprintf("<br />(<!-- <a href='%s?".
- "mod_roomReservationBookingTable[action]=edit&".
- "mod_roomReservationBookingTable[uid]=%d&".
- "mod_roomReservationBookingTable[date]=%d#form' title='%s'>%s</a>, -->".
- "<a href='%s?mod_roomReservationBookingTable[action]=delete&".
- "mod_roomReservationBookingTable[uid]=%d&".
- "mod_roomReservationBookingTable[date]=%d#form' title='%s'>%s</a>)",
- $_SERVER["PHP_SELF"], $ob->getUid(), $ts,
- _c("room-reservation:Edit this booking"),
- _c("room-reservation:edit"), $_SERVER["PHP_SELF"], $ob->getUid(),
- $ts, _c("room-reservation:Delete this booking"),
- _c("room-reservation:delete"));
- }
- }
-
- // test if booking is new and should be highlighted
- $strClass = "cell booking".($ob->getInterval() > 0 ? " recurring" : "");
- if(($cFlags & MOD_ROOM_RESERVATION_BTPB_NEW) ==
- MOD_ROOM_RESERVATION_BTPB_NEW) {
- $strClass .= " new";
- }
- // Use a different style for the current day
- $strClass .= (date("Ymd", $ob->getDate()) == date("Ymd") ? " today" : "");
- /** @todo: add ?subject=... to mailto link */
- echo sprintf("<td rowspan='%d' class='%s'>%s<a %s>%s</a><br />%s%s</td>\n",
- $nSpan, $strClass, $strBefore, mailto($ob->getAct()),
- q(getRealUserName($ob->getAct())), q($ob->getReason()), $strAfter);
-
- return $nSpan;
- }
-
- /**
- * Print the booking form.
- * @param $nTs (int) current timeslice
- * @param $ts (timestamp) current date
- * @param $asErrors (array of strings) Additional error message to be printed
- * inside the cell, one array element per message
- * @return (int) the span of the booking (i.e., 1)
- */
- protected function printBookingForm($nTs, $ts, $asErrors = array()) {
- // Restrict access
- if(!($this->oCfg->userCanBook() or $this->oCfg->userIsAdmin())) {
- printf("<td class='err'>%s</td>\n",
- MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
- return 1;
- }
-
- $strErrors = "<p class='err'>".nl2br(q(join("\n", $asErrors)))."</p>";
-
- // form to allow fixed bookings for admins
- $sWeeklyForm = "";
- if($this->oCfg->userIsAdmin()) {
- $sWeeklyForm = sprintf("<label for='interval'>%s</label> %s<br />".
- "<label for='account'>%s</label> <%s name='".
- "mod_roomReservationBookingTable[account]' id='account' value='%s' ".
- "size='15' /><br />", _c("room-reservation:Repetition:"),
- select("mod_roomReservationBookingTable[interval]",
- $this->nPostInterval, array(0 => _c("Select:None"), 1 =>
- _c("room-reservation:every week")), array("add" => "id='interval'")),
- _c("room-reservation:Account, if not yourself:"), $GLOBALS["stdedt"],
- $this->strPostAccount);
- }
-
- echo sprintf("<td name='form' id='form' style='text-align:left'>%s".
- "<form action='%s?mod_roomReservationBookingTable[action]=".
- "submit#form' method='post'><label for='tslast'>%s</label> %s".
- "<br /><label for='reason'>%s</label> <%s id='reason' size='15' ".
- "value='%s' name='mod_roomReservationBookingTable[reason]' /><br />%s".
- "<%s name='mod_roomReservationBookingTable[submitbooking]' value='%s' />".
- "<input type='hidden' name='mod_roomReservationBookingTable[date]' ".
- "value='%s' /><input type='hidden' name='".
- "mod_roomReservationBookingTable[room]' value='%s' /><input ".
- "type='hidden' name='mod_roomReservationBookingTable[tsfirst]' ".
- "value='%s' /></form></td>\n", (count($asErrors) > 0) ? $strErrors : "",
- $_SERVER["PHP_SELF"], _c("room-reservation:until:"),
- select("mod_roomReservationBookingTable[tslast]", $this->getTsLast(),
- $this->oCfg->getTimesliceEndings(true)), _c("room-reservation:Reason:"),
- $GLOBALS["stdedt"], $this->getReason(), $sWeeklyForm, $GLOBALS["smlbtn"],
- _c("room-reservation:Book"), $this->getDate(), $this->getRoom(),
- $this->getTsFirst());
- return 1;
- }
-
- /**
- * Print the booking link
- * @param $nTs (int) current timeslice
- * @param $ts (timestamp) current date
- * @param $asMsgs (array of strings) Additional messages to be printed
- * inside the cell, one array element per message
- * @return (int) the span of the booking (i.e., 1)
- */
- protected function printBookingLink($nTs, $ts, $asMsgs = array()) {
-
- // Restrict access
- if(!($this->oCfg->userCanBook() or $this->oCfg->userIsAdmin())) {
- echo "<td />\n";
- return 1;
- }
-
- // messages
- $strBefore = "";
- if(count($asMsgs) > 0) {
- $strBefore .= "<p class='msg'>".join("<br />", $asMsgs)."</p>\n";
- }
-
- // print link to booking if the timeslice is later than now
- $oTs = $this->oCfg->getTimeslice($nTs);
- // note: only the timeslices are in GMT!
- $tsCur = strtotime(date("Y-m-d ", $ts) . gmdate(" G:i",
- $oTs->getEnd()));
- if($tsCur > time()) {
- $strURL = $_SERVER["PHP_SELF"] .
- sprintf("?mod_roomReservationBookingTable[action]=book&".
- "mod_roomReservationBookingTable[date]=%d&".
- "mod_roomReservationBookingTable[room]=%s&".
- "mod_roomReservationBookingTable[tsfirst]=%d#form", $ts,
- qu($this->getRoom()), $nTs);
- echo sprintf("<td class='cell'>%s<a href='%s' title='%s'>%s</a></td>\n",
- $strBefore, $strURL, _c("room-reservation:Book this room from here"),
- _c("room-reservation:(Book from here)"));
- } else {
- // only print the messages
- echo sprintf("<td name='form' id='form' class='cell'>%s</td>\n",
- $strBefore);
- }
- return 1;
- }
- /** @} */
-}
-?>
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationBookingsManager.inc
- * Class to manage a set of bookings
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 23.11.2007
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-require_once("sec/secure.inc");
-require_once("functions.inc");
-require_once("mod_room-reservation/mod_roomReservationConfig.inc");
-require_once("mod_room-reservation/mod_roomReservationBooking.inc");
-require_once("format.inc");
-
-db_query("SET DATESTYLE = ISO;");
-
-/**
- * Management of a set of bookings
- * @todo finish, document
- */
-class mod_roomReservationBookingsManager {
-
- /** (mod_roomReservationConfig) Reference to the configuration object */
- protected $oCfg;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor.
- * @param $oCfg (mod_roomReservationConfig) Reference to the configuration
- * @return mod_roomReservationBookingsManager
- */
- function __construct(mod_roomReservationConfig &$oCfg) {
- $this->oCfg = $oCfg;
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Retrieving bookings
- * @{
- */
-
- /**
- * Fetch a booking with the given unique ID from the SQL table
- * @param $nUid (int) Unique ID of the booking
- * @return mod_roomReservationBooking
- */
- public static function getBookingByUid($nUid) {
- $h = db_query("SELECT * FROM mod_roomreservation_bookings WHERE rrb_uid = $1;", $nUid);
- $a = pg_fetch_array($h);
- $o = new mod_roomReservationBooking($a["rrb_room"], strtotime($a["rrb_date"]),
- intval($a["rrb_tsfirst"]), intval($a["rrb_tslast"]), $a["rrb_act"],
- $a["rrb_reason"], intval($a["rrb_interval"]));
- $o->setUid(intval($a["rrb_uid"]));
- return $o;
- }
-
- /**
- * Test if there is a booking which takes place on the specified position at
- * the specified date.
- * @param $strRoom (string) Name of the room
- * @param $tsDate (timestamp) The date
- * @param $nTimeslice (int) The number of the timeslice
- * @return mod_roomReservationBooking The booking which takes place on the
- * specified time or <tt>null</tt> if no booking could be found.
- */
- public static function getBookingByTimeslice($strRoom, $tsDate,
- $nTimeslice) {
- $a = mod_roomReservationBookingsManager::getOverlappingBookings(
- new mod_roomReservationBooking($strRoom, $tsDate, $nTimeslice,
- $nTimeslice, null, null));
- return isset($a[0]) ? $a[0] : null;
- }
-
- /**
- * Get all bookings in database which overlap with the given booking.
- * @param $ob (mod_roomReservationBooking) New booking that should be tested
- * if it overlaps
- * @return array with elements of type mod_roomReservationBooking
- */
- public static function getOverlappingBookings(
- mod_roomReservationBooking $ob) {
- // TODO: Test for bookings that only take place every n.th week (modulo n)
-
- // Two bookings overlap, when they are on the same day and if
- // old beginning < new ending AND old ending > new beginning
- $hQuery = db_query("SELECT * FROM mod_roomreservation_bookings WHERE ".
- "rrb_room = $1 AND ((rrb_interval > 0 AND EXTRACT(DOW FROM rrb_date) ".
- "= $2) OR (rrb_interval = 0 AND rrb_date = $3)) AND rrb_tsfirst <= ".
- "$4 AND rrb_tslast >= $5 ORDER BY rrb_tsfirst;", $ob->getRoom(),
- date("w", $ob->getDate()), date("Y-m-d", $ob->getDate()),
- intval($ob->getTsLast()), intval($ob->getTsFirst()));
- $aoReturn = array();
- while($aResult = pg_fetch_array($hQuery)) {
- $aoReturn[] = mod_roomReservationBookingsManager::getBookingByUid(
- $aResult["rrb_uid"]);
- }
- return $aoReturn;
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Management of bookings
- * @{
- */
-
- /**
- * Insert or update a booking in the database.
- * The function throws an AccessException if the user was not allowed to
- * write the booking, or an SQLException if there was an error while trying
- * to insert or update the booking into the database.
- * @param $ob (mod_roomReservationBooking) Booking to write to the database
- * @return (int) The UID of the written booking
- * @throws SQLException, AccessException
- * @todo document
- */
- function write(mod_roomReservationBooking $ob) {
- // protect access
- if(($ob->getUid() != null and !$this->oCfg->userIsAdmin() and
- !$this->userIsOwner($ob->nUid)) or
- ($ob->getUid() == null and !$this->oCfg->userCanBook())) {
- throw new AccessException(MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
- }
-
- // test if room is whitelisted
- if(!$this->oCfg->isRoomWhitelisted($ob->getRoom())) {
- throw new Exception(MOD_ROOM_RESERVATION_ERROR_ROOM_NOT_WHITELISTED);
- }
-
- $strWhere = null;
- $strLog = "";
-
- // check if everything is right and throw exceptions
- if(trim($ob->getAct()) == "") {
- $ob->setAct($SESSION["act"]);
- } elseif(!isAct($ob->getAct())) {
- throw new Exception(MOD_ROOM_RESERVATION_ERROR_NO_SUCH_ACCOUNT);
- return false;
- }
- if($ob->getTsFirst() > $ob->getTsLast()) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN);
- return false;
- }
- if(trim($ob->getReason()) == "") {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_NO_REASON);
- return false;
- }
-
- // Test for overlapping bookings
- if($this->getOverlappingBookings($ob) != array()) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_BOOKING_OVERLAPS);
- return false;
- }
-
- // Show real times in log, but don't use the user's locale!
- $oTsB = $this->oCfg->getTimesliceBeginnings(false);
- $oTsE = $this->oCfg->getTimesliceEndings(false);
-
- // Update or insert?
- if($ob->getUid() == null) {
- // No UID yet, insert new booking
- // @todo write interval and user if interval > 0
- $strLog = sprintf("Raum „%s“ am %s von %s bis %s gebucht ".
- "(Begründung: %s)", $ob->getRoom(), date("d\.m\.Y", $ob->getDate()),
- gmdate("G:i", $oTsB[$ob->getTsFirst()]), gmdate("G:i",
- $oTsE[$ob->getTsLast()]), $ob->getReason());
- } else {
- // Update an existing booking
- // @todo write old and new times into log
- $strWhere = "rs_uid = ".qdb(intval($ob->getUid()));
- $strLog = sprintf("Buchung im Raum „%s“ auf %s von %s bis %s ".
- "geändert (Begründung: „%s“)", $ob->getRoom(), date("d\.m\.Y",
- $ob->getDate()), gmdate("G:i", $oTsB[$ob->getTsFirst()]), gmdate("G:i",
- $oTsE[$ob->getTsLast()]), $ob->getReason());
- }
- $aPut["rrb_room"] = $ob->getRoom();
- $aPut["rrb_date"] = date("Y\-m\-d", $ob->getDate());
- $aPut["rrb_tsfirst"] = intval($ob->getTsFirst());
- $aPut["rrb_tslast"] = intval($ob->getTsLast());
- $aPut["rrb_act"] = $ob->getAct();
- $aPut["rrb_reason"] = $ob->getReason();
- $aPut["rrb_interval"] = intval($ob->getInterval());
-
- // @todo test if the foreign keys are being violated and throw an error
- // message if neccessary
- db_store("mod_roomreservation_bookings", $aPut, $strWhere);
-
- $hQuery = db_query("SELECT currval('mod_roomreservation_bookings_rrb_uid_seq');");
- $nNewUid = pg_fetch_result($hQuery, 0, "currval");
-
- rrInsertLog($strLog);
-
- // Return new UID
- return $nNewUid;
- }
-
- /**
- * Delete a booking from the database
- * @param $nUid (int) Unique ID of the booking
- * @return (bool) <tt>true</tt> on success, otherwise <tt>false</tt>.
- * @todo test
- */
- public function delete($nUid) {
- // Only administrators and owners are allowed to delete bookings
- if(!($this->oCfg->userIsAdmin() or $this->userIsOwner($nUid))) {
- throw new AccessException(MOD_ROOM_RESERVATION_ERROR_ACCESS_DENIED);
- return false;
- }
-
- // Don't use the user's locale!
- $oTsB = $this->oCfg->getTimesliceBeginnings(false);
- $oTsE = $this->oCfg->getTimesliceEndings(false);
- $ob = $this->getBookingByUid($nUid);
- $strLog = sprintf("Buchung in Raum „%s“ am %s von %s bis %s ".
- "gelöscht (Begründung war: %s)", $ob->getRoom(), date("d\.m\.Y",
- $ob->getDate()), gmdate("G:i", $oTsB[$ob->getTsFirst()]), gmdate("G:i",
- $oTsE[$ob->getTsLast()]), $ob->getReason());
- // Delete it from the database
- if(!db_query("DELETE FROM mod_roomreservation_bookings WHERE ".
- "rrb_uid = $1;", $nUid)) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
- return false;
- } else {
- rrInsertLog($strLog);
- return true;
- }
- }
-
- /**
- * Determine if the current user is the owner of a specified error report.
- * If this function fails, call getLastError() to get more information.
- * @param $nID (int) Unique ID of the error report
- * @throws SQLException
- * @return bool
- */
- public static function userIsOwner($nID) {
- if(!isset($_SESSION["act"])) {
- return false; // user is not logged in
- } else {
- $hQuery = db_query("SELECT rrb_act FROM mod_roomreservation_bookings WHERE ".
- "rrb_uid = $1;", intval($nID));
- if(!is_resource($hQuery)) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
- return false;
- }
- $arResult = pg_fetch_array($hQuery);
- return ($arResult["rrb_act"] == $_SESSION["act"]);
- }
- }
-}
-?>
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationConfig.inc
- * Handling of the configuration file
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 10.01.2008
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-require_once("sec/secure.inc");
-require_once("db.inc");
-require_once("mod_room-reservation/functions.inc");
-require_once("mod_room-reservation/mod_roomReservationTimeslice.inc");
-require_once("mod_room-reservation/mod_roomReservationRoomsManager.inc");
-
-/**
- * Determines if a privilege has been assigned
- * @param $sPriv (string) Privilege to test
- * @return bool
- */
-function rrPrivilegeAssigned($sPriv) {
- $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1;",
- $sPriv);
- return pg_num_rows($h) > 0;
-}
-
-/**
- * Retrieve all groups that have a privilege assigned
- * @param $strPriv (string) Privilege to test
- * @return array
- */
-function rrPrivilegedGroups($strPriv) {
- $aReturn = array();
- $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1 ".
- "ORDER BY act;", $strPriv);
- if(pg_num_rows($h) > 0) {
- while($a = pg_fetch_array($h)) {
- $aReturn[] = $a["act"];
- }
- }
- return $aReturn;
-}
-
-/**
- * User-defined compare function to compare timeslices
- * @param $oTs1 (mod_roomReservationTimeslice)
- * @param $oTs2 (mod_roomReservationTimeslice)
- * @return (int) <tt>-1</tt> if $oTs1 begins before $oTs2,
- * <tt>0</tt> if the $oTs1 and $oTs2 have the same beginning,
- * <tt>1</tt> if $oTs1 begins after $oTs2.
- */
-function rrConfigSortTimeslices(mod_roomReservationTimeslice $oTs1,
- mod_roomReservationTimeslice $oTs2) {
- if($oTs1->getBegin() == $oTs2->getBegin()) {
- return 0;
- } else {
- return ($oTs1->getBegin() > $oTs2->getBegin()) ? 1 : -1;
- }
-}
-
-define("MOD_ROOM_RESERVATION_CONFIGFILE_HEADER", "<?php
-/**
- * configuration file for package iserv-mod-room-reservation
- * This file is written by the configuration script. Do not change it manually.
- */\n");
-
-/*****************************************************************************/
-/**
- * Handling of the configuration file
- * @todo document
- */
-class mod_roomReservationConfig {
-
- /** (array of rmTimeslice's) Timeslices */
- protected $aoTimeslices;
- /** (bool) Determine if the weekend is shown */
- protected $bShowWeekend;
- /** (bool) Determine if the strings "1. lesson", "2. lesson" etc are shown */
- protected $bShowLessons;
- /** (array of strings) error messages */
- protected $asMessages;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor.
- * @return mod_roomReservationConfig
- */
- public function __construct() {
- $this->flushTimeslices();
- $this->setShowWeekend(false);
- $this->setShowLessons(true);
- $this->asMessages = array();
-
- $this->readConfig();
- }
-
- /**
- * **************************************************************************
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Add a timeslice. A check is done that the timeslices do not overlap, and
- * in this case, an Exception is thrown.
- * @param $oTs (mod_roomReservationTimeslice)
- * @throws Exception
- * @return void
- */
- public function addTimeslice(mod_roomReservationTimeslice $oTs) {
- // Check for overlapping timeslices
- foreach($this->aoTimeslices as $oOldTs) {
- if(($oOldTs->getBegin() < $oTs->getEnd() and
- $oOldTs->getEnd() > $oTs->getBegin())) {
- throw new Exception(
- MOD_ROOM_RESERVATION_ERROR_CONFIG_OVERLAPPING_TIMESLICE);
- }
- }
- $this->aoTimeslices[] = $oTs;
- usort($this->aoTimeslices, "rrConfigSortTimeslices");
- return;
- }
-
- /**
- * Delete a timeslice
- * @param $oTs (mod_roomReservationTimeslice) the timeslice to delete. If
- * the timeslice is not found, an Exception is thrown.
- * @throws Exception
- * @return void
- */
- public function deleteTimeslice(mod_roomReservationTimeslice $oTs) {
- for($i = 0; $i < count($this->aoTimeslices); $i++) {
- if($this->aoTimeslices[$i]->getBegin() == $oTs->getBegin() and
- $this->aoTimeslices[$i]->getEnd() == $oTs->getEnd()) {
- // use array_splice because it renumbers the keys
- array_splice($this->aoTimeslices, $i, 1);
- return;
- }
- }
- throw new Exception(MOD_ROOM_RESERVATION_ERROR_CONFIG_NO_SUCH_TIMESLICE);
- }
-
- /**
- * Delete all timeslices.
- * @return void
- */
- public function flushTimeslices() { $this->aoTimeslices = array(); }
-
- /**
- * Add a room to the list of rooms who can be booked. Throws an SQLException
- * in case of an error.
- * @param $sRoom (string) The name of the room
- * @throws SQLException, Exception
- * @return void
- */
- public function whitelistRoom($sRoom) {
- if(!$this->isRoomWhitelisted($sRoom)) {
- $r = db_store("mod_roomreservation_roomswhitelist",
- array("rrr_name" => $sRoom));
- if(!$r) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
- } else {
- log_insert(sprintf("Raum „%s“ für Buchungen zur Verfügung gestellt",
- $sRoom));
- }
- }
- }
-
- /**
- * Forbid bookings for a room. Throws an SQLException in case of an error.
- * @param $sRoom The name of the room
- * @throws SQLException
- */
- public function unWhitelistRoom($sRoom) {
- $h = db_query("DELETE FROM mod_roomreservation_roomswhitelist WHERE ".
- "rrr_name = $1;", $sRoom);
- if(!$h) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
- } else {
- log_insert(sprintf("Raum „%s“ für Buchungen gesperrt", $sRoom));
- }
- }
-
- /**
- * Determine if a room is allowed for booking. Throws an SQLException
- * in case of an error.
- * @param $sRoom (string) The name of the room
- * @return bool
- * @throws SQLException
- */
- public function isRoomWhitelisted($sRoom) {
- $h = db_query("SELECT * FROM mod_roomreservation_roomswhitelist WHERE ".
- "rrr_name=$1;", $sRoom);
- if(!$h) {
- throw new SQLException(MOD_ROOM_RESERVATION_ERROR_SQL);
- }
- return (pg_num_rows($h) > 0);
- }
-
- /**
- * Get all rooms that are allowed for booking. Throws an SQLException
- * in case of an error.
- * @throws SQLException
- * @return array of mod_roomReservationRoomsManager objects
- */
- public function getWhitelistedRooms() {
- $aor = mod_roomReservationRoomsManager::getRooms();
- $ar = array();
- foreach($aor as $key => $or) {
- if($this->isRoomWhitelisted($or->getName())) {
- $ar[] = $or;
- }
- }
- return $ar;
- }
-
- /**
- * Show or hide the weekend
- * @param $b (bool)
- */
- public function setShowWeekend($b) { $this->bShowWeekend = ($b == true); }
-
- /**
- * Show or hide the lesson strings in the booking table
- * @param $b (bool)
- */
- public function setShowLessons($b) { $this->bShowLessons = ($b == true); }
-
- /**
- * Add a message to the internal array of (error) messages
- * @param $sMessage (string)
- */
- public function addMessage($sMessage) {
- array_merge($this->asMessages, array($sMessage));
- }
-
- /**
- * Get all timeslices in chronological order
- * @return array of rmTimeslice
- */
- public function getTimeslices() { return $this->aoTimeslices; }
-
- /**
- * Return the starting times of every timeslice
- * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
- * current locale
- * <tt>false</tt>: return just the timestamps
- * @return array
- */
- public function getTimesliceBeginnings($bFormat = false) {
- $aot = $this->getTimeslices();
- $aRet = array();
- foreach($aot as $ao) {
- $aRet[] = $bFormat ? gmstrftime(_("%#I:%M %p"), $ao->getBegin()) :
- $ao->getBegin();
- }
- return $aRet;
- }
-
- /**
- * Return the ending times of every timeslice
- * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
- * current locale
- * <tt>false</tt>: return just the timestamps
- * @return array
- */
- public function getTimesliceEndings($bFormat = false) {
- $aot = $this->getTimeslices();
- $aRet = array();
- foreach($aot as $ao) {
- $aRet[] = $bFormat ? gmstrftime(_("%#I:%M %p"), $ao->getEnd()) :
- $ao->getEnd();
- }
- return $aRet;
- }
-
- /**
- * Get a timeslice
- * @param $n (int) index of the timeslice in the array
- * @return rmTimeslice
- */
- public function getTimeslice($n) { return $this->aoTimeslices[$n]; }
-
- /**
- * Determine if the weekend is shown
- * @return bool
- */
- public function isShowWeekend() { return ($this->bShowWeekend == true); }
-
- /**
- * Determine if the lesson strings in the booking table are shown
- * @return bool
- */
- public function isShowLessons() { return ($this->bShowLessons == true); }
-
- /**
- * Determine if the current user has admin rights. This function tests
- * if the user is in a group which has the privilege of admin rights.
- * @todo test
- * @return bool
- */
- public function userIsAdmin() {
- return secure_privilege("mod_roomreservation_admin");
- }
-
- /**
- * Determine if the current user can book rooms. This function tests
- * if the user is in a group which has the privilege to book rooms.
- * If no group has this privilege, all users can book.
- * @todo test
- * @return bool
- */
- public function userCanBook() {
- if(!rrPrivilegeAssigned("mod_roomreservation_book")) {
- // If the privilege is not assigned to any group, all users can book
- return true;
- } else {
- // If user is admin, it makes sense that he can book rooms ;-)
- return secure_privilege("mod_roomreservation_book") ||
- secure_privilege("mod_roomreservation_admin");
- }
- }
-
- /**
- * Determine if the current user can view bookings. This function tests
- * if the user is in a group which has been configured as a group who
- * can view bookings. If no groups are configured, any user can view the
- * bookings table.
- * @todo test
- * @return bool
- */
- public function userCanView() {
- if(!rrPrivilegeAssigned("mod_roomreservation_view")) {
- // If the privilege is not assigned to any group, all users can view
- return true;
- } else {
- // If user is admin or can book, it makes sense that he can view bookings
- return secure_privilege("mod_roomreservation_admin") ||
- secure_privilege("mod_roomreservation_book") ||
- secure_privilege("mod_roomreservation_view");
- }
- }
-
- /**
- * Get the messages that have been produced
- * @return string
- */
- public function getMessages() {
- return join("\n", $this->asMessages);
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Operations
- * @{
- */
-
- /**
- * Write the current state of this instance to the config file.
- * @throws IOException
- * @return bool
- */
- public function writeConfig() {
- // Open config file
- $hFile = fopen("mod_room-reservation/config.inc", "w", true);
- if(!is_resource($hFile)) {
- throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
- return false;
- }
- // Try to lock file repeatedly
- for($n = 0; !flock($hFile, LOCK_EX); $n++) {
- if($n > 10) {
- throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
- return false; // Give up
- } else {
- sleep(0.2); // Retry after 100 ms
- }
- }
-
- // Create text for config file
- $strFile = MOD_ROOM_RESERVATION_CONFIGFILE_HEADER;
-
- // Timeslices
- $strFile .= "\$this->flushTimeslices();\n";
- foreach($this->getTimeslices() as $oTs) {
- $strFile .= sprintf("\$this->addTimeslice(new ".
- "mod_roomReservationTimeslice(%d, %d));\n", $oTs->getBegin(),
- $oTs->getEnd());
- }
-
- // Show weekend
- $strFile .= sprintf("\$this->setShowWeekend(%s);\n",
- $this->isShowWeekend() ? "true" : "false");
-
- // Show lessons
- $strFile .= sprintf("\$this->setShowLessons(%s);\n",
- $this->isShowLessons() ? "true" : "false");
-
- $strFile .= "?>";
-
- // Write to config file and unlock it
- if(fwrite($hFile, $strFile) == false) {
- throw new IOException(MOD_ROOM_RESERVATION_ERROR_WRITE_FILE);
- return false;
- }
- if(!flock($hFile, LOCK_UN)) {
- throw new IOException(MOD_ROOM_RESERVATION_ERROR_UNLOCK_FILE);
- return false;
- }
-
- rrInsertLog("Konfiguration verändert");
- return true;
- }
-
- /**
- * Read configuration from file. Returns <tt>false</tt> if an error occured,
- * in this case getMessages() contains error messages.
- * @return bool
- */
- public function readConfig() {
- global $g_rmCfg;
- try {
- require("mod_room-reservation/config.inc");
- } catch(Exception $e) {
- $this->addMessage($e->getMessage());
- }
- }
-
- /** @} */
-}
-?>
+++ /dev/null
-<?php
-/**\r
- * @file mod_roomReservationConfigPage.inc\r
- * The configuration page\r
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
- * @date 24.06.2008\r
- * \r
- * Copyright © 2007 Roland Hieber\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
- * THE SOFTWARE.\r
- */\r
-\r
-require_once("ctrl.inc");
-require_once("mod_room-reservation/mod_roomReservationPage.inc");
-require_once("mod_room-reservation/mod_roomReservationTimesliceListBox.inc");
-require_once("mod_room-reservation/mod_roomReservationRoomWhitelistListBox.inc");
-
-/** @todo document */
-class mod_roomReservationConfigPage extends mod_roomReservationPage {
-
- protected $bPostShowWeekend;
- protected $bPostShowLessons;
- protected $asMessages = array();
- protected $otlb;
- protected $orwlb;
-
- public function __construct(mod_roomReservationConfig &$oCfg) {
- parent::__construct($oCfg);
- $this->otlb = new mod_roomReservationTimesliceListBox($this->oCfg);
- $this->orwlb = new mod_roomReservationRoomWhitelistListBox($this->oCfg);
- $this->setTitle(_c("room-reservation:Configuration"));
- $this->setIcon("mod_room-reservation_config");
- }
-
- public function processRequestVariables() {
- // default values
- $this->bPostShowWeekend = $this->oCfg->isShowWeekend();
- $this->bPostShowLessons = $this->oCfg->isShowLessons();
-
- if(isset($_POST["mod_roomReservationConfigPage"])) {
- if(isset($_POST["mod_roomReservationConfigPage"]["showweekend"])) {
- $this->bPostShowWeekend =
- ($_POST["mod_roomReservationConfigPage"]["showweekend"] == true);
- }
-
- if(isset($_POST["mod_roomReservationConfigPage"]["showlessons"])) {
- $this->bPostShowLessons =
- ($_POST["mod_roomReservationConfigPage"]["showlessons"] == true);
- }
-
- // process the request
- if(isset($_POST["mod_roomReservationConfigPage"]["submit"])) {
- $this->oCfg->setShowWeekend($this->bPostShowWeekend);
- $this->oCfg->setShowLessons($this->bPostShowLessons);
- try {
- $this->oCfg->writeConfig();
- } catch(Exception $e) {
- $this->asMessages[] = $e->getMessage();
- }
- }
- }
- }
-
- public function doShow() {
- // error messages
- if(count($this->asMessages) > 0) {
- printf("<p>%s</p>", nl2br(q(join("\n", $this->asMessages))));
- }
-
- // first column
- echo "<table border='0' cellspacing='10' cellpadding='0'><tr>".
- "<td style='width:50%;'>\n";
-
- GroupBox(_c("room-reservation:Available rooms"), "host");
- printf("<p>%s</p>", _c("room-reservation:The following rooms are ".
- "available for booking:"));
- echo "<div style='margin:8px;'>";
- $this->orwlb->show();
- echo "</div>\n";
- _GroupBox();
-
- GroupBox(_("Privileges"), "keys");
- $asAdminGroups = rrPrivilegedGroups("mod_roomreservation_admin");
- $asBookGroups = rrPrivilegedGroups("mod_roomreservation_book");
- $asViewGroups = rrPrivilegedGroups("mod_roomreservation_view");
- echo sprintf("<p>%s</p>\n<p>%s</p>\n<p>%s</p>", _c("room-reservation:This is ".
- "a short summary of the privileges related to the room reservation ".
- "schedulde and the groups which have them assigned."),
- sprintf(_c("room-reservation:If one of these privileges is not assigned to ".
- "any group, all users on this server are allowed to perform the specified ".
- "action. Please use the %sgroup administration%s to assign and revoke ".
- "privileges."), "<a href='/idesk/admin/act/groups.php'>", "</a>"),
- _c("room-reservation:Please note that every group with the booking ".
- "privilege can also implicitly view the booking table and every group with ".
- "the administration privilege can also implicitly book and view the ".
- "booking table."));
- echo "<p><table style='width:100%'><tr>\n";
- echo sprintf("<td>%s%s</td><td>%s</td>\n", icon("keys"),
- _("View the booking table").":", $asViewGroups == array() ?
- _c("room-reservation:all users") : icon("act-group") . join(", ",
- array_map("getGroupName", $asViewGroups)));
- echo "</tr><tr>\n";
- echo sprintf("<td>%s%s</td><td>%s</td>\n", icon("keys"),
- _("Book rooms").":", $asBookGroups == array() ?
- _c("room-reservation:all users") : icon("act-group") . join(", ",
- array_map("getGroupName", $asBookGroups)));
- echo "</tr><tr>\n";
- echo sprintf("<td>%s%s</td><td>%s</td>\n", icon("keys"),
- _("Administration of the room reservation schedule"),
- $asAdminGroups == array() ? _c("room-reservation:all users") :
- icon("act-group") . join(", ", array_map("getGroupName", $asAdminGroups)));
- echo "</tr></table></p>\n";
- _GroupBox();
-
- // second column
- echo "</td><td><!--second row-->\n";
-
- GroupBox(_c("room-reservation:Periods"), "mod_room-reservation_timeslice");
- printf("<p>%s</p>", _c("room-reservation:Here you can fill in the ".
- "periods where bookings can be undertaken. A booking period can ".
- "e. g. correspond to a lesson."));
- echo "<div style='margin:8px;'>";
- $this->otlb->show();
- echo "</div>\n";
- _GroupBox();
-
- GroupBox(_c("room-reservation:Further options"), "manage");
- printf("<div style='margin:8px;'><form action='%s' method='post'>".
- "<table><tr>\n", $_SERVER["PHP_SELF"]);
-
- printf("<td><input type='hidden' name='mod_roomReservationConfigPage".
- "[showweekend]' value='0' /><%s name='mod_roomReservationConfigPage".
- "[showweekend]' id='mod_roomReservationConfigPageShowWeekend' ".
- "value='1' %s /></td><td><label for='".
- "mod_roomReservationConfigPageShowWeekend'><b>%s</b></label><br />".
- "<span class='mod_roomReservationConfigPageExplanation'>%s</span></p>",
- $GLOBALS["smlchk"], $this->bPostShowWeekend ? "checked='checked' " : "",
- _c("room-reservation:Show weekend"), _c("room-reservation:If ".
- "selected, the weekdays saturday and sunday are also shown in the ".
- "booking table."));
-
- echo "</tr><tr>\n";
- printf("<td><input type='hidden' name='mod_roomReservationConfigPage".
- "[showlessons]' value='0' /><%s name='mod_roomReservationConfigPage".
- "[showlessons]' id='mod_roomReservationConfigPageShowLessons' ".
- "value='1'%s /></td><td><label for='".
- "mod_roomReservationConfigPageShowLessons'><b>%s</b></label><br />".
- "<span class='mod_roomReservationConfigPageExplanation'>%s</span></p>",
- $GLOBALS["smlchk"], $this->bPostShowLessons ? "checked='checked' " : "",
- _c("room-reservation:Show „lesson” texts"),
- _c("room-reservation:Check this box to show texts like ".
- "„<i>n</i>th lesson&rdquo in the booking page. If this box is ".
- "unchecked, none of these texts are shown."));
-
- printf("</tr><tr><td colspan='2'><%s name='mod_roomReservationConfigPage".
- "[submit]' value='%s' /></td>", $GLOBALS["stdbtn"], _("OK"));
- echo "</tr></table></form></div>\n";
- _GroupBox();
-
- echo "</td></tr></table>\n";
- }
-}
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-/**\r
- * @file mod_roomReservationControl.inc\r
- * Class that represents an abstract control\r
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
- * @date 25.07.2008\r
- * \r
- * Copyright © 2007 Roland Hieber\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
- * THE SOFTWARE.\r
- */\r
-
-require_once("quote.inc");
-require_once("functions.inc");
-\r
-/** @todo document */
-abstract class mod_roomReservationControl {
- /** (array of strings) Errors that occur while processing the form */
- protected $asMessages;
- /** (mod_roomReservationConfig) Reference to the configuration object */
- protected $oCfg;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor
- * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
- * configuration
- * @return mod_roomReservationBookingTable
- */
- public function __construct(mod_roomReservationConfig &$oCfg) {
- rrAddCss(".blue .treeview .err { color:red !important; }");
- $this->oCfg = $oCfg;
- $this->processRequestVariables();
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Initialization
- * @{
- */
-
- /**
- * Process the REQUEST variables and preset the some variables
- * @return void
- */
- protected function processRequestVariables() { }
-
- /***************************************************************************/
- /**
- * @}
- * @name Output
- * @{
- */
-
- /**
- * Get the messages that have been produced. Returns HTML.
- * @return string
- */
- protected function getMessages() {
- if(count($this->asMessages) > 0) {
- return sprintf("<div class='err'>%s</p>\n",
- nl2br(q(join("\n", $this->asMessages))));
- }
- }
-
- /**
- * Show the beginning of the control.
- * @return void
- */
- protected function beginShow() { }
-
- /**
- * Show the control. Override this function to print your HTML code.
- * @return void
- */
- protected abstract function doShow();
-
- /**
- * Show the end of the control.
- * @return void
- */
- protected function endShow() { }
-
- /**
- * Show the full control. You don't need to override this function. Instead,
- * override doShow().
- * @return void
- */
- public function show() {
- $this->beginShow();
- $this->doShow();
- $this->endShow();
- }
-}
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-/**\r
- * @file mod_roomReservationPage.inc\r
- * A generic page class\r
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
- * @date 24.06.2008\r
- * \r
- * Copyright © 2007 Roland Hieber\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
- * THE SOFTWARE.\r
- */\r
-\r
-require_once("mod_room-reservation/mod_roomReservationConfig.inc");
-
-/** @todo document */
-abstract class mod_roomReservationPage {
- /** (mod_roomReservationConfig) Reference to the configuration object */
- protected $oCfg;
- /** (string) Page title for PageBlue() */
- protected $strTitle;
- /** (string) Title icon for PageBlue() */
- protected $strIcon;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor
- * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
- * configuration
- * @return mod_roomReservationPage
- */
- function __construct(mod_roomReservationConfig &$oCfg) {
- $this->oCfg = $oCfg;
-
- $this->processRequestVariables();
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Initialization
- * @{
- */
-
- /**
- * Process the REQUEST variables and preset the some variables. Override
- * this function to process GET and POST parameters.
- * @return void
- */
- protected function processRequestVariables() { }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the page title
- * @param $str (string)
- * @return void
- */
- public function setTitle($str) { $this->strTitle = $str; }
-
- /**
- * Set the title icon
- * @param $str (string)
- * @return void
- */
- public function setIcon($str) { $this->strIcon = $str; }
-
- /**
- * Get the page title
- * @return string
- */
- public function getTitle() { return $this->strTitle; }
-
- /**
- * Get the title icon
- * @return string
- */
- public function getIcon() { return $this->strIcon; }
-
- /***************************************************************************/
- /**
- * @}
- * @name Output
- * @{
- */
-
- /**
- * Show the beginning of the page.
- * @return void
- */
- protected function beginShow() {
- html_header("<style type='text/css'>\n".rrGetCss()."\n</style>\n");
- PageBlue(q($this->getTitle()), $this->getIcon());
-
- // print error messages from the configuration
- if($s = trim($this->oCfg->getMessages()) != "") {
- printf("<p class='err'>%s</p>\n", nl2br(q($s)));
- }
- }
-
- /**
- * Show the beginning of the page. Override this function to print your
- * HTML code.
- * @return void
- */
- protected abstract function doShow();
-
- /**
- * Show the end of the page.
- * @return void
- */
- protected function endShow() {
- _PageBlue();
- }
-
- /**
- * Show the full page. You don't need to override this function. Instead,
- * override doShow().
- * @return void
- */
- public function show() {
- $this->beginShow();
- $this->doShow();
- $this->endShow();
- }
-
-}
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationRoom.inc
- * Container class for the representation of a room
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 28.12.2007
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @todo move into M Class Library
- */
-
-/**
- * Container class for the representation of a room
- */
-class mod_roomReservationRoom {
-
- /** (string) Name of the room */
- protected $strName;
- /** (string) Room number */
- protected $strRoomNo;
- /** (string) Floor */
- protected $strFloor;
- /** (string) Building */
- protected $strBuilding;
- /** (string) Location */
- protected $strLocation;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor.
- * @param $strName (string) Name of the room
- * @return rmRoom
- */
- public function __construct($strName, $strRoomNo = "", $strFloor = "",
- $strBuilding = "", $strLocation = "") {
- $this->setName($strName);
- $this->setRoomNo($strRoomNo);
- $this->setFloor($strFloor);
- $this->setBuilding($strBuilding);
- $this->setLocation($strLocation);
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the name of the room
- * @param $str (string)
- * @return void
- */
- public function setName($str) { $this->strName = $str; }
-
- /**
- * Set the room number
- * @param $str (string)
- * @return void
- */
- public function setRoomNo($str) { $this->strRoomNo = $str; }
-
- /**
- * Set the floor
- * @param $str (string)
- * @return void
- */
- public function setFloor($str) { $this->strFloor = $str; }
-
- /**
- * Set the building
- * @param $str (string)
- * @return void
- */
- public function setBuilding($str) { $this->strBuilding = $str; }
-
- /**
- * Set the location
- * @param $str (string)
- * @return void
- */
- public function setLocation($str) { $this->strLocation = $str; }
-
- /**
- * Get the name of the room
- * @return string
- */
- public function getName() { return $this->strName; }
-
- /**
- * Get the room number
- * @return string
- */
- public function geRoomNo() { return $this->strRoomNo; }
-
- /**
- * Get the floor
- * @return string
- */
- public function getFloor() { return $this->strFloor; }
-
- /**
- * Get the building
- * @return string
- */
- public function getBuilding() { return $this->strBuilding; }
-
- /**
- * Get the location
- * @return string
- */
- public function getLocation() { return $this->strLocation; }
-
- /**
- * Conversion to string
- * @return string
- */
- public function __toString() { return $this->getName(); /* name is key */ }
- /**@}*/
-}
-?>
+++ /dev/null
-<?php
-/**\r
- * @file mod_roomReservationRoomWhitelistListBox.inc\r
- * List box that shows the rooms who can be booked\r
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
- * @date 24.07.2008\r
- * \r
- * Copyright © 2007 Roland Hieber\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
- * THE SOFTWARE.\r
- */\r
-
-require_once("mod_roomReservationControl.inc");
-require_once("mod_roomReservationRoomsManager.inc");
-
-/*****************************************************************************/
-/**
- * @page roomwhitelistlistbox_actions Actions of a
- * mod_roomReservationRoomWhitelistListBox instance
- * @{
- * The following constants describe the actions that a
- * mod_roomReservationRoomWhitelistListBox instance can handle. They are used
- * in processRequestVariables() to determine the action that should be done
- * when the control is shown.
- */
-/** Show the control (default action) */
-define("MOD_ROOM_RESERVATION_RWLB_ACTION_SHOW", 0);
-/** Show the addition form */
-define("MOD_ROOM_RESERVATION_RWLB_ACTION_ADD", 1);
-/** Process the addition form */
-define("MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITADD", 2);
-/** Show the deletion form */
-define("MOD_ROOM_RESERVATION_RWLB_ACTION_DELETE", 3);
-/** Process the deletion form */
-define("MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITDELETE", 4);
-/** @} */
-\r
-/** @todo document */
-class mod_roomReservationRoomWhitelistListBox
- extends mod_roomReservationControl {
- /**
- * (array of integers) OIDs of the rows in the rooms table that were
- * selected (POST data)
- */
- protected $anPostSelection = array();
- /** (constant) Display mode, see @ref roomwhitelistlistbox_actions */
- protected $cMode;
-
- protected function processRequestVariables() {
- // default values
- $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_SHOW;
-
- // POST data
- if(isset($_POST["mod_roomReservationRoomWhitelistListBox"])) {
- $aPost = $_POST["mod_roomReservationRoomWhitelistListBox"];
- // mode
- if(isset($aPost["action"])) {
- if(isset($aPost["action"]["add"])) {
- if($aPost["action"]["add"] == _("Add")) {
- $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_ADD;
- } elseif($aPost["action"]["add"] == _("OK")) {
- $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITADD;
- }
- } elseif(isset($aPost["action"]["delete"])) {
- if($aPost["action"]["delete"] == _("Delete")) {
- $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_DELETE;
- } elseif($aPost["action"]["delete"] == _("OK")) {
- $this->cMode = MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITDELETE;
- }
- }
- }
- // selection
- if(isset($aPost["l"])) {
- foreach($aPost["l"] as $nOid => $bChecked) {
- if($bChecked) {
- $this->anPostSelection[] = $nOid;
- }
- }
- }
- }
-
- // process the forms
- if($this->cMode == MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITADD) {
- $h = db_query("SELECT name FROM rooms WHERE oid IN ".
- qdb_arr($this->anPostSelection));
- while($a = pg_fetch_array($h)) {
- $this->oCfg->whitelistRoom($a["name"]);
- }
- }
-
- if($this->cMode == MOD_ROOM_RESERVATION_RWLB_ACTION_SUBMITDELETE) {
- $h = db_query("SELECT name FROM rooms WHERE oid IN ".
- qdb_arr($this->anPostSelection));
- while($a = pg_fetch_array($h)) {
- $this->oCfg->unWhitelistRoom($a["name"]);
- }
- }
- }
-
- protected function doShow() {
- echo "<form method='post'>";
- TreeView(array(_("Room")));
- switch($this->cMode) {
- case MOD_ROOM_RESERVATION_RWLB_ACTION_DELETE:
- $this->showDeleteForm();
- break;
- case MOD_ROOM_RESERVATION_RWLB_ACTION_ADD: $this->showAddForm(); break;
- default:
- case MOD_ROOM_RESERVATION_RWLB_ACTION_SHOW: $this->showForm(); break;
- }
- _TreeView();
- echo "</form>\n";
- }
-
- /**
- * Print the form if not delete nor add was requested
- * @return void
- */
- protected function showForm() {
- $aoRooms = $this->oCfg->getWhitelistedRooms();
- // only show add button if there are still some unlisted rooms
- if(count(mod_roomReservationRoomsManager::getRooms()) > count($aoRooms)) {
- TreeViewLine(sprintf("<%s name='mod_roomReservationRoomWhitelistListBox".
- "[action][add]' value='%s' /></form>", $GLOBALS["stdbtn"], _("Add")));
- }
- $this->showList($aoRooms);
- // toolbar
- printf("<tr><td class='tbbtm' colspan='%d'>", $GLOBALS["treeview_cols"]);
- CheckCombo();
- printf("<%s name='mod_roomReservationRoomWhitelistListBox[action]".
- "[delete]' value='%s' />", $GLOBALS["stdbtn"], _("Delete"));
- echo "</td></tr>\n";
- }
-
- /**
- * Print the addition form
- * @return void
- */
- protected function showAddForm() {
- // only list rooms that are not already whitelisted
- $aoRooms = array_diff(mod_roomReservationRoomsManager::getRooms(),
- $this->oCfg->getWhitelistedRooms());
- TreeViewSubtitle(_("Add"));
- $this->showList($aoRooms);
- TreeViewLine(sprintf("<p><%s name='mod_roomReservationRoomWhitelistList".
- "Box[action][add]' value='%s' /> <%s name='mod_roomReservationRoom".
- "WhitelistListBox[action][add]' value='%s' /></p>", $GLOBALS["stdbtn"],
- _("OK"), $GLOBALS["stdbtn"], _("Cancel")));
- }
-
- /**
- * Show the deletion form
- * @return void
- */
- protected function showDeleteForm() {
- // list rooms in selection
- $aoRooms = array();
- $h = db_query("SELECT name FROM rooms WHERE oid IN ".
- qdb_arr($this->anPostSelection));
- foreach($this->anPostSelection as $nOid) {
- $aoRooms[] = mod_roomReservationRoomsManager::getRoomByOid($nOid);
- }
- TreeViewSubtitle(sprintf(_("Following %s will be deleted"),
- _c("room-reservation:rooms")));
- $this->showList($aoRooms, false);
- TreeViewLine(sprintf("<p><%s name='mod_roomReservationRoomWhitelistList".
- "Box[action][delete]' value='%s' /> <%s name='mod_roomReservationRoom".
- "WhitelistListBox[action][delete]' value='%s' /></p>",
- $GLOBALS["stdbtn"], _("OK"), $GLOBALS["stdbtn"], _("Cancel")));
- }
-
- /**
- * Show the list items
- * @param $aoRooms (array of mod_roomReservationRoom objects) List items
- * @param $bCheckboxes (bool) Whether to show checkboxes
- */
- protected function showList($aoRooms, $bCheckboxes = true) {
- if(count($aoRooms) > 0) {
- foreach($aoRooms as $o) {
- // fetch oid from SQL table
- $nOid = pg_fetch_result(db_query("SELECT oid FROM ".
- "rooms WHERE name = $1", $o->getName()), 0, "oid");
- $sBox = $bCheckboxes ? sprintf("<%s id='box%d' name='mod_room".
- "ReservationRoomWhitelistListBox[l][%d]' value='1'%s /><label ".
- "for='box%d'>%s%s</label>", $GLOBALS["smlchk"], $nOid, $nOid,
- @$this->anPostSelection[$nOid] ? " checked='checked'" : "", $nOid,
- icon("host"), $o->getName()) :
- sprintf("<input type='hidden' name='mod_roomReservationRoom".
- "WhitelistListBox[l][%d]' value='1' />%s%s", $nOid, icon("host"),
- $o->getName());
- TreeViewLine($sBox);
- }
- } else {
- TreeViewEmpty();
- }
- }
-}
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationRoomsManager.inc
- * Class for the management of rooms
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 28.12.2007
- *
- * TODO: move into M Class Library
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-require_once("db.inc");
-require_once("mod_room-reservation/functions.inc");
-require_once("mod_room-reservation/mod_roomReservationRoom.inc");
-require_once("mod_room-reservation/mod_roomReservationConfig.inc");
-
-/** Simple class for creating, editing and deleting rooms */
-class mod_roomReservationRoomsManager {
- /** (mod_roomReservationConfig) Reference to the configuration */
- protected $oCfg;
-
- /**
- * Constructor
- * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
- * configuration object
- * @return rmRoomsManager
- */
- public function __construct(mod_roomReservationConfig &$oCfg) {
- $this->oCfg = $oCfg;
- }
-
- /**
- * Insert or update a room in the database
- * param $or (rsRoom) Room to store in the database
- * return (int) The UID of the booking, or <tt>-1</tt> in case of a failure.
- * Call getLastError() to get more information about the error.
- */
-/** public function write(rsRoom $or) {
- // Only administrators are allowed to create and alter rooms
- if(!$this->oCfg->userIsAdmin()) {
- // TODO throw exception
- setLastError(RS_ERROR_ACCESS_DENIED);
- return -1;
- }
-
- $strWhere = "";
- $strLog = "";
-
- // Update or insert?
- if($or->getUid() == null) {
- // No UID yet, insert new room
- $strLog = sprintf("Raum „%s“ angelegt", $or->getName());
- } else {
- $strWhere = "rsr_uid = ".qp(intval($or->getUid()));
- $strLog = sprintf("Raum „%s“ geändert", $or->getName());
- }
-
- $aPut["rsr_name"] = $or->getName();
- db_store("rooms", $aPut, $strWhere == "" ? null : $strWhere);
-
- $hQuery = db_query("SELECT currval('roomschedule_rooms_rsr_uid_seq') ".
- "FROM roomschedule_rooms;");
- $nNewUid = pg_fetch_result($hQuery, 0, "currval");
-
- rrInsertLog($strLog);
-
- // Return new UID
- return $nNewUid;
- }
- */
- /**
- * Delete a room from the database
- * param $nUid (int) Unique ID of the room
- * return (bool) <tt>true</tt> on success, otherwise <tt>false</tt>.
- * Call getLastError() to get more information about the error.
- */
-/* public function delete($nUid) {
- // Only administrators are allowed to delete rooms
- if(!$this->oCfg->userIsAdmin()) {
- // TODO throw exception
- setLastError(RS_ERROR_ACCESS_DENIED);
- return false;
- }
- // Delete it from the database
- $strRoom = $this->getRoomName($nUid);
- if(!db_query("DELETE FROM roomschedule_rooms WHERE rsr_uid = $1;",
- intval($nUid))) {
- // TODO throw exception
- setLastError(RS_ERROR_SQL);
- return false;
- } else {
- rsInsertLog(sprintf("Raum „%s“ gelöscht", $strRoom));
- return true;
- }
- }
-*/
-
- /**
- * Get a room by its OID. Returns <tt>null</tt> if the room was not found.
- * @param $nOid (integer) The OID of the room
- * @return mod_roomReservationRoom
- */
- static function getRoomByOid($nOid) {
- $o = null;
- $h = db_query("SELECT * FROM rooms WHERE oid = $1;", $nOid);
- if(pg_num_rows($h) > 0) {
- $arResult = pg_fetch_array($h);
- $o = new mod_roomReservationRoom($arResult["name"],
- $arResult["room_no"], $arResult["floor"], $arResult["building"],
- $arResult["location"]);
- }
- return $o;
- }
-
- /**
- * Get a room by its name. Returns <tt>null</tt> if the room was not found.
- * @param $sName (string) The name of the room
- * @return mod_roomReservationRoom
- */
- static function getRoomByName($sName) {
- $o = null;
- $h = db_query("SELECT * FROM rooms WHERE name = $1;", $sName);
- if(pg_num_rows($h) > 0) {
- $arResult = pg_fetch_array($h);
- $o = new mod_roomReservationRoom($arResult["name"],
- $arResult["room_no"], $arResult["floor"], $arResult["building"],
- $arResult["location"]);
- }
- return $o;
- }
-
- /**
- * Get all rooms from the database
- * @return array of mod_roomReservationRoom
- */
- static function getRooms() {
- $aoReturn = array();
- $hQuery = db_query("SELECT * FROM rooms ORDER BY name;");
- while($arResult = pg_fetch_array($hQuery)) {
- $aoReturn[] = new mod_roomReservationRoom($arResult["name"],
- $arResult["room_no"], $arResult["floor"], $arResult["building"],
- $arResult["location"]);
- }
- return $aoReturn;
- }
-}
-?>
+++ /dev/null
-<?php
-/**
- * @file mod_roomReservationTimeslice.inc
- * Representation of a timeslice
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
- * @date 03.02.2008
- *
- * Copyright © 2007 Roland Hieber
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/** Implementation of a simple timeslice with beginning and ending time */
-class mod_roomReservationTimeslice {
-
- /** (timestamp) Time when the timeslice begins */
- protected $tsBegin = -1;
- /** (timestamp) Time when the timeslice ends */
- protected $tsEnd = 86400;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor
- * @param $tsBegin (timestamp) Time when the timeslice begins. Only the
- * time part is used, the date part is ignored.
- * @param $tsEnd (timestamp) Time when the timeslice ends. Only the time
- * part is used, the date part is ignored.
- * @return mod_roomReservationTimeslice
- */
- public function __construct($tsBegin, $tsEnd) {
- $this->setBegin($tsBegin);
- $this->setEnd($tsEnd);
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the beginning. Only the time part is used, the date part is ignored.
- * If the timestamp is invalid, an Exception is thrown.
- * @param $ts (timestamp)
- * @throws Exception
- */
- public function setBegin($ts) {
- if(intval($ts) >= $this->getEnd()) {
- throw new Exception(MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN);
- } else {
- $this->tsBegin = (intval($ts) % 86400);
- }
- }
-
- /**
- * Set the ending. Only the time part is used, the date part is ignored.
- * If the timestamp is invalid, an Exception is thrown.
- * @param $ts (timestamp)
- * @throws Exception
- */
- public function setEnd($ts) {
- if($this->getBegin() >= intval($ts)) {
- throw new Exception(MOD_ROOM_RESERVATION_ERROR_END_BEFORE_BEGIN);
- } else {
- $this->tsEnd = (intval($ts) % 86400);
- }
- }
-
- /**
- * Get the beginning.
- * @return timestamp
- */
- public function getBegin() { return $this->tsBegin; }
-
- /**
- * Get the ending.
- * @return timestamp
- */
- public function getEnd() { return $this->tsEnd; }
-
- /** @} */
-}
-?>
+++ /dev/null
-<?php
-/**\r
- * @file mod_roomReservationTimesliceListBox.inc\r
- * A list box that allows the user to add and delete timeslices\r
- * @author Roland Hieber (roland.hieber@wilhelm-gym.net)\r
- * @date 23.06.2008\r
- * \r
- * Copyright © 2007 Roland Hieber\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
- * THE SOFTWARE.\r
- */\r
-
-require_once("ctrl.inc");
-require_once("mod_room-reservation/mod_roomReservationControl.inc");
-require_once("mod_room-reservation/mod_roomReservationTimeslice.inc");
-
-/*****************************************************************************/
-/**
- * @page timeslicelistbox_actions Actions of a
- * mod_roomReservationTimesliceListBox instance
- * @{
- * The following constants describe the actions that a
- * mod_roomReservationTimesliceListBox instance can handle. They are used in
- * processRequestVariables() to determine the action that should be done when
- * the control is shown.
- */
-/** Show the control (default action) */
-define("MOD_ROOM_RESERVATION_TLB_ACTION_SHOW", 0);
-/** Add a timeslice */
-define("MOD_ROOM_RESERVATION_TLB_ACTION_ADD", 1);
-/** Delete a timeslice */
-define("MOD_ROOM_RESERVATION_TLB_ACTION_DELETE", 2);
-/** @} */
-\r
-/** @todo document, add a delete confirmation */
-class mod_roomReservationTimesliceListBox extends mod_roomReservationControl {
-
- /**
- * (constant) The action to be done (GET data).
- * See @ref timeslicelistbox_actions.
- */
- protected $cAction;
- /** (string) The beginning for a new timeslice (GET data) */
- protected $sNewBegin;
- /** (string) The ending for a new timeslice (GET data) */
- protected $sNewEnd;
-
- /***************************************************************************/
- /**
- * @name Constructor
- * @{
- * Constructor
- * @param $oCfg (reference to mod_roomReservationConfig) Reference to the
- * configuration
- * @return mod_roomReservationTimesliceListBox
- */
- public function __construct(mod_roomReservationConfig &$oCfg) {
- parent::__construct($oCfg);
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Initialization
- * @{
- */
-
- /**
- * Process the REQUEST variables and preset the some variables
- * @return void
- */
- protected function processRequestVariables() {
-
- if(isset($_GET["mod_roomReservationTimesliceListBox"])) {
- // action
- if(isset($_GET["mod_roomReservationTimesliceListBox"]["action"])) {
- $ga = $_GET["mod_roomReservationTimesliceListBox"]["action"];
- $this->setAction((($ga == "add") ? MOD_ROOM_RESERVATION_TLB_ACTION_ADD :
- (($ga == "delete") ? MOD_ROOM_RESERVATION_TLB_ACTION_DELETE :
- MOD_ROOM_RESERVATION_TLB_ACTION_SHOW)));
- }
-
- // new beginning and new ending
- $this->setNewBegin(isset(
- $_GET["mod_roomReservationTimesliceListBox"]["begin"]) ?
- $_GET["mod_roomReservationTimesliceListBox"]["begin"] : "");
- $this->setNewEnd(isset(
- $_GET["mod_roomReservationTimesliceListBox"]["end"]) ?
- $_GET["mod_roomReservationTimesliceListBox"]["end"] : "");
- }
-
- // perform the requested action
- if($this->getAction() == MOD_ROOM_RESERVATION_TLB_ACTION_ADD) {
- // add a timeslice to the configuration file
-
- $bErrors = false;
-
- // Note: we want to handle the timestamps in GMT format, hence the "+0000"
- if(strtotime($this->getNewBegin()." +0000") === false) {
- $this->asMessages[] = _c("room-reservation:The beginning time is ".
- "invalid.");
- $bErrors = true;
- }
- if(strtotime($this->getNewEnd()." +0000") === false) {
- $this->asMessages[] = _c("room-reservation:The ending time is ".
- "invalid.");
- $bErrors = true;
- }
-
- if(!$bErrors) {
- try {
- $this->oCfg->addTimeslice(new mod_roomReservationTimeslice(
- strtotime($this->getNewBegin()." +0000") % 86400,
- strtotime($this->getNewEnd()." +0000") % 86400));
- $this->oCfg->writeConfig();
- $this->setNewBegin("");
- $this->setNewEnd("");
- } catch(Exception $e) {
- $this->asMessages[] = $e->getMessage();
- }
- }
-
- } elseif($this->getAction() == MOD_ROOM_RESERVATION_TLB_ACTION_DELETE) {
- // delete a timeslice from the configuration file
- if(isset($_POST["mod_roomReservationTimesliceListBox"])) {
- if(isset($_POST["mod_roomReservationTimesliceListBox"]["l"])) {
- $ao = $this->oCfg->getTimeslices();
- foreach($_POST["mod_roomReservationTimesliceListBox"]["l"] as
- $n => $b) {
- if($b) {
- $this->oCfg->deleteTimeslice(new mod_roomReservationTimeslice(
- $ao[$n]->getBegin(), $ao[$n]->getEnd()));
- }
- }
- $this->oCfg->writeConfig();
- }
- }
- }
- }
-
- /***************************************************************************/
- /**
- * @}
- * @name Access to attributes
- * @{
- */
-
- /**
- * Set the action to be done (GET data)
- * @param $c (constant) Action. See @ref timeslicelistbox_actions.
- */
- protected function setAction($c) { $this->cAction = intval($c); }
-
- /**
- * Set the beginning for a new timeslice (GET data)
- * @param $s (string)
- */
- protected function setNewBegin($s) { $this->sNewBegin = $s; }
-
- /**
- * Set the beginning for a new timeslice (GET data)
- * @param $s (string)
- */
- protected function setNewEnd($s) { $this->sNewEnd = $s; }
-
- /**
- * Get the action to be done (GET data). See @ref timeslicelistbox_actions.
- * @return constant
- */
- function getAction() { return $this->cAction; }
-
- /**
- * Get the beginning for a new timeslice (GET data)
- * @return string
- */
- public function getNewBegin() { return $this->sNewBegin; }
-
- /**
- * Get the beginning for a new timeslice (GET data)
- * @return string
- */
- public function getNewEnd() { return $this->sNewEnd; }
-
- /***************************************************************************/
- /**
- * @}
- * @name Output
- * @{
- */
-
- /**
- * Actually show the control
- * @return void
- */
- public function doShow() {
- TreeView(array(_c("room-reservation:Begin"), _c("room-reservation:End")));
-
- // addition form
- printf("<form method='get'>");
- hidden("mod_roomReservationTimesliceListBox[action]", "add");
- TreeViewTitle(_("Add"));
-
- $sMessages = $this->getMessages();
- if(trim($sMessages) != "") {
- TreeViewLine($sMessages);
- }
-
- TreeViewLine(array(sprintf("<%s name='mod_roomReservationTimesliceListBox".
- "[begin]' value='%s' size='8'/>", $GLOBALS["stdedt"],
- $this->getNewBegin()), sprintf("<%s name='".
- "mod_roomReservationTimesliceListBox[end]' value='%s' size='8'/> <%s ".
- "name='mod_roomReservationTimesliceListBox[submit]' value='%s' />",
- $GLOBALS["stdedt"], $this->getNewEnd(), $GLOBALS["stdbtn"], _("Add"))));
- echo "</form>\n";
-
- // deletion form
- TreeViewTitle(_c("room-reservation:Periods"));
- $aoTs = $this->oCfg->getTimeslices();
- if(count($aoTs) > 0) {
- echo "<form action='?mod_roomReservationTimesliceListBox[action]=delete' ".
- "method='post'>";
- $i = 0;
- foreach($aoTs as $oTs) {
- $sBox = sprintf("<input type='hidden' ".
- "name='mod_roomReservationTimesliceListBox[l][%d]' value='0' />".
- "<%s name='mod_roomReservationTimesliceListBox[l][%d]' value='1' />",
- $i, $GLOBALS["smlchk"], $i);
- // Note: we have only GMT timestamps in the timeslice objects
- TreeViewLine(array($sBox . gmstrftime(_("%#I:%M %p"), $oTs->getBegin()),
- gmstrftime(_("%#I:%M %p"), $oTs->getEnd())));
- $i++;
- }
- // toolbar
- printf("<tr><td class='tbbtm' colspan='%d'>", $GLOBALS["treeview_cols"]);
- CheckCombo();
- printf("<%s name='mod_roomReservationTimesliceListBox[submit]' ".
- "value='%s' />", $GLOBALS["stdbtn"], _("Delete"));
- echo "</td></tr>\n";
- } else {
- TreeViewEmpty();
- }
-
- echo "</form>\n";
- _TreeView();
- }
- /** @} */
-}
-?>
\ No newline at end of file