<?
	/** Biblioteka graficzna.
	 *
	 * Tutaj znajdują się wszystkie klasy ułatwiające prezentowanie informacji.
	 * @author Michał Malinowski & Łukasz Chmielewski
	 * @package XPDefault
	 */

	/** */
	if ( defined( '_GRAPH_CLASS_INC' ) ) return;
	define( '_GRAPH_CLASS_INC', 1 );

	/** Klasa obsługujące wyświetlanie tableli.
   *
	 * Teraz tabele obsługują podświetlanie, wystarczy włączyć setLight();
	 * @author Michał Malinowski & Łukasz Chmielewski
	 * @package XPDefault
	 * @version 0.2
	 * @todo Zwiększyć obiektowość! - stworzyć klasę CRow
	 * @todo Zintegrować z klasą CForm
	 */
	class CTable {
		/** @var array
		 */
		var $tab;
		/**#@+
		 * @var int
		 */
		var $lCol;
		var $lRow;
		var $numFields;
		var $actualField;
		var $printPos;
		var $actualRow;
		var $rowNum;
		/**#@-*/

		/** Konstuktor rozpoczyna tabelę.
		 *
		 * Podanie dodatniej ilości kolumn w konstruktorze jest równoznaczne z automatycznym podziałem na wiersze.<br>
		 * W przypadku podania 0 lub false wymagane jest ręczne podawanie końców wierszy.
		 * @param int $fields ilość kolumn w tabeli
		 * @param string $class klasa css tabeli
		 * @param string $other inne ustawienia tabeli (w html'u)
		 */
		function CTable ($fields, $class = "", $other = "") {
			$this->numFields = $fields;
			$this->tab = array();
			$this->printPos = $this->actualRow = $this->actualField = 0;
			$this->rowNum = 1;
			$this->tab[++$this->actualRow] = "<table class=\"$class\"" . " $other" . ">\n<tr>";
		}
		/** Wypisanie wczyśniej dodanych wierszy.
		 */
		function tprint() {
			while ($this->printPos < $this->actualRow) {
				printf("%s\n", $this->tab[++$this->printPos]);
			}
			$this->tab = array();
			$this->printPos = $this->actualRow = 0;
		}
		/** Wypisanie pozostałych wierszy oraz zamknięcie tabeli.
		 * Jest to ostatnia metoda wywoływana w obiekcie, później operacje są zabronione.
		 */
		function close() {
			$this->tprint();
			printf("</tr></table>\n");
		}
		/** Dodanie nowej komorki.
		 *
		 * Nowa komorka jest tylko zapamiętywana, aż do wywyołania funkcji tprint().
		 * @param string $text zawartość tekstowa komórki
		 * @param string $class klasa css komórki
		 * @param string $other inne ustawienia komórki (w html'u)
		 */
		function addField($text, $class = "", $other = "") {
			$this->actualField++;
			if (!empty($this->numFields) && $this->actualField > $this->numFields) {
				$this->actualField = 1;
				$this->rowNum++;
				$trStr = "</tr><tr>\n";
			}
			if ($this->lRow || $this->lCol) {
				$strBgColor = sprintf("bgcolor=\"#%x%x%x\"", 255 - $this->lCol * ($this->actualField % 2) - $this->lRow * ($this->rowNum % 2), 255 - $this->lCol * ($this->actualField % 2) - $this->lRow * ($this->rowNum % 2), 255 - $this->lCol * ($this->actualField % 2) - $this->lRow * ($this->rowNum % 2));
			}
			$this->tab[++$this->actualRow] = $trStr . "<td class=\"$class\" $other $strBgColor>$text</td>";
		}
		/** Dodanie nowej komorki oraz wypisanie dotychczasowych, spamiętanych komórek.
		 * @param string $text zawartość tekstowa komórki
		 * @param string $class klasa css komórki
		 * @param string $other inne ustawienia komórki (w html'u)
		 */
		function printField($text, $class = "", $other = "") {
			$this->addField($text, $class, $other);
			$this->tprint();
		}
		/** Utworzenie nowego wiersza.
		 *
		 * Funkcja ta jest wykorzystywana przy ręcznym kończeniu wierszy w tabeli.
		 */
		function newRow() {
			$this->tab[++$this->actualRow] = "</tr><tr>\n";
		}

		/** Ustawianie podświetlanie tabeli.
		 *
		 * W przypadku podświetlania tabeli nie można używać stylów, które przedefiniowują kolor.
		 * @param int $row jaskrawość podświetlenia wierszy (dobre dla ok. 8)
		 * @param int $col jaskrawość podświetlenia kolumny (dobre dla ok. 8)
		 */
		function setLight($row = 10, $col = false) {
			if ($this->actualField)
				$this->rowNum = 0;
			else
				$this->rowNum = 1;
			$this->lRow = $row;
			$this->lCol = $col;
		}
	}

	/** Klasa obsługujące wypisywanie formularzy.
	 *
	 * Obiekty tej klasy nic nie przechowują, odrazu wypisują lub zwracają tekst.
	 * Podwójne metody operujące na polach wymagane są do współpracy z klasą CTable.
	 * @author Michał Malinowski
	 * @package XPDefault
	 * @version 0.1
	 * @todo Zintegrować z klasą CTable
	 * @todo Poszerzyć klasę o Buttony i inne pola
	 * @todo Wymyślić lepszy sposób przetwarzania formularzy :)
	 */
	class CForm {
		/** Konstuktor rozpoczyna formularz (od razu wypisuje).
		 * @param string $method sposób przesyłania danych z formularza: ["post" | "get"]
		 * @param string $other inne ustawienia formularza (w html'u)
		 */
		function CForm ($method = "post", $other = "") {
			printf("<form method=\"$method\" $other action=\"./index.php\">\n");
		}

		/** Wypisanie pozostałych wierszy oraz zamknięcie formularza.
		 * Jest to ostatnia metoda wywoływana w obiekcie, później operacje są zabronione.
		 */
		function close() {
			printf("</form>\n");
		}
		/** Wypisanie nowego pola w formularzu.
		 * @param string $name nazwa pola
		 * @param string $type typ pola
		 * @param string $other inne ustawienia input'a (w html'u)
		 */
		function input($name, $type = "text", $other = "") {
			printf("<input name=\"$name\" type=\"$type\" $other>\n");
		}
		/** Zwrócenie tekstu, który jest nowym polem w formularzu.
		 * @param string $name nazwa pola
		 * @param string $type typ pola
		 * @param string $other inne ustawienia input'a (w html'u)
		 * @return string
		 */
		function inputText($name, $type = "text", $other = "") {
			return ("<input name=\"$name\" type=\"$type\" $other>\n");
		}
		/** Wypisanie nowego pola w formularzu: obrazka - button'a.
		 * @param string $name nazwa pola
		 * @param string $src ścieżka do obrazka
		 * @param string $other inne ustawienia input'a (w html'u)
		 */
		function img($name, $src, $other = "") {
			printf("<input name=\"$name\" type=\"image\" src=\"$src\" $other>\n");
		}
		/** Zwrócenie tekstu, który jest nowym polem w formularzu: obrazka - button'a.
		 * @param string $name nazwa pola
		 * @param string $src ścieżka do obrazka
		 * @param string $other inne ustawienia input'a (w html'u)
		 * @return string
		 */
		function imgText($name, $src, $other = "") {
			return ("<input name=\"$name\" type=\"image\" src=\"$src\" $other>\n");
		}
		/** Ustawienie zmiennej xexepage w formularzu.
		 * @param string $value nazwa strony xexepage
		 */
		function xexepage($value) {
			printf("<input name=\"xexepage\" type=\"hidden\" value=\"$value\">\n");
		}
		/** Ustawienie zmiennej xpage w formularzu.
		 * @param string $value nazwa strony xpage
		 */
		function xpage($value) {
			printf("<input name=\"xpage\" type=\"hidden\" value=\"$value\">\n");
		}

		function select($name, $first, $last, $default=0){
		    $res = "<select name='$name'>";
		    for ($i=$first; $i<=$last; $i++) {
			if ("$i"=="$default")
			  $res .= "<option value=$i selected>$i";
			else
			  $res .= "<option value=$i>$i";
		    }
		    $res .= "</select>";
		    return $res;
		}
		function getMonth($name="month", $default=1) {
		    $res = "<select name='$name'>";
		    for ($i=1; $i<=12; $i++) {
			$m_name = date("F", mktime(0,0,0, $i+1, 0, 0));
			if ($i==$default)
			  $res .= "<option value=$i selected>$m_name";
			else
			  $res .= "<option value=$i>$m_name";
		    }
		    $res .= "</select>";
		    return $res;
		}

		/** Funkcja umożliwiająca łatwe pobranie daty i godziny
		*
		* @param integer $year domyślny rok
		* @param integer $month domyślny miesiąc
		* @param integer $day domyślny dzień miesiąca
		* @param integer $hour domyślna godzina
		* @param integer $minute domyślna minuta
		* @param integer $second domyślna sekunda
		* @todo korzystając z funkcji należy sprawdzić poprawność daty, gdyż formularz umożliwia wprowadzenie 31 dnia każdego miesiąca.
		* @return string
		*/
		function getdate($year="", $month="", $day="", $hour="", $minute="", $second=""){
		    if ($year) $akt_year=$year;
		    else $akt_year=date("Y");
		    if ($month) $akt_month=$month;
		    else $akt_month=date("n");
		    if ($day) $akt_day=$day;
		    else $akt_day=date("d");
		    if ($hour) $akt_hour=$hour;
		    else $akt_hour=date("G");
		    if ($minute) $akt_minute=$minute;
		    else $akt_minute=date("i");
		    if ($second) $akt_second=$second;
		    else $akt_second=date("s");

		    $result .= $this->select("year", $akt_year-1, $akt_year+3, $akt_year);
		    $result .= $this->getMonth("month", $akt_month);
		    $result .= $this->select("day", 1, 31, $akt_day);
		    $result .= $this->select("hour", 0, 23, $akt_hour);
		    $result .= $this->select("minutes", 0, 59, $akt_minute);
		    $result .= $this->select("seconds", 0, 59, $akt_second);
		    
		    return $result;
		}

	    /** Funkcja umożliwiająca łatwe pobranie dat (z godzinami)
	    *
	    * @param integer $year domyślny rok
	    * @param integer $month domyślny miesiąc
	    * @param integer $day domyślny dzień miesiąca
	    * @param integer $hour domyślna godzina
	    * @param integer $minute domyślna minuta
	    * @param integer $second domyślna sekunda
	    * @param text $sufix sufix nazw zmiennych umożliwiający umieszczenie kilku zapytań o datę w jednym formularzu
	    * @todo korzystając z funkcji należy sprawdzić poprawność daty, gdyż formularz umożliwia wprowadzenie 31 dnia każdego miesiąca.
	    * @return string
	    */
            function getdate2($year="", $month="", $day="", $hour="", $minute="", $second="", $sufix=""){
    	        if ($year) $akt_year=$year;
        	else $akt_year=date("Y");
	        if ($month) $akt_month=$month;
        	else $akt_month=date("n");
	        if ($day) $akt_day=$day;
        	else $akt_day=date("d");
	        if ($hour) $akt_hour=$hour;
    	        else $akt_hour=date("G");
	        if ($minute) $akt_minute=$minute;
    	        else $akt_minute=date("i");
	        if ($second) $akt_second=$second;
        	else $akt_second=date("s");
    
    	        $result .= $this->select("year$sufix", $akt_year-1, $akt_year+3, $akt_year);
		$result .= $this->getMonth("month$sufix", $akt_month);
	        $result .= $this->select("day$sufix", 1, 31, $akt_day);
        	$result .= $this->inputText("time$sufix", "text", "size='6' value='$akt_hour:$akt_minute:$akt_second'");
    
		return $result;
    	    }
	    
	    /** funkcja zwracająca przycisk wyboru (typu radio)
	    * @param string $name - nazwa parametru
	    * @param string $value - wartość jaką będzie miał parametr w przypadku zaznaczenia go przez użytkownika
	    * @param string $state - umożliwia dodatkowe opcje, główne zastosowanie przy odznaczeniu początkowej wartości (wartość "checked")
	    * @return string
	    */
	    function getRadioButton($name, $value, $state="") {
		return "<input TYPE='radio' NAME='$name' VALUE='$value' $state>";
	    }
	    
	    /** funkcja zwracająca trzy przyciski - wyboru zakresu sprawdzania
	    * @param string $name - nazwa parametru
	    * @param string $sep - separator (tylko między przyciskami)
	    * @param string $default -  wartość domyślna parametru
	    * @return string
	    */
	    function getCheckRange($name, $sep, $default="0"){
		if ($default=="0") $f1="checked";
		if ($default=="1") $f2="checked";
		if ($default=="3") $f3="checked";
		$retVal = " ";
		$retVal .= $this->getRadioButton($name, "0", $f1);
		$retVal .= "brak sprawdzania $sep";
		$retVal .= $this->getRadioButton($name, "1", $f2);
		$retVal .= "w odrębie grupy $sep ";
		$retVal .= $this->getRadioButton($name, "3", $f3);
		$retVal .= "w odrebie roku ";
		return $retVal;
	    }

	    /** funkcja tworząca w formularzu zapytanie o poziom sprawdzania
	    * @param string $name_counting - nazwa parametru (typu bool) mówiącego czy ma być liczenie słów kluczowych
	    * @param string $name_diff - nazwa parametru (typu bool) mówiącego czy ma być robiony diff
	    * @param string $name_range - nazwa parametru mówiącego o głębokości sprawdzania
	    * @param string $sep - separator (tylko między kolejnymi elementami)
	    * @param string $default -  wartość domyślna parametru
	    * @return string
	    */
	    function getCheckLevel($name_counting, $name_diff, $name_range, $sep, $default="0"){

		$bits  = $default % 4;
		$depth = floor($default / 4);

		if (($bits%2)=="1") $counting="checked";
		if (floor($bits/2)=="1") $making_diff="checked";

		$retVal = "Liczenie słów kluczowych ";
		$retVal .= $this->inputText($name_counting, checkbox, $counting);
		$retVal .= "$sep Stosowanie diff'a ";
		$retVal .= $this->inputText($name_diff, checkbox, $making_diff);
		$retVal .= "$sep Głębokość sprawdzania: ";
		$retVal .= $this->select($name_range, 0, 9, $depth);
		return $retVal;
	    }
	}

	/** Klasa ułatwiająca wypisywanie hiperłączy.
	 *
	 * Szczególnie przydatna przy wyświetlaniu wielu linków do tej samej strony z różnymi parametrami.
	 * @author Łukasz Chmielewski & Michał Malinowski
	 * @package XPDefault
	 * @version 0.3
	 */
	class CLink {
		var $pream;
		var $param;

		/** Konstruktor ustawia strony wskazywane przez link. W tym miejscu można dodać inne opcje znacznika <a href>.
		 * @param string $xpage docelowa strona xpage linku
		 * @param string $xexepage docelowa strona xexepage linku
		 * @param string $other inne opcje <a href>
		 */
		function CLink ($xpage = "", $xexepage = "", $other ="") {
			if ($xpage) {
				$xpage = "xpage=" . $xpage;
			}
			if ($xexepage)
				$xexepage = "&xexepage=" . $xexepage;
			$this->pream = "<a $other href=\"./index.php?$xpage$xexepage";
		}

		/** Metoda dodająca parametr do linku.
		 * @param string $param parametr linku
		 * @param stirng $value przekazywana wartość
		 */
		function addParam($param, $value) {
			$this->param .= "&$param=$value";
		}

		/** Metoda czyszcząca parametry.
		 */
		function clearParam() {
			$this->param = "";
		}

		/** Metoda najpierw czyści wszystkie parametry, a potem dodaje podany parametr do linku (jako pierwszy parametr).
		 * @param string $param parametr linku
		 * @param stirng $value przekazywana wartość
		 */
		function addFirstParam($param, $value) {
			$this->clearParam();
			$this->addParam($param, $value);
		}

		/** Metoda zwracająca napis będący hiperłączem.
		 * @param string $text napis znajdujący się w linku
		 * @return string
		 */
		function get($text) {
				return ($this->pream . $this->param . "\">" . $text . "</a>");
		}

		/** Metoda wypisująca napis, który jest hiperłączem.
		 * @param string $text napis znajdujący się w linku
		 */
		function lprint($text) {
			printf("%s%s\">%s</a>", $this->pream, $this->param, $text);
		}
	}



	/** Klasa obsługujące wypisywanie formularzy z checkboxami.
  	 *
	 * Oparta o klase CForm Michala Malinowskiego
	 *
	 * Obiekty tej klasy nic nie przechowują, odrazu wypisują lub zwracają tekst.
	 * Podwójne metody operujące na polach wymagane są do współpracy z klasą CTable.
	 * @author Maciej Osinski
	 * @package XPDefault
	 * @version 0.1
	 */
	class CChkForm extends CForm {
		/** Konstuktor rozpoczyna formularz (od razu wypisuje).
		 * @param string $method sposób przesyłania danych z formularza: ["post" | "get"]
		 * @param string $other inne ustawienia formularza (w html'u)
		 */
		function CChkForm ($method = "post", $other = "") {
			printf("<form method=\"$method\" $other action=\"./index.php\">\n");
		}

		/** Wypisanie nowego pola w formularzu.
		 * @param string $name nazwa pola
		 * @param string $type typ pola
		 * @param string $other inne ustawienia input'a (w html'u)
		 */
		function input($name, $type = "checkbox", $other = "") {
			printf("<input name=\"$name\" type=\"$type\" $other>\n");
		}
		/** Zwrócenie tekstu, który jest nowym polem w formularzu.
		 * @param string $name nazwa pola
		 * @param string $type typ pola
		 * @param string $other inne ustawienia input'a (w html'u)
		 * @return string
		 */
		function inputText($name, $type = "checkbox", $other = "") {
			return ("<input name=\"$name\" type=\"$type\" $other>\n");
		}

	}


?>
