//************************************************************************
//*** Парсинг информации о фильме с сайта http://www.kinopoisk.ru      *** 
//***                                                                  ***
//*** Автор первых версий:  Александр Цапко                            ***
//*** E-Mail:               Alexandr@Tsapko.org.ua                     ***
//***                                                                  ***
//*** Добавления произвел:  Reset (http://www.videodb.info/forum_ru)   ***
//*** E-Mail:               pvd_ag@mail.ru                             ***
//************************************************************************

var
  createLink, formattedTime, miniPoster, LongDate, loadFee, loadExtraRole, simpleTitle, transRusOrigTitle, formattedURL, addLikeFilms2Links : Boolean;
  szPosterX, szPosterY, nationality, RusNames, ShowPersonAs, maxOpinion, maxOpinionURL, maxCharInOpinion, maxPersons, placeTimeSerial, maxStudios, maxStudiosInCat,
  optURL, optOrigTitle, optTitle, optAka, optYear, optCountry, optTagline, optGenre, optBudgetM, optMoneyWorldM, optFirstWorldM, optMPAA, optDescription, optRating, optRatingIMDB, optMoneyUSA, optMoneyRUS, optMoneyOther, optViewers, optBudgetU, optMarketing, optMoneyWorldU, optFirstRUS, optReleaseDVD, optReleaseBD, optTime, optFirstWorldU, optTop250, optCategory, optOpinion, optPrognosRating, optDoYouKnow, optDirector, optActor, optProducer, optScenario, optComposer, optOperator, optDouble, optManager, optDirectorDouble, optSites, optMakeStudio, optEffectStudio, optSaleStudio, optStudio, optTags, optConnection, optAward, optMoreAwards, optKinoCritic, optReview, optEpisode, optTimeSerial, optPosters, optCost, optLimitedWeekend, optFirstWeekend, optMaxCinema, optLimitedShow, optGeneralShow, optEndShow, optTimeShow, optNetAvails, optSoundtrack, optVersion, pgDoYouKnow, pgPersons, pgSites, pgStudio, pgWords, pgList, pgAwards, pgKinoCritic, pgReview, pgSeasons, pgPosters, pgTake, pgSoundtrack : Integer;
  ListDelim, ListSign, russianCountry, ufPrefix, ufPostfix, login, password, EmptyCategory, ufBudget, ufMarketing, ufMoneyUSA, ufMoneyRus, ufMoneyOther, ufMoneyWorld, ufViewers, ufFirstWorld, ufFirstRUS, ufReleaseDVD, ufReleaseBD, ufTime, ufTimeSerial, ufTop250, ufDoYouKnow, ufOperator, ufManager, ufDouble, ufDirectorDouble, ufSites, ufMakeStudio, ufEffectStudio, ufSaleStudio, ufKinoCritic, ufReview, ufMoreAwards, ufOpinion, ufPrognosRating, ufCost, ufLimitedWeekend, ufFirstWeekend, ufMaxCinema, ufLimitedShow, ufGeneralShow, ufEndShow, ufTimeShow, ufNetAvails, ufSoundtrack, ufVersion : WideString;
Const
  Disabled = 0;  // Опция включена, поле обновляется
  Enabled  = 1;  // Опция отключена, поле не обновляется
  Empty    = 2;  // Обновляется только пустое поле (действует на опции, помеченные +e)

//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Начало настроек vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv//

Const
    pathToConfig        = 'kinopoisk.cfg';   // Укажите полный путь к файлу конфигурации

procedure initOptions ();
Begin
     createLink         := true;    // Признак добавления тегов <link> в пользовательские поля
     formattedTime      := true;    // Признак преобразования длительности фильма из минут в формат чч:мм:сс
     miniPoster         := true;    // Признак загрузки постера с основной страницы (если false, грузится со страницы постеров)
     szPosterX          := 800;     // Размер постера для загрузки по ширине
     szPosterY          := 1200;    // Размер постера для загрузки по высоте
     ListDelim          := #13#10;  // Разделитель элементов списка (последовательность #13#10 - новая строка,
                                    //                               повторите два раза - будет пустая строка)
     ListSign           := '» ';    // Начало элемента списка
     nationality        := 0;       // Указание гос.принадлежности фильмов
                                    // 0 - автоматическое определение
                                    //     фильм с наличием переведенного названия считается зарубежным
                                    //     иначе фильм с большим кол-вом латинских букв - зарубежный
                                    //           фильм с большим кол-вом русских букв - русский
                                    //           фильм с одинаковым кол-вом русских и латинских букв русский,
                                    //                 если первая страна-производитель входит в список russianCountry
                                    // 1 - все фильмы - зарубежные
                                    // 2 - все фильмы - русские
                                    // 3 - фильмы, у которых первая страна-производитель находится
                                    //     в списке опции russianCountry, - русские, остальные - зарубежные
     russianCountry     := 'Россия,СССР';
                                    // Указание русских стран. Не забываем про Россию и СССР.
                                    // Страны перечисляются через запятую без пробелов.
                                    // Написание стран должно соответствовать написанию на сайте КиноПоиска
     RusNames           := 1;       // правила занесения имени русской персоны
                                    // национальность персоны определяется косвенно по гос.принадлежности фильма
                                    // персоны в полях "Режиcсеры дубляжа" и "Роли дублировали" всегда русские
                                    // 0 - имя транслит, переведенное имя русское
                                    // 1 - имя русское, переведенное имя транслит
                                    // 2 - имя русское, переведенное имя русское
     ShowPersonAs       := 5;       // Заносить персон в пользовательские поля как...
                                    // 0 - имя
                                    // 1 - переведенное имя
                                    // 2 - имя / переведенное имя
                                    // 3 - имя ... роль
                                    // 4 - переведенное имя ... роль
                                    // 5 - имя / переведенное имя ... роль
     LongDate           := false;   // true  - отображение даты в длинном формате (01 января 2000)
                                    // false - отображение даты в коротком формате (01.01.2000)
     ufPrefix           := '';      // Префикс  для имен пользовательских полей
     ufPostfix          := '';      // Постфикс для имен пользовательских полей (можно добавить ":")
     loadFee            := true;    // Загружать гонорары актеров после их роли
     loadExtraRole      := true;    // Загружать в роль актера дополнительную информацию: не указан в титрах, озвучка
     maxOpinion         := 1;       // Максимальное количество отзывов зрителей (на одной странице 10 отзывов, 0 - без ограничений)
     maxOpinionURL      := -1;      // Максимальное количество ссылок на незагруженные отзывы зрителей (0 - без ограничений, -1 - не грузить)
     maxCharInOpinion   := 18000;   // Максимальное количество символов для загрузки в поле "Отзывы зрителей".
                                    // Для ветки 0.9.8.x лучше не трогать
                                    // Для ветки 0.9.9.x можно установить в 0 - без ограничений
     login              := '';      // Имя пользователя
     password           := '';      // Пароль пользователя
     maxPersons         := 100;     // Максимальное количество загружаемых персон каждого типа (режиссеры, операторы, актеры и т.д.)
     placeTimeSerial    := 0;       // Размещение полной длительности сериала
                                    // 0 - в пользовательском поле "Длительность"
                                    // 1 - в пользовательском поле "Длительность сериала"
     maxStudios         := 0;       // Максимальное количество студий для загрузки во встроенное поле программы
                                    // (0 - без ограничений)
     maxStudiosInCat    := 0;       // Максимальное количество студий в каждой из категорий
                                    // ("Студии. Производство", "Студии. Прокат", "Студии. Спецэффекты")
                                    // для загрузки (0 - без ограничений)
     EmptyCategory      := 'полнометражный фильм';  // Категория, помещаемая в поле Категория
                                    // при отсутствии в названии фильма слов ТВ, видео, сериал
     simpleTitle        := false;   // Замена разного рода кавычек на классические одинарные
                                    // true  - заменять
                                    // false - оставлять, как есть
     transRusOrigTitle  := false;   // Транслитерация русского оригинального названия фильма
                                    // true  - записывать в оригинальное название транслитерированное
                                    // false - записывать в оригинальное название русское
     formattedURL       := true;    // Форматированные ссылки (не влияет на стандартное поле URL, работает только при createLink = true)
                                    // true  - из ссылки убирается "http://", "www." и всё после "/",
                                    //         остается видимым только домен, но ссылка указывает на полный адрес
                                    // false - ссылка подставляется как есть
     addLikeFilms2Links := true;    // Добавление похожих фильмов в связи
                                    // true  - добавлять
                                    // false - не добавлять

                                    // Загрузка основной страницы фильма - отключить нельзя
      optURL            := Enabled;  // URL фильма
      optOrigTitle      := Enabled;  // Оригинальное название (+e)
      optTitle          := Enabled;  // Название (+e)
      optAka            := Enabled;  // Другие названия (+e)
      optYear           := Enabled;  // Год выхода (+e)
      optCountry        := Enabled;  // Страна (+e)
      optTagline        := Enabled;  // Слоган (+e)
      optGenre          := Enabled;  // Жанр (+e)
      optBudgetM        := Enabled;  // Бюджет
      optMoneyWorldM    := Enabled;  // Сборы в мире
      optFirstWorldM    := Enabled;  // Дата выпуска
      optMPAA           := Enabled;  // Рейтинг MPAA (+e)
      optDescription    := Enabled;  // Описание (+e)
      optRating         := Enabled;  // Рейтинг КиноПоиска (+e)
      optRatingIMDB     := Disabled; // Рейтинг IMDB (+e)

      optMoneyUSA       := Enabled;  // Сборы в США (+e)
      optMoneyRUS       := Enabled;  // Сборы в России (+e)
      optMoneyOther     := Enabled;  // Сборы в др. странах (+e)
      optViewers        := Enabled;  // Зрители
      optBudgetU        := Enabled;  // Бюджет 
      optMarketing      := Enabled;  // Маркетинг
      optMoneyWorldU    := Enabled;  // Сборы в мире
      optFirstRUS       := Enabled;  // Премьера в России
      optReleaseDVD     := Enabled;  // Релиз на DVD
      optReleaseBD      := Enabled;  // Релиз на Blu-Ray
      optTime           := Enabled;  // Длительность
      optFirstWorldU    := Enabled;  // Мировая премьера
      optTop250         := Enabled;  // Top250
      optCategory       := Enabled;  // Категории
      optOpinion        := Enabled;  // Отзывы зрителей
      optPrognosRating  := Enabled;  // Прогнозируемая оценка
      optVersion        := Enabled;  // Версия скрипта
     
     pgDoYouKnow        := Enabled;  // Загрузка страницы "Знаете ли Вы, что..."
      optDoYouKnow      := Enabled;  // Знаете ли вы, что
     
     pgPersons          := Enabled;  // Загрузка страницы Создатели
      optDirector       := Enabled;  // Режиссеры
      optActor          := Enabled;  // Актеры
      optProducer       := Enabled;  // Продюссеры
      optScenario       := Enabled;  // Сценаристы
      optComposer       := Enabled;  // Композиторы
      optOperator       := Enabled;  // Операторы
      optDouble         := Enabled;  // Роли дублировали
      optManager        := Enabled;  // Директора фильма
      optDirectorDouble := Enabled;  // Режиссеры дубляжа

     pgSites            := Enabled;  // Загрузка страницы Сайты
      optSites          := Enabled;  // Сайты

     pgStudio           := Enabled;  // Загрузка страницы Студии
      optMakeStudio     := Enabled;  // Студии. Производство
      optEffectStudio   := Enabled;  // Студии. Спецэффекты
      optSaleStudio     := Enabled;  // Студии. Прокат
      optStudio         := Enabled;  // Студии
     
     pgWords            := Enabled;  // Загрузка страницы Слова
      optTags           := Enabled;  // Теги
    
     pgList             := Enabled;  // Загрузка страницы Связи
      optConnection     := Enabled;  // Связи

     pgAwards           := Enabled;  // Загрузка страницы Награды
      optAward          := Enabled;  // Награды
      optMoreAwards     := Enabled;  // Дополнительные награды

     pgKinoCritic       := Enabled;  // Загрузка страницы Кинокритика
      optKinoCritic     := Enabled;  // Кинокритика

     pgReview           := Enabled;  // Загрузка страницы Рецензия
      optReview         := Enabled;  // Рецензия

     pgSeasons          := Enabled;  // Загрузка страницы Сезоны
      optEpisode        := Enabled;  // Эпизоды
      optTimeSerial     := Enabled;  // Полное время сериала

     pgPosters          := Enabled;  // Загрузка страницы Постеры
      optPosters        := Enabled;  // Постеры

     pgTake             := Disabled; // Кассовые сборы
      optNetAvails      := Enabled;  // Чистая выручка кииностудии
      optCost           := Enabled;  // Всего затрат
      optLimitedWeekend := Enabled;  // Первый уик-энд (США). Ограниченный прокат
      optFirstWeekend   := Enabled;  // Первый уик-энд (США). Широкий прокат
      optMaxCinema      := Enabled;  // Первый уик-энд (США). Макс. кол-во кинотеатров (США)
      optLimitedShow    := Enabled;  // Ограниченный прокат (США)
      optGeneralShow    := Enabled;  // Широкий прокат (США)
      optEndShow        := Enabled;  // Окончание проката (США)
      optTimeShow       := Enabled;  // Время проката

     pgSoundtrack       := Disabled;  // Саундтреки
      optSoundtrack     := Enabled;  // Саундтреки

      
//***********************************
//Пользовательские поля.
//Скрипт заполняет их по имени, так что возможны два варианта:
//          либо подогнать имена полей в базе, чтоб они соответствовали этим
//          либо подогнать именя полей тут, чтоб они соответствовали базе

     ufBudget         := 'Бюджет'              ;    //Короткий текст
     ufMarketing      := 'Маркетинг'           ;    //Короткий текст
     ufMoneyUSA       := 'Сборы в США'         ;    //Короткий текст
     ufMoneyRus       := 'Сборы в России'      ;    //Короткий текст
     ufMoneyOther     := 'Сборы в др. странах' ;    //Короткий текст
     ufMoneyWorld     := 'Сборы в мире'        ;    //Короткий текст
     ufViewers        := 'Зрители'             ;    //Длинный текст
     ufFirstWorld     := 'Премьера (мир)'      ;    //Короткий текст
     ufFirstRUS       := 'Премьера (РФ)'       ;    //Короткий текст
     ufReleaseDVD     := 'Релиз на DVD'        ;    //Короткий текст
     ufReleaseBD      := 'Релиз на Blu-Ray'    ;    //Короткий текст
     ufTime	          := 'Длительность'        ;    //Короткий текст
     ufTimeSerial     := 'Длительность сериала';    //Короткий текст
     ufTop250         := 'Top250'              ;    //Короткий текст
     ufDoYouKnow      := 'Знаете ли Вы, что'   ;    //Memo
     ufOperator       := 'Операторы'           ;    //Memo
     ufManager        := 'Директора фильма'    ;    //Memo
     ufDouble         := 'Роли дублировали'    ;    //Memo
     ufDirectorDouble := 'Режиcсеры дубляжа'   ;    //Memo
     ufSites          := 'Сайты'               ;    //Memo
     ufMakeStudio     := 'Студии. Производство';    //Memo
     ufEffectStudio   := 'Студии. Спецэффекты' ;    //Memo
     ufSaleStudio     := 'Студии. Прокат'      ;    //Memo
     ufKinoCritic     := 'Кинокритика'         ;    //Memo
     ufReview         := 'Рецензия'            ;    //Memo
     ufMoreAwards     := 'Доп. награды'        ;    //Memo
     ufOpinion        := 'Отзывы зрителей'     ;    //Memo
     ufPrognosRating  := 'Прогн. оценка'       ;    //Короткий текст для 0.9.8.x и Rating для 0.9.9.x
     ufCost           := 'Всего затрат'        ;    //Короткий текст
     ufNetAvails      := 'Выручка к/с'         ;    //Короткий текст
     ufLimitedWeekend := 'Перв. уик-энд (США). Огр. прокат';  //Короткий текст
     ufFirstWeekend   := 'Перв. уик-энд (США). Шир. прокат';  //Короткий текст
     ufMaxCinema      := 'Перв. уик-энд (США). Макс. к/т';    //Короткий текст
     ufLimitedShow    := 'Огр. прокат (США)'   ;    //Короткий текст
     ufGeneralShow    := 'Шир. прокат (США)'   ;    //Короткий текст
     ufEndShow        := 'Конец проката (США)' ;    //Короткий текст
     ufTimeShow       := 'Время проката (США), дн./нед.';     //Короткий текст
     ufSoundtrack     := 'Саундтреки'          ;    //Memo
     ufVersion        := 'Версия скрипта'      ;    //Короткий текст
End;

// Задержка между загрузками страниц. 
// Если скрипт говорит, что нет связи с сервером - возможно страница еще
// не успела загрузиться. Увеличьте это значение на порядок.
//
// Если и это не помогает - поставьте переменную MsgDelay в True
// Это активирует "ручную" задержку (нужно будет нажимать кнопку ОК)
Const
     Delay = 0;
     MsgDelay = False;
     
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Конец настроек ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//

procedure GetBoolOption (const Data, Name: WideString; var opt: Boolean);
Var
  curPos, endPos: Integer;
  tmp : WideString;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos) + 1;
  endPos := PosFrom (';', Data, curPos);
  if (curPos = 0) Or (endPos = 0) then
    Exit;
  tmp := LowerCase (Trim (Copy (Data, curPos, endPos - curPos)));
  if (tmp = 'true') Or (tmp = 'enabled') then
    opt := true
  else if (tmp = 'false') Or (tmp = 'disabled') then
    opt := false;
End;

procedure GetFieldOption (const Data, Name: WideString; var opt: Integer);
Var
  curPos, endPos: Integer;
  tmp : WideString;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos) + 1;
  endPos := PosFrom (';', Data, curPos);
  if (curPos = 0) Or (endPos = 0) then
    Exit;
  tmp := LowerCase (Trim (Copy (Data, curPos, endPos - curPos)));
  if tmp = 'enabled' then
    opt := Enabled
  else if tmp = 'disabled' then
    opt := Disabled
  else if tmp = 'empty' then
    opt := Empty;
//  else if tmp = 'Add' then
//    opt := Add;
End;

procedure GetIntOption (const Data, Name: WideString; var opt: Integer);
Var
  curPos, endPos: Integer;
  tmp : WideString;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos) + 1;
  endPos := PosFrom (';', Data, curPos);
  if (curPos = 0) Or (endPos = 0) then
    Exit;

  tmp := Trim (Copy (Data, curPos, endPos - curPos));
  if tmp = '' then
    Exit;

  opt := StrToInt (tmp);
End;

procedure GetStrOption (const Data, Name: WideString; var opt: WideString);
Var
  curPos  : Integer;
  quoting : Boolean;
  str     : WideString;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos);
  opt := '';
  while (quoting) Or (Data[curPos + 1] <> ';') do
    Begin
    Inc (curPos);
    if (Data[curPos] = '''') And ((Not quoting) Or (Data[curPos + 1] <> '''')) then
      quoting := Not quoting;
    if quoting then str := 'true' else str := 'false';
    if (Data[curPos] = '''') then
      Continue;
    if quoting Or (Data[curPos] <> ' ') then
      opt := opt + Data[curPos];
    End;
  opt := StringReplace (opt, '#13#10', #13#10, true, true, false);
End;

procedure SetUFOption (var opt: WideString);
Begin
  opt := ufPrefix + opt + ufPostfix;
End;

procedure loadOptions ();
Var
  Data : WideString;
Begin
  Data := FileToString (pathToConfig);
  if Data <> '' then
    Begin
    GetBoolOption (Data, 'createLink', createLink);
    GetBoolOption (Data, 'formattedTime', formattedTime);
    GetBoolOption (Data, 'miniPoster', miniPoster);
    GetBoolOption (Data, 'LongDate', LongDate);
    GetBoolOption (Data, 'loadFee', loadFee);
    GetBoolOption (Data, 'loadExtraRole', loadExtraRole);
    GetBoolOption (Data, 'simpleTitle', simpleTitle);
    GetBoolOption (Data, 'transRusOrigTitle', transRusOrigTitle);
    GetBoolOption (Data, 'formattedURL', formattedURL);
    GetBoolOption (Data, 'addLikeFilms2Links', addLikeFilms2Links);

    GetFieldOption (Data, 'optURL', optURL);
    GetFieldOption (Data, 'optOrigTitle', optOrigTitle);
    GetFieldOption (Data, 'optTitle', optTitle);
    GetFieldOption (Data, 'optAka', optAka);
    GetFieldOption (Data, 'optYear', optYear);
    GetFieldOption (Data, 'optCountry', optCountry);
    GetFieldOption (Data, 'optTagline', optTagline);
    GetFieldOption (Data, 'optGenre', optGenre);
    GetFieldOption (Data, 'optBudgetM', optBudgetM);
    GetFieldOption (Data, 'optMoneyWorldM', optMoneyWorldM);
    GetFieldOption (Data, 'optFirstWorldM', optFirstWorldM);
    GetFieldOption (Data, 'optMPAA', optMPAA);
    GetFieldOption (Data, 'optDescription', optDescription);
    GetFieldOption (Data, 'optRating', optRating);
    GetFieldOption (Data, 'optRatingIMDB', optRatingIMDB);
    GetFieldOption (Data, 'optMoneyUSA', optMoneyUSA);
    GetFieldOption (Data, 'optMoneyRUS', optMoneyRUS);
    GetFieldOption (Data, 'optMoneyOther', optMoneyOther);
    GetFieldOption (Data, 'optViewers', optViewers);
    GetFieldOption (Data, 'optBudgetU', optBudgetU);
    GetFieldOption (Data, 'optMarketing', optMarketing);
    GetFieldOption (Data, 'optMoneyWorldU', optMoneyWorldU);
    GetFieldOption (Data, 'optFirstRUS', optFirstRUS);
    GetFieldOption (Data, 'optReleaseDVD', optReleaseDVD);
    GetFieldOption (Data, 'optReleaseBD', optReleaseBD);
    GetFieldOption (Data, 'optTime', optTime);
    GetFieldOption (Data, 'optFirstWorldU', optFirstWorldU);
    GetFieldOption (Data, 'optTop250', optTop250);
    GetFieldOption (Data, 'optCategory', optCategory);
    GetFieldOption (Data, 'optOpinion', optOpinion);
    GetFieldOption (Data, 'optPrognosRating', optPrognosRating);
    GetFieldOption (Data, 'pgDoYouKnow', pgDoYouKnow);
    GetFieldOption (Data, 'optDoYouKnow', optDoYouKnow);
    GetFieldOption (Data, 'pgPersons', pgPersons);
    GetFieldOption (Data, 'optDirector', optDirector);
    GetFieldOption (Data, 'optActor', optActor);
    GetFieldOption (Data, 'optProducer', optProducer);
    GetFieldOption (Data, 'optScenario', optScenario);
    GetFieldOption (Data, 'optComposer', optComposer);
    GetFieldOption (Data, 'optOperator', optOperator);
    GetFieldOption (Data, 'optDouble', optDouble);
    GetFieldOption (Data, 'optManager', optManager);
    GetFieldOption (Data, 'optDirectorDouble', optDirectorDouble);
    GetFieldOption (Data, 'pgSites', pgSites);
    GetFieldOption (Data, 'optSites', optSites);
    GetFieldOption (Data, 'pgStudio', pgStudio);
    GetFieldOption (Data, 'optMakeStudio', optMakeStudio);
    GetFieldOption (Data, 'optEffectStudio', optEffectStudio);
    GetFieldOption (Data, 'optSaleStudio', optSaleStudio);
    GetFieldOption (Data, 'optStudio', optStudio);
    GetFieldOption (Data, 'pgWords', pgWords);
    GetFieldOption (Data, 'optTags', optTags);
    GetFieldOption (Data, 'pgList', pgList);
    GetFieldOption (Data, 'optConnection', optConnection);
    GetFieldOption (Data, 'pgAwards', pgAwards);
    GetFieldOption (Data, 'optAward', optAward);
    GetFieldOption (Data, 'optMoreAwards', optMoreAwards);
    GetFieldOption (Data, 'pgKinoCritic', pgKinoCritic);
    GetFieldOption (Data, 'optKinoCritic', optKinoCritic);
    GetFieldOption (Data, 'pgReview', pgReview);
    GetFieldOption (Data, 'optReview', optReview);
    GetFieldOption (Data, 'pgSeasons', pgSeasons);
    GetFieldOption (Data, 'optEpisode', optEpisode);
    GetFieldOption (Data, 'optTimeSerial', optTimeSerial);
    GetFieldOption (Data, 'pgPosters', pgPosters);
    GetFieldOption (Data, 'optPosters', optPosters);
    GetFieldOption (Data, 'pgTake', pgTake);
    GetFieldOption (Data, 'optCost', optCost);
    GetFieldOption (Data, 'optFirstWeekend', optFirstWeekend);
    GetFieldOption (Data, 'optMaxCinema', optMaxCinema);
    GetFieldOption (Data, 'optGeneralShow', optGeneralShow);
    GetFieldOption (Data, 'pgSoundtrack', pgSoundtrack);
    GetFieldOption (Data, 'optSoundtrack', optSoundtrack);
    GetFieldOption (Data, 'optVersion', optVersion);

    GetIntOption (Data, 'szPosterX', szPosterX);
    GetIntOption (Data, 'szPosterY', szPosterY);
    GetIntOption (Data, 'nationality', nationality);
    GetIntOption (Data, 'RusNames', RusNames);
    GetIntOption (Data, 'ShowPersonAs', ShowPersonAs);
    GetIntOption (Data, 'maxOpinion', maxOpinion);
    GetIntOption (Data, 'maxOpinionURL', maxOpinionURL);
    GetIntOption (Data, 'maxCharInOpinion', maxCharInOpinion);
    GetIntOption (Data, 'maxPersons', maxPersons);
    GetIntOption (Data, 'placeTimeSerial', placeTimeSerial);
    GetIntOption (Data, 'maxStudios', maxStudios);
    GetIntOption (Data, 'maxStudiosInCat', maxStudiosInCat);

    GetStrOption (Data, 'ListDelim', ListDelim);
    GetStrOption (Data, 'ListSign', ListSign);
    GetStrOption (Data, 'russianCountry', russianCountry)
    GetStrOption (Data, 'ufPrefix', ufPrefix);
    GetStrOption (Data, 'ufPostfix', ufPostfix);
    GetStrOption (Data, 'login', login);
    GetStrOption (Data, 'password', password);
    GetStrOption (Data, 'EmptyCategory', EmptyCategory);

    GetStrOption (Data, 'ufBudget', ufBudget);
    GetStrOption (Data, 'ufMarketing', ufMarketing);
    GetStrOption (Data, 'ufCost', ufCost);
    GetStrOption (Data, 'ufMoneyUSA', ufMoneyUSA);
    GetStrOption (Data, 'ufMoneyRus', ufMoneyRus);
    GetStrOption (Data, 'ufMoneyOther', ufMoneyOther);
    GetStrOption (Data, 'ufMoneyWorld', ufMoneyWorld);
    GetStrOption (Data, 'ufViewers', ufViewers);
    GetStrOption (Data, 'ufFirstWorld', ufFirstWorld);
    GetStrOption (Data, 'ufFirstRUS', ufFirstRUS);
    GetStrOption (Data, 'ufReleaseDVD', ufReleaseDVD);
    GetStrOption (Data, 'ufReleaseBD', ufReleaseBD);
    GetStrOption (Data, 'ufTime', ufTime);
    GetStrOption (Data, 'ufTimeSerial', ufTimeSerial);
    GetStrOption (Data, 'ufTop250', ufTop250);
    GetStrOption (Data, 'ufDoYouKnow', ufDoYouKnow);
    GetStrOption (Data, 'ufOperator', ufOperator);
    GetStrOption (Data, 'ufManager', ufManager);
    GetStrOption (Data, 'ufDouble', ufDouble);
    GetStrOption (Data, 'ufDirectorDouble', ufDirectorDouble);
    GetStrOption (Data, 'ufSites', ufSites);
    GetStrOption (Data, 'ufMakeStudio', ufMakeStudio);
    GetStrOption (Data, 'ufEffectStudio', ufEffectStudio);
    GetStrOption (Data, 'ufSaleStudio', ufSaleStudio);
    GetStrOption (Data, 'ufKinoCritic', ufKinoCritic);
    GetStrOption (Data, 'ufReview', ufReview);
    GetStrOption (Data, 'ufMoreAwards', ufMoreAwards);
    GetStrOption (Data, 'ufOpinion', ufOpinion);
    GetStrOption (Data, 'ufPrognosRating', ufPrognosRating);
    GetStrOption (Data, 'ufLimitedWeekend', ufLimitedWeekend);
    GetStrOption (Data, 'ufFirstWeekend', ufFirstWeekend);
    GetStrOption (Data, 'ufMaxCinema', ufMaxCinema);
    GetStrOption (Data, 'ufLimitedShow', ufLimitedShow);
    GetStrOption (Data, 'ufGeneralShow', ufGeneralShow);
    GetStrOption (Data, 'ufEndShow', ufEndShow);
    GetStrOption (Data, 'ufTimeShow', ufTimeShow);
    GetStrOption (Data, 'ufNetAvails', ufNetAvails);
    GetStrOption (Data, 'ufSoundtrack', ufSoundtrack);
    GetStrOption (Data, 'ufVersion', ufSoundtrack);
    End;

  SetUFOption (ufBudget);
  SetUFOption (ufMarketing);
  SetUFOption (ufCost);
  SetUFOption (ufMoneyUSA);
  SetUFOption (ufMoneyRus);
  SetUFOption (ufMoneyOther);
  SetUFOption (ufMoneyWorld);
  SetUFOption (ufViewers);
  SetUFOption (ufFirstWorld);
  SetUFOption (ufFirstRUS);
  SetUFOption (ufReleaseDVD);
  SetUFOption (ufReleaseBD);
  SetUFOption (ufTime);
  SetUFOption (ufTimeSerial);
  SetUFOption (ufTop250);
  SetUFOption (ufDoYouKnow);
  SetUFOption (ufOperator);
  SetUFOption (ufManager);
  SetUFOption (ufDouble);
  SetUFOption (ufDirectorDouble);
  SetUFOption (ufSites);
  SetUFOption (ufMakeStudio);
  SetUFOption (ufEffectStudio);
  SetUFOption (ufSaleStudio);
  SetUFOption (ufKinoCritic);
  SetUFOption (ufReview);
  SetUFOption (ufMoreAwards);
  SetUFOption (ufOpinion);
  SetUFOption (ufPrognosRating);
  SetUFOption (ufLimitedWeekend);
  SetUFOption (ufFirstWeekend);
  SetUFOption (ufMaxCinema);
  SetUFOption (ufLimitedShow);
  SetUFOption (ufGeneralShow);
  SetUFOption (ufEndShow);
  SetUFOption (ufTimeShow);
  SetUFOption (ufNetAvails);
  SetUFOption (ufSoundtrack);
  SetUFOption (ufVersion);
End;


//********** Далее находятся переменные, предназначенные для внутреннего использования **********// 
Const
     mcDebug		= 0;
 // Уникальные символы при парсинге
 // Заполнены и вынесены в константы не все
     mcSearchOk    = '<title>Результаты поиска ('; 			  // Поиск успешно завершен
     mcNotFound    = 'К сожалению, по вашему запросу ничего не найдено.'; // Ничего не найдено
     mcFilmAbout   = 'alt="всё о кино">'; 				  // Мы на странице с фильмом
     mcFilmFirst   = '<!-- инфа о фильме -->'; 				  // Начало инфы о фильме
     mcSearchFirst = 'Скорее всего вы ищете'; 				  // Начало страницы поиска
     mcSearchEnd   = '<!-- /результаты поиска -->';		  // Конец страницы поиска
     mcFilmLink1   = '/level/1/film';					  // Начало. Ссылка на фильм со страницы поиска
     mcFilmLink2   = '">';						  // Конец. Ссылка на фильм со страницы поиска
     mcFilmEnd     = '>Добавить свой отзыв<';

const
  //Результаты парсинга
  prError     = 0; 
  prFinished  = 1;
  prList      = 2;
  prListImage = 3;
  prDownload  = 4;  // 0.9.9.5+
//  prDownload  = 3;  // 0.9.8.x

  //Типы работы скрипта
  stMovies = 0;
  stPeople = 1; 
  stPoster = 2;

  smSearch        =  0;
  smOpinions      =  1;
  smFullInfo      =  2;
  smAwards        =  3;
  smPersons       =  4;
  smSites         =  5;
  smStudio        =  6;
  smWords         =  7;
  smLinks         =  8;
  smKinoCritic    =  9;
  smReview        = 10;
  smSeasons       = 11;
  smTake          = 12;
  smSoundtrack    = 13;
  smSrchPoster    = 14;
  smGetPoster     = 15;
  smPoster        = 16;
  smFinished      = 17;

  //Поля фильма для добавления
  mfURL         = 0;
  mfTitle       = 1;
  mfOrigTitle   = 2;
  mfAka         = 3;
  mfYear        = 4;
  mfGenre       = 5;
  mfCategory    = 6;
  mfCountry     = 7;
  mfStudio      = 8;
  mfMPAA        = 9;
  mfRating      = 10;
  mfTags        = 11;
  mfTagline     = 12;
  mfDescription = 13;
  mfDuration    = 14;
  mfFeatures    = 15;

  //Поля фильма для получения
  gfID          =  1;
  gfTitle       =  2;
  gfOrigTitle   =  3;
  gfAka         =  4;
  gfYear        =  5;
  gfMPAA        =  6;
  gfURL         =  8;
  gfIMDBRating  =  9;
  gfORating     = 11;
  gfScriptName  = 12;  // gfRatingName
  gfTagLine     = 14;
  gfDescription = 15;
  gfDateAdded   = 17;
  gfResolution  = 21;
  gfGenre       = 44;
  gfCountry     = 45;
  gfCategory    = 46;
  gfActors      = 47;
  gfDirector    = 53;
  gfScenario    = 54;
  gfComposer    = 55;
  gfProducer    = 56;

  gfTags        =  0;
  gfStudio      =  0;
  gfActor       =  0;
  gfFirstWorld  =  0;
  gfBudget      =  0;
  gfMoneyWorld  =  0;

  //Участники фильмов
  mpActor       = 0;
  mpDirector    = 1;
  mpScenario    = 2;
  mpComposer    = 3;
  mpProducer    = 4;

  //Методы загрузки
  dmGET  = 0;
  dmPOST = 1;

  //Режимы работы с артиклями
  pmNone   = 0;
  pmEnd    = 1;
  pmBegin  = 2;
  pmRemove = 3;

const
  SCRIPT_VERSION = '1.0.7.5'; 
  SCRIPT_NAME    = 'КиноПоиск.Ru';
  SCRIPT_DESC    = '[RU] Импортировать информацию о фильме из КиноПоиск.Ru';
  SCRIPT_LANG    = $19; //Russian
  SCRIPT_TYPE    = stMovies;

  BASE_URL       = 'http://www.kinopoisk.ru';

  RATING_NAME    = 'КиноПоиск.Ru';
  SEARCH_STR     = 'http://www.kinopoisk.ru/index.php?level=7&m_act%5Bwhat%5D=content&m_act%5Bfind%5D=%s';
  CODE_PAGE      = 1251;

var
  FilmCountry  : WideString;
  Mode         : Byte;
  nOpinion     : Integer;
  ExtraLinks   : array [smOpinions..smFinished] of WideString;
  LoadPages    : array [smOpinions..smFinished] of Boolean;
  Countries    : WideString;  // Страна. Необходима для удаления из наград
  optionsInitialized : Boolean;


function GetScriptVersion : WideString;
begin
  Result := SCRIPT_VERSION;
end; 
 
function GetScriptName : WideString;
begin
  Result := SCRIPT_NAME;
end;

function GetScriptDesc : WideString;
begin
 Result := SCRIPT_DESC;
end;

function GetRatingName : WideString;
begin
 Result := RATING_NAME;
end;

function GetBaseURL : String;
begin
 Result := BASE_URL;        // 0.9.9.5+
// Result := BASE_URL + '/';  // 0.9.8.x
end;

function GetScriptLang: Cardinal;
begin
 Result := SCRIPT_LANG;
end;

function GetCodePage : Cardinal;
begin
 Result := CODE_PAGE;
end;

function GetScriptType : Byte; 
begin
 Result := SCRIPT_TYPE;
end;

function GetCurrentMode : Byte; 
begin
 Result := Mode;
end;

function GetDownloadURL : String;
begin
  if mode = smSearch then 
    Result := SEARCH_STR
  else
    Result := ExtraLinks[mode];
end;

function GetDownloadMethod : Byte;
begin
  Result := dmGET;
end;

procedure GetLoginInfo(out URL : String; out Params : String);
begin
  initOptions ();
  loadOptions ();

  if login <> '' then
    Begin
    URL := BASE_URL + '/level/30/';
    Params := 'shop_user[login]=' + login + '&shop_user[pass]=' + password;
    End;
end;

function GetPrefixMode : Byte;
begin
 Result := pmEnd;  
end;


// ******** Основной код программы *********************************
//****** Replace ******** Функция замены мнемоник и кодов на символы **********
function Replace (inStr: WideString): WideString;
Var
  I: Integer;
  Before, After : array of WideString;
Begin
//  inStr := HTMLToText (inStr);

  SetLength (Before, 53);
  SetLength (After, 53);
  // Мнемоники
  Before[ 1] := '&bdquo;';   After [ 1] := '„';
  Before[ 2] := '&bull;';    After [ 2] := '•';
  Before[ 3] := '&copy;';    After [ 3] := '©';
  Before[ 4] := '&deg;';     After [ 4] := '°';
  Before[ 5] := '&euro;';    After [ 5] := '€';
  Before[ 6] := '&hellip;';  After [ 6] := '…';
  Before[ 7] := '&laquo;';   After [ 7] := '«';
  Before[ 8] := '&ldquo;';   After [ 8] := '“';
  Before[ 9] := '&lsaquo;';  After [ 9] := '‹';
  Before[10] := '&lsquo;';   After [10] := '‘';
  Before[11] := '&mdash;';   After [11] := '—';
  Before[12] := '&middot;';  After [12] := '·';
  Before[13] := '&ndash;';   After [13] := '–';
  Before[14] := '&plusmn;';  After [14] := '±';
  Before[15] := '&raquo;';   After [15] := '»';
  Before[16] := '&rdquo;';   After [16] := '”';
  Before[17] := '&reg;';     After [17] := '®';
  Before[18] := '&rsaquo;';  After [18] := '›';
  Before[19] := '&rsquo;';   After [19] := '’';
  Before[20] := '&sbquo;';   After [20] := '‚';
  Before[21] := '&sect;';    After [21] := '§';
  Before[22] := '&shy;';     After [22] := '';   // «мягкий» дефис (место возможного переноса)

  // Коды
  Before[23] := '&#130;';    After [23] := '‚';
  Before[24] := '&#132;';    After [24] := '„';
  Before[25] := '&#133;';    After [25] := '…';
  Before[26] := '&#136;';    After [26] := '€';
  Before[27] := '&#137;';    After [27] := '‰';
  Before[28] := '&#139;';    After [28] := '‹';
  Before[30] := '&#145;';    After [30] := '‘';
  Before[31] := '&#146;';    After [31] := '’';
  Before[32] := '&#147;';    After [32] := '“';
  Before[33] := '&#148;';    After [33] := '”';
  Before[34] := '&#149;';    After [34] := '•';
  Before[35] := '&#150;';    After [35] := '–';
  Before[36] := '&#151;';    After [36] := '—';
  Before[37] := '&#153;';    After [37] := '™';
  Before[38] := '&#155;';    After [38] := '›';
  Before[39] := '&#171;';    After [39] := '«';
  Before[40] := '&#185;';    After [40] := '№';
  Before[41] := '&#187;';    After [41] := '»';

  // Символы
  Before[50] := '	';         After [50] := '';   // табуляция
  Before[51] := #13#10' ';   After [51] := #13#10;  // пробел в начале абзаца
  Before[52] := '';       After [52] := '';  // и попадается же хреновина всякая (http://www.kinopoisk.ru/level/1/film/5619/)

  For I := Low (Before) To High (Before) Do
    inStr := StringReplace (inStr, Before [i], After [i], true, false, false);
  Result := HTMLToText (inStr);
End;


//****** ReplaceToSimple ******** Функция замены разных кавычек на классическую одинарную **********
function ReplaceToSimple (inStr: WideString): WideString;
Var
  I: Integer;
  Before, After : array of WideString;
Begin
  Result := Replace (inStr);
  if Not simpleTitle then
    Exit;

  SetLength (Before, 19);
  SetLength (After, 19);
  Before[ 1] := '·';    After[ 1] := '·';
  Before[ 2] := '•';    After[ 2] := '·';
  Before[18] := '''';   After[18] := '''';
  Before[ 3] := '‚';    After[ 3] := '''';
  Before[ 4] := '‘';    After[ 4] := '''';
  Before[ 5] := '’';    After[ 5] := '''';
  Before[ 5] := '`';    After[ 6] := '''';
  Before[17] := '"';    After[17] := '''';
  Before[ 7] := '„';    After[ 7] := '''';
  Before[ 8] := '“';    After[ 8] := '''';
  Before[ 9] := '”';    After[ 9] := '''';
  Before[10] := '‹';    After[10] := '''';
  Before[11] := '›';    After[11] := '''';
  Before[12] := '«';    After[12] := '''';
  Before[13] := '»';    After[13] := '''';
  Before[14] := '–';    After[14] := '-';
  Before[15] := '—';    After[15] := '-';
  Before[16] := '…';    After[16] := '...';


  For I := Low (Before) To High (Before) Do
    Result := StringReplace (Result, Before [i], After [i], true, false, false);
End;

Function TVVideo(S: WideString): WideString;
Var
 Bad               : Array[1..3] Of String;
 I, curPos, endPos : Integer;
Begin
  Bad[1] := '(ТВ';
  Bad[2] := '(ВИДЕО';
  Bad[3] := '(СЕРИАЛ';
  
  For I := 1 To 3 Do
    Begin
    curPos := Pos(Bad[I], UpperCase(S));
    If curPos > 0 Then
      Begin
      endPos := PosFrom (')', S, curPos) + 1;
      if S[curPos - 1] = ' ' then
        curPos := curPos - 1;
      Delete(S, curPos, endPos - curPos);
      End;
    End;
  Result := Replace (S);
End;

Function GetCategory (Title: WideString): WideString;
var
  Categories : Array Of String;
  i          : integer;
Begin
  SetLength (Categories, 4);
  Categories[0] := EmptyCategory;
  Categories[1] := '(ТВ';
  Categories[2] := '(видео';
  Categories[3] := '(сериал';
  
  Title := LowerCase (Title);
  for i := 1 to High (Categories) do
    begin
    if pos (LowerCase (Categories[i]), Title) > 0 then
      Break;
    end;
  if i <= High (Categories) then
    Result := Copy (Categories[i], 2, 255)
  else
    Result := Categories[0];
End;


//****** CheckNum ****** Удаляет из строки все, что не является цифрой ******
function CheckNum(s: widestring): widestring;
var
 st: widestring;
 i: integer;
begin
 if pos('&#8364;', s) > 0 then
  delete(s, 1, 7);
 if pos('&#165;', s) > 0 then
  delete(s, 1, 6);
 for i := 1 to length(s) do
   if (s[i] >= '0') and (s[i] <= '9') then
     st := st + s[i]; 
 i := strtoint(st);
 st := inttostr(i);
 result := st;
end;


//****** CorrectTime ****** Отображение времени в виде чч:мм:сс ******
function CorrectTime ( Tmp : WideString ) : WideString ;
Var
 tm, hour, min : Integer;
Begin
  Result := '';
  if Tmp = '' then
    Exit;

  Tmp := CheckNum (Tmp);
  tm := StrToInt (Tmp);

  hour := tm div 60;
  min := tm mod 60;

  if hour < 10 then Result := Result + '0';
  Result := Result + IntToStr (hour) + ':';
  if min < 10 then Result := Result + '0';
  Result := Result + IntToStr (min) + ':00';
end;


//========== Проверка возможности обновления стандартного поля ==========//
function AllowAddByNumber (const opt, gf : Integer): Boolean;
Begin
  if (gf = 0) then
    Result := (opt = Enabled)
  else
    Result := (opt = Enabled) Or ((opt = Empty) And (GetFieldValue (gf) = ''));
End;


//========== Проверка возможности обновления пользовательского поля ==========//
function AllowAddByName (const opt : Integer; const uf : String): Boolean;
Begin
  Result := (opt = Enabled) Or ((opt = Empty) And (GetCustomFieldValueByName (uf) = ''));
End;

// ******** ParseLinks ************** Парсим страницу со связями *** 
procedure ParseLinks(HTML : WideString);
var
 curPos, endPos, save	: Integer;
 tmp, cat             : WideString;
 title, origtitle	    : WideString;
 url, year		        : WideString;
begin
save := 1;
while save > 0 do
 begin
  save := PosFrom('style="border-bottom:2px solid #f60">', HTML, save+1);
  cat := Replace (HTMLValues(HTML, '#f60"', '</td>', '<b>', '</b>', ',', save));
  if cat <> '' then
   begin
     curPos := PosFrom('<b>'+cat+'</b>', html, 1);
     tmp := copy(html, curpos, PosFrom('</table>', HTML, curPos)-curpos);
     while pos('<a href="', tmp) > 0 Do
       begin
        url := copy(tmp, pos('<a href="', tmp)+9, pos('" class="all">', tmp)-pos('<a href="', tmp)-9);
        url := BASE_URL+url;
        curPos := 1;
        title := ReplaceToSimple (HTMLValues2(tmp, '<a', '</a>', 'class="all"', '</a>', ',', curPos));
        if title <> '' then
          Begin
          if title[length(title)] = ' ' then
            Title := Copy (Title, 1, length (title) - 1);
          year := HTMLValues2(tmp, '<a', '</a>', 'class=orange', '</a>', ',', curPos);
          origtitle := ReplaceToSimple (HTMLValues2(tmp, '<font', '</font>', '#999999', '</font>', ',', curPos));
          if origtitle[length(origtitle)] = ' ' then
            origtitle := Copy (origtitle, 1, length (origtitle) - 1);
          if StringReplace (OrigTitle, ' ', '', true, false, false) = '' then
            OrigTitle := Title;
          if optConnection = Enabled then AddConnection(TVVideo(Title), TVVideo(OrigTitle), cat, url, year);
          End;
        curPos := Pos('<a href=', tmp);
        endPos := posFrom('</td>', tmp, curPos);
        delete(tmp, 1, endPos);
       end;
   end;
 end;
end;

// ******** ParseWords ************** Парсим страницу со словами *** 
procedure ParseWords(HTML : WideString);
var
 curPos, endPos		: Integer;
 tmp, tmp2		    : WideString;
 tags               : TWideArray;
 i                  : integer;
begin
  curPos := Pos('Внимание! Список ключевых слов может содержать спойлеры. Будьте осторожны.', HTML);
  endPos := PosFrom('Внимание! Список ключевых слов может содержать спойлеры. Будьте осторожны.', HTML, curPos+2);
  tmp := copy(HTML, curPos, endPos-curPos);
  curPos := 1;
  tmp2 := Replace (HTMLValues(tmp, '</span>', '<span style="', 'class="all">', '</a>', ';', curPos));
  // Этот блок необходим для защиты от тега Пиратов Карибского Моря
  begin
    ExplodeString (tmp2, tags, ';');
    tmp2 := '';
    for i := low (tags) to high (tags) do
      begin
      tmp := tags[i];
      if length (tmp) > 50 then
        begin
        tmp := copy (tmp, 1, 50);
        tmp := copy (tmp, 1, LastPos (' ', tmp) - 1) + '...';
        end;
      if tmp2 <> '' then
        tmp2 := tmp2 + ', ';
      tmp2 := tmp2 + tmp;
      end;
  end;
  if AllowAddByNumber (optTags, gfTags) then AddFieldValue(mfTags, tmp2);
end;


// ******** ParseOneCategoryStudio ********** Парсим одну из категорий студий *****
procedure ParseOneCategoryStudio (HTML, TextStart, userField : WideString;
  opt : Integer; out res : WideString; out nStudios : Integer);
var
  curPos, endPos     : Integer;
  nStudiosInCat      : Integer;
  Tmp, Tmp2, resAll  : WideString;
  url                : WideString;
Begin
  curPos := Pos (TextStart, HTML);
  endPos := PosFrom ('style="border-bottom:2px solid #ccc"', HTML, curPos);
  Tmp := Copy (HTML, curPos, endPos - curPos);
  resAll := '';
  Tmp2 := 'Begin';
  curPos := 1;
  nStudiosInCat := 1;
  while Tmp2 <> '' do
    begin
    url := BASE_URL + Copy (Tmp, PosFrom ('<a href="', tmp, curPos) + 9,
      PosFrom ('" class="all">', Tmp, curPos) - PosFrom('<a href="', tmp, curPos) - 9);
    tmp2 := Replace (HTMLValues2 (tmp, '<a href=', '</a>', 'class="all">', '</a>', ',', curPos));
    if tmp2 <> '' then 
      begin 
      if (maxStudios = 0) Or (nStudios <= maxStudios) then
        Begin
        res := res + tmp2 + ', '; 
        Inc (nStudios);
        End;
      if (maxStudiosInCat = 0) Or (nStudiosInCat <= maxStudiosInCat) then
        Begin
        if createLink then
        resAll := resAll + '<link url="' +url+ '">' +tmp2+ '</link>'+#13#10
        else
          begin
          if length (resAll) > 0 then resAll := resAll + ', ';
          resAll := resAll + tmp2;
          end;
        Inc (nStudiosInCat);
        End;
      end;
    end;
  if AllowAddByName (opt, userField) then AddCustomFieldValueByName (userField, resAll);
End;

// ******** ParseStudio ************* Парсим страницу со студиями ** 
procedure ParseStudio(HTML : WideString);
var
  nStudios : Integer;
  res      : WideString;
begin
  nStudios := 1;
  res := '';

  ParseOneCategoryStudio (HTML, 'Производство:', ufMakeStudio,   optMakeStudio,   res, nStudios);
  ParseOneCategoryStudio (HTML, 'Спецэффекты:',  ufEffectStudio, optEffectStudio, res, nStudios);
  ParseOneCategoryStudio (HTML, 'Прокат:',       ufSaleStudio,   optSaleStudio,   res, nStudios);

  if AllowAddByNumber (optStudio, gfStudio) then AddFieldValue(mfStudio, res);
end;

// ******** ParseSites ************** Парсим страницу с сайтами **** 
procedure ParseSites(HTML : WideString);
var
  tmp, tmp2, res : WideString;
  formURL        : WideString;
  curPos, endPos : Integer;
begin
  curPos := Pos ('Cайты отсутствуют, но кто ищет, тот всегда найдёт!', HTML);
  if curPos > 0 then
    Exit;

  curPos := Pos ('<div class="snap_shots">', HTML);
  endPos := PosFrom ('Искать информацию в Интернете:', HTML, 1);
  tmp := Copy (HTML, curPos, endPos - curPos);
  curPos := 1;
  res := '';
  tmp2 := 'Begin';
  while tmp2 <> '' do
    begin
    tmp2 := Replace (HTMLValues2 (tmp, '<a href=', '</a>', 'return true;">', '</a>', ',', curPos));
    if tmp2 <> '' then
      begin
      if createLink = true then
        Begin
        formURL := tmp2;
        if formattedURL then
          Begin
          formURL := StringReplace (formURL, 'http://', '', false, false, false);
          formURL := StringReplace (formURL, 'www.', '', false, false, false);
          if Pos ('/', formURL) > 0 then
            Delete (formURL, Pos ('/', formURL), 255);
          End;
        res := res + '<link url="' +tmp2+ '">' + formURL + '</link>' + #13#10;
        End
      else
        begin
        if res <> '' then
          res := res + '   ';
        res := res + tmp2;
        end;
      end;
    end;
  if AllowAddByName (optSites, ufSites) then AddCustomFieldValueByName(ufSites, res);
end;


// ******** GetNameUserPerson ********** Формирование порядка имен персон в пользовательских полях ********
procedure GetNameUserPerson (rus, lat : WideString; var Name, TransName : WideString; isRussianPerson : Boolean);
Begin
  isRussianPerson := isRussianPerson Or (FilmCountry = 'Rus');
  if (Not isRussianPerson) Or (RusNames = 0) then
    Begin
    Name := lat;
    TransName := rus;
    End
  else if (RusNames = 2) then
    TransName := rus
  else
    Begin
    Name := rus;
    TransName := lat;
    End;
  Case ShowPersonAs of
    1, 4:
      Name := '';
    0, 3:
      TransName := '';
    End;
End;

// ******** ParseOnePerson ********** Парсим одну персону в стандартное поле *********
procedure ParseOnePerson (HTML, Category : WideString; opt: Integer; mp, gf : Integer);
Var
  curPos, iPerson     : Integer;
  tmp, url, rus, lat  : WideString;
Begin
  curPos := Pos (Category + '</td>', HTML);
  tmp := copy (HTML, curPos, PosFrom ('Наверх страницы', HTML, curPos) - curPos);
  for iPerson := 1 to maxPersons do
    begin
    curPos := Pos ('<img', tmp);
    curPos := PosFrom ('<a href="/', tmp, curPos);
    if curPos > 0 then
      begin
      url := BASE_URL + Copy (tmp, curPos + 9, PosFrom ('/"', tmp, curPos) - curPos - 8);
      rus := Replace (TextBetween (tmp, 'class="all">', '</a>', false, curPos));
      lat := Replace (TextBetween (tmp, 'color:#999">', '</span>', false, curPos));
      if AllowAddByNumber (opt, gf) then
        if (FilmCountry = 'En') Or (RusNames = 0) then AddMoviePerson (lat, rus, '', url, mp) else
        if (RusNames = 2)                         then AddMoviePerson ('' , rus, '', url, mp) else
                                                       AddMoviePerson (rus, lat, '', url, mp);
      Delete (tmp, 1, pos ('</span><br><br>', tmp));
      end;
    end;
End;


// ******** ParseOneUserPerson ********** Парсим одну персону в пользовательское поле *********
procedure ParseOneUserPerson (HTML, Category : WideString; opt: Integer; uf : String; isRussianPerson : Boolean);
Var
  curPos, iPerson          : Integer;
  tmp, tmp2, url, rus, lat : WideString;
  Name, TransName          : WideString;
Begin
  curPos := Pos(Category + '</td>', HTML);
  tmp := Copy (HTML, curPos, PosFrom ('Наверх страницы', HTML, CurPos) - CurPos);
  tmp2 := '';
  for iPerson := 1 to maxPersons do
    begin
    curPos := Pos ('<img', tmp);
    curPos := PosFrom ('<a href="/', tmp, curPos);
    if curPos > 0 then
      begin
      url := BASE_URL + Copy (tmp, curPos + 9, PosFrom ('/"', tmp, curPos) - curpos - 8);
      rus := Replace (TextBetween(tmp, 'class="all">', '</a>', false, curPos));
      lat := Replace (TextBetween(tmp, 'color:#999">', '</span>', false, curPos));
      if lat = '' then lat := rus;
      GetNameUserPerson (rus, lat, Name, TransName, isRussianPerson);
      if length (tmp2) > 0 then tmp2 := tmp2 + ', ';
      if createLink = true then
        begin
        if Name <> '' then
          tmp2 := tmp2 + '<link name="' + Name + '">' + Name + '</link>';
        if (Name <> '') And (TransName <> '') then
          tmp2 := tmp2 + ' / ';
        if TransName <> '' then
          tmp2 := tmp2 + '<link tname="' + TransName + '">' + TransName + '</link>';
        end
      else
        begin
        if Name <> '' then
          tmp2 := tmp2 + Name;
        if (Name <> '') And (TransName <> '') then
          tmp2 := tmp2 + ' / ';
        if TransName <> '' then
          tmp2 := tmp2 + TransName;
        end;
      Delete (tmp, 1, pos ('</span><br><br>', tmp));
      end;
    end;
  if AllowAddByName (opt, uf) then AddCustomFieldValueByName (uf, tmp2);
End;


// ******** ParsePersons ************ Парсим страницу создателей *** 
procedure ParsePersons(HTML : WideString);
var
 tmp, tmp2, role             : WideString;
 rus, lat, url               : WideString;
 Name, TransName             : WideString;
 curPos, endPos, i, iPerson  : Integer;
 ExtraRole                   : array [1..5] of String;
Begin
  ParseOnePerson (HTML, 'Режиссеры',   optDirector, mpDirector, gfDirector);
  ParseOnePerson (HTML, 'Продюсеры',   optProducer, mpProducer, gfProducer);
  ParseOnePerson (HTML, 'Сценаристы',  optScenario, mpScenario, gfScenario);
  ParseOnePerson (HTML, 'Композиторы', optComposer, mpComposer, gfComposer);

  // Актеры
  ExtraRole[1] := 'в титрах не указанa';
  ExtraRole[2] := 'в титрах не указан';
  ExtraRole[3] := 'озвучка';
  ExtraRole[4] := 'хроника';
  ExtraRole[5] := 'английская версия';
  curPos := Pos('Актеры</td>', HTML);
  tmp := copy(HTML, curPos, PosFrom('Наверх страницы', HTML, CurPos)-CurPos);
  if curPos > 0 then
   for iPerson := 1 to maxPersons do
    begin
    curPos := Pos('<img', tmp);
    curPos := PosFrom('<a href="/', tmp, curPos);
    if curPos = 0 then
      Break;

    url := Base_Url+copy(tmp, curPos+9, posfrom('/"', tmp, curPos)-curpos-8);
    rus := Replace (TextBetween(tmp, 'class="all">', '</a>', false, curPos));
    lat := Replace (TextBetween(tmp, 'color:#999">', '</span>', false, curPos));
    role := '';
    curPos := PosFrom ('<br><br>...&nbsp;', tmp, curPos);
    if curPos > 0 then
      begin
      endpos := posfrom ('</td>', tmp, curpos) + 5;
      tmp2 := copy (tmp, curpos, endpos - curpos);
      if loadfee = false then  // отсечение гонораров
        begin
        curPos := Pos ('<font color=''#339933''>', Tmp2);
        endPos := PosFrom ('</font>', tmp2, curPos);
        Delete (Tmp2, curPos, endPos - curPos);
        end;
      curPos := 1;
      role := Replace (TextBetween(Tmp2, '<br><br>...&nbsp;', '</td>', false, curPos));
      if loadExtraRole = false then
        begin
        for i := Low (ExtraRole) to High (ExtraRole) do
          begin
          curPos := pos (ExtraRole[i], role);
          if curPos > 0 then
            Delete (role, curPos, length (ExtraRole[i]));
          end;
        end;
      end;
    if AllowAddByNumber (optActor, gfActor) then
    if (FilmCountry = 'En') Or (RusNames = 0) then AddMoviePerson(lat, rus, role, url, mpActor) else
    if (RusNames = 2)                         then AddMoviePerson('' , rus, role, url, mpActor) else
                                                   AddMoviePerson(rus, lat, role, url, mpActor);
    delete(tmp, 1, pos('</span><br><br>', tmp));
    end;

  ParseOneUserPerson (HTML, 'Операторы', optOperator, ufOperator, false);
  ParseOneUserPerson (HTML, 'Директора фильма', optManager, ufManager, false);
  ParseOneUserPerson (HTML, 'Режиcсеры дубляжа', optDirectorDouble, ufDirectorDouble, true);

  // Роли дублировали
  curPos := Pos('Роли дублировали</td>', HTML);
  tmp := copy(HTML, curPos, PosFrom('Наверх страницы', HTML, CurPos)-CurPos);
  tmp2 := '';
  for iPerson := 1 to maxPersons do
    begin
    curPos := Pos('<img', tmp);
    curPos := PosFrom('<a href="/', tmp, curPos);
    if curPos = 0 then
      Break;

    url := Base_Url+copy(tmp, curPos+9, posfrom('/"', tmp, curPos)-curpos-8);
    rus := Replace (TextBetween(tmp, 'class="all">', '</a>', false, curPos));
    lat := Replace (TextBetween(tmp, 'color:#999">', '</span>', false, curPos));
    role := Replace (TextBetween(tmp, '<br><br>', '</td>', false, curPos));
    if loadExtraRole = false then
      begin
      for i := Low (ExtraRole) to High (ExtraRole) do
        begin
        curPos := pos (ExtraRole[i], role);
        if curPos > 0 then
          Delete (role, curPos, length (ExtraRole[i]));
        if length (role) > 2 then
          Begin
          if Pos (', ', role) = length (role) - 1 then
            Delete (role, length (role) - 1, 2);
          End;
        end;
      end;
    role := StringReplace (role, ',', ' -', true, true, false);
    if lat = '' then lat := rus;
    GetNameUserPerson (rus, lat, Name, TransName, true);
    if length (tmp2) > 0 then
      Begin
      if (ShowPersonAs = 3) Or (ShowPersonAs = 4) Or (ShowPersonAs = 5) then
        tmp2 := tmp2 + #13#10
      else
        tmp2 := tmp2 + ', ';
      End;
    if createLink = true then
      begin
      if Name <> '' then
        tmp2 := tmp2 + '<link name="' + Name + '">' + Name + '</link>';
      if (Name <> '') And (TransName <> '') then
        tmp2 := tmp2 + ' / ';
      if TransName <> '' then
        tmp2 := tmp2 + '<link tname="' + TransName + '">' + TransName + '</link>';
      end
    else
      begin
        if Name <> '' then
          tmp2 := tmp2 + Name;
      if (Name <> '') And (TransName <> '') then
        tmp2 := tmp2 + ' / ';
      if TransName <> '' then
        tmp2 := tmp2 + TransName;
      end;
    if (ShowPersonAs = 3) Or (ShowPersonAs = 4) Or (ShowPersonAs = 5) then
      tmp2 := tmp2 + ' ' + role;
    Delete (tmp, 1, pos ('</span><br><br>', tmp));
    end;
  if AllowAddByName (optDouble, ufDouble) then AddCustomFieldValueByName(ufDouble, tmp2);
End;

// ******** ParseDoYouKnow ********** Парсим Знаете ли Вы, что *****
procedure ParseDoYouKnow(HTML : WideString);
var
 curPos		 		: Integer;	// Начальная и конечная позиции
 First				: Integer;
 Tmp				: WideString;   // Временные переменные
Begin
  First := Pos(mcFilmFirst, HTML);
  // Знаете ли вы, что
  curPos := PosFrom('Знаете ли Вы, что...', HTML, First);
  if curPos > 0 then
    begin
      Tmp := ListSign + HTMLValues2(HTML, '<ul class="trivia">', '</ul>', '<li', '</li>', ListDelim + ListSign, curPos);
      if AllowAddByName (optDoYouKnow, ufDoYouKnow) then AddCustomFieldValueByName(ufDoYouKnow, Replace (Tmp));
    end;
End;

// ******** ParseAwards ************* Парсим страницу с наградами ** 
const
 CountAwards = 23;
type
  tDelim  = record
   word   : WideString;
   start  : Integer;
   shift  : Integer;
   end;
procedure ParseAwards(HTML : WideString);
var
  pos1, pos2, pos3, save	  : Integer;
  posEndAward, posStartCategory : Integer;
  tmpAll, tmp               : WideString;
  Event, Year, Category     : WideString;
  Recipient, Award          : WideString;
  tagAwards                 : array[1..CountAwards] of WideString;  // Слова, определяющие награду
  won                       : Boolean;
  Items, recipients         : TWideArray;
  i, j, iCountry, iDelim    : longint;
  Country                   : TWideArray;
  hasCategory               : Boolean;
  delims                    : array of tDelim;
begin
  pos1 := Pos ('<div style="background-color:#f2f2f2;padding:15px">', HTML);
  if pos1 > 0 then
    Begin
    tmp := TextBetween (HTML, '<div style="background-color:#f2f2f2;padding:15px">', '</div>', true, pos1);
    if optMoreAwards = Enabled then AddCustomFieldValueByName(ufMoreAwards, Replace (Tmp));
    End;

  tagAwards[ 1]:='почётный оскар';     // Почётный Оскар - Оскар
  tagAwards[ 2]:='премия';             // Премия Isvema - Венецианский кинофестиваль
                                       // Премия Детского фонда ООН - Берлинский кинофестиваль
                                       // Премия Джона Грирсона за лучший короткометражный фильм - Британская академия
                                       // Премия Дон Кихота - Берлинский кинофестиваль
                                       // Премия имени Александра Корды за самый выдающийся британский фильм года - Британская академия
                                       // Премия имени Дэвида Лина за достижения в режиссуре - Британская академия
                                       // Премия имени Карла Формана самому многообещающему новичку - Британская академия
                                       // Премия имени Энтони Эскуита за достижения в создании музыки к фильму - Британская академия
                                       // Премия Майкла Бэлкона за вклад в британское кино - Британская академия
                                       // Премия Манфреда Зальгебера - Берлинский кинофестиваль
                                       // Премия международного союза кинокритиков - Берлинский кинофестиваль
                                       // Премия недели международных критиков - Венецианский кинофестиваль
                                       // Премия объединенных наций - Британская академия
                                       // Премия Флаэрти за лучший документальный фильм - Британская академия
                                       // Серебряная премия - Каннский кинофестиваль
  tagAwards[ 3]:='приз';               // Большой приз жюри - Каннский кинофестиваль
                                       // Большой приз фестиваля - Каннский кинофестиваль
                                       // Бронзовый Приз - Берлинский кинофестиваль
                                       // Золотой приз - Берлинский кинофестиваль
                                       // Почетный приз Berlinale Camera Award - Берлинский кинофестиваль
                                       // Приз Caligari за инновации в Программе молодого кино - Берлинский кинофестиваль
                                       // Приз DIALOGUE en Perspective - Берлинский кинофестиваль
                                       // Приз Femina-Film Prize - Берлинский кинофестиваль
                                       // Приз Le Premier Regard Award - Каннский кинофестиваль
                                       // Приз Peace Film Award - Берлинский кинофестиваль
                                       // Приз Planet Documentary Film Award - Берлинский кинофестиваль
                                       // Приз Prix UIP Berlin за лучший европейский короткометражный фильм - Берлинский кинофестиваль
                                       // Приз Regards Jeune - Каннский кинофестиваль
                                       // Приз Teddy - Берлинский кинофестиваль
                                       // Приз Альфреда Бауэра - Берлинский кинофестиваль
                                       // Приз ассоциации европейских кинотеатров - Берлинский кинофестиваль
                                       // Приз ассоциации независимого кино (ACID) - Каннский кинофестиваль
                                       // Приз Британской Академии человеку года - Британская академия
                                       // Приз газеты Berliner Morgenpost - Берлинский кинофестиваль
                                       // Приз газеты Berliner Zeitung - Берлинский кинофестиваль
                                       // Приз газеты Siegessaule - Берлинский кинофестиваль
                                       // Приз газеты Tagesspiegel - Берлинский кинофестиваль
                                       // Приз газеты Zitty - Берлинский кинофестиваль
                                       // Приз гильдии немецкого арт-хауса - Берлинский кинофестиваль
                                       // Приз Граса Савойе - Каннский кинофестиваль
                                       // Приз дебютанта Каннского кинофестиваля - Каннский кинофестиваль
                                       // Приз Европейской конфедерации художественного кино - Берлинский кинофестиваль
                                       // Приз Европейской конфедерации художественного кино - Каннский кинофестиваль
                                       // Приз жюри - Каннский кинофестиваль
                                       // Приз за лучший дебют - Берлинский кинофестиваль
                                       // Приз за лучший дизайн DVD - Каннский кинофестиваль
                                       // Приз за лучший короткометражный фильм о Берлине - Берлинский кинофестиваль
                                       // Приз за лучший короткометражный фильм от компании «Кодак» - Каннский кинофестиваль
                                       // Приз за лучший сценарий от общества драматических авторов и композиторов (SACD) - Каннский кинофестиваль
                                       // Приз за лучшую дебютную картину - Берлинский кинофестиваль
                                       // Приз за лучшую реставрацию материала на DVD - Каннский кинофестиваль
                                       // Приз за художественные достоинства - Оскар
                                       // Приз за художественный вклад - Каннский кинофестиваль
                                       // Приз зрительских симпатий - Берлинский кинофестиваль
                                       // Приз зрительских симпатий - Британская академия
                                       // Приз имени Вольфганга Штаудте - Берлинский кинофестиваль
                                       // Приз имени Отто Дибелиуса международного евангелического жюри - Берлинский кинофестиваль
                                       // Приз «Интерфильма» - почетное упоминание - Берлинский кинофестиваль
                                       // Приз компании «Шопар» - Каннский кинофестиваль
                                       // Приз Луиджи де Лаурентиса - Венецианский кинофестиваль
                                       // Приз Марчелло Мастрояни - Венецианский кинофестиваль
                                       // Приз международного евангелического жюри - Берлинский кинофестиваль
                                       // Приз международного комитета по амнистиям - Берлинский кинофестиваль
                                       // Приз Международного центра фильмов для детей и молодежи (C.I.F.E.J.) - Берлинский кинофестиваль
                                       // Приз международной ассоциации кинокритиков (ФИПРЕССИ) - Каннский кинофестиваль
                                       // Приз Международной Католической организации в области кино - Берлинский кинофестиваль
                                       // Приз молодежного жюри - Каннский кинофестиваль
                                       // Приз молодому кинематографисту по итогам Berlinale Talent Campus - Берлинский кинофестиваль
                                       // Приз молодых кинокритиков - Каннский кинофестиваль
                                       // Приз немецкого фонда помощи детям - Берлинский кинофестиваль
                                       // Приз Пасинетти - Венецианский кинофестиваль
                                       // Приз программы по обмену деятелей искусства (DAAD) за лучший короткометражный фильм - Берлинский кинофестиваль
                                       // Приз сенатора в честь женщин, молодости и семьи - Берлинский кинофестиваль
                                       // Приз Сети продвижения азиатского кино (NETPAC) - Берлинский кинофестиваль
                                       // Приз ФИПРЕССИ (конкурсная программа) - Каннский кинофестиваль
                                       // Приз фонда Марии Шелл - Берлинский кинофестиваль
                                       // Приз Франсуа Шале - Каннский кинофестиваль
                                       // Приз французской ассоциации киноискусств (AFCAE) - Каннский кинофестиваль
                                       // Приз французской культуры - Каннский кинофестиваль
                                       // Приз Французской системы национального образования - Каннский кинофестиваль
                                       // Приз экуменического (христианского) жюри - Берлинский кинофестиваль
                                       // Приз экуменического (христианского) жюри - Каннский кинофестиваль
                                       // Приз юношеского кинематографа - Берлинский кинофестиваль
                                       // Серебряный приз - Берлинский кинофестиваль
                                       // Специальная рекомендация Международной Католической организации в области кино - Берлинский кинофестиваль
                                       // Специальный приз Берлина - Берлинский кинофестиваль
                                       // Специальный приз жюри - Венецианский кинофестиваль
                                       // Специальный приз фестиваля Blue Angel за лучший европейский фильм - Берлинский кинофестиваль
  tagAwards[ 4]:='награда';            // Награда «Canal+» - Каннский кинофестиваль
                                       // Награда C.I.D.A.L.C. - Берлинский кинофестиваль
                                       // Награда CinemAvvenire - Венецианский кинофестиваль
                                       // Награда от прессы - Каннский кинофестиваль
                                       // Специальная награда - Британская академия
                                       // Специальная режиссерская награда - Венецианский кинофестиваль
  tagAwards[ 5]:='пальмовая ветвь';    // Золотая пальмовая ветвь - Каннский кинофестиваль
                                       // Почетная пальмовая ветвь - Каннский кинофестиваль
  tagAwards[ 6]:='золотая рельса';     // Большая золотая рельса - Каннский кинофестиваль
                                       // Малая золотая рельса - Каннский кинофестиваль
  tagAwards[ 7]:='золотая камера';     // Золотая камера - Каннский кинофестиваль
  tagAwards[ 8]:='особый взгляд';      // Особый взгляд Каннского кинофестиваля - Каннский кинофестиваль
  tagAwards[ 9]:='золотой наставник';  // Золотой наставник - Каннский кинофестиваль
  tagAwards[10]:='гран-при';           // Гран-при - ММКФ
                                       // Гран-при немецкого фонда помощи детям - Берлинский кинофестиваль
                                       // Технический гран-при - Каннский кинофестиваль
  tagAwards[11]:='надежда французского кино';  // Надежда французского кино - Каннский кинофестиваль
  tagAwards[12]:='упоминание';         // Особое упоминание - Берлинский кинофестиваль
                                       // Особое упоминание - Венецианский кинофестиваль
                                       // Особое упоминание - Каннский кинофестиваль
                                       // Почетное упоминание - Берлинский кинофестиваль
  tagAwards[13]:='медведь';            // Бронзовый Медведь - Берлинский кинофестиваль
                                       // Золотой Медведь - Берлинский кинофестиваль
                                       // Серебряный Медведь - Берлинский кинофестиваль
                                       // Хрустальный медведь - Берлинский кинофестиваль
  tagAwards[14]:='стипендия';          // Стипендия от Нью-Йоркской киноакадемии - Берлинский кинофестиваль
  tagAwards[15]:='диплом';             // Диплом - ММКФ
                                       // Диплом C.I.D.A.L.C. - Берлинский кинофестиваль
                                       // Почетный диплом - ММКФ
  tagAwards[16]:='лев';                // Золотой лев - Венецианский кинофестиваль
                                       // Малый золотой лев - Венецианский кинофестиваль
                                       // Серебряный лев - Венецианский кинофестиваль
                                       // Специальный лев - Венецианский кинофестиваль
  tagAwards[17]:='озеллы';             // Золотые Озеллы - Венецианский кинофестиваль
  tagAwards[18]:='кубок';              // Кубок Вольпи - Венецианский кинофестиваль
                                       // Кубок Муссолини - Венецианский кинофестиваль
  tagAwards[19]:='венецианские горизонты';  // Венецианские горизонты - Венецианский кинофестиваль
  tagAwards[20]:='медаль';             // Золотая медаль президента Сената - Венецианский кинофестиваль
                                       // Медаль - Венецианский кинофестиваль
                                       // Медаль имени Джона Боннера - Оскар
  tagAwards[21]:='рекомендация';       // Специальная рекомендация - Венецианский кинофестиваль
  tagAwards[22]:='святой георгий';     // Бронзовый «Святой Георгий» - ММКФ
                                       // Золотой «Святой Георгий» - ММКФ
                                       // Серебряный «Святой Георгий» - ММКФ
  tagAwards[23]:='сертификат';         // Сертификат заслуг - Британская академия
  
  SetLength (delims, 12);
  delims[ 0].word  := 'Медведь - специальный приз';  // Например: Серебряный Медведь - специальный приз за лучшую комедию
  delims[ 0].start := 7;
  delims[ 0].shift := 3;
  delims[ 1].word  := 'Медведь - почетный приз';  // Например: Серебряный Медведь - почетный приз за короткометражный документальный фильм или фильм о культуре
  delims[ 1].start := 7;
  delims[ 1].shift := 3;
  delims[ 2].word  := 'CinemAvvenire - Кино ';  // Например: Награда CinemAvvenire - Кино за мир во всем мире
  delims[ 2].start := 13;
  delims[ 2].shift := 3;
  delims[ 3].word  := 'Пасинетти - особый приз лучшему';  // Например: Приз Пасинетти - особый приз лучшему актеру
  delims[ 3].start := 23;
  delims[ 3].shift := 1;
  delims[ 4].word  := '(SACD) - ';   // Например: Приз общества драматических авторов и композиторов (SACD) - лучший фильм
  delims[ 4].start := 6;
  delims[ 4].shift := 3;
  delims[ 5].word  := ' за ';        // Например: Премия имени Энтони Эскуита за достижения в создании музыки к фильму
  delims[ 5].shift := 1;
  delims[ 6].word  := ' (';          // Например: Приз молодежного жюри (иностранное кино)
  delims[ 6].shift := 2;
  delims[ 7].word  := ' - ';         // Например: Приз молодых кинокритиков - лучший фильм
  delims[ 7].shift := 3;
  delims[ 8].word  := ' в рамках ';  // Например: Приз Regards Jeune в рамках «Недели критиков»
  delims[ 8].shift := 1;
  delims[ 9].word  := ' лучше';      // Например: Приз компании «Шопар» лучшей молодой актрисе
  delims[ 9].shift := 1;
  delims[10].word  := ' в ';         // Например: Приз Regards Jeune в рамках «Недели критиков»
  delims[10].shift := 1;
  delims[11].word  := ' культуры ';  // Например: Приз французской культуры иностранному кинематографисту года
  delims[11].start := 9;
  delims[11].shift := 1;

  save := 1;
  ExplodeString (Countries, Country, ',');
  For iCountry := Low (Country) to High (Country) do  // Разделение страны-производителя со скобками на две. Например: Германия (ФРГ)
    Begin
    pos1 := Pos ('(', Country[iCountry]);
    if pos1 > 0 then
      Begin
      SetLength (Country, High (Country) + 2);
      Country [High (Country)] := Copy (Country[iCountry], pos1 + 1, Pos (')', Country[iCountry]) - pos1 - 1);
      Delete (Country[iCountry], pos1 - 1, Length (Country[iCountry]) - pos1 + 2);
      End;
    End;
  while save > 0 do  // Цикл по событиям
    begin
    save := PosFrom('<table cellspacing=0 cellpadding=0 border=0 width=100% style="border:1px solid #ccc', HTML, save + 1);  // Начало события
    if save > 0 then
      begin
      tmpAll := copy (HTML, save, PosFrom ('</table>', HTML, save) - save);  // Событие целиком
      pos1 := 1;
      tmp := TextBetween (tmpAll, '<td height=40 class="news" style="padding:10px">', '</td>', false, pos1);  // Название события с годом
      pos2 := Pos (',', tmp);
      event := Replace (copy(tmp, 1, pos2 - 1));
      year := copy (tmp, pos2 + 2, length (tmp) - pos2 - 5);
      tmp := TextBetween (tmpAll, '<tr>', '</tr>', false, pos1);  // Раздел: награды или номинации - целиком
      while length (tmp) > 7 do // Пока там что-то осмысленное (бывает короткое &nbsp;)
        begin
        if (pos ('Номинации', tmp) > 0) then  // Если нет признака номинации, считаю наградой
          won := false
        else 
          won := true;
        tmp := Replace (HTMLValues2 (tmpAll, '<tr>', '</tr>', '<li', '</li>', ';', pos1));  // Все награды(номинации) через точку с запятой
        tmp := StringReplace (tmp, '  ', ' ', true, true, false);
        ExplodeString(tmp, items, ';');
        for i := low (items) to high (items) do  // Разбор наград(номинаций)
          begin
          // Пытаюсь отделить получателя
          pos2 := lastPos('(', items[i]);
          // Следующая проверка не совсем корректна, но, я думаю, вероятность ошибочного срабатывания крайне низка
          // Во всем событии ищутся первые пять символов предположительно получателя, предваренные тегом class='all'>
          if (pos2 <= 0) or (pos('class=''all''>' + copy(items[i], pos2 + 1, 5), tmpAll) <= 0) then
            pos3 := 0
          else
            pos3 := PosFrom (')', items[i], pos2);
          Category := items[i];  // Предварительно считаю название награды(номинации) категорией
          if (pos2 > 0) then
            Delete (Category, pos2 - 1, pos3 + 1 - pos2 + 1);
          award := '';
          recipient := Copy (items[i], pos2 + 1, pos3 - pos2 - 1);

          // Со Святым Георгием делаем финт - меняем местами названия награды и категории
          if pos ('Святой Георгий', Category) > 0 then
            begin
            pos2 := pos (' - ', Category);
            Category := Copy (Category, pos2 + 3, length (Category) - pos2 - 2) + ' - ' + copy (Category, 1, pos2 - 1);
            end;
          if Category = 'Приз зрительских симпатий за лучший короткометражный фильм (программа «Панорама»)' then
            Category := 'Приз зрительских симпатий (программа «Панорама») за лучший короткометражный фильм';
          // Награды, из которых можно выделить категории
          hasCategory :=
            ((Event = 'Британская академия') And
              (Pos ('Сертификат заслуг', Category) = 1)) Or
            ((Event = 'Каннский кинофестиваль') And
              ((Pos ('Большой приз жюри', Category) = 1) Or
              (Pos ('Большой приз фестиваля', Category) = 1) Or
              (Pos ('Золотая пальмовая ветвь', Category) = 1) Or
              (Pos ('Международный приз', Category) = 1) Or
              (Pos ('Особое упоминание', Category) = 1) Or
              (Pos ('Особый приз жюри', Category) = 1) Or
              (Pos ('Приз Regards Jeune', Category) = 1) Or
              (Pos ('Приз жюри', Category) = 1) Or
              (Pos ('Приз компании «Шопар»', Category) = 1) Or
              (Pos ('Приз молодежного жюри', Category) = 1) Or
              (Pos ('Приз молодых кинокритиков', Category) = 1) Or
              (Pos ('Приз общества драматических авторов и композиторов (SACD)', Category) = 1) Or
              (Pos ('Приз ФИПРЕССИ', Category) = 1) Or
              (Pos ('Приз французской культуры', Category) = 1) Or
              (Pos ('Серебряная премия', Category) = 1))) Or
            ((Event = 'Берлинский кинофестиваль') And
              ((Pos ('Бронзовый Медведь', Category) = 1) Or
              (Pos ('Бронзовый Приз', Category) = 1) Or
              (Pos ('Гран-при немецкого фонда помощи детям', Category) = 1) Or
              (Pos ('Золотой Медведь', Category) = 1) Or
              (Pos ('Золотой приз', Category) = 1) Or
              (Pos ('Особое упоминание', Category) = 1) Or
              ((Pos ('Особый приз Международной Католической организации в области кино', Category) = 1) And
                (Category <> 'Особый приз Международной Католической организации в области кино (OCIC)')) Or
              (Pos ('Почетное упоминание', Category) = 1) Or
              ((Pos ('Премия Детского фонда ООН', Category) = 1) And
                (Category <> 'Премия Детского фонда ООН - особое упоминание') And
                (Category <> 'Премия Детского фонда ООН (UNICEF)')) Or
              ((Pos ('Приз «Интерфильма»', Category) = 1) And
                (Category <> 'Приз «Интерфильма» - почетное упоминание')) Or
              ((Pos ('Приз Teddy', Category) = 1) And
                (Category <> 'Приз Teddy - особое упоминание') And
                (Category <> 'Приз Teddy - приз зрительских симпатий') And
                (Category <> 'Приз Teddy - приз от жюри')) Or
              ((Pos ('Приз Европейской конфедерации художественного кино', Category) = 1) And
                (Category <> 'Приз Европейской конфедерации художественного кино - особое упоминание') And
                (Category <> 'Приз Европейской конфедерации художественного кино - почетное упоминание') And
                (Category <> 'Приз Европейской конфедерации художественного кино - рекомендация')) Or
              ((Pos ('Приз зрительских симпатий (программа «Панорама»)', Category) = 1) And
                (Category <> 'Приз зрительских симпатий (программа «Панорама»)')) Or
              (Pos ('Приз имени Отто Дибелиуса международного евангелического жюри', Category) = 1) Or
              (Pos ('Приз лучшему молодому таланту', Category) = 1) Or
              ((Pos ('Приз международного евангелического жюри', Category) = 1) And
                (Category <> 'Приз международного евангелического жюри - особое упоминание') And
                (Category <> 'Приз международного евангелического жюри - рекомендация') And
                (Category <> 'Приз международного евангелического жюри - специальная рекомендация')) Or
              ((Pos ('Приз международной ассоциации кинокритиков', Category) = 1) And
                (Category <> 'Приз международной ассоциации кинокритиков - почетное упоминание') And
                (Category <> 'Приз международной ассоциации кинокритиков - рекомендация') And
                (Category <> 'Приз международной ассоциации кинокритиков (ФИПРЕССИ)')) Or
              ((Pos ('Приз Международной Католической организации в области кино', Category) = 1) And
                (Category <> 'Приз Международной Католической организации в области кино - почетное упоминание') And
                (Category <> 'Приз Международной Католической организации в области кино - рекомендация') And
                (Category <> 'Приз Международной Католической организации в области кино (OCIC)')) Or
              ((Pos ('Приз немецкого фонда помощи детям', Category) = 1) And
                (Category <> 'Приз немецкого фонда помощи детям - особое упоминание') And
                (Category <> 'Приз немецкого фонда помощи детям - особый приз')) Or
              ((Pos ('Приз ФИПРЕССИ', Category) = 1) And
                (Category <> 'Приз ФИПРЕССИ - особый взгляд')) Or
              ((Pos ('Приз экуменического (христианского) жюри', Category) = 1) And
                (Category <> 'Приз экуменического (христианского) жюри - особое упоминание')) Or
              ((Pos ('Приз юношеского кинематографа', Category) = 1) And
                (Category <> 'Приз юношеского кинематографа - особое упоминание')) Or
              ((Pos ('Серебряный Медведь', Category) = 1) And
                (Category <> 'Серебряный Медведь - почетное упоминание')) Or
              (Pos ('Серебряный приз', Category) = 1) Or
              (Pos ('Специальная рекомендация Международной Католической организации в области кино', Category) = 1) Or
              (Pos ('Специальный приз экуменического (христианского) жюри', Category) = 1) Or
              ((Pos ('Стимулирующий приз Международной Католической организации в области кино', Category) = 1) And
                (Category <> 'Стимулирующий приз Международной Католической организации в области кино') And
                (Category <> 'Стимулирующий приз Международной Католической организации в области кино - почетное упоминание')) Or
              ((Pos ('Хрустальный медведь', Category) = 1) And
                (Category <> 'Хрустальный медведь - особое упоминание')))) Or
            ((Event = 'Венецианский кинофестиваль') And
              ((Pos ('Бронзовые Озеллы', Category) = 1) Or
              (Pos ('Золотая медаль', Category) = 1) Or
              ((Pos ('Золотой лев', Category) = 1) And
                (Category <> 'Золотой лев за вклад в мировой кинематограф')) Or
              (Pos ('Золотые Озеллы', Category) = 1) Or
              (Pos ('Кубок Биеннале', Category) = 1) Or
              ((Pos ('Кубок Вольпи', Category) = 1) And
                (Category <> 'Кубок Вольпи - специальное упоминание')) Or
              (Pos ('Кубок Муссолини', Category) = 1) Or
              ((Pos ('Лев Сан-Марко', Category) = 1) And
                (Category <> 'Лев Сан-Марко - Гран-при')) Or
              (Pos ('Награда CinemAvvenire', Category) = 1) Or
              ((Pos ('Особое упоминание', Category) = 1) And
                (Category <> 'Особое упоминание')) Or
              (Pos ('Премия ''Bastone Bianco''', Category) = 1) Or
              (Pos ('Премия итальянских журналистов', Category) = 1) Or
              (Pos ('Премия итальянских критиков', Category) = 1) Or
              (Pos ('Премия международной критики', Category) = 1) Or
              (Pos ('Приз «Kinematrix Film Award»', Category) = 1) Or
              (Pos ('Приз Upstream', Category) = 1) Or
              (Pos ('Приз за лучший детский образовательный фильм', Category) = 1) Or
              (Pos ('Приз за лучший документальный фильм', Category) = 1) Or
              (Pos ('Приз за лучший короткометражный фильм', Category) = 1) Or
              (Pos ('Приз за лучший обучающий или научный фильм', Category) = 1) Or
              (Pos ('Приз за техническое совершенство', Category) = 1) Or
              (Pos ('Приз зрительских симпатий', Category) = 1) Or
              (Pos ('Приз льва Сан-Марко', Category) = 1) Or
              ((Pos ('Приз международной ассоциации кинокритиков', Category) = 1) And
                (Category <> 'Приз международной ассоциации кинокритиков - почетное упоминание') And
                (Category <> 'Приз международной ассоциации кинокритиков (ФИПРЕССИ)')) Or
              (Pos ('Приз молодежного кино', Category) = 1) Or
              ((Pos ('Приз Пасинетти', Category) = 1) And
                (Category <> 'Приз Пасинетти - особое упоминание')) Or
              ((Pos ('Приз Рима', Category) = 1) And
                (Category <> 'Приз Рима - специальное упоминание')) Or
              (Pos ('Приз ФИПРЕССИ', Category) = 1) Or
              (Pos ('Серебряная медаль', Category) = 1) Or
              (Pos ('Серебряные Озеллы', Category) = 1) Or
              (Pos ('Серебряный лев', Category) = 1) Or
              (Pos ('Специальная рекомендация', Category) = 1) Or
              (Pos ('Специальный приз', Category) = 1))) Or
            ((Event = 'ММКФ') And
              ((Pos ('Диплом за', Category) = 1) Or
              (Pos ('Золотой приз', Category) = 1) Or
              (Pos ('Бронзовый «Святой Георгий»', Category) = 1) Or
              (Pos ('Серебряный «Святой Георгий»', Category) = 1) Or
              (Pos ('Золотой «Святой Георгий»', Category) = 1) Or
              (Pos ('Приз ФИПРЕССИ', Category) = 1) Or
              (Pos ('Серебряная премия', Category) = 1) Or
              (Pos ('Специальный приз жюри', Category) = 1)
              ));
          for j := low (tagAwards) to high (tagAwards) do  // Пытаюсь выделить из названия категории название награды
            begin
            if pos(tagAwards[j], LowerCase (Category)) = 0 then
              Continue;

            if hasCategory then
              Begin
              for iDelim := Low (delims) to High (delims) do
                Begin
                posEndAward := LastPos(delims[iDelim].word, Category);
                if posEndAward <= 0 then
                  Continue;
                posEndAward := posEndAward + delims[iDelim].start;
                posStartCategory := posEndAward + delims[iDelim].shift;
                Break;
                End;
              End;
            if (not hasCategory) Or (iDelim > High (delims)) then
              Begin
              posEndAward := length (items[i]) + 1;
              posStartCategory := posEndAward;
              End;
            award := copy (Category, 1, posEndAward - 1);
            Delete (Category, 1, posStartCategory - 1);
            if Length (Category) > 0 then
              if (Category [Length (Category)] = ')') And (Pos ('(', Category) = 0) then
                Delete (Category, Length (Category), 1);
            Break;
            end;
          For iCountry := Low (Country) to High (Country) do  // Удаление страны-получателя для совместимости с наградами персон
            Begin
            pos3 := Pos (Country[iCountry], Category);
            if pos3 > 0 then
              Begin
              Delete (Category, pos3, Length (Country[iCountry]));
              if Category[pos3] = ',' then
                Delete (Category, pos3, 2);
              if Category[pos3 - 2] = ',' then
                Delete (Category, pos3 - 2, 2);
              End;
            End;
          pos3 := Pos (' — «»', Category);
          if pos3 > 0 then
            Delete (Category, pos3, 5);
          if Length (Category) > 0 then
            Category := UpperCase (Category[1]) + Copy (Category, 2, Length (Category) - 1);  // Замена первой буквы категории на заглавную
          if optAward = Enabled then
            Begin
            if (Recipient <> '') then  // Разделение на получателей и добавление их по отдельности
              Begin
              ExplodeString (Recipient, recipients, ',');
              for j := Low (recipients) to High (recipients) do
                AddAward(Event, Award, Category, recipients[j], Year, Won);
              End
            else
              AddAward(Event, Award, Category, Recipient, Year, Won);
            End;
          end;

        tmp := TextBetween (tmpAll, '<tr>', '</tr>', false, pos1);
        end;
      end;
    end;
end;


//******* ParsePosters ******* Парсим страницу с постерами *******
procedure ParsePostersPreview(HTML : WideString);
var
  curPos, i, pos1, ind : integer;
  tmp                  : WideString;
  sizes                : TWideArray;  // массив размеров (в пикселах и байтах)
  cx, cy               : Single;      // отклонения размеров постера от заданного по ширине и высоте
  deviation            : Single;      // отклонение размера постера от заданного
begin
  curPos := 1;
  // Беру весь текст, описывающий постеры. Он включает в себя размеры в пикселах и в байтах
  tmp := HTMLValues2 (HTML, 'alt="Просмотр постера"', '</table>', 'color="#777777">', '</font>', ';', curPos);
  if (miniPoster = true) Or (tmp = '') then  // если постеры не нужны или их нет
    begin
    if ExtraLinks[smPoster] = '' then Inc (mode);  // пропускаем загрузку постера
    end
  else
    begin
    ExplodeString (tmp, sizes, ';');
    deviation := 100;
    for i := low (sizes) to high (sizes) do
      begin
      pos1 := pos ('x', sizes[i]);
      cx := Abs (StrToInt (Copy (sizes[i], 1, pos1 - 1)) / szPosterX - 1);
      cy := Abs (StrToInt (Copy (sizes[i], pos1 + 1, length (sizes[i]) - 1)) / szPosterY - 1);
      if deviation > cx + cy then  // запоминаем индекс постера с наименьшим отклонением
        begin
        deviation := cx + cy;
        ind := i;
        end;
      Inc (i);  // необходимо для пропуска размера в байтах
      end;
    curPos := 1;
    tmp := HTMLValues (HTML, '>' + sizes[ind] + '<', '</td>', '<a href="/picture', '" target', '', curPos);
    if optPosters = Enabled then ExtraLinks[smGetPoster] := BASE_URL + '/picture' + tmp;
    end;
end;


//******* ParseKinoCritic ******* Парсим страницу с киникритикой *******
procedure ParseKinoCritic(HTML : WideString);
var
  curPos, endPos  : Integer;
  Tmp, Tmp2       : WideString;
begin
  curPos := 1;
  curPos := Pos ('>К описанию фильма >><', HTML) + length ('>К описанию фильма >><');
  endPos := PosFrom ('>Назад на страницу фильма...<', HTML, curPos);
  Tmp := Copy (HTML, curPos, endPos - curPos);
  curPos := 1;
  Tmp := StringReplace (Tmp, '<br />', '<br>', true, true, false);
  Tmp := StringReplace (Tmp, #13#10, ' '#13#10, true, true, false);  // Необходимо для замены в тексте на пробел перевода строки, который просто удаляется функцией TextBetween
  Tmp2 := TextBetween (Tmp, 'font-size:18px">', '</td>', true, curPos) + ' (';  // Автор
  Tmp2 := Tmp2 + TextBetween (Tmp, 'align=right>', '</td>', true, curPos) + ')  /' ;  // Оценка
  Tmp2 := Tmp2 + TextBetween (Tmp, '<i>', '</i>', true, curPos) + '/' + #13#10#13#10;  // Жанр
  Tmp2 := Tmp2 + TextBetween (Tmp, '#ccc''>', '<td>', true, curPos) + #13#10;  // Текст
  if optKinoCritic = Enabled then AddCustomFieldValueByName(ufKinoCritic, Replace (Tmp2));
end;


//******* ParseReview ******* Парсим страницу с рецензией *******
procedure ParseReview(HTML : WideString);
var
  curPos, endPos  : Integer;
  Tmp             : WideString;
begin
// В этом закомментированном блоке находится рабочий код загрузки рецензии
// Проблема заключается в отсутствии распознавания тега <br /> функцией TextBetween,
// из-за чего теряются абзацы. Поэтому реализован обход с заменой этого тега на <br>.
// Ждем изменений в функции TextBetween и заменяем функцию на закомментированную
//  curPos := 1;
//  Tmp := TextBetween (HTML, '<td style="padding-top:10px;padding-bottom:20px" colspan=2 class="news">', '<td>', true, curPos);
  curPos := 1;
  curPos := Pos ('>Информация о фильме...<', HTML) + length ('>Информация о фильме...<');
  endPos := PosFrom ('>Информация о фильме...<', HTML, curPos);
  Tmp := Copy (HTML, curPos, endPos - curPos);
  curPos := 1;
  Tmp := StringReplace (Tmp, '<br />', '<br>', true, true, false);
  Tmp := StringReplace (Tmp, #13#10, ' '#13#10, true, true, false);  // Необходимо для замены в тексте на пробел перевода строки, который просто удаляется функцией TextBetween
  Tmp := TextBetween (Tmp, '<td style="padding-top:10px;padding-bottom:20px" colspan=2 class="news">', '<td>', true, curPos);
  if optReview = Enabled then AddCustomFieldValueByName(ufReview, Replace (Tmp));
end;

//******* ParseSeasons ******* Парсим страницу с сезонами *******
procedure ParseSeasons(HTML : WideString);
var
  curPos, endPos, posSeason  : Integer;
  i, Time                    : Integer;
  Tmp                        : WideString;
  OrigTitle                  : WideString;
  Year, Season, Episode      : WideString;
  Times                      : TWideArray;
begin
  curPos := Pos ('<b>Время:</b>', HTML);
  if curPos > 0 then
    Begin
    Tmp := HTMLValues2 (HTML, '<b>Время:</b>', '<br><small>', 'td class="news">', '<br><small>', '', curPos);
    ExplodeString (Tmp, Times, ' ');
    Time := 0;
    for i := Low (Times) + 1 to High (Times) do
      Begin
      if (pos ('дн', Times[i]) = 1) Or (pos ('ден', Times[i]) = 1) then
        Time := Time + 24 * 60 * StrToInt (Times[i - 1]);
      if pos ('час', Times[i]) = 1 then
        Time := Time + 60 * StrToInt (Times[i - 1]);
      if pos ('минут', Times[i]) = 1 then
        Time := Time + StrToInt (Times[i - 1]);
      if pos ('мин.', Times[i]) = 1 then
        Begin
        Time := StrToInt (Times[i - 1]);
        Break;
        End;
      End;
    Tmp := IntToStr (Time);
    if formattedTime then Tmp := CorrectTime (Tmp) else Tmp := Tmp + ' мин';
    if optTimeSerial = Enabled then
      Begin
      if placeTimeSerial = 0 then
        AddCustomFieldValueByName(ufTime, Tmp)
      else
        AddCustomFieldValueByName(ufTimeSerial, Tmp);
      End;
    End;

  posSeason := 1;
  while true do
    Begin
    posSeason := PosFrom ('<td colspan=2 class="news"', HTML, posSeason + 1);
    if posSeason <= 0 then
      Break;
     
    endPos := PosFrom ('</table>', HTML, posSeason);
    Tmp := Copy (HTML, posSeason, endPos - posSeason);
    curPos := 1;
    Season := Replace (HTMLValues2 (Tmp, '<td colspan=2 class="news"', '</td>', '<h1', '</h1>', '', curPos));
    Delete (Season, 1, 6);
    while true do
      Begin
      curPos := PosFrom ('<span style="color:#777">', Tmp, curPos);
      if curPos <= 0 then
        Break;
        
      Episode := Replace (TextBetween (Tmp, '<span style="color:#777">', '</span>', false, curPos));
      Delete (Episode, 1, 7);
      OrigTitle := Replace (TextBetween (Tmp, '<h1 class="moviename-big" style="font-size:16px;padding:0px;color:#444"><b>',
        '</b></h2>', false, curPos));
      Year := Replace (TextBetween (Tmp, 'align=left>', '</td>', false, curPos));
      Year := Copy (Year, Length (Year) - 3, 4);
      if optEpisode = Enabled then AddEpisode('', OrigTitle, '', '', Year, Season, Episode);
      End;
    End;
end;


// ******** CheckDate ************** Преобразовывает строку с датой в короткий формат ****
function CheckDate(s: WideString): WideString;
var
  i, j, num        : Integer;
  months           : array [1..12] of String;
  items            : TWideArray;
  Day, Month, Year : WideString;
begin
  months[ 1] := 'январ';
  months[ 2] := 'феврал';
  months[ 3] := 'март';
  months[ 4] := 'апрел';
  months[ 5] := 'ма';
  months[ 6] := 'июн';
  months[ 7] := 'июл';
  months[ 8] := 'август';
  months[ 9] := 'сентябр';
  months[10] := 'октябр';
  months[11] := 'ноябр';
  months[12] := 'декабр'; 

  ExplodeString (s, items, ' ');
  for i := 0 to 2 do
    Begin
    if i > High (items) then Break;
    
    num := StrToInt (items[i]);
    if num > 0 then  // День или год
      Begin
      if num <= 31 then  // День
        Day := items[i]
      else if (num >= 1000) And (num <= 2200) then  // Год
        Begin
        Year := items[i];
        Break;  // Год - последний
        End;
      End
    else  // Месяц
      Begin
      for j := Low (months) to High (months) do
        if Pos (months[j], LowerCase (items[i])) > 0 then Break;
      End;
      if j <= High (months) then
        Month := IntToStr (j);
    End;

  if Year <> '' then
    Begin
    if Day = '' then
      Day := '01'
    else if length (Day) = 1 then
      Day := '0' + Day;
    if Month = '' then
      Month := '01'
    else if length (Month) = 1 then
      Month := '0' + Month;
    Result := Day + '.' + Month + '.' + Year;
    End
  else
    Result := s;
end;


// ******** CheckDates ************** Преобразовывает строку с датами, разделенными запятыми, в короткий формат ****
function CheckDates (s: WideString): WideString;
var
  Dates  : TWideArray;
  i      : integer;
Begin
  ExplodeString (Replace (s), Dates, ',');
  Result := '';
  for i := low (Dates) to high (Dates) do
    Begin
    if Result <> '' then Result := Result + ', ';
    Result := Result + CheckDate (Dates[i]);
    End;
End;

procedure CheckRus(S: WideString; isRussia: Boolean);
Var
 Rus, En: Word;
 sRus, sEn: WideString;
 I: Integer;
Begin
  sRus := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  sEn  := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  Rus  := 0;
  En   := 0;
  S := Replace (S);
  For I := 1 To Length(S) Do
    Begin
    If Pos(UpperCase(S[I]), sRus) > 0 Then Inc(Rus);
    If Pos(UpperCase(S[I]), sEn) > 0 Then Inc(En);
    End;
  If (Rus > En) Or ((Rus = En) And (isRussia = true)) Then
    FilmCountry := 'Rus';
End;


//****** ParseOpinions ****** Парсим отзывы зрителей ******
var
  strOpinions  : WideString;
procedure ParseOpinions (HTML : WideString);
var
 curPos, endPos, i     : Integer;     // Начальная и конечная позиции
 Tmp, Tmp2, Tmp3, URL  : WideString;   // Временные переменные
 Items                 : TWideArray;
 hasEnd, getMaxCharInOpinion : Boolean;
Begin
  endPos := 1;
 i := nOpinion + 1;

  // Загрузка отзывов
  while true do
    Begin
    if (maxOpinion > 0) And (i > maxOpinion) then Break;
    curPos := PosFrom ('<p class="user"><a href', HTML, endPos);
    if curPos <= 0 then
      Break;
      
    endPos := PosFrom ('<li id="comment_num_vote_', HTML, curPos);
    Tmp := Copy (HTML, curPos, endPos - curPos);  // Отзыв целиком
    Tmp := StringReplace (Tmp, '<br />', '<br>', true, true, false);
    curPos := 1;
    Tmp2 := TextBetween (Tmp, '/">', '</a></p>', false, curPos);  // Имя пользователя
    Tmp2 := Tmp2 + ' /' + TextBetween (Tmp, '<span class="date">', ' | ', false, curPos) + '/'; // Дата создания отзыва
curPos := 1;
    Tmp2 := Tmp2 + '    ' + HTMLValues (Tmp, '<p class="sub_title"', '</p>', '">', '</p>', '', curPos) + #13#10; // Заголовок отзыва

curPos := PosFrom ('<p id="ext_text_', Tmp, curPos);
    Tmp2 := Tmp2 + TextBetween (Tmp, '">', '</p>', true, curPos); // Собственно отзыв

    Tmp2 := Replace (Tmp2);
    Tmp2 := StringReplace (Tmp2, #13#10#13#10, #13#10, true, true, false);
    Tmp2 := StringReplace (Tmp2, #13#10#13#10, #13#10, true, true, false);
    if (maxCharInOpinion > 0) And ((length (strOpinions) + 2 + length (Tmp2)) > maxCharInOpinion) then
      Begin
      i := i - 1;
      getMaxCharInOpinion := true;
      Continue;
      End;
    if strOpinions <> '' then
      strOpinions := strOpinions + #13#10#13#10;
    strOpinions := strOpinions + Tmp2;
//    strOpinions := strOpinions + IntToStr (i);
    Inc (i);
    End;
    
  // Загрузка ссылок на незагруженные отзывы
  while true do
    Begin
    if (maxOpinion <= 0) Or (i <= maxOpinion) Or (maxOpinionURL = -1) Or
      ((maxOpinionURL > 0) And (i > maxOpinion + maxOpinionURL)) then Break;
    curPos := PosFrom ('<h3 class="profile-name"><img', HTML, endPos);
    if curPos <= 0 then
      Break;
      
    endPos := PosFrom ('<div id="comment_num_vote_', HTML, curPos);
    Tmp := Copy (HTML, curPos, endPos - curPos);
    curPos := 1;
    Tmp2 := TextBetween (Tmp, '<h3 class="profile-name">', '</h3>', false, curPos);  // Имя пользователя
    Tmp2 := Tmp2 + ' /' + TextBetween (Tmp, '<td style="color:#fff">', ' | ', false, curPos) + '/'; // Дата создания отзыва
    Tmp3 := HTMLValues2 (Tmp, '<span id=''ext_title_', '<span>', '''>', '<span>', '', curPos); // Заголовок отзыва
    if Tmp3 <> '' then
      Tmp2 := Tmp2 + '    ' + Tmp3;
    URL := BASE_URL + TextBetween (Tmp, 'class="permalink"><a href="', '"', false, curPos);
    if (createLink = true) then
      Begin
      Tmp2 := ListSign + '<link url="' + url + '">' + Tmp2 + '</link>';
      End;
    if (maxCharInOpinion > 0) And ((length (strOpinions) + 2 + length (Tmp2)) > maxCharInOpinion) then
      Begin
      i := i - 1;
      getMaxCharInOpinion := true;
      Continue;
      End;
    if strOpinions <> '' then
      Begin
      if i = maxOpinion + 1 then
        strOpinions := strOpinions + #13#10#13#10
      else
        strOpinions := strOpinions + ListDelim;
      End;
    strOpinions := strOpinions + Tmp2;
    Inc (i);
    End;
  nOpinion := i - 1;

  hasEnd := true;
  if ((maxOpinion = 0) Or (nOpinion < maxOpinion) Or
    (maxOpinionURL = 0) Or (nOpinion < maxOpinion + maxOpinionURL)) And (getMaxCharInOpinion = false) then
    Begin
    curPos := Pos ('<b style="color:#ffffff">', HTML);
    if curPos > 0 then
      Begin
      Tmp2 := Copy (HTML, curPos, PosFrom ('</tr>', HTML, curPos) + 5 - curPos);
      curPos := 1;
      tmp := HTMLValues2 (Tmp2, 'style="color:#ffffff"', '</tr>', '<td align=center width=15 bgcolor="#f2f2f2"', '</a>', ';', curPos);
      if tmp <> '' then
        Begin
        ExplodeString (tmp, items, ';');
        ExtraLinks[smOpinions] := Copy (ExtraLinks[smOpinions], 1, Pos ('/ord/', ExtraLinks[smOpinions]) - 1) +
          '/ord/rating/page/' + items[0] + '/#list';
        hasEnd := false;
        if Mode = smOpinions then
          Dec (Mode);
        End
      End
    End;

  if hasEnd = true then
    Begin
    if mode < smOpinions then
      mode := smOpinions;
    if AllowAddByName (optOpinion, ufOpinion) then AddCustomFieldValueByName(ufOpinion, strOpinions);
    End;
End;


// ******** ParseMovie ************** Парсим страницу с фильмом ****
procedure ParseMovie(MovieURL : WideString; HTML : WideString);
var
 curPos, endPos, i  : Integer;     // Начальная и конечная позиции
 First, FilmEnd     : Integer;
 Tmp, Tmp2          : WideString;  // Временные переменные
 Title, OrigTitle, URLLink : WideString;  // Для похожих фильмов
 isRussia           : Boolean;     // Страна-создатель - Россия
 rusCountry, Items  : TWideArray;  // Список русских стран
Begin
  if MovieURL[Length(MovieUrl)] <> '/' then MovieUrl := MovieUrl + '/';
  // Заполним ссылки на дополнительную информацию о фильме
  // Знаете ли Вы что
  curPos := Pos ('view_info/ok/', MovieURL);
  if curPos = 0 then
    ExtraLinks[smFullInfo] := MovieURL + 'view_info/ok/'
  else
    Begin
    Delete (MovieURL, curPos, 255);
    ParseDoYouKnow (HTML);
    End;
  ExtraLinks[smOpinions] := MovieURL + 'ord/rating/page/1/#list';
  // Создатели фильма
  ExtraLinks[smPersons] := StringReplace(MovieURL, 'level/1/', 'level/19/', True, True, False);
  // Сайты
  if Pos ('<font color="#555555">айты</font>', HTML) > 0 then
    ExtraLinks[smSites] := StringReplace(MovieURL, 'level/1/', 'level/15/', True, True, False);
  // Студии
  if Pos ('<font color="#555555">тудии</font>', HTML) > 0 then
    ExtraLinks[smStudio] := StringReplace(MovieURL, 'level/1/', 'level/91/', True, True, False);
  // Связи
  if Pos ('<font color="#555555">вязи</font>', HTML) > 0 then
    ExtraLinks[smLinks] := StringReplace(MovieURL, 'level/1/', 'level/90/', True, True, False);
  // Слова
  if Pos ('<font color="#555555">лова</font>', HTML) > 0 then
    ExtraLinks[smWords] := StringReplace(MovieURL, 'level/1/', 'level/92/', True, True, False);
  // Награды
  if Pos ('<font color="#555555">аграды</font>', HTML) > 0 then
    ExtraLinks[smAwards] := StringReplace(MovieURL, 'level/1/', 'level/94/', True, True, False);
  // Сезоны
  if Pos ('/level/44/film/', HTML) > 0 then
    ExtraLinks[smSeasons] := StringReplace(MovieURL, 'level/1/', 'level/44/', True, True, False);
  // Кассовые сборы
  if Pos ('/level/85/film/', HTML) > 0 then
    ExtraLinks[smTake] := StringReplace(MovieURL, 'level/1/', 'level/85/', True, True, False);
  // Саундтреки
  if Pos ('/level/93/film/', HTML) > 0 then
    ExtraLinks[smSoundtrack] := StringReplace(MovieURL, 'level/1/', 'level/93/', True, True, False);
  // Поиск постера
  if Pos ('<font color="#555555">остеры</font>', HTML) > 0 then
    ExtraLinks[smSrchPoster] := StringReplace(MovieURL, 'level/1/', 'level/17/', True, True, False);

  LoadPages[smOpinions]   := Enabled = 1;
  LoadPages[smFullInfo]   := pgDoYouKnow = 1;
  LoadPages[smPersons]    := pgPersons = 1;
  LoadPages[smSites]      := pgSites = 1;
  LoadPages[smStudio]     := pgStudio = 1;
  LoadPages[smWords]      := pgWords = 1;
  LoadPages[smLinks]      := pgList = 1;
  LoadPages[smAwards]     := pgAwards = 1;
  LoadPages[smKinoCritic] := pgKinoCritic = 1;
  LoadPages[smReview]     := pgReview = 1;
  LoadPages[smSeasons]    := pgSeasons = 1;
  LoadPages[smTake]       := pgTake = 1;
  LoadPages[smSoundtrack] := pgSoundtrack = 1;
  LoadPages[smSrchPoster] := pgPosters = 1;
  LoadPages[smGetPoster]  := pgPosters = 1;
  LoadPages[smPoster]     := pgPosters = 1;
  LoadPages[smFinished]   := Disabled = 1;

  // Кинокритика
  curPos := Pos ('>Кинокритика<', HTML);
  if curPos > 0 then
    begin
    curPos := PosFrom ('/level/3/rev_id', HTML, curPos);
    if curPos > 0 then
      begin
      endPos := PosFrom ('"', HTML, curPos);
      Tmp:= Copy (HTML, curPos, endPos - curPos);
      ExtraLinks[smKinoCritic] := BASE_URL + Tmp;
      end;
    end;

  // Рецензия
  curPos := Pos ('>Рецензия<', HTML);
  if curPos > 0 then
    begin
    curPos := PosFrom ('/level/3/rev_id', HTML, curPos);
    if curPos > 0 then
      begin
      endPos := PosFrom ('"', HTML, curPos);
      Tmp:= Copy (HTML, curPos, endPos - curPos);
      ExtraLinks[smReview] := BASE_URL + Tmp;
      end;
    end;

  // Версия скрипта
  if AllowAddByName (optVersion, ufVersion) then AddCustomFieldValueByName(ufVersion, SCRIPT_VERSION);
  
  // Заполним поле URL фильма
  if optURL = Enabled then AddFieldValue(mfURL, MovieURL);
  curPos := LastPos('m/', MovieURL);
  tmp := copy(movieURL, curPos+2, 255);
  delete(tmp, length(tmp), 1);
  // Постеры
  tmp := '/images/film/'+tmp+'.jpg';
  if (optPosters = Enabled) and (pos(tmp, html) > 0) then 
    ExtraLinks[smPoster] := BASE_URL+tmp else 
    ExtraLinks[smPoster] := '';
  First := Pos(mcFilmFirst, HTML);
  FilmEnd := Pos(mcFilmEnd, HTML);
//  HTML := Copy(HTML, First, FilmEnd-First);
  First := 1;
  
  // Название фильма и категория фильма
  curPos := PosFrom('<H1 style="padding:0px;margin:0px" class="moviename-big">', HTML, First);
  if (curPos = 0) then
    curPos := PosFrom('<h1 style="margin: 0; padding: 0" class="moviename-big">', HTML, First);
  if curPos > 0 then
    begin
     Tmp := ReplaceToSimple (TextBetween(HTML, '<H1 style="padding:0px;margin:0px" class="moviename-big">', '</H1>', False, curPos));
     if (Tmp = '') then
       Tmp := ReplaceToSimple (TextBetween(HTML, '<h1 style="margin: 0; padding: 0" class="moviename-big">', '</h1>', False, curPos));
     Tmp2 := GetCategory (Tmp);
     Tmp := TVVideo (Tmp);
     if AllowAddByNumber (optCategory, gfCategory) then AddFieldValue(mfCategory, Tmp2);
     if AllowAddByNumber (optTitle, gfTitle) then
       AddFieldValue(mfTitle, Tmp);
     Tmp2 := TVVideo(Tmp);
    end;

  // Страна - должна быть перед оригинальным названием
  ExplodeString (russianCountry, rusCountry, ',');
  curPos := PosFrom('страна', HTML, First);
  isRussia := false;
  if curPos > 0 then
    begin
     Countries := Replace (HTMLValues2(HTML, 'страна', '</tr>', 'href="/level/10/m_act%5Bcountry', '</tr>', ',', curPos));
     for i := Low (rusCountry) to High (rusCountry) do
       Begin
       if Pos (rusCountry[i], Countries) = 1 then
         Begin
         isRussia := true;
         Break;
         End;
       End;
     if AllowAddByNumber (optCountry, gfCountry) then AddFieldValue (mfCountry, Countries);
    end;

  // Оригинальное название
  curPos := PosFrom('<span style="font-size:13px;color:#666">', HTML, First);
  if (curPos = 0) then
    curPos := PosFrom('<span style="color: #666; font-size: 13px">', HTML, First);
  if curPos > 0 then
    begin
    Tmp := ReplaceToSimple (TextBetween(HTML, '<span style="font-size:13px;color:#666">', '</span>', False, curPos));
    if (Tmp = '') then
      Tmp := ReplaceToSimple (TextBetween(HTML, '<span style="color: #666; font-size: 13px">', '</span>', False, curPos));
    case nationality of
      0:
        Begin
        FilmCountry := 'En';
        if Tmp = '' then 
          CheckRus (Tmp, isRussia);
        End;
      1:
        FilmCountry := 'En';
      2:
        FilmCountry := 'Rus';
      3:
        if isRussia = true then
          FilmCountry := 'Rus'
        else
          FilmCountry := 'En';
      End;
    if Tmp = '' then 
      Begin
      Tmp := Tmp2;  // На случай, если не нужен или не будет найден транлит
      if transRusOrigTitle then
        Begin
        curPos := PosFrom ('<img src="/images/film', HTML, First);
        if curPos = 0 then
          curPos := PosFrom ('<img src="/images/image_none.gif"', HTML, First);
        if curPos > 0 then
          Tmp := Replace (TextBetween (HTML, '(', ')', false, curPos));
        End
      End;
    if AllowAddByNumber (optOrigTitle, gfOrigTitle) then
      AddFieldValue(mfOrigTitle, TVVideo(Tmp));
    end;
    
  // Другие названия
  if (optAka = Enabled)
    Or ((optAka = Empty) And (GetFieldValue (gfAka) = '')) then
    Begin
    curPos := PosFrom('<meta name="keywords"', HTML, First);
    if curPos > 0 then
      Begin      
	  Tmp := Replace (TextBetween (HTML, 'кадры  новости сайт  ', '" />', False, curPos));
      if AllowAddByNumber (optAka, gfAka) then
        AddFieldValue (mfAka, Tmp);
//      else if ((optAka = Add) And (Pos (Tmp, GetFieldValue (gfAka)) = 0)) then
//        AddFieldValue (mfAka, GetFieldValue (gfAka) + ' ' + Tmp);
      End;
    End;
    
  // Год выхода
  curPos := PosFrom('год', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'год', '</tr>', 'href="/level/10/m_act%5Byear', '</tr>', ',', curPos));
     Tmp := Copy (Tmp, 1, 4);
     if AllowAddByNumber (optYear, gfYear) then AddFieldValue(mfYear, Tmp);
    end;

  // Слоган
  curPos := PosFrom('слоган', HTML, First);
  if curPos > 0 then
    begin
     Tmp := HTMLValues2(HTML, 'слоган', '</tr>', '<td>', '</td>', ',', curPos);
     If Tmp <> '-' Then
       if AllowAddByNumber (optTagline, gfTagline) then AddFieldValue(mfTagline, Replace (Tmp));
    end;

  // Жанр
  curPos := PosFrom('жанр', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'жанр', '</tr>', 'href="/level/10/m_act%5Bgenre', '</a>', ',', curPos));
     if AllowAddByNumber (optGenre, gfGenre) then AddFieldValue(mfGenre, Tmp);
    end;

  // Бюджет
  curPos := PosFrom('>бюджет<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, '>бюджет<', '</tr>', '<a', '</a>', ',', curPos));
     if AllowAddByName (optBudgetU, ufBudget) then AddCustomFieldValueByName(ufBudget, Tmp);
     if AllowAddByNumber (optBudgetM, gfBudget) then AddFieldValueXML('budget', CheckNum(Tmp));
    end;

  // Маркетинг
  if AllowAddByName (optMarketing, ufMarketing) then
    Begin
    curPos := PosFrom('>маркетинг<', HTML, First);
    if curPos > 0 then
      begin
       Tmp := Replace (HTMLValues2 (HTML, '>маркетинг<', '</tr>', '<a', '</a>', ',', curPos));
       AddCustomFieldValueByName(ufMarketing, Tmp);
      end;
    End;

  // Сборы в США
  curPos := PosFrom('>сборы в США<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'сборы в США', '</tr>', '<a', '</a>', ',', curPos));
     if AllowAddByName (optMoneyUSA, ufMoneyUSA) then AddCustomFieldValueByName(ufMoneyUSA, Tmp);
    end;

  // Сборы в мире
  curPos := PosFrom('>сборы в мире<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'сборы в мире', '</tr>', '<a', '</a>', ',', curPos));
     if pos('=', tmp) > 0 then
       Tmp2 := copy(tmp, pos('+', tmp) + 1, pos('=', tmp) - 2)
     else
       Tmp2 := '';
     Tmp := copy(tmp, pos('=', tmp)+1, 255);
     if AllowAddByName (optMoneyWorldU, ufMoneyWorld) then AddCustomFieldValueByName(ufMoneyWorld, Tmp);
     if AllowAddByNumber (optMoneyWorldM, gfMoneyWorld) then AddFieldValueXML('money', CheckNum(Tmp)); //Сборы
     if AllowAddByName (optMoneyOther, ufMoneyOther) then AddCustomFieldValueByName(ufMoneyOther, Tmp2);
    end;                         

  // Сборы в России
  curPos := PosFrom('>сборы в России</td>', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'сборы в России', '</tr>', '<a', '</a>', ',', curPos));
     if AllowAddByName (optMoneyRUS, ufMoneyRUS) then AddCustomFieldValueByName(ufMoneyRUS, Tmp);
    end;

  // Зрители
  curPos := PosFrom('>зрители<', HTML, First);
  if curPos > 0 then
    begin
     curPos := PosFrom('<img', HTML, curPos);
     tmp := Copy(HTML, curPos, PosFrom('</tr>', HTML, curPos)-curPos);
     tmp2 := '';
     while pos('<img', tmp) > 0 do
       begin
        tmp2 := tmp2 + copy(tmp, pos('alt="', tmp)+5, pos('">', tmp)-pos('alt="', tmp)-5) + ' ';
        delete(tmp, 1, pos('">', tmp)+1);
        tmp2 := tmp2 + copy(tmp, 1, pos('<', tmp) -1);
       end;
     if AllowAddByName (optViewers, ufViewers) then AddCustomFieldValueByName(ufViewers, Replace (Tmp2));
    end;

  // Мировая премьера
  curPos := PosFrom('премьера (мир)', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'премьера (мир)', '</tr>', '<a', '</a>', ',', curPos));
     Tmp2 := CheckDates (Tmp);
     if AllowAddByName (optFirstWorldU, ufFirstWorld) then
       if   LongDate = true then AddCustomFieldValueByName(ufFirstWorld, Tmp)
       else                      AddCustomFieldValueByName(ufFirstWorld, Tmp2);
     if AllowAddByNumber (optFirstWorldM, gfFirstWorld) then AddFieldValueXML('rdate', Tmp2);  //Дата релиза
    end;

  // Премьера в России
  curPos := PosFrom('премьера (РФ)', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'премьера (РФ)', '</tr>', '<a', '</a>', ',', curPos));
     Tmp2 := CheckDates (Tmp);
     if AllowAddByName (optFirstRUS, ufFirstRUS) then
       if   LongDate = true then AddCustomFieldValueByName(ufFirstRUS, Tmp)
       else                      AddCustomFieldValueByName(ufFirstRUS, Tmp2);
    end;

  // Релиз на DVD
  curPos := PosFrom('>релиз на DVD<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, '>релиз на DVD<', '</tr>', '<a', '</', ',', curPos));
     Tmp2 := CheckDates (Tmp);
     if AllowAddByName (optReleaseDVD, ufReleaseDVD) then
       if   LongDate = true then AddCustomFieldValueByName(ufReleaseDVD, Tmp)
       else                      AddCustomFieldValueByName(ufReleaseDVD, Tmp2);
    end;

  // Релиз на Blu-Ray
  curPos := PosFrom('>релиз на Blu-Ray<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, '>релиз на Blu-Ray<', '</tr>', '<a', '</', ',', curPos));
     Tmp2 := CheckDates (Tmp);
     if AllowAddByName (optReleaseBD, ufReleaseBD) then
       if   LongDate = true then AddCustomFieldValueByName(ufReleaseBD, Tmp)
       else                      AddCustomFieldValueByName(ufReleaseBD, Tmp2);
    end;

  // Рейтинг MPAA
  curPos := PosFrom('рейтинг MPAA', HTML, First);
  if curPos > 0 then
    begin
     curPos := PosFrom('<img', HTML, curPos);
     tmp := Copy(HTML, curPos, PosFrom('</a>', HTML, curPos)-curPos);
     tmp := TextBetween (HTML, 'alt=''', '''', true, curPos);
     If (Pos('Рейтинг', TMP) = 0) Or (Pos('Рейтинг', Tmp) > 2)Then
      Begin 
       curPos := PosFrom('рейтинг MPAA', HTML, First);
       Tmp := HTMLValues2(HTML, '<a', '</a>', '>', '</a>', ',', curPos);
      End;
     if (tmp = 'рейтинг R') then //13049
       tmp := 'Рейтинг R - Детям до 17 лет обязательно присутствие родителей'
     else if (tmp = 'рейтинг PG') then // 4135
       tmp := 'Рейтинг PG — Рекомендуется присутствие родителей'
     else if (tmp = 'рейтинг PG-13') then // 3454
       tmp := 'Рейтинг PG-13 — Детям до 13 лет просмотр нежелателен'
     else if (tmp = 'рейтинг G') then // 1394
       tmp := 'Рейтинг G - Нет возрастных ограничений'
     else if (tmp = 'рейтинг NC-17') then // 101
       tmp := 'Рейтинг NC-17 — Лицам до 17 лет просмотр запрещен'
     else if (tmp = 'M') then
       tmp := 'Рейтинг M — Подростковое ограничение, от 11 до 13 лет'
     else if (tmp = 'X') then
       tmp := 'Рейтинг X — На сеанс не допускаются лица, не достигшие 17-летнего возраста'
     else if (tmp = 'GP') then
       tmp := 'Рейтинг GP — Нет возрастных ограничений, рекомендуется присутствие родителей';
     if AllowAddByNumber (optMPAA, gfMPAA) then AddFieldValue(mfMPAA, Tmp);
    end;

  // Длительность
  curPos := PosFrom('>время<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, 'время', '</tr>', '<td>', '</td>', ',', curPos));
     if Tmp = '-' then Tmp := '';
     if formattedTime then Tmp := CorrectTime (Tmp);
     if AllowAddByName (optTime, ufTime) then AddCustomFieldValueByName(ufTime, Tmp);
    end;

  // Описание
  curPos := PosFrom('style="padding:10px;padding-left:20px;" class="news">', HTML, First);
  if curPos > 0 then
    begin
     // Необходимо для удаления пустых строк
     tmp := Replace (TextBetween (HTML, 'style="padding:10px;padding-left:20px;" class="news">', '</tr>', true, First));
     tmp := StringReplace (tmp, #13#10#13#10, #13#10, true, true, false);
     if AllowAddByNumber (optDescription, gfDescription) then AddFieldValue(mfDescription, Replace(Tmp));
    end;

  // Рейтинг Кинопоиска
  curPos := PosFrom('<a href="/level/83/', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, '<a href="/level/83/', '</a>', 'class="continue"', '<span', ',', curPos));
     if AllowAddByNumber (optRating, gfORating) then AddFieldValue(mfRating, Tmp);
    end;

  // Рейтинг IMDB
  curPos := PosFrom('>IMDB: ', HTML, First);
  if curPos > 0 then
    begin
     curPos := curPos + 7;
     endPos := PosFrom (' (', HTML, curPos);
     Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
     if AllowAddByNumber (optRatingIMDB, gfIMDBRating) then AddFieldValueXML('imdbrating', Tmp);
    end;

  // Top250
  curPos := PosFrom('>Toп250:', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (TextBetween(HTML, '"continue">', '</a>', false, curPos));
     if AllowAddByName (optTop250, ufTop250) then AddCustomFieldValueByName(ufTop250, Tmp);
    end;

  // Отзывы зрителей
  nOpinion := 0;
  ParseOpinions (HTML);

  // Прогнозируемая оценка
  curPos := PosFrom('>Прогнозируемая оценка<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2(HTML, '>Прогнозируемая оценка<', '</tr>', '&rating=', '</a>', '''', curPos));
     if AllowAddByName (optPrognosRating, ufPrognosRating) then AddCustomFieldValueByName(ufPrognosRating, Tmp);
    end;

  // Похожие фильмы
  if addLikeFilms2Links then
    Begin
    curPos := PosFrom ('>Если вам понравился этот фильм, не пропустите:<', HTML, First);
    if curPos > 0 then
      Begin
      endPos := PosFrom ('</table>', HTML, curPos);
      Tmp := Copy (HTML, curPos, endPos - curPos);
      endPos := 1;
      while true do
        Begin
        curPos := PosFrom ('<td ', Tmp, endPos);
        if curPos = 0 then
          Break;
        endPos := PosFrom ('</td>', Tmp, curPos) + 5;
        Tmp2 := Copy (Tmp, curPos, endPos - curPos);
        curPos := 1;
        URLLink := TextBetween (Tmp2, '"><a href="', '">', false, curPos);
        if URLLink <> '' then
          URLLink := BASE_URL + URLLink;
        Title := TextBetween (Tmp2, 'class="all">', '</a>', false, curPos);
        if Title = '' then
          Continue;
        OrigTitle := TextBetween (Tmp2, 'style=''color:#777''>', '</span>', false, curPos);
        if optConnection = Enabled then
          AddConnection (Title, OrigTitle, 'Похожие фильмы:', URLLink, '');
        End;
      End;
    End;
End;


// ******** ParseSearchResults ****** Парсим результаты поиска *****
procedure ParseSearchResults(HTML : WideString);
var
 curPos, EndPos 		: Integer;	// Начальная и конечная позиции
 Title, Title2			: WideString;   // Заголовки фильма
 Year, URL 			: WideString;   // Год выпуска и ссылка на фильм
begin
  // Начнем с первого результата
  curPos := Pos(mcSearchFirst, HTML); 
  // Если результатов нет - ошибка, закончим процедуру
  if curPos = 0 then Exit;      
  // Вырежем кусок кода, содержащий результаты
  HTML := Copy(HTML, curPos, Pos(mcSearchEnd, HTML) - curPos); 

  // Перейдем к первому фильму
  curPos := Pos(mcFilmLink1, HTML);

  // Парсинг результатов поиска пока начальная позиция больше нуля
  while (curPos > 0) do 
    begin
    // Вычисляем ссылку на фильм вида /level/1/film/ХХХХХХ/sr/1/
    EndPos := PosFrom(mcFilmLink2, HTML, curPos);
    //Сохраняем URL для этого фильма
    URL := BASE_URL + Copy(HTML, curPos, EndPos - curPos);
    if pgDoYouKnow = Enabled then
      URL := URL + 'view_info/ok/';    

    //Вычисляем название этого фильма, сохраняем в Title
    curPos := PosFrom('>', HTML, EndPos) + 1;
    EndPos := PosFrom('</a>', HTML, curPos);
    Title := Replace (Copy(HTML, curPos, EndPos - curPos));

    //Вычисляем год этого фильма, пишем в Year
    endPos := PosFrom ('<a', HTML, endPos);
    endPos := PosFrom ('>', HTML, endPos);
    Year := Copy (HTML, endPos + 1, 4);
//    Year := TextBetween(HTML, 'class=orange>', '</a>', False, EndPos);

    //Вычисляем второе название этого фильма, пишем в Title2
    Title2 := Replace (TextBetween(HTML, '<font color="#999999">', '</font>', False, EndPos));
    if Title2 = '...' then Title2 := '';
    if length (Title2) >= 4 then Delete (Title2, 1, 4);

    // Добавляем в результаты поиска
    AddSearchResult(Title, Title2, Year, URL, '');
    //ShowMessage(Title+' | '+Title2+' | '+Year+' | '+URL, 'Search Result');

    // Ищем еще ссылки (если не найдем - результат будет 0)
    curPos := PosFrom(mcFilmLink1, HTML, EndPos); 
    end;
end;


//========== Разбор кассовых сборов ==========//
procedure ParseTake (const HTML : WideString);
Var
  curPos, endPos : Integer;
  Tmp, Block     : WideString;
Begin
  if optMoneyUSA = Enabled then
    Begin
    curPos := Pos ('>В США:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('0px">', HTML, curPos) + 5;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        AddCustomFieldValueByName (ufMoneyUSA, Tmp);
      End;
    End;

  if optNetAvails = Enabled then
    Begin
    curPos := Pos ('>Чистая выручка киностудии:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('0px">', HTML, curPos) + 5;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        AddCustomFieldValueByName (ufNetAvails, Tmp);
      End;
    End;

  if optMoneyOther = Enabled then
    Begin
    curPos := Pos ('>В других странах:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('0px">', HTML, curPos) + 5;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        AddCustomFieldValueByName (ufMoneyOther, Tmp);
      End;
    End;

  if optMoneyRUS = Enabled then
    Begin
    curPos := Pos ('>В России:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('0px">', HTML, curPos) + 5;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        AddCustomFieldValueByName (ufMoneyRUS, Tmp);
      End;
    End;

  if (optMoneyWorldM = Enabled) Or AllowAddByName (optMoneyWorldU, ufMoneyWorld) then
    Begin
    curPos := Pos ('>Общие сборы:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('"#ff6600">', HTML, curPos) + 10;
      endPos := PosFrom ('</font>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        Begin
        if optMoneyWorldM = Enabled then
          AddFieldValueXML ('money', CheckNum(Tmp));
        if AllowAddByName (optMoneyWorldU, ufMoneyWorld) then
          AddCustomFieldValueByName (ufMoneyWorld, Tmp);
        End;
      End;
    End;

  if (optBudgetM = Enabled) Or (optBudgetU = Enabled) then
    Begin
    curPos := Pos ('>Бюджет:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('0px">', HTML, curPos) + 5;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        Begin
        if optBudgetM = Enabled then
          AddFieldValueXML ('budget', CheckNum(Tmp));
        if optBudgetU = Enabled then
          AddCustomFieldValueByName (ufBudget, Tmp);
        End;
      End;
    End;

  if AllowAddByName (optMarketing, ufMarketing) then
    Begin
    curPos := Pos ('>Маркетинг:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('0px">', HTML, curPos) + 5;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        AddCustomFieldValueByName (ufMarketing, Tmp);
      End;
    End;

  if (optCost = Enabled) then
    Begin
    curPos := Pos ('>Итого:<', HTML);
    if (curPos > 0) then
      Begin
      curPos := PosFrom ('"#ff6600">', HTML, curPos) + 10;
      endPos := PosFrom ('</h3>', HTML, curPos);
      Tmp := Replace (Copy (HTML, curPos, endPos - curPos));
      if Tmp <> '--' then
        AddCustomFieldValueByName (ufCost, Tmp);
      End;
    End;

  curPos := Pos ('>Первый уик-энд (США)<', HTML);
  if curPos > 0 then
    Begin
    endPos := PosFrom ('</table>', HTML, curPos);
    Block := Copy (HTML, curPos, endPos - curPos);

    if (optLimitedWeekend = Enabled) then
      Begin
      curPos := Pos ('>Ограниченный прокат:<', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom ('0px">', Block, curPos) + 5;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufLimitedWeekend, Tmp);
        End;
      End;

    if (optFirstWeekend = Enabled) then
      Begin
      curPos := Pos ('>Широкий прокат:<', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom ('#f60">', Block, curPos) + 6;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufFirstWeekend, Tmp);
        End;
      End;

    if (optMaxCinema = Enabled) then
      Begin
      curPos := Pos ('>Макс. кол-во кинотеатров:<', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom (':0px">', Block, curPos) + 6;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufMaxCinema, Tmp);
        End;
      End;
    End;

  curPos := Pos ('>Прокат (США)<', HTML);
  if curPos > 0 then
    Begin
    endPos := PosFrom ('</table>', HTML, curPos);
    Block := Copy (HTML, curPos, endPos - curPos);

    if (optLimitedShow = Enabled) then
      Begin
      curPos := Pos ('Ограниченный прокат:', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom (':0px">', Block, curPos) + 6;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufLimitedShow, Tmp);
        End;
      End;

    if (optGeneralShow = Enabled) then
      Begin
      curPos := Pos ('Широкий прокат:', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom (':0px">', Block, curPos) + 6;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufGeneralShow, Tmp);
        End;
      End;

    if (optEndShow = Enabled) then
      Begin
      curPos := Pos ('>Окончание проката:<', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom (':0px">', Block, curPos) + 6;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufEndShow, Tmp);
        End;
      End;

    if (optTimeShow = Enabled) then
      Begin
      curPos := Pos ('>Продолжительность (', Block);
      if (curPos > 0) then
        Begin
        curPos := PosFrom (':0px">', Block, curPos) + 6;
        endPos := PosFrom ('</h3>', Block, curPos);
        Tmp := Replace (Copy (Block, curPos, endPos - curPos));
        if Tmp <> '--' then
          AddCustomFieldValueByName (ufTimeShow, Tmp);
        End;
      End;
    End;
End;


//========== Разбор саундтреков ==========//
procedure ParseSoundtrack (const HTML: WideString);
Var
  curPos, endPos, endInfo, endTrack : Integer;
  FullInfo, Title, Tmp, Tracks, SubTitle, Track, TrackInfo : WideString;
Begin
  endInfo := 1;
  while true do
    Begin
    curPos := PosFrom ('	<td colspan=2 style="padding-left:20px">'#10 +
      '		<table cellpadding=0 cellspacing=0 width=100% border=0>', HTML, endInfo);
    if curPos = 0 then
      Break;
//    endInfo := PosFrom ('<tr><td colspan=8 style=''border-top:1px solid #ccc''><br></td></tr>', HTML, curPos);
    endInfo := PosFrom ('style=''border-top:1px solid #ccc''><br></td></tr>', HTML, curPos);
    FullInfo := Copy (HTML, curPos, endInfo - curPos);
    
    curPos := Pos ('width=13 height=16 align=left>', FullInfo);
//    ShowMessage (FullInfo, '');
    if curPos = 0 then 
      Continue;
//    Title := TextBetween (FullInfo, 'width=13 height=16 align=left>', '</td>', false, curPos);
    curPos := curPos + 30;
    endPos := PosFrom ('</td>', FullInfo, curPos);
    Title := Copy (FullInfo, curPos, endPos - curPos);
    Title := StringReplace (Title, '<br>', ' /', true, true, false);
    Title := RemoveTags (Title, false);
    if Pos (' /', Title) > 0 then
      Title := Title + '/';
      
    curPos := Pos ('style="padding-left:20px"><small>', FullInfo);
    if curPos > 0 then
      Begin
      SubTitle := TextBetween (FullInfo, '<small>', '</small>', true, curPos);
      SubTitle := StringReplace (SubTitle, #13#10, ', ', true, true, false);
      if SubTitle <> '' then
      Title := Title + ', ' + SubTitle;
      End;
      
    endTrack := 1;
    Tracks := '';
    while true do
      Begin
      curPos := PosFrom ('valign=top style="color:#555">', FullInfo, endTrack);
      if curPos = 0 then
        Break;

      endTrack := PosFrom ('</tr>', FullInfo, curPos);
      TrackInfo := Copy (FullInfo, curPos, endTrack - curPos);

      curPos := 1;
      Tracks := Tracks + Replace (TextBetween (TrackInfo, 'style="color:#555">', '</td>', false, curPos)) + ' ' + 
        Replace (TextBetween (TrackInfo, 'style="color:#f60">', '<br>', false, curPos));

      Track := Replace (TextBetween (TrackInfo, 'style="color:#999">', '</small>', false, curPos));
      if Track <> ' ' then
        Tracks := Tracks + ' /' + Track + '/';

      curPos := PosFrom (':', TrackInfo, curPos);
      if curPos > 0 then
        Begin
        curPos := PrevPos ('>', TrackInfo, curPos) + 1;
        endPos := PosFrom ('</td>', TrackInfo, curPos);
        Tracks := Tracks + ' ... ' + Copy (TrackInfo, curPos, endPos - curPos);
        End;

      Tracks := Tracks + #13#10;
      End;
    
    if Tmp <> '' then
      Tmp := Tmp + #13#10#13#10;
    Tmp := Tmp + Title + #13#10 + Tracks;
    End;
    
  AddCustomFieldValueByName (ufSoundtrack, Tmp);
End;


//========== Получение адреса постера ==========//
procedure ParsePoster (HTML : WideString);
var
  curPos, endPos  : integer;
  url             : WideString;
begin
  curPos := Pos ('<img border=''0'' alt="', HTML);
  if curPos = 0 then
    Exit;
  curPos := PosFrom ('src=''', HTML, curPos) + 5;
  endPos := PosFrom ('''', HTML, curPos);
  url := BASE_URL + Copy (HTML, curPos, endPos - curPos);
  ExtraLinks[smPoster] := url;
end;


// ******** ParsePage *************** Парсим заданный URL **********
function ParsePage(HTML : WideString; URL : String) : Cardinal;
var
  i: longint;
// Tmp : WideString;
begin
  if Not optionsInitialized then
    Begin
    initOptions ();
    loadOptions ();
    optionsInitialized := true;
    End;
{  Tmp := HTMLToText ('---&#1025;---');
  ShowMessage (Tmp, '');
  Result := prFinished;
  Exit;}
  // Если пришла не HTML-страница
  if (Pos ('error.kinopoisk.ru', URL) > 0) Or (Pos('<html', HTML) = 0) then 
     begin
     Result := prError; //произошла ошибка
     Exit;
     end

  // Если нет результатов поиска
  else if Pos(mcNotFound, HTML) > 0 then 
    begin
    Result := prList;
    Exit;
    end

  // Если есть результат поиска
  else if Pos(mcSearchOk, HTML) > 0 then 
    begin
    // Парсим эти результаты
    ParseSearchResults(HTML);
    Result := prList; //получен список фильмов/персон
    Exit;
    end

  else 
    begin
    if MsgDelay Then ShowMessage('Ручная задержка', 'Инфо') else
    for i := 1 to delay do begin end;
    //ShowMessage (IntToStr (Mode), '');
    case mode of
      smSearch        : ParseMovie(URL, HTML);
      smOpinions      : ParseOpinions (HTML);
      smFullInfo      : ParseDoYouKnow(HTML);
      smPersons       : ParsePersons(HTML);
      smSites         : ParseSites(HTML);
      smStudio        : ParseStudio(HTML);
      smWords         : ParseWords(HTML);
      smLinks         : ParseLinks(HTML);
      smAwards        : ParseAwards(HTML);
      smKinoCritic    : ParseKinoCritic(HTML);
      smReview        : ParseReview(HTML);
      smTake          : ParseTake(HTML);
      smSeasons       : ParseSeasons(HTML);
      smSoundtrack    : ParseSoundtrack(HTML);
      smSrchPoster    : ParsePostersPreview(HTML);
      smGetPoster     : ParsePoster(HTML);
      end;

    // Перебираем следующие режимы, пока не найдем режим с непустой страницей
    Repeat
      Inc(Mode);
    until (mode >= smFinished) Or ((GetDownloadURL <> '') And (LoadPages[Mode] = true));
    if Mode >= smFinished then
      Result := prFinished
    else
      Result := prDownload;
  end; 
end;


{
История изменения скрипта загрузки фильмов с сайта Кинопоиск

v1.0.1.3.1 от 07.02.2009
+ Добавлено заполнение наград с полной поддержкой события, награждения, года,
  категории и получателя. Возможно некорректное определение названия награды.
+ В поле 'Роли дублировали' добавлены имена актеров, которых дублировали, по
  аналогии с основным полем 'Актеры'. В связи с отсутствием поддержки такого
  форматирования в пользовательских полях, выглядит это не так, как в поле
  'Актеры', но все-равно наглядно.
+ В рейтинг MPAA, кроме буквы, добавлено описание рейтинга.
+ Добавлен флаг createLink, позволяющий не добавлять страшные теги
  <link url...></link> в пользовательские поля. По умолчанию добавление тегов
  оставлено.
+ Настройки, спасибо за идею djek-ural.
+ Корректировка времени, спасибо за идею djek-ural. Включается флагом
  formattedTime. По умолчанию отключено.
* Взял на себя смелость изменить имя скрипта на 'KinoPoisk.ru by Tsapko А.',
  дабы это влезало на кнопку в мастере добавления фильмов.
* Реализовано удаление пустых строк в полях "Знаете ли Вы, что...".
! Исправлена некорректная обработка (а точнее, её отсутствие) некоторых
  HTML-тегов, в результате чего в полях появлялись символы в виде пустых
  квадратиков.
! Исправлена ошибка с некорректной установкой длительности, если в слогане
  было слово "время".

v1.0.1.3.2 от 07.02.2009
! Устранена ошибка отстутствия деления на обзацы в описании.

v1.0.1.3.3 от 08.02.2009
+ Реализована загрузка постера с первой страницы со списком постеров. Постер
  подбирается ближайший к заданному размеру. Желаемый размер постера
  указывается в параметрах szPosterX и szPosterY. Ключ miniPoster отвечает за
  выбор, откуда грузить постер.
! Устранена ошибка появления пробелов в начале абзацев в описании. Пробелы
  присутствовали в оригинальном описании на сайте, но не видны там из-за
  особенностей отображения HTML.
  Возможно косвенное влияние на другие поля.
  (http://www.kinopoisk.ru/level/1/film/4917/)

v1.0.1.3.4 от 08.02.2009
+ Возможность настраивать стиль списков. Пока имеет отношение только
  к пользовательскому полю "Знаете ли Вы, что...". См. ListDelim и ListSign.
+ Загрузка актеров с ролями, как во встроенном плагине.
* Реализовано несколько вариантов занесения имен русских персонажей
  (см. флаг RusNames).
  Обращаю внимание, что определение национальности актера при загрузке фильма
  на данный момент невозможно, в связи с чем производится косвенное отнесение
  всех персонажей русского/зарубежного фильма к русским/зарубежным.
  Также обращаю внимание, что отнесение фильма к русскому/зарубежному может
  быть неточным, поскольку в некоторых случаях основывается на косвенных
  факторах.
  Кроме всего прочего, принадлежность фильма к русскому/зарубежному не даёт
  100-% гарантии того, что все персонажи в нем такие же.
  Применяйте опцию RusOnlyRus по своему желанию. Жалобы не принимаются.
  С другой стороны, максимум, что Вы можете потерять, это оригинальное имя
  персонажа. Если для Вас это важно, опцию лучше не выставлять в 2.
  Если не хотите получить дубликаты персонажей, опцию лучше выставлять в 1.
! Исправлена ошибка в получении страницы при miniPoster=true и отсутствии
  постера на главной странице
! Поставлена заплатка для решения проблемы тега "Идти по краю бортовой обшивки
  корабля с завязанными глазами (так сбрасывали в море пленников)" из фильма
  "Пираты Карибского моря: Проклятие черной жемчужины", которая выражается в
  пропадании пользовательских полей при вставке этого тега.
  Теперь теги урезаюся до 50 символов. В конце таких тегов ставится многоточие.
  Заплатка будет стоять до устранения ошибки в программе.
  (За наводку спасибо ViNNNtalik).

v1.0.2.0 от 09.02.2009
+ Добавлена загрузка Кинокритики (например,
  http://www.kinopoisk.ru/level/1/film/2361/). Для обеспечения загрузки
  необходимо добавить в базу данных поле 'Кинокритика' типа Memo.
* В поле "Длительность" при его форматировании добавлены секунды для совпадения
  с полем "Длительность" в группе информации о файлах. Обратите внимание, что
  КиноПоиск.Ru даёт информацию о длительности лишь с точностью до минут, поэтому
  секунды всегда будут нулевые.
* Изменен формат длительности по умолчанию. Для обеспечения совместимости
  с версией, поставляемой сейчас в дистрибутиве PVD формат длительности
  по умолчанию изменен на чч:мм:сс
* Убрана запись в поле "Длительность" символа "-" в режиме отображения только
  минут и отсутствии информации о времени на сайте.
* Из имени скрипта убран автор (информация о первоначальном авторстве сохранена
  в тексте скрипта)
* Имя скрипта изменено на 'КиноПоиск.Ru'
* Имя рейтинга изменено на 'КиноПоиск.Ru'

v1.0.3.0 от 10.02.2009
+ Добавлена загрузка Рецензии (например,
  http://www.kinopoisk.ru/level/1/film/2898/). Для обеспечения загрузки
  необходимо добавить в базу данных поле 'Рецензия' типа Memo.
+ Добавлен флаг для отображения времени премьеры в коротком формате
  (10.02.2009). См. описание флага LongDate в скрипте. (предложил moran).
! Исправлено некорректное добавление операторов в случае если оператор
  зарубежный и нет перевода его имени на русский язык (например,
  http://www.kinopoisk.ru/level/19/film/338691/).
! Устранена ошибка установки времени 00:00:00 в поле длительность при
  установленном флажке formattedTime и отсутствии информации о длительности
  на сайте.
! Устранена установка в поле "Жанр" символа "-" при отсутствии информации
  о жанрах на сайте.
! При перичном поиске нового фильма устранена ошибка выдачи списка фильмов,
  совершенно не имеющих отношения к искомому, и возникающая в том случае, когда
  КиноПоиск не выдаёт ни одного результата на этот фильм.

v1.0.4.0 от 11.02.2009
+ Добавлена загрузка Top250. Для его отображения необходимо добавить
  пользовательское поле с именем Top250 типа "Короткий текст".
+ Добавлено заполнение поля "Категории" значениями "сериал", "ТВ" и "видео",
  взятыми из названия.
+ Преобразование в короткую дату теперь работает и на релизах.
* Поле "Релиз на DVD (Blu-Ray)" разделено на поля "Релиз на DVD" и
  "Релиз на Blu-Ray". Необходимо изменить название существующего
  пользовательского поля в базе данных и добавить новое.
* Убрано "(ТВ)" и "(видео)" из связей.
! Устранена ошибка при преобразовании в короткую даты премьеры, в которой даты
  нет (например, Повелитель бури, kinopoisk.ru/level/1/film/281040/).
  Спасибо ViNNNtalik.
! Теперь в короткие даты преобразовывается несколько дат в одном поле.
! Непопадание некоторых фильмов в список поиска. Например, при поиске по
  оригинальному названию "Spider-man" не выдавался самый нужный фильм
  (2002 год).
! Исправлено непоявление окна со списком искомых фильмов.

v1.0.4.1 от 12.02.2009
+ Добавлены опции, позволяющие добавлять префикс и постфикс для
  пользовательских полей (частично предложил unreal666). См. параметры ufPrefix
  и ufPostfix.
+ Добавлена возможность отключать загрузку гонораров актеров (предложил
  ViNNNtalik). См. параметр loadFee.
+ Добавлена возможность отключать загрузку дополнительной информации в роли
  актера, например, "в титрах не указан", "озвучка". См. параметр
  loadExtraRole.
  К сожалению роли, которые полностью состоят из этих слов и уже присутствуют в
  Вашей БД, останутся как есть. Для их очистки необходимо удалить актеров
  вручную и загрузить заново. Это ограничение PVD при загрузке пустых полей.

v1.0.5.0 от 15.02.2009
+ Добавлены опции, позволяющие отключать загрузку целых страниц сайта,
  отвечающих за несколько полей сразу. Это будет удобно для тех, кто хочет
  произвести пакетное обновление одного или нескольких полей, поскольку сильно
  снизит трафик.
  См. опции pgDoYouKnow, pgPersons, pgSites, pgStudio, pgWords, pgList,
  pgAwards, pgKinoCritic, pgReview, pgPosters.
+ Реализована загрузка сборов в мире, кроме США и России (предложил ViNNNtalik).
  Необходимо добавить в БД пользовательское поле с названием
  'Сборы в др. странах' типа "Короткий текст". См. опции ufMoneyOther,
  optMoneyOther.
+ Реализована загрузка наград, описанных общими словами (например,
  http://www.kinopoisk.ru/level/94/film/7967/). Необходимо добавить в БД
  пользовательское поле с названием 'Доп. награды' типа "Memo". См. опции
  optMoreAwards и ufMoreAwards.
+ Реализована загрузка отзывов зрителей. Необходимо добавить в БД
  пользовательское поле с названием 'Отзывы зрителей' типа "Memo". Количество
  загружаемых отзывов настраивается опцией maxOpinion (по умолчанию - 1).
  Отзывы загружаются в порядке расположения на сайте при сортировке по
  рейтингу. При любом значении опции maxOpinion действует ограничение в 18280
  символов, что может приводить к пропуску некоторых отзывов. См. опции
  optOpinion и maxOpinion. 
+ Реализована загрузка прогнозируемой оценки. Необходимо добавить в БД
  пользовательское поле с названием 'Прогн. оценка' типа "Короткий текст".
  Кроме этого, в полях login и password необходимо указать имя и пароль
  пользователя сайта КиноПоиск. Сейчас эта возможность работает только в ветке
  0.9.8.x программы. 
  См. опции login, password, optPrognosRating и
  ufPrognosRating.
+ Реализовано принудительное указание гос.принадлежности фильмов (частично
  предложил NewSky). При любом значении этой опции действуют правила опции
  RusNames. См. опцию nationality.
+ Добавлена возможность ограничить количество загружаемых персон каждого типа.
  Необходимость в такой опции возникла после загрузки информации о сериале
  "Toast of the Town" (http://www.kinopoisk.ru/level/1/film/277827/), в котором
  снялось более 4000 актёров. Загрузка актеров занимала несколько минут.
  Открытие карточки фильма занимало несколько десятков секунд.
  См. опцию maxPersons. По умолчанию установлено ограничение в 100 персон каждого
  типа.
+ Добавлена возможность загрузки рейтинга IMDB. По умолчанию отключено.
  См. опцию optRatingIMDB.
+ Добавлена загрузка информации о сериалах
  (например, http://www.kinopoisk.ru/level/44/film/77046/). См. опции pgSeasons
  и optEpisode.
* Убраны слова "(сериал)" из названия и "(ТВ)", "(видео)" и "(сериал)" из
  оригинального названия. Начиная с версии 1.0.4.0 эти слова заносятся в
  категории.
* Теперь опция optPosters влияет и на загрузку большого постера.
! Устранено слияние слов в рецензиях и кинокритике, проявляющееся в случае
  применения переносов строк в тексте на сайте. За информацию спасибо NewSky.
! Исправлено некорректное определение гос.принадлежности фильма, проявляющееся
  на некоторых фильмах с названием, состоящим из коротких слов (каждое не более
  4 символов).
! Исправлено некорректное определение гос.принадлежности фильма, проявляющееся на
  фильмах с числовыми названиями.
! Исправлена ошибка, связанная с заполнением поля "Зрители" мусором в случае
  отсутствия информации по зрителям на сайте КиноПоиска, но наличию слова
  "зрители" на странице сайта.

v1.0.5.1 от 22.02.2009
+ Добавлена загрузка полного времени сериала. По умолчанию это время грузится
  в поле "Длительность". Если необходимо внесение длительности сериала
  в отдельном поле, то надо создать поле "Длительность сериала" типа
  "Короткий текст". См. опции placeTimeSerial, optTimeSerial и ufTimeSerial.
+ Реализована загрузка отзывов со всех страниц. См. опцию maxOpinion.
+ Добавлено ограничение на количество загружаемых студий (предложил
  galleon2006). См. опции maxStudios, maxStudiosInCat.
* В связях добавлено устранение конечных пробелов и запись в поле "Оригинальное
  название" обычного названия в случае отсутствия оригинального.
! Устранена ошибка "Unexpected exception: Out of string range", возникающая при
  добавлении связи, название фильма для которой не указано на сайте. См.,
  например, "Джей и молчаливый Боб наносят ответный удар"
  (http://www.kinopoisk.ru/level/90/film/719/).

v1.0.5.2 от 01.03.2009
+ Добавлена загрузка URL-ов на незагруженные отзывы (предложил moran).
  См. опцию maxOpinionURL.
+ Добавлена опция для указания русских стран (предложил ViNNNtalik).
  См. опцию nationality, russianCountry.
+ Добавлено отсечение из роли актера следующей дополнительной информации:
  'в титрах не указанa', 'хроника', 'английская версия'. См. опцию
  loadExtraRole.
* Теперь опция loadExtraRole действует и на поле "Роли дублировали".
* Внутренняя реализация. Изменен алгоритм разбора персон. Одинаковые части
  вынесены в отдельную функцию.
! Исправлена ошибка с попаданием HTML-тегов в поле "Тэги". См., например,
  "Сталкер" (http://www.kinopoisk.ru/level/1/film/43970/).
! Добавлена замена HTML-тега '&#150;' на '–'.
! Исправлена ошибка несрабатывания опции ограничения количества загружаемых
  персон (maxPersons) на актёрах при loadExtraRole = false.
! Исправлен неверный алгоритм добавления наград с несколькими получателями:
  теперь добавляется две награды, по одной на каждого из получателей.
! Исправлен разбор наград следующего формата
  "Награда (Получатель) - Название песни". См., например, премию канала MTV
  в фильме "Южный Парк: Большой, длинный, необрезанный"
  (http://www.kinopoisk.ru/level/1/film/2407/).
! Устранено попадание в имена персон и роли HTML-тегов.

v1.0.5.3 от 09.03.2009
+ Добавлена возможность загрузки альтернативных названий. См. опцию optAka.
  К сожалению, разделить названия пока не представляется возможным. За идею
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg5138#msg5138)
  спасибо ViNNNtalik.
* Для унификации изменено описание скрипта на
  "[RU] Импортировать информацию о фильме из КиноПоиск.Ru".
* Оптимизирована загрузка страниц. Теперь не производится попытка загрузить
  страницы с отсутствующим содержимым (сайты, награды, постеры и т.д.).
* При первом поиске фильма и опции pgDoYouKnow=Enabled первой страницей после
  выбора фильма будет страница с развернутым содержимым "Знаете ли Вы, что",
  что позволяет загрузить на одну страницу меньше. К сожалению, при обновлении
  карточки с фильмом такого реализовать нельзя. За идею
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg5117#msg5117)
  спасибо thehil.
* Значение по умолчанию максимального количества символов для загрузки в поле
  "Отзывы зрителей" уменьшено до 18000 в связи с зависанием PVD v0.9.8.20 на
  сериале "24 часа" (http://www.kinopoisk.ru/level/1/film/79564/) при большем
  числе.
* Существенно переделан алгоритм разделения награды на название награды и
  название категории. Обработано более 1000 разных наград. Награды и категории
  приведены в соответствие с сайтом IMDB.com.
* Из награды вида "Лучший фильм на иностранном языке - "Страна"" удаляется
  страна для обеспечения совместимости наградами персон, в которых информация
  о стране не добавляется. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg5084#msg5084)
  спасибо ViNNNtalik.
* Теперь первая буква всех категорий в наградах - прописная.
* Изменен порядок загрузки персон и наград для устранения затирания персоной
  из награды оригинального имени персоны из персон. Побочным эффектом стало
  отображение в наградах не русского имени персоны, а того, что добавляется
  в поле "Имя" в зависимости от значений опций nationality и RusNames.
  Но поскольку этот же эффект появляется и после обновления информации
  о персоне, то считаю это несущественным и предлагаю подождать реализации
  указания необходимого имени персоны в наградах от nostra. Такое пожелание
  было высказано
  (http://www.videodb.info/forum_ru/index.php?topic=153.msg5050#msg5050).
* Переделан алгоритм преобразования длинных дат в короткий формат. Теперь
  корректно преобразуются даты вида "месяц год" и "год".
! Устранена загрузка последующих страниц с отзывами при достижении максимально
  допустимого количества символов, задаваемого опцией maxCharInOpinion.
! Теперь текст всех полей проходит через функцию замены HTML-кодов. Для замены
  добавлены символы, которые потенциально могут встретиться в тексте. За
  информацию
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg5107#msg5107)
  спасибо ViNNNtalik.

v1.0.5.4 от 23.03.2009
+ Добавлена настройка для категории по умолчанию. См. опцию EmptyCategory.
  Категория по умолчанию используется при отстутсвии в названии фильма слов
  (ТВ), (видео), (сериал). Значение по умолчанию - "полнометражный фильм".
+ Добавлена функция замены разного рода кавычек и тире на классические для
  корректной установки связей. В связи с тем, что фильмов-исключений, которым
  нужно такое преобразование, крайне мало, и обещанием nostra сделать связь по
  URL, вызов этой функции по умолчанию отключён. Для её включения см. описание
  опции simpleTitle За информацию
  (http://www.videodb.info/forum_ru/index.php?action=profile;u=95)
  спасибо Resha.
+ Для русских фильмов добавлена возможность вносить в поле
  "Оригинальное название" их транслитерированное название. См. опцию
  transRusOrigTitle. По умолчанию отключено. Предложил
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg5404#msg5404)
  NewSky.
+ Добавлена опция форматирования ссылок. См. опцию formattedURL. По умолчанию
  ссылки форматируются: удаляются ведущие "http://", "www." и всё после "/" -
  остаётся видимым только домен. Ссылка всё равно указывает на нужный адрес.
+ Добавлена загрузка информации о директорах фильма и режиссёрах дубляжа. См.
  опции optManager, ufManager и optDirectorDouble, ufDirectorDouble
  соответственно. Для их отображения необходимо добавить пользовательские поля
  с именами 'Директора фильма' и 'Режиссеры дубляжа' соответственно.
+ Добавлена возможность загружать имена персон в разном виде. См. опцию
  ShowPersonAs.
* Теперь в результатах поиска выдаётся не шесть, а десять фильмов.
* Значение по умолчанию опции LongDate установлено в false для совместимости
  со стандартными полями.

v1.0.5.5 от 07.04.2009
+ В связи добавлены похожие фильмы. См., например, Список Шиндлера
  (http://www.kinopoisk.ru/level/1/film/329/).
+ Добавлены описания рейтингов MPAA: M, X, GP.
* Исправлен алгоритм парсинга страницы поиска в соответствии с изменениями
  на сайте.

v1.0.5.6 от 08.04.2009
* Изменен алгоритм разбора страницы поиска в соответствии с изменениями
  на сайте.
! Исправлено отсутствие загрузки транслитерированного названия русского фильма
  в случае отсутствия у фильма мини-постера. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg5905#msg5905)
  спасибо NewSky.

v1.0.6.0 от 18.04.2009
+ Добавлена возможность использования конфигурационного файла. См. опцию
  pathToConfig. Теперь все пользовательские настройки, доступные для загрузки
  из конфигурационного файла, описаны в процедуре initOptions в начале скрипта.
  Опции можно устанавливать как в скрипте, так и в конфигурационном файле.
  Приоритет имеют опции из конфигурационного файла.
+ Добавлена загрузка Кассовых сборов: выручка киностудии (опции optNetAvails и
  ufNetAvails, поле 'Выручка к/с'), маркетинг (опции optMarketing и
  ufMarketing, поле 'Маркетинг' типа Короткий текст), всего затрат (опции
  optCost и ufCost, поле 'Всего затрат'), сборы с ограниченного проката в
  первый уик-энд (опции optLimitedWeekend и ufLimitedWeekend, поле
  'Перв. уик-энд (США). Огр. прокат'), сборы с широкого проката в первый
  уик-энд (опции optFirstWeekend и ufFirstWeekend, поле
  'Перв. уик-энд (США). Шир. прокат'), макс. кол-во кинотеатров за первый
  уик-энд (опции optMaxCinema и ufMaxCinema, поле
  'Перв. уик-энд (США). Макс. к/т'), начало ограниченного проката в США (опции
  optLimitedShow и ufLimitedShow, поле 'Огр. прокат (США)'), начало широкого
  проката в США (опции optGeneralShow и ufGeneralShow, поле
  'Шир. прокат (США)'), окончание проката в США (опции optEndShow и ufEndShow,
  поле 'Конец проката (США)'), продолжительность проката (опции optTimeShow и
  ufTimeShow, поле 'Время проката (США), дн./нед.').
  Загрузка всей страницы настраивается опцией pgTake. По умолчанию отключено.
* При незаполненном поле login убран запрос на авторизацию.
! При загрузке страницы с ошибкой теперь скрипт завершает работу.

v1.0.7.0 от 19.06.2009
+ Добавлена загрузка информации со страницы "Саундтреки". Предложил
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6159#msg6159)
  ViNNNtalik.
! Исправлено недобавление информации о сериалах при отсутствии указания годов
  их трансляции в заголовке на главной странице.
! Исправлена некорректная загрузка общего времени сериала. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6498#msg6498)
  спасибо unreal666.
! Исправлена загрузка постера в случае, если его название неправильно
  генерировалось на основе названия превью. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6641#msg6641)
  спасибо puljan.
! Исправлена загрузка рейтинга. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6956#msg6956)
  спасибо Arg123.
! Исправлена некорректная загрузка дат релизов и сборов.

v1.0.7.1 beta от 11.07.2009
+ Добавлено пользовательское поле "Версия скрипта" типа "Короткий текст".
! Исправлена некорректная загрузка полей "Бюджет" и "Маркетинг".
! Исправлена неработоспособность скрипта в связи с изменениями на сайте.

v1.0.7.2 от 11.07.2009
! Исправлена некорректная загрузка базовой информации с основной страницы.

v1.0.7.3 от 16.07.2009
! Исправлена неработоспособность скрипта в связи с изменениями на сайте.
! Исправлена неправильная работа скрипта при обновлении нескольких фильмов.

v1.0.7.4 от 02.08.2009
! Исправлено отсутствие загрузки наваний фильмов в связи с изменениями
  на сайте.



Планы на будущее:
* Добавлять к наградам персон.
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg5095#msg5095)
+ Добавить загрузку ссылок на трейлеры.
+ Загружать для эпизодов дату выпуска.
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg5229#msg5229)
+ Добавить возможность загружать дату релиза в любой стране.
+ Добавить возможность загружать сокращенную информацию с первой страницы.
+ Добавить серые галочки
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6500#msg6500)
+ Добавить разделитель для мелких списков
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6500#msg6500)
+ Добавить возможность подключения нескольких файлов конфигурации
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6502#msg6502)
+ Добавить возможность не загружать персон с непереведёнными именами
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6504#msg6504)
+ Добавлять пустую строку между абзацами
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg6935#msg6935)
+ Добавить задержку между загрузками страниц
  (http://www.videodb.info/forum_ru/index.php?topic=153.msg7181#msg7181)
+ Добавлять в стандартное поле "Студии" только необходимые типы Студий
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg7285#msg7285)
+ Добавлять сборы с DVD
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg7310#msg7310)
}
