OSDN Git Service

ポップアップメニューのカスタマイズ画面を追加
[gikonavigoeson/gikonavi.git] / Giko.pas
index a11f11a..b2107ac 100644 (file)
--- a/Giko.pas
+++ b/Giko.pas
@@ -16,15 +16,15 @@ uses
        ToolWin, Buttons, IdComponent, UrlMon, Tabs, IdGlobal, StrUtils,
        CommCtrl, Dialogs, GikoSystem, Setting, BoardGroup, ThreadControl, ItemDownload,
        Editor, RoundData, GikoPanel, Favorite, HTMLDocumentEvent,
        ToolWin, Buttons, IdComponent, UrlMon, Tabs, IdGlobal, StrUtils,
        CommCtrl, Dialogs, GikoSystem, Setting, BoardGroup, ThreadControl, ItemDownload,
        Editor, RoundData, GikoPanel, Favorite, HTMLDocumentEvent,
-       HintWindow, GikoCoolBar, GikoListView, Search, ExternalBoardManager,
+       {HintWindow,} GikoCoolBar, GikoListView, Search, ExternalBoardManager,
        ExternalBoardPlugInMain, StdActns, Variants, ExtActns,IdTCPConnection,
        IdBaseComponent, IdTCPClient, AppEvnts, BrowserRecord, MoveHistoryItem,
        ExternalBoardPlugInMain, StdActns, Variants, ExtActns,IdTCPConnection,
        IdBaseComponent, IdTCPClient, AppEvnts, BrowserRecord, MoveHistoryItem,
-    ShellAPI,Preview, HistoryList;
+    ShellAPI,Preview, HistoryList, ResPopupBrowser, ExtPreviewDatamodule;
 
 const
        NGWORDNAME_PANEL = 3;
        THREADSIZE_PANEL = 2;
 
 const
        NGWORDNAME_PANEL = 3;
        THREADSIZE_PANEL = 2;
-       
+    USER_POPUPCLEAR            = WM_USER + 2005;       ///< wParam : TWebBrowser
 type
 
        TToolBarSettingSenderType = (tssNone, tssMain, tssList, tssBrowser);
 type
 
        TToolBarSettingSenderType = (tssNone, tssMain, tssList, tssBrowser);
@@ -192,10 +192,6 @@ type
                ListToolBar: TToolBar;
                BrowserCoolBar: TGikoCoolBar;
                BrowserToolBar: TToolBar;
                ListToolBar: TToolBar;
                BrowserCoolBar: TGikoCoolBar;
                BrowserToolBar: TToolBar;
-               ToolButton3: TToolButton;
-               ToolButton9: TToolButton;
-               ToolButton11: TToolButton;
-               ToolButton5: TToolButton;
                ListNameToolBar: TToolBar;
                ListNameLabel: TLabel;
                FolderImage: TImage;
                ListNameToolBar: TToolBar;
                ListNameLabel: TLabel;
                FolderImage: TImage;
@@ -310,7 +306,6 @@ type
                F4: TMenuItem;
                N48: TMenuItem;
                T14: TMenuItem;
                F4: TMenuItem;
                N48: TMenuItem;
                T14: TMenuItem;
-               ToolButton16: TToolButton;
                N50: TMenuItem;
                A11: TMenuItem;
                S5: TMenuItem;
                N50: TMenuItem;
                A11: TMenuItem;
                S5: TMenuItem;
@@ -346,7 +341,6 @@ type
                FavoriteTreeLogDeletePopupMenu: TMenuItem;
                N59: TMenuItem;
                FavoriteTreeNameURLCopyPopupMenu: TMenuItem;
                FavoriteTreeLogDeletePopupMenu: TMenuItem;
                N59: TMenuItem;
                FavoriteTreeNameURLCopyPopupMenu: TMenuItem;
-               ToolButton20: TToolButton;
                N60: TMenuItem;
                ExportFavoriteFileAction1: TMenuItem;
                N6: TMenuItem;
                N60: TMenuItem;
                ExportFavoriteFileAction1: TMenuItem;
                N6: TMenuItem;
@@ -399,7 +393,6 @@ type
     N73: TMenuItem;
     SelectComboBoxPanel: TPanel;
     SelectComboBoxSplitter: TImage;
     N73: TMenuItem;
     SelectComboBoxPanel: TPanel;
     SelectComboBoxSplitter: TImage;
-       ToolButton1: TToolButton;
     N74: TMenuItem;
     WikiFAQ: TMenuItem;
     GikoApplicationEvents: TApplicationEvents;
     N74: TMenuItem;
     WikiFAQ: TMenuItem;
     GikoApplicationEvents: TApplicationEvents;
@@ -417,8 +410,25 @@ type
     HTML1: TMenuItem;
     DAT4: TMenuItem;
     N80: TMenuItem;
     HTML1: TMenuItem;
     DAT4: TMenuItem;
     N80: TMenuItem;
+    SameBoardThreadItem: TMenuItem;
+    N81: TMenuItem;
+    N82: TMenuItem;
+    IDNG1: TMenuItem;
+    IDNG2: TMenuItem;
+    ResPopupClearTimer: TTimer;
+    TaskTrayPopupMenu: TPopupMenu;
+    Exit1: TMenuItem;
+    N83: TMenuItem;
+    UpdateGikonaviAction1: TMenuItem;
+    N84: TMenuItem;
+    N85: TMenuItem;
+    URL2: TMenuItem;
+    URLPATHINFO1: TMenuItem;
+    URLQUERYSTRING1: TMenuItem;
+    N86: TMenuItem;
                                procedure FormCreate(Sender: TObject);
                procedure FormDestroy(Sender: TObject);
                                procedure FormCreate(Sender: TObject);
                procedure FormDestroy(Sender: TObject);
+        procedure SaveSettingAll();
                procedure BrowserStatusTextChange(Sender: TObject;
                        const Text: WideString);
                procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
                procedure BrowserStatusTextChange(Sender: TObject;
                        const Text: WideString);
                procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
@@ -553,12 +563,12 @@ type
     procedure GetResURLMenuClick(Sender: TObject);
     procedure MainCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
       var Handled: Boolean);
     procedure GetResURLMenuClick(Sender: TObject);
     procedure MainCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
       var Handled: Boolean);
+    procedure ResPopupClearTimerTimer(Sender: TObject);
        private
                { Private \90é\8c¾ }
                FEnabledCloseButton: Boolean;
                FClickNode: TTreeNode;
                FHttpState: Boolean;
        private
                { Private \90é\8c¾ }
                FEnabledCloseButton: Boolean;
                FClickNode: TTreeNode;
                FHttpState: Boolean;
-               FHint: TResPopup;
                FPreviewBrowser: TPreviewBrowser;
                FPreviewURL: string;
                FBrowserSizeHeight: Integer;
                FPreviewBrowser: TPreviewBrowser;
                FPreviewURL: string;
                FBrowserSizeHeight: Integer;
@@ -602,7 +612,10 @@ type
                FOrigenCaption: String;                         //\82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83A\83C\83e\83\80\95Ò\8fW\8e\9e\82Ì\95Ò\8fW\91O\82Ì\95\8e\9a\97ñ
                FPreviewBrowserRect: TRect;                     ///< \83v\83\8c\83r\83\85\81[\82Ì\95\\8e¦\88Ê\92u\82ð\8bL\89¯\82·\82é
                FActionListGroupIndexes: array of Integer;      ///<GikoDM\8fã\82Ì\83A\83N\83V\83\87\83\93\83\8a\83X\83g\82Ì\8ae\83A\83N\83V\83\87\83\93\82É\90Ý\92è\82³\82ê\82½GroupIndex\82ð\95Û\91\82·\82é\94z\97ñ
                FOrigenCaption: String;                         //\82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83A\83C\83e\83\80\95Ò\8fW\8e\9e\82Ì\95Ò\8fW\91O\82Ì\95\8e\9a\97ñ
                FPreviewBrowserRect: TRect;                     ///< \83v\83\8c\83r\83\85\81[\82Ì\95\\8e¦\88Ê\92u\82ð\8bL\89¯\82·\82é
                FActionListGroupIndexes: array of Integer;      ///<GikoDM\8fã\82Ì\83A\83N\83V\83\87\83\93\83\8a\83X\83g\82Ì\8ae\83A\83N\83V\83\87\83\93\82É\90Ý\92è\82³\82ê\82½GroupIndex\82ð\95Û\91\82·\82é\94z\97ñ
-
+        FResPopupBrowser: TResPopupBrowser;
+        FUpdateExePath: string;    ///\83M\83R\83i\83r\8dX\90V\83C\83\93\83X\83g\81[\83\89\83p\83X
+        FUpdateExeArgs: string;    ///\83M\83R\83i\83r\8dX\90V\83C\83\93\83X\83g\81[\83\89\88ø\90\94
+        FKokoPopupThreadItem: TThreadItem;
                procedure DownloadEnd(Sender: TObject; Item: TDownloadItem);
                procedure DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
                procedure WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer; const AWorkTitle: string);
                procedure DownloadEnd(Sender: TObject; Item: TDownloadItem);
                procedure DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
                procedure WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer; const AWorkTitle: string);
@@ -618,7 +631,6 @@ type
                procedure FavoriteClick(Sender: TObject); overload;
                procedure FavoriteDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
                function OnDocumentContextMenu(Sender: TObject): WordBool;
                procedure FavoriteClick(Sender: TObject); overload;
                procedure FavoriteDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
                function OnDocumentContextMenu(Sender: TObject): WordBool;
-               procedure ShowTextPopup;
                function GetWidthAllToolButton(ToolBar: TToolBar): Integer;
                procedure MenuBarChevronMenu;
                procedure LinkBarChevronMenu;
                function GetWidthAllToolButton(ToolBar: TToolBar): Integer;
                procedure MenuBarChevronMenu;
                procedure LinkBarChevronMenu;
@@ -678,20 +690,37 @@ type
         procedure UnStoredTaskTray;
         //! \83\8c\83X\83G\83f\83B\83^\82Ì\95\\8e¦\94ñ\95\\8e¦
         procedure ShowEditors(nCmdShow: Integer);
         procedure UnStoredTaskTray;
         //! \83\8c\83X\83G\83f\83B\83^\82Ì\95\\8e¦\94ñ\95\\8e¦
         procedure ShowEditors(nCmdShow: Integer);
+        //! \82à\82Á\82Æ\82à\8cÃ\82¢Browser\82Ì\8aJ\95ú
+        procedure ReleaseOldestBrowser;
+        //! \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83\81\83j\83\85\81[\83A\83C\83e\83\80\82É\92Ç\89Á
+        procedure AddMenuSameBoardThread(MenuItem: TMenuItem);
+        //!  \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\83N\83\8a\83b\83N\83C\83x\83\93\83g
+        procedure SameBoardThreadSubItemOnClick(Sender: TObject);
+        //! \83|\83b\83v\83A\83b\83v\83u\83\89\83E\83U\8dì\90¬
+        procedure CreateResPopupBrowser;
+        //! \83t\83@\83C\83\8b\83`\83F\83b\83N
+        function isValidFile(FileName: String) : boolean;
+        //! ListView\82ÌD&D\8eó\82¯\8eæ\82è
+        procedure AcceptDropFiles(var Msg: TMsg);
+        //! \83X\83\8c\83b\83h\88ê\97\97\8dX\90V\8f\88\97\9d
+        procedure UpdateListView();
+        //! \83A\83C\83R\83\93\93Ç\82Ý\8d\9e\82Ý
+        procedure LoadIcon();
+        //! \83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\93Ç\82Ý\8d\9e\82Ý
+        procedure LoadPopupMenu();
        protected
                procedure CreateParams(var Params: TCreateParams); override;
                procedure WndProc(var Message: TMessage); override;
                procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
                procedure WMSettingChange(var Message: TWMWinIniChange); message WM_SETTINGCHANGE;
                procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
        protected
                procedure CreateParams(var Params: TCreateParams); override;
                procedure WndProc(var Message: TMessage); override;
                procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
                procedure WMSettingChange(var Message: TWMWinIniChange); message WM_SETTINGCHANGE;
                procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
-
        public
                { Public \90é\8c¾ }
                LastRoundTime: TDateTime;
                BrowserNullTab: TBrowserRecord;
                FControlThread: TThreadControl;
         FIconData : TNotifyIconData;
        public
                { Public \90é\8c¾ }
                LastRoundTime: TDateTime;
                BrowserNullTab: TBrowserRecord;
                FControlThread: TThreadControl;
         FIconData : TNotifyIconData;
-               procedure MoveToURL(const inURL: string);
+               procedure MoveToURL(const inURL: string; KeyMask: Boolean = False);
                function InsertBrowserTab(ThreadItem: TThreadItem; ActiveTab: Boolean = True) : TBrowserRecord;
                procedure ReloadBBS;
                function GetHttpState: Boolean;
                function InsertBrowserTab(ThreadItem: TThreadItem; ActiveTab: Boolean = True) : TBrowserRecord;
                procedure ReloadBBS;
                function GetHttpState: Boolean;
@@ -716,8 +745,11 @@ type
                property ScreenCursor : TCursor read GetScreenCursor write SetScreenCursor;
                property ActiveBBS : TBBS read FActiveBBS write FActiveBBS;
                property WorkCount: Integer read FWorkCount write FWorkCount;
                property ScreenCursor : TCursor read GetScreenCursor write SetScreenCursor;
                property ActiveBBS : TBBS read FActiveBBS write FActiveBBS;
                property WorkCount: Integer read FWorkCount write FWorkCount;
+        property UpdateExePath: string read FUpdateExePath write FUpdateExePath;
+        property UpdateExeArgs: string read FUpdateExeArgs write FUpdateExeArgs;
+        
                procedure SetContent(inThread: TBrowserRecord);
                procedure SetContent(inThread: TBrowserRecord);
-               function GetActiveContent: TThreadItem;
+               function GetActiveContent(popup :Boolean = false): TThreadItem;
                function GetActiveList: TObject;
 
                procedure SetListViewType(AViewType: TGikoViewType); overload;
                function GetActiveList: TObject;
 
                procedure SetListViewType(AViewType: TGikoViewType); overload;
@@ -735,6 +767,9 @@ type
                property ListViewBackGroundColor: TColor read FListViewBackGroundColor write SetListViewBackGroundColor;
                property UseOddResOddColor : Boolean read FUseOddResOddColor write FUseOddResOddColor;
                property OddColor : TColor read FOddColor write FOddColor;
                property ListViewBackGroundColor: TColor read FListViewBackGroundColor write SetListViewBackGroundColor;
                property UseOddResOddColor : Boolean read FUseOddResOddColor write FUseOddResOddColor;
                property OddColor : TColor read FOddColor write FOddColor;
+        //! \83\8c\83X\83\81\83j\83\85\81[\83A\83N\83e\83B\83u\83X\83\8c\83b\83h\83A\83C\83e\83\80
+        property KokoPopupThreadItem : TThreadItem read FKokoPopupThreadItem;
+
                function FindToolBarButton( bar : TToolBar; action : TAction ) : TToolButton;
                procedure OnPlugInMenuItem( Sender : TObject );
                procedure TabFileURLReplace(oldURLs: TStringList; newURLs: TStringList);
                function FindToolBarButton( bar : TToolBar; action : TAction ) : TToolButton;
                procedure OnPlugInMenuItem( Sender : TObject );
                procedure TabFileURLReplace(oldURLs: TStringList; newURLs: TStringList);
@@ -748,6 +783,8 @@ type
                procedure IndividualAbonID(Atype : Integer);
                //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
                procedure IndividualAbon(Atag, Atype : Integer);
                procedure IndividualAbonID(Atype : Integer);
                //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
                procedure IndividualAbon(Atag, Atype : Integer);
+        //\93¯\88êID\82ðNG\83\8f\81[\83h\82É\93o\98^
+        procedure AddIDtoNGWord(invisible : boolean);
                //\83u\83\89\83E\83U\82Ì\8dÄ\95`\89æ true:\91S\82Ä\82Ì\83^\83u false:\83A\83N\83e\83B\83u\82È\83^\83u\82Ì\82Ý
                procedure RepaintAllTabsBrowser();
                //\83\8a\83\93\83N\83o\81[\90Ý\92è
                //\83u\83\89\83E\83U\82Ì\8dÄ\95`\89æ true:\91S\82Ä\82Ì\83^\83u false:\83A\83N\83e\83B\83u\82È\83^\83u\82Ì\82Ý
                procedure RepaintAllTabsBrowser();
                //\83\8a\83\93\83N\83o\81[\90Ý\92è
@@ -766,7 +803,9 @@ type
         // \83^\83u\8dí\8f\9c\81i\8eÀ\91\95\95\94\81j
         procedure DeleteTab(index, selectIndex: Integer); overload;
                //\8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83X\83N\83\8d\81[\83\8b
         // \83^\83u\8dí\8f\9c\81i\8eÀ\91\95\95\94\81j
         procedure DeleteTab(index, selectIndex: Integer); overload;
                //\8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83X\83N\83\8d\81[\83\8b
-               procedure BrowserMovement(const AName: string);
+               procedure BrowserMovement(const AName: string); overload;
+               //\8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83X\83N\83\8d\81[\83\8b
+               procedure BrowserMovement(scroll: Integer); overload;
                //Application\82ÌMainForm\82ð\8eæ\93¾\82·\82é
                function GetMainForm(): TComponent;
                procedure SelectTreeNode(Item: TObject; CallEvent: Boolean);
                //Application\82ÌMainForm\82ð\8eæ\93¾\82·\82é
                function GetMainForm(): TComponent;
                procedure SelectTreeNode(Item: TObject; CallEvent: Boolean);
@@ -801,6 +840,8 @@ type
         procedure TaskTrayIconMessage(var Msg : TMsg); message WM_USER + 2010;
         //! \83^\83X\83N\83g\83\8c\83C\82É\83A\83C\83R\83\93\93o\98^\81\95\83t\83H\81[\83\80\89B\82µ
         procedure StoredTaskTray;
         procedure TaskTrayIconMessage(var Msg : TMsg); message WM_USER + 2010;
         //! \83^\83X\83N\83g\83\8c\83C\82É\83A\83C\83R\83\93\93o\98^\81\95\83t\83H\81[\83\80\89B\82µ
         procedure StoredTaskTray;
+        //! \93¯ID\83\8c\83X\83A\83\93\83J\81[\95\\8e¦
+        procedure ShowSameIDAncher(const AID: String);
        published
                property EnabledCloseButton: Boolean read FEnabledCloseButton write SetEnabledCloseButton;
        end;
        published
                property EnabledCloseButton: Boolean read FEnabledCloseButton write SetEnabledCloseButton;
        end;
@@ -839,7 +880,7 @@ uses
        About, Option, Round, Splash, Sort, ListSelect, Imm,
        NewBoard, MojuUtils, Clipbrd, GikoBayesian,Y_TextConverter,
        HTMLCreate, ListViewUtils, GikoDataModule, GikoMessage,
        About, Option, Round, Splash, Sort, ListSelect, Imm,
        NewBoard, MojuUtils, Clipbrd, GikoBayesian,Y_TextConverter,
        HTMLCreate, ListViewUtils, GikoDataModule, GikoMessage,
-  InputAssistDataModule, Types, ReplaceDataModule;
+  InputAssistDataModule, Types, ReplaceDataModule, PopupMenuUtil;
 
 const
        BLANK_HTML: string = 'about:blank';
 
 const
        BLANK_HTML: string = 'about:blank';
@@ -889,7 +930,7 @@ begin
 {$ENDIF}
 //try
        Sort.SetSortDate(Now());
 {$ENDIF}
 //try
        Sort.SetSortDate(Now());
-       
+
        FTreeType := gttNone;
        // \8bN\93®\8e\9e\82É\95Û\91\82³\82ê\82Ä\82µ\82Ü\82¤\91Î\8dô
        FStartUp := true;
        FTreeType := gttNone;
        // \8bN\93®\8e\9e\82É\95Û\91\82³\82ê\82Ä\82µ\82Ü\82¤\91Î\8dô
        FStartUp := true;
@@ -900,15 +941,21 @@ begin
        //\82±\82ê\88È\8cãSet\81`\82Å\8dÄ\90Ý\92è\82·\82é\82Ü\82Å\81AAction\82ÌChecked\82ð\82¢\82\82é\82Æ\82«\82Í\92\8d\88Ó\81I
        GetGroupIndex(GikoDM.GikoFormActionList);
        FSearchDialog := nil;
        //\82±\82ê\88È\8cãSet\81`\82Å\8dÄ\90Ý\92è\82·\82é\82Ü\82Å\81AAction\82ÌChecked\82ð\82¢\82\82é\82Æ\82«\82Í\92\8d\88Ó\81I
        GetGroupIndex(GikoDM.GikoFormActionList);
        FSearchDialog := nil;
+    FResPopupBrowser := nil;
        CreateBrowsers(BROWSER_COUNT);
     FIconData.uID := 0;
        CreateBrowsers(BROWSER_COUNT);
     FIconData.uID := 0;
-    
+    FUpdateExePath := '';
+    FUpdateExeArgs := '';
+
        //\83\81\83j\83\85\81[\83t\83H\83\93\83g
        SetMenuFont;
 
        //\8eè\82Ì\83J\81[\83\\83\8b
        Screen.Cursors[5] := LoadCursor(HInstance, 'GIKOHAND');
 
        //\83\81\83j\83\85\81[\83t\83H\83\93\83g
        SetMenuFont;
 
        //\8eè\82Ì\83J\81[\83\\83\8b
        Screen.Cursors[5] := LoadCursor(HInstance, 'GIKOHAND');
 
+    // \83A\83C\83R\83\93\82Ì\93Ç\82Ý\8eæ\82è
+    LoadIcon;
+
        //\83A\83h\83\8c\83X\97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
        AddressHistoryDM.ReadHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
 
        //\83A\83h\83\8c\83X\97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
        AddressHistoryDM.ReadHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
 
@@ -988,7 +1035,11 @@ begin
                case FResRangeMenuSelect of
                Ord( grrKoko ): GikoDM.OnlyKokoResAction.Checked        := True;
                Ord( grrNew ):  GikoDM.OnlyNewResAction.Checked := True;
                case FResRangeMenuSelect of
                Ord( grrKoko ): GikoDM.OnlyKokoResAction.Checked        := True;
                Ord( grrNew ):  GikoDM.OnlyNewResAction.Checked := True;
-               100:                    GikoDM.OnlyAHundredResAction.Checked            := True;
+               10..65535:
+            begin
+                GikoDM.OnlyAHundredResAction.Checked           := True;
+                GikoSys.ResRange := GikoSys.Setting.ResRangeExCount;
+            end;
                end;
        end;
 
                end;
        end;
 
@@ -1030,6 +1081,7 @@ begin
                BrowserTab.Font.Style := [fsBold];
        if GikoSys.Setting.BrowserTabFontItalic then
                BrowserTab.Font.Style := GikoForm.BrowserTab.Font.Style + [fsItalic];
                BrowserTab.Font.Style := [fsBold];
        if GikoSys.Setting.BrowserTabFontItalic then
                BrowserTab.Font.Style := GikoForm.BrowserTab.Font.Style + [fsItalic];
+
        BrowserTab.DoubleBuffered := True;
        FDragWFirst := false;
        SetContent(BrowserNullTab);                                                                                                     //\83u\83\89\83E\83U\82ð\8bó\94\92\95\\8e¦
        BrowserTab.DoubleBuffered := True;
        FDragWFirst := false;
        SetContent(BrowserNullTab);                                                                                                     //\83u\83\89\83E\83U\82ð\8bó\94\92\95\\8e¦
@@ -1234,9 +1286,6 @@ begin
        //\8dÅ\8fI\8f\84\89ñ\8e\9e\8aÔ
 //     FLastRoundTime := 0;
 
        //\8dÅ\8fI\8f\84\89ñ\8e\9e\8aÔ
 //     FLastRoundTime := 0;
 
-       //ResHint
-       FHint := TResPopup.Create(Self);
-
        ListView.OnData := TListViewUtils.ListViewData;
 
        // \8dÅ\8cã\82É\91I\91ð\82³\82ê\82½\83L\83\83\83r\83l\83b\83g\82Ì\95\9c\8c³
        ListView.OnData := TListViewUtils.ListViewData;
 
        // \8dÅ\8cã\82É\91I\91ð\82³\82ê\82½\83L\83\83\83r\83l\83b\83g\82Ì\95\9c\8c³
@@ -1267,25 +1316,18 @@ begin
        GikoDM.RepaintStatusBar;
        StatusBarResize(Sender);
 
        GikoDM.RepaintStatusBar;
        StatusBarResize(Sender);
 
-       dummy1.Caption  := ItemReservPMenu.Caption;
-       dummy1.Hint     := ItemReservPMenu.Hint;
+//     dummy1.Caption  := ItemReservPMenu.Caption;
+//     dummy1.Hint     := ItemReservPMenu.Hint;
+    // \83u\83\89\83E\83U\83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\82Ì\8f\89\8aú\89»
+    PopupMenuUtil.ReadSetting(GikoDM.GikoFormActionList, BrowserTabPopupMenu);
+    // \83}\83E\83X\83W\83F\83X\83`\83\83\81[
+    MouseGesture := TMouseGesture.Create;
 
 {$IFDEF SPAM_FILTER_ENABLED}
        // \83X\83p\83\80\83t\83B\83\8b\83^\8aw\8fK\97\9a\97ð
        GikoSys.Bayesian.LoadFromFile( GikoSys.Setting.GetSpamFilterFileName );
 {$ENDIF}
 
 
 {$IFDEF SPAM_FILTER_ENABLED}
        // \83X\83p\83\80\83t\83B\83\8b\83^\8aw\8fK\97\9a\97ð
        GikoSys.Bayesian.LoadFromFile( GikoSys.Setting.GetSpamFilterFileName );
 {$ENDIF}
 
-       // \83}\83E\83X\83W\83F\83X\83`\83\83\81[
-       MouseGesture := TMouseGesture.Create;
-       GikoSys.Setting.Gestures.LoadGesture(
-               GikoSys.Setting.GetGestureFileName, GikoDM.GikoFormActionList );
-       MouseGesture.Margin := GikoSys.Setting.Gestures.Margin;
-       MouseGesture.OnGestureStart := OnGestureStart;
-       MouseGesture.OnGestureMove := OnGestureMove;
-       MouseGesture.OnGestureEnd := OnGestureEnd;
-       if GikoSys.Setting.GestureEnabled then
-               MouseGesture.SetHook( Handle );
-
        //2ch\8c¾\8cê\93Ç\82Ý\8fo\82µ
        GikoSys.SetGikoMessage;
 
        //2ch\8c¾\8cê\93Ç\82Ý\8fo\82µ
        GikoSys.SetGikoMessage;
 
@@ -1304,6 +1346,26 @@ begin
 
     //\92u\8a·\90Ý\92è\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý
     ReplaceDM.LoadFromFile(GikoSys.GetReplaceFileName);
 
     //\92u\8a·\90Ý\92è\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý
     ReplaceDM.LoadFromFile(GikoSys.GetReplaceFileName);
+
+    //\83\8c\83X\83|\83b\83v\83A\83b\83v\8fÁ\8b\8e\83^\83C\83}\81[
+    ResPopupClearTimer.Interval := GikoSys.Setting.RespopupWait;
+
+    // D&D\82ð\8eó\82¯\8eæ\82é
+    DragAcceptFiles(ListView.Handle, True);
+
+
+    // \8f\89\8aú\89»\82É\8e¸\94s\82µ\82½\83\82\83W\83\85\81[\83\8b\83`\83F\83b\83N
+    if (FavoriteDM.AbEnd) then begin
+        GikoUtil.MsgBox(Self.Handle,
+            '\82¨\8bC\82É\93ü\82è\82Ì\8f\89\8aú\89»\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\83M\83R\83i\83r\82ð\8fI\97¹\82µ\82Ü\82·\81B'#13#10 +
+            '\83M\83R\83i\83r\83t\83H\83\8b\83_\82ð\8aJ\82«\82Ü\82·\81Aconfig/' + Favorite.FAVORITE_FILE_NAME +
+            ' \82ð config/~' + Favorite.FAVORITE_FILE_NAME + '(\91O\89ñ\8bN\93®\8e\9e\82Ì\82¨\8bC\82É\93ü\82è)\82Å'#13#10 +
+             '\92u\82«\8a·\82¦\82é\8e\96\82Å\92¼\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B',
+            '\8f\89\8aú\89»\88Ù\8fí');
+        GikoDM.GikoFolderOpenAction.Execute;
+        Self.Close;
+    end;
+
 end;
 
 // CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82É\95Û\91
 end;
 
 // CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82É\95Û\91
@@ -1423,10 +1485,12 @@ begin
 end;
 //
 procedure TGikoForm.FormShow(Sender: TObject);
 end;
 //
 procedure TGikoForm.FormShow(Sender: TObject);
+var
+       item        : TThreadItem;
 begin
        if FStartUp then begin
 begin
        if FStartUp then begin
+       FStartUp := false;
                ShowWindow(Application.Handle, SW_HIDE);
                ShowWindow(Application.Handle, SW_HIDE);
-
                //FormCreate\82Å\82â\82é\82Æ\89Â\8e\8b\90Ý\92è\82ª\94½\89f\82³\82ê\82È\82¢\8fê\8d\87\82ª\82 \82é\82Ì\82ÅFormShow\82Å\82â\82é\82±\82Æ\82É\82µ\82½
                //\83c\81[\83\8b\83o\81[\95\\8e¦
                GikoDM.StdToolBarVisibleAction.Checked := GikoSys.Setting.StdToolBarVisible;
                //FormCreate\82Å\82â\82é\82Æ\89Â\8e\8b\90Ý\92è\82ª\94½\89f\82³\82ê\82È\82¢\8fê\8d\87\82ª\82 \82é\82Ì\82ÅFormShow\82Å\82â\82é\82±\82Æ\82É\82µ\82½
                //\83c\81[\83\8b\83o\81[\95\\8e¦
                GikoDM.StdToolBarVisibleAction.Checked := GikoSys.Setting.StdToolBarVisible;
@@ -1451,17 +1515,30 @@ begin
 //             ResetBandInfo( ListCoolBar, ListToolBar );
                FIsIgnoreResize := rtNone;
 
 //             ResetBandInfo( ListCoolBar, ListToolBar );
                FIsIgnoreResize := rtNone;
 
+        //ActionList\82ÌGroupIndex\82ð\8c³\82É\96ß\82·
+               SetGroupIndex(GikoDM.GikoFormActionList);
+
                //FormCrete\82©\82ç\88Ú\93®\81B
                if GikoSys.Setting.TabAutoLoadSave then begin
             GikoDM.TabsOpenAction.Tag := 1;
                        GikoDM.TabsOpenAction.Execute;
             GikoDM.TabsOpenAction.Tag := 0;
                //FormCrete\82©\82ç\88Ú\93®\81B
                if GikoSys.Setting.TabAutoLoadSave then begin
             GikoDM.TabsOpenAction.Tag := 1;
                        GikoDM.TabsOpenAction.Execute;
             GikoDM.TabsOpenAction.Tag := 0;
+            if (GikoSys.Setting.LastCloseTabURL <> '') then begin
+                if ( FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
+                       while (FActiveContent.Browser.ReadyState <> READYSTATE_COMPLETE) and
+                               (FActiveContent.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
+                        // \83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82ç\82È\82¢\82æ\82¤\82É\83X\83\8a\81[\83v\82É\95Ï\8dX
+                        Sleep(1);
+                    end;
+                       end;
+                item := BBSsFindThreadFromURL( GikoSys.Setting.LastCloseTabURL );
+                GikoSys.Setting.LastCloseTabURL := '';
+                if (item <> nil) and (item.IsLogFile) then begin
+                    OpenThreadItem(item, item.URL);
+                end;
+                //ShowWindow(Self.Handle, SW_SHOW);
+            end;
                end;
                end;
-
-        //ActionList\82ÌGroupIndex\82ð\8c³\82É\96ß\82·
-               SetGroupIndex(GikoDM.GikoFormActionList);
-
-               FStartUp := false;
        end;
 end;
 
        end;
 end;
 
@@ -1476,45 +1553,54 @@ begin
                        Exit;
        end;
 
                        Exit;
        end;
 
+    GikoSys.Setting.LastCloseTabURL := '';
        if GikoSys.Setting.TabAutoLoadSave then begin
                GikoDM.TabsSaveAction.Execute;
        if GikoSys.Setting.TabAutoLoadSave then begin
                GikoDM.TabsSaveAction.Execute;
+        if (GetActiveContent <> nil) and
+            (GetActiveContent.IsLogFile) then begin
+            GikoSys.Setting.LastCloseTabURL := GetActiveContent.URL;
+        end;
        end;
 
        if (SearchDialog <> nil) then begin
                if (SearchDialog.Visible) then begin
                        SearchDialog.Close;
        end;
 
        if (SearchDialog <> nil) then begin
                if (SearchDialog.Visible) then begin
                        SearchDialog.Close;
-                       try
-                               SearchDialog.Release;
-                       except
-                       end;
-                       SearchDialog := nil;
                end;
                end;
+        try
+            SearchDialog.Release;
+        except
+        end;
+        SearchDialog := nil;
        end;
 
        //\83X\83N\83\8a\81[\83\93\8fã\82Ì\91S\82Ä\82Ì\83t\83H\81[\83\80\82©\82ç\81AEditorForm\82ð\95Â\82\82é
     GikoDM.CloseAllEditorAction.Execute;
 
        Application.UnhookMainWindow(Hook);
        end;
 
        //\83X\83N\83\8a\81[\83\93\8fã\82Ì\91S\82Ä\82Ì\83t\83H\81[\83\80\82©\82ç\81AEditorForm\82ð\95Â\82\82é
     GikoDM.CloseAllEditorAction.Execute;
 
        Application.UnhookMainWindow(Hook);
+    //\83A\83v\83\8a\83P\81[\83V\83\87\83\93\8fI\97¹\82Ì\91O\82É\83_\83E\83\93\83\8d\81[\83h\83X\83\8c\83b\83h\82É\90³\8fí\8fI\97¹\82ð\91£\82·
+    FControlThread.DownloadAbort;
+    FControlThread.Terminate;
+
+    //OnDestory\82¾\82Æ\8dÄ\8bN\93®\82ð\82©\82¯\82½\82Æ\82«\82È\82Ç\82É\95Û\91\82³\82ê\82È\82¢\82Ì\82ÅOnCloseQuery\82Å\90Ý\92è\95Û\91
+    SaveSettingAll();
+    
        Application.Terminate;
 end;
 
        Application.Terminate;
 end;
 
-procedure TGikoForm.FormDestroy(Sender: TObject);
+procedure TGikoForm.SaveSettingAll();
 var
 var
-       i                               : Integer;
-//     CoolSet: TCoolSet;
        wp                      : TWindowPlacement;
        wp                      : TWindowPlacement;
-       tmpBool : Boolean;
+    WindowPlacement: TWindowPlacement;
 begin
 begin
-       // \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8aJ\95ú
-       try
-               MouseGesture.UnHook;
-       except
-       end;
        try
                ActiveListColumnSave;
        except
        end;
        try
                ActiveListColumnSave;
        except
        end;
+
        try
        try
+        WindowPlacement.length := SizeOf(TWindowPlacement);
+        GetWindowPlacement(Self.Handle, @WindowPlacement);
+
                //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95Û\91
                wp.length := sizeof(wp);
                GetWindowPlacement(Handle, @wp);
                //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95Û\91
                wp.length := sizeof(wp);
                GetWindowPlacement(Handle, @wp);
@@ -1522,8 +1608,8 @@ begin
                GikoSys.Setting.WindowLeft := wp.rcNormalPosition.Left;
                GikoSys.Setting.WindowHeight := wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top;
                GikoSys.Setting.WindowWidth := wp.rcNormalPosition.Right - wp.rcNormalPosition.Left;
                GikoSys.Setting.WindowLeft := wp.rcNormalPosition.Left;
                GikoSys.Setting.WindowHeight := wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top;
                GikoSys.Setting.WindowWidth := wp.rcNormalPosition.Right - wp.rcNormalPosition.Left;
-               GikoSys.Setting.WindowMax := WindowState = wsMaximized;
-
+               GikoSys.Setting.WindowMax := (WindowState = wsMaximized) or
+                                        (WindowPlacement.flags = WPF_RESTORETOMAXIMIZED);
                GikoSys.Setting.ListStyle := ListView.ViewStyle;
                GikoSys.Setting.CabinetVisible := GikoDM.CabinetVisibleAction.Checked;
                GikoSys.Setting.CabinetWidth := CabinetPanel.Width;
                GikoSys.Setting.ListStyle := ListView.ViewStyle;
                GikoSys.Setting.CabinetVisible := GikoDM.CabinetVisibleAction.Checked;
                GikoSys.Setting.CabinetWidth := CabinetPanel.Width;
@@ -1543,20 +1629,11 @@ begin
                        GikoSys.Setting.ResRange := FResRangeMenuSelect;
        except
        end;
                        GikoSys.Setting.ResRange := FResRangeMenuSelect;
        except
        end;
-       if WindowState <> wsNormal then
-               WindowState := wsNormal;
-       SaveCoolBarSettings;
-       try
-               GikoSys.Setting.WriteWindowSettingFile;
-               GikoSys.Setting.WriteNameMailSettingFile;
-       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¢
-
-               // \81ªFormDestroy\92\86\82É\88Ú\93®\82µ\82½\82Ì\82Å\81A\82±\82±\82Å\95Û\91\82µ\82È\82¢\82Æ\82¢\82¯\82È\82¢\82Æ\8ev\82¤\81B\81i\82à\82\82ã\81@2004/04/09\81j
-       // CoolBar \95Û\91
-       //if (GikoForm.WindowState <> wsMinimized) and (GikoForm.WindowState <> wsMaximized) then
+    //\8d¡\82Ìwinodw\82Ì\83X\83^\83C\83\8b\82ÅCoolBar\82Ì\88Ê\92u\81A\83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82ð\95Û\91
+    SaveCoolBarSettings;
+    GikoSys.Setting.WriteWindowSettingFile;
+    // \96¼\91O\82Æ\83\81\81[\83\8b\82Ì\95Û\91\82È\82Ì\82Å\83G\83f\83B\83^\82ª\95Â\82\82½\8cã\82È\82ç\82¢\82Â\82Å\82à\82¢\82¢
+    GikoSys.Setting.WriteNameMailSettingFile;
 
        //\93ü\97Í\83A\83V\83X\83g\8b@\8d\\82Ì\90Ý\92è\82Ì\95Û\91
        InputAssistDM.SaveToFile(GikoSys.GetInputAssistFileName);
 
        //\93ü\97Í\83A\83V\83X\83g\8b@\8d\\82Ì\90Ý\92è\82Ì\95Û\91
        InputAssistDM.SaveToFile(GikoSys.GetInputAssistFileName);
@@ -1564,11 +1641,75 @@ begin
        //\82¨\8bC\82É\93ü\82è\95Û\91
        try
                //FavoriteDM\82Í\8e©\93®\90\90¬\83t\83H\81[\83\80\82È\82Ì\82Å\81A\89ð\95ú\82Í\8e©\93®\93I\82É\82³\82ê\82é
        //\82¨\8bC\82É\93ü\82è\95Û\91
        try
                //FavoriteDM\82Í\8e©\93®\90\90¬\83t\83H\81[\83\80\82È\82Ì\82Å\81A\89ð\95ú\82Í\8e©\93®\93I\82É\82³\82ê\82é
-               FavoriteDM.WriteFavorite;
+        // \8f\89\8aú\89»\88Ù\8fí\8e\9e\82©\82ç\82Ì\8fI\97¹\82Å\82Í\95Û\91\82µ\82È\82¢
+        if not (FavoriteDM.AbEnd) then begin
+               FavoriteDM.WriteFavorite;
+        end;
+       except
+       end;
+
+       //\83A\83h\83\8c\83X\97\9a\97ð\95Û\91
+       try
+               //AddressHistoryDM\82Í\8e©\93®\90\90¬\83t\83H\81[\83\80\82È\82Ì\82Å\81A\89ð\95ú\82Í\8e©\93®\93I\82É\82³\82ê\82é\81B
+               AddressHistoryDM.WriteHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
+       except
+       end;
+
+       //\83q\83X\83g\83\8a\83\8a\83X\83g\95Û\91
+       try
+               FHistoryList.SaveToFile(GikoSys.GetConfigDir + 'History.xml');
+       except
+       end;
+
+       //\8f\84\89ñ\83\8a\83X\83g\95Û\91
+       try
+               RoundList.SaveRoundFile;
+       except
+       end;
+
+    // \83^\83X\83N\83g\83\8c\83C\82Ì\83A\83C\83R\83\93\8dí\8f\9c
+    if (FIconData.uID <> 0) then begin
+        Shell_NotifyIcon(NIM_DELETE, @FIconData);
+    end;
+
+end;
+
+procedure TGikoForm.FormDestroy(Sender: TObject);
+var
+       i                               : Integer;
+       tmpBool : Boolean;
+begin
+    //\88ê\8e\9e\93I\82É\92Ê\8fí\83X\83^\83C\83\8b\82É\96ß\82µ\82ÄCoolBar\82Ì\88Ê\92u\81A\83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82ð\95Û\91
+    //\81¦\92\8d\88Ó\81FOnDestroy\82Å\8eg\82¤\82±\82Æ\82µ\82©\8dl\97\82³\82ê\82Ä\82¢\82È\82¢
+    //        \91¼\82Å\82â\82é\82Æ\8dÄ\95`\89æ\82ª\94­\90\82·\82é
+       if WindowState <> wsNormal then begin
+               WindowState := wsNormal;
+        try
+               SaveCoolBarSettings;
+                   GikoSys.Setting.WriteWindowSettingFile;
+       except
+           end;
+    end;
+
+       // \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8aJ\95ú
+       try
+        if GikoSys.Setting.GestureEnabled then begin
+               MouseGesture.OnGestureStart := nil;
+                   MouseGesture.OnGestureMove := nil;
+                   MouseGesture.OnGestureEnd := nil;
+        end;
+        MouseGesture.Clear;
+               MouseGesture.UnHook;
+        MouseGesture.Free;
+       except
+       end;
+
+       //\82¨\8bC\82É\93ü\82è\94j\8aü
+       try
                FavoriteDM.Clear;
        except
        end;
                FavoriteDM.Clear;
        except
        end;
-       LockWindowUpdate(Self.Handle);
+
        try
                //\83^\83u\83N\83\8d\81[\83Y
                tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
        try
                //\83^\83u\83N\83\8d\81[\83Y
                tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
@@ -1577,8 +1718,14 @@ begin
                GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
        except
        end;
                GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
        except
        end;
+
        try
                for i := FBrowsers.Count - 1 downto 0 do begin
        try
                for i := FBrowsers.Count - 1 downto 0 do begin
+            GikoSys.ShowRefCount('browser' + IntToStr(i), TWebBrowser(FBrowsers[i]).ControlInterface);
+            GikoSys.ShowRefCount('document' + IntToStr(i), TWebBrowser(FBrowsers[i]).ControlInterface.Document);
+               end;
+
+               for i := FBrowsers.Count - 1 downto 0 do begin
                        TWebBrowser(FBrowsers[i]).Free;
                end;
                FBrowsers.Clear;
                        TWebBrowser(FBrowsers[i]).Free;
                end;
                FBrowsers.Clear;
@@ -1586,6 +1733,7 @@ begin
        finally
                FBrowsers.Free;
        end;
        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
        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
@@ -1604,18 +1752,6 @@ begin
        except
        end;
 
        except
        end;
 
-       //\83A\83h\83\8c\83X\97\9a\97ð\95Û\91
-       try
-               //AddressHistoryDM\82Í\8e©\93®\90\90¬\83t\83H\81[\83\80\82È\82Ì\82Å\81A\89ð\95ú\82Í\8e©\93®\93I\82É\82³\82ê\82é\81B
-               AddressHistoryDM.WriteHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
-       except
-       end;
-
-       //\83q\83X\83g\83\8a\83\8a\83X\83g\95Û\91
-       try
-               FHistoryList.SaveToFile(GikoSys.GetConfigDir + 'History.xml');
-       except
-       end;
        try
                try
                        FHistoryList.Clear;
        try
                try
                        FHistoryList.Clear;
@@ -1625,11 +1761,7 @@ begin
                FHistoryList.Free;
        end;
 
                FHistoryList.Free;
        end;
 
-       //\8f\84\89ñ\83\8a\83X\83g\95Û\91¶&\94j\8aü
-       try
-               RoundList.SaveRoundFile;
-       except
-       end;
+
        try
                try
                        RoundList.Clear;
        try
                try
                        RoundList.Clear;
@@ -1640,13 +1772,14 @@ begin
         end;
 
        try
         end;
 
        try
-               try
-                       FControlThread.Terminate;
-                       FControlThread.WaitFor;
-               except
-               end;
-       finally
-               FControlThread.Free;
+        try
+            //FControlThread.DownloadAbort;
+            FControlThread.Terminate;
+            FControlThread.WaitFor;
+        except
+        end;
+    finally
+        FControlThread.Free;
        end;
     // \83v\83\89\83O\83C\83\93\82É\82æ\82Á\82Ä\92Ç\89Á\82³\82ê\82½\83\81\83j\83\85\81[\82ð\8aJ\95ú\82·\82é
     for i := GikoForm.PlugInMenu.Count - 1 downto 0 do begin
        end;
     // \83v\83\89\83O\83C\83\93\82É\82æ\82Á\82Ä\92Ç\89Á\82³\82ê\82½\83\81\83j\83\85\81[\82ð\8aJ\95ú\82·\82é
     for i := GikoForm.PlugInMenu.Count - 1 downto 0 do begin
@@ -1669,6 +1802,7 @@ begin
                                BBSs[ i ].Free;
                        BBSs[ i ] := nil;
                end;
                                BBSs[ i ].Free;
                        BBSs[ i ] := nil;
                end;
+        DestorySpecialBBS(BoardGroup.SpecialBBS);
        except
        end;
 
        except
        end;
 
@@ -1676,20 +1810,27 @@ begin
                if FEvent <> nil then
                        FEvent.Free;
 
                if FEvent <> nil then
                        FEvent.Free;
 
-               //Hint\94j\8aü
-               if FHint <> nil then begin
-                       FHint.ReleaseHandle;
-                       FHint.Free;
-                       FHint := nil;
-               end;
+        try
+            if FResPopupBrowser <> nil then  begin
+                TOleControl(FResPopupBrowser).Parent := nil;
+                FResPopupBrowser.Free;
+            end;
+
+        except
+        end;
                //Preview\94j\8aü
                //Preview\94j\8aü
-               if TPreviewBrowser <> nil then begin
+               if FPreviewBrowser <> nil then begin
                        FPreviewBrowser.Free;
                        FPreviewBrowser := nil;
                end;
        except
        end;
                        FPreviewBrowser.Free;
                        FPreviewBrowser := nil;
                end;
        except
        end;
-       LockWindowUpdate(0);
+
+    // Update\82ª\82¢\82ê\82Î\8eÀ\8ds\82·\82é
+    if FileExists(FUpdateExePath) then begin
+        // \83A\83b\83v\83f\81[\83g\8eÀ\8ds
+        GikoSys.CreateProcess(FUpdateExePath, FUpdateExeArgs);
+    end;
 end;
 
 // \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
 end;
 
 // \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
@@ -1855,30 +1996,41 @@ var
        e: IHTMLElement;
        Ext: string;
        PathRec: TPathRec;
        e: IHTMLElement;
        Ext: string;
        PathRec: TPathRec;
-  Text2: string;
-begin
-       // \83M\83R\83i\83r\82Í\83\8c\83X\83A\83\93\83J\81[\82ª about:blank.. \82Å\8en\82Ü\82é\82±\82Æ\82ð\8aú\91Ò\82µ\82Ä\82¢\82é\82ª
-  // IE 7 \82Å\82Í about:blank.. \82Å\82Í\82È\82­ about:.. \82É\82È\82é\82Ì\82Å\81A\92u\8a·\82·\82é(\93\8a\82°\82â\82è)
-       if Pos('about:..', Text) = 1 then
-       Text2 := 'about:blank..' + Copy( Text, Length('about:..')+1, Length(Text) )
-  else
-       Text2 := Text;
+    Text2: string;
+    cResPopup: TResPopupBrowser;
+    senderBrowser :TWebBrowser;
+    doc: IHTMLDocument2;
+begin
+    // \83M\83R\83i\83r\82Í\83\8c\83X\83A\83\93\83J\81[\82ª about:blank.. \82Å\8en\82Ü\82é\82±\82Æ\82ð\8aú\91Ò\82µ\82Ä\82¢\82é\82ª
+    // IE 7 \82Å\82Í about:blank.. \82Å\82Í\82È\82­ about:.. \82É\82È\82é\82Ì\82Å\81A\92u\8a·\82·\82é(\93\8a\82°\82â\82è)
+    if Pos('about:..', Text) = 1 then
+        Text2 := 'about:blank..' + Copy( Text, Length('about:..')+1, Length(Text) )
+    else
+        Text2 := Text;
+
        if not( TObject(Sender) is TWebBrowser )then
                Exit;
        if not( TObject(Sender) is TWebBrowser )then
                Exit;
+
+    senderBrowser := TWebBrowser(Sender);
+    doc := senderBrowser.ControlInterface.Document as IHTMLDocument2;
+
        try
                try
        try
                try
-                       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';
+                       if ((not senderBrowser.Busy) and Assigned(doc)) then begin
+                               if LowerCase(doc.charset) <> 'shift_jis' then begin
+                                       doc.charset := 'shift_jis';
                                end;
                        end;
                except
                end;
        finally
        end;
                                end;
                        end;
                except
                end;
        finally
        end;
+
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
+
        Application.CancelHint;
        Application.CancelHint;
+
        try
                if GetActiveContent <> nil then
                        ActiveFileName := ChangeFileExt(ExtractFileName(GetActiveContent.FileName), '')
        try
                if GetActiveContent <> nil then
                        ActiveFileName := ChangeFileExt(ExtractFileName(GetActiveContent.FileName), '')
@@ -1888,35 +2040,65 @@ begin
                FActiveContent := nil;
                Exit;
        end;
                FActiveContent := nil;
                Exit;
        end;
+
     // \91O\89ñ\82Æ\93¯\82\8fê\8d\87\8fI\97¹
     if (StatusBar.Panels[1].Text = Text2) then begin
     // \91O\89ñ\82Æ\93¯\82\8fê\8d\87\8fI\97¹
     if (StatusBar.Panels[1].Text = Text2) then begin
-        {$IFDEF DEBUG}
-        Writeln('Status Text is not changed!');
-        {$ENDIF}
+        if Text2 = '' then begin
+            if FResPopupBrowser <> nil then begin
+                if not(Sender is TResPopupBrowser) then
+                    FResPopupBrowser.Clear
+                else begin
+                    TResPopupBrowser(Sender).ChildClear;
+                end;
+            end;
+        end;
         Exit;
     end;
        StatusBar.Panels[1].Text := Text2;
 
         Exit;
     end;
        StatusBar.Panels[1].Text := Text2;
 
-       if FHint <> nil then begin
-               FHint.ReleaseHandle;
-               FHint.ClearAllRes;
-       end;
+
        if FPreviewBrowser <> nil then
                ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
 
        if FPreviewBrowser <> nil then
                ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
 
-       if not GikoSys.Setting.UnActivePopup then
-               if not GikoForm.Active then
-                       Exit;
+    if FResPopupBrowser <> nil then begin
+        if not(Sender is TResPopupBrowser) then begin
+            if (FResPopupBrowser.Visible) then begin
+                if ResPopupClearTimer.Interval > 0 then begin
+                    ResPopupClearTimer.Enabled := True;
+                    ResPopupClearTimer.Tag := 0;
+                end else begin
+                    FResPopupBrowser.Clear;
+                end;
+            end;
+        end else begin
+            if ResPopupClearTimer.Interval > 0 then begin
+                ResPopupClearTimer.Enabled := True;
+                ResPopupClearTimer.Tag := 1;
+            end else begin
+                TResPopupBrowser(Sender).ChildClear;
+            end;
+        end;
+    end;
+    cResPopup := nil;
+    
+    if not(Sender is TResPopupBrowser) then
+       if not GikoSys.Setting.UnActivePopup then
+               if not GikoForm.Active then
+                       Exit;
 
 
 
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10-15
 
 
 
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10-15
-
+    // \91¼\82Ì\83A\83v\83\8a\82Å\8f\88\97\9d\82·\82éURL\82©\8am\94F
+    if (ExtPreviewDM.PreviewURL(Text2)) then begin
+        Exit;
+    end;
        s := '';
        Ext := AnsiLowerCase(ExtractFileExt(Text2));
        if (Pos('http://', Text2) = 1) and (GikoSys.Setting.PreviewVisible) and
        s := '';
        Ext := AnsiLowerCase(ExtractFileExt(Text2));
        if (Pos('http://', Text2) = 1) and (GikoSys.Setting.PreviewVisible) and
-                       ((Ext = '.jpg') or (Ext = '.jpeg') or (Ext = '.gif') or (Ext = '.png')) then begin
+                       ((Ext = '.jpg') or (Ext = '.jpeg') or (Ext = '.gif') or (Ext = '.png')) or
+        (Pos('http://www.nicovideo.jp/watch/', Text2) = 1)  then begin
                if FPreviewBrowser = nil then begin
                        FPreviewBrowser := TPreviewBrowser.Create(Self);
                        ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
                if FPreviewBrowser = nil then begin
                        FPreviewBrowser := TPreviewBrowser.Create(Self);
                        ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
@@ -1927,29 +2109,49 @@ begin
                PreviewTimer.Interval := GikoSys.Setting.PreviewWait;
                PreviewTimer.Enabled := True;
        end else if (Pos('about:blank', Text2) = 1) or (Pos('http://', Text2) = 1) or (Pos('mailto:', Text2) = 1) then begin
                PreviewTimer.Interval := GikoSys.Setting.PreviewWait;
                PreviewTimer.Enabled := True;
        end else if (Pos('about:blank', Text2) = 1) or (Pos('http://', Text2) = 1) or (Pos('mailto:', Text2) = 1) then begin
-               if Pos('mailto:', Text2) = 1 then begin
+               if (Pos('mailto:', Text2) = 1) and (GikoSys.Setting.RespopupMailTo) then begin
                        s := StringReplace(Text2, 'mailto:', '', [rfIgnoreCase]);
                        //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g3\82Ì466\8e\81\82É\8a´\8eÓ
                        GetCursorPos(p);
                        s := StringReplace(Text2, 'mailto:', '', [rfIgnoreCase]);
                        //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g3\82Ì466\8e\81\82É\8a´\8eÓ
                        GetCursorPos(p);
-                       p.x := p.x - TWebBrowser(Sender).ClientOrigin.x;
-                       p.y := p.y - TWebBrowser(Sender).ClientOrigin.y;
-                       e := IHTMLDocument2(TWebBrowser(Sender).Document).elementFromPoint(p.x, p.y);
+                       p.x := p.x - senderBrowser.ClientOrigin.x;
+                       p.y := p.y - senderBrowser.ClientOrigin.y;
+                       e := doc.elementFromPoint(p.x, p.y);
                        if (Assigned(e)) then begin
                        if (Assigned(e)) then begin
-                               tmp2 := ZenToHan(e.Get_outerText);
+                CreateResPopupBrowser;
+
+                if not(Sender is TResPopupBrowser) then begin
+                    if (FResPopupBrowser.Visible) then begin
+                        FResPopupBrowser.Clear;
+                    end;
+                end else begin
+                    TResPopupBrowser(Sender).ChildClear;
+                end;
+
+                cResPopup := FResPopupBrowser.CreateNewBrowser;
+                               tmp2 := Trim(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 := StrToInt64(tmp2);
                                        wkIntTo := StrToInt64(tmp2);
                                if (GikoSys.IsNumeric(tmp2)) then begin
                                        //\82\93\82Í\83\8c\83X\94Ô\8d\86\82Á\82Û\82¢\82Á\82·\81B
                                        wkIntSt := StrToInt64(tmp2);
                                        wkIntTo := StrToInt64(tmp2);
-                                               //s := GetThreadText(wkBBS, wkKey, wkIntSt, wkIntTo, False, False);
-                                       FHint.PopupType := gptThread;
-                                       HTMLCreater.SetResPopupText(FHint, GetActiveContent, wkIntSt, wkIntTo, False, False);
+                    cResPopup.PopupType := gptThread;
+                                       HTMLCreater.SetResPopupText(cResPopup, GetActiveContent(true), wkIntSt, wkIntTo, False, False);
                                end else begin
                                end else begin
-                                       FHint.PopupType := gptRaw;
-                                       FHint.Caption := s;
+                    cResPopup.PopupType := gptRaw;
+                    cResPopup.Title := s;
                                end;
                        end;
                end else begin
                                end;
                        end;
                end else begin
-                       threadItem := GetActiveContent;
+            CreateResPopupBrowser;
+
+            if not(Sender is TResPopupBrowser) then begin
+                if (FResPopupBrowser.Visible) then begin
+                    FResPopupBrowser.Clear;
+                end;
+            end else begin
+                TResPopupBrowser(Sender).ChildClear;
+            end;
+
+                       threadItem := GetActiveContent(true);
                        URL := THTMLCreate.GetRespopupURL(Text2, threadItem.URL);
                        PathRec := Gikosys.Parse2chURL2(URL);
                        if (PathRec.FNoParam) then begin
                        URL := THTMLCreate.GetRespopupURL(Text2, threadItem.URL);
                        PathRec := Gikosys.Parse2chURL2(URL);
                        if (PathRec.FNoParam) then begin
@@ -2001,19 +2203,27 @@ begin
                                                wkIntSt := 1;
                                                wkIntTo := 1;
                                        end;
                                                wkIntSt := 1;
                                                wkIntTo := 1;
                                        end;
-                                       FHint.PopupType := gptThread;
-                                       HTMLCreater.SetResPopupText(FHint, threadItem, wkIntSt, wkIntTo, ATitle, PathRec.FFirst );
+                    cResPopup := FResPopupBrowser.CreateNewBrowser;
+                    cResPopup.PopupType := gptThread;
+                                       HTMLCreater.SetResPopupText(cResPopup, threadItem, wkIntSt, wkIntTo, ATitle, PathRec.FFirst );
                                end;
                        end;
                end;
                                end;
                        end;
                end;
+        if (cResPopup <> nil) then begin
+            ResPopupClearTimer.Enabled := False;
 
 
-               if FHint.PopupType = gptRaw then begin
-                       if FHint.Caption <> '' then
-                               ShowTextPopup;
-               end else begin
-                       if (FHint.ResCount <> 0) or (FHint.Title <> '') then
-                               ShowTextPopup;
-               end;
+            if cResPopup.PopupType = gptRaw then begin
+                if cResPopup.Title <> '' then begin
+                    cResPopup.TitlePopup;
+                end;
+            end else begin
+                if cResPopup.RawDocument <> '' then begin
+                    cResPopup.Popup;
+                end else if cResPopup.Title <> '' then begin
+                    cResPopup.TitlePopup;
+                end;
+            end;
+        end;
        end;
 end;
 
        end;
 end;
 
@@ -2132,6 +2342,7 @@ var
        ARect: TRect;
 begin
        DefaultDraw := True;
        ARect: TRect;
 begin
        DefaultDraw := True;
+// \82È\82º\82©\96³\8fð\8c\8f\82ÅExit\82µ\82Ä\82¢\82é
        Exit;
        DefaultDraw := False;
        if (cdsSelected in State) or (cdsHot in State) then begin
        Exit;
        DefaultDraw := False;
        if (cdsSelected in State) or (cdsHot in State) then begin
@@ -2171,18 +2382,41 @@ var
 const
        kMenuName: string = 'menu:';
 begin
 const
        kMenuName: string = 'menu:';
 begin
-
+{$IFDEF DEBUG}
+       Writeln(URL);
+{$ENDIF}
+    FKokoPopupThreadItem := nil;
        if Pos(kMenuName, URL) <> 0 then begin
                sNo := Copy( URL, Pos( kMenuName, URL ) + Length( kMenuName ), Length( URL ) );
        if Pos(kMenuName, URL) <> 0 then begin
                sNo := Copy( URL, Pos( kMenuName, URL ) + Length( kMenuName ), Length( URL ) );
-               
+
                if not GikoSys.IsNumeric(sNo) then Exit;
 
                Cancel := True;
                GetCursorpos(p);
                if not GikoSys.IsNumeric(sNo) then Exit;
 
                Cancel := True;
                GetCursorpos(p);
+        KokoPopupMenu.PopupComponent := nil;
+        if (Sender is TComponent) then
+            KokoPopupMenu.PopupComponent := TComponent(Sender);
+        // \8cë\94\9a\91Î\8dô \83N\83\8a\83b\83N\82µ\82½\83u\83\89\83E\83U\82Æ\88Ù\82È\82é\82Æ\82«\82É\8fÁ\82·\8f\88\97\9d\82ð\92Ç\89Á
+        if not (Sender is TResPopupBrowser) then begin
+            if (FResPopupBrowser <> nil) and (FResPopupBrowser.CurrentBrowser.Visible = True) then begin
+                FResPopupBrowser.Clear;
+            end;
+        end else begin
+            if (Sender <> FResPopupBrowser.CurrentBrowser) then begin
+                TResPopupBrowser(Sender).ChildClear;
+            end;
+        end;
+        FKokoPopupThreadItem := GetActiveContent(true);
                KokoPopupMenu.Tag := StrToInt(sNo);
                KokoPopupMenu.Popup(p.x, p.y);
        end else if Pos('mailto', LowerCase(URL)) <> 0 then begin
                Cancel := not GikoSys.Setting.OpenMailer;
                KokoPopupMenu.Tag := StrToInt(sNo);
                KokoPopupMenu.Popup(p.x, p.y);
        end else if Pos('mailto', LowerCase(URL)) <> 0 then begin
                Cancel := not GikoSys.Setting.OpenMailer;
+
+        //@\82Æ.\82ð\8aÜ\82Ü\82È\82¢URL\82Í\83\81\81[\83\8b\83A\83h\83\8c\83X\82Æ\82Ý\82È\82³\82È\82¢
+        //\8eå\82Éage\81Asage\91Î\8dô
+        if (Pos('@', URL) = 0) or (Pos('.', URL) = 0) then begin
+            Cancel := True;
+        end;
        end;
 
 end;
        end;
 
 end;
@@ -2324,6 +2558,8 @@ begin
 end;
 procedure TGikoForm.DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
 begin
 end;
 procedure TGikoForm.DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
 begin
+    if csDestroying in Self.ComponentState then
+        Exit;
        AddMessageList(Msg, nil, Icon);
 end;
 // *************************************************************************
        AddMessageList(Msg, nil, Icon);
 end;
 // *************************************************************************
@@ -2338,6 +2574,8 @@ var
        Res : TResRec;
 begin
        try
        Res : TResRec;
 begin
        try
+        if csDestroying in Self.ComponentState then
+               Exit;
                if Item.DownType = gdtBoard then
                        ATitle := Item.Board.Title
                else
                if Item.DownType = gdtBoard then
                        ATitle := Item.Board.Title
                else
@@ -2415,26 +2653,15 @@ begin
 
                                //\8f\84\89ñ\82 \82è\82Ì\8fê\8d\87\81\95\82P\82O\82O\82O\92´\82Í\8f\84\89ñ\8dí\8f\9c
                                if (Item.ThreadItem.Round) and (Item.ThreadItem.Count > 1000) then begin
 
                                //\8f\84\89ñ\82 \82è\82Ì\8fê\8d\87\81\95\82P\82O\82O\82O\92´\82Í\8f\84\89ñ\8dí\8f\9c
                                if (Item.ThreadItem.Round) and (Item.ThreadItem.Count > 1000) then begin
-                                       Item.ThreadItem.Round := False;
-                                       //Item.ThreadItem.RoundName := '';
-                                       AddMessageList('\81\9a1000\94­\8c¾\82ð\92´\82¦\82½\82Ì\82Å\8f\84\89ñ\82ð\8dí\8f\9c\82µ\82Ü\82µ\82½ - [' + Item.ThreadItem.Title + ']', nil, gmiOK);
+                    // 2ch\88È\8aO\82Í\81A1000\82ª\8dÅ\8d\82\82©\95s\96¾\82È\82Ì\82Å\81A2ch\8cÀ\92è\82É\82·\82é
+                    if (Item.ThreadItem.ParentBoard.Is2ch) then begin
+                                       Item.ThreadItem.Round := False;
+                                       AddMessageList('\81\9a1000\94­\8c¾\82ð\92´\82¦\82½\82Ì\82Å\8f\84\89ñ\82ð\8dí\8f\9c\82µ\82Ü\82µ\82½ - [' + Item.ThreadItem.Title + ']', nil, gmiOK);
+                    end;
                                end;
                                TreeView.Refresh;
                                //ListView\82Å\82±\82Ì\83X\83\8c\82ª\8aÜ\82Ü\82ê\82é\94Â\82ð\95\\8e¦\82µ\82Ä\82¢\82é\82Æ\82«\82Ì\8dX\90V\8f\88\97\9d
                                end;
                                TreeView.Refresh;
                                //ListView\82Å\82±\82Ì\83X\83\8c\82ª\8aÜ\82Ü\82ê\82é\94Â\82ð\95\\8e¦\82µ\82Ä\82¢\82é\82Æ\82«\82Ì\8dX\90V\8f\88\97\9d
-                               if (ActiveList <> nil) and (ActiveList is TBoard) then begin
-                                       TBoard(ActiveList).LogThreadCount := TBoard(ActiveList).GetLogThreadCount;
-                                       TBoard(ActiveList).NewThreadCount := TBoard(ActiveList).GetNewThreadCount;
-                                       TBoard(ActiveList).UserThreadCount:= TBoard(ActiveList).GetUserThreadCount;
-                    //ListView\82Ì\83A\83C\83e\83\80\82Ì\8cÂ\90\94\82à\8dX\90V
-                                       case GikoForm.ViewType of
-                                               gvtAll: ListView.Items.Count := TBoard(ActiveList).Count;
-                                               gvtLog: ListView.Items.Count := TBoard(ActiveList).LogThreadCount;
-                                               gvtNew: ListView.Items.Count := TBoard(ActiveList).NewThreadCount;
-                                               gvtArch: ListView.Items.Count := TBoard(ActiveList).ArchiveThreadCount;
-                                               gvtLive: ListView.Items.Count := TBoard(ActiveList).LiveThreadCount;
-                                               gvtUser: ListView.Items.Count := TBoard(ActiveList).UserThreadCount;
-                                       end;
-                               end;
+                UpdateListView();
                                RefreshListView(Item.ThreadItem);
                        end;
 
                                RefreshListView(Item.ThreadItem);
                        end;
 
@@ -2479,6 +2706,9 @@ procedure TGikoForm.WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWork
 begin
 //     SetProgressValue(Number, 0, AWorkCountMax);
 //     ProgressBar.Visible := True;
 begin
 //     SetProgressValue(Number, 0, AWorkCountMax);
 //     ProgressBar.Visible := True;
+    if csDestroying in Self.ComponentState then
+        Exit;
+
        ProgressBar.Position := 0;
        ProgressBar.Max := AWorkCountMax;
        FDownloadTitle := AWorkTitle;
        ProgressBar.Position := 0;
        ProgressBar.Max := AWorkCountMax;
        FDownloadTitle := AWorkTitle;
@@ -2488,6 +2718,8 @@ end;
 
 procedure TGikoForm.WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
 begin
 
 procedure TGikoForm.WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
 begin
+    if csDestroying in Self.ComponentState then
+        Exit;
        ProgressBar.Position := 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½';
        ProgressBar.Position := 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½';
@@ -2495,6 +2727,8 @@ end;
 
 procedure TGikoForm.Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer; Number: Integer);
 begin
 
 procedure TGikoForm.Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer; Number: Integer);
 begin
+    if csDestroying in Self.ComponentState then
+        Exit;
        ProgressBar.Position := AWorkCount;
 //     SetProgressValue(Number, AWorkCount);
        StatusBar.Panels[1].Text := FDownloadTitle + ' - \83_\83E\83\93\83\8d\81[\83h\92\86 (' + IntToStr(AWorkCount) + '/' + IntToStr(FDownloadMax) + ')';
        ProgressBar.Position := AWorkCount;
 //     SetProgressValue(Number, AWorkCount);
        StatusBar.Panels[1].Text := FDownloadTitle + ' - \83_\83E\83\93\83\8d\81[\83h\92\86 (' + IntToStr(AWorkCount) + '/' + IntToStr(FDownloadMax) + ')';
@@ -2521,6 +2755,19 @@ begin
        end;
 end;
 
        end;
 end;
 
+//! \82à\82Á\82Æ\82à\8cÃ\82¢Browser\82Ì\8aJ\95ú
+procedure TGikoForm.ReleaseOldestBrowser;
+var
+    i: Integer;
+begin
+    for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+        if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser =
+                TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+            ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
+            break;
+        end;
+    end;
+end;
 
 function TGikoForm.InsertBrowserTab(
        ThreadItem      : TThreadItem;
 
 function TGikoForm.InsertBrowserTab(
        ThreadItem      : TThreadItem;
@@ -2530,6 +2777,7 @@ var
        i, j, idx               : Integer;
        favItem                 : TFavoriteThreadItem;
        newBrowser      : TBrowserRecord;
        i, j, idx               : Integer;
        favItem                 : TFavoriteThreadItem;
        newBrowser      : TBrowserRecord;
+    ins : Integer;
 begin
 
        Result := nil;
 begin
 
        Result := nil;
@@ -2553,12 +2801,8 @@ begin
                                if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
                                        Result := TBrowserRecord( BrowserTab.Tabs.Objects[i] );
                                        if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = nil then begin
                                if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
                                        Result := TBrowserRecord( BrowserTab.Tabs.Objects[i] );
                                        if TBrowserRecord(BrowserTab.Tabs.Objects[i]).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
-                                                               ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                                                               break;
-                                                       end;
-                                               end;
+                        //\88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+                        ReleaseOldestBrowser;
                                                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                                                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
                                                FBrowsers.Move(BROWSER_COUNT - 1, 0);
                                                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                                                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
                                                FBrowsers.Move(BROWSER_COUNT - 1, 0);
@@ -2573,21 +2817,15 @@ begin
                        end;
                end;
                idx := BrowserTab.TabIndex;
                        end;
                end;
                idx := BrowserTab.TabIndex;
-               if GikoSys.Setting.BrowserTabAppend = gtaFirst then begin
-                       newBrowser := TBrowserRecord.Create;
-                       for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
-                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                                       ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                                       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;
+        newBrowser := TBrowserRecord.Create;
+        // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+        ReleaseOldestBrowser;
+        newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+        FBrowsers.Move(BROWSER_COUNT - 1, 0);
+        newBrowser.thread := ThreadItem;
+        newBrowser.Repaint := true;
 
 
+               if GikoSys.Setting.BrowserTabAppend = gtaFirst then begin
                        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 ] ) );
                        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 ] ) );
@@ -2597,22 +2835,7 @@ begin
                        if ActiveTab then begin
                                BrowserTab.TabIndex := 0;
                        end;
                        if ActiveTab then begin
                                BrowserTab.TabIndex := 0;
                        end;
-
-               end else begin
-                       newBrowser := TBrowserRecord.Create;
-                       for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
-                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                                       ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                                       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;
-
+               end else if GikoSys.Setting.BrowserTabAppend = gtaLast then begin
                        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 ] ) );
                        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 ] ) );
@@ -2625,7 +2848,40 @@ begin
                                else
                                        BrowserTab.TabIndex := i;
                        end;
                                else
                                        BrowserTab.TabIndex := i;
                        end;
-               end;
+               end else begin
+            // \83^\83u\88Ê\92u\82ð\8eæ\93¾
+            ins := -1;
+            for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+            if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser =
+                    TWebBrowser(FBrowsers[1]) then begin
+                    ins := i;
+                    break;
+                end;
+            end;
+            if GikoSys.Setting.BrowserTabAppend = gtaRight then begin
+                Inc(ins);
+                   end;
+            // \83^\83u\82ª\96³\82¢\82Æ\82«\82È\82Ç\91Î\8dô
+            if (ins < 0) then begin
+                ins := 0;
+            end;
+                       BrowserTab.Tabs.InsertObject(ins, GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
+                       if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
+                if GikoSys.Setting.BrowserTabAppend = gtaRight then begin
+                               DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 0 ] ) );
+                end else begin
+                    DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 1 ] ) );
+                end;
+                       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 := ins;
+                       end;
+        end;
                Result := newBrowser;
                if(ActiveTab) or (idx = -1) then begin
                        BrowserTab.OnChange(nil);
                Result := newBrowser;
                if(ActiveTab) or (idx = -1) then begin
                        BrowserTab.OnChange(nil);
@@ -2654,9 +2910,8 @@ var
        BBSID: string;
        FileName: string;
        sTitle: string;
        BBSID: string;
        FileName: string;
        sTitle: string;
-       doc: Variant;
+       doc: OleVariant;
        s: string;
        s: string;
-       i: Integer;
        idx: Integer;
        ThreadItem: TThreadItem;
        Thread: TBrowserRecord;
        idx: Integer;
        ThreadItem: TThreadItem;
        Thread: TBrowserRecord;
@@ -2665,17 +2920,18 @@ var
 begin
        Thread := inThread;
        idx := BrowserTab.TabIndex;
 begin
        Thread := inThread;
        idx := BrowserTab.TabIndex;
-       if (FActiveContent <> nil) and
+       if  (not FStartUp) and
+        (FActiveContent <> nil) and
                (FActiveContent.Thread <> Thread.Thread) and
                (FActiveContent.Browser <> nil) and
                (FActiveContent.Thread <> Thread.Thread) and
                (FActiveContent.Browser <> nil) and
-               (Assigned(FActiveContent.Browser.Document)) then begin
-               try
-               try
-                       FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document).Body).ScrollTop;
-               except
-                       on E: Exception do
-                               MsgBox(Handle, E.Message, 'SetContent[<-ScrollTop]', 0);
-               end;
+               (Assigned(FActiveContent.Browser.ControlInterface.Document)) then begin
+        try
+            try
+                FActiveContent.Thread.ScrollTop := FActiveContent.Browser.OleObject.Document.Body.ScrollTop;
+            except
+            on E: Exception do
+                MsgBox(Handle, E.Message, 'SetContent[<-ScrollTop]', 0);
+        end;
                finally
                end;
        end;
                finally
                end;
        end;
@@ -2693,12 +2949,8 @@ begin
        end     else if Thread.Browser = nil then begin
                if FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then
                        FBrowsers.Move(BROWSER_COUNT - 1, 0);
        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]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                               ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
-                               break;
-                       end;
-               end;
+        // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+        ReleaseOldestBrowser;
                Thread.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                FBrowsers.Move(BROWSER_COUNT - 1, 0);
        end;
                Thread.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                FBrowsers.Move(BROWSER_COUNT - 1, 0);
        end;
@@ -2706,6 +2958,12 @@ begin
        ThreadTitle := Thread.Thread.Title;
        ThreadPTitle := Thread.Thread.ParentBoard.Title;
        //ThreadScrollTop := Thread.Thread.ScrollTop;
        ThreadTitle := Thread.Thread.Title;
        ThreadPTitle := Thread.Thread.ParentBoard.Title;
        //ThreadScrollTop := Thread.Thread.ScrollTop;
+    if Thread.Thread.IsLogFile then  begin
+        if not FileExists(Thread.Thread.GetThreadFileName) then begin
+            Thread.Thread.DeleteLogFile;
+        end;
+    end;
+
        ThreadIsLog := Thread.Thread.IsLogFile;
        ThreadItem := Thread.Thread;
        ThreadNewArraical :=  Thread.Thread.NewArrival;
        ThreadIsLog := Thread.Thread.IsLogFile;
        ThreadItem := Thread.Thread;
        ThreadNewArraical :=  Thread.Thread.NewArrival;
@@ -2725,7 +2983,7 @@ begin
                                ShowWindow(FActiveContent.Browser.Handle, SW_HIDE);
                end;
                ShowWindow(Thread.Browser.Handle, SW_SHOW);
                                ShowWindow(FActiveContent.Browser.Handle, SW_HIDE);
                end;
                ShowWindow(Thread.Browser.Handle, SW_SHOW);
-               if (not Assigned(Thread.Browser.Document)) then begin
+               if (not Assigned(Thread.Browser.ControlInterface.Document)) then begin
                        Thread.Browser.Navigate('about:blank');
                end;
                while (Thread.Browser.ReadyState <> READYSTATE_COMPLETE) and
                        Thread.Browser.Navigate('about:blank');
                end;
                while (Thread.Browser.ReadyState <> READYSTATE_COMPLETE) and
@@ -2763,7 +3021,7 @@ begin
                        try
                                Thread.Browser.BringToFront;
                                s := '<HTML><BODY><CENTER>\82±\82Ì\83X\83\8c\83b\83h\82Í\8eæ\93¾\82µ\82Ä\82¢\82Ü\82¹\82ñ</CENTER></BODY></HTML>';
                        try
                                Thread.Browser.BringToFront;
                                s := '<HTML><BODY><CENTER>\82±\82Ì\83X\83\8c\83b\83h\82Í\8eæ\93¾\82µ\82Ä\82¢\82Ü\82¹\82ñ</CENTER></BODY></HTML>';
-                               doc := Idispatch( olevariant(Thread.Browser.ControlInterface).Document) as IHTMLDocument2;
+                               doc := Thread.Browser.OleObject.Document;
                                doc.open;
                                doc.charset := 'Shift_JIS';
                                doc.Write(s);
                                doc.open;
                                doc.charset := 'Shift_JIS';
                                doc.Write(s);
@@ -2796,12 +3054,17 @@ begin
        end;
 end;
 
        end;
 end;
 
-function TGikoForm.GetActiveContent: TThreadItem;
+function TGikoForm.GetActiveContent(popup :Boolean = false): TThreadItem;
 begin
        try
 begin
        try
-               if FActiveContent <> nil then
-                       Result := FActiveContent.Thread
-               else
+               if FActiveContent <> nil then begin
+                       Result := FActiveContent.Thread;
+            if (popup) and
+                (FResPopupBrowser <> nil) and (FResPopupBrowser.CurrentBrowser.Visible = True) then
+                if (FResPopupBrowser.CurrentBrowser.Thread <> nil) then begin
+                    Result := FResPopupBrowser.CurrentBrowser.Thread;
+                end;
+               end else
                        Result := nil;
        except
                Result := nil;
                        Result := nil;
        except
                Result := nil;
@@ -2890,6 +3153,9 @@ begin
                BBSs[i].SelectText := SelectText;
                BBSs[i].KubetsuChk := KubetsuChk;
        end;
                BBSs[i].SelectText := SelectText;
                BBSs[i].KubetsuChk := KubetsuChk;
        end;
+    BoardGroup.SpecialBBS.SelectText := SelectText;
+    BoardGroup.SpecialBBS.KubetsuChk := KubetsuChk;
+    
        ViewType := AViewType;
        if ActiveList is TBoard then begin
                Board := TBoard(ActiveList);
        ViewType := AViewType;
        if ActiveList is TBoard then begin
                Board := TBoard(ActiveList);
@@ -3392,7 +3658,14 @@ begin
                FActiveContent.Move(AName);
        end;
 end;
                FActiveContent.Move(AName);
        end;
 end;
-
+//\8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83X\83N\83\8d\81[\83\8b
+procedure TGikoForm.BrowserMovement(scroll: Integer);
+begin
+       if(BrowserTab.Tabs.Count > 0) and (BrowserTab.TabIndex >= 0)
+               and (FActiveContent <> nil) then begin
+               FActiveContent.Move(scroll);
+       end;
+end;
 procedure TGikoForm.TreeViewCollapsed(Sender: TObject; Node: TTreeNode);
 begin
        if TObject(Node.Data) is TBBS then begin
 procedure TGikoForm.TreeViewCollapsed(Sender: TObject; Node: TTreeNode);
 begin
        if TObject(Node.Data) is TBBS then begin
@@ -3482,27 +3755,32 @@ begin
 end;
 procedure TGikoForm.DeleteTab(index, selectIndex: Integer);
 var
 end;
 procedure TGikoForm.DeleteTab(index, selectIndex: Integer);
 var
-    doc: Variant;
+    browserRec : TBrowserRecord;
+    doc: OleVariant;
     j: Integer;
 begin
     j: Integer;
 begin
+    browserRec := TBrowserRecord(BrowserTab.Tabs.Objects[index]);
     try
     try
-        if TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser <> nil then begin
-            doc := TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser.Document;
-            TBrowserRecord(BrowserTab.Tabs.Objects[index]).Thread.ScrollTop := doc.Body.ScrollTop;
+        if browserRec.Browser <> nil then begin
+            doc := browserRec.Browser.OleObject.Document;
+            browserRec.Thread.ScrollTop := doc.Body.ScrollTop;
         end;
     except
         end;
     except
-        TBrowserRecord(BrowserTab.Tabs.Objects[index]).Thread.ScrollTop := 0;
+        browserRec.Thread.ScrollTop := 0;
     end;
     end;
-    if(FActiveContent = TBrowserRecord(BrowserTab.Tabs.Objects[index])) then
+
+    if(FActiveContent = browserRec) then
         FActiveContent := nil;
         FActiveContent := nil;
-    if TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser <> nil then begin
-        j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser);
+    if browserRec.Browser <> nil then begin
+        j := FBrowsers.IndexOf(browserRec.Browser);
         if j <> -1 then
             FBrowsers.Move(j, BROWSER_COUNT - 1);
     end;
         if j <> -1 then
             FBrowsers.Move(j, BROWSER_COUNT - 1);
     end;
+
     BrowserTab.Tabs.BeginUpdate;
     try
     BrowserTab.Tabs.BeginUpdate;
     try
-        TBrowserRecord(BrowserTab.Tabs.Objects[index]).Free;
+        GikoSys.Setting.LastCloseTabURL := browserRec.Thread.URL;
+        browserRec.Free;
         if ( BrowserTab.Tabs.Count - 1 = index ) and
             ( BrowserTab.TabRect(index).Left
                 <= BrowserTab.DisplayRect.Left ) then begin
         if ( BrowserTab.Tabs.Count - 1 = index ) and
             ( BrowserTab.TabRect(index).Left
                 <= BrowserTab.DisplayRect.Left ) then begin
@@ -3523,16 +3801,12 @@ begin
     if BrowserTab.Tabs.Count = 0 then begin
         BrowserNullTab.Thread := nil;
     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
     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
-                ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                break;
-            end;
-        end;
+        // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+        ReleaseOldestBrowser;
+
         TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
              :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
         TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
         TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
              :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
         TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
@@ -3557,7 +3831,7 @@ end;
 
 procedure TGikoForm.ListPopupMenuPopup(Sender: TObject);
 var
 
 procedure TGikoForm.ListPopupMenuPopup(Sender: TObject);
 var
-    bBoard, bCategory, bBBS : Boolean;
+    bBoard, bCategory : Boolean;
 begin
     bBoard := (GetActiveList is TBoard);
     bCategory := (GetActiveList is TCategory);
 begin
     bBoard := (GetActiveList is TBoard);
     bCategory := (GetActiveList is TCategory);
@@ -3680,75 +3954,101 @@ var
     BNum, BRes: string;
     threadItem: TThreadItem;
     aElement : IHTMLElement;
     BNum, BRes: string;
     threadItem: TThreadItem;
     aElement : IHTMLElement;
+    senderBrowser : TWebBrowser;
+    doc : IHTMLDocument2;
 begin
 begin
+{$IFDEF DEBUG}
+       Writeln(IntToStr(Integer(ppDisp)));
+{$ENDIF}
        Cancel := True;
        Cancel := True;
-    aElement := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement;
-       if ( aElement <> nil) then begin
-               Text := aElement.Get_outerText;
-               Html := aElement.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(Trim(Text));
-
-                               if(AnsiPos('>>', Text) = 1) then begin
-                                       //Text := Copy(Text, 3, Length(Text) - 2);
-                                       Delete(Text, 1, 2);
-                               end else begin
-                                       //Text := Copy(Text, 2, Length(Text) - 1);
-                                       Delete(Text, 1, 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 begin
-                                       wkIntSt := StrToIntDef(Text, 0);
-                               end;
+       if not( TObject(Sender) is TWebBrowser )then
+               Exit;
 
 
-                               if wkIntSt <> 0 then begin
-                                       FActiveContent.IDAnchorPopup('');
-                    MoveHisotryManager.pushItem(FActiveContent);
-                                       BrowserMovement(IntToStr(wkIntSt));
-                               end;
+    senderBrowser := TWebBrowser(Sender);
+    doc := senderBrowser.ControlInterface.Document as IHTMLDocument2;
+       if not Assigned(doc) then
+               Exit;
+
+       aElement := doc.activeElement;
+       if not Assigned(aElement) then
+               Exit;
+
+       Text := aElement.Get_outerText;
+       Html := aElement.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(Trim(Text));
+
+                       if(AnsiPos('>>', Text) = 1) then begin
+                               //Text := Copy(Text, 3, Length(Text) - 2);
+                               Delete(Text, 1, 2);
+                       end else begin
+                               //Text := Copy(Text, 2, Length(Text) - 1);
+                               Delete(Text, 1, 1);
                        end;
                        end;
-               end else begin
-            ////'http://be.2ch.net/test/p.php?i='+id+'&u=d:'+bas+num
-
-                       URL := GikoSys.GetHRefText(Html);
-                       URL := GikoSys.HTMLDecode(URL);
-            if AnsiPos('BE:', URL) = 1 then begin
-                               BNum := Copy(URL, 4, AnsiPos('/', URL) - 4);
-                               BRes := Copy(URL, AnsiPos('/', URL) + 1,  Length(URL));
-                threadItem := FActiveContent.Thread;
-                if threadItem = nil then Exit;
-                URL := BE_PHP_URL + BNum + '&u=d'
-                       + CustomStringReplace(threadItem.URL, 'l50', '') + BRes;
+
+                       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 begin
+                               wkIntSt := StrToIntDef(Text, 0);
+                       end;
+
+                       if wkIntSt <> 0 then begin
+               FActiveContent.IDAnchorPopup('');
+                MoveHisotryManager.pushItem(FActiveContent);
+                if (Sender is TResPopupBrowser) then begin
+                    TResPopupBrowser(Sender).ChildClear;
+                    OpenThreadItem(
+                        GetActiveContent(true),
+                        GetActiveContent(true).URL + '&st=' +
+                             IntToStr(wkIntSt) + '&to=' + IntToStr(wkIntSt));
+                end else begin
+                                       BrowserMovement(IntToStr(wkIntSt));
+                end;
             end;
             end;
+               end;
+       end else begin
+        ////'http://be.2ch.net/test/p.php?i='+id+'&u=d:'+bas+num
+
+               URL := GikoSys.GetHRefText(Html);
+               URL := GikoSys.HTMLDecode(URL);
+        if AnsiPos('BE:', URL) = 1 then begin
+                       BNum := Copy(URL, 4, AnsiPos('/', URL) - 4);
+                       BRes := Copy(URL, AnsiPos('/', URL) + 1,  Length(URL));
+            threadItem := FActiveContent.Thread;
+            if threadItem = nil then Exit;
+            URL := BE_PHP_URL + BNum + '&u=d'
+               + CustomStringReplace(threadItem.URL, 'l50', '') + BRes;
+        end;
 
 
-                       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;
+               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;
-                MoveHisotryManager.pushItem(FActiveContent);
-                               MoveToURL( URL );
                        end;
                        end;
+            if (Sender is TResPopupBrowser) then begin
+                TResPopupBrowser(Sender).ChildClear
+            end;
+
+            MoveHisotryManager.pushItem(FActiveContent);
+                       MoveToURL( URL );
                end;
        end;
 
                end;
        end;
 
@@ -3804,7 +4104,7 @@ end;
 
 procedure TGikoForm.BrowserTabChange(Sender: TObject);
 var
 
 procedure TGikoForm.BrowserTabChange(Sender: TObject);
 var
-       i, j: Integer;
+       j: Integer;
        idx: Integer;
 begin
        BrowserTab.Tabs.BeginUpdate;
        idx: Integer;
 begin
        BrowserTab.Tabs.BeginUpdate;
@@ -3827,12 +4127,9 @@ begin
                                                (FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1])) then
                                                FBrowsers.Move(BROWSER_COUNT - 1, 0);
 
                                                (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
-                                                       ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
-                                                       break;
-                                               end;
-                                       end;
+                    // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+                    ReleaseOldestBrowser;
+
                                        TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                                        TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Repaint := true;
                                        FBrowsers.Move(BROWSER_COUNT - 1, 0);
                                        TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                                        TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Repaint := true;
                                        FBrowsers.Move(BROWSER_COUNT - 1, 0);
@@ -3988,10 +4285,9 @@ end;
 procedure TGikoForm.BrowserDocumentComplete(Sender: TObject;
        const pDisp: IDispatch; var URL: OleVariant);
 var
 procedure TGikoForm.BrowserDocumentComplete(Sender: TObject;
        const pDisp: IDispatch; var URL: OleVariant);
 var
-       FDispHtmlDocument: DispHTMLDocument;
        BrowserRecord :TBrowserRecord;
        i :Integer;
        BrowserRecord :TBrowserRecord;
        i :Integer;
-       doc                                     : Variant;
+       doc     : IHTMLDocument2;
        threadItem      : TThreadItem;
 begin
        if TObject(Sender) is TWebBrowser then begin
        threadItem      : TThreadItem;
 begin
        if TObject(Sender) is TWebBrowser then begin
@@ -4006,17 +4302,15 @@ begin
                        if BrowserRecord <> nil then begin
                                if BrowserRecord.Event <> nil then
                                        BrowserRecord.Event.Free;
                        if BrowserRecord <> nil then begin
                                if BrowserRecord.Event <> nil then
                                        BrowserRecord.Event.Free;
-                               FDispHtmlDocument := Idispatch(OleVariant(BrowserRecord.Browser.ControlInterface).Document) as DispHTMLDocument;
-                               BrowserRecord.Event := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
+                               BrowserRecord.Event := THTMLDocumentEventSink.Create(Self, BrowserRecord.Browser.ControlInterface.Document, HTMLDocumentEvents2);
                                BrowserRecord.Event.OnContextMenu := OnDocumentContextMenu;
                                BrowserRecord.Event.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
                        end;
                end else begin
                        if GetActiveContent <> nil then begin
                                BrowserRecord.Event.OnContextMenu := OnDocumentContextMenu;
                                BrowserRecord.Event.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;
                                if FEvent <> nil then
                                        FEvent.Free;
-                               FEvent := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
+                               FEvent := THTMLDocumentEventSink.Create(Self, Browser.ControlInterface.Document, HTMLDocumentEvents2);
                                FEvent.OnContextMenu := OnDocumentContextMenu;
                                FEvent.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
                        end else begin
                                FEvent.OnContextMenu := OnDocumentContextMenu;
                                FEvent.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
                        end else begin
@@ -4054,8 +4348,8 @@ begin
                                RefreshListView(threadItem);
                        end else if threadItem.ScrollTop <> 0 then begin
                                try
                                RefreshListView(threadItem);
                        end else if threadItem.ScrollTop <> 0 then begin
                                try
-                                       doc := Idispatch( OleVariant( BrowserRecord.Browser.ControlInterface ).Document ) as IHTMLDocument2;
-                                       doc.Body.ScrollTop := threadItem.ScrollTop;
+                                       doc := BrowserRecord.Browser.ControlInterface.Document as IHTMLDocument2;
+                                       (doc.body as IHTMLElement2).ScrollTop := threadItem.ScrollTop;
                                except
                                        on E: Exception do
                                                MsgBox(Handle, E.Message, 'SetContent[ScrollTop<-]', 0);
                                except
                                        on E: Exception do
                                                MsgBox(Handle, E.Message, 'SetContent[ScrollTop<-]', 0);
@@ -4100,7 +4394,7 @@ procedure TGikoForm.SetSelectItemRound(RoundFlag: Boolean; RoundName: string; Pa
 var
        threadItem : TThreadItem;
 begin
 var
        threadItem : TThreadItem;
 begin
-       if ParentName <> 'dummy1' then begin
+       if ParentName <> 'RoundItem' then begin
                SetSelectItemRound(RoundFlag, RoundName);
        end else begin
                threadItem := GetActiveContent;
                SetSelectItemRound(RoundFlag, RoundName);
        end else begin
                threadItem := GetActiveContent;
@@ -4189,7 +4483,6 @@ begin
        MenuToolBar.Buttons[0].AutoSize := True;
        MainCoolBar.AutoSize := False;
        MainCoolBar.AutoSize := True;
        MenuToolBar.Buttons[0].AutoSize := True;
        MainCoolBar.AutoSize := False;
        MainCoolBar.AutoSize := True;
-
        GikoSys.MenuFont(ListCoolBar.Font);
        GikoSys.MenuFont(BrowserCoolBar.Font);
 //     MenuToolBar.Font.Color := clMenuText;
        GikoSys.MenuFont(ListCoolBar.Font);
        GikoSys.MenuFont(BrowserCoolBar.Font);
 //     MenuToolBar.Font.Color := clMenuText;
@@ -4381,7 +4674,7 @@ var
        stRes, edRes : Int64;
        browserRec : TBrowserRecord;
        threadNumber : String;
        stRes, edRes : Int64;
        browserRec : TBrowserRecord;
        threadNumber : String;
-       doc : Variant;
+       doc : IHTMLDocument2;
 begin
        stRes := 0;
        edRes := 0;
 begin
        stRes := 0;
        edRes := 0;
@@ -4409,15 +4702,16 @@ begin
                        browserRec.Move(IntToStr(stRes));
                        Thread.JumpAddress := 0;
                        try
                        browserRec.Move(IntToStr(stRes));
                        Thread.JumpAddress := 0;
                        try
-                               doc := Idispatch( OleVariant( browserRec.Browser.ControlInterface ).Document ) as IHTMLDocument2;
-                               Thread.ScrollTop := doc.Body.ScrollTop;
+                doc := browserRec.Browser.ControlInterface.Document as IHTMLDocument2;
+                if Assigned(doc) then
+                               Thread.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
                        except
                        end;
                end;
        end;
 end;
 
                        except
                        end;
                end;
        end;
 end;
 
-procedure TGikoForm.MoveToURL(const inURL: string);
+procedure TGikoForm.MoveToURL(const inURL: string; KeyMask: Boolean = False);
 var
        protocol, host, path, document, port, bookmark : string;
        URL, protocol2, host2, path2, document2, port2, bookmark2 : string;
 var
        protocol, host, path, document, port, bookmark : string;
        URL, protocol2, host2, path2, document2, port2, bookmark2 : string;
@@ -4434,17 +4728,18 @@ begin
 
        GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
        GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
 
        GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
        GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
-
-
-       shiftDown       := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
-       ctrlDown        := GetAsyncKeyState(VK_CONTROL) = Smallint($8001);
-       if shiftDown then begin
-               GikoSys.OpenBrowser(inURL, gbtUserApp);
-               Exit;
-       end else if ctrlDown then begin
-               GikoSys.OpenBrowser(inURL, gbtIE);
-               Exit;
-       end;
+    // \83A\83N\83V\83\87\83\93\82©\82ç\8cÄ\82Î\82ê\82é\82Æshift/ctrl\82Í\82¨\82µ\82Á\82Ï\82Ì\8fê\8d\87\82ª\82Ù\82Æ\82ñ\82Ç\82È\82Ì\82Å\83}\83X\83N\82·\82é
+    if not KeyMask then begin
+        shiftDown      := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
+        ctrlDown       := GetAsyncKeyState(VK_CONTROL) = Smallint($8001);
+        if shiftDown then begin
+            GikoSys.OpenBrowser(inURL, gbtUserApp);
+            Exit;
+        end else if ctrlDown then begin
+            GikoSys.OpenBrowser(inURL, gbtIE);
+            Exit;
+        end;
+    end;
 
        //===== \83v\83\89\83O\83C\83\93
        try
 
        //===== \83v\83\89\83O\83C\83\93
        try
@@ -4588,7 +4883,7 @@ end;
 
 procedure TGikoForm.BrowserEnter(Sender: TObject);
 begin
 
 procedure TGikoForm.BrowserEnter(Sender: TObject);
 begin
-       Browser.DoObjectVerb(OLEIVERB_UIACTIVATE);
+    Browser.DoObjectVerb(OLEIVERB_UIACTIVATE);
 end;
 
 procedure TGikoForm.WMCopyData(var Message: TWMCopyData);
 end;
 
 procedure TGikoForm.WMCopyData(var Message: TWMCopyData);
@@ -4611,8 +4906,8 @@ end;
 
 procedure TGikoForm.WndProc(var Message: TMessage);
 var
 
 procedure TGikoForm.WndProc(var Message: TMessage);
 var
-       senderBrowser   : TWebBrowser;
-       url                                             : OleVariant;
+       senderBrowser : TWebBrowser;
+       url : OleVariant;
 begin
        try
                case Message.Msg of
 begin
        try
                case Message.Msg of
@@ -4643,6 +4938,17 @@ begin
                                senderBrowser := TWebBrowser( Message.WParam );
                                BrowserDocumentComplete( senderBrowser, senderBrowser.Parent, url );
                        end;
                                senderBrowser := TWebBrowser( Message.WParam );
                                BrowserDocumentComplete( senderBrowser, senderBrowser.Parent, url );
                        end;
+        USER_POPUPCLEAR:
+            if (TObject(Message.WParam) is TResPopupBrowser) then begin
+                try
+                               TResPopupBrowser( Message.WParam ).Clear;
+                except
+                end;
+                       end else if (TObject(Message.WParam) is TPreviewBrowser) then begin
+                if FPreviewBrowser <> nil then begin
+                       ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
+                end;
+                       end;
                end;
 
                inherited;
                end;
 
                inherited;
@@ -4733,13 +5039,16 @@ procedure TGikoForm.WMSetCursor(var Message: TWMSetCursor);
 var
        Pos : TPoint;
 begin
 var
        Pos : TPoint;
 begin
-
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
-       if (FHint <> nil) and (IsWindowVisible(FHint.Handle)) then begin
-               FHint.ReleaseHandle;
-               FHint.ClearAllRes;
-       end;
+
+    //Window\8aO\82É\88Ú\93®\82µ\82½\82Æ\82«\82Í\8fÁ\82¦\82é\82æ\82¤\82É\82·\82é\82½\82ß\95\9c\8a\88
+    if (FResPopupBrowser <> nil) and (IsWindowVisible(FResPopupBrowser.Handle)) then begin
+        // \89E\83N\83\8a\83b\83N\82Ì\8e\9e\82Í\8fÁ\82³\82È\82¢\82æ\82¤\82É\8fð\8c\8f\92Ç\89Á
+        if (Message.MouseMsg <> WM_RBUTTONUP) then begin
+            FResPopupBrowser.Clear;
+        end;
+    end;
 
        if (FPreviewBrowser <> nil)
                and (IsWindowVisible(FPreviewBrowser.Handle)) then begin
 
        if (FPreviewBrowser <> nil)
                and (IsWindowVisible(FPreviewBrowser.Handle)) then begin
@@ -4766,7 +5075,7 @@ end;
 
 function TGikoForm.OnDocumentContextMenu(Sender: TObject): WordBool;
 var
 
 function TGikoForm.OnDocumentContextMenu(Sender: TObject): WordBool;
 var
-       Doc: IHtmlDocument2;
+       doc: IHtmlDocument2;
        Range: IHTMLTxtRange;
        s: string;
        Num: Integer;
        Range: IHTMLTxtRange;
        s: string;
        Num: Integer;
@@ -4774,66 +5083,31 @@ var
 begin
        Result := False;
        FactiveContent.IDAnchorPopup('');
 begin
        Result := False;
        FactiveContent.IDAnchorPopup('');
-       Doc := FactiveContent.Browser.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 := StrToInt64(s);
-                               FHint.PopupType := gptThread;
-                               HTMLCreater.SetResPopupText(FHint, ThreadItem, Num, Num, False, False);
-                               if FHint.ResCount <> 0 then
-                                       ShowTextPopup;
-                               Result := False;
-                       end else
-                               Result := True;
-               end else begin
-                       Result := True;
-               end;
-       end;
-end;
 
 
-procedure TGikoForm.ShowTextPopup;
-var
-       p: TPoint;
-       ARect: TRect;
-begin
-//     if Trim(s) = '' then
-//             Exit;
-       try
-               FHint.Font.Name := GikoSys.Setting.HintFontName;
-               FHint.Font.Size := GikoSys.Setting.HintFontSize;
-               FHint.Font.Color := GikoSys.Setting.HintFontColor;
-               FHint.Color := GikoSys.Setting.HintBackColor;
-               FHint.HeaderBold := GikoSys.Setting.ResPopupHeaderBold;
-               GetCursorpos(p);
-               if FHint.PopupType = gptRaw then
-                       ARect := FHint.CalcHintRect(Screen.Width, FHint.Caption, nil)
-               else
-                       ARect := FHint.CalcHintRect(Screen.Width, '', nil);
-               case GikoSys.Setting.PopupPosition of
-                       gppRightTop:            OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - (ARect.Bottom - ARect.Top) -     15);
-                       gppRight:                       OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
-                       gppRightBottom: OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y + 15);
-                       gppTop:                                 OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - (ARect.Bottom - ARect.Top) -  15);
-                       gppCenter:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - ((ARect.Bottom - ARect.Top) div 2));
-                       gppBottom:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y + 15);
-                       gppLeftTop:                     OffsetRect(ARect, p.x + 15, p.y - (ARect.Bottom - ARect.Top) -  15);
-                       gppLeft:                                OffsetRect(ARect, p.x + 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
-                       gppLeftBottom:  OffsetRect(ARect, p.x + 15, p.y + 15);          //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g\82P\82Ì453\8e\81\82É\8a´\8eÓ
-               end;
-               //FHint.ActivateHint(ARect, s);
-               if FHint.PopupType = gptRaw then
-                       FHint.ActivateHint(ARect, FHint.Caption)
-               else
-                       FHint.ActivateHint(ARect, '');
-       except
-               FHint.ReleaseHandle;
-               FHint.ClearAllRes;
+       doc := FactiveContent.Browser.ControlInterface.Document as IHtmlDocument2;
+       if not Assigned(doc) then
+        Exit;
+
+       Range := doc.selection.createRange as IHTMLTxtRange;
+       if not Assigned(Range) then
+        Exit;
+
+       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
+               Num := StrToInt64Def(s, -1);
+               ThreadItem := GetActiveContent(true);
+               if (ThreadItem <> nil) and (Num <= ThreadItem.Count)
+           and (Num > 0)then begin
+           CreateResPopupBrowser;
+           FResPopupBrowser.CreateNewBrowser.PopupType := gptThread;
+                       HTMLCreater.SetResPopupText(FResPopupBrowser.CreateNewBrowser, ThreadItem, Num, Num, False, False);
+            FResPopupBrowser.Popup;
+               Result := False;
+               end else
+                       Result := True;
+    end else begin
+               Result := True;
        end;
 end;
 
        end;
 end;
 
@@ -5530,7 +5804,7 @@ procedure TGikoForm.SelectComboBoxKeyDown(Sender: TObject; var Key: Word;
        Shift: TShiftState);
 var
   IMC: HIMC;
        Shift: TShiftState);
 var
   IMC: HIMC;
-  Len: integer;
+  Len, idx: integer;
   Str: string;
   tmp: string;
 begin
   Str: string;
   tmp: string;
 begin
@@ -5556,6 +5830,20 @@ begin
                                SetSelectWord(Str);
                        end;
                end;
                                SetSelectWord(Str);
                        end;
                end;
+    end else if (Key = Windows.VK_DELETE) and (ssCtrl in Shift) then begin
+        // Ctrl + DEL \82Å\8dí\8f\9c\82·\82é
+        Str := SelectComboBox.Text;
+        idx := GikoSys.Setting.SelectTextList.IndexOf( Str );
+        if idx <> -1 then begin
+            GikoSys.Setting.SelectTextList.Delete( idx );
+        end;
+        idx := SelectComboBox.Items.IndexOf( Str );
+               if idx <> -1 then begin
+            SelectComboBox.Items.Delete( idx );
+        end;
+        SelectComboBox.Text := '';
+        // \8di\8d\9e\82Ý\82ð\89ð\8f\9c\82·\82é\82½\82ß\82É\95Ï\8dX\83C\83x\83\93\83g\82ð\8cÄ\82Ñ\8fo\82·
+        SelectComboBox.OnChange(Sender);
        end else if Length( SelectComboBox.Text ) = 0 then
        begin
                {* SelectComboBox.Text\82ª\8bó\82Å\82à\81A\93ü\97Í\93r\92\86\82ÅEsc\82µ\82½\82Æ\82©
        end else if Length( SelectComboBox.Text ) = 0 then
        begin
                {* SelectComboBox.Text\82ª\8bó\82Å\82à\81A\93ü\97Í\93r\92\86\82ÅEsc\82µ\82½\82Æ\82©
@@ -6059,13 +6347,16 @@ begin
        if FDragWFirst = true then
                FDragWFirst := false;
 
        if FDragWFirst = true then
                FDragWFirst := false;
 
-    if GikoSys.Setting.ListOrientation = gloHorizontal then begin
-        if GikoSys.Setting.ListWidthState = glsMin then begin
-            GikoDM.BrowserMaxAndFocusAction.Execute;
-        end;
-    end else begin
-        if GikoSys.Setting.ListHeightState = glsMin then begin
-            GikoDM.BrowserMaxAndFocusAction.Execute;
+    // \83}\83E\83X\82Ì\92\86\83{\83^\83\93\82Å\95Â\82\82½\82Æ\82«\82É\8dÅ\91å\89»\82µ\82Ä\82µ\82Ü\82¤\82Ì\82ð\96h\82®\81@
+    if Button <> mbMiddle then begin
+        if GikoSys.Setting.ListOrientation = gloHorizontal then begin
+            if GikoSys.Setting.ListWidthState = glsMin then begin
+                GikoDM.BrowserMaxAndFocusAction.Execute;
+            end;
+        end else begin
+            if GikoSys.Setting.ListHeightState = glsMin then begin
+                GikoDM.BrowserMaxAndFocusAction.Execute;
+            end;
         end;
     end;
 end;
         end;
     end;
 end;
@@ -6151,7 +6442,7 @@ var
        boardPlugIn : TBoardPlugIn;
 begin
        if Number = 0 then Exit;
        boardPlugIn : TBoardPlugIn;
 begin
        if Number = 0 then Exit;
-       ThreadItem := GetActiveContent;
+       ThreadItem := GetActiveContent(True);
 
        if ThreadItem <> nil then begin
                //if ThreadItem.IsBoardPlugInAvailable then begin
 
        if ThreadItem <> nil then begin
                //if ThreadItem.IsBoardPlugInAvailable then begin
@@ -6209,10 +6500,69 @@ end;
 
 
 procedure TGikoForm.BrowserTabPopupMenuPopup(Sender: TObject);
 
 
 procedure TGikoForm.BrowserTabPopupMenuPopup(Sender: TObject);
+var
+    i:Integer;
 begin
 begin
-       AddRoundNameMenu(dummy1);
+    for i := 0  to BrowserTabPopupMenu.Items.Count - 1 do begin
+        if (BrowserTabPopupMenu.Items[i].Name='RoundItem') then begin
+            AddRoundNameMenu(BrowserTabPopupMenu.Items[i]);
+        end else if (BrowserTabPopupMenu.Items[i].Name='BoardThreadItem') then begin
+            AddMenuSameBoardThread(BrowserTabPopupMenu.Items[i])
+        end;
+    end;
+end;
+//! \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83\81\83j\83\85\81[\83A\83C\83e\83\80\82É\92Ç\89Á
+procedure TGikoForm.AddMenuSameBoardThread(MenuItem: TMenuItem);
+var
+       i: Integer;
+       Item: TMenuItem;
+begin
+    MenuItem.Clear;
+    for i := 0 to BrowserTab.Tabs.Count - 1 do begin
+        // \93¯\82\94Â\82©\82Ç\82¤\82©
+        if (FActiveContent.Thread.ParentBoard =
+            TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ParentBoard) then begin
+            // \8e©\95ª\82Í\8aO\82·
+            if FActiveContent.Thread <>
+                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread then begin
+                Item := TMenuItem.Create(Self);
+                Item.Caption := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.Title;
+                Item.Hint    := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.URL;
+                Item.OnClick := SameBoardThreadSubItemOnClick;
+                MenuItem.Add(Item);
+            end;
+        end;
+    end;
+    // \89½\82à\96³\82¢\82È\82ç\8eg\97p\82Å\82«\82È\82¢\82æ\82¤\82É\82·\82é
+    MenuItem.Enabled := MenuItem.Count > 0;
+end;
+//!  \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\83N\83\8a\83b\83N\83C\83x\83\93\83g
+procedure TGikoForm.SameBoardThreadSubItemOnClick(Sender: TObject);
+var
+       i: Integer;
+       MenuItem: TMenuItem;
+begin
+       if Sender is TMenuItem then begin
+        try
+            MenuItem := TMenuItem(Sender);
+            for i := 0 to BrowserTab.Tabs.Count - 1 do begin
+                // \93¯\82\94Â\82©\82Ç\82¤\82©
+                if (FActiveContent.Thread.ParentBoard =
+                    TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ParentBoard) then begin
+                    if FActiveContent.Thread <>
+                        TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread then begin
+                        if (MenuItem.Hint = TBrowserRecord(BrowserTab.Tabs.Objects[i])
+                                .Thread.URL) then begin
+                            MoveToURL( MenuItem.Hint);
+                            Exit;
+                        end;
+                    end;
+                end;
+            end;
+        except
+        end;
+       end;
 end;
 end;
-
 procedure TGikoForm.FavoritesURLReplace(oldURLs: TStringList; newURLs: TStringList);
 begin
        FavoriteDM.URLReplace(oldURLs, newURLs);
 procedure TGikoForm.FavoritesURLReplace(oldURLs: TStringList; newURLs: TStringList);
 begin
        FavoriteDM.URLReplace(oldURLs, newURLs);
@@ -6284,10 +6634,15 @@ end;
 
 /// \8dÅ\8f¬\89»\82³\82ê\82é
 procedure TGikoForm.OnMinimize;
 
 /// \8dÅ\8f¬\89»\82³\82ê\82é
 procedure TGikoForm.OnMinimize;
+var
+    doc: IHTMLDocument2;
 begin
        if FActiveContent <> nil then begin
                FIsMinimize := mtMinimizing;
 begin
        if FActiveContent <> nil then begin
                FIsMinimize := mtMinimizing;
-               FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+        doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+        if Assigned(doc) then begin
+               FActiveContent.Thread.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
+        end;
        end;
 end;
 
        end;
 end;
 
@@ -6416,7 +6771,10 @@ begin
                TreeDoubleClick( TreeView.Selected );
        end else if Key = VK_RETURN then begin
                TreeClick( TreeView.Selected );
                TreeDoubleClick( TreeView.Selected );
        end else if Key = VK_RETURN then begin
                TreeClick( TreeView.Selected );
-               TreeView.Selected.Expanded := not TreeView.Selected.Expanded;
+        // \97\9a\97ð\82Ì\8fê\8d\87\81A\8fÁ\82³\82ê\82Ä\82¢\82é\82Ì\82Å\83`\83F\83b\83N\82·\82é
+        if (TreeView.Selected <> nil) then begin
+               TreeView.Selected.Expanded := not TreeView.Selected.Expanded;
+        end;
        end;
 end;
 //! \82¨\8bC\82É\93ü\82è\82ÌMouseDown\83C\83x\83\93\83g
        end;
 end;
 //! \82¨\8bC\82É\93ü\82è\82ÌMouseDown\83C\83x\83\93\83g
@@ -6480,9 +6838,8 @@ end;
 
 procedure TGikoForm.OnResized;
 var
 
 procedure TGikoForm.OnResized;
 var
-       doc                                             : Variant;
+       doc : IHTMLDocument2;
 begin
 begin
-
        FOldFormWidth := Width;
        FIsIgnoreResize := rtNone;
 
        FOldFormWidth := Width;
        FIsIgnoreResize := rtNone;
 
@@ -6497,8 +6854,8 @@ begin
                begin
                        // \8dÅ\8f¬\89»\82Í\8aù\82É\8a®\97¹\82µ\82Ä\82¢\82é (\82Â\82Ü\82è\83^\83X\83N\83o\81[\82©\82ç\83E\83B\83\93\83h\83E\82ð\95\9c\8c³\92\86)
                        if FActiveContent <> nil then begin
                begin
                        // \8dÅ\8f¬\89»\82Í\8aù\82É\8a®\97¹\82µ\82Ä\82¢\82é (\82Â\82Ü\82è\83^\83X\83N\83o\81[\82©\82ç\83E\83B\83\93\83h\83E\82ð\95\9c\8c³\92\86)
                        if FActiveContent <> nil then begin
-                               doc := Idispatch( olevariant(FActiveContent.Browser.ControlInterface).Document) as IHTMLDocument2;
-                               doc.Body.ScrollTop := FActiveContent.Thread.ScrollTop;
+                               doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+                               (doc.body as IHTMLElement2).ScrollTop := FActiveContent.Thread.ScrollTop;
                        end;
                        FIsMinimize := mtNone;
                end;
                        end;
                        FIsMinimize := mtNone;
                end;
@@ -6506,70 +6863,73 @@ begin
 
 end;
 // *************************************************************************
 
 end;
 // *************************************************************************
-//! \82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83}\83E\83X\83A\83b\83v\83C\83x\83\93\83g
+//! \83X\83\8c\83b\83h\83u\83\89\83E\83U\83N\83\8a\83b\83N\83C\83x\83\93\83g
 // *************************************************************************
 function TGikoForm.WebBrowserClick(Sender: TObject): WordBool;
 var
 // *************************************************************************
 function TGikoForm.WebBrowserClick(Sender: TObject): WordBool;
 var
-       p : TPoint;
        e: IHTMLElement;
        e: IHTMLElement;
+    doc : IHTMLDocument2;
+    FOleInPlaceActiveObject: IOleInPlaceActiveObject;
+       p : TPoint;
        AID: string;
        AID: string;
-       stlist : TStringList;
-       i, count, rc : Integer;
-       body : String;
-    limited : boolean;
-begin
-  result := true;
-  try
-       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then
-               FActiveContent.Browser.SetFocus;
-               try
-                       GetCursorPos(p);
-                       p.x := p.x - FActiveContent.Browser.ClientOrigin.x;
-                       p.y := p.y - FActiveContent.Browser.ClientOrigin.y;
-                       e := IHTMLDocument2(FActiveContent.Browser.Document).elementFromPoint(p.x, p.y);
-                       if (Assigned(e)) then begin
-                               if (e.className = 'date') or (e.id = 'date') then begin
-                                       AID := e.innerText;
-                                       if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
-                                               AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
-                       if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
-                               AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
-                        end;
-                                       end else begin
-                                               stlist := TStringList.Create;
-                                               try
-                                                       stList.DelimitedText := AID;
-                                                       AID := '';
-                                                       for i := 0 to stList.Count - 1 do
-                                                               if Length(WideString(stList[i])) = 8 then begin
-                                                                       if GikoSys.NotDateorTimeString(stList[i]) then begin
-                                                                               AID := stList[i];
-                                                                               break;
-                                                                       end;
-                                                               end;
-                                               finally
-                                                       stList.Free;
-                                               end;
-                                       end;
-                    count := GikoSys.GetSameIDResCount(AID, FActiveContent.Thread);
-                    limited := false;
-                    if count > 20 then begin
-                        rc := GikoUtil.MsgBox(Handle,
-                                '20\8cÂ\88È\8fã\82 \82è\82Ü\82·\82ª\81A\82·\82×\82Ä\95\\8e¦\82µ\82Ü\82·\82©\81H',
-                                'ID\83|\83b\83v\83A\83b\83v\8cx\8d\90',
-                                                               MB_YESNO or MB_ICONQUESTION);
-                        limited := rc <> ID_YES;
-                    end;
-                                       body := GikoSys.GetSameIDResAnchor(AID, FActiveContent.Thread, limited);
-                                       FActiveContent.IDAnchorPopup(body);
-                               end;
-                       end;
-               except
+begin
+       result := true;
+    if not Assigned(FActiveContent) then
+        Exit;
+    if not Assigned(FActiveContent.Browser) then
+        Exit;
+
+       try
+               FOleInPlaceActiveObject := FActiveContent.Browser.ControlInterface as IOleInPlaceActiveObject;
+               FOleInPlaceActiveObject.OnFrameWindowActivate(True);
+               GetCursorPos(p);
+
+               p.x := p.x - FActiveContent.Browser.ClientOrigin.x;
+               p.y := p.y - FActiveContent.Browser.ClientOrigin.y;
+
+               doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+               if not Assigned(doc) then
+                       Exit;
+
+               e := doc.elementFromPoint(p.x, p.y);
+               if not Assigned(e) then
+                       Exit;
+
+               if (e.className = 'date') or (e.id = 'date') then begin
+                       AID := GikoSys.ExtructResID(e.innerText);
+            ShowSameIDAncher(AID);
                end;
                end;
-  except
-  end;
+       except
+       end;
 end;
 end;
+procedure TGikoForm.ShowSameIDAncher(const AID: String);
+const
+    LIMIT = 20;
+var
+       numbers : TStringList;
+    limited : Integer;
+begin
+    numbers := TStringList.Create;
+    try
 
 
+        GikoSys.GetSameIDRes(AID, FActiveContent.Thread, numbers);
+        limited := LIMIT;
+        if not (GikoSys.Setting.LimitResCountMessage) then begin
+            limited := -1;
+        end else if (numbers.Count > LIMIT) then begin
+            if (GikoUtil.MsgBox(Handle,
+                    IntToStr(LIMIT) + '\8cÂ\88È\8fã\82 \82è\82Ü\82·\82ª\81A\82·\82×\82Ä\95\\8e¦\82µ\82Ü\82·\82©\81H',
+                    'ID\83|\83b\83v\83A\83b\83v\8cx\8d\90',
+                    MB_YESNO or MB_ICONQUESTION) = ID_YES) then begin
+                limited := -1;
+            end
+        end;
+        FActiveContent.IDAnchorPopup(
+            GikoSys.CreateResAnchor(numbers, FActiveContent.Thread, limited));
+    finally
+        numbers.Free;
+    end;
+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.SelectTimerTimer(Sender: TObject);
 begin
 //\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.SelectTimerTimer(Sender: TObject);
 begin
@@ -6845,10 +7205,11 @@ end;
 
 procedure TGikoForm.BrowserPanelResize(Sender: TObject);
 begin
 
 procedure TGikoForm.BrowserPanelResize(Sender: TObject);
 begin
-       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
-               MoveWindow(FActiveContent.Browser.Handle, 0, 0, BrowserPanel.ClientWidth, BrowserPanel.ClientHeight, false);
-       end;
-
+    if (FIsMinimize <> mtMinimizing) then begin
+       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
+               MoveWindow(FActiveContent.Browser.Handle, 0, 0, BrowserPanel.ClientWidth, BrowserPanel.ClientHeight, false);
+       end;
+    end;
 end;
 procedure TGikoForm.CoolBarResized(Sender: TObject; CoolBar: TCoolBar);
 var
 end;
 procedure TGikoForm.CoolBarResized(Sender: TObject; CoolBar: TCoolBar);
 var
@@ -6955,15 +7316,22 @@ end;
 //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
 procedure TGikoForm.IndividualAbon(Atag, Atype : Integer);
 var
 //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
 procedure TGikoForm.IndividualAbon(Atag, Atype : Integer);
 var
-       ThreadItem      : TThreadItem;
-       ReadList                : TStringList;
-       wordCount               : TWordCount;
+    doc : IHTMLDocument2;
+       ThreadItem : TThreadItem;
+       ReadList : TStringList;
+       wordCount : TWordCount;
 begin
 begin
-       ThreadItem      := GetActiveContent;
-       ReadList                := TStringList.Create;
-       wordCount               := TWordCount.Create;
+    if not Assigned(FActiveContent) then
+        Exit;
+    doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+    if not Assigned(doc) then
+        Exit;
+
+       ThreadItem := GetActiveContent(True);
+       ReadList := TStringList.Create;
+       wordCount := TWordCount.Create;
        try
        try
-               ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+               ThreadItem.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
 {$IFDEF SPAM_FILTER_ENABLED}
                // \83X\83p\83\80\82É\90Ý\92è
                ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
 {$IFDEF SPAM_FILTER_ENABLED}
                // \83X\83p\83\80\82É\90Ý\92è
                ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
@@ -6981,6 +7349,68 @@ begin
        if ThreadItem <> nil then
                InsertBrowserTab( ThreadItem, True );
 end;
        if ThreadItem <> nil then
                InsertBrowserTab( ThreadItem, True );
 end;
+//\93¯\88êID\82ðNG\83\8f\81[\83h\82É\93o\98^
+procedure TGikoForm.AddIDtoNGWord(invisible : boolean);
+var
+    doc : IHTMLDocument2;
+       ThreadItem : TThreadItem;
+       No : Integer;
+{$IFDEF SPAM_FILTER_ENABLED}
+       body : TStringList;
+       ReadList                : TStringList;
+       wordCount               : TWordCount;
+{$ENDIF}
+    id, dateStr: String;
+begin
+       No := KokoPopupMenu.Tag;
+       if No = 0 then Exit;
+       ThreadItem := GikoForm.KokoPopupThreadItem;
+       if ThreadItem = nil then Exit;
+
+    id := GikoSys.GetResID(No, ThreadItem);
+    if (id <> '') and (not IsNoValidID(id)) then begin
+        // \83R\83\81\83\93\83g\82Æ\82µ\82Ä\81A\83X\83\8c\83b\83h\96¼\82Æ\8d¡\93ú\82Ì\93ú\95t\82ð\92Ç\89Á
+        DateTimeToString(dateStr, 'yyyymmdd', Now);
+        id := id + #9'>>add ' + dateStr + ',' + ThreadItem.Title;
+        if (GikoSys.FAbon.AddToken(id, invisible)) then begin
+            GikoSys.FAbon.ReLoadFromNGwordFile;
+            FActiveContent.Repaint := True;
+        end;
+    end else begin
+        ShowMessage('ID\82ð\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½\81B');
+    end;
+{$IFDEF SPAM_FILTER_ENABLED}
+    body := TStringList.Create;
+    try
+        GikoSys.GetSameIDRes(id, ThreadItem, body);
+        ReadList               := TStringList.Create;
+        wordCount              := TWordCount.Create;
+        try
+            // \83X\83p\83\80\82É\90Ý\92è
+            ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
+            for i := 0 to body.Count - 1 do begin
+                GikoSys.SpamCountWord( ReadList[ i ], wordCount );
+                GikoSys.SpamForget( wordCount, False );        // \83n\83\80\82ð\89ð\8f\9c
+                GikoSys.SpamLearn( wordCount, True );          // \83X\83p\83\80\82É\90Ý\92è
+            end;
+        finally
+            wordCount.Free;
+            ReadList.Free;
+        end;
+    finally
+        body.Free;
+    end;
+{$ENDIF}
+    if (FActiveContent.Repaint) then begin
+        doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+
+        if not Assigned(doc) then
+            Exit;
+        ThreadItem.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
+        if ThreadItem <> nil then
+            InsertBrowserTab( ThreadItem, True );
+    end;
+end;
 
 //\93¯\88êID\82Ì\82 \82Ú\81`\82ñ
 procedure TGikoForm.IndividualAbonID(Atype : Integer);
 
 //\93¯\88êID\82Ì\82 \82Ú\81`\82ñ
 procedure TGikoForm.IndividualAbonID(Atype : Integer);
@@ -6993,7 +7423,7 @@ var
 begin
        No := KokoPopupMenu.Tag;
        if No = 0 then Exit;
 begin
        No := KokoPopupMenu.Tag;
        if No = 0 then Exit;
-       ThreadItem := GetActiveContent;
+       ThreadItem := GikoForm.KokoPopupThreadItem;
        if ThreadItem = nil then Exit;
        body := TStringList.Create;
        try
        if ThreadItem = nil then Exit;
        body := TStringList.Create;
        try
@@ -7002,7 +7432,7 @@ begin
                ReadList                := TStringList.Create;
                wordCount               := TWordCount.Create;
                try
                ReadList                := TStringList.Create;
                wordCount               := TWordCount.Create;
                try
-                       ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+                       ThreadItem.ScrollTop := FActiveContent.Browser.OleObject.Document.Body.ScrollTop;
 {$IFDEF SPAM_FILTER_ENABLED}
                        // \83X\83p\83\80\82É\90Ý\92è
                        ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
 {$IFDEF SPAM_FILTER_ENABLED}
                        // \83X\83p\83\80\82É\90Ý\92è
                        ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
@@ -7032,15 +7462,17 @@ end;
 procedure TGikoForm.KokoPopupMenuPopup(Sender: TObject);
 var
        firstElement: IHTMLElement;
 procedure TGikoForm.KokoPopupMenuPopup(Sender: TObject);
 var
        firstElement: IHTMLElement;
-       document: IHTMLDocument2;
+       doc: IHTMLDocument2;
 begin
 begin
-       document := FActiveContent.Browser.Document as IHTMLDocument2;
-       if Assigned(document) then
-               firstElement := document.all.item('idSearch', 0) as IHTMLElement;
-               if Assigned(firstElement) then
-                       if firstElement.style.visibility <> 'hidden' then
-                               firstElement.style.visibility := 'hidden';
-
+    try
+       doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+           if Assigned(doc) then
+                   firstElement := doc.all.item('idSearch', 0) as IHTMLElement;
+               if Assigned(firstElement) then
+                       if firstElement.style.visibility <> 'hidden' then
+                               firstElement.style.visibility := 'hidden';
+    except
+    end;
 end;
 
 procedure TGikoForm.RepaintAllTabsBrowser();
 end;
 
 procedure TGikoForm.RepaintAllTabsBrowser();
@@ -7152,7 +7584,13 @@ begin
                                end;
                        end;
                end;
                                end;
                        end;
                end;
-       end;
+       end else begin
+        // Explorer\82ÌD&D\82ð\8eó\82¯\82é\82Æ\82Ì\94ñ\83A\83N\83e\83B\83u
+        if Msg.message = WM_DROPFILES then begin
+            AcceptDropFiles(Msg);
+            Handled := True;
+        end;
+    end;
 end;
 // *************************************************************************
 //! \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\83A\83N\83e\83B\83u\82Å\82È\82­\82È\82Á\82½\82Æ\82«\82Ì\83C\83x\83\93\83g
 end;
 // *************************************************************************
 //! \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\83A\83N\83e\83B\83u\82Å\82È\82­\82È\82Á\82½\82Æ\82«\82Ì\83C\83x\83\93\83g
@@ -7162,12 +7600,11 @@ begin
        Application.ProcessMessages;
        if not Application.Terminated then begin
                if PreviewTimer.Enabled then
        Application.ProcessMessages;
        if not Application.Terminated then begin
                if PreviewTimer.Enabled then
-                       PreviewTimer.Enabled := False;
-               //\83t\83H\81[\83J\83X\82ª\91¼\82Ì\83A\83v\83\8a\82É\95Ï\82í\82Á\82½\82Æ\82«\82É\83q\83\93\83g\82ð\8fÁ\8b\8e
-               if FHint <> nil then begin
-                       FHint.ReleaseHandle;
-                       FHint.ClearAllRes;
-               end;
+               PreviewTimer.Enabled := False;
+               //\83t\83H\81[\83J\83X\82ª\91¼\82Ì\83A\83v\83\8a\82É\95Ï\82í\82Á\82½\82Æ\82«\82É\83|\83b\83v\83A\83b\83v\8fÁ\8b\8e
+        if (FResPopupBrowser <> nil) then
+            FResPopupBrowser.Clear;
+
                //\83v\83\8c\83r\83\85\81[\82ð\89B\82·
                if FPreviewBrowser <> nil then
                        ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
                //\83v\83\8c\83r\83\85\81[\82ð\89B\82·
                if FPreviewBrowser <> nil then
                        ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
@@ -7216,7 +7653,9 @@ begin
        BrowserNullTab := TBrowserRecord.Create;
        BrowserNullTab.Browser := Browser;
        BrowserNullTab.Browser.Navigate(BLANK_HTML);
        BrowserNullTab := TBrowserRecord.Create;
        BrowserNullTab.Browser := Browser;
        BrowserNullTab.Browser.Navigate(BLANK_HTML);
+
        FBrowsers := TList.Create;
        FBrowsers := TList.Create;
+
        for i := 0 to count -1 do begin
                FBrowsers.Add(TWebBrowser.Create(BrowserPanel));
                newBrowser := FBrowsers[FBrowsers.Count - 1];
        for i := 0 to count -1 do begin
                FBrowsers.Add(TWebBrowser.Create(BrowserPanel));
                newBrowser := FBrowsers[FBrowsers.Count - 1];
@@ -7232,9 +7671,12 @@ begin
                newBrowser.OnStatusTextChange   := BrowserStatusTextChange;
                newBrowser.Navigate(BLANK_HTML);
                ShowWindow(newBrowser.Handle, SW_HIDE);
                newBrowser.OnStatusTextChange   := BrowserStatusTextChange;
                newBrowser.Navigate(BLANK_HTML);
                ShowWindow(newBrowser.Handle, SW_HIDE);
+        GikoSys.ShowRefCount('Browser' + IntToStr(i), newBrowser.ControlInterface);
+        GikoSys.ShowRefCount('Document' + IntToStr(i), newBrowser.ControlInterface.Document);
        end;
        BrowserNullTab.Browser.BringToFront;
        ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
        end;
        BrowserNullTab.Browser.BringToFront;
        ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
+
        //\8bN\93®\8e\9e\82É\83^\83u\8e©\93®\95\9c\8c³\82ð\93ü\82ê\82Ä\82¢\82é\82Æ\81A\8bó\83y\81[\83W\97p\82ÌBrowser\82Ì
        //\95`\89æ\82ª\8fI\82í\82Á\82Ä\82¢\82È\82­\82Ä\81A\83N\83\8a\83b\83N\83C\83x\83\93\83g\82Ì\90Ý\92è\93\99\82É\93Ë\93ü\82·\82é\82Ì\82Å
        //\82±\82±\82Å\8fI\82í\82ç\82¹\82Ä\82¨\82­
        //\8bN\93®\8e\9e\82É\83^\83u\8e©\93®\95\9c\8c³\82ð\93ü\82ê\82Ä\82¢\82é\82Æ\81A\8bó\83y\81[\83W\97p\82ÌBrowser\82Ì
        //\95`\89æ\82ª\8fI\82í\82Á\82Ä\82¢\82È\82­\82Ä\81A\83N\83\8a\83b\83N\83C\83x\83\93\83g\82Ì\90Ý\92è\93\99\82É\93Ë\93ü\82·\82é\82Ì\82Å
        //\82±\82±\82Å\8fI\82í\82ç\82¹\82Ä\82¨\82­
@@ -7404,10 +7846,17 @@ begin
 end;
 
 procedure TGikoForm.TaskTrayIconMessage(var Msg: TMsg);
 end;
 
 procedure TGikoForm.TaskTrayIconMessage(var Msg: TMsg);
+var
+    p: TPoint;
 begin
     //  \8d\83N\83\8a\83b\83N\82È\82ç\95\9c\8c³\82·\82é
     if  (Msg.wParam = WM_LBUTTONUP) then  begin
         UnStoredTaskTray;
 begin
     //  \8d\83N\83\8a\83b\83N\82È\82ç\95\9c\8c³\82·\82é
     if  (Msg.wParam = WM_LBUTTONUP) then  begin
         UnStoredTaskTray;
+    end else if (Msg.wParam=WM_RBUTTONUP) then begin
+        // \89E\83N\83\8a\83b\83N\82È\82ç\8fI\97¹\82·\82é
+        GetCursorPos ( p );
+        SetForegroundWindow ( Self.Handle );
+        TaskTrayPopupMenu.Popup ( p.X, p.Y );
     end;
 end;
 //! \83^\83X\83N\83g\83\8c\83C\82É\83A\83C\83R\83\93\93o\98^\81\95\83t\83H\81[\83\80\89B\82µ
     end;
 end;
 //! \83^\83X\83N\83g\83\8c\83C\82É\83A\83C\83R\83\93\93o\98^\81\95\83t\83H\81[\83\80\89B\82µ
@@ -7465,10 +7914,189 @@ begin
 
     end;
 end;
 
     end;
 end;
+//! \83|\83b\83v\83A\83b\83v\83u\83\89\83E\83U\8dì\90¬
+procedure TGikoForm.CreateResPopupBrowser;
+begin
+    if (FResPopupBrowser = nil) then begin
+        FResPopupBrowser := TResPopupBrowser.Create(BrowserPanel);
+    end;
+end;
+//! ListView\82ÌD&D\8eó\82¯\8eæ\82è
+procedure TGikoForm.AcceptDropFiles(var Msg: TMsg);
+var
+    FileName: Array[0..MAX_PATH] of Char;
+    Cnt, K: Integer;
+    Board: TBoard;
+    LogFolder: String;
+    datList: TStringList;
+begin
+    // \95\\8e¦\82µ\82Ä\82¢\82é\82Ì\94Â\82Ì\82Æ\82«\88È\8aO\82Í\8b\91\94Û
+    if GetActiveList is TBoard then begin
+        Board := TBoard(GetActiveList);
+        if MsgBox(Handle, Board.Title
+            + ' \94Â\82É\93ü\82ê\82Ä\82¢\82¢\82Å\82·\82©\81H', '\83M\83R\83i\83r', MB_YESNO or MB_ICONQUESTION) = IDYES      then begin
+            // \94Â\82Ì\8e\9e\82Í\81A\83\8d\83O\83t\83H\83\8b\83_\82É\83R\83s\81[\82µ\82Ä\82Í\82®\82ê\83\8d\83O\91Î\89\9e\82Æ\93¯\82\8f\88\97\9d\81H
+            datList := TStringList.Create;
+            try
+                Cnt := DragQueryFile(Msg.WParam, $FFFFFFFF, FileName, SizeOf(FileName));
+                for K := 0 to Cnt - 1 do begin
+                    DragQueryFile(Msg.WParam, K, FileName, SizeOf(FileName));
+                    // FileName\82Édrop\82³\82ê\82½\83t\83@\83C\83\8b\96¼\82ª\93ü\82Á\82Ä\82¢\82é\82Ì\82Å\81A\82±\82±\82Å\89½\82ç\82©\82Ì\8f\88\97\9d\82ð\82·\82é\81B\82½\82Æ\82¦\82Î\8e\9f\82Ì\8ds
+                    // \83t\83@\83C\83\8b\82Ì\83`\83F\83b\83N
+                    if (isValidFile(FileName)) then begin
+                        LogFolder := ExtractFilePath(Board.FilePath);
+                        if (FileExists( LogFolder + ExtractFileName(FileName))) then begin
+                            GikoUtil.MsgBox(Handle, LogFolder + '\82É' + ExtractFileName(FileName) + '\82ª\8aù\82É\91\8dÝ\82µ\82Ü\82·\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+                        end else begin
+                            if (not DirectoryExists(LogFolder)) then begin
+                                if (not GikoSys.ForceDirectoriesEx(LogFolder) ) then begin
+                                    GikoUtil.MsgBox(Handle, LogFolder + '\82Ì\90\90¬\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+                                end;
+                            end;
+                            if (not Windows.CopyFile(FileName,  PChar(LogFolder + ExtractFileName(FileName)), true)) then begin
+                                GikoUtil.MsgBox(Handle, FileName + '\82Ì\83R\83s\81[\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+                            end else begin
+                                datList.Add(ExtractFileName(FileName));
+                            end;
+                        end;
+                    end;
+                end;
+                DragFinish(Msg.WParam);
+                if (datList.Count > 0) then begin
+                    GikoSys.AddOutofIndexDat(Board, datList, False);
+                    ShowMessage(IntToStr(datList.Count) + '\8cÂ\82Ìdat\83t\83@\83C\83\8b\82ª\83R\83s\81[\82³\82ê\82Ü\82µ\82½\81B' );
+                       if GikoForm.TreeView.Visible then begin
+                               GikoForm.TreeView.Refresh;
+                    end;
+                           if GikoForm.ListView.Visible then begin
+                               UpdateListView();
+                    end;
+                end else begin
+                    ShowMessage('\88ê\82Â\82à\83R\83s\81[\82³\82ê\82Ü\82¹\82ñ\82Å\82µ\82½\81B' );
+                end;
+            finally
+                datList.Free;
+            end;
+
+        end;
+    end else begin
+        ShowMessage('\94Â\82ð\95\\8e¦\82µ\82Ä\82­\82¾\82³\82¢\81B');
+    end;
+end;
+procedure TGikoForm.UpdateListView();
+begin
+    //ListView\82Å\82±\82Ì\83X\83\8c\82ª\8aÜ\82Ü\82ê\82é\94Â\82ð\95\\8e¦\82µ\82Ä\82¢\82é\82Æ\82«\82Ì\8dX\90V\8f\88\97\9d
+    if (ActiveList <> nil) and (ActiveList is TBoard) then begin
+        TBoard(ActiveList).LogThreadCount := TBoard(ActiveList).GetLogThreadCount;
+        TBoard(ActiveList).NewThreadCount := TBoard(ActiveList).GetNewThreadCount;
+        TBoard(ActiveList).UserThreadCount:= TBoard(ActiveList).GetUserThreadCount;
+        //ListView\82Ì\83A\83C\83e\83\80\82Ì\8cÂ\90\94\82à\8dX\90V
+        case GikoForm.ViewType of
+            gvtAll: ListView.Items.Count := TBoard(ActiveList).Count;
+            gvtLog: ListView.Items.Count := TBoard(ActiveList).LogThreadCount;
+            gvtNew: ListView.Items.Count := TBoard(ActiveList).NewThreadCount;
+            gvtArch: ListView.Items.Count := TBoard(ActiveList).ArchiveThreadCount;
+            gvtLive: ListView.Items.Count := TBoard(ActiveList).LiveThreadCount;
+            gvtUser: ListView.Items.Count := TBoard(ActiveList).UserThreadCount;
+        end;
+    end;
+    ListView.Refresh;
+end;
+//! \83t\83@\83C\83\8b\83`\83F\83b\83N
+function TGikoForm.isValidFile(FileName: String) : boolean;
+var
+    dt: TDateTime;
+begin
+    Result := True;
+    // \91\8dÝ\82·\82é\82©\81A\8ag\92£\8eqdat\81A\83t\83@\83C\83\8b\96¼
+    if ( not FileExists(FileName) ) then begin
+        Result := False;
+        GikoUtil.MsgBox(Handle, FileName + '\82Í\91\8dÝ\82µ\82Ü\82¹\82ñ\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+    end else if (ExtractFileExt(ExtractFileName(FileName)) <> '.dat' ) then begin
+        Result := False;
+        GikoUtil.MsgBox(Handle, ExtractFileName(FileName) + '\82Ì\8ag\92£\8eq\82ª".dat"\82Å\82 \82è\82Ü\82¹\82ñ\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+    end else begin
+        // \83\8d\83O\83t\83@\83C\83\8b\82Ì\8ag\92£\8eq\82ð\82Í\82¸\82µ\82½\82à\82Ì\82ª\83X\83\8c\8dì\90¬\93ú\8e\9e
+        try
+            dt := GikoSys.GetCreateDateFromName(ExtractFileName(FileName));
+            if ((UnixToDateTime(ZERO_DATE) + OffsetFromUTC) = dt) then begin
+                Result := False;
+                GikoUtil.MsgBox(Handle, ExtractFileName(FileName) + '\82Ì\83t\83@\83C\83\8b\96¼\82ª\95s\90³\82Å\82·\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+            end;
+        except
+            Result := False;
+            GikoUtil.MsgBox(Handle, ExtractFileName(FileName) + '\82Ì\83t\83@\83C\83\8b\96¼\82ª\95s\90³\82Å\82·\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
+        end;
+    end;
+end;
+
+procedure TGikoForm.ResPopupClearTimerTimer(Sender: TObject);
+begin
+    ResPopupClearTimer.Enabled := False;
+    if ResPopupClearTimer.Tag = 0 then begin
+        FResPopupBrowser.Clear;
+    end else begin
+        FResPopupBrowser.CurrentBrowser.ChildClear;
+    end;
+end;
+//! \83A\83C\83R\83\93\93Ç\82Ý\8d\9e\82Ý
+procedure TGikoForm.LoadIcon();
+const
+    ICONI6 = 'icon16.bmp';
+    ICON32 = 'icon32.bmp';
+    ICONSTAT  = 'state_icon.bmp';
+    ICONMES = 'message_icon.bmp';
+    ICONADD = 'address_icon.bmp';
+    ICONITEM = 'item_icon.bmp';
+    ICONTOOL = 'hottoolbar_icon.bmp';
+begin
+    if FileExists(GikoSys.Setting.GetAppDir + ICONI6) then begin
+        ItemIcon16.Clear;
+        ItemIcon16.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONI6, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICON32) then begin
+        ItemIcon32.Clear;
+        ItemIcon32.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICON32, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONSTAT) then begin
+        StateIconImageList.Clear;
+        StateIconImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONSTAT, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONMES) then begin
+        MessageImageList.Clear;
+        MessageImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONMES, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONADD) then begin
+        AddressImageList.Clear;
+        AddressImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONADD, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONITEM) then begin
+        ItemImageList.Clear;
+        ItemImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONITEM, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONTOOL) then begin
+        HotToobarImageList.Clear;
+        HotToobarImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONTOOL, clPurple);
+    end;
+end;
+//! \83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\93Ç\82Ý\8d\9e\82Ý
+procedure TGikoForm.LoadPopupMenu();
+begin
+
+
+end;
 
 initialization
                                OleInitialize(nil);
 finalization
                                OleUninitialize;
 
 
 initialization
                                OleInitialize(nil);
 finalization
                                OleUninitialize;
 
+
 end.
 end.