+//! \83\8d\83O\82ð\8e\9d\82Á\82Ä\82¢\82é\82È\82ç\90^\82ð\95Ô\82·
+function CountLog(Item: TThreadItem): Boolean;
+begin
+ Result := Item.IsLogFile;
+end;
+//! \90V\92\85\82È\82ç\90^\82ð\95Ô\82·
+function CountNew(Item: TThreadItem): Boolean;
+begin
+ Result := Item.NewArrival;
+end;
+//! DAT\97\8e\82¿\82È\82ç\90^\82ð\95Ô\82·
+function CountDat(Item: TThreadItem): Boolean;
+begin
+ Result := (Item.AgeSage = gasArch);
+end;
+//! \90¶\91¶\83X\83\8c\82È\82ç\90^\82ð\95Ô\82·
+function CountLive(Item: TThreadItem): Boolean;
+begin
+ Result := (Item.AgeSage <> gasArch);
+end;
+
+//! \8fí\82É\90^
+function CountAll(Item: TThreadItem): Boolean;
+begin
+ Result := True;
+end;
+
+
+
+// BBSID \82ð\97p\82¢\82é 2 \82¿\82á\82ñ\82Ë\82é\82Ì\82Ý\92T\82µ\8fo\82µ\82Ü\82·
+// BBSID \82Ì\8eg\97p\82Í\8bÉ\97Í\94ð\82¯\82Ä\82\82¾\82³\82¢\81B
+// \89Â\94\\82È\8fê\8d\87\82Í URL \82ð\8eg\97p\82µ\82Ä\82\82¾\82³\82¢\81B
+function BBSsFindBoardFromBBSID(
+ inBBSID : string
+) : TBoard;
+var
+ i : Integer;
+ tmpBoard : TBoard;
+begin
+
+// Result := BBSs[ 0 ].FindBBSID( inBBSID );
+ Result := nil;
+ if Length(BoardGroups) > 0 then begin
+ for i := BoardGroups[0].Count - 1 downto 0 do begin
+ tmpBoard := TBoard(BoardGroups[0].Objects[i]);
+ if tmpBoard.Is2ch then begin
+ if AnsiCompareStr(tmpBoard.BBSID, inBBSID) = 0 then begin
+ Result := tmpBoard;
+ EXIT;
+ end;
+ end;
+ end;
+ end;
+
+end;
+{**********************************************
+\82±\82Ì\8aÖ\90\94\82Í\95K\82¸\94Â\82ÌURL\82Ì\8c`\8e®\82Å\93n\82µ\82Ä\82\82¾\82³\82¢\81B
+plugin\82ð\8eg\97p\82·\82é\82È\82ç\82Î\81AExtractBoardURL( inURL )
+2ch\82È\82ç\82Î\81AGikoSys.Get2chThreadURL2BoardURL( inURL );
+\82Å\95Ï\8a·\82µ\82Ä\82©\82ç\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B
+**********************************************}
+function BBSsFindBoardFromURL(
+ inURL : string
+) : TBoard;
+var
+ i,p : Integer;
+ accept : TAcceptType;
+ protocol, host, path, document, port, bookmark : string;
+begin
+ Result := nil;
+ for i := Length(BoardGroups) - 1 downto 1 do begin
+ accept := BoardGroups[i].BoardPlugIn.AcceptURL(inURL);
+ if (accept = atBoard) or (accept = atThread) then begin
+ if BoardGroups[i].Find(inURL, p) then begin
+ Result := TBoard(BoardGroups[i].Objects[p]);
+ Exit;
+ end else begin
+ inURL := BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL);
+ if BoardGroups[i].Find(inURL, p) then begin
+ Result := TBoard(BoardGroups[i].Objects[p]);
+ Exit;
+ end;
+ end;
+ end;
+ end;
+ //\82±\82±\82É\82«\82½\82ç\81Aplugin\82ð\8eg\82í\82È\82¢\82â\82Â\82ç\82ð\92²\82×\82é
+ if BoardGroups[0].Find(inURL, p) then
+ Result := TBoard(BoardGroups[0].Objects[p]);
+
+ if (Result = nil) then begin
+ GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
+ //\83z\83X\83g\82ª2ch\82È\82çBBSID\82Å\92²\82×\82é
+ if GikoSys.Is2chHost(host) then begin
+ Result := BBSsFindBoardFromBBSID(GikoSys.URLToID( inURL ));
+ end;
+ end;
+
+end;
+
+function BBSsFindBoardFromTitle(
+ inTitle : string
+) : TBoard;
+var
+ i,j : Integer;
+ tmpBoard : TBoard;
+begin
+ Result := nil;
+ for i := Length( BBSs ) - 1 downto 0 do begin
+ for j := BoardGroups[i].Count - 1 downto 0 do begin
+ tmpBoard := TBoard(BoardGroups[i].Objects[j]);
+ if ( AnsiCompareStr(tmpBoard.Title, inTitle) = 0) then begin
+ Result := tmpBoard;
+ Exit;
+ end;
+ end;
+ end;
+
+end;
+
+function BBSsFindThreadFromURL(
+ const inURL : string
+) : TThreadItem;
+var
+ board : TBoard;
+ tmpThread : TThreadItem;
+ boardURL : string;
+ protocol, host, path, document, port, bookmark : string;
+ BBSID, BBSKey : string;
+ i, bi : Integer;
+begin
+
+ boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
+ board := BBSsFindBoardFromURL( boardURL );
+ if board = nil then
+ Result := nil
+ else begin
+ Result := board.FindThreadFromURL( inURL );
+ //\82à\82µ\82à2ch\82Ì\94Â\82È\82ç
+ if (Result = nil) and (board.Is2ch) then begin
+ GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
+ GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
+ Result := board.FindThreadFromFileName(BBSKey + '.dat');
+ end else if (Result = nil) and not (board.Is2ch) then begin
+ //\83v\83\89\83O\83C\83\93\8cn\82Ì\92T\8dõ\81i\8eå\82ÉURL\82ª\93r\92\86\82Å\95Ï\8dX\82É\82È\82Á\82½\97Þ)
+ try
+ bi := Length(BoardGroups) - 1;
+ for i := 1 to bi do begin
+ if (BoardGroups[i].BoardPlugIn <> nil) and (Assigned(Pointer(BoardGroups[i].BoardPlugIn.Module))) then begin
+ if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
+ tmpThread := TThreadItem.Create( BoardGroups[i].BoardPlugIn, Board, inURL );
+ if not board.IsThreadDatRead then begin
+ GikoSys.ReadSubjectFile( board );
+ end;
+ Result := Board.FindThreadFromFileName( tmpThread.FileName );
+ tmpThread.Free;
+ Break;
+ end;
+ end;
+ end;
+ except
+ Result := nil;
+ end;
+ end;
+ end;
+
+end;
+{!
+\brief \93Á\8eê\97p\93rBBS\8dí\8f\9c
+\param bbs \8dí\8f\9c\82·\82é\93Á\8eê\97p\93rBBS
+}
+procedure DestorySpecialBBS( inBBS : TBBS );
+var
+ sCategory : TCategory;
+ sBoard : TSpecialBoard;
+begin
+ if inBBS <> nil then begin
+ sCategory := inBBS.Items[0];
+ if sCategory <> nil then begin
+ sBoard := TSpecialBoard(sCategory.Items[0]);
+ if sBoard <> nil then begin
+ sBoard.Modified := False;
+ sBoard.Clear;
+ FreeAndNil(sBoard);
+ end;
+ end;
+ FreeAndNil(inBBS);
+ end;
+end;