/// <summary>
        /// Metoda vstoupí do zadané místnosti. Vstup v tomto případe znamená, že metoda odešle na introstránku místnosti
        /// souhlas s podmínkami.
        /// </summary>
        /// <param name="rid">Room ID</param>
        /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující
        ///             Ok = false
        ///             Err = znění chyby
        ///             Res = null
        ///          Nedojde-li k chybě, bude objekt obsahovat následující
        ///             Ok = true
        ///             Err = ""
        ///             Res = True v případě, že se vstup podaří (=> přesměrování na stránku s místností), False v případě, že se nepodaří.
        /// </returns>
        public State enterRoom(string rid)
        {
            State res = new State();

            //link na introstránku je
            //http://xchat.centrum.cz/ssk/room/intro.php?rid=*******
            String introUrl = "http://xchat.centrum.cz/" + SessionKey + "/room/intro.php?" + rid;

            //je nutné odeslat POST packet s hodnotami
            //_btn_enter=wanna_enter_man?
            //btn_enter=Vstoupit do místnosti
            //disclaim=on
            //sexwarn=1  - kvůli erotickým místnostem
            string httpContent = "_btn_enter=wanna_enter_man?&btn_enter=Vstoupit do mistnosti&disclaim=on&sexwarn=1";

            HttpWebRequest req = makeRequest(introUrl, httpContent,"POST");

            //pokud vše proběhne v pořádku, bude v response.Responseuri odkaz http://xchat.centrum.cz/ssk/modchat/room/nazev-mistnosti
            WebResponse response = req.GetResponse();

            Logger.dbgOut("Response URI: " + response.ResponseUri);

            Stream dataStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(dataStream);
            string responseData = sr.ReadToEnd();

            return res;
        }
        /// <summary>
        /// Metoda získá náhled profilové fotky uživatele. Pokud není nikdo přihlášený, vrátí null.
        /// </summary>
        /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující
        ///             Ok = false
        ///             Err = znění chyby
        ///             Res = null
        ///          Nedojde-li k chybě, bude objekt obsahovat následující
        ///             Ok = true
        ///             Err = ""
        ///             Res = Stream dat s imagem. Pokud není nikdo přihlášený, null.
        /// </returns>
        public State getProfilePhotoPreviewStream()
        {
            State res = new State();
            if (LogedIn)
            {
                //vytvoření requestu na xchat.centrum.cz/SSK/index.php
                String uri = "http://xchat.centrum.cz/"+SessionKey+"/index.php";
                HtmlDocument page= new HtmlDocument();

                //načtení stránky
                WebClient wc = new WebClient();
                String htmlString = wc.DownloadString(uri);
                page.LoadHtml(htmlString);

                //parsování
                //vybrat <div id="hlavicka"> -> <span class="float2"> -> <img src="tohleto">

                HtmlNode img = page.DocumentNode.SelectSingleNode("//div[contains(@id,'hlavicka')]")
                               .SelectSingleNode(".//span[contains(@class,'float2')]")
                               .SelectSingleNode(".//img");

                //url obrázku
                String imgSrc = img.Attributes["src"].Value;

                //načtení streamu dat
                var req = WebRequest.Create(imgSrc);
                var resp = req.GetResponse();
                res.Res = resp.GetResponseStream();

                return res;
            }

            //pokud neni nikdo prhlaseny vrati null
            else
            {
                return res;
            }
        }
        /// <summary>
        /// Meto slouží k přihlášení do xchatu. Výsledkem je session key, přes který se dá přistupovat
        /// do sekcí pro přihlášené uživatele.
        /// </summary>
        /// <param name="name">Uživateské jméno</param>
        /// <param name="pass">Uživatelské heslo</param>
        /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující
        ///             Ok = false
        ///             Err = znění chyby
        ///             Res = null
        ///          Nedojde-li k chybě, bude objekt obsahovat následující
        ///             Ok = true
        ///             Err = ""
        ///             Res = session key, typováno na string.
        /// </returns>
        public State logIn(String name, String pass)
        {
            State res = new State();

            String sskey = "";
            //byte array s parametry url, js, name, pass, x, y
            //x, y můžou být 0, url nějaká url z xchatu, stačí /index.php a js=1
            string httpContent = "url=" + XCHAT_URI + "/index.php&js=1&x=0&y=0&name=" + name + "&pass="******":", "%3A");
            httpContent.Replace("/", "%2F");
            HttpWebRequest request = makeRequest(XCHAT_URI + "/login/",httpContent,"POST");

            //jako odpoveď přijde http packet, kterej bude obsahovat url s chybou/ssklíčem
            //v response je tato url rozdělena na segmenty -> z těchto segmentů získat potřebné věci
            WebResponse response = request.GetResponse();
            Logger.dbgOut(((HttpWebResponse)response).StatusDescription);

            //když nebude login úspěšný, v response.responseuri.segments[1] bude "login/", a v query bude "...err=kod_chyby..."
            //jinak je v segments[1] sskey+"/"
            String[] responseUri = response.ResponseUri.Segments;
            if (responseUri.Length >= 2)
            {
                //chyba při přihlášení, třeba zjišťovat v query
                if(responseUri[1] == "login/")
                {
                    Console.WriteLine("Chyba");
                }

                //máme session key
                else if (responseUri[1].Length == SSKEY_LENGTH+1 )
                {
                    sskey = responseUri[1].Replace("/","");
                    SessionKey = sskey;
                    Username = name;
                    LogedIn = true;
                }
            }
            response.Close();

            res.Res = sskey;
            return res;
        }
        /// <summary>
        /// Metoda získá zprávy pro zadanou místnost.
        /// </summary>
        /// <param name="rid">Room ID</param>
        /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující
        ///             Ok = false
        ///             Err = znění chyby
        ///             Res = null
        ///          Nedojde-li k chybě, bude objekt obsahovat následující
        ///             Ok = true
        ///             Err = ""
        ///             Res = List typovaný na Message.
        /// </returns>
        public State getMessages(string rid)
        {
            State res = new State();

            //url ktera vede primo na frame se zpravama
            //http://xchat.centrum.cz/ssk/modchat?op=roomtopng&rid=4030012&js=0
            String roomUri = "http://xchat.centrum.cz/" + SessionKey + "/modchat?op=roomtopng&"+rid+"&js=0";

            HtmlDocument page = new HtmlDocument();
            page.LoadHtml(getHtmlString(roomUri));

            /*zprávy ve framu jsou v elementu body a mají následující formát
             *  20:09:34 <font color="#150e97"><span class="umsg_room"><b>Merchant:</b> ahoj, mi se ještě neznáme. Já jsem Merchant </span></font><br />\n
                20:09:11 <font color="#000000"><span class="umsg_room"><b>Steward:</b> Ahoj</span></font><br />\n
                <font size="-2" class="systemtime">20:08:54 </font><font size="-2" class="systemtext">&quot;Uživatelka <b class="system in 10-0">Steward</b> vstoupila do místnosti&quot;</font><br />\n
                <font size="-2" class="systemtime">20:07:03 </font><font size="-2" class="systemtext">&quot;Uživatel <b class="system out">risa99</b> opustil  místnost&quot;</font><br />\n
             *
             * nejlehčí asi bude použít split('\n') a z jednotlivejch řádků pak vyparsovat potřebný věci
             *
             * když je první znak na řádce číslo, je to obyčejná zpráva od uživatele, s výjimkou prvního řádku - tam jsou před správou dva tagy font
             * řekněme, že ten kód se skoro určitě nebude měnit, takže prvních 86 znaků na prvním řádku můžu vynechat.
             *
             * když řádek začíná tagem font s class=systemtime, jedná se systémovou zprávu (kdo přišel/odešel z místnosti atp)
            */

            String[] rows = page.DocumentNode.SelectSingleNode("//body").InnerHtml.Split('\n');

            if (rows.Length > 0)
            {
                rows[0] = rows[0].Substring(81);

                List<Message> msgs = new List<Message>();

                foreach (String row in rows)
                {
                    //kdyby se tam připletly nějaký blbosti
                    if (row.Length < 8) { continue; }
                    Message msg = parseMessage(row);
                    if (msg != null) { msgs.Add(msg); }
                }

                res.Res = msgs;
            }

            return res;
        }