<?
	/** Biblioteka sesji.
	 * @author Michał Malinowski
	 * @package XPDefault
	 */

	/** */
	if ( defined( '_SESSION_INC' ) ) return;
	define( '_SESSION_INC', 1 );
	/** Prefix zmiennych sesyjnych.
	 */
	define( 'SESSION_CHARS', "__" );

	/** Klasa zarządzająca sesją.
	 *
	 * Zmienne sesyjne przychowywane są oddzielnie od pozostałych zmiennych.
	 * Należy pamiętać o pozostawieniu zmiennych zaczynających się od '__' w spokoju.<br>
	 * Przy starcie tworzony jest nowy obiekt $sess. Przez niego należy odwoływać się do zmiennych sesyjnych!
	 * @author Michał Malinowski
	 * @package XPDefault
	 * @version 0.4
	 * @todo Poprawić bezpieczeństwo sesji
	 */
	class CSession {
		function clear() {
			foreach($GLOBALS as $key => $value) {
				if (substr($key, 0, 2) == SESSION_CHARS) {
					unset($GLOBALS[$key]);
				}
			};
		}
		/** Konstuktor przywraca sesję.
		 */
		function CSession() {
			$this->clear();
			session_start();
		}
		function checkName(&$name) {
			if (substr($name, 0, 2) != SESSION_CHARS)
				$name = SESSION_CHARS . $name;
		}
		function name($name) {
			if (substr($name, 0, 2) != SESSION_CHARS)
				return (SESSION_CHARS . $name);
			return ($name);
		}
		/** Sprawdzenie czy funkcja jest dostępna w sesji.
		 *
		 * @param string $name nazwa zmiennej
		 * @return bool
		 */
		function is_set($name) {
			$this->checkName($name);
			return isset($_SESSION[$name]);
		}
		/** Pobranie referencji do zmiennej sesyjnej
		 *
		 * Szczególnie użyteczne przy operowaniu na tablicach w sesji.
		 * @param string $name nazwa zmiennej
		 * @param string $row wiersz w tablicy dwuwymiarowej
		 * @param string $col kolumna w tablicy dwuwymiarowej
		 * @return mixed
		 */
		function &ref($name, $row = '', $col = '') {
			$this->checkName($name);
			if (!isset($_SESSION[$name]))
				return;
			$ret = &$_SESSION[$name];
			if (!empty($row))
				$ret = &$ret[$row];
			if (!empty($col))
				$ret = &$ret[$col];
			return $ret;
		}
		/** Przypisanie wartości na zmienną sesyjną.
		 *
		 * Jeśli zmienna nie istnieje, zostanie utworzona.
		 * @param string $name nazwa zmiennej
		 * @param string $val wartość
		 * @return mixed
		 */
		function set($name, $val = "") {
			$this->checkName($name);
			$_SESSION[$name] = $val;
		}

		/** Przypisanie wartości na zmienną sesyjną, która jest tablicą.
		 *
		 * Jeśli zmienna nie istnieje, zostanie utworzona.
		 * @param string $name nazwa zmiennej
		 * @param string $row wiersz w tablicy
		 * @param string $val wartość
		 * @return mixed
		 */
		function setTab($name, $row, $val) {
			$this->checkName($name);
			$_SESSION[$name][$row] = $val;
		}
		/** Przypisanie wartości na zmienną sesyjną, która jest tablicą dwuwymiarową.
		 *
		 * Jeśli zmienna nie istnieje, zostanie utworzona.
		 * @param string $name nazwa zmiennej
		 * @param string $row wiersz w tablicy dwuwymiarowej
		 * @param string $col kolumna w tablicy dwuwymiarowej
		 * @param string $val wartość
		 * @return mixed
		 */
		function setTab2($name, $row, $col, $val) {
			$this->checkName($name);
			$_SESSION[$name][$row][$col] = $val;
		}
		/** Usunięcie zmiennej z sesji.
		 * @param string $name nazwa zmiennej
		 */
		function del($name) {
			$this->checkName($name);
			$_SESSION[$name] = "";
			unset($_SESSION[$name]);
		}
		/** Pobranie wartości zmiennej sesyjnej.
		 * @param string $name nazwa zmiennej
		 * @return mixed
		 */
		function get($name) {
			$this->checkName($name);
			if (!isset($_SESSION[$name]))
				return;
			return ($_SESSION[$name]);
		}
		/** Pobranie wartości z tablicy, która jest zmienną sesyjną.
		 * @param string $name nazwa zmiennej
		 * @param string $row wiersz w tablicy
		 * @return mixed
		 */
		function getTab($name, $row) {
			$this->checkName($name);
			if (!isset($_SESSION[$name]))
				return;
			return ($_SESSION[$name][$row]);
		}
		/** Pobranie wartości z tablicy dwuwymiarowej, która jest zmienną sesyjną.
		 * @param string $name nazwa zmiennej
		 * @param string $row wiersz w tablicy dwuwymiarowej
		 * @param string $col kolumna w tablicy dwuwymiarowej
		 * @return mixed
		 */
		function getTab2($name, $row, $col) {
			$this->checkName($name);
			if (!isset($_SESSION[$name]))
				return;
			return ($_SESSION[$name][$row][$col]);
		}
		/** Zakończenie sesji - usunięcie wszystkich zmiennych sesyjnych.
		 */
		function destroy() {
			session_unset();
			session_destroy();
		}
		/** Sprawdzanie uprawnień zalogowanej osoby
		 *
		 * Jeśli nie podano żadnych uprawnień do sprawdzenia, sprawdzane jest tylko, czy ktoś jest zalogowany.
		 * @param string $who rodzaj uprawnień: ["Stud" | "Asys" | "Wykl" | "Oper" | "Admin"]
		 * @return bool
		 */
		function isLoged($who = "") {
			if ($who)
				return ($this->get($who) == true);
			else
				return ($this->get("login") == true);
		}
		/** Logowanie osoby z podaniem uprawnień
		 *
		 * Jeśli nie podano żadnych uprawnień to osoba jest tylko logowana.
		 * @param string $who rodzaj uprawnień: ["Stud" | "Asys" | "Wykl" | "Oper" | "Admin"]
		 */
		function login($who = "") {
			$this->set("login", true);
			if ($who)
				$this->set($who, true);
		}
		/** Funkcja tworząca hiperłącze.
		 * @param string $str napis w linku
		 * @param string $param parametry strony
		 * @param string $name nazwa linku
		 * @return string
		 */
	}

	$sess = new CSession;
?>
