OSDN Git Service

HEAD,SETTING表示方法を変更
[gikonavigoeson/gikonavi.git] / Editor.pas
1 unit Editor;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7         Dialogs, StdCtrls, ComCtrls, ExtCtrls, ToolWin, Menus, OleCtrls, Registry,
8 {$IF Defined(DELPRO) }
9         SHDocVw,
10 {$ELSE}
11         SHDocVw_TLB,
12 {$IFEND}
13         ActiveX, {HTTPApp,} YofUtils, Trip, IniFiles, StrUtils,
14         GikoSystem, GikoUtil, ImgList, Clipbrd, BoardGroup,
15         IdAntiFreezeBase,       IdAntiFreeze, IdBaseComponent, IdComponent,
16         IdTCPConnection, IdTCPClient, IdHTTP, ActnList, StdActns, IdIntercept,
17         IdLogBase, IdLogDebug, IdException, DateUtils, MojuUtils, bmRegExp,
18         LocalRuleShow;
19
20 type
21 //      TSetLayeredWindowAttributes = function(wnd: HWND; crKey: DWORD; bAlpha: BYTE; dwFlag: DWORD): Boolean; stdcall;
22         //\8f\91\82«\8d\9e\82Ý\96ß\82è\92l\83^\83C\83v
23         TGikoResultType = (grtOK, grtCookie, grtCheck, grtError);
24
25         TEditorForm = class(TForm)
26                 MainMenu: TMainMenu;
27                 FileMenu: TMenuItem;
28                 PostMessage: TMenuItem;
29                 SaveMessage: TMenuItem;
30                 CloseMenu: TMenuItem;
31                 N01: TMenuItem;
32                 StatusBar: TStatusBar;
33                 EditorPage: TPageControl;
34                 EditorTab: TTabSheet;
35                 PreviewTab: TTabSheet;
36                 Browser: TWebBrowser;
37                 EditMenu: TMenuItem;
38                 UndoMenu: TMenuItem;
39                 CutMenu: TMenuItem;
40                 CopyMenu: TMenuItem;
41                 PasteMenu: TMenuItem;
42                 N02: TMenuItem;
43                 ToolBarImageList: TImageList;
44                 HotToobarImageList: TImageList;
45                 BodyEdit: TMemo;
46                 NameBasePanel: TPanel;
47                 NameLabel: TLabel;
48                 MailLabel: TLabel;
49                 NameComboBox: TComboBox;
50                 MailComboBox: TComboBox;
51                 ToolBar: TToolBar;
52                 SendToolButton: TToolButton;
53                 OutBoxToolButton: TToolButton;
54                 ToolButton5: TToolButton;
55                 UndoToolButton: TToolButton;
56                 CutToolButton: TToolButton;
57                 CopyToolButton: TToolButton;
58                 PasteToolButton: TToolButton;
59                 ToolButton3: TToolButton;
60                 TransToolButton: TToolButton;
61                 TopToolButton: TToolButton;
62                 Indy: TIdHTTP;
63                 IdAntiFreeze: TIdAntiFreeze;
64                 ToolButton1: TToolButton;
65                 ToolButton2: TToolButton;
66                 ActionList: TActionList;
67                 SendAction: TAction;
68                 SaveAction: TAction;
69                 CloseAction: TAction;
70                 UndoAction: TAction;
71                 CutAction: TAction;
72                 CopyAction: TAction;
73                 PasteAction: TAction;
74                 AbortAction: TAction;
75                 TopAction: TAction;
76                 Show1: TMenuItem;
77                 T1: TMenuItem;
78                 N1: TMenuItem;
79                 S1: TMenuItem;
80                 SageCheckBox: TCheckBox;
81                 IdLogDebug: TIdLogDebug;
82                 TransAction: TAction;
83                 A1: TMenuItem;
84                 KotehanCheckBox: TCheckBox;
85                 TitlePanel: TPanel;
86                 Label1: TLabel;
87                 TitleEdit: TEdit;
88                 SelectAllAction: TAction;
89                 N2: TMenuItem;
90                 SelectAll1: TMenuItem;
91     Timer1: TTimer;
92     QuotePasteAction: TAction;
93     QuotePasteMenuItem: TMenuItem;
94     C1: TMenuItem;
95     SpaceToNBSPAction: TAction;
96     AmpToCharRefAction: TAction;
97     SpaceTabnbsp1: TMenuItem;
98     amp1: TMenuItem;
99     SettingTXT1: TMenuItem;
100     HEADTXT1: TMenuItem;
101                 procedure EditorPageChange(Sender: TObject);
102                 procedure FormCreate(Sender: TObject);
103                 procedure BrowserStatusTextChange(Sender: TObject;
104                         const Text: WideString);
105                 procedure FormClose(Sender: TObject; var Action: TCloseAction);
106                 procedure FormDestroy(Sender: TObject);
107                 procedure SendActionExecute(Sender: TObject);
108                 procedure SaveActionExecute(Sender: TObject);
109                 procedure AbortActionExecute(Sender: TObject);
110                 procedure CloseActionExecute(Sender: TObject);
111                 procedure UndoActionExecute(Sender: TObject);
112                 procedure CutActionExecute(Sender: TObject);
113                 procedure CopyActionExecute(Sender: TObject);
114                 procedure PasteActionExecute(Sender: TObject);
115                 procedure SendActionUpdate(Sender: TObject);
116                 procedure SaveActionUpdate(Sender: TObject);
117                 procedure CloseActionUpdate(Sender: TObject);
118                 procedure UndoActionUpdate(Sender: TObject);
119                 procedure CutActionUpdate(Sender: TObject);
120                 procedure CopyActionUpdate(Sender: TObject);
121                 procedure PasteActionUpdate(Sender: TObject);
122                 procedure TopActionExecute(Sender: TObject);
123                 procedure TopActionUpdate(Sender: TObject);
124                 procedure SageCheckBoxClick(Sender: TObject);
125                 procedure MailComboBoxChange(Sender: TObject);
126                 procedure TransActionExecute(Sender: TObject);
127                 procedure TransActionUpdate(Sender: TObject);
128                 procedure IdLogDebugReceive(ASender: TIdConnectionIntercept;
129                         AStream: TStream);
130                 procedure IdLogDebugSend(ASender: TIdConnectionIntercept;
131                         AStream: TStream);
132                 procedure SelectAllActionExecute(Sender: TObject);
133     procedure StatusBarResize(Sender: TObject);
134     procedure Timer1Timer(Sender: TObject);
135     procedure FormActivate(Sender: TObject);
136     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
137                 procedure QuotePasteActionExecute(Sender: TObject);
138     procedure SpaceToNBSPActionExecute(Sender: TObject);
139     procedure AmpToCharRefActionExecute(Sender: TObject);
140     procedure SettingTXT1Click(Sender: TObject);
141     procedure HEADTXT1Click(Sender: TObject);
142         private
143                 FThreadItem: TThreadItem;
144                 FBoard: TBoard;
145                 FNameComboEdit: THandle;
146                 FMailComboEdit: THandle;
147                 FAbort: Boolean;
148                 FWork: Boolean;
149                 FStatusCode: Integer;
150                 FDebugStrReceive: string;
151                 FDebugStrSend: string;
152         FSambaTime: TDateTime;
153         FHost: string;
154                 FNow: TDateTime;
155                 procedure Preview;
156                 function RepHtml(s: string): string;
157                 function Check: Boolean;
158                 procedure SetNameList(sName, sMail: string);
159 //              procedure Send(SendType: TGikoSendType; SPID: string; PON: string; FirstWriting: Boolean);
160                 procedure Send(SPID: string; PON: string; FirstWriting: Boolean);
161
162                 function GetActiveControlHandle: THandle;
163 //              function GetSendData: string;
164 //              procedure GetSendData(Source: TStringStream);
165                 procedure GetSendData(Source: TStringStream);
166                 procedure SaveSendFile;
167                 procedure SetContent(Content: string);
168                 function GetSPID(CookieLine: string): string;
169                 function GetPON(CookieLine: string): string;
170                 function GetResultType(ResponseText: string): TGikoResultType;
171         procedure ReadSambaTime(const AHost: string);
172         procedure WriteSambaTime(const AHost: string; ATime: TDateTime);
173         function ReadSettingTime(const AHost: string): Integer;
174         function CheckSambaTime(const AHost: string; ATime: TDateTime): Boolean;
175                                 procedure SetSamba24(AURL: string);
176                 /// \88ø\97p\95\84\82Ì\8eæ\93¾
177                 function GetOEIndentChar : string;
178                 /// \96{\95\82Ì\8eæ\93¾
179                 function GetBody : string;
180         protected
181                 procedure CreateParams(var Params: TCreateParams); override;
182         public
183                 FBBSID: String;
184                 procedure SetFont;
185                 procedure SetThreadItem(Item: TThreadItem);
186                 procedure SetBoard(Item: TBoard);
187                 property BBSID: string read FBBSID write FBBSID;
188         end;
189
190 implementation
191
192 uses
193         Giko, ItemDownload;
194 const
195         CAPTION_NAME_NEW: string = '\83M\83R\83i\83\83X\83\8c\97§\82Ä\83G\83f\83B\83^';
196         CAPTION_NAME_RES: string = '\83M\83R\83i\83\83\8c\83X\83G\83f\83B\83^';
197
198     // \83G\83f\83B\83b\83g\83E\83B\83\93\83h\83E\82ð\89E\89º\82É\82¸\82ç\82µ\82Ä\8aJ\82­\88Ú\93®\97Ê
199     WINDOWMOVE_H = 30;
200     WINDOWMOVE_V = 30;
201
202         //DAX\82³\82ñ±Ø¶ÞÄ!(\81L\81¤\81M)
203         READCGI_ERR                     = '-ERR';
204         READCGI_INCR            = '-INCR';
205         READCGI_OK                      = '+OK';
206         READCGI_PARTIAL = '+PARTIAL';
207         READCGI_ERR_FOUND_KAKO  = '-ERR \89ß\8b\8e\83\8d\83O\91q\8cÉ\82Å\94­\8c©';
208         READCGI_ERR_NOT_HTML            = '-ERR html\89»\91Ò\82¿';
209         READCGI_ERR_NOT_FOUND           = '-ERR \82»\82ñ\82È\94Âor\83X\83\8c\83b\83h\82È\82¢\82Å\82·\81B';
210         READCGI_ERR_ABONE                               = '-ERR \82Ç\82±\82©\82Å\82 \82Ú\81[\82ñ\82ª\82 \82Á\82½\82Ý\82½\82¢\82Å\82·\81B';
211         READCGI_ERR_TIMEOUT                     = '-ERR \8ew\92è\8e\9e\8aÔ\82ª\89ß\82¬\82Ü\82µ\82½\81B';
212         READCGI_ERR_CANTUSE                     = '-ERR \82à\82¤\81@\82Â\82©\82¦\82Ü\82¹\82ñ';
213         RES2CH_TRUE                             = '<!-- 2ch_X:true -->';
214         RES2CH_FALSE                    = '<!-- 2ch_X:false -->';
215         RES2CH_ERROR                    = '<!-- 2ch_X:error -->';
216         RES2CH_CHECK                    = '<!-- 2ch_X:check -->';
217         RES2CH_COOKIE                   = '<!-- 2ch_X:cookie -->';
218
219
220         BBS2CH_NAME:                                     string = '\82Q\82¿\82á\82ñ\82Ë\82é';
221         BBS2CH_LOG_FOLDER:               string = '2ch';
222         EXTERNAL_LOG_FOLDER:            string  = 'exboard';
223
224         FOLDER_INI_FILENAME:     string = 'Folder.ini';
225         FOLDER_INDEX_FILENAME: string   = 'Folder.idx';
226         SUBJECT_FILENAME:                       string  = 'subject.txt';
227         PATH_DELIM:                                             string  = '\';
228
229
230 type
231         TSelection = record
232                 StartPos, EndPos: Integer;
233         end;
234
235 {$R *.DFM}
236
237 {constructor TEditorForm.Create(AOwner: TComponent; Item: TBoard);
238 begin
239         inherited Create(AOwner);
240 end;}
241
242 procedure TEditorForm.CreateParams(var Params: TCreateParams);
243 begin
244         inherited;
245         if FormStyle in [fsNormal, fsStayOnTop] then
246                 if BorderStyle in [bsSingle, bsSizeable] then begin
247                         Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
248                         Params.WndParent := 0;
249                 end;
250 end;
251
252 {procedure TEditorForm.CreateParams(var Params: TCreateParams);
253 begin
254         inherited CreateParams(Params);
255         Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
256 end;}
257
258 procedure TEditorForm.FormCreate(Sender: TObject);
259 var
260         wp: TWindowPlacement;
261                 hUser32 : HINST;
262 begin
263         FWork := False;
264         Browser.Navigate('about:blank');
265
266         FBoard := nil;
267         FThreadItem := nil;
268
269         //\83E\83B\83\93\83h\83E\82Ì\88Ê\92u\90Ý\92è
270         wp.length := sizeof(wp);
271         wp.rcNormalPosition.Top := GikoSys.Setting.EditWindowTop;
272         wp.rcNormalPosition.Left := GikoSys.Setting.EditWindowLeft;
273
274         wp.rcNormalPosition.Bottom := GikoSys.Setting.EditWindowTop + GikoSys.Setting.EditWindowHeight;
275         wp.rcNormalPosition.Right := GikoSys.Setting.EditWindowLeft + GikoSys.Setting.EditWindowWidth;
276         wp.showCmd := SW_HIDE;
277         SetWindowPlacement(Handle, @wp);
278
279         if GikoSys.Setting.EditWindowMax then
280                 WindowState := wsMaximized;
281
282         //\83E\83B\83\93\83h\83E\82ª\89æ\96Ê\8aO\82È\82ç\89æ\96Ê\93à\82É\88Ú\93®\82·\82é
283         if (Left + Width) > Screen.Width then
284 //              Left := Screen.Width - Width;
285                 Left := 0;
286         if (Top + Height) > Screen.Height then
287 //              Top := Screen.Height - Height;
288                 Top := 0;
289         if Left < 0 then
290                 Left := 0;
291         if Top < 0 then
292                 Top := 0;
293
294     //\8c»\8dÝ\82Ì\83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82ð\95Û\91
295     GikoSys.Setting.EditWindowTop := Top  + WINDOWMOVE_V;   // \8e\9f\82É\8aJ\82­\83E\83B\83\93\83h\83E\82Í
296     GikoSys.Setting.EditWindowLeft := Left + WINDOWMOVE_H;  // \81@\81@\81@\89E\8eÎ\82ß\89º\82É\82¸\82ç\82·
297     //\83E\83B\83\93\83h\83E\82Ì\95\9d\82Æ\8d\82\82³\82ª\8f¬\82³\82·\82¬\82¢\82ê\82Î\8c³\82É\96ß\82·
298         if GikoSys.Setting.EditWindowHeight < 144 then
299                 Height := 400;
300         if GikoSys.Setting.EditWindowWidth < 144 then
301                 Width := 640;
302
303         EditorPage.ActivePage := EditorTab;
304         FNameComboEdit := GetWindow(NameComboBox.Handle, GW_CHILD);
305         FMailComboEdit := GetWindow(MailComboBox.Handle, GW_CHILD);
306         NameComboBox.Items.Assign(GikoSys.Setting.NameList);
307         MailComboBox.Items.Assign(GikoSys.Setting.MailList);
308         SetFont;
309         hUser32 := 0;
310         try
311                 try
312                         hUser32 := LoadLibrary('User32.dll');
313                         if hUser32 <> 0 then
314                                 TransAction.Enabled := true
315                         else
316                                 TransAction.Enabled := false;
317                 except
318                 TransAction.Enabled := false;
319                 end;
320         finally
321                 FreeLibrary(hUser32);
322         end;
323
324     // \83E\83B\83\93\83h\83E\82Ì\83X\83e\83C\8fó\91Ô
325         if GikoSys.Setting.EditWindowStay then begin    // \83X\83e\83C\8fó\91Ô
326                 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
327                 TopAction.Checked := true;
328                 TopToolButton.Down := true;
329         end else begin                                  // \83X\83e\83C\82µ\82È\82¢
330                 SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
331                 TopAction.Checked := false;
332                 TopToolButton.Down := false;
333         end;
334
335     // \83E\83B\83\93\83h\83E\82Ì\94¼\93§\96¾\8fó\91Ô
336         if(GikoSys.Setting.EditWindowTranslucent) and (TransAction.Enabled) then begin // \94¼\93§\96¾\81i\83g\83\89\83\93\83X\83\8b\81[\83Z\83\93\83g\81j\8fó\91Ô
337         AlphaBlend := true;
338         TransAction.Checked := true;
339         TransToolButton.Down := true;
340     end else begin                                      // \95s\93§\96¾
341         AlphaBlend := false;
342         TransAction.Checked := false;
343         TransToolButton.Down := false;
344     end;
345         // \94¼\93§\96¾\8fó\91Ô\82Ì\95Û\91
346         GikoSys.Setting.EditWindowTranslucent := TransAction.Checked;
347
348         SpaceToNBSPAction.Checked               := GikoSys.Setting.SpaceToNBSP;
349         AmpToCharRefAction.Checked      := GikoSys.Setting.AmpToCharRef;
350 end;
351
352 procedure TEditorForm.SetBoard(Item: TBoard);
353 begin
354         FBoard := Item;
355         Caption := CAPTION_NAME_NEW + ' - [' + Item.Title + ']';
356         NameComboBox.Text := FBoard.KotehanName;
357         MailComboBox.Text := FBoard.KotehanMail;
358         SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
359         TitlePanel.Visible := True;
360     SetSamba24('');
361 end;
362
363 procedure TEditorForm.SetThreadItem(Item: TThreadItem);
364 begin
365         FThreadItem := Item;
366         Caption := CAPTION_NAME_RES + ' - [' + FThreadItem.Title + ']';
367         NameComboBox.Text := FThreadItem.ParentBoard.KotehanName;
368         MailComboBox.Text := FThreadItem.ParentBoard.KotehanMail;
369         SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
370         TitlePanel.Visible := False;
371     SetSamba24(FThreadItem.ParentBoard.URL);
372 end;
373
374 function TEditorForm.GetBody : string;
375 var
376         body            : string;
377         regexp  : TAWKStr;
378 begin
379
380         body := BodyEdit.Text;
381         if AmpToCharRefAction.Checked then
382                 // & \82Ì\92u\8a·\82Í\88ê\94Ô\8dÅ\8f\89\82É\82â\82é\82±\82Æ
383                 body := CustomStringReplace( body, '&', '&amp;' );
384         if SpaceToNBSPAction.Checked then begin
385                 body := CustomStringReplace( body, #09, '&nbsp;&nbsp;&nbsp;&nbsp;' );
386                 body := CustomStringReplace( body, '  ', '&nbsp;&nbsp;' );
387                 body := CustomStringReplace( body, '&nbsp; ', '&nbsp;&nbsp;' );
388                 regexp := TAWKStr.Create( nil );
389                 try
390                         regexp.RegExp := '^ ';
391                         regexp.GSub( '\&nbsp;', body );
392                 finally
393                         regexp.Free;
394                 end;
395         end;
396
397         Result  := body;
398
399 end;
400
401 procedure TEditorForm.SetFont;
402 begin
403         BodyEdit.Font.Name := GikoSys.Setting.EditorFontName;
404         BodyEdit.Font.Size := GikoSys.Setting.EditorFontSize;
405         BodyEdit.Font.Color := GikoSys.Setting.EditorFontColor;
406         BodyEdit.Color := GikoSys.Setting.EditorBackColor;
407 end;
408
409 procedure TEditorForm.Preview;
410 var
411         Title: string;
412         No: string;
413         Mail: string;
414         Namae: string;
415         DateTime: string;
416         Body: string;
417         s: string;
418
419                                 posTrip : Integer;
420                                 tripOrigin : string;
421 begin
422         if FThreadItem = nil then begin
423                 No := '1';
424                 Title := RepHtml(TitleEdit.Text);
425         end else begin
426                 No := IntToStr(FThreadItem.Count + 1);
427                 Title := RepHtml(FThreadItem.Title);
428         end;
429
430         body := GetBody;
431
432         Namae := RepHtml(NameComboBox.Text);
433         Mail := RepHtml(MailComboBox.Text);
434         Body := RepHtml(body);
435         Body := StringReplace(Body, #13#10, '<br>', [rfReplaceAll]);
436         DateTime := FormatDateTime('yyyy/mm/dd(aaa) hh:nn', now);
437
438         if Trim(Namae) = '' then
439                 Namae := '\96¼\96³\82µ\82³\82ñ';
440
441         s := '<HTML><HEAD>' + #13#10
442                         + '<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">' + #13#10
443                         + '<TITLE>' + title + '</TITLE>' + #13#10
444 //                      + '<STYLE><!--BODY{font-size : 9pt;font-family : "\82l\82\82o\83S\83V\83b\83N";}--></STYLE>' + #13#10
445                         + '</HEAD>' + #13#10
446                         + '<BODY text="#000000" bgcolor="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">' + #13#10
447                         + '<FONT COLOR="#FF0000">' + title + '</FONT>' + #13#10
448                         + '<DL>' + #13#10;
449                                 posTrip := AnsiPos( '#', Namae );
450                                 if posTrip > 0 then
451                                 begin
452                                                                 tripOrigin := Copy( Namae, posTrip + 1, Length( Namae ) );
453                                                                 Namae :=
454                                                                                                 Copy( Namae, 1, posTrip - 1 ) + '</B> \81\9f' +
455                                                                                                 get_2ch_trip( PChar( tripOrigin ) ) + '<B>';
456                                 end;
457         if Mail = '' then
458                 s := s + '<DT>' + No + ' \81F <FONT color="forestgreen"><B>' + Namae + '</B></FONT> \81F ' + DateTime+ '<BR><DD>' + Body + '<BR><BR><BR>' + #13#10
459         else
460                 s := s + '<DT>' + No + ' \81F <A href="mailto:' + Mail + '"><B>' + Namae + '</B></A> [' + Mail + ']\81F ' + DateTime+ '<BR><DD>' + Body + '<BR><BR><BR>' + #13#10;
461         s := s + '</BODY></HTML>';
462         SetContent(s);
463 end;
464
465 function TEditorForm.RepHtml(s: string): string;
466 begin
467 //      s := StringReplace(s, '&', '&amp;', [rfReplaceAll]);
468         s := StringReplace(s, '<', '&lt;', [rfReplaceAll]);
469         s := StringReplace(s, '>', '&gt;', [rfReplaceAll]);
470 //      s := StringReplace(s, ' ', '&nbsp;', [rfReplaceAll]);   //\8ed\97l\95Ï\8dX\82É\82æ\82è&nbsp;\8eg\97p\95s\89Â
471         s := StringReplace(s, '"', '&quot;', [rfReplaceAll]);
472         Result := s;
473 end;
474
475 procedure TEditorForm.EditorPageChange(Sender: TObject);
476 begin
477         if EditorPage.ActivePage = PreviewTab then begin
478                 Preview;
479         end else begin
480                 Browser.Navigate('about:blank');
481         end;
482 end;
483
484 procedure TEditorForm.BrowserStatusTextChange(Sender: TObject;
485         const Text: WideString);
486 begin
487         if EditorPage.ActivePage = PreviewTab then begin
488                 StatusBar.Panels[0].Text := Text;
489         end else begin
490                 StatusBar.Panels[0].Text := '';
491         end;
492 end;
493
494 function TEditorForm.Check: Boolean;
495 var
496         Msg: string;
497         rc: Integer;
498         Board: TBoard;
499 begin
500         Result := True;
501         if FThreadItem = nil then
502                 Board := FBoard
503         else
504                 Board := FThreadItem.ParentBoard;
505
506         if (not GikoSys.Setting.UseMachineTime) and
507                  ((Board.LastGetTime = 0) or
508                         (Board.LastGetTime = ZERO_DATE)) then begin
509                 Msg := '\83T\81[\83o\82Ì\8e\9e\8d\8f\82ª\95ª\82©\82ç\82È\82¢\82½\82ß\81A\91\97\90M\8fo\97\88\82Ü\82¹\82ñ'#13#10
510                                  + '\83X\83\8c\83b\83h\82ð\8dX\90V\81i\8eæ\93¾\81j\8cã\81A15\95b\91Ò\82Á\82Ä\82©\82ç\91\97\90M\82µ\82Ä\82­\82¾\82³\82¢';
511                 MsgBox(Handle, Msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
512                 Result := False;
513         end else if BodyEdit.Text = '' then begin
514                 Msg := '\96{\95\82ª\93ü\97Í\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B';
515                 MsgBox(Handle, Msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
516                 Result := False;
517         end else if (FBoard <> nil) and (Trim(TitleEdit.Text) = '') then begin
518                 Msg := '\83^\83C\83g\83\8b\82ª\93ü\97Í\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B';
519                 MsgBox(Handle, Msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
520                 Result := False;
521         end else begin
522                 if (not GikoSys.Dolib.Connected) and (AnsiPos('\81\9c', NameComboBox.Text) <> 0) then begin
523                         Msg := '\83\8d\83O\83C\83\93\82µ\82Ä\82¢\82È\82¢\82Ì\82Å\81\9c\82Ì\8b@\94\\82Í\97\98\97p\8fo\97\88\82Ü\82¹\82ñ\81B'#13#10
524                                          + '\82±\82Ì\82Ü\82Ü\91\97\90M\82µ\82Ä\82à\82æ\82ë\82µ\82¢\82Å\82·\82©\81H';
525                         rc := MsgBox(Handle, Msg, '\8am\94F', MB_YESNO or MB_ICONQUESTION);
526                         Result := (rc = IDYES);
527                 end;
528         end;
529 end;
530
531 procedure TEditorForm.FormClose(Sender: TObject; var Action: TCloseAction);
532 begin
533         Action := caFree;
534 end;
535
536 procedure TEditorForm.FormDestroy(Sender: TObject);
537 var
538         wp: TWindowPlacement;
539 begin
540         //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95Û\91
541         wp.length := sizeof(wp);
542         GetWindowPlacement(Handle, @wp);
543
544         GikoSys.Setting.EditWindowTop := wp.rcNormalPosition.Top;
545         GikoSys.Setting.EditWindowLeft := wp.rcNormalPosition.Left;
546         GikoSys.Setting.EditWindowHeight := wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top;
547         GikoSys.Setting.EditWindowWidth := wp.rcNormalPosition.Right - wp.rcNormalPosition.Left;
548         GikoSys.Setting.EditWindowMax := WindowState = wsMaximized;
549         //GikoSys.Setting.EditWindowStay := FormStyle = fsStayOnTop;      // \83X\83e\83C\8fó\91Ô\82Ì\95Û\91
550         GikoSys.Setting.EditWindowTranslucent := TransAction.Checked;   // \94¼\93§\96¾\8fó\91Ô\82Ì\95Û\91
551
552 end;
553
554 procedure TEditorForm.SetNameList(sName, sMail: string);
555 begin
556         if Trim(sName) <> '' then begin
557                 if GikoSys.Setting.NameList.IndexOf(sName) = -1 then
558                         GikoSys.Setting.NameList.Insert(0, sName);
559         end;
560         if Trim(sMail) <> '' then begin
561                 if GikoSys.Setting.MailList.IndexOf(sMail) = -1 then
562                         GikoSys.Setting.MailList.Insert(0, sMail);
563         end;
564 end;
565
566 function TEditorForm.GetActiveControlHandle: THandle;
567 begin
568         if EditorPage.ActivePage = EditorTab then begin
569                 if ActiveControl = NameComboBox then
570                         Result := FNameComboEdit
571                 else if ActiveControl = MailComboBox then
572                         Result := FMailComboEdit
573                 else if ActiveControl = BodyEdit then
574                         Result := BodyEdit.Handle
575                 else if ActiveControl = TitleEdit then
576                         Result := TitleEdit.Handle
577                 else
578                         Result := 0;
579         end else
580                 Result := 0;
581 end;
582
583 procedure TEditorForm.SetContent(Content: string);
584 var
585         doc : Variant;
586 begin
587         if Browser.Document <> nil then begin
588                 doc := Browser.Document;
589                 doc.Clear;
590                 doc.open;
591                 doc.charset := 'Shift_JIS';
592                 doc.Write(Content);
593                 doc.Close;
594         end;
595 end;
596
597 procedure TEditorForm.Send(SPID: string; PON: string; FirstWriting: Boolean);
598 var
599         TextStream: TStringStream;
600         Source: TStringStream;
601         ResponseText: string;
602         URL: string;
603         RefURL: string;
604         State: TGikoDownloadState;
605         ResultType: TGikoResultType;
606         MsgResult: Integer;
607         Cookie: string;
608         Board: TBoard;
609         sysMenu : HMENU;
610         //fusianasan\83g\83\89\83b\83v by\92è\8aú\95Ö
611         Namae: String;
612         SettingTxt: String;
613         RefeURL: string;
614 //        RuleURL: String;
615 //        RuleTxt: String;
616 begin
617         FAbort := False;
618         State := gdsError;
619         Namae := RepHtml(NameComboBox.Text);
620         if FThreadItem = nil then
621                 Board := FBoard
622         else
623                 Board := FThreadItem.ParentBoard;
624
625         Indy.Request.Clear;
626         Indy.ProxyParams.BasicAuthentication := False;
627         if GikoSys.Setting.WriteProxy then begin
628                 Indy.ProxyParams.ProxyServer := GikoSys.Setting.WriteProxyAddress;
629                 Indy.ProxyParams.ProxyPort := GikoSys.Setting.WriteProxyPort;
630                 Indy.ProxyParams.ProxyUsername := GikoSys.Setting.WriteProxyUserID;
631                 Indy.ProxyParams.ProxyPassword := GikoSys.Setting.WriteProxyPassword;
632                 if GikoSys.Setting.ReadProxyUserID <> '' then
633                         Indy.ProxyParams.BasicAuthentication := True;
634         end else begin
635                 Indy.ProxyParams.ProxyServer := '';
636                 Indy.ProxyParams.ProxyPort := 80;
637                 Indy.ProxyParams.ProxyUsername := '';
638                 Indy.ProxyParams.ProxyPassword := '';
639         end;
640         if FThreadItem = nil then begin
641                 URL := FBoard.GetSendURL;
642                 RefURL := GikoSys.UrlToServer(FBoard.URL) + 'test/bbs.cgi';
643         end else begin
644                 URL := FThreadItem.GetSendURL;
645                 RefURL := FThreadItem.URL;
646         end;
647         Indy.Request.UserAgent := GikoSys.GetUserAgent;
648         Indy.Request.Referer := RefURL;
649         Indy.Request.AcceptEncoding := '';
650
651         Cookie := '';
652         if SPID <> '' then
653                 Cookie := Cookie + 'SPID=' + SPID + '; ';
654         if PON <> '' then
655                 Cookie := Cookie + 'PON=' + PON + '; ';
656         Cookie := 'Cookie: ' + Cookie + 'NAME=' + NameComboBox.Text + '; MAIL=' + MailComboBox.Text;
657
658         sysMenu := GetSystemMenu( Handle, false );
659         EnableMenuItem( sysMenu, SC_CLOSE, MF_GRAYED );
660 {
661   EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
662   DrawMenuBar(Handle);
663 }
664         Indy.Request.CustomHeaders.Clear;
665 //      Indy.Request.CacheControl := 'no-cache';
666         Indy.Request.CustomHeaders.Add('Pragma: no-cache');
667         Indy.Request.AcceptLanguage := 'ja';
668         Indy.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
669         Indy.Request.ContentType := 'application/x-www-form-urlencoded';
670         Indy.Request.CustomHeaders.Add(Cookie);
671         TextStream := TStringStream.Create('');
672         Source := TStringStream.Create('');
673         try
674                 try
675                         FDebugStrReceive := '';
676                         FDebugStrSend := '';
677                         GetSendData(Source);
678                         Indy.Post(URL, Source, TextStream);
679                         ResponseText := TextStream.DataString;
680
681                         ResultType := GetResultType(ResponseText);
682
683                         //MsgResult\8f\89\8aú\89»
684                         MsgResult := IDNO;
685                         //\83t\83V\83A\83i\83g\83\89\83b\83v\8cx\8d\90(LocalMode) by \92è\8aú\95Ö
686                         if ((Namae = '\8eR\8dè\8fÂ') or (Namae = 'fusianasan')) and (FirstWriting) then begin
687                                 MsgResult := MsgBox(
688                                                 Handle,
689                                         '\83\8a\83\82\81[\83g\83z\83X\83g\82ð\95\\8e¦\82·\82é\8b@\94\\82ª\8eg\82í\82ê\82Ä\82¢\82Ü\82·' + #13#10 +
690                                         '\82à\82µ\82à\8aÔ\88á\82Á\82Ä\82±\82Ì\95û\96@\82Å\83z\83X\83g\82ª\95\\8e¦\82³\82ê\82½\82Æ\82µ\82Ä\82à\81A\8e©\8cÈ\90Ó\94C\82È\82Ì\82Å\8dí\8f\9c\88Ë\97\8a\82É\82Í\89\9e\82\82Ü\82¹\82ñ\81B' + #13#10#13#10 +
691                                         '\90Ó\94C\82ð\95\89\82¤\82±\82Æ\82ð\8f³\91ø\82µ\82Ä\8f\91\82«\8d\9e\82Ý\82Ü\82·\82©\81H',
692                                         '\8fî\95ñ',
693                                         MB_YESNO or MB_ICONQUESTION);
694                                 if MsgResult = IDNO  then begin
695                                         Board.SPID := '';
696                                         Board.PON := '';
697                                         FWork := false;
698                                         EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
699                                         DrawMenuBar(Handle);
700                                         Exit;
701                                 end;
702                         end;
703                         {
704                         //\83t\83V\83A\83i\83g\83\89\83b\83v\8cx\8d\90(SETTING.TXT Mode) by \92è\8aú\95Ö
705                         RefURL := GikoSys.UrlToServer(FBoard.URL)
706                                 + GikoSys.UrlToID(FBoard.URL)
707                                 + '/';
708                         //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
709                         RefeURL := RefURL
710                                 + 'SETTING.TXT';
711
712                                                 //\8e\8e\82µ\82É\83\8d\81[\83J\83\8b\83\8b\81[\83\8b\8eæ\93¾\82à
713                                                 RuleURL := RefURL
714                                                                 + 'head.txt';
715                                                 //\8eæ\93¾\81`
716                         Settingtxt := Indy.Get(RefeURL);
717                                                 RuleTxt := Indy.Get(RuleURL);
718
719                                                 //SETTING.TXT In DebugOnly
720                                                 if Settingtxt = '' then begin
721                                                                 ShowMessage('\8eæ\93¾\8e¸\94s');
722                                                                 Exit;
723                                                 end else begin
724                                                                 ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + Settingtxt);
725                                                                 Exit;
726                                                 end;
727
728                                                 //RocalRule In Debug Only
729                                                 if RuleTxt = '' then begin
730                                                                 ShowMessage('\8eæ\93¾\8e¸\94s');
731                                                                 Exit;
732                                                 end else begin
733                                                                 ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + RuleTxt);
734                                                 end;
735                         }
736                         if ResultType = grtOK then begin
737                                 WriteSambaTime(FHost, Now());
738                                 State := gdsComplete;
739                         end else if ResultType = grtCookie then begin
740                                 //\83\8b\81[\83v\96h\8e~
741                                 if not FirstWriting then
742                                         raise Exception.Create('');
743                                 MsgResult := MsgBox(
744                                         Handle,
745                                         '\81E\93\8a\8de\82³\82ê\82½\93à\97e\82Í\83R\83s\81[\81A\95Û\91\81A\88ø\97p\81A\93]\8dÚ\93\99\82³\82ê\82é\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B' + #13#10 +
746                                         '\81E\93\8a\8de\82É\8aÖ\82µ\82Ä\94­\90\82·\82é\90Ó\94C\82Í\91S\82Ä\93\8a\8de\8eÒ\82É\8bA\82µ\82Ü\82·\81B' + #13#10#13#10 +
747                                         '\91S\90Ó\94C\82ð\95\89\82¤\82±\82Æ\82ð\8f³\91ø\82µ\82Ä\8f\91\82«\8d\9e\82Ý\82Ü\82·\82©\81H',
748                                         '\8fî\95ñ',
749                                         MB_YESNO or MB_ICONQUESTION);
750                                 if MsgResult = IDYES then begin
751                                         Board.SPID := GetSPID(Indy.Response.RawHeaders.Values['Set-Cookie']);
752                                         Board.PON := GetPON(Indy.Response.RawHeaders.Values['Set-Cookie']);
753                                         if (Board.SPID = '') and (Board.PON = '') then
754                                                 raise Exception.Create('');
755                                         //\82à\82¤\88ê\89ñ\82±\82Ì\83\81\83\\83b\83h
756                                         Send(Board.SPID, Board.PON, False);
757                                         Exit;
758                                 end else begin
759                                         Board.SPID := '';
760                                         Board.PON := '';
761                                         FWork := false;
762                                         EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
763                                         DrawMenuBar(Handle);
764                                         Exit;
765                                 end;
766                         end else if ResultType = grtCheck then begin
767                                 //
768                                 //\83\8b\81[\83v\96h\8e~
769                                 if not FirstWriting then
770                                         raise Exception.Create('');
771
772                                 MsgResult := MsgBox(
773                                         Handle,
774                                         '\8f\91\82«\8d\9e\82Ý\82É\8aÖ\82µ\82Ä\82Í\97l\81X\82È\83\8d\83O\8fî\95ñ\82ª\8bL\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B' + #13#10 +
775                                         '\93\8a\8de\82É\8aÖ\82µ\82Ä\94­\90\82·\82é\90Ó\94C\82Í\91S\82Ä\93\8a\8de\8eÒ\82É\8bA\82µ\82Ü\82·\81B' + #13#10 +
776                                         '\8cö\8f\98\97Ç\91­\82É\94½\82µ\82½\82è\81A\91¼\90l\82É\96À\98f\82ð\82©\82¯\82é\8f\91\82«\8d\9e\82Ý\82Í\8dT\82¦\82Ä\89º\82³\82¢\81B' + #13#10 +
777                                         '\93\8a\8de\82³\82ê\82½\93à\97e\82Í\83R\83s\81[\81E\95Û\91\81E\88ø\97p\81E\93]\8dÚ\93\99\82³\82ê\82é\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B' + #13#10 +
778                                         #13#10 +
779                                         '\91S\90Ó\94C\82ð\95\89\82¤\82±\82Æ\82ð\8f³\91ø\82µ\82Ä\8f\91\82«\8d\9e\82Ý\82Ü\82·\82©\81H',
780                                         '\8am\94F',
781                                         MB_YESNO or MB_ICONQUESTION);
782
783                                 if MsgResult = IDYES then begin
784                                         Board.SPID := GetSPID(Indy.Response.RawHeaders.Values['Set-Cookie']);
785                                         Board.PON := GetPON(Indy.Response.RawHeaders.Values['Set-Cookie']);
786                                         if (Board.SPID = '') and (Board.PON = '') then
787                                                 raise Exception.Create('');
788                                         Send(Board.SPID, Board.PON, False);
789                                         Exit;
790                                 end else begin
791                                         EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
792                                         DrawMenuBar(Handle);
793                                         Board.SPID := '';
794                                         Board.PON := '';
795                                         FWork := false;
796                                         Exit;
797                                         end;
798                         end else begin
799                 WriteSambaTime(FHost, Now());
800                                 State := gdsError;
801                                 raise Exception.Create('');
802                         end;
803
804                 except
805                         on E: EIdConnectException do begin
806                                 State := gdsError;
807                                 ResponseText := '<html><body>'
808                                                                                         + '<div>\90Ú\91±\82ª\8e¸\94s\82µ\82Ü\82µ\82½<br>'
809                                                                                         + '\89ñ\90ü\82â\83v\83\8d\83L\83V\82Ì\8fó\91Ô\82ð\92²\82×\82Ä\82­\82¾\82³\82¢<br></div>'
810                                                                                         + '<br><br><div>' + E.Message + '</div>'
811                                                                                         + '</body></html>';
812                         end;
813                         on E: Exception do begin
814                                 State := gdsError;
815
816                                 FDebugStrReceive := AnsiReplaceText(FDebugStrReceive, '<', '&lt;');
817                                 FDebugStrReceive := AnsiReplaceText(FDebugStrReceive, '>', '&gt;');
818                                 FDebugStrSend := AnsiReplaceText(FDebugStrSend, '<', '&lt;');
819                                 FDebugStrSend := AnsiReplaceText(FDebugStrSend, '>', '&gt;');
820
821                                 ResponseText := '<html><body>' + TextStream.DataString;
822                                 ResponseText := AnsiReplaceText(ResponseText, '</body>', '');
823                                 ResponseText := AnsiReplaceText(ResponseText, '</html>', '');
824                                 ResponseText := ResponseText + '<hr><div align="left"><pre>';
825                                 ResponseText := ResponseText + '<b>\82±\82±\82©\82ç\83M\83R\83i\83r\82Ì\8fî\95ñ</b>'#13#10;
826                                 ResponseText := ResponseText + #13#10'\81\9c\91\97\90M'#13#10;
827                                 ResponseText := ResponseText + FDebugStrSend;
828                                 ResponseText := ResponseText + #13#10'\81\9c\8eó\90M'#13#10;
829                                 ResponseText := ResponseText + FDebugStrReceive;
830                                 ResponseText := ResponseText + '</pre></div></body></html>';
831                         end;
832                 end;
833                 FStatusCode := Indy.ResponseCode;
834                 if FAbort then
835                         State := gdsAbort;
836         finally
837                 Source.Free;
838                 TextStream.Free;
839                 //sysMenu := GetSystemMenu( Handle, true );
840                 EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
841                 DrawMenuBar(Handle);
842         end;
843         FWork := false;
844         //\94ñ\8cö\8e®\83M\83R\83i\83r\94Â\82È\82Ç\82Ì\83X\83N\83\8a\83v\83g\97p
845         //ResponceCode\82ª302Found\82Å\8f\91\82«\8d\9e\82Ý\8a®\97¹
846         if FStatusCode = 302 then begin
847                 GikoForm.PlaySound('ResEnd');
848                 SaveSendFile;
849                 if FThreadItem = nil then
850                         GikoForm.AddMessageList(FBoard.Title + ' [\90V\83X\83\8c\91\97\90M\8fI\97¹]', nil, gmiOK)
851                 else
852                         GikoForm.AddMessageList(FThreadItem.Title + ' [\83\8c\83X\91\97\90M\8fI\97¹]', nil, gmiOK);
853                 Close;
854                 Exit;
855         end;
856         if State = gdsComplete then begin
857                 GikoForm.PlaySound('ResEnd');
858                 SaveSendFile;
859                 if FThreadItem = nil then
860                         GikoForm.AddMessageList(FBoard.Title + ' [\90V\83X\83\8c\91\97\90M\8fI\97¹]', nil, gmiOK)
861                 else
862                         GikoForm.AddMessageList(FThreadItem.Title + ' [\83\8c\83X\91\97\90M\8fI\97¹]', nil, gmiOK);
863                 Close;
864         end else if State = gdsError then begin
865                 if FThreadItem = nil then
866                         GikoForm.AddMessageList(FBoard.Title + ' [\90V\83X\83\8c\91\97\90M\8e¸\94s]', nil, gmiNG)
867                 else
868                         GikoForm.AddMessageList(FThreadItem.Title + ' [\83\8c\83X\91\97\90M\8e¸\94s]', nil, gmiNG);
869                 EditorPage.ActivePage := PreviewTab;
870                 SetContent(ResponseText);
871         end else if State = gdsAbort then begin
872                 GikoForm.AddMessageList(FThreadItem.Title + ' [\92\86\92f]', nil, gmiSAD);
873         end;
874 end;
875
876 function TEditorForm.GetResultType(ResponseText: string): TGikoResultType;
877 begin
878         if AnsiPos('\8f\91\82«\82±\82Ý\82ª\8fI\82í\82è\82Ü\82µ\82½', ResponseText) <> 0 then
879                 Result := grtOK
880         else if (AnsiPos('\83N\83b\83L\81[\82ª\82È\82¢\82©\8aú\8cÀ\90Ø\82ê\82Å\82·', ResponseText) > 0) or
881                                         (AnsiPos('<title>\83N\83b\83L\81[\8am\94F\81I</title>', ResponseText) > 0)    or
882                                         (AnsiPos('<title>\81¡\83N\83b\83L\81[\8am\94F\81I\81¡</title>', ResponseText) > 0)        or
883                                         //(AnsiPos('\83N\83b\83L\81[\8am\94F', ResponseText) > 0) or
884                                         (AnsiPos(RES2CH_COOKIE, ResponseText) > 0)      then
885                 Result := grtCookie
886         else if (AnsiPos('<font size=+2 color=#FF0000>\8f\91\82«\8d\9e\82Ý\83`\83F\83b\83N\81I </font>', ResponseText) > 0)   or
887                                         (AnsiPos('<title>\81¡ \8f\91\82«\8d\9e\82Ý\8am\94F\82µ\82Ü\82· \81¡</title>', ResponseText) > 0)  or
888                                         (AnsiPos('<title>\93\8a\8de\8am\94F</title>', ResponseText) > 0)  or
889                                         (AnsiPos('<b>\8f\91\82«\82±\82Ý\8am\94F</b>', ResponseText) > 0)      or
890                                         (AnsiPos('="../test/subbbs.cgi">', ResponseText) > 0)   or
891                                         (AnsiPos(RES2CH_FALSE, ResponseText) > 0)       then
892                 Result := grtCheck
893         else
894                 Result := grtError;
895 end;
896
897
898 procedure TEditorForm.GetSendData(Source: TStringStream);
899 var
900         SessionID: string;
901         s: string;
902         SendTime: Integer;
903         Adjust: Integer;
904         Board: TBoard;
905         body            : string;
906 begin
907         if FThreadItem = nil then
908                 Board := FBoard
909         else
910                 Board := FThreadItem.ParentBoard;
911
912         if GikoSys.Setting.UseMachineTime then begin
913                 if GikoSys.Setting.TimeAdjust then
914                         Adjust := Gikosys.Setting.TimeAdjustSec
915                 else
916                         Adjust := GikoSys.Setting.TimeAdjustSec * -1;
917                 SendTime := GikoSys.DateTimeToInt(Now) - (9 * 60 * 60) + Adjust
918         end else begin
919                 if (Board.LastGetTime = 0) or (Board.LastGetTime = ZERO_DATE) then
920                         SendTime := GikoSys.DateTimeToInt(Now)
921                 else
922                         SendTime := GikoSys.DateTimeToInt(Board.LastGetTime);
923         end;
924
925         body := GetBody;
926
927         SessionID := GikoSys.Dolib.SessionID;
928         if SessionID <> '' then
929                 s := 'sid=' + HttpEncode(SessionID) + '&'
930         else
931                 s := '';
932         s := s + 'subject=&'
933                                  + 'FROM=' + HttpEncode(NameComboBox.Text) + '&'
934                                  + 'mail=' + HttpEncode(MailComboBox.Text) + '&'
935                                  + 'MESSAGE=' + HttpEncode(body) + '&'
936                                  + 'bbs=' + Board.BBSID + '&'
937                                  + 'time=' + IntToStr(SendTime) + '&';
938         if FThreadItem = nil then begin
939                 s := s + 'subject=' + HttpEncode(TitleEdit.Text) + '&';
940                 s := s + 'submit=' + HttpEncode('\91S\90Ó\94C\82ð\95\89\82¤\82±\82Æ\82ð\8f³\91ø\82µ\82Ä\8f\91\82«\8d\9e\82Þ') + #13#10;
941         end else begin
942                 s := s + 'key=' + ChangeFileExt(FThreadItem.FileName, '') + '&';
943                 s := s + 'submit=' + HttpEncode('\8f\91\82«\8d\9e\82Þ') + #13#10;
944         end;
945         Source.WriteString(s);
946 end;
947
948 procedure TEditorForm.SaveSendFile;
949 var
950         sDate: string;
951         ini: TMemIniFile;
952 begin
953         ini := TMemIniFile.Create(GikoSys.GetSentFileName);
954         try
955                 sDate := IntToStr(GikoSys.DateTimeToInt(Now));
956
957                 ini.WriteString(sDate, 'Name', NameComboBox.Text);
958                 ini.WriteString(sDate, 'EMail', MailComboBox.Text);
959                 ini.WriteString(sDate, 'Body', HttpEncode(BodyEdit.Text));
960                 ini.WriteInteger(sDate, 'Status', FStatusCode);
961                 ini.WriteDateTime(sDate, 'Date', Now);
962                 if FThreadItem = nil then begin
963                         ini.WriteString(sDate, 'Title', TitleEdit.Text);
964                         ini.WriteString(sDate, 'BBS', FBoard.BBSID);
965                         ini.WriteInteger(sDate, 'NewThread', 1);
966                 end else begin
967                         ini.WriteString(sDate, 'Title', FThreadItem.Title);
968                         ini.WriteString(sDate, 'BBS', FThreadItem.ParentBoard.BBSID);
969                         ini.WriteString(sDate, 'Key', ChangeFileExt(FThreadItem.FileName, ''));
970                 end;
971
972                 ini.UpdateFile;
973         finally
974                 ini.Free;
975         end;
976 end;
977
978 procedure TEditorForm.SendActionExecute(Sender: TObject);
979 var
980         Board: TBoard;
981         rc: Integer;
982         state : TGikoDownloadState;
983         body            : string;
984 begin
985         if FWork then
986                 Exit;
987         try
988                 FWork := True;
989                 SendAction.Enabled := False;
990                 Application.ProcessMessages;
991                 if not Check then Exit;
992
993                 if FThreadItem = nil then
994                         Board := FBoard
995                 else
996                         Board := FThreadItem.ParentBoard;
997
998                 if FThreadItem = nil then begin
999                         rc := GikoUtil.MsgBox(Handle,
1000                                                                                                         '\81u' + Board.Title + '\81v\94Â\82É\90V\82µ\82¢\83X\83\8c\83b\83h\97§\82Ä\82Ü\82·'#13#10#13#10
1001                                                                                                         + '\81E\94Â\82Ì\83\8b\81[\83\8b\82ð\8eç\82Á\82½\8f\91\82«\8d\9e\82Ý\82Å\82 \82é\82±\82Æ\82ð\8am\94F\82µ\82Ü\82µ\82½\82©\81H'#13#10
1002                                                                                                         + '\81E\91¼\82É\93¯\82\82æ\82¤\82È\83X\83\8c\83b\83h\82ª\96³\82©\82Á\82½\82±\82Æ\82ð\8am\94F\82µ\82Ü\82µ\82½\82©\81H'#13#10#13#10
1003                                                                                                         + '\81u\82Í\82¢\81v\82ð\89\9f\82·\82Æ\91\97\90M\82µ\82Ü\82·',
1004                                                                                                         '\8am\94F',
1005                                                                                                         MB_ICONQUESTION or MB_YESNO);
1006                         if rc <> ID_YES then
1007                                 Exit;
1008                 end;
1009
1010                 SetNameList(NameComboBox.Text, MailComboBox.Text);
1011                 if KotehanCheckBox.Checked then begin
1012                         Board.KotehanName := NameComboBox.Text;
1013                         Board.KotehanMail := MailComboBox.Text;
1014                 end;
1015
1016                 if Board.IsBoardPlugInAvailable then begin
1017                         body := GetBody;
1018
1019                         if FThreadItem = nil then begin
1020                                 // \83X\83\8c\97§\82Ä
1021                                 state := TGikoDownloadState( Board.BoardPlugIn.CreateThread(
1022                                         DWORD( Board ), TitleEdit.Text, NameComboBox.Text, MailComboBox.Text, body ) );
1023
1024                                 if state = gdsComplete then begin
1025                                         GikoForm.PlaySound('ResEnd');
1026                                         SaveSendFile;
1027                                         GikoForm.AddMessageList(FBoard.Title + ' [\90V\83X\83\8c\91\97\90M\8fI\97¹]', nil, gmiOK);
1028                                         FWork := False;
1029                                         Close;
1030                                 end else if State = gdsError then begin
1031                                         GikoForm.AddMessageList(FBoard.Title + ' [\90V\83X\83\8c\91\97\90M\8e¸\94s]', nil, gmiNG);
1032                                 end else if State = gdsAbort then begin
1033                                         GikoForm.AddMessageList(FThreadItem.Title + ' [\92\86\92f]', nil, gmiSAD);
1034                                 end;
1035                         end else begin
1036                                 // \83\8c\83X
1037                                 state := TGikoDownloadState( FThreadItem.BoardPlugIn.WriteThread(
1038                                         DWORD( FThreadItem ), NameComboBox.Text, MailComboBox.Text, body ) );
1039
1040                                 if state = gdsComplete then begin
1041                                         GikoForm.PlaySound('ResEnd');
1042                                         SaveSendFile;
1043                                         GikoForm.AddMessageList(FThreadItem.Title + ' [\83\8c\83X\91\97\90M\8fI\97¹]', nil, gmiOK);
1044                     FWork := False;
1045                                         Close;
1046                                 end else if State = gdsError then begin
1047                                         GikoForm.AddMessageList(FThreadItem.Title + ' [\83\8c\83X\91\97\90M\8e¸\94s]', nil, gmiNG);
1048                                 end else if State = gdsAbort then begin
1049                                         GikoForm.AddMessageList(FThreadItem.Title + ' [\92\86\92f]', nil, gmiSAD);
1050                                 end;
1051                         end;
1052                 end else begin
1053                         if not Timer1.Enabled then
1054                                 Send(Board.SPID, Board.PON, True)
1055                         else begin
1056                                 if not CheckSambaTime(FHost, Now()) then begin
1057                                         rc := GikoUtil.MsgBox(Handle,
1058                                                                 'Samba24\82Ì\8bK\92è\92l\96¢\96\9e\82Ì\95b\90\94\82µ\82©\8co\89ß\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B'#13#10
1059                                                                 + '\91\97\90M\82ð\92\86\8e~\82µ\82Ü\82·\82©\81H' + #13#10
1060                                                                 + '(\81u\82¢\82¢\82¦\81v\82¾\82Æ\91\97\90M\82µ\82Ü\82·)', 'Samba24\8cx\8d\90',
1061                                                                 MB_YESNO or MB_ICONQUESTION);
1062                                         if rc = IDYES then begin
1063                                                 FWork := false;
1064                                                 Exit;
1065                                         end;
1066                                 end;
1067                                 Send(Board.SPID, Board.PON, True);
1068                         end;
1069                 end;
1070         finally
1071                 FWork := False;
1072                 if Timer1.Enabled then
1073                         ReadSambaTime(FHost);
1074         end;
1075 end;
1076
1077 procedure TEditorForm.SaveActionExecute(Sender: TObject);
1078 begin
1079 //
1080 end;
1081
1082 procedure TEditorForm.CloseActionExecute(Sender: TObject);
1083 begin
1084         Close;
1085 end;
1086
1087 procedure TEditorForm.UndoActionExecute(Sender: TObject);
1088 begin
1089         SendMessage(GetActiveControlHandle, WM_UNDO, 0, 0);
1090 end;
1091
1092 procedure TEditorForm.CutActionExecute(Sender: TObject);
1093 begin
1094         SendMessage(GetActiveControlHandle, WM_CUT, 0, 0);
1095 end;
1096
1097 procedure TEditorForm.CopyActionExecute(Sender: TObject);
1098 begin
1099         SendMessage(GetActiveControlHandle, WM_COPY, 0, 0);
1100 end;
1101
1102 procedure TEditorForm.PasteActionExecute(Sender: TObject);
1103 begin
1104         SendMessage(GetActiveControlHandle, WM_PASTE, 0, 0);
1105 end;
1106
1107 procedure TEditorForm.SelectAllActionExecute(Sender: TObject);
1108 begin
1109         SendMessage(GetActiveControlHandle, EM_SETSEL, 0, GetWindowTextLength(GetActiveControlHandle));
1110 end;
1111
1112 procedure TEditorForm.TopActionExecute(Sender: TObject);     // \83E\83B\83\93\83h\83E\8dÅ\91O\96Ê(Stay)\83{\83^\83\93\82Ì\8f\88\97\9d
1113 begin
1114         if not (fsShowing in Self.FormState) then begin
1115                 if TopAction.Checked then begin // \83X\83e\83C\8fó\91Ô\82É\90Ý\92è
1116                         SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
1117                         GikoSys.Setting.EditWindowStay := true;
1118                 end     else begin   // \83X\83e\83C\8fó\91Ô\89ð\8f\9c
1119                         SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
1120                         GikoSys.Setting.EditWindowStay := false;
1121                 end;
1122                 // \83X\83e\83C\8fó\91Ô\82Ì\95Û\91
1123                 //GikoSys.Setting.EditWindowStay := FormStyle = fsStayOnTop;
1124         end;
1125 end;
1126
1127 procedure TEditorForm.AbortActionExecute(Sender: TObject);
1128 begin
1129         FAbort := True;
1130 end;
1131
1132 procedure TEditorForm.SendActionUpdate(Sender: TObject);
1133 begin
1134         SendAction.Enabled := not FWork;
1135 end;
1136
1137 procedure TEditorForm.SaveActionUpdate(Sender: TObject);
1138 begin
1139         SaveAction.Enabled := False;
1140 end;
1141
1142 procedure TEditorForm.CloseActionUpdate(Sender: TObject);
1143 begin
1144         CloseAction.Enabled := not FWork;
1145 end;
1146
1147 procedure TEditorForm.UndoActionUpdate(Sender: TObject);
1148 begin
1149         UndoAction.Enabled := (GetActiveControlHandle <> 0)
1150                                                                                                 and (SendMessage(GetActiveControlHandle, EM_CANUNDO, 0, 0) <> 0)
1151                                                                                                 and (not FWork);
1152 end;
1153
1154 procedure TEditorForm.CutActionUpdate(Sender: TObject);
1155 var
1156         Selection: TSelection;
1157         AHandle: THandle;
1158 begin
1159         AHandle := GetActiveControlHandle;
1160         SendMessage(AHandle, EM_GETSEL, Longint(@Selection.StartPos), Longint(@Selection.EndPos));
1161         CutAction.Enabled := (AHandle <> 0)
1162                                                                                 and ((Selection.EndPos - Selection.StartPos) <> 0)
1163                                                                                 and (not FWork);
1164 end;
1165
1166 procedure TEditorForm.CopyActionUpdate(Sender: TObject);
1167 var
1168         Selection: TSelection;
1169         AHandle: THandle;
1170 begin
1171         AHandle := GetActiveControlHandle;
1172         SendMessage(AHandle, EM_GETSEL, Longint(@Selection.StartPos), Longint(@Selection.EndPos));
1173         CopyAction.Enabled := (AHandle <> 0)
1174                                                                                 and ((Selection.EndPos - Selection.StartPos) <> 0)
1175                                                                                 and (not FWork);
1176 end;
1177
1178 procedure TEditorForm.PasteActionUpdate(Sender: TObject);
1179 begin
1180         PasteAction.Enabled := (GetActiveControlHandle <> 0)
1181                                                                                         and (Clipboard.HasFormat(CF_TEXT))
1182                                                                                         and (not FWork);
1183 end;
1184
1185 procedure TEditorForm.TopActionUpdate(Sender: TObject);
1186 begin
1187         TopAction.Enabled := not FWork;
1188 end;
1189
1190 procedure TEditorForm.SageCheckBoxClick(Sender: TObject);
1191 begin
1192         if SageCheckBox.Checked then begin
1193                 if AnsiPos('sage', MailComboBox.Text) = 0 then
1194                         MailComboBox.Text := 'sage' + MailComboBox.Text;
1195         end else begin
1196                 if AnsiPos('sage', MailComboBox.Text) <> 0 then
1197                         MailComboBox.Text := StringReplace(MailComboBox.Text, 'sage', '', [rfReplaceAll]);
1198         end;
1199 end;
1200
1201 procedure TEditorForm.MailComboBoxChange(Sender: TObject);
1202 begin
1203         if AnsiPos('sage', MailComboBox.Text) = 0 then
1204                 SageCheckBox.Checked := False
1205         else
1206                 SageCheckBox.Checked := True;
1207 end;
1208
1209
1210 function TEditorForm.GetSPID(CookieLine: string): string;
1211 var
1212         s: string;
1213         i: Integer;
1214 begin
1215         Result := '';
1216         i := 0;
1217         while True do begin
1218                 s := Trim(GikoSys.GetTokenIndex(CookieLine, ';', i));
1219                 if s = '' then
1220                         Break
1221                 else begin
1222                         if Pos('SPID=', s) = 1 then begin
1223                                 Result := Trim(Copy(s, 6, Length(s)));
1224                                 Break;
1225                         end;
1226                 end;
1227                 inc(i);
1228         end;
1229 end;
1230
1231 function TEditorForm.GetPON(CookieLine: string): string;
1232 var
1233         s: string;
1234         i: Integer;
1235 begin
1236         Result := '';
1237         i := 0;
1238         while True do begin
1239                 s := Trim(GikoSys.GetTokenIndex(CookieLine, ';', i));
1240                 if s = '' then
1241                         Break
1242                 else begin
1243                         if Pos('PON=', s) = 1 then begin
1244                                 Result := Trim(Copy(s, 5, Length(s)));
1245                                 Break;
1246                         end;
1247                 end;
1248                 inc(i);
1249         end;
1250 end;
1251
1252 procedure TEditorForm.IdLogDebugReceive(ASender: TIdConnectionIntercept;
1253         AStream: TStream);
1254 var
1255         StringStream: TStringStream;
1256 begin
1257         StringStream := TStringStream.Create('');
1258         try
1259                 StringStream.CopyFrom(AStream, AStream.Size);
1260                 FDebugStrReceive := FDebugStrReceive + StringStream.DataString;
1261         finally
1262                 StringStream.Free;
1263         end;
1264 end;
1265
1266 procedure TEditorForm.IdLogDebugSend(ASender: TIdConnectionIntercept;
1267         AStream: TStream);
1268 var
1269         StringStream: TStringStream;
1270 begin
1271         StringStream := TStringStream.Create('');
1272         try
1273                 StringStream.CopyFrom(AStream, AStream.Size);
1274                 FDebugStrSend := FDebugStrSend + StringStream.DataString;
1275         finally
1276                 StringStream.Free;
1277         end;
1278 end;
1279
1280 procedure TEditorForm.TransActionExecute(Sender: TObject);
1281 begin
1282         AlphaBlend := TransAction.Checked;
1283         // \94¼\93§\96¾\8fó\91Ô\82Ì\95Û\91
1284         GikoSys.Setting.EditWindowTranslucent := TransAction.Checked;
1285 end;
1286
1287 procedure TEditorForm.TransActionUpdate(Sender: TObject);
1288 begin
1289         TransAction.Enabled := not FWork;
1290 end;
1291 //StatusBar\82ÌPanels[0]\82Ì\95\9d\82ð\89Â\95Ï\81B\8ec\82è\82ð\8cÅ\92è\82É\82·\82é
1292 procedure TEditorForm.StatusBarResize(Sender: TObject);
1293 begin
1294         StatusBar.Panels[0].Width := StatusBar.Width
1295                                                                         - StatusBar.Panels[1].Width - StatusBar.Panels[2].Width;
1296
1297 end;
1298
1299 procedure TEditorForm.Timer1Timer(Sender: TObject);
1300 begin
1301         if FSambaTime = ZERO_DATE then
1302                 StatusBar.Panels[1].Text := '\8f\89\8f\91'
1303         else begin
1304                 FNow := IncMilliSecond(FNow, 500);
1305                 StatusBar.Panels[1].Text := Format('%8.0f\95b\8co\89ß', [SecondSpan(FNow, FSambaTime)]);
1306         end;
1307
1308 end;
1309 //Samba.ini\82Ì\8f\91\82«\8d\9e\82Ý\8e\9e\8aÔ\82ð\93Ç\82Ý\8d\9e\82Þ
1310 procedure TEditorForm.ReadSambaTime(const AHost: string);
1311 var
1312         ini :TMemIniFile;
1313         tmp: string;
1314 begin
1315         Timer1.Enabled := false; //\8co\89ß\95b\90\94\95\\8e¦Timer\82ðOff\82É\82·\82é\81i\82±\82ê\82ªON\82Ì\82Æ\82«Samba24\91Î\8dôOn\81j
1316         FNow := Now();   //\8c»\8dÝ\8e\9e\8aÔ\82ð\8eæ\93¾\81iTimer\95\\8e¦\97p\82Å\81ACheck\82·\82é\82Æ\82«\82Í\8dÄ\82ÑNow()\82ð\8cÄ\82Ô\81j
1317         Timer1.Enabled := true; //\8co\89ß\95b\90\94\95\\8e¦Timer\82ðOn\82É\82·\82é\81i\82±\82ê\82ªON\82Ì\82Æ\82«Samba24\91Î\8dôOn\81j
1318         ini := TMemIniFile.Create(GikoSys.GetSambaFileName);
1319         try
1320                  //\95\8e\9a\97ñ\82Å\93Ç\82Ý\8eæ\82Á\82Ä\81A\95Ï\8a·\8aÖ\90\94\82ÅTDateTime\82Ö
1321                  tmp := ini.ReadString('Send', AHost, DateTimeToStr(ZERO_DATE));
1322                  FSambaTime := ConvertDateTimeString(tmp);
1323         finally
1324                 ini.Free;
1325         end;
1326 end;
1327 //Samba.ini\82É\8dÅ\8fI\8f\91\82«\8d\9e\82Ý\8e\9e\8aÔ\82ð\8f\91\82«\8d\9e\82Þ
1328 procedure TEditorForm.WriteSambaTime(const AHost: string; ATime: TDateTime);
1329 var
1330         ini :TMemIniFile;
1331 begin
1332         ini := TMemIniFile.Create(GikoSys.GetSambaFileName);
1333         try
1334                 ini.WriteDateTime('Send', AHost, ATime);
1335                 ini.UpdateFile;
1336         finally
1337                 ini.Free;
1338         end;
1339 end;
1340 //\8dÅ\8fI\8f\91\82«\8d\9e\82Ý\8e\9e\8aÔ\82Æ\8c»\8dÝ\8e\9e\82ð\94ä\8ar\82·\82é\81i\90^\81F\8bK\92è\92l\88È\8fã\81@\8bU\81F\8bK\92è\92l\96¢\96\9e\81j
1341 function TEditorForm.CheckSambaTime(const AHost: string; ATime: TDateTime): Boolean;
1342 var
1343         pastsec: double;
1344         SettingTime: Integer;
1345 begin
1346         SettingTime := ReadSettingTime(AHost);
1347         ReadSambaTime(AHost);
1348         pastsec := SecondSpan(ATime, FSambaTime);
1349         if pastsec > SettingTime then
1350                 Result := true
1351         else
1352                 Result := false;
1353 end;
1354 //AHost\81i\8eI\96¼\81j\82ÌSamba\82Ì\8bK\92è\92l\82ð\93Ç\82Ý\8d\9e\82Þ
1355 function TEditorForm.ReadSettingTime(const AHost: string): Integer;
1356 var
1357         ini :TMemIniFile;
1358 begin
1359         ini := TMemIniFile.Create(GikoSys.GetSambaFileName);
1360         try
1361                 Result := ini.ReadInteger('Setting', AHost, 0);
1362                 //\8bK\92è\92l\82ª\82O\82Ì\82Æ\82«\81A\82à\82µ\82­\82Í\90Ý\92è\82³\82ê\82Ä\82¢\82È\82¢\82Æ\82«\82Í\81A\83t\83@\83C\83\8b\82É\8f\91\82«\82½\82·\81B
1363                 if Result = 0 then begin
1364                         ini.WriteInteger('Setting', AHost, 0);
1365                         ini.UpdateFile;
1366                 end;
1367         finally
1368                 ini.Free;
1369         end;
1370 end;
1371 //Form\82ªActive\82É\82È\82Á\82½\82ç\8dÅ\8fI\8f\91\82«\8d\9e\82Ý\8e\9e\8aÔ\82ð\93Ç\82Ý\8d\9e\82Þ
1372 procedure TEditorForm.FormActivate(Sender: TObject);
1373 begin
1374         if ( Timer1.Enabled ) and ( FThreadItem <> nil )then
1375                 ReadSambaTime(FHost);
1376 end;
1377 //Samba24\91Î\8dô\82ð\8eg\82¤\82©\82Ç\82¤\82©\8c\88\82ß\82é\8aÖ\90\94
1378 //ReadSambaTime \82ð\8cÄ\82Ñ\8fo\82·\82ÆTimer\82ªOn\82É\82È\82é
1379 procedure TEditorForm.SetSamba24(AURL: string);
1380 var
1381         Protocol, Host, Path, Document, Port, Bookmark : string;
1382 begin
1383         //Samba24\91Î\8dô\82ð\82µ\82È\82¢\82È\82ç\8fI\97¹
1384         if not GikoSys.Setting.UseSamba then
1385                 Exit;
1386         //Host\82ÌURL\82É'.2ch.'\82©'.bbspink.'\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82½\82çSamba24\91Î\8dô\82ð\82·\82é
1387         GikoSys.ParseURI( AURL, Protocol,Host, Path, Document, Port, Bookmark );
1388         if GikoSys.Is2chHost(Host) then begin
1389                 Host := Copy(Host, 1, AnsiPos('.', Host) - 1);
1390                 FHost := Host;   //FHost=\8eI\96¼
1391                 ReadSambaTime(FHost); //\88È\91O\82Ì\8f\91\82«\8d\9e\82Ý\8e\9e\8aÔ\82ð\93Ç\82Ý\8d\9e\82Þ
1392                 //StatusBar\82É\82±\82Ì\8eI\82Ì\8bK\92è\92l\82ð\95\\8e¦\82·\82é
1393                 StatusBar.Panels[2].Text := 'Samba24\8bK\92è\92l' + IntToStr(ReadSettingTime(FHost));
1394         end;
1395 end;
1396 procedure TEditorForm.FormCloseQuery(Sender: TObject;
1397   var CanClose: Boolean);
1398 begin
1399         CanClose := not FWork;
1400 end;
1401
1402 function TEditorForm.GetOEIndentChar : string;
1403 var
1404         regKey                  : TRegistry;
1405         Identities      : string;
1406         IndentChar      : DWORD;
1407 const
1408         DEFAULT_CHAR    = '> ';
1409         OE_MAIL_PATH    = '\Software\Microsoft\Outlook Express\5.0\Mail';
1410         INDENT_CHAR             = 'Indent Char';
1411 begin
1412
1413         Result  := DEFAULT_CHAR;
1414         regKey  := TRegistry.Create;
1415         try
1416                 try
1417                         regKey.RootKey  := HKEY_CURRENT_USER;
1418                         if not regKey.OpenKey( 'Identities', False ) then
1419                                 Exit;
1420                         Identities                      := regKey.ReadString( 'Default User ID' );
1421                         if Identities = '' then
1422                                 Exit;
1423                         if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
1424                                 Exit;
1425                         IndentChar := regKey.ReadInteger( INDENT_CHAR );
1426                         Result := Char( IndentChar ) + ' ';
1427                 except
1428                 end;
1429         finally
1430                 regKey.Free;
1431         end;
1432
1433 end;
1434
1435 procedure TEditorForm.QuotePasteActionExecute(Sender: TObject);
1436 var
1437         s                       : TStringList;
1438         i                       : Integer;
1439         quote   : string;
1440 begin
1441
1442         quote   := GetOEIndentChar;
1443         s                       := TStringList.Create;
1444         try
1445                 s.Text  := Clipboard.AsText;
1446
1447                 for i := s.Count - 1 downto 0 do
1448                         s[ i ]  := quote + s[ i ];
1449
1450                 BodyEdit.SelText        := s.Text;
1451         finally
1452                 s.Free;
1453         end;
1454
1455 end;
1456
1457 procedure TEditorForm.SpaceToNBSPActionExecute(Sender: TObject);
1458 begin
1459         GikoSys.Setting.SpaceToNBSP := SpaceToNBSPAction.Checked;
1460         if EditorPage.ActivePage = PreviewTab then
1461                 Preview;
1462 end;
1463
1464 procedure TEditorForm.AmpToCharRefActionExecute(Sender: TObject);
1465 begin
1466         GikoSys.Setting.AmpToCharRef := AmpToCharRefAction.Checked;
1467         if EditorPage.ActivePage = PreviewTab then
1468                 Preview;
1469 end;
1470
1471 procedure TEditorForm.SettingTXT1Click(Sender: TObject);
1472 {var
1473         RefURL, RefeURL, SettingTxt, FilePath, FileName: String;
1474         ini: TMemIniFile;}
1475 begin
1476         LocalRuleShow.TXTName := 'SETTING.TXT';
1477         LocalRuleShow.Show.ShowModal;
1478
1479
1480 {        RefURL := GikoSys.UrlToServer(FBoard.URL)
1481                 + GikoSys.UrlToID(FBoard.URL)
1482                 + '/';
1483         //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
1484         RefeURL := RefURL
1485                 + 'SETTING.TXT';
1486         Settingtxt := Indy.Get(RefeURL);
1487         if Length( FilePath ) > 0 then
1488                 FileName := ExtractFilePath( FilePath )
1489         else
1490                 FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1491                                                         + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
1492         FileName := FileName + FOLDER_INI_FILENAME;
1493         ini := TMemIniFile.Create(FileName);
1494
1495         try
1496                 ini.WriteString('Rule', 'SETTING.TXT', Settingtxt);
1497                 ini.WriteString('Rule', 'SETTINGUpdate', DateTimeToStr(Date));
1498         finally
1499                 ini.Free;
1500         end;
1501
1502         //SETTING.TXT In DebugOnly
1503         if Settingtxt = '' then begin
1504                 ShowMessage('\8eæ\93¾\8e¸\94s');
1505                 Exit;
1506         end else begin
1507                 ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + Settingtxt);
1508         end;}
1509 end;
1510
1511 procedure TEditorForm.HEADTXT1Click(Sender: TObject);
1512 {var
1513         RefURL, RuleURL, RuleTxt, FileName, FilePath, LocalHeadUpdate,
1514         ServerHeadUpdate: String;
1515         ini: TMemIniFile;}
1516 begin
1517
1518         LocalRuleShow.TXTName := 'HEAD.TXT';
1519         LocalRuleShow.Show.ShowModal;
1520
1521 {        FileName := FileName + FOLDER_INI_FILENAME;
1522         ini := TMemIniFile.Create(FileName);
1523
1524         RefURL := GikoSys.UrlToServer(FBoard.URL)
1525                 + GikoSys.UrlToID(FBoard.URL)
1526                 + '/';
1527         //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
1528         RuleURL := RefURL
1529                 + 'HEAD.TXT';
1530
1531         try
1532                LocalHeadUpdate := ini.ReadString('Rule', 'HEADUpdate', '0');
1533                RuleTxt := ini.ReadString('Rule', 'HEAD.TXT', '');
1534         finally
1535                 ini.Free;
1536         end;
1537
1538         if LocalHeadUpdate = '0' then begin
1539                 RuleTxt := Indy.Get(RuleURL);
1540                 if Length( FilePath ) > 0 then
1541                         FileName := ExtractFilePath( FilePath )
1542                 else
1543                         FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1544                                                                 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
1545
1546                 try
1547                         ini.WriteString('Rule', 'HEAD.TXT', RuleTxt);
1548                         ini.WriteString('Rule', 'HEADUpdate', DateTimeToStr(Date));
1549
1550                 finally
1551                         ini.Free;
1552                 end;
1553         end;
1554
1555         //if HEADUpdate = DateTimeToStr(Date) then begin
1556                 RefURL := GikoSys.UrlToServer(FBoard.URL)
1557                         + GikoSys.UrlToID(FBoard.URL)
1558                         + '/';
1559                 //RefURL\82ð\8c³\82ÉSETTING.TXT\83A\83h\83\8c\83X\8ew\92è
1560                 RuleURL := RefURL
1561                         + 'HEAD.TXT';
1562                 RuleTxt := Indy.Get(RuleURL);
1563                 if Length( FilePath ) > 0 then
1564                         FileName := ExtractFilePath( FilePath )
1565                 else
1566                         FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1567                                                                 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
1568
1569                 try
1570                         ini.WriteString('Rule', 'HEAD.TXT', RuleTxt);
1571                         ini.WriteString('Rule', 'HEADUpdate', DateTimeToStr(Date));
1572
1573                 finally
1574                         ini.Free;
1575                 end;
1576                 ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + RuleTxt);
1577
1578                 if RuleTxt = '' then begin
1579                         ShowMessage('\8eæ\93¾\8e¸\94s');
1580                         Exit;
1581                 end else
1582                 ShowMessage('\8eæ\93¾\90¬\8c÷' + #13#10 + RuleTxt);   }
1583         //end;
1584 end;
1585
1586 end.
1587