const
  //Parse results
  prError     = 0; 
  prFinished  = 1;
  prList      = 2;
  prListImage = 3;
  prDownload  = 4;

  //Script data
  SCRIPT_VERSION = '0.1.0.2.2';
  SCRIPT_NAME    = 'TheMovieDB [EN]';
  SCRIPT_DESC    = '[EN] Get Movie Information from TheMovieDB.org';
  SCRIPT_LANG    = $09; //English
  SCRIPT_TYPE    = 0; //Movies
  CODE_PAGE      = 65001; //UTF-8
  RATING_NAME    = 'TMDB';

  APIKEY     = '0a4782bd3877917501a2d45e1198f809';
  BASE_URL   = 'http://www.themoviedb.org';
  SEARCH_URL = 'http://api.themoviedb.org/2.1/Movie.search/en/xml/'+ APIKEY +'/%s';
  MOVIE_URL  = 'http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/'+ APIKEY +'/';
  IMDB_URL   = 'http://www.imdb.com/title/';
  
var
  ParsingMovie: Boolean;
  NextURL, PosterURL: string;

function GetScriptVersion: string;
begin
  Result := SCRIPT_VERSION;
end;

function GetScriptName: string;
begin
  Result := SCRIPT_NAME;
end;

function GetScriptDesc: string;
begin
  Result := SCRIPT_DESC;
end;

function GetRatingName: string;
begin
  Result := RATING_NAME;
end;

function GetScriptLang: Cardinal;
begin
  Result := SCRIPT_LANG;
end;

function GetCodePage: Cardinal;
begin
  Result := CODE_PAGE;
end;

function GetBaseURL: AnsiString;
begin
  Result := BASE_URL;
end;

function GetDownloadURL: AnsiString;
begin
  if NextURL <> '' then
    Result := NextURL
  else
    Result := SEARCH_URL;
end;

function GetScriptType: Byte;
begin
  Result := SCRIPT_TYPE;
end;

function GetCurrentMode: Byte;
begin
  if ParsingMovie then
    Result := 1
  else
    Result := 0;
end;

function HTMLValue(HTML: string; StartPos, EndPos: Integer; StartValue, EndValue: string): string;
var
  ValueStart, ValueEnd: Integer;
begin
  ValueStart := PosFrom(StartValue, HTML, StartPos);
  if (ValueStart > 0) and ((ValueStart < EndPos) or (EndPos = 0)) then
  begin
    ValueStart := ValueStart + Length(StartValue);
    ValueEnd := PosFrom(EndValue, HTML, ValueStart);
    Result := Trim(Copy(HTML, ValueStart, ValueEnd - ValueStart));
  end else
    Result := '';
end;

procedure AddHTMLValue(HTML, Field: string; StartValue, EndValue: string);
var
  Value: string;
begin
  Value := HTMLValue(HTML, 0, 0, StartValue, EndValue);
  if Value <> '' then
  begin
    LogMessage(Field +': '+ Value);
    AddFieldValueXML(Field, Value);
  end else
    LogMessage(Field +' not found');
end;

procedure AddHTMLValues(HTML, Field: string; ABegin, AEnd, ItemBegin, ItemEnd: String);
var
  StartPos: Integer;
  Values: string;
begin
  StartPos := 1;
  Values := HTMLValues(HTML, ABegin, AEnd, ItemBegin, ItemEnd, ', ', StartPos);
  if Values <> '' then
  begin
    LogMessage(Field +': '+ Values);
    AddFieldValueXML(Field, Values);
  end else
    LogMessage(Field +' not found');
end;

function ParseCastType(Department: String): Byte;
var
  AType: Byte;
  Departments: array[0..4] of string;
begin
  Departments[0] := 'Actors';
  Departments[1] := 'Directing';
  Departments[2] := 'Writing';
  Departments[3] := 'Sound';
  Departments[4] := 'Production';
  
  for AType := Low(Departments) to High(Departments) do
      if Department = Departments[AType] then
        Result := AType;
end;

procedure AddCast(HTML: string);
var
  StartPos: Integer;
  Person, Name, Role, URL, Department: string;
  Cast: TWideArray;
  I: Integer;
begin
  StartPos := 1;
  ExplodeString(HTMLValues(HTML, '<cast>', '</cast>', '<person ', '/>', #13#10, StartPos), Cast, #13#10);
  
  for I := Low(Cast) to High(Cast) do
  begin
    Person := Cast[I];
    Name := HTMLValue(Person, 0, 0, 'name="', '"');
    Role := HTMLValue(Person, 0, 0, 'character="', '"');
    URL := HTMLValue(Person, 0, 0, 'url="', '"');
    Department := HTMLValue(Person, 0, 0, 'department="', '"');
    
    LogMessage('name '+ Name +', role: '+ Role +', url: '+ URL +', department: '+ Department);
    AddMoviePerson(Name, '', Role, URL, ParseCastType(Department));
  end;
end;

procedure ParseMovie(HTML: string);
var
  Released, MPAA, Mstatus, Origlang: string;
  Runtime: Integer;
  DateParts: TWideArray;
begin
  AddHTMLValue(HTML, 'title', '<name>', '</name>');
  AddHTMLValue(HTML, 'origtitle', '<original_name>', '</original_name>');
  AddHTMLValue(HTML, 'aka', '<alternative_name>', '</alternative_name>');
  AddHTMLValue(HTML, 'year', '<released>', '-');
  AddHTMLValue(HTML, 'tagline', '<tagline>', '</tagline>');
  AddHTMLValue(HTML, 'description', '<overview>', '</overview>');
  AddHTMLValue(HTML, 'mpaa', '<certification>', '</certification>');
  AddHTMLValue(HTML, 'budget', '<budget>', '</budget>');
  AddHTMLValue(HTML, 'money', '<revenue>', '</revenue>');
  AddHTMLValue(HTML, 'url', '<url>', '</url>');
  //AddHTMLValue(HTML, 'origlang', '<language>', '</language>');
  //AddHTMLValue(HTML, 'features', '<status>', '</status>');
  
  AddFieldValueXML('orname', RATING_NAME);
  AddHTMLValue(HTML, 'orating', '<rating>', '</rating>');
  
  Runtime := StrToInt(HTMLValue(HTML, 0, 0, '<runtime>', '</runtime>'));
  if Runtime > 0 then
  begin
    Runtime := Runtime * 60;
    LogMessage('length: '+ IntToStr(Runtime));
    AddFieldValueXML('length', IntToStr(Runtime));
  end else
    LogMessage('length not found');
  
  AddHTMLValues(HTML, 'genre', '<categories>', '</categories>', 'name="', '"');
  AddHTMLValues(HTML, 'country', '<countries>', '</countries>', 'name="', '"');
  AddHTMLValues(HTML, 'studio', '<studios>', '</studios>', 'name="', '"');
  AddHTMLValues(HTML, 'tags', '<keywords>', '</keywords>', 'name="', '"');
  
  AddCast(HTML);
  
  Released := HTMLValue(HTML, 0, 0, '<released>', '</released>');
  if Released <> '' then
  begin
    ExplodeString(Released, DateParts, '-');
    Released := DateParts[2] +'.'+ DateParts[1] +'.'+ DateParts[0];
    LogMessage('rdate: '+ Released);
    AddFieldValueXML('rdate', Released);
	//AddCustomFieldValueByName('Release Info', Released);
  end else
    LogMessage('rdate not found');
	
(*   LogMessage('rdate not found');
	
  MPAA := HTMLValue(HTML, 0, 0, '<certification>', '</certification>');
  if MPAA <> '' then
  begin
    MPAA := MPAA;
    LogMessage('mpaa: '+ MPAA);
    AddCustomFieldValueByName('MovieDB rate', MPAA);
  end else
    LogMessage('mpaa not found');

  Mstatus := HTMLValue(HTML, 0, 0, '<status>', '</status>');
  if Mstatus <> '' then
  begin
    Mstatus := Mstatus;
    LogMessage('status: '+ Mstatus);
    AddCustomFieldValueByName('Status', Mstatus);
  end else
    LogMessage('status not found');  *)
	
  Origlang := HTMLValue(HTML, 0, 0, '<language>', '</language>');
  if Origlang <> '' then
  begin
    Origlang := StringReplace(Origlang, 'en', 'English', true, false, true);
	Origlang := Origlang;
    LogMessage('origlang: '+ Origlang);
    AddFieldValueXML('origlang', Origlang);
  end else
    LogMessage('origlang not found');
    
  //TODO: add other posters
  //note that loading more than one poster is broken in PVD 1.0.2.3 Beta
  PosterURL := HTMLValue(HTML, Pos('size="mid"', HTML), 0, '<image type="poster" url="', '"');
  
  //TODO: overrides our url; adding urls separated with spaces doesn't work either
  (*IMDB := HTMLValue(HTML, 0, 0, '<imdb_id>', '</imdb_id>');
  if IMDB <> '' then
  begin
    IMDB := IMDB_URL + IMDB;
    LogMessage('imdb url: '+ IMDB);
    AddFieldValueXML('url', IMDB);
  end else
    LogMessage('imdb url not found');*)
    
end;

procedure ParseSearchResults(HTML: string);
var
  ItemStart, ItemEnd: Integer;
  Name, AlternativeName, URL, Year, Image: string;
begin
  ItemStart := Pos('<movie>', HTML);
  while ItemStart > 0 do
  begin
    ItemEnd := PosFrom('</movie>', HTML, ItemStart);

    Name := HTMLValue(HTML, ItemStart, ItemEnd, '<name>', '</name>');
    AlternativeName := HTMLValue(HTML, ItemStart, ItemEnd, '<alternative_name>', '</alternative_name>');
    URL := HTMLValue(HTML, ItemStart, ItemEnd, '<url>', '</url>');
    Year := HTMLValue(HTML, ItemStart, ItemEnd, '<released>', '-');
    Image := HTMLValue(HTML, ItemStart, ItemEnd, '<image type="poster" url="', '"');
    
    LogMessage('name: '+ Name +', alternativeName: '+ AlternativeName +', url: '+ URL +', year: '+ Year +', image: '+ Image);
    AddSearchResult(Name, AlternativeName, Year, URL, Image);

    ItemStart :=  PosFrom('<movie>', HTML, ItemEnd);
  end;
end;

function ParsePage(HTML: string; URL: AnsiString): Cardinal;
var
  MovieID: string;
begin
  MovieID := Copy(URL, LastPos('/', URL)+1, Length(URL)-LastPos('/', URL)+1);

  if Pos('Nothing found.', HTML) > 0 then
  begin
    LogMessage('no movie found');
    Result := prError;
  end else if Pos('Movie.search', URL) > 0 then
  begin
    LogMessage('parse search result');
    ParseSearchResults(HTML);
    Result := prList;
  end else if Pos('/movie/', URL) > 0 then
  begin
    LogMessage('redirect to movie api');
    ParsingMovie := True;
    NextURL := MOVIE_URL + MovieID;
    Result := prDownload;
  end else if Pos('Movie.getInfo', URL) > 0 then
  begin
    LogMessage('parse movie page');
    ParsingMovie := True;
    ParseMovie(HTML);
    NextURL := PosterURL
    Result := prDownload
  end else begin
    LogMessage('unknown page');
    Result := prError;
  end;
  
  if (Result = prDownload) and (NextURL = '') then
    Result := prFinished
end;
