public static void AddAuthor(string url)
        {
            SetStatus("Добавление автора...");

            if (!url.EndsWith("indexdate.shtml"))
                url = (url.EndsWith("/")) ? url + "indexdate.shtml" : url + "/indexdate.shtml";
            byte[] buffer;
            WebClient client = new WebClient();
            string error = "Страничка не входит в круг наших интересов.";
            try
            {
                buffer = WEB.downloadPageSilent(client, url);
                string page = WEB.convertPage(buffer);
                int si = page.IndexOf('.', page.IndexOf("<title>")) + 1;
                DateTime updateDate = GetUpdateDate(page);
                if (updateDate != DateTime.MinValue)
                {
                    string authorName = page.Substring(si, page.IndexOf('.', si) - si);
                    if (FindAuthor(url) != null)
                    {
                        error = authorName + " уже присутствует в списке";
                        throw new Exception();
                    }
                    Author author = new Author() { Name = authorName, IsNew = false, UpdateDate = updateDate, URL = url };
                    authors.Add(author);
                    // запоминаем информацию со странички автора
                    UpdateAuthorInfo(page, author);
                    // сортируем данные по дате
                    Sort();
                    // сохраняем конфиг
                    SaveConfig();
                    SetStatus("Добавлен: " + author.Name);
                }
                else
                    SetStatus(error);

            }
            catch (Exception)
            {
                SetStatus(error);
            }
        }
        private static bool UpdateAuthor(Author author)
        {
            byte[] buffer;
            WebClient client = new WebClient();
            bool retValue = false;
            try
            {
                if (!author.URL.EndsWith("indexdate.shtml"))
                    author.URL = (author.URL.EndsWith("/")) ? author.URL + "indexdate.shtml" : author.URL + "/indexdate.shtml";

                buffer = WEB.downloadPageSilent(client, author.URL);
                if (buffer != null)
                {
                    retValue = UpdateAuthorInfo(WEB.convertPage(buffer), author);
                }
            }
            catch (Exception exception)
            {
            }
            return retValue;
        }
        public static bool UpdateAuthorInfo(string page, Author author)
        {
            Match match = Regex.Match(page, @"Обновлялось:</font></a></b>\s*(.*?)\s*$", RegexOptions.Multiline);
            DateTime date = DateTime.MinValue;
            bool retValue = false;
            if (match.Success)
            {
                string[] newDateStr = match.Groups[1].Value.Split('/');
                date = new DateTime(int.Parse(newDateStr[2]), int.Parse(newDateStr[1]), int.Parse(newDateStr[0]));
            }

            if (author != null)
            {
                #region проанализируем данные на страничке. если раньше их не загружали, то в любом случае не показываем, что есть обновления, просто заполняем данные
                MySortableBindingList<AuthorText> texts_temp = new MySortableBindingList<AuthorText>();
                MatchCollection matches = Regex.Matches(page, "<DL><DT><li>(?:<font.*?>.*?</font>)?\\s*(<b>(?<Authors>.*?)\\s*</b>\\s*)?<A HREF=(?<LinkToText>.*?)><b>\\s*(?<NameOfText>.*?)\\s*</b></A>.*?<b>(?<SizeOfText>\\d+)k</b>.*?<small>(?:Оценка:<b>(?<DescriptionOfRating>(?<rating>\\d+(?:\\.\\d+)?).*?)</b>.*?)?\\s*\"(?<Section>.*?)\"\\s*(?<Genres>.*?)?\\s*(?:<A HREF=\"(?<LinkToComments>.*?)\">Комментарии:\\s*(?<CommentsDescription>(?<CommentCount>\\d+).*?)</A>\\s*)?</small>.*?(?:<br><DD>(?<Description>.*?))?</DL>");
                if (matches.Count > 0)
                {
                    int cnt = 0;
                    foreach (Match m in matches)
                    {
                        AuthorText item = new AuthorText();
                        item.Description = NormalizeHTML(m.Groups["Description"].Value).Trim();
                        item.Genres = NormalizeHTML(m.Groups["Genres"].Value);
                        item.Link = m.Groups["LinkToText"].Value;
                        item.Name = NormalizeHTML(m.Groups["NameOfText"].Value);
                        item.Order = cnt;
                        item.SectionName = NormalizeHTML(m.Groups["Section"].Value).Replace("@","");
                        item.Size = int.Parse(m.Groups["SizeOfText"].Value);
                        texts_temp.Add(item);
                        cnt++;
                    }
                }
                if (author.Texts.Count > 0) // если раньше загружали проводим стравнение
                {
                    foreach (AuthorText txt in texts_temp)
                    {
                        bool bFound = false;
                        for (int i = 0; i < author.Texts.Count; i++)
                        {
                            if (txt.Description == author.Texts[i].Description
                                && txt.Name == author.Texts[i].Name
                                && txt.Size == author.Texts[i].Size)
                            {
                                bFound = true;
                                txt.IsNew = author.Texts[i].IsNew;// переносим значение isNew в новый массив, чтобы не потерять непрочитанные новые тексты
                                break;
                            }
                        }
                        if (!bFound)
                        {
                            txt.IsNew = author.IsNew = retValue = true;// да, автор обновился
                            if (date <= author.UpdateDate) // поменяем дату на сегодняшнюю, если дата обновления на страничке старее, чем зарегистрированная у нас
                                author.UpdateDate = DateTime.Today;
                            else // иначе ставим дату, указанную автором
                                author.UpdateDate = date;
                        }
                    }
                    // доп проверка по количеству произведений
                    if (texts_temp.Count != author.Texts.Count)
                    {
                        retValue = true;
                        if (date <= author.UpdateDate) // поменяем дату на сегодняшнюю, если дата обновления на страничке старее, чем зарегистрированная у нас
                            author.UpdateDate = DateTime.Today;
                        else// иначе ставим дату, указанную автором
                            author.UpdateDate = date;
                    }

                    // запоминаем новые данные
                }
                author.Texts = texts_temp;
                #endregion
            }
            return retValue;
        }