OSDN Git Service

>123 型のリンクのポップアップができなくなってしまったのを修正
[gikonavigoeson/gikonavi.git] / Giko.pas
index 38d21c3..b6378b2 100644 (file)
--- a/Giko.pas
+++ b/Giko.pas
@@ -13,7 +13,7 @@ uses
        MSHTML_TLB,
 {$IFEND}
        IdHTTP, ActiveX, ActnList, ImgList,
-    ToolWin, Buttons, {Clipbrd,} {HTTPApp,} YofUtils, IdComponent,
+       ToolWin, Buttons, {Clipbrd,} {HTTPApp,} YofUtils, IdComponent,
        ShellAPI,  UrlMon, Tabs, IdGlobal, StrUtils,
        CommCtrl, IniFiles, Dialogs,
        GikoSystem, GikoUtil, Setting, BoardGroup, ThreadControl, ItemDownload,
@@ -21,13 +21,16 @@ uses
        FavoriteArrange, AddressHistory, Preview, HTMLDocumentEvent, Kotehan,
        HintWindow, GikoCoolBar, GikoListView, ToolBarSetting, ToolBarUtil,
        IndividualAbon, Search, ExternalBoardManager, ExternalBoardPlugInMain,
-       StdActns, GikoXMLDoc;
+       StdActns, GikoXMLDoc, Variants, ExtActns,IdTCPConnection, IdBaseComponent,
+  IdTCPClient;
 
 type
        TGikoTreeType = (gttNone, gtt2ch, gttHistory, gttFavorite);
        TToolBarSettingSenderType = (tssNone, tssMain, tssList, tssBrowser);
        TMinimizeType = (mtNone, mtMinimizing, mtMinimized);
 
+       TBrowserRecord = class;
+
        TGikoForm = class(TForm)
                StatusBar: TStatusBar;
                MainPanel: TPanel;
@@ -248,7 +251,6 @@ type
                N21: TMenuItem;
                URLC3: TMenuItem;
                URLN2: TMenuItem;
-               N22: TMenuItem;
                N23: TMenuItem;
                ListCoolBar: TGikoCoolBar;
                ListToolBar: TToolBar;
@@ -505,7 +507,7 @@ type
                ExportFavoriteFileAction1: TMenuItem;
                ExportFavoriteFile: TFileSaveAs;
                ToolButton21: TToolButton;
-    CabinetBBSToolButton: TToolButton;
+               CabinetBBSToolButton: TToolButton;
                ToolButton23: TToolButton;
                ToolButton24: TToolButton;
                N6: TMenuItem;
@@ -522,7 +524,6 @@ type
     KoreCopy: TAction;
     N64: TMenuItem;
     dummy1: TMenuItem;
-    Browser: TWebBrowser;
     TreeSelectLogDeletePopupMenu: TMenuItem;
     N65: TMenuItem;
     BBSSelectPopupMenu: TPopupMenu;
@@ -530,6 +531,28 @@ type
     TmpToolBar: TToolBar;
     TreeSelectNameCopy: TAction;
     TreeSelectNamePupupMenu: TMenuItem;
+    BrowserPanel: TPanel;
+    SetFocusForBrowserAction: TAction;
+    SetFocusForThreadListAction: TAction;
+    SetFocusForCabinetAction: TAction;
+    FileRun1: TFileRun;
+    ThreadlistMaxAndFocusAction: TAction;
+    BrowserMaxAndFocusAction: TAction;
+    UpBoardButton: TToolButton;
+    SelectTimer: TTimer;
+    SelectThreadSave: TMenuItem;
+    SelectItemSaveForHTML: TAction;
+    FileSaveAs1: TFileSaveAs;
+    N55: TMenuItem;
+    N66: TMenuItem;
+    dat1: TMenuItem;
+    SelectItemSaveForDat: TAction;
+    LogFolderOpenAction: TAction;
+    OpenLogFolder: TMenuItem;
+    Browser: TWebBrowser;
+    LocalRuleView: TToolButton;
+    IdHTTP1: TIdHTTP;
+    TabSave: TMenuItem;
                                procedure FormCreate(Sender: TObject);
                procedure FormDestroy(Sender: TObject);
                procedure CabinetPanelHide(Sender: TObject);
@@ -545,7 +568,6 @@ type
                        EndIndex: Integer; OldState, NewState: TItemStates);
                procedure BrowserStatusTextChange(Sender: TObject;
                        const Text: WideString);
-               procedure BrowserTitleChange(Sender: TObject; const Text: WideString);
                procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
                procedure TreeViewChanging(Sender: TObject; Node: TTreeNode;
                        var AllowChange: Boolean);
@@ -629,7 +651,6 @@ type
                procedure ShowBoardActionUpdate(Sender: TObject);
                procedure SelectThreadReloadActionUpdate(Sender: TObject);
                procedure ItemReloadActionUpdate(Sender: TObject);
-               procedure ListViewDblClick(Sender: TObject);
                procedure LogDeleteActionExecute(Sender: TObject);
                procedure KokomadeActionExecute(Sender: TObject);
                procedure ZenbuActionExecute(Sender: TObject);
@@ -837,8 +858,7 @@ type
     procedure BrowserNameToolBarResize(Sender: TObject);
     procedure BrowserToolBarResize(Sender: TObject);
     procedure BrowserTabResize(Sender: TObject);
-               procedure ListViewClick(Sender: TObject);
-    procedure TreeViewClick(Sender: TObject);
+       procedure TreeViewClick(Sender: TObject);
     procedure TreeViewKeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
     procedure FavoriteTreeViewMouseDown(Sender: TObject;
@@ -848,6 +868,29 @@ type
     procedure TreeSelectNameCopyExecute(Sender: TObject);
     procedure FavoriteTreeViewMouseUp(Sender: TObject;
       Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+    procedure OnlyAHundredResUpdate(Sender: TObject);
+    procedure SetFocusForBrowserActionExecute(Sender: TObject);
+    procedure SetFocusForBrowserActionUpdate(Sender: TObject);
+    procedure SetFocusForThreadListActionExecute(Sender: TObject);
+    procedure SetFocusForCabinetActionExecute(Sender: TObject);
+    procedure BrowserMaxAndFocusActionExecute(Sender: TObject);
+    procedure BrowserMaxAndFocusActionUpdate(Sender: TObject);
+    procedure ThreadlistMaxAndFocusActionExecute(Sender: TObject);
+    procedure ListViewExit(Sender: TObject);
+    procedure SetFocusForCabinetActionUpdate(Sender: TObject);
+    procedure ListViewSelectItem(Sender: TObject; Item: TListItem;
+      Selected: Boolean);
+    procedure SelectTimerTimer(Sender: TObject);
+    procedure SelectItemSaveForHTMLExecute(Sender: TObject);
+    procedure KidokuActionExecute(Sender: TObject);
+    procedure MidokuActionExecute(Sender: TObject);
+    procedure SelectItemSaveForDatExecute(Sender: TObject);
+    procedure BrowserPanelCanResize(Sender: TObject; var NewWidth,
+      NewHeight: Integer; var Resize: Boolean);
+    procedure LogFolderOpenActionExecute(Sender: TObject);
+    procedure LogFolderOpenActionUpdate(Sender: TObject);
+    procedure LocalRuleViewClick(Sender: TObject);
+    procedure TabSaveClick(Sender: TObject);
        private
                { Private \90é\8c¾ }
         //RoundList : TRoundList;
@@ -867,13 +910,12 @@ type
                FBrowserSizeWidth: Integer;
 
 //             FFavorite: TFavorite;
-               FBrowserComplete: Boolean;
                FTabHintIndex: Integer;
                FListStyle: TViewStyle;                         //\83\8a\83X\83g\83A\83C\83R\83\93\83X\83^\83C\83\8b
                FItemNoVisible: Boolean;                        //\83\8a\83X\83g\94Ô\8d\86\95\\8e¦\83t\83\89\83O
                FViewType: TGikoViewType;                       //\83\8a\83X\83g\83A\83C\83e\83\80\95\\8e¦\83^\83C\83v
                FActiveList: TObject;
-               FActiveContent: TThreadItem;    //
+               FActiveContent: TBrowserRecord; //
                FActiveBBS : TBBS;
                FHistoryList: TList;                                    //\83q\83X\83g\83\8a\83\8a\83X\83g
                FTreeType: TGikoTreeType;
@@ -881,7 +923,7 @@ type
                FNameCookie: string;
                FMailCookie: string;
 //             FLastRoundTime: TDateTime;
-               BrowserNullTab: TThreadItem;
+               BrowserNullTab: TBrowserRecord;
 //             DoubleClickOccurred: array [TMouseButton] of Boolean;
                FDownloadTitle: string;                         //\83_\83E\83\93\83\8d\81[\83h\92\86\82Ì\83^\83C\83g\83\8b\96¼
                FDownloadMax: Integer;                          //\83_\83E\83\93\83\8d\81[\83h\92\86\82Ì\8dÅ\91å\83T\83C\83Y
@@ -910,6 +952,7 @@ type
                FOldFormWidth           : Integer;                              // \92¼\91O\82Ì\83E\83B\83\93\83h\83E\82Ì\95\9d
                FToolBarSettingSender : TToolBarSettingSenderType;      // \83c\81[\83\8b\83o\81[\90Ý\92è\82ð\83N\83\8a\83b\83N\82µ\82½\83N\81[\83\8b\83o\81[
                FMouseDownPos           : TPoint;                               // \83u\83\89\83E\83U\83^\83u\82Å\83}\83E\83X\82ð\89\9f\82µ\82½\82Æ\82«\82Ì\8dÀ\95W
+               FBrowsers: TList;
                procedure SetBoardTreeNode( inBBS : TBBS );
                function SetCategoryListItem(ABBS2ch: TBBS): Integer;
                function SetBoardListItem(Category: TCategory): Integer;
@@ -925,10 +968,12 @@ type
                procedure SetActiveList(Obj: TObject);
                procedure ListClick;
                procedure ListDoubleClick(Shift: TShiftState);
-               procedure BrowserMovement(AName: string);
+               procedure BrowserMovement(const AName: string); overload;
+               procedure BrowserMovement(const AName: string; BrowserRecord: TBrowserRecord); overload;
                procedure SelectListItem(List: TList);
 //             procedure SetProgressValue(Number: Integer; Value: Integer; Max: Integer = -1);
-               procedure DeleteTab(ThreadItem: TThreadItem);
+               procedure DeleteTab(ThreadItem: TThreadItem); overload;
+               procedure DeleteTab(BrowserRecord: TBrowserRecord); overload;
                function Hook(var Message: TMessage): Boolean;
                procedure AddRoundNameMenu(MenuItem: TMenuItem);
                procedure SetSelectItemRound(RoundFlag: Boolean; RoundName: string); overload;
@@ -951,7 +996,6 @@ type
 //             procedure SetStdToolBar;
 //             function GetAction(ActionName: string): TContainedAction;
                procedure SetLinkBar;
-               procedure ClearLinkBar;
                function GetWidthAllToolButton(ToolBar: TToolBar): Integer;
                procedure MenuBarChevronMenu;
                procedure LinkBarChevronMenu;
@@ -968,7 +1012,6 @@ type
                procedure FavoriteAddTo( SenderNode: TTreeNode; Source: TObject );
                procedure FavoriteDragDrop( SenderNode: TTreeNode; Source: TObject );
                //
-               procedure BrowserTabClick(Sender: TObject);
                procedure SetListViewBackGroundColor(value: TColor);
                procedure BBSMenuItemOnClick( Sender : TObject );
                //
@@ -994,7 +1037,8 @@ type
                function BrowserKeydown(var Msg: TMsg; Key: Word; State:TShiftState) : Boolean;
                // \8ae\8f\8a\82É\82 \82é\83L\83\83\83r\83l\83b\83g\81E BBS \83\81\83j\83\85\81[\82ð\83Z\83b\83g\81^\8dX\90V
                procedure SetBBSMenu;
-
+               function WebBrowserClick(Sender: TObject): WordBool;
+               procedure SkinorCSSFilesCopy(path: string);
        protected
                procedure CreateParams(var Params: TCreateParams); override;
                procedure WndProc(var Message: TMessage); override;
@@ -1023,7 +1067,7 @@ type
                property NameCookie: string read FNameCookie write FNameCookie;
                property MailCookie: string read FMailCookie write FMailCookie;
 
-               procedure SetContent(ThreadItem: TThreadItem);
+               procedure SetContent(inThread: TBrowserRecord);
                function GetActiveContent: TThreadItem;
                function GetActiveList: TObject;
 
@@ -1085,6 +1129,23 @@ type
                property Data: Pointer read FData write FData;
        end;
 
+       TBrowserRecord = class( TObject )
+       private
+               FBrowser        : TWebBrowser;
+               FEvent: THTMLDocumentEventSink;//\83u\83\89\83E\83U\83h\83L\83\85\83\81\83\93\83g\83C\83x\83\93\83g
+               FThread         : TThreadItem;
+               FLastSize       : Integer;
+               FRepaint        : Boolean;
+               FOnlyHundred: Boolean;
+       public
+               destructor      Destroy; override;
+               property        Browser : TWebBrowser   read FBrowser   write FBrowser;
+               property        Thread  : TThreadItem   read FThread    write FThread;
+               property        LastSize        : Integer               read FLastSize  write FLastSize;
+               property        Repaint         : Boolean               read FRepaint   write FRepaint;
+               property        OnlyHundred : Boolean           read FOnlyHundred write FOnlyHundred;
+       end;
+
 var
        GikoForm: TGikoForm;
 
@@ -1143,7 +1204,9 @@ const
        USER_RESIZED            = WM_USER + 2001;
        USER_MINIMIZED                                  = WM_USER + 2002;
        USER_SETLINKBAR                                 = WM_USER + 2003;
+       SELECTTIME_INTERBAL                             = 110;
 
+       BROWSER_COUNT           = 5;    //\83u\83\89\83E\83U\82Ì\90\94
 {$R *.DFM}
 
 procedure TGikoForm.CreateParams(var Params: TCreateParams);
@@ -1167,6 +1230,7 @@ var
        i: Integer;
        wp: TWindowPlacement;
        s: string;
+       newbrowser: TWebBrowser;
 begin
 {$IFDEF DEBUG}
        AllocConsole;
@@ -1180,11 +1244,35 @@ begin
        Application.OnDeactivate := AppFormDeactivate;
        Self.OnDeactivate := AppFormDeactivate;
        Application.HookMainWindow(Hook);
-       Application.OnMessage := HandleAppMessage;
-
+       Application.OnMessage := HandleAppMessage; //\82È\82ñ\82©\96³\82­\82Ä\82à\91å\8fä\95v\82É\82È\82Á\82½\81@by\81@\82à\82\82ã
+       Self.DoubleBuffered := true;
        FTreeType := gttNone;
 
        FSearchDialog := nil;
+       BrowserNullTab := TBrowserRecord.Create;
+       BrowserNullTab.Browser := Browser;
+       BrowserNullTab.Browser.Navigate(BLANK_HTML);
+       FBrowsers := TList.Create;
+       for i := 0 to BROWSER_COUNT -1 do begin
+               FBrowsers.Add(TWebBrowser.Create(nil));
+               newBrowser := FBrowsers[FBrowsers.Count - 1];
+               TOleControl(newBrowser).Parent := BrowserPanel;
+               newBrowser.Align := alNone;
+               newBrowser.Left := 0;
+               newBrowser.Top  := 0;
+        //newBrowser.DoubleBuffered := true;
+               newBrowser.OnDocumentComplete   := BrowserDocumentComplete;
+               newBrowser.OnBeforeNavigate2    := BrowserBeforeNavigate2;
+               newBrowser.OnEnter                              := BrowserEnter;
+               newBrowser.OnNewWindow2                 := BrowserNewWindow2;
+               newBrowser.OnStatusTextChange   := BrowserStatusTextChange;
+               //newBrowser.OnTitleChange              := BrowserTitleChange;
+               newBrowser.Navigate(BLANK_HTML);
+               ShowWindow(newBrowser.Handle, SW_HIDE);
+
+       end;
+       BrowserNullTab.Browser.BringToFront;
+       ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
 
        // \8bN\93®\8e\9e\82É\95Û\91\82³\82ê\82Ä\82µ\82Ü\82¤\91Î\8dô
        FIsIgnoreResize := True;
@@ -1288,10 +1376,10 @@ begin
        BrowserTab.Font.Name := GikoSys.Setting.BrowserTabFontName;
        BrowserTab.Font.Size := GikoSys.Setting.BrowserTabFontSize;
        FDragWFirst := false;
-
+       SetContent(BrowserNullTab);                                                                                                     //\83u\83\89\83E\83U\82ð\8bó\94\92\95\\8e¦
 //     TreeView.TopItem.Expanded := True;                              //\83c\83\8a\81[\83g\83b\83v\8d\80\96Ú\82¾\82¯\82ð\8aJ\82­
 //     TreeView.Selected := TreeView.Items[0];         //\83c\83\8a\81[\82Ì\83g\83b\83v\8d\80\96Ú\82ð\91I\91ð\82·\82é
-       SetContent(nil);                                                                                                        //\83u\83\89\83E\83U\82ð\8bó\94\92\95\\8e¦
+
 
        //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95\9c\8c³
        wp.length := sizeof(wp);
@@ -1484,7 +1572,7 @@ begin
        FHint := TResPopup.Create(Self);
 
        // \8dÅ\8cã\82É\91I\91ð\82³\82ê\82½\83L\83\83\83r\83l\83b\83g\82Ì\95\9c\8c³
-       CabinetVisible( False );
+       CabinetVisible( False );
        if GikoSys.Setting.CabinetVisible then begin
                i := CabinetSelectPopupMenu.Items.Count - 1;
                if GikoSys.Setting.CabinetIndex = i - 1 then
@@ -1527,6 +1615,7 @@ begin
 
        //Samba24\82Ì\83t\83@\83C\83\8b\83`\83F\83b\83N
        GikoSys.SambaFileExists();
+
 end;
 
 // CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82É\95Û\91
@@ -1684,6 +1773,8 @@ end;
 
 procedure TGikoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 begin
+//     if GikoForm.WindowState <> wsMinimized then
+//             SaveCoolBarSettings;
        if ( GikoSys.Setting.ShowDialogForEnd ) and
                        (MessageDlg('\83M\83R\83i\83r\82ð\8fI\97¹\82µ\82Ä\82æ\82ë\82µ\82¢\82Å\82·\82©\81H', mtConfirmation,[mbOk, mbCancel], 0) = mrCancel ) then begin
                CanClose := false;
@@ -1701,6 +1792,7 @@ var
        i: Integer;
 //     CoolSet: TCoolSet;
        wp: TWindowPlacement;
+       tmpBool: Boolean;
 begin
 //     Application.OnDeactivate := nil;
 //     Self.OnDeactivate := nil;
@@ -1740,7 +1832,6 @@ begin
                GikoSys.Setting.MessegeBarHeight := MessagePanel.Height;
        except
        end;
-
   // \83\8a\83A\83\8b\83^\83C\83\80\82É\95Û\91\82³\82ê\82é\82Ì\82Å\81A\82Ü\82½\81A\83E\83B\83\93\83h\83E\83T\83C\83Y\82ª CoolBar \82æ\82è
        // \8f¬\82³\82­\82È\82Á\82Ä\82¢\82é\82Æ\82«\82É\95Û\91\82·\82é\82Æ\92l\82ª\8fã\8f\91\82«\82³\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Å\82±\82±\82Å\82Í\95Û\91\82µ\82È\82¢
        {
@@ -1765,14 +1856,32 @@ begin
 
        try
                //\83^\83u\83N\83\8d\81[\83Y
-               //NotSelectTabCloseAction.Execute;
-               {if BrowserTab.Tabs.Count >= 1 then begin
-                       DeleteTab(TThreadItem(BrowserTab.Tabs.Objects[0]));
+               tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
+               GikoSys.Setting.ShowDialogForAllTabClose := false;
+               AllTabCloseAction.Execute;
+        GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
+       except
+       end;
+       try
+               LockWindowUpdate(Self.Handle);
+               for i := FBrowsers.Count - 1 downto 0 do begin
+                       TWebBrowser(FBrowsers[i]).Free;
+               end;
+               FBrowsers.Clear;
+               FBrowsers.Capacity := 0;
+       finally
+               FBrowsers.Free;
+       end;
+       try
+               if BrowserNullTab <> nil then begin
+                       BrowserNullTab.Browser := nil;  {*BrowserNullTab\82ÌBrowser\82Í\90Ý\8cv\8e\9e\82É\93\\82è\95t\82¯\82Ä\82é\93z
+                                                                                        *\82È\82Ì\82Å\82±\82±\82ÅFree\82³\82ê\82é\82Æ\8d¢\82é\82Ì\82Å\82Í\82¸\82µ\82Ä\82µ\82Ü\82¤\81B
+                                                                                        *}
+                       BrowserNullTab.Free;
                end;
-        }
        except
        end;
-
+       LockWindowUpdate(0);
        try
                TreeView.Items.BeginUpdate;
                for i := TreeView.Items.Count - 1 downto 0 do begin
@@ -1926,11 +2035,15 @@ end;
 procedure TGikoForm.ReloadBBS;
 var
        i                       : Integer;
+       tmpBool: Boolean;
 begin
        //\83^\83u\83N\83\8d\81[\83Y
-       NotSelectTabCloseAction.Execute;
-       if BrowserTab.Tabs.Count >= 1 then
-               DeleteTab(TThreadItem(BrowserTab.Tabs.Objects[0]));
+       tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
+       GikoSys.Setting.ShowDialogForAllTabClose := false;
+       AllTabCloseAction.Execute;
+       GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
+
+       SetContent(BrowserNullTab);
        //TreeView\83N\83\8a\83A\81iBBS2ch.Free\82Ì\8cã\82É\83N\83\8a\83A\82·\82é\82ÆXP\83X\83^\83C\83\8b\8e\9e\82É\83G\83\89\81[\8fo\82é\81j
        TreeView.Items.Clear;
 
@@ -2137,6 +2250,7 @@ function TGikoForm.SetThreadListItem(Board: TBoard): Integer;
 const
        COLUMN: array[0..7] of string = ('\83X\83\8c\83b\83h\96¼', '\83J\83E\83\93\83g', '\8eæ\93¾', '\90V\92\85',
                                                                                                                                         '\96¢\93Ç', '\8f\84\89ñ\97\\96ñ', '\8eæ\93¾\93ú\8e\9e', '\83X\83\8c\8dì\90¬\93ú\8e\9e');
+       COLUMN_NONACQUIREDCOUNT: string = '\96¢\8eæ\93¾';
        COLUMN_ALIGNMENT: array[0..7] of TAlignment = (taLeftJustify, taRightJustify,
                                                                                                                                                                                                 taRightJustify, taRightJustify,
                                                                                                                                                                                                 taRightJustify, taLeftJustify,
@@ -2162,6 +2276,10 @@ begin
                                ListColumn.Alignment := COLUMN_ALIGNMENT[i];
                        end;
                end;
+               if GikoSys.Setting.NonAcquiredCount then
+               begin
+                       ListView.Columns[2].Caption := COLUMN_NONACQUIREDCOUNT;
+               end;
 
                ListView.Items.Count := 0;
                ListView.Items.Clear;
@@ -2335,7 +2453,10 @@ begin
                if ThreadItem.IsLogFile then begin
                        Item.ImageIndex := ITEM_ICON_THREADLOG1;
                        Item.SubItems[0] := IntToStr(ThreadItem.AllResCount);
-                       Item.SubItems[1] := IntToStr(ThreadItem.Count);
+                       if GikoSys.Setting.NonAcquiredCount then
+                               Item.SubItems[1] := IntToStr(ThreadItem.AllResCount - ThreadItem.Count)
+                       else
+                               Item.SubItems[1] := IntToStr(ThreadItem.Count);
                        if ThreadItem.NewResCount = 0 then
                                Item.SubItems[2] := ''
                        else
@@ -2409,20 +2530,23 @@ var
        board                           : TBoard;
        Protocol, Host, Path, Document, Port, Bookmark: string;
 
-       //wkInt: Integer;
+       wkInt: Integer;
        wkIntSt: Integer;
        wkIntTo: Integer;
        ActiveFileName: string;
        e: IHTMLElement;
        Ext: string;
-    buf: string;
+       buf: string;
        PathRec: TPathRec;
 begin
+       if not( TObject(Sender) is TWebBrowser )then
+               Exit;
        try
                try
-                       if (FActiveContent <> nil) and (Assigned(Browser.Document)) then begin
-                               if LowerCase(OleVariant(IHTMLDocument2(Browser.Document)).charset) <> 'shift_jis' then
-                                       OleVariant(IHTMLDocument2(Browser.Document)).charset := 'shift_jis';
+                       if (TWebBrowser(Sender) <> nil) and (not TWebBrowser(Sender).Busy) and (Assigned(TWebBrowser(Sender).Document)) then begin
+                               if LowerCase(OleVariant(IHTMLDocument2(TWebBrowser(Sender).Document)).charset) <> 'shift_jis' then begin
+                                       OleVariant(IHTMLDocument2(TWebBrowser(Sender).Document)).charset := 'shift_jis';
+                               end;
                        end;
                except
                end;
@@ -2431,10 +2555,15 @@ begin
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
        Application.CancelHint;
-       if GetActiveContent <> nil then
-               ActiveFileName := ChangeFileExt(ExtractFileName(GetActiveContent.FileName), '')
-       else
-               ActiveFileName := '';
+       try
+               if GetActiveContent <> nil then
+                       ActiveFileName := ChangeFileExt(ExtractFileName(GetActiveContent.FileName), '')
+               else
+                       ActiveFileName := '';
+       except
+               FActiveContent := nil;
+               Exit;
+       end;
 
        StatusBar.Panels[1].Text := Text;
 
@@ -2461,7 +2590,7 @@ begin
                        ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
                        TOleControl(FPreviewBrowser).Parent := nil;
                end;
-               FPreviewBrowser.Navigate('about:blank');//\91O\89ñ\82Ì\83v\83\8c\83r\83\85\81[\89æ\91\9c\8fÁ\8b\8e\97p
+               FPreviewBrowser.Navigate(BLANK_HTML);//\91O\89ñ\82Ì\83v\83\8c\83r\83\85\81[\89æ\91\9c\8fÁ\8b\8e\97p
                FPreviewURL := Text;
                PreviewTimer.Interval := GikoSys.Setting.PreviewWait;
                PreviewTimer.Enabled := True;
@@ -2474,7 +2603,7 @@ begin
                        p.y := p.y - TWebBrowser(Sender).ClientOrigin.y;
                        e := IHTMLDocument2(TWebBrowser(Sender).Document).elementFromPoint(p.x, p.y);
                        if (Assigned(e)) then begin
-                               tmp2 := GikoSys.ZenToHan(e.Get_outerText);
+                               tmp2 := ZenToHan(e.Get_outerText);
                                if (GikoSys.IsNumeric(tmp2)) then begin
                                        //\82\93\82Í\83\8c\83X\94Ô\8d\86\82Á\82Û\82¢\82Á\82·\81B
                                        wkIntSt := StrToInt(tmp2);
@@ -2488,8 +2617,8 @@ begin
                                end;
                        end;
                end else begin
+                       threadItem := GetActiveContent;
                        if Pos('about:blank..', Text) = 1 then begin
-                               threadItem := GetActiveContent;
                                if AnsiPos('http://jbbs.shitaraba.com/', threadItem.URL) <> 0 then begin
                                        URL := Copy(threadItem.URL, 1,  LastDelimiter('/',threadItem.URL));
                                        Gikosys.GetPopupResNumber(Text,PathRec.FSt,PathRec.FTo);
@@ -2509,7 +2638,11 @@ begin
                                URL := Text;
                        end;
                        PathRec := Gikosys.Parse2chURL2(URL);
-                       Gikosys.GetPopupResNumber(URL,PathRec.FSt,PathRec.FTo);
+                       if (PathRec.FNoParam) then begin
+                               PathRec.FSt := 1;
+                               PathRec.FTo := 1;
+                       end else
+                               Gikosys.GetPopupResNumber(URL,PathRec.FSt,PathRec.FTo);
                        GikoSys.ParseURI( URL, Protocol, Host, Path, Document, Port, Bookmark );
 
                        if PathRec.FDone or (not GikoSys.Is2chHost( Host )) then begin
@@ -2526,9 +2659,9 @@ begin
                                end else if (wkIntSt > 0) and (wkIntTo = 0) then begin
                                        wkIntTo := wkIntSt;
                                end else if wkIntSt > wkIntTo then begin
-                                       //wkInt := wkIntTo;
+                                       wkInt := wkIntTo;
                                        wkIntTo := wkIntSt;
-                                       wkIntSt := wkIntTo;
+                                       wkIntSt := wkInt;
                                end;
                                //if wkIntSt = 0 then
                                //      wkIntSt := 1;
@@ -2542,7 +2675,7 @@ begin
                                        wkIntTo := 9999;
 
                                //ATitle := ActiveFileName <> PathRec.FKey;
-                               if GetActiveContent.URL = URL then
+                               if (FActiveContent <> nil) and (FActiveContent.Thread.URL = URL) then
                                        ATitle := false
                                else
                                        ATitle := true;
@@ -2557,7 +2690,7 @@ begin
                                                threadItem := board.FindThreadFromFileName( PathRec.FKey + '.dat' );
                                        end;
                                end;
-                
+
                                if threadItem <> nil then begin
                                        //HintData := GetThreadText(PathRec.FBBS, PathRec.FKey, wkIntSt, wkIntTo, ATitle, PathRec.FFirst);
                                        FHint.PopupType := gptThread;
@@ -2578,19 +2711,6 @@ begin
        end;
 end;
 
-procedure TGikoForm.BrowserTitleChange(Sender: TObject;
-       const Text: WideString);
-var
-       Title: string;
-begin
-       if (Text = BLANK_HTML) or (Text = GikoSys.GetHtmlTempFileName) then
-               Title := CAPTION_NAME
-       else
-               Title := CAPTION_NAME + ' - [' + Text + ']';
-       Caption := Title;
-       //Application.Title := Title;
-end;
-
 procedure TGikoForm.SetEnabledCloseButton(Enabled: Boolean);
 var
        SysMenu: HMenu;
@@ -2690,6 +2810,7 @@ begin
                wkBoard := TBoard( FActiveList );
                Sort.SortOrder := FSortOrder;
                Sort.SortIndex := Column.Index;
+               Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount;
                wkBoard.CustomSort(ThreadItemSortProc);
                ListView.Refresh;
        end;
@@ -2763,7 +2884,6 @@ procedure TGikoForm.ListViewAdvancedCustomDrawItem(Sender: TCustomListView;
 var
        ThreadItem: TThreadItem;
 begin
-       //
 //     TListView(Sender).Canvas.Font.Style := [];
        if TObject(Item.Data) is TThreadItem then begin
                ThreadItem := TThreadItem(Item.Data);
@@ -2961,7 +3081,8 @@ procedure TGikoForm.DownloadEnd(Sender: TObject; Item: TDownloadItem);
 var
        ATitle: string;
        s: string;
-    boardPlugIn : TBoardPlugIn;
+       boardPlugIn : TBoardPlugIn;
+       i: Integer;
 begin
        try
                if Item.DownType = gdtBoard then
@@ -2992,13 +3113,24 @@ begin
                                        boardPlugIn             := Item.ThreadItem.BoardPlugIn;
                                        Item.ThreadItem.Title := GikoSys.DivideStrLine(boardPlugIn.GetDat( DWORD( Item.ThreadItem ), 1 )).FTitle;
                                        ATitle := Item.ThreadItem.Title;
+                               end else if ATitle = '\81i\96¼\8fÌ\95s\96¾\81j' then begin
+                                       ATitle := GikoSys.DivideStrLine(GikoSys.ReadThreadFile(Item.ThreadItem.GetThreadFileName, 1)).FTitle;
+                               end;
+                               for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = Item.ThreadItem then
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+                               end;
+                               if GikoSys.Setting.BrowserTabVisible then begin
+                                       if GetActiveContent = Item.ThreadItem then
+                                               InsertBrowserTab(Item.ThreadItem)
+                                       else if (ListView.Selected <> nil ) and ( TObject(ListView.Selected.Data) is TThreadItem ) and ( Item.ThreadItem = TThreadItem(ListView.Selected.Data)) then
+                                               InsertBrowserTab(Item.ThreadItem, True)
+                                       else
+                                               InsertBrowserTab(Item.ThreadItem, False);
+                               end else begin
+                                       if (GetActiveContent = Item.ThreadItem) or (FActiveContent = nil) or(FActiveContent.Browser = BrowserNullTab.Browser) then
+                       InsertBrowserTab(Item.ThreadItem);
                                end;
-                               if GetActiveContent = Item.ThreadItem then
-                                       InsertBrowserTab(Item.ThreadItem)
-                               else if (ListView.Selected <> nil ) and ( TObject(ListView.Selected.Data) is TThreadItem ) and ( Item.ThreadItem = TThreadItem(ListView.Selected.Data)) then
-                    InsertBrowserTab(Item.ThreadItem, True)
-                else
-                                       InsertBrowserTab(Item.ThreadItem, False);
 
                                if Item.State = gdsComplete then begin
                                        PlaySound('New');
@@ -3068,9 +3200,7 @@ end;
 
 procedure TGikoForm.WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
 begin
-//     ProgressBar.Visible := False;
        ProgressBar.Position := 0;
-//     SetProgressValue(Number, 0);
        if FDownloadMax <> 0 then
                StatusBar.Panels[1].Text := FDownloadTitle + ' - \83_\83E\83\93\83\8d\81[\83h\82ª\8a®\97¹\82µ\82Ü\82µ\82½';
 end;
@@ -3132,26 +3262,46 @@ end;}
 procedure TGikoForm.InsertBrowserTab(ThreadItem: TThreadItem; ActiveTab: Boolean = True);
 
 var
-       i: Integer;
-        //     OldIndex: Integer;
+       i, j, idx: Integer;
        favItem : TFavoriteThreadItem;
+       newBrowser      : TBrowserRecord;
 begin
+
        if Threaditem = nil then Exit;
 
        if ThreadItem.IsLogFile then begin
-               //favItem := TFavoriteThreadItem.CreateWithItem( ThreadItem );
+               //\82¨\8bC\82É\93ü\82è\82Ì\91S\82Ä\8aJ\82­\82Æ\82©\82â\82é\82Æ\81A\8d¡\8aJ\82¢\82Ä\82é\83X\83\8c\82Ìbrowser\82ð\95t\82¯\91Ö\82¦\82é\8b°\82ê\82ª\82 \82é
+               //\8fí\82É\82S\94Ô\96Ú\82ÉActive\82Ì\83u\83\89\83E\83U\82ª\97\88\82È\82¢\82æ\82¤\82É\88Ú\93®\82³\82¹\82é
+               if (FActiveContent <> nil) and (FActiveContent.FBrowser <> nil) and
+                       (FActiveContent.FBrowser <> BrowserNullTab.Browser)then begin
+                       j := FBrowsers.IndexOf(FActiveContent.FBrowser);
+                       if j = BROWSER_COUNT - 1 then
+                               FBrowsers.Move(BROWSER_COUNT - 1, 0);
+               end;
                favItem := TFavoriteThreadItem.Create(ThreadItem.URL, ThreadItem.Title );
                if not AddHistory( favItem ) then
                        favItem.Free;
 
-
                for i := 0 to BrowserTab.Tabs.Count - 1 do begin
-                       if TObject(BrowserTab.Tabs.Objects[i]) is TThreadItem then begin
-                               if TThreadItem(BrowserTab.Tabs.Objects[i]) = ThreadItem then begin
+                       if TObject(BrowserTab.Tabs.Objects[i]) is TBrowserRecord then begin
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
+                                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).FBrowser = nil then begin
+                                               for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                                                       if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FBrowser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+                                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).FBrowser := nil;
+                                                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent <> nil then begin
+                                                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent.Free;
+                                                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent := nil;
+                                                               end;
+                                                               break;
+                                                       end;
+                                               end;
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).FBrowser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+                                               FBrowsers.Move(BROWSER_COUNT - 1, 0);
+                                       end;
                                        if ActiveTab then begin
-                                               //OldIndex := BrowserTab.TabIndex;
                                                BrowserTab.TabIndex := i;
-//                                             if OldIndex <> i then
                                                        BrowserTab.OnChange(nil);
                                                BrowserTab.Repaint;
                                        end;
@@ -3159,59 +3309,116 @@ begin
                                end;
                        end;
                end;
-
+               idx := BrowserTab.TabIndex;
                if GikoSys.Setting.BrowserTabAppend = gtaFirst then begin
-                       BrowserTab.Tabs.Insert(0, GikoSys.GetShortName(ThreadItem.Title, 20));
-                       BrowserTab.Tabs.Objects[0] := ThreadItem;
-                       if ActiveTab then
+                       newBrowser := TBrowserRecord.Create;
+                       for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FBrowser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FBrowser := nil;
+                                       if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent <> nil then begin
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent.Free;
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent := nil;
+                                       end;
+                                       break;
+                               end;
+                       end;
+                       newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+                       FBrowsers.Move(BROWSER_COUNT - 1, 0);
+                       //newBrowser.Browser.Navigate(BLANK_HTML);
+                       newBrowser.thread := ThreadItem;
+                       newBrowser.Repaint := true;
+                       newBrowser.OnlyHundred := GikoSys.OnlyAHundredRes;
+
+                       BrowserTab.Tabs.InsertObject(0, GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
+                       if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
+                               DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 1 ] ) );
+                       end;// else begin
+                       //end;
+                       BrowserTab.Repaint;
+                       if ActiveTab then begin
                                BrowserTab.TabIndex := 0;
+                       end;
 
                end else begin
-                       i := BrowserTab.Tabs.Add(GikoSys.GetShortName(ThreadItem.Title, 20));
-                       BrowserTab.Tabs.Objects[i] := ThreadItem;
-                       if ActiveTab then
-                               BrowserTab.TabIndex := i;
+                       newBrowser := TBrowserRecord.Create;
+                       for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FBrowser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FBrowser := nil;
+                                       if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent <> nil then begin
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent.Free;
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent := nil;
+                                       end;
+                                       break;
+                               end;
+                       end;
+                       newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+                       FBrowsers.Move(BROWSER_COUNT - 1, 0);
+                       //newBrowser.Browser.Navigate(BLANK_HTML);
+                       newBrowser.thread := ThreadItem;
+                       newBrowser.OnlyHundred := GikoSys.OnlyAHundredRes;
+                       newBrowser.Repaint := true;
+
+                       i := BrowserTab.Tabs.AddObject(GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
+                       if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
+                               DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 0 ] ) );
+                       end;
+                       //end;
+                       BrowserTab.Repaint;
+                       if ActiveTab then begin
+                               if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 0) then
+                                       BrowserTab.TabIndex := 0
+                               else
+                                       BrowserTab.TabIndex := i;
+                       end;
                end;
-               if ( ActiveTab ) or ( BrowserTab.Tabs.Count = 1 ) then begin
+               if(ActiveTab) or (idx = -1) then begin
                        BrowserTab.OnChange(nil);
-                       BrowserNullTab := nil;
                end;
        end else begin
-               //OldIndex := BrowserTab.TabIndex;
-               BrowserNullTab := ThreadItem;
+               if BrowserNullTab = nil then begin
+                       BrowserNullTab := TBrowserRecord.Create;
+                       BrowserNullTab.Browser := Browser;
+               end;
+               BrowserNullTab.thread := ThreadItem;
                BrowserTab.TabIndex := -1;
-//             if OldIndex = -1 then
-               BrowserTab.OnChange(nil);
+               SetContent(BrowserNullTab);
        end;
-       BrowserTab.Repaint;
+
        if GikoSys.Setting.URLDisplay then
                AddressComboBox.Text := ThreadItem.URL;
+
 end;
 
-procedure TGikoForm.SetContent(ThreadItem: TThreadItem);
+procedure TGikoForm.SetContent(inThread : TBrowserRecord);
 var
        BBSID: string;
        FileName: string;
        sTitle: string;
 //     HtmlName: string;
-       doc: Variant;
+       doc:  Variant;
        s: string;
 //     OldCursor: TCursor;
-       //i: Integer;
+       i: Integer;
+       url: OleVariant;
+       idx: Integer;
+       ThreadItem: TThreadItem;
+       Thread: TBrowserRecord;
+       ThreadTitle, ThreadPTitle: string;
+       ThreadScrollTop: Integer;
+       ThreadIsLog, ThreadUnRead, ThreadNewArraical: boolean;
 begin
-       while (Browser.ReadyState <> READYSTATE_COMPLETE) and
-                               (Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
-               Application.ProcessMessages;
-       end;
-
+       Thread := inThread;
+       idx := BrowserTab.TabIndex;
        if (FActiveContent <> nil) and
-               (FActiveContent <> ThreadItem) and
-               (Assigned(Browser.Document)) then begin
+               (FActiveContent.Thread <> Thread.Thread) and
+               (Assigned(FActiveContent.Browser.Document)) then begin
                try
                try
                        Sleep(1);
                        //Application.ProcessMessages;
-                       FActiveContent.ScrollTop := OleVariant(IHTMLDocument2(Browser.Document)).Body.ScrollTop;
+                       FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document).Body).ScrollTop;
+                       //if FActiveContent.Browser <> BrowserNullTab.Browser then
+                       //      TOleControl(FActiveContent.Browser).Visible := false;
                except
                        on E: Exception do
                                MsgBox(Handle, E.Message, 'SetContent[<-ScrollTop]', 0);
@@ -3219,45 +3426,78 @@ begin
                finally
                end;
        end;
-
-       FActiveContent := ThreadItem;
-
-       if ThreadItem = nil then begin
-               Browser.Navigate(BLANK_HTML);
+       if not (Assigned(Thread)) or (Thread.Thread = nil) then begin
+               Thread.Browser.Navigate(BLANK_HTML);
                BrowserBoardNameLabel.Caption := '';
                ItemBoardImage.Picture := nil;
                BrowserNameLabel.Caption := '';
                ItemImage.Picture := nil;
+               BrowserNullTab.Thread := nil;
+               //TOleControl(BrowserNullTab.Browser).Visible := true;
+               ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
                FActiveContent := nil;
                Exit;
+       end     else if Thread.Browser = nil then begin
+               if FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then
+                       FBrowsers.Move(BROWSER_COUNT - 1, 0);
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).FBrowser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).FBrowser := nil;
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).FEvent <> nil then begin
+                                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).FEvent.Free;
+                                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).FEvent := nil;
+                               end;
+                               break;
+                       end;
+               end;
+               Thread.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+               FBrowsers.Move(BROWSER_COUNT - 1, 0);
        end;
-
+       ThreadTitle := Thread.Thread.Title;
+       ThreadPTitle := Thread.Thread.ParentBoard.Title;
+       ThreadScrollTop := Thread.Thread.ScrollTop;
+       ThreadIsLog := Thread.Thread.IsLogFile;
+       ThreadItem := Thread.Thread;
+       ThreadNewArraical :=  Thread.Thread.NewArrival;
+       ThreadUnRead := Thread.Thread.UnRead;
        BBSID := ThreadItem.ParentBoard.BBSID;
        FileName := ThreadItem.FileName;
 
        if GetCapture = ListView.Handle then
                ReleaseCapture;
 
-               //OldCursor := Screen.Cursor;
        Screen.Cursor := crHourGlass;
+
+
        try
                if ThreadItem.UnRead then begin
                        ThreadItem.ParentBoard.UnRead := ThreadItem.ParentBoard.UnRead - 1;
                        if ThreadItem.ParentBoard.UnRead < 0 then ThreadItem.ParentBoard.UnRead := 0;
                        TreeView.Refresh;
                end;
-
-               if not ThreadItem.IsLogFile then begin
-
-                       if (not Assigned(Browser.Document)) then begin
-                               Browser.Navigate('about:blank');
-                               while (not Assigned(Browser.Document)) do begin
-                                       Application.ProcessMessages;
-                               end;
+          //   LockWindowUpdate(Self.Handle);
+               if(FActiveContent <> nil) and (FActiveContent <> Thread) then begin
+                       if (FActiveContent.Browser <> BrowserNullTab.Browser) then
+                               ShowWindow(FActiveContent.Browser.Handle, SW_HIDE);
+               end;
+               ShowWindow(Thread.FBrowser.Handle, SW_SHOW);
+               //LockWindowUpdate(0);
+               if (not Assigned(Thread.Browser.Document)) then begin
+                       Thread.Browser.Navigate('about:blank');
+               end;
+               FActiveContent := Thread;
+               while (Thread.Browser.ReadyState <> READYSTATE_COMPLETE) and
+                               (Thread.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
+                       Application.ProcessMessages;
+                       if idx <> BrowserTab.TabIndex then begin
+                               Exit;
                        end;
+               end;
+               if not ThreadIsLog then begin
+                       Self.Caption := CAPTION_NAME ;
                        try
                                s := '<HTML><BODY><CENTER>\82±\82Ì\83X\83\8c\83b\83h\82Í\8eæ\93¾\82µ\82Ä\82¢\82Ü\82¹\82ñ</CENTER></BODY></HTML>';
-                               doc := Browser.Document;
+                               doc := Idispatch( olevariant(Thread.Browser.ControlInterface).Document) as IHTMLDocument2;
                                doc.open;
                                doc.charset := 'Shift_JIS';
                                doc.Write(s);
@@ -3265,74 +3505,98 @@ begin
                        finally
                        end;
                end else begin
-                       GikoSys.CreateHTML2(Browser.Document, ThreadItem, sTitle);
-{
-                       while (Browser.ReadyState <> READYSTATE_COMPLETE) and
-                                               (Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
-                               Application.ProcessMessages;
+                       Self.Caption := CAPTION_NAME + ' - [' + ThreadTitle + ']';
+                       //Thread.Repaint\82Í\81A\83X\83L\83\93\93\99\82Ì\90Ý\92è\82ð\95Ï\8dX\82µ\82½\82Æ\82«\81AThread\82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82½\82Æ\82«
+                       //\90V\8bK\82ÉThread\82ð\8aJ\82¢\82½\82Æ\82«\82É\90^\82É\82È\82Á\82Ä\82¢\82é\81B
+                       if(Thread.Repaint) or (Thread.OnlyHundred <> GikoSys.OnlyAHundredRes)then begin
+                               //Thread.LastSize := ThreadItem.Size;
+                               Thread.Repaint := false;
+                               try
+                                       Thread.Browser.OnStatusTextChange := nil;
+                                       doc := Idispatch( olevariant(Thread.Browser.ControlInterface).Document) as IHTMLDocument2;
+                                       GikoSys.CreateHTML2(doc, ThreadItem, sTitle);
+
+                       //              if (Assigned(Thread.Browser)) and (Thread.Browser <> nil) then
+                                       Thread.Browser.OnStatusTextChange := BrowserStatusTextChange;
+                                       //\82È\82º\82©\82±\82±\82Å\96¾\8e¦\93I\82ÉDocumentComplete\82ð\8cÄ\82Î\82È\82¢\82Æ\82¤\82Ü\82­\82¢\82©\82È\82¢
+                                       //\92Ç\8bL\81@200406/19
+                                       //Visible\82Ì\82Æ\82«\82µ\82©DocumentComplete\82Í\8cÄ\82Î\82ê\82È\82¢\82ç\82µ\82¢
+                                       Thread.FBrowser.OnDocumentComplete(Thread.FBrowser, Thread.FBrowser.Parent, url);
+                                       Thread.OnlyHundred := GikoSys.OnlyAHundredRes;
+                                       Application.ProcessMessages;
+                                       //\82±\82±\82ÅApplication.ProcessMessages\82ð\8cÄ\82Ô\82±\82Æ\82É\82æ\82Á\82ÄWebBrowser\82ð\8dX\90V\82³\82¹\82é\81B
+                                       //\91\8a\82µ\82È\82¢\82Æ\88ê\89æ\96Ê\95ª\82µ\82©\95`\89æ\82Å\82«\82Ä\82È\82¢\82Ì\82Å\82»\82ê\88È\8fã\82Ì\83X\83N\83\8d\81[\83\8b\97Ê\82ð\8ew\92è\82µ\82Ä\82à\96³\8cø\82É\82È\82é
+                                       //\81@by\82à\82\82ã(2004/01/20)
+                                       try
+                                               //if (Assigned(Thread)) and (Assigned(ThreadItem))then begin
+                                                       if(Thread <> nil) and (ThreadItem <>nil) then begin
+                                                               if ThreadUnRead then
+                                                                       BrowserMovement('new', Thread)
+                                                               else if ThreadScrollTop <> 0 then begin
+                                                                       try
+                                                                               doc.Body.ScrollTop := ThreadScrollTop;
+                                                                       except
+                                                                               on E: Exception do
+                                                                                       MsgBox(Handle, E.Message, 'SetContent[ScrollTop<-]', 0);
+                                                                       end;
+                                                               end;
+                                               //      end;
+                                               end else begin
+                                                       FActiveContent := nil;
+                                                       BrowserTab.Repaint;
+                                                       Exit;
+                                               end;
+                                       except
+                                               FActiveContent := nil;
+                                               BrowserTab.Repaint;
+                                               Exit;
+                                       end;
+                               finally
+                                        //     Application.ProcessMessages;
+                               end;
                        end;
-}
-                                               try
-                                                               doc := Browser.Document;
-                                                               Application.ProcessMessages;
-                //\82±\82±\82ÅApplication.ProcessMessages\82ð\8cÄ\82Ô\82±\82Æ\82É\82æ\82Á\82ÄWebBrowser\82ð\8dX\90V\82³\82¹\82é\81B
-                                                               //\91\8a\82µ\82È\82¢\82Æ\88ê\89æ\96Ê\95ª\82µ\82©\95`\89æ\82Å\82«\82Ä\82È\82¢\82Ì\82Å\82»\82ê\88È\8fã\82Ì\83X\83N\83\8d\81[\83\8b\97Ê\82ð\8ew\92è\82µ\82Ä\82à\96³\8cø\82É\82È\82é
-                //\81@by\82à\82\82ã(2004/01/20)
-
-                if ThreadItem.UnRead then
-                    BrowserMovement('new')
-                                                               else if (ThreadItem.ScrollTop <> 0) and (not ThreadItem.UnRead) then begin
-                    try
-                                                                                               doc.Body.ScrollTop := ThreadItem.ScrollTop;
-                                                                               except
-                        on E: Exception do
-                            MsgBox(Handle, E.Message, 'SetContent[ScrollTop<-]', 0);
-                    end;
-                end;
-                       finally
-               //      Application.ProcessMessages;
-            end;
-
                        ThreadItem.UnRead := False;
                        ListView.Refresh;
                end;
+               if (Assigned(Thread)) and (Assigned(Thread.Thread)) and (Thread <> nil) and (ThreadItem <>nil) then begin
+                       //FActiveContent := Thread;
 
-               BrowserBoardNameLabel.Caption := ThreadItem.ParentBoard.Title;
-               ItemIcon16.GetBitmap(4, ItemBoardImage.Picture.Bitmap);
-               BrowserNameLabel.Caption := ThreadItem.Title;
-               ItemImage.Picture := nil;
-               if ThreadItem.IsLogFile then
-                       if ThreadItem.NewArrival then
-                               ItemImageList.GetBitmap(2, ItemImage.Picture.Bitmap)
+                       BrowserBoardNameLabel.Caption := ThreadPTitle;
+                       ItemIcon16.GetBitmap(4, ItemBoardImage.Picture.Bitmap);
+                       BrowserNameLabel.Caption := ThreadTitle;
+                       ItemImage.Picture := nil;
+                       if ThreadIsLog then
+                               if ThreadNewArraical then
+                                       ItemImageList.GetBitmap(2, ItemImage.Picture.Bitmap)
+                               else
+                                       ItemImageList.GetBitmap(0, ItemImage.Picture.Bitmap)
                        else
-                               ItemImageList.GetBitmap(0, ItemImage.Picture.Bitmap)
-               else
-                       ItemImageList.GetBitmap(1, ItemImage.Picture.Bitmap);
+                               ItemImageList.GetBitmap(1, ItemImage.Picture.Bitmap);
 
-               ItemImage.Left := BrowserBoardNameLabel.Left + BrowserBoardNameLabel.Width + 8;
-               BrowserNameLabel.Left := ItemImage.Left + 20;
+                       ItemImage.Left := BrowserBoardNameLabel.Left + BrowserBoardNameLabel.Width + 8;
+                       BrowserNameLabel.Left := ItemImage.Left + 20;
+               end else begin
+                       FActiveContent := nil;
+               end;
        finally
-                               //if Screen.Cursor <> crDefault then
-               //      Screen.Cursor := OldCursor
-                               //else
-                                       Screen.Cursor := crDefault;
+               Screen.Cursor := crDefault;
        end;
 end;
 
 function TGikoForm.GetActiveContent: TThreadItem;
-var
-       Index: Integer;
 begin
-       Result := nil;
-       if BrowserTab.TabIndex = -1 then begin
-               Result := BrowserNullTab;
-               Exit;
+       try
+               if( Assigned(FActiveContent) ) and (Assigned(FActiveContent.Thread))
+                       and (FActiveContent <> nil) and (FActiveContent.Thread <> nil) then
+                       Result := FActiveContent.Thread
+               else begin
+            FActiveContent := nil;
+                       Result := nil;
+               end;
+       except
+               FActiveContent := nil;
+               Result := nil;
        end;
-       Index := BrowserTab.TabIndex;
-       if BrowserTab.Tabs.Objects[Index] is TThreadItem then
-               Result := TThreadItem(BrowserTab.Tabs.Objects[Index]);
-
-//     Result := FActiveContent;
 end;
 
 procedure TGikoForm.SetActiveList(Obj: TObject);
@@ -3352,7 +3616,7 @@ begin
                ListView.Selected := nil;
 //     ListView.Columns.Clear;
 
-               Caption := CAPTION_NAME;
+               Self.Caption := CAPTION_NAME;
                //Application.Title := CAPTION_NAME;
 
                if Obj is TBBS then begin
@@ -3372,22 +3636,6 @@ begin
                        ListView.ItemFocused := ListView.Items.Item[ idx ];
                end;
 //     end;
-
-       if Obj is TBoard then begin
-               if GikoSys.Setting.ListOrientation = gloHorizontal then begin
-                       if GikoSys.Setting.ListWidthState = glsMax then begin
-                               BrowserMinAction.Execute;
-                               if GikoForm.Visible then
-                                       ListView.SetFocus;
-                       end;
-               end else begin
-                       if GikoSys.Setting.ListHeightState = glsMax then begin
-                               BrowserMinAction.Execute;
-                               if GikoForm.Visible then
-                                       ListView.SetFocus;
-                       end;
-               end;
-       end;
 end;
 
 
@@ -3563,9 +3811,9 @@ begin
 //                             SetContent(ThreadItem);
                                FHistoryList.Move(i, 0);
                                if FTreeType = gttHistory then
-                                       if TreeView.TopItem <> TreeView.Items[ i ] then
-                                               TreeView.Items[ i ].MoveTo( TreeView.TopItem, naInsert );
-                Result := false;
+                                       if TreeView.Items.GetFirstNode <> TreeView.Items[ i ] then
+                                               TreeView.Items[ i ].MoveTo( TreeView.Items.GetFirstNode, naInsert );
+                                                               Result := false;
                                Exit;
                        end;
                end;
@@ -3579,7 +3827,7 @@ begin
 
        if FTreeType = gttHistory then begin
                Node := TreeView.Items.Add( nil, favItem.Title );
-               Node.MoveTo( TreeView.TopItem, naInsert );
+               Node.MoveTo( TreeView.Items.GetFirstNode, naInsert );
                {
                if favItem.NewArrival then begin
                        Node.ImageIndex := ITEM_ICON_THREADNEW1;
@@ -3624,7 +3872,7 @@ begin
             else if TObject(FHistoryList[ i ]) is TFavoriteBoardItem then
                 TFavoriteBoardItem(FHistoryList[ i ]).Free;
 
-            //FHistoryList.Delete(i);
+                       //FHistoryList.Delete(i);
         end;
        except
        end;
@@ -3745,7 +3993,7 @@ begin
                        FTreeType := gtt2ch;
                        HistoryToolBar.Hide;
                        SetBoardTreeNode( inBBS );
-                       TreeView.TopItem.Expanded := True;                              //?c???[?g?b?v???????J??
+                       TreeView.Items.GetFirstNode.Expanded := True;                           //?c???[?g?b?v???????J??
                        //?c???[??g?b?v?????I????
                        if GetActiveList = nil then
                                TreeView.Selected := TreeView.Items[0]
@@ -3802,7 +4050,7 @@ begin
                        FTreeType := gtt2ch;
                        HistoryToolBar.Hide;
                        SetBoardTreeNode( inBBS );
-                       TreeView.TopItem.Expanded := True;                              //\83c\83\8a\81[\83g\83b\83v\8d\80\96Ú\82¾\82¯\82ð\8aJ\82­
+                       TreeView.Items.GetFirstNode.Expanded := True;                           //\83c\83\8a\81[\83g\83b\83v\8d\80\96Ú\82¾\82¯\82ð\8aJ\82­
                        //\83c\83\8a\81[\82Ì\83g\83b\83v\8d\80\96Ú\82ð\91I\91ð\82·\82é
                        if GetActiveList = nil then begin
                                try
@@ -3971,6 +4219,22 @@ begin
                        end;
                        SetActiveList( Item );
                end;
+
+               if Item is TBoard then begin // not TCategory
+                       if GikoSys.Setting.ListOrientation = gloHorizontal then begin
+                               if GikoSys.Setting.ListWidthState = glsMax then begin
+                                       BrowserMinAction.Execute;
+                                       if GikoForm.Visible then
+                                               ListView.SetFocus;
+                               end;
+                       end else begin
+                               if GikoSys.Setting.ListHeightState = glsMax then begin
+                                       BrowserMinAction.Execute;
+                                       if GikoForm.Visible then
+                                               ListView.SetFocus;
+                               end;
+                       end;
+               end;
        end;
 end;
 
@@ -3990,10 +4254,18 @@ begin
                        if not (TObject(listItem.Data) is TThreadItem) then Exit;
 
                        threadItem := TThreadItem(ListItem.Data);
-                       InsertBrowserTab(threadItem);
+                       InsertBrowserTab(threadItem, False);
                        if threadItem.IsLogFile then
                                ListView.UpdateItems(listItem.Index, listItem.Index);
                end;
+       mbLeft:
+               begin
+            //\82±\82±\82ÅDblClick\8fE\82í\82È\82¢\82Æ\81AClick\83C\83x\83\93\83g\82ª\97D\90æ\82µ\82Ä\8bN\82«\82Ä\82µ\82Ü\82¤\82Ì\82Å
+                       if (ssDouble in Shift) then
+                               ListDoubleClick(Shift)
+                       else
+                               ListClick;
+               end;
        end;
 {      if ssDouble in Shift then begin
                DoubleClickOccurred[Button] := True;
@@ -4036,29 +4308,21 @@ begin
        if ThreadItem.IsLogFile then begin
 //             if AddHistory(ThreadItem) then
 //             SetContent(ThreadItem);
-               InsertBrowserTab(ListItem.Data);
+               InsertBrowserTab(ThreadItem);
                ListView.UpdateItems(ListItem.Index, ListItem.Index);
        end else begin
 //             SetContent(ThreadItem);
-               InsertBrowserTab(ListItem.Data);
+               InsertBrowserTab(ThreadItem);
        end;
 
-       if ListView.Selected = nil then
-               Exit;
-       if ListView.Selected.Data = nil then
-               Exit;
-       if TThreadItem( ListView.Selected.Data ).IsLogFile then begin
+       if GikoSys.Setting.BrowserAutoMaximize = gbmClick then begin
                if GikoSys.Setting.ListOrientation = gloHorizontal then begin
                        if GikoSys.Setting.ListWidthState = glsMin then begin
-                               BrowserMaxAction.Execute;
-                               if GikoForm.Visible then
-                                       Browser.SetFocus;
+                               BrowserMaxAndFocusAction.Execute;
                        end;
                end else begin
                        if GikoSys.Setting.ListHeightState = glsMin then begin
-                               BrowserMaxAction.Execute;
-                               if GikoForm.Visible then
-                                       Browser.SetFocus;
+                               BrowserMaxAndFocusAction.Execute;
                        end;
                end;
        end;
@@ -4085,38 +4349,85 @@ begin
                //TreeViewChange(nil, TreeView.Selected);
        end else if TObject(ListView.Selected.Data) is TThreadItem then begin
                //if TObject(ListView.Selected.Data) is TThreadItem then begin
-            Application.ProcessMessages;
+                       Application.ProcessMessages;
                        ThreadItem := TThreadItem(ListView.Selected.Data);
                        DownloadContent(ThreadItem, shiftDown);
                //end;
+               
+               if GikoSys.Setting.BrowserAutoMaximize = gbmDoubleClick then begin
+                       if GikoSys.Setting.ListOrientation = gloHorizontal then begin
+                               if GikoSys.Setting.ListWidthState = glsMin then begin
+                                       BrowserMaxAndFocusAction.Execute;
+                               end;
+                       end else begin
+                               if GikoSys.Setting.ListHeightState = glsMin then begin
+                                       BrowserMaxAndFocusAction.Execute;
+                               end;
+                       end;
+               end;
+       end;
+end;
+procedure TGikoForm.BrowserMovement(const AName: string; BrowserRecord: TBrowserRecord);
+var
+       top: Integer;
+       item: OleVariant;
+       nm: OleVariant;
+       activeBrower :TWebBrowser;
+begin
+//     OleVariant(Browser.Document).parentWindow.location.hash := AName;
+
+       while (BrowserRecord.Browser.ReadyState <> READYSTATE_COMPLETE) and
+                               (BrowserRecord.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
+               Application.ProcessMessages;
+       end;
+
+       // Access Violation \82ª\8bN\82«\82é\8e\96\82ª\82 \82é\82Ì\82Å\8d¡\8cã\97v\83`\83F\83b\83N
+       if(BrowserRecord <> nil) and (BrowserRecord.FBrowser <> nil) then begin
+               activeBrower := BrowserRecord.FBrowser;
+               try
+                       top := 0;
+                       nm := AName;
+                       item := OleVariant( activeBrower.Document as IHTMLDocument2).anchors.item(nm);
+                       repeat
+                               top := top + item.offsetTop;
+                               item := item.offsetParent;
+                       until AnsiCompareText(item.tagName, 'body' ) = 0;
+
+                       OleVariant(activeBrower.Document as IHTMLDocument2).body.scrollTop := top;
+               except
+               end;
        end;
 end;
 
-procedure TGikoForm.BrowserMovement(AName: string);
+procedure TGikoForm.BrowserMovement(const AName: string);
 var
-    top: Integer;
-    item: OleVariant;
+       top: Integer;
+       item: OleVariant;
        nm: OleVariant;
+       activeBrower :TWebBrowser;
 begin
 //     OleVariant(Browser.Document).parentWindow.location.hash := AName;
-    {
+       {
        while (Browser.ReadyState <> READYSTATE_COMPLETE) and
                                (Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
                Application.ProcessMessages;
        end;
-    }
+       }
        // Access Violation \82ª\8bN\82«\82é\8e\96\82ª\82 \82é\82Ì\82Å\8d¡\8cã\97v\83`\83F\83b\83N
-       try
-               top := 0;
-               nm := AName;
-               item := OleVariant( Browser.Document as IHTMLDocument2).anchors.item(nm);
-               repeat
-                       top := top + item.offsetTop;
-                       item := item.offsetParent;
-               until AnsiCompareText(item.tagName, 'body' ) = 0;
-
-               OleVariant(Browser.Document as IHTMLDocument2).body.scrollTop := top;
-       except
+       if(BrowserTab.Tabs.Count > 0) and (BrowserTab.TabIndex >= 0) then begin
+               activeBrower := FActiveContent.Browser;
+               try
+                       top := 0;
+                       nm := AName;
+                       item := OleVariant( activeBrower.Document as IHTMLDocument2).anchors.item(nm);
+                       repeat
+                               top := top + item.offsetTop;
+                               item := item.offsetParent;
+                       until AnsiCompareText(item.tagName, 'body' ) = 0;
+
+                       OleVariant(activeBrower.Document as IHTMLDocument2).body.scrollTop := top;
+               except
+               end;
        end;
 end;
 
@@ -4617,10 +4928,12 @@ begin
 //     Mouse.CursorPos := BrowserSizeButton.ClientToScreen(Point(
 //                                                                                             System.Round(BrowserToolBar.ButtonWidth div 2),
 //                                                                                             System.Round(BrowserToolBar.ButtonHeight div 2)));
+       //BrowserTab.OnChange(nil);
 end;
 
 procedure TGikoForm.BrowserMinActionExecute(Sender: TObject);
 begin
+
        if GikoSys.Setting.ListOrientation = gloHorizontal then begin
                case GikoSys.Setting.ListWidthState of
                        glsMax, glsNormal: begin
@@ -4690,14 +5003,6 @@ var
 begin
        Item := GetActiveContent;
        if Item = nil then Exit;
-
-       if Item.Count >= 1000 then begin
-               msg := '\82±\82Ì\83X\83\8c\83b\83h\82Í\83\8c\83X\90\94\82ª\82P\82O\82O\82O\82ð\92´\82¦\82Ä\82¢\82é\82Ì\82Å\8f\91\8d\9e\82Ý\8fo\97\88\82Ü\82¹\82ñ\81B' + #13#10
-                                + '\90V\83X\83\8c\83b\83h\82ð\92T\82µ\82Ä\82­\82¾\82³\82¢\81B';
-               if MsgBox(Handle, msg, '\8cx\8d\90', MB_YESNO or MB_ICONEXCLAMATION) <> 7 then begin
-                                               Exit;
-                               end;
-       end;
        Editor := TEditorForm.Create(Self);
        Editor.SetThreadItem(Item);
     GikoSys.LoadEditorKeySetting(Editor.ActionList);
@@ -4906,8 +5211,9 @@ begin
 
        if FIsMinimize = mtMinimized then begin
                if FActiveContent <> nil then begin
-                       doc := Browser.Document;
-                       doc.Body.ScrollTop := FActiveContent.ScrollTop;
+                       //Application.ProcessMessages;
+                       doc := Idispatch( olevariant(FActiveContent.Browser.ControlInterface).Document) as IHTMLDocument2;
+                       doc.Body.ScrollTop := FActiveContent.Thread.ScrollTop;
                        FIsMinimize := mtNone;
                end;
        end;
@@ -4981,17 +5287,17 @@ end;
 
 procedure TGikoForm.BrowserTabCloseActionUpdate(Sender: TObject);
 begin
-       BrowserTabCloseAction.Enabled := GetActiveContent <> nil;
+       BrowserTabCloseAction.Enabled := (BrowserTab.Tabs.Count > 0);
 end;
 
 procedure TGikoForm.NotSelectTabCloseActionUpdate(Sender: TObject);
 begin
-       NotSelectTabCloseAction.Enabled := GetActiveContent <> nil;
+       NotSelectTabCloseAction.Enabled := (BrowserTab.Tabs.Count > 1);
 end;
 
 procedure TGikoForm.AllTabCloseActionUpdate(Sender: TObject);
 begin
-       AllTabCloseAction.Enabled := GetActiveContent <> nil;
+       AllTabCloseAction.Enabled := (BrowserTab.Tabs.Count > 0);
 end;
 
 procedure TGikoForm.ActiveLogDeleteActionUpdate(Sender: TObject);
@@ -4999,21 +5305,6 @@ begin
        ActiveLogDeleteAction.Enabled := GetActiveContent <> nil;
 end;
 
-procedure TGikoForm.ListViewDblClick(Sender: TObject);
-var
-       shift: TShiftState;
-begin
-       shift := [];
-       if GetAsyncKeyState(VK_SHIFT) = Smallint($8001) then
-               Include(shift, ssShift);
-       if GetAsyncKeyState(VK_CONTROL) = Smallint($8001) then
-               Include(shift, ssCtrl);
-       if GetAsyncKeyState(VK_MENU) = Smallint($8001) then
-               Include(shift, ssAlt);
-
-       ListDoubleClick(shift);
-end;
-
 procedure TGikoForm.LogDeleteActionExecute(Sender: TObject);
 const
        DEL_MSG = '\83\8d\83O\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\82æ\82ë\82µ\82¢\82Å\82·\82©\81H';
@@ -5052,72 +5343,161 @@ begin
                List.Free;
        end;
 end;
-
-procedure TGikoForm.DeleteTab(ThreadItem: TThreadItem);
+procedure TGikoForm.DeleteTab(BrowserRecord: TBrowserRecord);
 var
-       i: Integer;
+       i, j, idx: Integer;
+       doc: Variant;
 begin
+       idx := BrowserTab.TabIndex;
        FTabHintIndex := -1;
        for i := 0 to BrowserTab.Tabs.Count - 1 do begin
-               if TThreadItem(BrowserTab.Tabs.Objects[i]) = ThreadItem then begin
+               if TBrowserRecord(BrowserTab.Tabs.Objects[i]) = BrowserRecord then begin
+                       BrowserTab.Tabs.BeginUpdate;
+                       try
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
+                                       doc := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser.Document;
+                                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := doc.Body.ScrollTop;
+                               end;
+                       except
+                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := 0;
+                       end;
+                       if( FActiveContent = TBrowserRecord(BrowserTab.Tabs.Objects[i]) ) then
+                               FActiveContent := nil;
+                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
+                               j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser);
+                               if j <> -1 then
+                                       FBrowsers.Move(j, BROWSER_COUNT - 1);
+                       end;
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
                        BrowserTab.Tabs.Delete(i);
-                       if i > (BrowserTab.Tabs.Count - 1) then
-                               BrowserTab.TabIndex := BrowserTab.Tabs.Count - 1
-                       else
-                               BrowserTab.TabIndex := i;
-                       if BrowserTab.Tabs.Count = 0 then
-                               SetContent(nil)
-                       else if BrowserTab.TabIndex <> -1 then
-                               SetContent(TThreadItem(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]));
+                       if idx > i then begin
+                               BrowserTab.TabIndex := idx - 1;
+                       end else begin
+                               if BrowserTab.Tabs.Count -1 >= idx then
+                                       BrowserTab.TabIndex := idx
+                               else
+                                       BrowserTab.TabIndex := BrowserTab.Tabs.Count - 1;
+                       end;
+                       if BrowserTab.Tabs.Count = 0 then begin
+                               BrowserNullTab.Thread := nil;
+                       end;
+                       if(BrowserTab.TabIndex <> -1) and
+                               ( TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser = nil) then begin
+                               for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                                       if(TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser
+                                                = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) )then
+                                       begin
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser := nil;
+                                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent <> nil then begin
+                                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent.Free;
+                                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent := nil;
+                                               end;
+                                               break;
+                                       end;
+                               end;
+                               TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
+                                        :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+                               TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
+                               FBrowsers.Move(BROWSER_COUNT - 1, 0);
+                       end;
+                       BrowserTab.Tabs.EndUpdate;
+                       if( FActiveContent = nil) then
+                               BrowserTab.OnChange(nil);
                        Exit;
                end;
        end;
 end;
-
-procedure TGikoForm.KokomadeActionExecute(Sender: TObject);
+procedure TGikoForm.DeleteTab(ThreadItem: TThreadItem);
 var
-       No: Integer;
-       ThreadItem: TThreadItem;
-       sTitle: string;
-       ScrollTop: Integer;
+       i, j, idx: Integer;
        doc: Variant;
 begin
-       No := KokoPopupMenu.Tag;
-       if No = 0 then Exit;
-       ThreadItem := GetActiveContent;
-       if ThreadItem = nil then Exit;
-       ThreadItem.Kokomade := No;
-       doc := Browser.Document;
-       ScrollTop := doc.Body.ScrollTop;
-
-       GikoSys.CreateHTML2(doc, ThreadItem, sTitle);
-//     HtmlName := GikoSys.CreateHTML(ThreadItem, sTitle) + '#koko';
-//     Flags := 2;
-//     Browser.Navigate(HtmlName, Flags);
-//     Sleep(10);
-       Application.ProcessMessages;
-       doc.Body.ScrollTop := ScrollTop;
-end;
+       idx := BrowserTab.TabIndex;
+       FTabHintIndex := -1;
+       for i := 0 to BrowserTab.Tabs.Count - 1 do begin
+               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
+                       BrowserTab.Tabs.BeginUpdate;
+                       try
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
+                                       doc := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser.Document;
+                                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := doc.Body.ScrollTop;
+
+                               end;
+                       except
+                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := 0;
+                       end;
+                       if(FActiveContent = TBrowserRecord(BrowserTab.Tabs.Objects[i])) then
+                               FActiveContent := nil;
+                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
+                               j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser);
+                               if j <> -1 then
+                                       FBrowsers.Move(j, BROWSER_COUNT - 1);
+                       end;
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
+                       BrowserTab.Tabs.Delete(i);
+                       if idx > i then begin
+                               BrowserTab.TabIndex := idx - 1;
+                       end else begin
+                               if BrowserTab.Tabs.Count -1 >= idx then
+                                       BrowserTab.TabIndex := idx
+                               else
+                                       BrowserTab.TabIndex := BrowserTab.Tabs.Count - 1;
+                       end;
+                       if(BrowserTab.TabIndex <> -1) and
+                               ( TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser = nil) then begin
+                               for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                                       if(TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser
+                                                = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) )then
+                                       begin
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser := nil;
+                                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent <> nil then begin
+                                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent.Free;
+                                                       TBrowserRecord(BrowserTab.Tabs.Objects[j]).FEvent := nil;
+                                               end;
+                                               break;
+                                       end;
+                               end;
+                               TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
+                                        :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+                               TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
+                               FBrowsers.Move(BROWSER_COUNT - 1, 0);
+                       end;
+
+                       BrowserTab.Tabs.EndUpdate;
+                       if( FActiveContent = nil) then
+                               BrowserTab.OnChange(nil);
+                       Exit;
+               end;
+       end;
+end;
+
+procedure TGikoForm.KokomadeActionExecute(Sender: TObject);
+var
+       No: Integer;
+       ThreadItem: TThreadItem;
+begin
+       No := KokoPopupMenu.Tag;
+       if No = 0 then Exit;
+       ThreadItem := GetActiveContent;
+       if ThreadItem = nil then Exit;
+       ThreadItem.Kokomade := No;
+       FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+       FActiveContent.FRepaint := true;
+       InsertBrowserTab(FActiveContent.Thread, true);
+       Application.ProcessMessages;
+end;
 
 procedure TGikoForm.ZenbuActionExecute(Sender: TObject);
 var
        ThreadItem: TThreadItem;
-       sTitle: string;
-       ScrollTop: Integer;
-       doc: Variant;
 begin
        ThreadItem := GetActiveContent;
        if ThreadItem = nil then Exit;
        ThreadItem.Kokomade := -1;
-       doc := Browser.Document;
-       ScrollTop := doc.Body.ScrollTop;
-       GikoSys.CreateHTML2(doc, ThreadItem, sTitle);
-//     HtmlName := GikoSys.CreateHTML(ThreadItem, sTitle) + '#koko';
-//     Flags := 2;
-//     Browser.Navigate(HtmlName, Flags);
-//     Sleep(10);
+       FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+       FActiveContent.FRepaint := true;
+       InsertBrowserTab(FActiveContent.Thread, true);
        Application.ProcessMessages;
-       doc.Body.ScrollTop := ScrollTop;
 end;
 
 function TGikoForm.Hook(var Message: TMessage): Boolean;
@@ -5141,13 +5521,6 @@ begin
        Item := GetActiveContent;
        if Item = nil then Exit;
 
-       if Item.Count >= 1000 then begin
-               msg := '\82±\82Ì\83X\83\8c\83b\83h\82Í\83\8c\83X\90\94\82ª\82P\82O\82O\82O\82ð\92´\82¦\82Ä\82¢\82é\82Ì\82Å\8f\91\8d\9e\82Ý\8fo\97\88\82Ü\82¹\82ñ\81B' + #13#10
-                                + '\90V\83X\83\8c\83b\83h\82ð\92T\82µ\82Ä\82­\82¾\82³\82¢\81B';
-               if MsgBox(Handle, msg, '\8cx\8d\90', MB_YESNO or MB_ICONEXCLAMATION) <> 7 then begin
-                       Exit;
-               end;
-       end;
        Editor := TEditorForm.Create(Self);
        Editor.SetThreadItem(Item);
        Editor.BodyEdit.Text := '>>' + IntToStr(Number) + #13#10;
@@ -5171,7 +5544,6 @@ begin
        LPMSep05.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
        DeletePMenu.Visible := (GetActiveList is TBoard);
        LPMSep06.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
-
        BoardFavoriteAddMenu.Visible := (GetActiveList is TCategory);
        ThreadFavoriteAddMenu.Visible := (GetActiveList is TBoard);
 
@@ -5309,13 +5681,13 @@ end;
 procedure TGikoForm.BrowserTabCloseActionExecute(Sender: TObject);
 var
        idx: Integer;
-       ThreadItem: TThreadItem;
+//     ThreadItem: TThreadItem;
 begin
        idx := BrowserTab.TabIndex;
        if idx <> -1 then begin
                if BrowserTab.Tabs.Objects[idx] <> nil then begin
-                       ThreadItem := TThreadItem(BrowserTab.Tabs.Objects[idx]);
-                       DeleteTab(ThreadItem);
+                       //ThreadItem := TThreadItem(BrowserTab.Tabs.Objects[idx]);
+                       DeleteTab(TBrowserRecord(BrowserTab.Tabs.Objects[idx]));
                end;
        end;
 end;
@@ -5323,24 +5695,44 @@ end;
 procedure TGikoForm.NotSelectTabCloseActionExecute(Sender: TObject);
 var
        i: Integer;
+       idx: Integer;
 begin
-       for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
-               if BrowserTab.TabIndex <> i then begin
+       idx := BrowserTab.TabIndex;
+       if idx = -1 then Exit;
+       BrowserTab.Tabs.BeginUpdate;
+       for i := BrowserTab.Tabs.Count - 1 downto BrowserTab.TabIndex + 1 do begin
+               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
+               BrowserTab.Tabs.Delete(i);
+       end;
+       if idx > 0 then begin
+               for i := BrowserTab.TabIndex - 1 downto 0 do begin
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
                        BrowserTab.Tabs.Delete(i);
                end;
        end;
+       BrowserTab.Tabs.EndUpdate;
 end;
 
 procedure TGikoForm.AllTabCloseActionExecute(Sender: TObject);
 var
        i: Integer;
 begin
-    SetContent(nil);
+       if GikoSys.Setting.ShowDialogForAllTabClose then
+               if(MessageDlg('\91S\82Ä\82Ì\83^\83u\82ð\95Â\82\82Ä\82æ\82ë\82µ\82¢\82Å\82·\82©\81H', mtConfirmation,[mbOk, mbCancel], 0) = mrCancel ) then
+                       Exit;
+
+       FActiveContent := nil;
+       BrowserNullTab.Thread := nil;
        BrowserTab.OnChange := nil;
-       for i := BrowserTab.Tabs.Count - 1 downto 0 do
-               BrowserTab.Tabs.Delete(i);
+       BrowserTab.Tabs.BeginUpdate;
+       for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
+       end;
+       BrowserTab.Tabs.Clear;
+       BrowserTab.Tabs.EndUpdate;
        BrowserTab.OnChange := BrowserTabChange;
-
+       SetContent(BrowserNullTab);
+       Self.Caption := CAPTION_NAME ;
 end;
 
 procedure TGikoForm.TreeSelectBoradReloadExecute(Sender: TObject);
@@ -5510,30 +5902,56 @@ var
        Html: string;
        URL: string;
        idx: Integer;
+       wkIntSt: Integer;
+       wkIntTo: Integer;
 begin
 
        Cancel := True;
        if (IHTMLDocument2(TWebBrowser(Sender).Document).activeElement <> nil) then begin
                Text := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement.Get_outerText;
                Html := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement.Get_outerHTML;
+               if(AnsiPos('>>', Text) = 1) or (AnsiPos('>', Text) = 1)
+                       or (AnsiPos('\81\84\81\84', Text) = 1) or (AnsiPos('\81\84', Text) = 1) then begin
+                       if GikoSys.Setting.ResAnchorJamp then begin
+                               Text := ZenToHan(Text);
 
-               URL := GikoSys.GetHRefText(Html);
-               URL := GikoSys.HTMLDecode(URL);
-
-               //\83A\83h\83\8c\83X\83o\81[\82Ì\97\9a\97ð
-               if GikoSys.Setting.LinkAddAddressBar then begin
-                       idx := AddressComboBox.Items.IndexOf(URL);
-                       if idx = -1 then begin
-                               AddressComboBox.Items.Insert(0, URL);
-                               if AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
-                                       AddressComboBox.Items.Delete(AddressComboBox.Items.Count - 1);
-                       end else begin
-                               AddressComboBox.Items.Delete(idx);
-                               AddressComboBox.Items.Insert(0, URL);
+                               if(AnsiPos('>>', Text) = 1) then begin
+                                       Text := Copy(Text, 3, Length(Text) - 2);
+                               end else begin
+                                       Text := Copy(Text, 2, Length(Text) - 1);
+                               end;
+                               if AnsiPos('-', Text) <> 0 then begin
+                                       wkIntSt := StrToIntDef(Copy(Text, 1, AnsiPos('-', Text) - 1), 0);
+                                       Text := Copy(Text, AnsiPos('-', Text) + 1, Length(Text));
+                                       wkIntTo := StrToIntDef(Text, 0);
+                                       if wkIntTo < wkIntSt then
+                                               wkIntSt := wkIntTo;
+                               end else
+                                       wkIntSt := StrToIntDef(Text, 0);
+
+                               if wkIntSt <> 0 then
+                                       BrowserMovement(IntToStr(wkIntSt));
+                       end;
+               end else begin
+                       URL := GikoSys.GetHRefText(Html);
+                       URL := GikoSys.HTMLDecode(URL);
+                       if( AnsiPos('http://', URL) = 1) or (AnsiPos('https://', URL) = 1) or
+                               ( AnsiPos('ftp://', URL) = 1) then begin
+                               //\83A\83h\83\8c\83X\83o\81[\82Ì\97\9a\97ð
+                               if GikoSys.Setting.LinkAddAddressBar then begin
+                                       idx := AddressComboBox.Items.IndexOf(URL);
+                                       if idx = -1 then begin
+                                               AddressComboBox.Items.Insert(0, URL);
+                                               if AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
+                                                       AddressComboBox.Items.Delete(AddressComboBox.Items.Count - 1);
+                                       end else begin
+                                               AddressComboBox.Items.Delete(idx);
+                                               AddressComboBox.Items.Insert(0, URL);
+                                       end;
+                               end;
+                               MoveToURL( URL );
                        end;
                end;
-
-               MoveToURL( URL );
        end;
 
 {      ShiftDown := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
@@ -5622,63 +6040,65 @@ end;
 
 procedure TGikoForm.BrowserTabChange(Sender: TObject);
 var
+       i, j: Integer;
        idx: Integer;
-       ThreadItem: TThreadItem;
 begin
 
 //     if NewTab = -1 then
-       ThreadItem := nil;
+//     ThreadItem := nil;
        if not BrowserTab.Dragging then begin
                FTabHintIndex := -1;
                BrowserTab.Hint := '';
                idx := BrowserTab.TabIndex;
                if idx = -1 then begin
+                       BrowserNullTab.Thread := nil;
                        SetContent(BrowserNullTab);
-               end else if(BrowserTab.Tabs.Objects[idx] <> nil) and (BrowserTab.Tabs.Objects[idx] is TThreadItem) then begin
-                       ThreadItem := TThreadItem(BrowserTab.Tabs.Objects[idx]);
-                       SetContent(ThreadItem);
-                       if GikoSys.Setting.URLDisplay then
-                               AddressComboBox.Text := ThreadItem.URL;
-               end;
 
-               if ThreadItem = nil then Exit;
-               if ThreadItem.IsLogFile then begin
-                       if GikoSys.Setting.ListOrientation = gloHorizontal then begin
-                               if GikoSys.Setting.ListWidthState = glsMin then begin
-                                       BrowserMaxAction.Execute;
-                                       if GikoForm.Visible then
-                                               Browser.SetFocus;
-                               end;
+               end else if(BrowserTab.Tabs.Objects[idx] <> nil) and (BrowserTab.Tabs.Objects[idx] is TBrowserRecord) then begin
+                       if TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser <> nil then begin
+                               j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser);
+                               if j <> -1 then
+                                       FBrowsers.Move(j ,0);
                        end else begin
-                               if GikoSys.Setting.ListHeightState = glsMin then begin
-                                       BrowserMaxAction.Execute;
-                                       if GikoForm.Visible then
-                                               Browser.SetFocus;
+                               if( FActiveContent <> nil ) and (FActiveContent.Browser <> nil) and
+                                       (FActiveContent.Browser <> BrowserNullTab.Browser) and
+                                       (FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1])) then
+                                       FBrowsers.Move(BROWSER_COUNT - 1, 0);
+
+                               for i := 0 to BrowserTab.Tabs.Count - 1 do begin
+                                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser := nil;
+                                               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+                                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).FEvent <> nil then begin
+                                                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).FEvent.Free;
+                                                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).FEvent := nil;
+                                               end;
+                                       end;
                                end;
+                               TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+                               TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Repaint := true;
+                               FBrowsers.Move(BROWSER_COUNT - 1, 0);
                        end;
+                       TOleControl(TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser).BringToFront;
+                       GikoSys.OnlyAHundredRes := TBrowserRecord(BrowserTab.Tabs.Objects[idx]).OnlyHundred;
+                       OnlyAHundredRes.Checked := TBrowserRecord(BrowserTab.Tabs.Objects[idx]).OnlyHundred;
+                       SetContent(TBrowserRecord(BrowserTab.Tabs.Objects[idx]));
+
+                       if (GikoSys.Setting.URLDisplay) and (GetActiveContent <> nil) then
+                               AddressComboBox.Text := GetActiveContent.URL;
+
+                       if ((TreeView.Visible) and (TreeView.Focused)) or ((FavoriteTreeView.Visible) and (FavoriteTreeView.Focused)) or
+                               (ListView.Focused) or (SelectComboBox.Focused) or (AddressComboBox.Focused)
+                       then
+                       else
+               SetFocusForBrowserAction.Execute;       
+
                end;
+
        end;
 
 end;
 
-procedure TGikoForm.BrowserTabClick(Sender: TObject);
-var
-       idx: Integer;
-       ThreadItem: TThreadItem;
-begin
-//     if NewTab = -1 then
-       FTabHintIndex := -1;
-       BrowserTab.Hint := '';
-       idx := BrowserTab.TabIndex;
-       if idx = -1 then
-               SetContent(BrowserNullTab)
-       else if(BrowserTab.Tabs.Objects[idx] <> nil) and (BrowserTab.Tabs.Objects[idx] is TThreadItem) then begin
-               ThreadItem := TThreadItem(BrowserTab.Tabs.Objects[idx]);
-               SetContent(ThreadItem);
-               if GikoSys.Setting.URLDisplay then
-                       AddressComboBox.Text := ThreadItem.URL;
-       end;
-end;
 
 procedure TGikoForm.BrowserTabMouseDown(Sender: TObject;
        Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
@@ -5686,7 +6106,6 @@ var
        p: TPoint;
        p2: TPoint;
        idx: Integer;
-       OldIndex: Integer;
 begin
        if Button = mbMiddle then begin
                // \83}\83E\83X\92\86\83{\83^\83\93
@@ -5694,22 +6113,11 @@ begin
                p2 := p;
                p := BrowserTab.ScreenToClient(p);
                idx := BrowserTab.IndexOfTabAt(p.X, p.Y);
-               if idx <> -1 then begin
-                       OldIndex := BrowserTab.TabIndex;
-                       BrowserTab.Tabs.Delete(idx);
-                       if idx = OldIndex then begin
-                               if BrowserTab.Tabs.Count > idx then
-                                       BrowserTab.TabIndex := idx
-                               else if BrowserTab.Tabs.Count = idx then
-                                       BrowserTab.TabIndex := idx - 1
-                               else if BrowserTab.Tabs.Count > 0 then
-                                       BrowserTab.TabIndex := 0;
-                               BrowserTab.OnChange(nil);
-                       end;
-               end;
+               if idx <> -1 then
+                       DeleteTab(TBrowserRecord(BrowserTab.Tabs.Objects[idx]));
        //end else if Button = mbRight then begin
        //PopupMenu\82ÅBrowserTabPoupMenu\82ð\8ew\92è\82µ\82Ä\82¢\82é\82Ì\82Å\82±\82±\82Å\82í\82´\82í\82´\8cÄ\82Ñ\8fo\82·\82Æ\82Q\8fd\82É\82È\82é
-    //OnContextPopup\82Å\82à\82µ\82àActive\82ÈTab\88È\8aO\82Å\8cÄ\82Ñ\8fo\82³\82ê\82½\82çTab\82ð\90Ø\82è\91Ö\82¦\82é\82æ\82¤\82É\82µ\82½\81B
+       //OnContextPopup\82Å\82à\82µ\82àActive\82ÈTab\88È\8aO\82Å\8cÄ\82Ñ\8fo\82³\82ê\82½\82çTab\82ð\90Ø\82è\91Ö\82¦\82é\82æ\82¤\82É\82µ\82½\81B
 {              // \83}\83E\83X\89E\83{\83^\83\93
                GetCursorPos(p);
                p2 := p;
@@ -5784,6 +6192,7 @@ begin
                BrowserBottomPanel.Visible := False;
 //             BrowserTab.Visible := False;
 //             BrowserTopPanel.Height := 26;
+               AllTabCloseAction.Execute;
        end;
 end;
 
@@ -5827,10 +6236,10 @@ begin
                BrowserTab.EndDrag(false);
                FDragWFirst := false;
        end;
-
+       
        if (FTabHintIndex <> TabIdx) and (TabIdx <> -1) then begin
                Application.CancelHint;
-               ThreadItem := TThreadItem(BrowserTab.Tabs.Objects[TabIdx]);
+               ThreadItem := TBrowserRecord(BrowserTab.Tabs.Objects[TabIdx]).Thread;
                if ThreadItem.Title <> BrowserTab.Tabs[TabIdx] then begin
                        BrowserTab.Hint := ThreadItem.Title;
                        Application.ShowHint := True;
@@ -5847,15 +6256,38 @@ procedure TGikoForm.BrowserDocumentComplete(Sender: TObject;
        const pDisp: IDispatch; var URL: OleVariant);
 var
        FDispHtmlDocument: DispHTMLDocument;
+       BrowserRecord :TBrowserRecord;
+       i :Integer;
 begin
 //     AddMessageList('DocumentComplete', nil);
-       FBrowserComplete := True;
-       if FEvent <> nil then
-               FEvent.Free;
-       FDispHtmlDocument := Browser.Document as DispHTMLDocument;
-       FEvent := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
-       FEvent.OnContextMenu := OnDocumentContextMenu;
-
+       if TObject(Sender) is TWebBrowser then begin
+               if TWebBrowser(Sender) <> Browser then begin
+                       BrowserRecord := nil;
+                       for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(Sender) then begin
+                                               BrowserRecord := TBrowserRecord(BrowserTab.Tabs.Objects[i]);
+                                               break;
+                               end;
+                       end;
+                       if BrowserRecord <> nil then begin
+                               if BrowserRecord.FEvent <> nil then
+                                       BrowserRecord.FEvent.Free;
+                               FDispHtmlDocument := Idispatch(OleVariant(BrowserRecord.Browser.ControlInterface).Document) as DispHTMLDocument;
+                               BrowserRecord.FEvent := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
+                               BrowserRecord.FEvent.OnContextMenu := OnDocumentContextMenu;
+                               BrowserRecord.FEvent.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
+                       end;
+               end else begin
+               if GetActiveContent <> nil then begin
+                               FDispHtmlDocument := Idispatch(OleVariant(Browser.ControlInterface).Document) as DispHTMLDocument;
+                               if FEvent <> nil then
+                                       FEvent.Free;
+                               FEvent := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
+                               FEvent.OnContextMenu := OnDocumentContextMenu;
+                               FEvent.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
+                       end;
+               end;
+       end;
 end;
 
 procedure TGikoForm.SelectReservActionUpdate(Sender: TObject);
@@ -6222,8 +6654,8 @@ begin
                        if GikoSys.Setting.DeleteMsg then
                                if MsgBox(Handle, DEL_MSG, DEL_TITLE, MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) <> IDYES then
                                Exit;
-                       ThreadItem := TThreadItem(BrowserTab.Tabs.Objects[idx]);
-                       DeleteTab(ThreadItem);
+                       ThreadItem := TBrowserRecord(BrowserTab.Tabs.Objects[idx]).FThread;
+                       DeleteTab(TBrowserRecord(BrowserTab.Tabs.Objects[idx]));
                        ThreadItem.DeleteLogFile;
                        if ThreadItem.ParentBoard = FActiveList then
                                ListView.Refresh;
@@ -6516,19 +6948,13 @@ begin
 
                InsertBrowserTab(ThreadItem, ActiveTab);
 
-               if ThreadItem.IsLogFile then begin
-                       if GikoSys.Setting.ListOrientation = gloHorizontal then begin
-                               if GikoSys.Setting.ListWidthState = glsMin then begin
-                                       BrowserMaxAction.Execute;
-                                       if GikoForm.Visible then
-                                               Browser.SetFocus;
-                               end;
-                       end else begin
-                               if GikoSys.Setting.ListHeightState = glsMin then begin
-                                       BrowserMaxAction.Execute;
-                                       if GikoForm.Visible then
-                                               Browser.SetFocus;
-                               end;
+               if GikoSys.Setting.ListOrientation = gloHorizontal then begin
+                       if GikoSys.Setting.ListWidthState = glsMin then begin
+                               BrowserMaxAndFocusAction.Execute;
+                       end;
+               end else begin
+                       if GikoSys.Setting.ListHeightState = glsMin then begin
+                               BrowserMaxAndFocusAction.Execute;
                        end;
                end;
        end;
@@ -6617,6 +7043,8 @@ procedure TGikoForm.MoveToURL(URL: string);
 
 var
        protocol, host, path, document, port, bookmark : string;
+       URL2, protocol2, host2, path2, document2, port2, bookmark2 : string;
+       tmp1, tmp2: string;
        BBSID, BBSKey: string;
        Board: TBoard;
        ThreadItem: TThreadItem;
@@ -6725,12 +7153,21 @@ begin
                        Board := BBSs[ 0 ].FindBBSID( Copy(BBSID, 1 , Length(BBSID) - 1) );
                end;
                if Board = nil then begin
-                       GikoSys.OpenBrowser(URL, gbtUserApp);
-                       Exit;
-                       //Board := GikoSys.GetUnknownBoard( nil, boardURL );
-                       //if (FTreeType = gtt2ch) and (FActiveBBS = BBSs[ 1 ]) then
-                       //      ShowBBSTree( BBSs[ 1 ] );
+                        // \93ü\82é\82×\82«\94Â\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½\82Ì\82Å\81A\95\81\92Ê\82Ì\83u\83\89\83E\83U\82Å\8aJ\82­
+                        GikoSys.OpenBrowser(URL, gbtUserApp);
+                        Exit;
+               end else begin
+                       // \8aO\95\94\82Ì\94Â\82È\82Ì\82É2ch\82ÌURL\82É\82³\82ê\82Ä\82µ\82Ü\82Á\82½\93z\82ð\82±\82±\82Å\8am\94F\82·\82é
+                       URL2 :=  Board.URL;
+                       GikoSys.ParseURI(URL2 , protocol2, host2, path2, document2, port2, bookmark2 );
+                       tmp1 := Copy(host, AnsiPos('.', host) + 1, Length(host));
+                       tmp2 := Copy(host2, AnsiPos('.', host2) + 1, Length(host2));
+                       if (tmp1 <> tmp2) then begin
+                               GikoSys.OpenBrowser(URL, gbtUserApp);
+                               Exit;
+                       end;
                end;
+
                if not Board.IsThreadDatRead then
                        GikoSys.ReadSubjectFile(Board);
                URL := GikoSys.Get2chBrowsableThreadURL( URL );
@@ -7045,9 +7482,7 @@ begin
                Referer := Referer + ':' + Port;
        Referer := Referer + Path;
        Headers := 'Referer: ' + Referer;
-
        FPreviewBrowser.Navigate(NavURL, Flags, TargetFrameName, PostData, Headers);
-
        if ARect.Top + WindowHeight > Screen.DesktopHeight then
                ARect.Top := Screen.DesktopHeight - WindowHeight;
        if ARect.Left + WindowWidth > Screen.DesktopWidth then
@@ -7090,24 +7525,27 @@ var
        Num: Integer;
        ThreadItem: TThreadItem;
 begin
-       Doc := Browser.Document as IHtmlDocument2;
-       Range := Doc.selection.createRange as IHTMLTxtRange;
-       s := CustomStringReplace(Range.text, '\81@', ' ');//\91S\8ap\8bó\94\92\82ð\94¼\8ap\8bó\94\92\82É
-       s := GikoSys.ZenToHan(Trim(s));
-       if GikoSys.IsNumeric(s) then begin
-
-               ThreadItem := GetActiveContent;
-               if ThreadItem <> nil then begin
-                       Num := StrToInt(s);
-                       FHint.PopupType := gptThread;
-                       SetResPopupText(ThreadItem, Num, Num, False, False);
-                       if FHint.ResCount <> 0 then
-                               ShowTextPopup;
-                       Result := False;
-               end else
+       Result := False;
+       Doc := FactiveContent.FBrowser.Document as IHtmlDocument2;
+       if Assigned(Doc) then begin
+               Range := Doc.selection.createRange as IHTMLTxtRange;
+               s := CustomStringReplace(Range.text, '\81@', ' ');//\91S\8ap\8bó\94\92\82ð\94¼\8ap\8bó\94\92\82É
+               s := ZenToHan(Trim(s));
+               if GikoSys.IsNumeric(s) then begin
+
+                       ThreadItem := GetActiveContent;
+                       if ThreadItem <> nil then begin
+                               Num := StrToInt(s);
+                               FHint.PopupType := gptThread;
+                               SetResPopupText(ThreadItem, Num, Num, False, False);
+                               if FHint.ResCount <> 0 then
+                                       ShowTextPopup;
+                               Result := False;
+                       end else
+                               Result := True;
+               end else begin
                        Result := True;
-       end else begin
-               Result := True;
+               end;
        end;
 end;
 
@@ -7150,8 +7588,8 @@ begin
                 // \95\8e\9a\83R\81[\83h\82Í\83v\83\89\83O\83C\83\93\82É\94C\82¹\82é
                 for i := StNum to ToNum do begin
                     Line := i;
-                    //\82±\82±\82Å\82Q\82¿\82á\82ñ\82Ë\82é\82Ìdat\82Ì\8c`\8e®\82Å\82P\8ds\93Ç\82Ý\8d\9e\82ß\82ê\82Î¥¥¥\81B\81«\93Ç\82ß\82é\82æ\82¤\82É\82È\82Á\82½
-                    tmp := boardPlugIn.GetDat( DWORD( threadItem ), i );
+                                       //\82±\82±\82Å\82Q\82¿\82á\82ñ\82Ë\82é\82Ìdat\82Ì\8c`\8e®\82Å\82P\8ds\93Ç\82Ý\8d\9e\82ß\82ê\82Î¥¥¥\81B\81«\93Ç\82ß\82é\82æ\82¤\82É\82È\82Á\82½
+                                       tmp := boardPlugIn.GetDat( DWORD( threadItem ), i );
                     if (tmp <> '') And ( not GikoSys.FAbon.CheckAbonPopupRes(tmp) And( not GikoSys.FAbon.CheckIndividualAbonList(line))) then begin
                         Res := GikoSys.DivideStrLine(tmp);
                         if (GikoSys.Setting.ShowMail = false) or (Length(res.FMailTo) = 0) then
@@ -7350,22 +7788,7 @@ begin
                FIsIgnoreResize := oldIgnoreResize;
        end;
 end;
-procedure TGikoForm.ClearLinkBar;
-var
-       i: Integer;
-begin
-       MainCoolBar.Bands.BeginUpdate;
-       try
-        if LinkBarPopupMenu.Items.Count > 0 then
-                       LinkBarPopupMenu.Items.Clear;
-               for i := LinkToolBar.ButtonCount - 1 downto 0 do
-                       //LinkToolBar.RemoveControl(LinkToolBar.Buttons[i]);
-            LinkToolBar.Buttons[i].Free;
-    finally
-               MainCoolBar.Bands.EndUpdate;
-       end;
 
-end;
 procedure TGikoForm.FavoriteDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
 var
        Node: TTreeNode;
@@ -7444,14 +7867,32 @@ var
 begin
 
        LinkToolButton := TLinkToolButton( Sender );
-       SenderNode := TreeNodeDataFind( FavoriteTreeView.TopItem, LinkToolButton.Data );
+       SenderNode := TreeNodeDataFind( FavoriteTreeView.Items.GetFirstNode, LinkToolButton.Data );
 
        FavoriteDragDrop( SenderNode, Source );
 
 end;
 
 procedure TGikoForm.LinkToolButtonOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+var
+       favButton                       : TLinkToolButton;
+       favThreadItem   : TFavoriteThreadItem;
 begin
+
+       case Button of
+       mbMiddle:
+               begin
+                       if Sender is TLinkToolButton then begin
+                               favButton := TLinkToolButton( Sender );
+                               if TObject( favButton.Data ) is TFavoriteThreadItem then begin
+                                       favThreadItem := TFavoriteThreadItem( favButton.Data );
+                                       if favThreadItem.Item <> nil then
+                                               InsertBrowserTab( favThreadItem.Item, False );
+                               end;
+                       end;
+               end;
+       end;
+
 end;
 
 procedure TGikoForm.LinkToolButtonOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
@@ -8073,7 +8514,7 @@ var
        Dlg: TListSelectDialog;
        ThreadItem : TThreadItem;
        FilterList : TStringList;
-       idx : Integer;
+       i, idx : Integer;
 begin
        Dlg := TListSelectDialog.Create(Self);
        try
@@ -8120,9 +8561,12 @@ begin
                                end;
 
                                // \83X\83\8c\83b\83h\82Ì\8dÄ\95`\89æ
+                               for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                    TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+                               end;
                                ThreadItem := GetActiveContent;
                                if ThreadItem <> nil then
-                                       SetContent( ThreadItem );
+                                       InsertBrowserTab( ThreadItem, True );
                        end;
                end else if Length( FSelectResWord ) > 0 then begin
                        // \83{\83^\83\93\82Ì\8dX\90V
@@ -8137,7 +8581,7 @@ end;
 
 procedure TGikoForm.SelectResActionUpdate(Sender: TObject);
 begin
-       SelectResAction.Enabled := GetActiveContent <> nil;
+       SelectResAction.Enabled := (GetActiveContent <> nil) and (GetActiveContent.IsLogFile);
 end;
 
 procedure TGikoForm.FormKeyUp(Sender: TObject; var Key: Word;
@@ -8150,7 +8594,11 @@ procedure TGikoForm.AllResActionExecute(Sender: TObject);
 var
        ThreadItem : TThreadItem;
        FilterList : TStringList;
+       i: Integer;
 begin
+       if(FActiveContent <> nil) and (FActiveContent.FBrowser <> nil )
+               and (FActiveContent.FBrowser.Busy) then Exit;
+
        // \83{\83^\83\93\82Ì\8dX\90V
        AllResAction.Checked := True;
        SelectResAction.Checked := False;
@@ -8168,27 +8616,34 @@ begin
                FSelectResWord := '';
 
                // \83X\83\8c\83b\83h\82ð\8dÄ\95`\89æ
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+               end;
                ThreadItem := GetActiveContent;
                if ThreadItem <> nil then
-                       SetContent( ThreadItem );
+                       InsertBrowserTab( ThreadItem, True );
        end;
 end;
 
 procedure TGikoForm.AllResActionUpdate(Sender: TObject);
 begin
-       AllResAction.Enabled := GetActiveContent <> nil;
+       AllResAction.Enabled := (GetActiveContent <> nil) and (GetActiveContent.IsLogFile);
 end;
 
 procedure TGikoForm.ReloadClick(Sender: TObject);
 var
        ThreadItem : TThreadItem;
+       i: Integer;
 begin
        if GikoSys.FAbon.ReLoadFromNGwordFile =false then begin
                MsgBox(Handle, 'NG\83\8f\81[\83h\83t\83@\83C\83\8b\82Ì\8dÄ\93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s\82µ\82Ü\82µ\82½', '\83G\83\89\81[', MB_OK or MB_ICONEXCLAMATION);
        end else begin
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+                       
                ThreadItem := GetActiveContent;
                if ThreadItem <> nil then
-                       SetContent( ThreadItem );
+                       InsertBrowserTab( ThreadItem, True );
        end;
 
 end;
@@ -8197,6 +8652,7 @@ procedure TGikoForm.GoBackClick(Sender: TObject);
 var
        ThreadItem : TThreadItem;
        s: string;
+       i: Integer;
 begin
        if GikoSys.FAbon.GoForward =false then begin
                MsgBox(Handle, '\88ê\82Â\91O\82ÌNG\83\8f\81[\83h\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s\82µ\82Ü\82µ\82½', '\83G\83\89\81[', MB_OK or MB_ICONEXCLAMATION);
@@ -8205,9 +8661,12 @@ begin
                StatusBar.Panels.Items[2].Text := s;
                StatusBar.Panels[2].Width := Max(StatusBar.Canvas.TextWidth(s), 100);
                StatusBarResize(Sender);
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+
                ThreadItem := GetActiveContent;
                if ThreadItem <> nil then
-                       SetContent( ThreadItem );
+                       InsertBrowserTab( ThreadItem, True );
        end;
 
 end;
@@ -8216,6 +8675,7 @@ procedure TGikoForm.GoFowardClick(Sender: TObject);
 var
        ThreadItem : TThreadItem;
        s: string;
+       i: Integer;
 begin
        if GikoSys.FAbon.GoBack =false then begin
                MsgBox(Handle, '\88ê\82Â\8cã\82ë\82ÌNG\83\8f\81[\83h\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s\82µ\82Ü\82µ\82½', '\83G\83\89\81[', MB_OK or MB_ICONEXCLAMATION);
@@ -8224,9 +8684,12 @@ begin
                StatusBar.Panels.Items[2].Text := s;
                StatusBar.Panels[2].Width := Max(StatusBar.Canvas.TextWidth(s), 100);
                StatusBarResize(Sender);
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+
                ThreadItem := GetActiveContent;
                if ThreadItem <> nil then
-                       SetContent( ThreadItem );
+                       InsertBrowserTab( ThreadItem, True );
        end;
 
 end;
@@ -8288,33 +8751,43 @@ end;
 procedure TGikoForm.IndividualAbon1Click(Sender: TObject);
 var
        ThreadItem : TThreadItem;
+       i: Integer;
 begin
        GikoSys.FAbon.AddIndividualAbon(KokoPopupMenu.Tag,1);
        ThreadItem := GetActiveContent;
+       for i := BrowserTab.Tabs.Count - 1 downto 0 do
+               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
+
        if ThreadItem <> nil then
-               SetContent( ThreadItem );
+               InsertBrowserTab( ThreadItem, True );
 end;
 //\8cÂ\95Ê\82 \82Ú\81[\82ñ\81u\93§\96¾\81v
 procedure TGikoForm.IndividualAbon2Click(Sender: TObject);
 var
        ThreadItem : TThreadItem;
+       i: Integer;
 begin
        GikoSys.FAbon.AddIndividualAbon(KokoPopupMenu.Tag,0);
        ThreadItem := GetActiveContent;
+       for i := BrowserTab.Tabs.Count - 1 downto 0 do
+               TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
        if ThreadItem <> nil then
-               SetContent( ThreadItem );
+               InsertBrowserTab( ThreadItem, True );
 end;
 //\8cÂ\95Ê\82 \82Ú\81[\82ñ\89ð\8f\9c\81i\81j
 procedure TGikoForm.AntiIndividualAbonClick(Sender: TObject);
 var
        ThreadItem : TThreadItem;
        msg : String;
+       i: Integer;
 begin
        if GikoSys.FAbon.GetAbonResCount <> 0 then begin
                GikoSys.FAbon.DeleteIndividualAbon(KokoPopupMenu.Tag);
                ThreadItem := GetActiveContent;
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
                if ThreadItem <> nil then
-                       SetContent( ThreadItem );
+                       InsertBrowserTab( ThreadItem, True );
        end else begin
                msg := '\82±\82Ì\83X\83\8c\83b\83h\82Å\82Í\8cÂ\95Ê\82 \82Ú\81`\82ñ\82ð\8ds\82Á\82Ä\82Ü\82¹\82ñ';
                MsgBox(Handle, msg, '\83\81\83b\83Z\81[\83W', MB_OK);
@@ -8337,9 +8810,11 @@ begin
                        if IndividualForm.ShowModal = mrOK then begin
                                GikoSys.FAbon.DeleteIndividualAbon(IndividualForm.ResNumber);
                end;
+               for i := BrowserTab.Tabs.Count - 1 downto 0 do
+                       TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
                ThreadItem := GetActiveContent;
                if ThreadItem <> nil then
-                       SetContent( ThreadItem );
+                       InsertBrowserTab( ThreadItem, True );
                end else begin
                        msg := '\82±\82Ì\83X\83\8c\83b\83h\82Å\82Í\8cÂ\95Ê\82 \82Ú\81`\82ñ\82ð\8ds\82Á\82Ä\82Ü\82¹\82ñ';
                        MsgBox(Handle, msg, '\83\81\83b\83Z\81[\83W', MB_OK);
@@ -8384,7 +8859,7 @@ begin
                                        CurItem := TreeView.Items.GetFirstNode;
                        end;
                        while CurItem <> nil do begin
-                               if (CurItem.ImageIndex <> 2) and (GikoSys.VaguePos(s,CurItem.Text) <> 0) then begin
+                               if (CurItem.ImageIndex <> 2) and (VaguePos(s,CurItem.Text) <> 0) then begin
                                        break;
                                end;
                                CurItem := CurItem.GetNext;
@@ -8462,7 +8937,7 @@ begin
        CabinetHistoryAction.Checked := False;
 
        // \82¨\8bC\82É\93ü\82è\82Ì\83c\83\8a\81[\82ð\93W\8aJ
-       FavoriteTreeView.TopItem.Expanded := True;
+       FavoriteTreeView.Items.GetFirstNode.Expanded := True;
 
 end;
 
@@ -8520,6 +8995,12 @@ begin
                Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, ThreadItem.Title, FavoThreadItem);
                Node.ImageIndex := 16;
                Node.SelectedIndex := 16;
+       end else if Source is TBrowserRecord then begin
+               ThreadItem := TBrowserRecord( Source ).FThread;
+               FavoThreadItem                          := TFavoriteThreadItem.CreateWithItem( ThreadItem );
+               Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, ThreadItem.Title, FavoThreadItem);
+               Node.ImageIndex := 16;
+               Node.SelectedIndex := 16;
        end else if Source is TFavoriteThreadItem then begin
                FavoThreadItem := TFavoriteThreadItem( Source );
                ThreadItem := FavoThreadItem.Item;
@@ -8557,14 +9038,13 @@ begin
 
                LinkToolButton := TLinkToolButton( Source );
                //ShowMessage(LinkToolButton.Text);
-               SourceNode := TreeNodeDataFind( FavoriteTreeView.TopItem, LinkToolButton.Data );
+               SourceNode := TreeNodeDataFind( FavoriteTreeView.Items.GetFirstNode, LinkToolButton.Data );
                FavoriteMoveTo( SenderNode, SourceNode );
 
        end else if Source = BrowserTab then begin
 
                idx := BrowserTab.TabIndex;
                FavoriteAddTo( SenderNode, BrowserTab.Tabs.Objects[idx] );
-
        end else if Source = ListView then begin
 
                FavoriteAddTo( SenderNode, ListView.Selected.Data );
@@ -8622,7 +9102,10 @@ begin
                        FavoriteTreeViewDeleteActionExecute( Sender );
                end;
        VK_RETURN:
+               begin
                FavoriteClick( FavoriteTreeView.Selected );
+               FavoriteTreeView.Selected.Expanded := not FavoriteTreeView.Selected.Expanded;
+               end;
        VK_SPACE:
                FavoriteTreeViewDblClick( Sender );
        end;
@@ -8859,7 +9342,7 @@ procedure TGikoForm.FavoriteTreeViewBrowseFolderActionExecute(
 begin
 
        FavoriteBrowseFolder( FClickNode );
-       BrowserTab.OnChange(nil);
+       //BrowserTab.OnChange(nil);
 
 end;
 
@@ -9091,17 +9574,13 @@ begin
        end else if (X = FMouseDownPos.X) and (Y = FMouseDownPos.Y) then begin
                if GikoSys.Setting.ListOrientation = gloHorizontal then begin
                        if GikoSys.Setting.ListWidthState = glsMin then begin
-                               BrowserMaxAction.Execute;
-                               if GikoForm.Visible then
-                                       Browser.SetFocus;
+                               BrowserMaxAndFocusAction.Execute;
                        end;
                end else begin
                        if GikoSys.Setting.ListHeightState = glsMin then begin
-                               BrowserMaxAction.Execute;
-                               if GikoForm.Visible then
-                                       Browser.SetFocus;
+                               BrowserMaxAndFocusAction.Execute;
                        end;
-               end;
+               end;
        end;
 end;
 
@@ -9114,13 +9593,15 @@ begin
 end;
 
 procedure TGikoForm.OnlyAHundredResExecute(Sender: TObject);
-var
-       ThreadItem : TThreadItem;
 begin
+       if (FActiveContent <> nil) and (FActiveContent.FBrowser.Busy) then begin
+               AHundredResButton.Down := not AHundredResButton.Down;
+               Exit; 
+       end;
        GikoSys.OnlyAHundredRes := OnlyAHundredRes.Checked;
-       ThreadItem := GetActiveContent;
-       if ThreadItem <> nil then
-               SetContent( ThreadItem );
+       if FActiveContent <> nil then begin
+               SetContent(FActiveContent);
+       end;
 end;
 
 procedure TGikoForm.FavoriteTreeViewEndDrag(Sender, Target: TObject; X,
@@ -9166,6 +9647,7 @@ begin
 end;
 procedure TGikoForm.ExportFavoriteFileAccept(Sender: TObject);
 begin
+
        if FavoriteDM.SaveFavoriteFile( ExportFavoriteFile.Dialog.FileName ) Then begin
                ShowMessage('\83t\83@\83C\83\8b\82ð\8fo\97Í\82µ\82Ü\82µ\82½');
        end else begin
@@ -9317,10 +9799,16 @@ begin
                                Header := CustomStringReplace(Header, '</b>', '',true);
                                Header := CustomStringReplace(Header, '<b>', '',true);
                        end;
+                       if ThreadItem.IsBoardPlugInAvailable then begin
+                               Body := CustomStringReplace(Res.FBody, '<br>', #13#10,true);
+                               Body := CustomStringReplace(Body, '<br>', #13#10,true);
+                       end else begin
+                               Body := CustomStringReplace(Res.FBody, ' <br> ', #13#10,true);
+                               Body := CustomStringReplace(Body, ' <br>', #13#10,true);
+                               Body := CustomStringReplace(Body, '<br> ', #13#10,true);
+                               Body := CustomStringReplace(Body, '<br>', #13#10,true);
 
-                       //Body := CustomStringReplace(Res.FBody, '<br> ', #13#10,true);
-                       Body := CustomStringReplace(Res.FBody, '<br>', #13#10,true);
-                       Body := CustomStringReplace(Body, '<br>', #13#10,true);
+                       end;
                        Body := CustomStringReplace(Body, '</a>', '',true);
 
                        Body := GikoSys.DeleteLink(Body);
@@ -9360,7 +9848,7 @@ procedure TGikoForm.OnMinimize;
 begin
        FIsMinimize := mtMinimizing;
        if FActiveContent <> nil then
-               FActiveContent.ScrollTop := OleVariant(IHTMLDocument2(Browser.Document)).Body.ScrollTop;
+               FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
        PostMessage( Handle, USER_MINIMIZED, 0, 0 );
 end;
 
@@ -9519,12 +10007,6 @@ begin
        boardPlugIn.PlugInMenu( item.Handle );
 
 end;
-
-procedure TGikoForm.ListViewClick(Sender: TObject);
-begin
-       ListClick;
-end;
-
 // TreeView \82ª\83N\83\8a\83b\83N\82³\82ê\82½
 procedure TGikoForm.TreeClick( Node : TTreeNode );
 var
@@ -9570,6 +10052,22 @@ begin
                SetActiveList(Node.data);
        end;
 
+       if TObject( Node.Data ) is TBoard then begin // not TCategory
+               if GikoSys.Setting.ListOrientation = gloHorizontal then begin
+                       if GikoSys.Setting.ListWidthState = glsMax then begin
+                               BrowserMinAction.Execute;
+                               if GikoForm.Visible then
+                                       ListView.SetFocus;
+                       end;
+               end else begin
+                       if GikoSys.Setting.ListHeightState = glsMax then begin
+                               BrowserMinAction.Execute;
+                               if GikoForm.Visible then
+                                       ListView.SetFocus;
+                       end;
+               end;
+       end;
+
 end;
 
 // TreeView \82ª\83_\83u\83\8b\83N\83\8a\83b\83N\82³\82ê\82½
@@ -9610,17 +10108,18 @@ begin
                TreeDoubleClick( TreeView.Selected );
        end else if Key = VK_RETURN then begin
                TreeClick( TreeView.Selected );
+        TreeView.Selected.Expanded := not TreeView.Selected.Expanded;
        end;
 end;
 
-// \83u\83\89\83E\83U\82Ì\83L\81[\83_\83E\83\93\83C\83x\83\93\83g
+// \83u\83\89\83E\83U\82Ì\83L\81[\83_\83E\83\93\83C\83x\83\93\83g    //\82È\82ñ\82©\8eg\82í\82È\82­\82Ä\82à\93®\82¢\82Ä\82é\8bC\82ª\82·\82é\81@by\82à\82\82ã
 // \83C\83x\83\93\83g\82ð\8eæ\82è\88µ\82Á\82½\8fê\8d\87\82Í True \82ð\95Ô\82·
 function TGikoForm.BrowserKeydown(var Msg: TMsg; Key: Word; State:TShiftState) : Boolean;
 var
        iOIPAO          : IOleInPlaceActiveObject;
        Dispatch        : IDispatch;
 begin
-
+       Result := False;
        if Key = VK_BACK then begin
                UpBoardAction.Execute;
                Result := True;
@@ -9633,49 +10132,59 @@ begin
                Result := True;
        end else begin
                // \82»\82ê\88È\8aO\82Ì\83C\83x\83\93\83g\82Í Browser \82É\97¬\82·
-               Dispatch := Browser.Application;
-               if Dispatch <> nil then begin
-                       Dispatch.QueryInterface( IOleInPlaceActiveObject, iOIPAO );
-                       if iOIPAO <> nil then
-                               iOIPAO.TranslateAccelerator( Msg );
+               if(FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
+                       Dispatch := FActiveContent.Browser.Application;
+                       if Dispatch <> nil then begin
+                               Dispatch.QueryInterface( IOleInPlaceActiveObject, iOIPAO );
+                               if iOIPAO <> nil then
+                                       iOIPAO.TranslateAccelerator( Msg );
+                       end;
                end;
-
                // \83M\83R\83i\83r\82Å\8eg\82¤\83V\83\87\81[\83g\83J\83b\83g\82Í\8eó\82¯\8eæ\82è\82½\82¢\82Ì\82Å\83C\83x\83\93\83g\82Í\83J\83b\83g\82µ\82È\82¢
-               Result := False;
+               //Result := False;
        end;
 
 end;
 
 // \83M\83R\83i\83r\82Ì\83\81\83b\83Z\81[\83W\83\8b\81[\83v\82ð\89¡\8eæ\82è\82µ\82Ü\82·
 procedure TGikoForm.HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
-var
-       key                             : Word;
-begin
 
+//var
+//     key                             : Word;
+begin
        case Msg.message of
-       WM_KEYDOWN:
-               if IsDialogMessage( Browser.Handle, Msg ) then begin
-                       key := Msg.wParam;
-                       Handled := BrowserKeyDown( Msg, key, KeyDataToShiftState( Msg.lParam ) );
-               end;
+       {WM_KEYDOWN:
+               if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
+                       if IsDialogMessage( FActiveContent.Browser.Handle, Msg ) then begin
+                               key := Msg.wParam;
+                               Handled := BrowserKeyDown( Msg, key, KeyDataToShiftState( Msg.lParam ) );
+                       end;
+               end;}
+
        WM_XBUTTONDOWN:
                case Msg.wParam shr 16 of
-               XBUTTON1:
-                       if IsDialogMessage( Browser.Handle, Msg ) then begin
-                               UpBoardAction.Execute;
-                               Handled := True;
-                       end else if IsDialogMessage( ListView.Handle, Msg ) then begin
-                               UpFolderAction.Execute;
-                               Handled := True;
+                       XBUTTON1:
+                       begin
+                                       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
+                                               if IsDialogMessage( FActiveContent.Browser.Handle, Msg ) then begin
+                                                       UpBoardAction.Execute;
+                                                       Handled := True;
+                                               end;
+                                       end;
+                                       if not Handled then begin
+                                               if IsDialogMessage( ListView.Handle, Msg ) then begin
+                                                       UpFolderAction.Execute;
+                                                       Handled := True;
+                                               end;
+                                       end;
                        end;
-               XBUTTON2:
+                       XBUTTON2:
                end;
        end;
-
-       end;
+end;
 
 procedure TGikoForm.FavoriteTreeViewMouseDown(Sender: TObject;
-  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+       Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var
        favItem                         : TTreeNode;
        favThreadItem   : TFavoriteThreadItem;
@@ -9695,7 +10204,7 @@ begin
                        if TObject( favItem.Data ) is TFavoriteThreadItem then begin
                                favThreadItem := TFavoriteThreadItem( favItem.Data );
                                if favThreadItem.Item <> nil then
-                                       InsertBrowserTab( favThreadItem.Item );
+                                       InsertBrowserTab( favThreadItem.Item, False );
                        end;
                end;
        end;
@@ -9742,7 +10251,411 @@ begin
                 (abs( Y - FMouseDownPos.Y ) < Mouse.DragThreshold) then begin
                FavoriteClick( TObject( FavoriteTreeView.Selected ) );
        end;
-       
+
+end;
+
+destructor     TBrowserRecord.Destroy;
+var
+       doc :OleVariant;
+begin
+       if Self.FEvent <> nil then
+               Self.FEvent.Free;
+       if Self.FBrowser <> nil then begin
+               if Self.Thread <> nil then begin
+                       doc := Idispatch( olevariant(Self.FBrowser.ControlInterface).Document) as IHTMLDocument2;
+                       Self.Thread.ScrollTop := doc.Body.ScrollTop;
+               end;
+               //TOleControl(Self.FBrowser).Visible := false;
+               ShowWindow(Self.FBrowser.Handle, SW_HIDE);
+       end;
+
+end;
+
+procedure TGikoForm.OnlyAHundredResUpdate(Sender: TObject);
+begin
+       OnlyAHundredRes.Enabled := (GetActiveContent <> nil) and (GetActiveContent.IsLogFile);
+end;
+
+function TGikoForm.WebBrowserClick(Sender: TObject): WordBool;
+begin
+  result := true;
+  try
+       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then
+               FActiveContent.FBrowser.SetFocus;
+  except
+  end;
+end;
+
+procedure TGikoForm.SetFocusForBrowserActionExecute(Sender: TObject);
+begin
+       FActiveContent.FBrowser.SetFocus;
+end;
+
+procedure TGikoForm.SetFocusForBrowserActionUpdate(Sender: TObject);
+begin
+       if( FActiveContent <> nil) and (FActiveContent.Browser <> nil) and
+               (FActiveContent.Browser <> BrowserNullTab.Browser) then
+               SetFocusForBrowserAction.Enabled := true
+       else
+               SetFocusForBrowserAction.Enabled := false;
+end;
+
+procedure TGikoForm.SetFocusForThreadListActionExecute(Sender: TObject);
+var
+       rct: TRect;
+begin
+       if FActiveContent <> nil then
+               WebBrowserClick(FActiveContent.Browser); //\88ê\89ñBrowser\82É\93\96\82Ä\82È\82¢\82Æ\93®\82©\82È\82¢\82Æ\82«\82ª\82 \82é
+       ListView.SetFocus;
+       if( ListView.Items.Count > 0 ) and (ListView.ItemFocused = nil) then
+               ListView.Items.Item[0].Selected := true //\91I\91ð\83A\83C\83e\83\80\82ª\96³\82¢\82Æ\82«\82Í\90æ\93ª\82Ì\82ð\91I\91ð\82·\82é
+       else begin
+               ListView.Scroll(-ListView.ClientWidth, -ListView.ClientHeight);
+               rct := ListView.ItemFocused.DisplayRect(drBounds);
+               ListView.Scroll(0, 2 * rct.Top - rct.Bottom);
+               if ListView.ViewStyle <> vsReport then begin
+                       ListView.Scroll(rct.Left, 0);
+               end;
+       end;
+end;
+
+procedure TGikoForm.SetFocusForCabinetActionExecute(Sender: TObject);
+begin
+       if FActiveContent <> nil then
+               WebBrowserClick(FActiveContent.Browser); //\88ê\89ñBrowser\82É\93\96\82Ä\82È\82¢\82Æ\93®\82©\82È\82¢\82Æ\82«\82ª\82 \82é
+       if TreeView.Visible then begin
+               TreeView.SetFocus;
+               if(TreeView.Items.Count > 0) and ( TreeView.Selected = nil ) then
+                       TreeView.Items.Item[0].Selected := true;
+       end else if FavoriteTreeView.Visible then begin
+               FavoriteTreeView.SetFocus;
+               if(FavoriteTreeView.Items.Count > 0) and (FavoriteTreeView.Selected = nil) then
+                       FavoriteTreeView.Items.Item[0].Selected := true;
+       end;
+end;
+procedure TGikoForm.SetFocusForCabinetActionUpdate(Sender: TObject);
+begin
+       SetFocusForCabinetAction.Enabled := CabinetPanel.Visible;
+end;
+
+//\83u\83\89\83E\83U\82ð\8dÅ\91å\89»\82µ\82Ä\83t\83H\81[\83J\83X\82ð\93\96\82Ä\82é\81B
+procedure TGikoForm.BrowserMaxAndFocusActionExecute(Sender: TObject);
+begin
+       BrowserMaxAction.Execute;
+       SetFocusForBrowserAction.Execute;
+end;
+
+procedure TGikoForm.BrowserMaxAndFocusActionUpdate(Sender: TObject);
+begin
+       if( FActiveContent <> nil) and (FActiveContent.Browser <> nil) and
+               (FActiveContent.Browser <> BrowserNullTab.Browser) then
+               BrowserMaxAndFocusAction.Enabled := true
+       else
+               BrowserMaxAndFocusAction.Enabled := false;
+end;
+//\83X\83\8c\83b\83h\88ê\97\97\82ð\8dÅ\91å\89»\82µ\82Ä\83t\83H\81[\83J\83X\82ð\93\96\82Ä\82é
+procedure TGikoForm.ThreadlistMaxAndFocusActionExecute(Sender: TObject);
+begin
+       BrowserMinAction.Execute;
+       SetFocusForThreadListAction.Execute;
+end;
+
+procedure TGikoForm.ListViewExit(Sender: TObject);
+begin
+       ListView.Repaint;
+end;
+
+
+procedure TGikoForm.ListViewSelectItem(Sender: TObject; Item: TListItem;
+  Selected: Boolean);
+begin
+
+       if not (GikoSys.Setting.BrowserTabVisible) and (Item <> nil) then
+                       if (TObject( Item.Data ) is TThreadItem) then begin
+                               SelectTimer.Interval := GikoSys.Setting.SelectInterval;
+                       end else
+                               SelectTimer.Interval := 0
+       else
+               SelectTimer.Interval := 0;
+
+end;
+
+procedure TGikoForm.SelectTimerTimer(Sender: TObject);
+begin
+       if not (ListView.Selected = nil) then
+               if( FActiveContent = nil) or
+                               (GetActiveContent <> TThreadItem(ListView.Selected.Data) ) then begin
+                       SelectTimer.Interval := 0;
+                       ListClick;
+               end;
+end;
+
+procedure TGikoForm.SelectItemSaveForDatExecute(Sender: TObject);
+var
+       List: TList;
+       i: Integer;
+begin
+       List := TList.Create;
+       try
+               Screen.Cursor := crHourGlass;
+               SelectListItem(List);
+               if ((GikoSys.Setting.ListOrientation = gloVertical) and
+                       (GikoSys.Setting.ListHeightState = glsMax)) or
+                       ((GikoSys.Setting.ListOrientation = gloHorizontal) and
+                       (GikoSys.Setting.ListWidthState = glsMax)) then
+                       ShowMessage('\83X\83\8c\83b\83h\88ê\97\97\82ð\95\\8e¦\82µ\82Ä\82­\82¾\82³\82¢')
+               else if(List.Count = 0) then
+                       ShowMessage('\83X\83\8c\83b\83h\82ð\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢')
+               else begin
+                       FileSaveAs1.Dialog.Title := '\91I\91ð\83X\83\8c\83b\83h\82ðdat\82Ì\82Ü\82Ü\95Û\91¶';
+                       FileSaveAs1.Dialog.Filter := 'DAT\83t\83@\83C\83\8b(*.dat)|*.dat';
+                       for i := 0 to List.Count - 1 do begin
+                               if (TObject(List[i]) is TThreadItem) and (TThreadItem(List[i]).IsLogFile) then begin
+                                       FileSaveAs1.Dialog.FileName := TThreadItem(List[i]).FileName;
+                                       if FileSaveAs1.Execute then begin
+                                               //\82È\82º\82©\83L\83\83\83\93\83Z\83\8b\82Å\82à\82±\82Á\82¿\82É\93ü\82Á\82Ä\82­\82é
+                                               if ExtractFilePath(FileSaveAs1.Dialog.FileName) <> '' then begin
+                                                       CopyFile(PChar(TThreadItem(List[i]).FilePath),
+                                                               PChar(FileSaveAs1.Dialog.FileName), true);
+                                               end;
+                                       end;
+                               end;
+                       end;
+               end;
+       finally
+               Screen.Cursor := crDefault;
+               List.Free;
+       end;
+
+end;
+
+procedure TGikoForm.SelectItemSaveForHTMLExecute(Sender: TObject);
+var
+       List: TList;
+       i: Integer;
+       html: TStringList;
+       title: string;
+begin
+       List := TList.Create;
+       try
+               Screen.Cursor := crHourGlass;
+               SelectListItem(List);
+               if ((GikoSys.Setting.ListOrientation = gloVertical) and
+                       (GikoSys.Setting.ListHeightState = glsMax)) or
+                       ((GikoSys.Setting.ListOrientation = gloHorizontal) and
+                       (GikoSys.Setting.ListWidthState = glsMax))      then
+                       ShowMessage('\83X\83\8c\83b\83h\88ê\97\97\82ð\95\\8e¦\82µ\82Ä\82­\82¾\82³\82¢')
+               else if(List.Count = 0) then
+                       ShowMessage('\83X\83\8c\83b\83h\82ð\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢')
+               else begin
+                       FileSaveAs1.Dialog.Title := '\91I\91ð\83X\83\8c\83b\83h\82ðHTML\89»\82µ\82Ä\95Û\91¶';
+                       FileSaveAs1.Dialog.Filter := 'HTML\83t\83@\83C\83\8b(*.html)|*.html';
+                       for i := 0 to List.Count - 1 do begin
+                               if (TObject(List[i]) is TThreadItem) and (TThreadItem(List[i]).IsLogFile) then begin
+                                       FileSaveAs1.Dialog.FileName := TThreadItem(List[i]).Title + '.html';
+                                       if FileSaveAs1.Execute then begin
+                                               //\82È\82º\82©\83L\83\83\83\93\83Z\83\8b\82Å\82à\82±\82Á\82¿\82É\93ü\82Á\82Ä\82­\82é
+                                               if ExtractFilePath(FileSaveAs1.Dialog.FileName) <> '' then begin
+                                                       html := TStringList.Create;
+                                                       title := TThreadItem(List[i]).Title;
+                                                       try
+                                                               GikoSys.CreateHTML3(html, TThreadItem(List[i]), title);
+                                                               html.SaveToFile(FileSaveAs1.Dialog.FileName);
+                                                               SkinorCSSFilesCopy(ExtractFilePath(FileSaveAs1.Dialog.FileName));
+                                                       finally
+                                                               html.Free;
+                                                       end;
+                                               end;
+                                       end;
+                               end;
+                       end;
+               end;
+       finally
+               Screen.Cursor := crDefault;
+               List.Free;
+       end;
+end;
+procedure TGikoForm.SkinorCSSFilesCopy(path: string);
+var
+       tmp, tmpD, tmpF: string;
+       current: string;
+       dirs: TStringList;
+       files: TStringList;
+       i, j: Integer;
+begin
+       if GikoSys.Setting.UseSkin then begin
+               current := ExtractFilePath(GikoSys.GetSkinDir);
+               tmp := GikoSys.Setting.CSSFileName;
+       end else if GikoSys.Setting.UseCSS then begin
+               current := ExtractFilePath(GikoSys.GetStyleSheetDir);
+               tmp := ExtractFilePath(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName);
+       end;
+       dirs := TStringList.Create;
+       try
+               dirs.Add(tmp);
+               if tmp <> current then begin
+                       GikoSys.GetDirectoryList(current, '*.*', dirs, true);
+                       for i := 0 to dirs.Count - 1 do begin
+                               files := TStringList.Create;
+                               try
+                                       gikoSys.GetFileList(dirs[i], '*.*', files, true);
+                                       tmpD := CustomStringReplace(dirs[i], GikoSys.GetConfigDir, path);
+                                       if (AnsiPos(dirs[i], tmp) <> 0) and not (DirectoryExists(tmpD)) then
+                                               ForceDirectories(tmpD);
+
+                                       if(dirs[i] = tmp) and (dirs[i] <> current) then begin
+                                               for j := 0 to files.Count - 1 do begin
+                                                       tmpF := CustomStringReplace(files[j], GikoSys.GetConfigDir, path);
+                                                       if not FileExists(tmpF) then begin
+                                                               CopyFile(PChar(files[j]), PChar(tmpF),True);
+                                                       end;
+                                               end;
+                                       end;
+                               finally
+                                       files.Free;
+                               end;
+                       end;
+               end else begin
+                       tmpD := CustomStringReplace(dirs[0], GikoSys.GetConfigDir, path);
+                       if not DirectoryExists(tmpD) then
+                               ForceDirectories(tmpD);
+                       tmpF := CustomStringReplace(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName
+                                       , GikoSys.GetConfigDir, path);
+                       if not FileExists(tmpF) then begin
+                               CopyFile(PChar(GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName)
+                                       , PChar(tmpF), True);
+                       end;
+               end;
+       finally
+               dirs.Free;
+       end;
+
+
+end;
+procedure TGikoForm.KidokuActionExecute(Sender: TObject);
+var
+       List: TList;
+       i: Integer;
+begin
+       List := TList.Create;
+       try
+               SelectListItem(List);
+               for i := 0 to List.Count - 1 do begin
+                       if TObject(List[i]) is TThreadItem then begin
+                               TThreadItem(List[i]).UnRead := false;
+                               TThreadItem(List[i]).ParentBoard.UnRead := TThreadItem(List[i]).ParentBoard.UnRead - 1;
+                       end;
+               end;
+               if TreeView.Visible then
+                       TreeView.Refresh;
+       finally
+               List.Free;
+       end;
+end;
+
+procedure TGikoForm.MidokuActionExecute(Sender: TObject);
+var
+       List: TList;
+       i: Integer;
+begin
+       List := TList.Create;
+       try
+               SelectListItem(List);
+               for i := 0 to List.Count - 1 do begin
+                       if TObject(List[i]) is TThreadItem then begin
+                               TThreadItem(List[i]).UnRead := true;
+                               TThreadItem(List[i]).ParentBoard.UnRead := TThreadItem(List[i]).ParentBoard.UnRead + 1;
+                       end;
+               end;
+               if TreeView.Visible then
+                       TreeView.Refresh;
+       finally
+               List.Free;
+       end;
+end;
+
+procedure TGikoForm.BrowserPanelCanResize(Sender: TObject; var NewWidth,
+  NewHeight: Integer; var Resize: Boolean);
+var
+       i: Integer;
+begin
+       for i := 0 to BROWSER_COUNT - 1 do
+               SetWindowPos(TWebBrowser(FBrowsers[i]).Handle, HWND_NOTOPMOST, 0, 0, NewWidth, NewHeight, SWP_NOMOVE + SWP_NOZORDER);
+
+       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
+               SetWindowPos(FActiveContent.Browser.Handle, HWND_NOTOPMOST, 0, 0, NewWidth, NewHeight, SWP_NOMOVE + SWP_NOZORDER);
+       end;
+end;
+
+procedure TGikoForm.LogFolderOpenActionExecute(Sender: TObject);
+var
+       List: TList;
+begin
+       if ((GikoSys.Setting.ListOrientation = gloVertical) and
+               (GikoSys.Setting.ListHeightState = glsMax)) or
+               ((GikoSys.Setting.ListOrientation = gloHorizontal) and
+               (GikoSys.Setting.ListWidthState = glsMax))      then begin
+               if(GetActiveContent <> nil) then begin
+                       GikoSys.CreateProcess('explorer.exe', '/e,"' + ExtractFilePath(GetActiveContent.FilePath) + '"');
+               end;
+       end else if GetActiveList is TCategory then begin
+               List := TList.Create;
+               try
+                       SelectListItem(List);
+                       GikoSys.CreateProcess('explorer.exe', '/e,"' + ExtractFilePath(TBoard(List[0]).FilePath) + '"');
+               finally
+                       List.Free;
+               end;
+       end else if GetActiveList is TBoard then begin
+               GikoSys.CreateProcess('explorer.exe', '/e,"' + ExtractFilePath(TBoard(GetActiveList).FilePath) + '"');
+       end;
+
+end;
+
+procedure TGikoForm.LogFolderOpenActionUpdate(Sender: TObject);
+begin
+       if (GetActiveList is TCategory) and (ListView.SelCount > 0) then
+               LogFolderOpenAction.Enabled := True
+       else if GetActiveList is TBoard then
+               LogFolderOpenAction.Enabled := True
+       else
+               LogFolderOpenAction.Enabled := False;
+end;
+
+procedure TGikoForm.LocalRuleViewClick(Sender: TObject);
+var
+        RefURL,
+        RefeURL,
+        RuleURL,
+        RuleTxt:String;
+        FBoard: TBoard;
+        Indy: TIdHTTP;
+        FileStream: TFileStream;
+begin
+        //\83\8d\81[\83J\83\8b\83\8b\81[\83\8b\8eæ\93¾ by \92è\8aú\95Ö
+       RefURL := GikoSys.UrlToServer(FBoard.URL)
+               + GikoSys.UrlToID(FBoard.URL)
+               + '/';
+        //\8e\8e\82µ\82É\83\8d\81[\83J\83\8b\83\8b\81[\83\8b\8eæ\93¾\82à
+        RuleURL := RefURL
+                + 'head.txt';
+        //\8eæ\93¾\81`
+       RuleTxt := Indy.Get(RuleURL);
+        //FileStream.Create('head.txt', fmCreate) := Indy.Get(RuleURL, FileStream);
+        //\8e\8e\8c±\95\\8e¦\81`
+        if RuleTxt = '' then begin
+                ShowMessage('\83\8d\81[\83J\83\8b\83\8b\81[\83\8b\8eæ\93¾\8e¸\94s');
+        end;
+        ShowMessage(RuleTxt);
+
+end;
+
+procedure TGikoForm.TabSaveClick(Sender: TObject);
+var
+        SaveStringList: TStringList;
+        TabIdx: Integer;
+begin
+        SaveStringList := TStringList.Create;
 end;
 
 initialization