private static CasovyZlomek ZjistiZlomek(string sPopis)
        {
            CasovyZlomek zl          = new CasovyZlomek();
            string       sJmenovatel = csPolovina;

            int iPozice = sPopis.IndexOf(sJmenovatel);

            if (iPozice == -1)
            {
                sJmenovatel = csTretina;
                iPozice     = sPopis.IndexOf(sJmenovatel);
            }
            if (iPozice == -1)
            {
                sJmenovatel = csCtvrtina;
                iPozice     = sPopis.IndexOf(sJmenovatel);
            }
            if (iPozice == -1)
            {
                sJmenovatel = csLeta;
                iPozice     = sPopis.IndexOf(sJmenovatel);
            }
            if (iPozice == -1)
            {
                sJmenovatel = csJenPolovina;
                iPozice     = sPopis.IndexOf(sJmenovatel);
            }
            if (iPozice == -1)
            {
                return(zl);
            }
            zl.JmenovatelPopis = sJmenovatel;
            zl.Jmenovatel      = CasovyZlomek.JmenovatelPopisNaCislo(sJmenovatel);

            string sCitatel = null;

            if (sJmenovatel == csLeta)
            {
                sCitatel = sPopis.Substring(sPopis.IndexOf(sJmenovatel) - 2, 2);
            }
            else if (sJmenovatel == csJenPolovina)
            {
                sCitatel = "";
            }
            else
            {
                sCitatel = sPopis.Substring(sPopis.IndexOf(sJmenovatel) - 1, 2);
            }
            if (sCitatel.EndsWith("."))
            {
                sCitatel = sCitatel.Substring(0, sCitatel.Length - 1);
            }
            zl.CitatelPopis = sCitatel;
            if (sCitatel == "")
            {
                zl.Citatel = 0;
            }
            zl.Citatel = CasovyZlomek.CitatelPopisNaCislo(sCitatel);
            return(zl);
        }
        private Datace AnalyzujDataci2(string sSlovniPopis)
        {
            char[]        chOddelovace    = new char[] { '/', '–', ',' };
            var           dt              = new Datace(CultureInfo);
            List <string> glsCoObsahuje   = new List <string>();
            List <string> glsNeznamaSlova = new List <string>();

            ZjistiObsahANeznamaSlova(sSlovniPopis, ref glsCoObsahuje, ref glsNeznamaSlova);

            List <TextovyPrvek> gltpTextovePrvky = new TextovePrvky(sSlovniPopis);
            List <string>       glsNeznameVyrazy = new List <string>();

            foreach (TextovyPrvek tp in gltpTextovePrvky)
            {
                if (tp.Typ == TypTextovehoPrvku.Neurceno)
                {
                    glsNeznameVyrazy.Add(tp.Text);
                }
            }

            if (glsNeznameVyrazy.Count > 0)
            {
                dt.Upresneni = "neznámé výrazy (" + String.Join("; ", glsNeznameVyrazy.ToArray()) + ")";
                return(dt);
            }

            //if (glsNeznamaSlova.Count > 0) {
            //  dt.Upresneni = "neznámé výrazy (" + String.Join("; ", glsNeznamaSlova.ToArray()) + ")";
            //  return dt;
            //}

            string mstrSlovniPopis = sSlovniPopis;
            string sPopis          = mstrSlovniPopis;

            if (glsCoObsahuje.Contains(csOtaznik))
            {
                dt.Upresneni = csOtaznik;
                glsCoObsahuje.Remove(csOtaznik);
                sPopis = sPopis.Replace(csOtaznik, "").Trim();
            }

            string[] asRozhrani = null;
            if (sSlovniPopis.IndexOfAny(chOddelovace) > 0)
            {
                asRozhrani = sPopis.Split(chOddelovace);
            }

            if (glsCoObsahuje.Contains(csNebo))
            {
                asRozhrani = sPopis.Split(new string[] { csNebo }, StringSplitOptions.RemoveEmptyEntries);
            }
            if (asRozhrani != null)
            {
                string zacatek = asRozhrani[0].Trim();
                if (asRozhrani[1].Contains(csLeta) && !asRozhrani[0].Contains(csLeta))
                {
                    zacatek = zacatek + asRozhrani[1].Substring(asRozhrani[1].IndexOf(csLeta, StringComparison.Ordinal) + 1);
                }
                Datace dtZacatek = new Datace(zacatek.Trim(), CultureInfo);
                Datace dtKonec   = new Datace(asRozhrani[1].Trim(), CultureInfo);
                dt             = dtKonec;
                dt.NePredRokem = dtZacatek.NePredRokem;
                if (dtZacatek.Upresneni != null)
                {
                    if (dtKonec.Upresneni != null)
                    {
                        dt.Upresneni = String.Format("{0}; {1}", dtZacatek.Upresneni, dtKonec.Upresneni);
                    }
                    else
                    {
                        dt.Upresneni = dtZacatek.Upresneni;
                    }
                }

                return(dt);
            }

            if (glsCoObsahuje.Contains(csPrelom))
            {
                //vypreparovat první a druhé století
                sPopis     = sPopis.Remove(sPopis.IndexOf(csPrelom), csPrelom.Length + 1);
                asRozhrani = sPopis.Split(new string[] { " a " }, StringSplitOptions.RemoveEmptyEntries);
                dt.RelativniChronologie = 0;
                Datace dtKonec   = new Datace(asRozhrani[1], CultureInfo);
                Datace dtZacatek = new Datace();
                dtZacatek.Stoleti = dtKonec.Stoleti - cintStoLet;
                dtZacatek.RelativniChronologie = 9;
                dtZacatek.NePredRokem          = dtZacatek.Stoleti + (cintStoLet - cintPrelom);
                dt.Stoleti         = dtKonec.Stoleti;
                dt.PolovinaStoleti = dtKonec.PolovinaStoleti;
                dt.NePredRokem     = dtZacatek.NePredRokem;
                dt.NePoRoce        = dtZacatek.Stoleti + (cintStoLet + cintPrelom);
                dt.Upresneni       = csPrelom;
            }

            if (glsCoObsahuje.Count == 2 && glsCoObsahuje.Contains(csA) && glsCoObsahuje.Contains(csStoleti))
            {
                int iStoleti = ZjistiStoleti(sPopis);
                sPopis = sPopis.Replace(((iStoleti / cintStoLet) + 1).ToString() + csStoleti, "").Replace(csA, "").Trim();

                int iStoletiStart = ZjistiStoleti(sPopis);
                dt.Stoleti = iStoleti;
                dt.RelativniChronologie = 0;
                dt.PolovinaStoleti      = 0;
                dt.Desetileti           = 0;
                dt.NePredRokem          = iStoletiStart + 1;
                dt.NePoRoce             = iStoleti + cintStoLet;
                //dt.SlovniPopis = sSlovniPopis;
                return(dt);
            }

            if (glsCoObsahuje.Contains(csStoleti))
            {
                //vypreparovat století, analayzovat zbytek
                int iStoleti = ZjistiStoleti(sPopis);
                dt.Stoleti = iStoleti;

                sPopis = sPopis.Replace(((iStoleti / cintStoLet) + 1).ToString() + csStoleti, "").Trim();
                if (glsCoObsahuje.Contains(csLeta) ||
                    glsCoObsahuje.Contains(csPolovina) ||
                    glsCoObsahuje.Contains(csTretina) ||
                    glsCoObsahuje.Contains(csCtvrtina) ||
                    glsCoObsahuje.Contains(csJenPolovina))
                {
                    CasovyZlomek zl = ZjistiZlomek(sPopis);
                    sPopis = sPopis.Replace(zl.CitatelPopis + zl.JmenovatelPopis, "").Trim();

                    if (zl.Jmenovatel == 10)
                    {
                        dt.Desetileti      = zl.Citatel;
                        dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(dt.Desetileti * zl.Jmenovatel);
                        dt.NePredRokem     = dt.Stoleti + zl.Jmenovatel * (zl.Citatel == 1 ? 0 : zl.Citatel) + 1;
                        dt.NePoRoce        = dt.NePredRokem + zl.Jmenovatel;
                    }
                    else if (zl.Jmenovatel == 2 && zl.Citatel == -1)
                    {
                        dt.PolovinaStoleti      = 0;
                        dt.RelativniChronologie = 5;
                        dt.Upresneni            = csJenPolovina;

                        dt.NePredRokem = dt.Stoleti + (50) - cintJenPolovina + 1;
                        dt.NePoRoce    = dt.NePredRokem + 50;
                        //int desetileti = dt.NePoRoce - dt.Stoleti;
                        //dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(desetileti);
                    }
                    else
                    {
                        dt.Stoleti         = iStoleti;
                        dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(((cintStoLet / zl.Jmenovatel) * (zl.Citatel)));
                        dt.Desetileti      = ((cintStoLet / zl.Jmenovatel) * (zl.Citatel)) / 10;

                        dt.NePredRokem = dt.Stoleti + ((cintStoLet / zl.Jmenovatel) * (zl.Citatel - 1)) + 1;
                        dt.NePoRoce    = dt.Stoleti + ((cintStoLet / zl.Jmenovatel) * (zl.Citatel));

                        RelativniChronologieNaZakladeRoku(dt.NePoRoce);
                    }
                }
                else if (glsCoObsahuje.Count == 1)
                {
                    dt.RelativniChronologie = 0;
                    dt.NePredRokem          = dt.Stoleti + 1;
                    dt.NePoRoce             = dt.Stoleti + cintStoLet;
                }
            }
            if (sPopis == csZacatek)
            {
                dt.RelativniChronologie = 1;
                dt.NePredRokem          = dt.Stoleti;
                dt.NePoRoce             = dt.Stoleti + cintZacatekKonec;
                dt.Upresneni            = csZacatek;
                dt.Desetileti           = 2;
                dt.PolovinaStoleti      = 1;
                sPopis = sPopis.Replace(csZacatek, "").Trim();
            }
            if (sPopis == csKonec)
            {
                dt.NePoRoce             = dt.Stoleti + cintStoLet;
                dt.NePredRokem          = dt.Stoleti + cintStoLet - cintZacatekKonec;
                dt.RelativniChronologie = 9;
                dt.PolovinaStoleti      = 2;
                dt.Desetileti           = 9;
                dt.Upresneni            = csKonec;
                sPopis = sPopis.Replace(csKonec, "").Trim();
            }

            if (glsCoObsahuje.Contains(csPoRoce))
            {
                sPopis       = sPopis.Remove(sPopis.IndexOf(csPoRoce), csPoRoce.Length);
                dt.Upresneni = csPoRoce;
                int iRok;
                if (Int32.TryParse(sPopis, out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce    = dt.Rok + cintOkoloRoku; //TODO Tady by mělo být koncové datum, např. úmrtí autora
                    dt.NePredRokem = dt.Rok;
                }
            }
            if (glsCoObsahuje.Contains(csOkoloRoku))
            {
                sPopis       = sPopis.Remove(sPopis.IndexOf(csOkoloRoku), csOkoloRoku.Length);
                dt.Upresneni = csOkoloRoku;
                int iRok;
                if (Int32.TryParse(sPopis, out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce    = dt.Rok + cintOkoloRoku;
                    dt.NePredRokem = dt.Rok - cintOkoloRoku;
                    int desetileti = dt.NePoRoce - dt.Stoleti;
                    dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(desetileti);
                }
            }

            if (glsCoObsahuje.Contains(csPost))
            {
                sPopis       = sPopis.Remove(sPopis.IndexOf(csPost), csPost.Length + 1);
                dt.Upresneni = csPost;
                int iRok;
                if (Int32.TryParse(sPopis.Substring(0, 4), out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce = iRok;
                }
            }

            if (glsCoObsahuje.Contains(csAnte))
            {
                sPopis = sPopis.Remove(sPopis.IndexOf(csAnte), csAnte.Length + 1);
                if (!String.IsNullOrEmpty(dt.Upresneni))
                {
                    dt.Upresneni += "; " + csAnte;
                }
                else
                {
                    dt.Upresneni = csAnte;
                }
                int iRok;
                if (Int32.TryParse(sPopis.Substring(0, 4), out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce = iRok;
                }
            }

            if (glsCoObsahuje.Count == 1 && glsCoObsahuje.Contains(csA))
            {
                asRozhrani = sPopis.Split(new string[] { csA }, StringSplitOptions.RemoveEmptyEntries);

                if (asRozhrani != null)
                {
                    string zacatek = asRozhrani[0].Trim();
                    if (asRozhrani[1].Contains(csLeta) && !asRozhrani[0].Contains(csLeta))
                    {
                        zacatek = zacatek + asRozhrani[1].Substring(asRozhrani[1].IndexOf(csLeta, StringComparison.Ordinal) + 1);
                    }
                    Datace dtZacatek = new Datace(zacatek.Trim(), CultureInfo);
                    Datace dtKonec   = new Datace(asRozhrani[1].Trim(), CultureInfo);
                    dt             = dtKonec;
                    dt.NePredRokem = dtZacatek.NePredRokem;
                    if (dtZacatek.Upresneni != null)
                    {
                        if (dtKonec.Upresneni != null)
                        {
                            dt.Upresneni = String.Format("{0}; {1}", dtZacatek.Upresneni, dtKonec.Upresneni);
                        }
                        else
                        {
                            dt.Upresneni = dtZacatek.Upresneni;
                        }
                    }

                    return(dt);
                }
            }

            //jde pouze o rok
            if (glsCoObsahuje.Count == 0)
            {
                int      iRok;
                DateTime date;
                if (DateTime.TryParse(sPopis, CultureInfo, DateTimeStyles.None, out date))
                {
                    iRok = date.Year;
                    UrciDataciNaZakladeRoku(dt, iRok);
                }
                else if (Int32.TryParse(sPopis, out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                }
                // TODO: upozorňovat na neplatné údaje pomocí výjimek, které se na vhodné úrovni zachytí a vytvoří se popis, co je v dataci špatné nebo neznámé
            }
            return(dt);
        }