Feeding back from `t-gnus-6_14' into `pgnus-ichikawa'.
[elisp/gnus.git-] / lisp / gnus-offline.el
index 52a8355..0e4d1a2 100644 (file)
@@ -1,13 +1,13 @@
 ;;; gnus-offline.el --- To process mail & news at offline environment.
-;;; $Id: gnus-offline.el,v 1.1.2.5.2.4 1998-10-17 03:27:06 ichikawa Exp $
 
-;;; Copyright (C) 1998 Tatsuya Ichikawa
-;;;                    Yukihiro Ito
+;;; Copyright (C) 1998, 2001 Tatsuya Ichikawa
+;;; Copyright (C) 1998, 2001 Yukihiro Ito
 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
 ;;;         Yukihiro Ito <ito@rs.civil.tohoku.ac.jp>
 ;;;         Hidekazu Nakamura <u90121@uis-inf.co.jp>
+;;;         Tsukamoto Tetsuo <czkmt@remus.dti.ne.jp>
 
-;;; Version: 1.54
+;;; Version: 2.20
 ;;; Keywords: news , mail , offline , gnus
 ;;;
 ;;; SPECIAL THANKS
 ;;;   This file needs miee.el and SEMI.
 ;;;   If you set gnus-offline-drafts-queue-type to 'agent , you don't need 
 ;;;   miee.el
-;;;   You must use Semi-gnus 6.X.X.
+;;;   You must use T-gnus 6.12.0 or later.
 ;;;
 ;;; How to use.
-;;; put following code in you .emacs , after the setting of Gnus.
 ;;;
-;;;  (setq gnus-offline-connect-program "/dir/program.exe")
-;;;  (setq gnus-offline-connect-program-arguments '("-a" "-b"))
-;;;  (setq gnus-offline-hangup-program "/dir/program")
-;;;  (setq gnus-offline-hangup-program-arguments '("-c" "-d"))
-;;;  (setq gnus-offline-mail-spool-directory "your-send-mail-spool-directory")
-;;;  (setq gnus-offline-news-spool-directory "your-send-news-spool-directory")
-;;;  (autoload 'gnus-offline-setup "gnus-offline")
-;;;  (add-hook 'gnus-load-hook 'gnus-offline-setup)
+;;; Add following code at the end in your .emacs
+;;;
+;;;    (load "gnus-ofsetup")
+;;;    (gnus-setup-for-offline)
 ;;;
 ;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el
 ;;;
 ;;; If you use nnspool as souper , put following code in your .emacs before
 ;;; gnus-offline setting.
 ;;;
-;;;  (load "miee")
-;;;  (message-offline-state)
-;;;
 ;;; Then , put hang.exe in exec-path directory.
 ;;;
 ;;; In Gnus group buffer , type g to get all news and mail.
 ;;; Then send mail and news in spool directory.
 ;;;
 ;;; Variables.
-;;;  gnus-offline-connect-program     ... Dialup program name.
-;;;  gnus-offline-connect-program-arguments
+;;;  gnus-offline-dialup-program-arguments
 ;;;                                   ... List of dialup program arguments.
-;;;  gnus-offline-hangup-program      ... Program name that used hanup line.
 ;;;  gnus-offline-hangup-program-arguments
 ;;;                                   ... List of hangup program arguments.
-;;;  gnus-offline-mail-spool-directory... spool directory sending mail.
-;;;  gnus-offline-news-spool-directory... spool directory sending news.
 ;;;  gnus-offline-mail-treat-environ  ... toggle sending mail online/offline.
 ;;;  gnus-offline-articles-to-fetch   ... toggle fetch articles.
 ;;;                                        both->mail->news->both...
 ;;;  gnus-offline-after-online-hook   ... hook after all online jobs.
 ;;;  gnus-offline-interval-time       ... Interval time to do all online jobs.
 ;;;                                        (minutes)
-;;;  gnus-offline-MTA-type            ... Type of MTA.
-;;;                                        'smtp     ... Use smtp.el.
-;;;                                        'sendmail ... Use sendmail.el.
-;;;  gnus-offline-drafts-queue-type   ... Method type queuing message to spool.
-;;;                                        'miee means queue message to spool
-;;;                                         using miee.el.
-;;;                                        'agent means queue message to spool
-;;;                                         using gnus-agent.el.
+;;;  gnus-offline-dialup-function     ... Function to diualup.
+;;;  gnus-offline-hangup-function     ... Function to hangup.
 
 ;;; Code:
 
 (eval '(run-hooks 'gnus-offline-load-hook))
 
-(require 'cl)
+(eval-when-compile (require 'cl))
+
+(eval-when-compile
+  (require 'static)
+  (require 'gnus-agent)
+  (require 'gnus-group))
 (require 'custom)
-(require 'pop3-fma)
-
-(unless (and (condition-case ()
-                (require 'custom)
-              (file-error nil))
-            (fboundp 'defgroup)
-            (fboundp 'defcustom))
-  (require 'backquote)
-  (defmacro defgroup (&rest args))
-  (defmacro defcustom (symbol value &optional doc &rest args)
-    (` (defvar (, symbol) (, value) (, doc))))
-  )
+(require 'easymenu)
+(provide 'gnus-offline)
+
 (defgroup gnus-offline nil
   "Offline backend utility for Gnus."
   :prefix "gnus-offline-"
+  :group 'gnus
   :group 'mail
   :group 'news)
 
-(defconst gnus-offline-version-number "1.54")
+(defconst gnus-offline-version-number "2.20")
 (defconst gnus-offline-codename
-;;  "You may be right"         ; 1.40
-;;  "Chilstie Lee"             ; 1.45
-;;  "Uptown Girl"              ; 1.46
-;;  "Easy money"               ; 1.47
-;;  "An Innocent man"          ; 1.48
-;;  "Tell her about it"                ; 1.50
-;;  "This night"               ; 1.51
-;;  "Movin'out"                        ; 1.52
-;;  "Longest night"            ; 1.53
-  "Running on ice"             ; 1.54
-;;  "This is the time"
+;;  "Beta5"                    ; Beta
+;;  "This is the time"         ; 2.00
 ;;  "A matter of trust"
 ;;  "Modern Woman"
+;;  "Ahhhhhhh!!"               ; 2.10b1
+  "Cup of life"                 ; 2.20
 ;;  "Code of silence"
   )
 
 (defconst gnus-offline-version (format "Gnus offline backend utiliy v%s"
                                       gnus-offline-version-number))
 
-(defcustom gnus-offline-connect-program nil
-  "*Program name to dial-up dialup network.
-If nil , use auto-dialup if required to connect the Internet."
-  :group 'gnus-offline
-  :type 'string)
-
-(defcustom gnus-offline-connect-program-arguments nil
-  "*Program arguments of gnus-offline-connect-program."
-  :group 'gnus-offline
-  :type '(repeat (string :tag "Argument")))
-
-(defcustom gnus-offline-hangup-program nil
-  "*Program name to hang-up dialup network."
-  :group 'gnus-offline
-  :type 'string)
-
-(defcustom gnus-offline-hangup-program-arguments nil
-  "*Program arguments of gnus-offline-hangup-program."
+(eval-when-compile
+  (defvar nnagent-version)
+  (defvar nnspool-version)
+  (defvar msspool-news-server)
+  (defvar msspool-news-service)
+  (defvar miee-popup-menu))
+
+(if (featurep 'meadow)
+    (define-process-argument-editing "/hang\\.exe\\'"
+      (lambda (x)
+       (general-process-argument-editing-function
+        x nil t t nil t t))))
+
+(defcustom gnus-offline-auto-ppp '(connect disconnect)
+  "*This variable decides whether to connect and/or disconnect automatically."
   :group 'gnus-offline
-  :type '(repeat (string :tag "Argument")))
-
-(defcustom gnus-offline-auto-hangup t
-  "*Whether dialup-network automatically hang up when all online jobs has done."
-  :group 'gnus-offline
-  :type 'boolean)
-
-(defcustom gnus-offline-mail-spool-directory "~/News/mail.out"
-  "*Spool directory sending mail."
-  :group 'gnus-offline
-  :type 'directory)
-
-(defcustom gnus-offline-news-spool-directory "~/News/news.out"
-  "*Spool directory sending news."
-  :group 'gnus-offline
-  :type 'directory)
+  :type '(choice
+         (const :tag "Connection and Disconnection" (connect disconnect))
+         (const :tag "Connection Only" (connect))
+         (const :tag "Do Everything Manually" nil)))
 
 (defcustom gnus-offline-load-hook nil
   "*Hook to be run after the gnus-offline package has been loaded."
@@ -203,33 +160,11 @@ If mail , gnus-offline only fetch mail articles.
                 (const mail)
                 (const news)))
 
-(defcustom gnus-offline-interval-time 0
-  "*Interval time(minutes) to do online jobs.
-If set to 0 , timer call is disabled."
-  :group 'gnus-offline
-  :type 'integer)
-
 (defcustom gnus-offline-mail-group-level 1
   "*Group level for mail group."
   :group 'gnus-offline
   :type 'integer)
 
-(defcustom gnus-offline-MTA-type 'smtp
-  "*Type of MTA program.
-smtp means use smtp.el.
- sendmail means use sendmail.el."
-  :group 'gnus-offline
-  :type '(choice (const smtp)
-                (const sendmail)))
-
-(defcustom gnus-offline-drafts-queue-type 'agent
-  "*Type of to queue drafts method.
-'miee means drafts are queued and sent by miee.el.
-'agent means drafts are queued and sent by gnus-agent.el"
-  :group 'gnus-offline
-  :type '(choice (const miee)
-                (const agent)))
-
 (defcustom gnus-offline-after-empting-spool-hook nil
   "*Hook to be run before empting spool."
   :group 'gnus-offline
@@ -250,6 +185,36 @@ smtp means use smtp.el.
   :group 'gnus-offline
   :type 'function)
 
+(defcustom gnus-offline-auto-expire t
+  "*Non-nil means expire articles on every session."
+  :group 'gnus-offline
+  :type 'boolean)
+
+;; These variables should be customized using `gnus-offline-customize',
+;; not by `customize'.
+
+(defvar gnus-offline-dialup-program nil
+  "*Program name for dialup.")
+
+(defvar gnus-offline-hangup-program nil
+  "*Program name for hangup.")
+
+(defvar gnus-offline-dialup-program-arguments nil
+  "*Program arguments of gnus-offline-dialup-program.")
+
+(defvar gnus-offline-hangup-program-arguments nil
+  "*Program arguments of gnus-offline-hangup-program.")
+
+(defvar gnus-offline-interval-time 0
+  "*Interval time(minutes) to do online jobs.
+If set to 0 , timer call is disabled.")
+
+(defvar gnus-offline-drafts-queue-type 'agent
+  "*Queuing function used for draft messages.")
+
+(defvar gnus-offline-MTA-type 'smtp
+  "*Type of MTA, sendmail or smtp.el.")
+
 ;;; Internal variables.
 (defvar gnus-offline-connected nil
   "*If value is t , dialup line is connected status.
@@ -267,181 +232,259 @@ If value is nil , dialup line is disconnected status.")
          gnus-offline-codename)
   "*Header string for gnus-offline.")
 
-(defvar gnus-offline-auto-hangup-indicator "Hup"
-  "*Indicator whether auto hang up is enabled.")
-
 (defvar gnus-offline-stored-group-level nil
   "*Mail Group level before changing.")
 
-(defvar gnus-offline-movemail-arguments nil
-  "*All command line arguments of exec-directory/movemail.")
-
-;;; Temporary variable:
-(defvar string)
-(defvar hdr)
-(defvar str)
-(defvar ver)
-(defvar passwd)
-(defvar num)
-(defvar gnus-offline-map (make-sparse-keymap))
-
-;;; To silence byte compiler
-(and
- (fboundp 'eval-when-compile)
- (eval-when-compile
-   (save-excursion
-     (beginning-of-defun)
-     (eval-region (point-min) (point)))
-   (let (case-fold-search)
-     (mapcar
-      (function
-       (lambda (symbol)
-        (unless (boundp symbol)
-          (make-local-variable symbol)
-          (eval (list 'setq symbol nil)))))
-      '(:group
-       :prefix :type
-       sendmail-to-spool-directory
-       news-spool-request-post-directory
-       nnspool-version
-       nnagent-version
-       msspool-news-server
-       msspool-news-service
-       gnspool-get-news
-       mail-spool-send
-       news-spool-post
-       gnus-agent-handle-level
-       ))
-     (make-local-variable 'byte-compile-warnings)
-     (setq byte-compile-warnings nil))))
-       
-(autoload 'message-offline-state "miee"
-  "Set current status to offline state" t)
-;;
-;; mode-line control
-(if (not (member 'gnus-offline-auto-hangup-indicator mode-line-format))
-    (progn
-      (delete "-%-" mode-line-format)
-      (setq-default mode-line-format
-                   (append mode-line-format
-                           (list "--" 'gnus-offline-auto-hangup-indicator
-                                 "-%-")))))
-(put 'gnus-offline-set-unplugged-state 'menu-enable 'gnus-offline-connected)
-(add-hook 'gnus-startup-hook 'gnus-offline-setup)
+(defvar gnus-offline-mail-source nil
+  "*mail-sources save variable.")
+
+(defvar gnus-offline-lang)
+
+(defvar gnus-offline-resource-en
+  '((error-check-1
+     . "WARNING!!: gnus-agent.el or nnagent.el is not loaded.
+Please check your .emacs or .gnus.el to work gnus-agent fine.")
+    (error-check-2 ."WARNING!!: nnspool.el is not loaded.
+Please check your .emacs or .gnus.el to work nnspool fine.")
+    (connect-server-1 . "Dialing ...")
+    (connect-server-2 . "Dialing ... done.")
+    (get-new-news-function-1 . "Set to online status.")
+    (hangup-line-1 . "Hang up line ... ")
+    (hangup-line-2 . "Hang up line ... done.")
+    (after-jobs-done-1 . "All online jobs has done.")
+    (set-auto-ppp-1 . "Connect and disconnect automatically.")
+    (set-auto-ppp-2 . "Connect automatically.")
+    (set-auto-ppp-3 . "Connect and disconnect manually.")
+    (set-auto-ppp-menu-1 . "Automatically Connect/Disconnect")
+    (set-auto-ppp-menu-2 . "Automatically Connect")
+    (set-auto-ppp-menu-3 . "Manually Connect/Disconnect")
+    (toggle-on/off-send-mail-1 . "Sending mail immidiately.")
+    (toggle-on/off-send-mail-2 . "Sending mail temporary to spool directory.")
+    (toggle-articles-to-fetch-1 . "Articles fetch from server.")
+    (toggle-articles-to-fetch-2 . "Only Mail")
+    (toggle-articles-to-fetch-3 . "Only News")
+    (toggle-articles-to-fetch-4 . "Mail/News both")
+    (empting-spool-1 . "Sending mails in spool ...")
+    (empting-spool-2 . "Sending mails in spool ... done.")
+    (empting-spool-3 . "Posting news in spool ...")
+    (empting-spool-4 . "Posting news in spool ... done.")
+    (empting-spool-5 . "Sending messages in spool ...")
+    (empting-spool-6 . "Sending messages in spool ... done.")
+    (interval-time-1 . "Interval time (now %d minutes) : ")
+    (interval-time-2 . "Retrieving message logic by timer is disabled.")
+    (interval-time-3 . "Interval time set to %d minutes")
+    (menu-miee-1 . "Post news in spool")
+    (menu-miee-2 . "Send mails in spool")
+    (menu-miee-3 . "Message Offline")
+    (menu-miee-4 . "Message Online")
+    (menu-1 . "Toggle articles to fetch")
+    (menu-2 . "Toggle online/offline send mail")
+    (menu-3 . "Set auto PPP")
+    (menu-4 . "Expire articles")
+    (menu-5 . "Set interval time")
+    (menu-6 . "Hang up Line.")
+    (menu-7 . "Customize options...")))
+
+(defvar gnus-offline-resource-ja
+  '((error-check-1
+     . "\e$B7Y9p\e(B!!: gnus-agent.el \e$B$^$?$O\e(B nnagent.el \e$B$,%m!<%I$5$l$F$$$^$;$s!#\e(B
+.emacs \e$B$^$?$O\e(B .gnus.el \e$B$N\e(B gnus-agent \e$B$N@_Dj$r@5$7$/$7$F$/$@$5$$!#\e(B")
+    (error-check-2 ."\e$B7Y9p\e(B!!: nnspool.el \e$B$,%m!<%I$5$l$F$$$^$;$s!#\e(B
+.emacs \e$B$^$?$O\e(B .gnus.el \e$B$N\e(B nnspool \e$B$N@_Dj$r@5$7$/$7$F$/$@$5$$!#\e(B")
+    (connect-server-1 . "\e$B@\B3$7$F$$$^$9\e(B...")
+    (connect-server-2 . "\e$B@\B3$7$F$$$^$9\e(B...\e$B40N;!#\e(B")
+    (get-new-news-function-1 . "\e$B%*%s%i%$%s>uBV$G$9!#\e(B")
+    (set-auto-ppp-1 . "\e$B<+F0E*$K\e(B PPP \e$B@\B3!&@ZCG$7$^$9!#\e(B")
+    (set-auto-ppp-2 . "\e$B<+F0E*$K\e(B PPP \e$B@\B3$7$^$9!#\e(B")
+    (set-auto-ppp-3 . "\e$B<jF0$G\e(B PPP \e$B@\B3!&@ZCG$7$^$9!#\e(B")
+    (hangup-line-1 . "\e$B@ZCG$7$F$$$^$9\e(B...")
+    (hangup-line-2 . "\e$B@ZCG$7$F$$$^$9\e(B...\e$B40N;!#\e(B")
+    (after-jobs-done-1 . "\e$BA4$F$N%*%s%i%$%s=hM}$r40N;$7$^$7$?!#\e(B")
+    (toggle-on/off-send-mail-1 . "\e$B%a!<%k$rD>@\Aw?.$7$^$9!#\e(B")
+    (toggle-on/off-send-mail-2 . "\e$B%a!<%k$O%-%e!<$KAw$i$l$^$9!#\e(B")
+    (toggle-articles-to-fetch-1 . "\e$B<u?.$9$k%a%C%;!<%8$O\e(B... ")
+    (toggle-articles-to-fetch-2 . "\e$B%a!<%k$N$_$G$9!#\e(B")
+    (toggle-articles-to-fetch-3 . "\e$B%K%e!<%9$N$_$G$9!#\e(B")
+    (toggle-articles-to-fetch-4 . "\e$B%a!<%k$H%K%e!<%9$NN>J}$G$9!#\e(B")
+    (empting-spool-1 . "\e$B%-%e!<$N%a!<%k$rAw?.Cf\e(B...")
+    (empting-spool-2 . "\e$B%-%e!<$N%a!<%k$rAw?.Cf\e(B... \e$B40N;!#\e(B")
+    (empting-spool-3 . "\e$B%-%e!<$N%K%e!<%95-;v$rAw?.Cf\e(B...")
+    (empting-spool-4 . "\e$B%-%e!<$N%K%e!<%95-;v$rAw?.Cf\e(B... \e$B40N;!#\e(B")
+    (empting-spool-5 . "\e$B%-%e!<$N%a%C%;!<%8$rAw?.Cf\e(B...")
+    (empting-spool-6 . "\e$B%-%e!<$N%a%C%;!<%8$rAw?.Cf\e(B... \e$B40N;!#\e(B")
+    (interval-time-1 . "\e$BAw<u?.%8%g%V$N4V3V\e(B (\e$B8=:_$N@_Dj$O\e(B %d \e$BJ,$G$9\e(B) : ")
+    (interval-time-2 . "\e$B<+F0Aw<u?.5!G=$r\e(B \e$B%*%U\e(B \e$B$K$7$^$7$?!#\e(B")
+    (interval-time-3 . "\e$B<+F0Aw<u?.$N4V3V$r\e(B %d \e$BJ,$K@_Dj$7$^$7$?!#\e(B")))
+
+(defvar gnus-offline-resource-ja_complete
+  (append
+   gnus-offline-resource-ja
+   '((menu-miee-1 . "Spool \e$B$K$"$k5-;v$NAw?.\e(B")
+     (menu-miee-2 . "Spool \e$B$K$"$k\e(B Mail \e$B$NAw?.\e(B")
+     (menu-miee-3 . "Offline \e$B>uBV$X\e(B")
+     (menu-miee-4 . "Online \e$B>uBV$X\e(B")
+     (menu-1 . "\e$B<hF@5-;v<oN`$NJQ99\e(B")
+     (menu-2 . "Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B")
+     (menu-3 . "\e$B<+F0\e(B PPP \e$B@)8f$N@_Dj\e(B")
+     (menu-4 . "\e$B<hF@:Q5-;v$r>C$9\e(B")
+     (menu-5 . "\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B")
+     (menu-6 . "\e$B2s@~$N@ZCG\e(B")
+     (menu-7 . "\e$B%W%m%Q%F%#\e(B...")
+     (set-auto-ppp-menu-1 . "\e$B<+F0E*$K\e(B PPP \e$B@\B3!&@ZCG\e(B")
+     (set-auto-ppp-menu-2 . "\e$B<+F0E*$K\e(B PPP \e$B@\B3\e(B")
+     (set-auto-ppp-menu-3 . "\e$B<jF0$G\e(B PPP \e$B@\B3!&@ZCG\e(B"))))
+
 ;;; Functions
-;;
-;; Setting up...
-;;
-(defun gnus-offline-setup ()
-  "*Initialize gnus-offline function"
-  (if (eq system-type 'windows-nt)
-      (define-process-argument-editing "/hang\\.exe\\'"
-       (lambda (x) (general-process-argument-editing-function
-                    x nil t t nil t t))))
-  ;; Initialize Internal Variable
-  (gnus-offline-initialize-variables)
-  
-  ;; Disable fetch mail when startup.
-  (gnus-offline-disable-fetch-mail)
-  
-  ;; To transfer Mail/News function.
-  (cond ((eq gnus-offline-mail-treat-environ 'offline)
-        ;; send mail under online environ.
-        (gnus-offline-set-offline-sendmail-function))
-       ((eq gnus-offline-mail-treat-environ 'online)
-        ;; send mail under offline environ.
-        (gnus-offline-set-online-sendmail-function)))
 
-  ;; always treat news under offline environ.
-  (gnus-offline-set-offline-post-news-function)
-  
-  ;; Spool directory setting - Miee
-  (if (eq gnus-offline-drafts-queue-type 'miee)
-      (progn
-       (if (not (file-exists-p gnus-offline-mail-spool-directory))
-           (make-directory gnus-offline-mail-spool-directory t))
-       (setq sendmail-to-spool-directory gnus-offline-mail-spool-directory)
-       (if (not (file-exists-p gnus-offline-news-spool-directory))
-           (make-directory gnus-offline-news-spool-directory t))
-       (setq news-spool-request-post-directory gnus-offline-news-spool-directory)))
-  
-  ;; When startup ... state is offline.
-  (setq gnus-nntp-service nil
-       gnus-nntp-server nil)
-  
-  ;; Setup needed Hooks
-  (gnus-offline-setup-needed-hooks))
-;;
-;;
-(defun gnus-offline-initialize-variables ()
-  "*Initialize gnus-offline internal variable."
-  (if (featurep 'nnmail)
-      (setq gnus-offline-mail-fetch-method 'nnmail))
-  (if (featurep 'gnus-agent)
-      (setq gnus-offline-news-fetch-method 'nnagent))
-  (if (featurep 'nnspool)
-      (setq gnus-offline-news-fetch-method 'nnspool))
-  (if (eq gnus-offline-drafts-queue-type 'miee)
-      (load "miee"))
-  (gnus-offline-define-menu-and-key))
-;;
-;;
-(defun gnus-offline-set-offline-sendmail-function ()
-  "*Initialize sendmail-function when unplugged status."
-  (if (eq gnus-offline-drafts-queue-type 'miee)
-      (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format)
-    (setq message-send-mail-function 'gnus-agent-send-mail)))
-;;
-(defun gnus-offline-set-online-sendmail-function ()
+;; Inline functions.
+(defsubst gnus-offline-gettext (symbol &optional lang)
+  (setq lang (or lang gnus-offline-lang))
+  (or
+   (cdr (assq symbol (symbol-value
+                     (intern (format "gnus-offline-resource-%s" lang)))))
+   (cdr (assq symbol gnus-offline-resource-en))))
+
+(defsubst gnus-offline-set-online-sendmail-function ()
   "*Initialize sendmail-function when plugged status."
   (if (eq gnus-offline-MTA-type 'smtp)
       (setq message-send-mail-function 'message-send-mail-with-smtp)
     (setq message-send-mail-function 'message-send-mail-with-sendmail)))
-;;
-(defun gnus-offline-set-offline-post-news-function ()
+
+(defsubst gnus-offline-set-offline-sendmail-function ()
+  "*Initialize sendmail-function when unplugged status."
+  (cond ((eq gnus-offline-drafts-queue-type 'miee)
+        (if (eq gnus-offline-news-fetch-method 'nnagent)
+            (setq gnus-agent-send-mail-function
+                  'sendmail-to-spool-in-gnspool-format))
+        (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format))
+       (t
+        (setq gnus-agent-send-mail-function
+              (gnus-offline-set-online-sendmail-function)
+              message-send-mail-function 'gnus-agent-send-mail))))
+
+(defsubst gnus-offline-set-offline-post-news-function ()
   "*Initialize sendnews-function when unplugged status."
   (if (eq gnus-offline-drafts-queue-type 'miee)
       (setq message-send-news-function 'gnspool-request-post)))
-;;
-(defun gnus-offline-set-online-post-news-function ()
+
+(defsubst gnus-offline-set-online-post-news-function ()
   "*Initialize sendnews-function when plugged status."
   (setq message-send-news-function 'message-send-news-with-gnus))
+
+(defsubst gnus-offline-disable-fetch-mail ()
+  "*Set do not fetch mail."
+  (setq mail-sources nil
+       nnmail-spool-file nil))
+
+(defsubst gnus-offline-enable-fetch-mail ()
+  "*Set to fetch mail."
+  (setq gnus-offline-mail-fetch-method 'nnmail)
+  (setq mail-sources gnus-offline-mail-source))
+
+(defsubst gnus-offline-enable-fetch-news ()
+  "*Set to fetch news."
+  (if (eq gnus-offline-news-fetch-method 'nnagent)
+      (progn
+       (setq gnus-agent-handle-level gnus-level-subscribed)
+       (gnus-agent-toggle-plugged t))))
+
+(when (featurep 'gnus-ofsetup)
+  ;; Advice to Gnus functions.
+  (defadvice gnus-group-get-new-news (before gnus-offline-advice
+                                            activate preactivate)
+    "When called interactively, dial up and get online automatically."
+    (when (interactive-p)
+      (run-hooks 'gnus-offline-before-online-hook)
+      (if (and (memq 'connect gnus-offline-auto-ppp)
+              (functionp gnus-offline-dialup-function))
+         (funcall gnus-offline-dialup-function))
+      (gnus-offline-get-new-news-function)))
+
+  (defadvice gnus-agent-toggle-plugged (around gnus-offline-advice
+                                              activate preactivate)
+    "Also toggle gnus-offline `connected--disconnected' status."
+    (interactive (list (not gnus-offline-connected)))
+    (cond ((ad-get-arg 0)
+          (setq gnus-offline-connected (ad-get-arg 0))
+          ad-do-it
+          ;; Set send mail/news function to offline functions.
+          (gnus-offline-set-online-sendmail-function)
+          (gnus-offline-set-online-post-news-function))
+         (t
+          ;; Set to offline status
+          (gnus-offline-set-unplugged-state))))
+
+  (defadvice gnus-agent-expire (around gnus-offline-advice activate preactivate)
+    "Advice not to delete new articles."
+    (cond ((eq 0 gnus-agent-expire-days)
+          (let (gnus-agent-expire-all)
+            ad-do-it))
+         (t
+          ad-do-it)))
+
+  (defadvice gnus-agent-mode (around gnus-offline-advice activate preactivate)
+    "Advice not to close PPP connection."
+    (let (gnus-offline-hangup-function)
+      ad-do-it)))
+
+;;
+;; Setting up...
 ;;
-(defun gnus-offline-setup-needed-hooks ()
-  "*Initialize needed hooks for gnus-offline."
-  (add-hook 'gnus-group-mode-hook 'gnus-offline-processed-by-timer)
-  (add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news)
-  (add-hook 'gnus-after-getting-news-hook 'gnus-offline-after-get-new-news)
-  (if (eq gnus-offline-news-fetch-method 'nnspool)
-      (add-hook 'after-getting-news-hook 'gnus-offline-nnspool-hangup-line))
-  (add-hook 'mime-edit-translate-hook 'gnus-offline-message-add-header)
-  (if (featurep 'pop3-fma)
-      (add-hook 'mime-edit-translate-hook 'pop3-fma-message-add-header)))
-;;
-;; Get new news jobs. (gnus-agent and nnspool)
-;;
-(defun gnus-offline-gnus-get-new-news (&optional arg)
-  "*Override function \"gnus-grou-get-new-news\"."
-  (interactive "P")
-  (run-hooks 'gnus-offline-before-online-hook)
-  (if (functionp gnus-offline-dialup-function)
-      (funcall gnus-offline-dialup-function))
-  (gnus-offline-get-new-news-function)
-  (gnus-group-get-new-news arg))
+(defun gnus-offline-setup ()
+  "*Initialize gnus-offline function"
+
+  (when (eq gnus-offline-drafts-queue-type 'agent)
+    (setq gnus-offline-connected gnus-plugged))
+
+  (gnus-offline-processed-by-timer)
+  (gnus-offline-error-check)
+
+  ;; To transfer Mail/News function.
+  (cond        ((or (and (eq 'gnus-offline-drafts-queue-type 'agent)
+                 gnus-offline-connected)
+            (eq gnus-offline-mail-treat-environ 'online))
+        ;; send mail under offline environ.
+        (gnus-offline-set-online-sendmail-function))
+       (t
+        ;; send mail under offline environ.
+        (gnus-offline-set-offline-sendmail-function))))
+
+;;
+;; Setting Error check.
+(defun gnus-offline-error-check ()
+  ;; Check gnus-agent and nnspool setting.
+  (let ((buffer " *Offline Error*"))
+    (cond ((eq gnus-offline-news-fetch-method 'nnagent)
+          ;; nnagent and gnus-agent loaded ??
+          (unless (and (featurep 'gnus-agent)
+                       (featurep 'nnagent))
+            (set-buffer (gnus-get-buffer-create buffer))
+            (erase-buffer)
+            (insert (gnus-offline-gettext 'error-check-1))
+            (pop-to-buffer buffer)))
+
+         ((eq gnus-offline-news-fetch-method 'nnspool)
+          (unless (featurep 'nnspool)
+            (set-buffer (gnus-get-buffer-create buffer))
+            (erase-buffer)
+            (insert (gnus-offline-gettext 'error-check-2))
+            (pop-to-buffer buffer)))
+         (t
+          nil))))
 
 ;;
 ;; dialup...
 ;;
 (defun gnus-offline-connect-server ()
   "*Dialup function."
-  ;; Dialup if gnus-offline-connect-program is specified
-  (if (stringp gnus-offline-connect-program)
+  ;; Dialup if gnus-offline-dialup-program is specified
+  (if (stringp gnus-offline-dialup-program)
       (progn
-       (message "Dialing ...")
-       (apply 'call-process gnus-offline-connect-program nil nil nil
-              gnus-offline-connect-program-arguments)
+       (message "%s" (gnus-offline-gettext 'connect-server-1))
+       (apply 'call-process gnus-offline-dialup-program nil nil nil
+              gnus-offline-dialup-program-arguments)
        (sleep-for 1)
-       (message "Dialing ... done."))))
+       (message "%s" (gnus-offline-gettext 'connect-server-2)))))
 
 ;;
 ;; Jobs before get new news , send mail and post news.
@@ -452,18 +495,13 @@ If value is nil , dialup line is disconnected status.")
   (if (eq gnus-offline-articles-to-fetch 'mail)
       (gnus-offline-set-mail-group-level gnus-offline-mail-group-level))
 
-  ;; Re initialize internal variable...if failed.
-  (if (or (not gnus-offline-mail-fetch-method)
-         (not gnus-offline-news-fetch-method))
-      (gnus-offline-initialize-variables))
-
   ;; Set to online environ.
   (setq gnus-offline-connected t)
 
   ;; Set send mail/news functions to online functions.
   (gnus-offline-set-online-sendmail-function)
   (gnus-offline-set-online-post-news-function)
-  (message "Set to online status.")
+  (message "%s" (gnus-offline-gettext 'get-new-news-function-1))
 
   ;; fetch only news
   (if (eq gnus-offline-articles-to-fetch 'news)
@@ -486,7 +524,7 @@ If value is nil , dialup line is disconnected status.")
   "*Set nnm* group level."
   (switch-to-buffer gnus-group-buffer)
   (goto-char (point-min))
-  
+
   ;; Save current level
   (if (not gnus-offline-stored-group-level)
       (while (re-search-forward " nnm" nil t)
@@ -509,85 +547,46 @@ If value is nil , dialup line is disconnected status.")
   "*Restore nnm* group level."
   (switch-to-buffer gnus-group-buffer)
   (goto-char (point-min))
-  (setq num 0)
-  (while (re-search-forward " nnm" nil t)
-    (gnus-group-set-current-level 1 (nth num gnus-offline-stored-group-level))
-    (forward-line 1)
-    (setq num (+ num 1))
-    (beginning-of-line)))
+  (let ((num 0))
+    (while (re-search-forward " nnm" nil t)
+      (gnus-group-set-current-level 1 (nth num gnus-offline-stored-group-level))
+      (forward-line 1)
+      (setq num (+ num 1))
+      (beginning-of-line))))
 ;;
 ;; Jobs after getting new news.
 ;;
 (defun gnus-offline-after-get-new-news ()
   "*After getting news and mail jobs."
-  (if (memq gnus-offline-articles-to-fetch '(both mail))
-      (progn
-       ;; Mail/both
-       ;; send mail/news in spool
-       (gnus-offline-empting-spool)
-       (if (eq gnus-offline-articles-to-fetch 'mail)
-           (progn
-             ;; Send only mail and hang up...
-             (if (and gnus-offline-connected
-                      gnus-offline-auto-hangup)
-                 (gnus-offline-set-unplugged-state))
-             ;; Disable fetch mail.
-             (gnus-offline-disable-fetch-mail)
-             (gnus-offline-after-jobs-done)))))
-  
-  ;; News/Both
-  (if (memq gnus-offline-articles-to-fetch '(both news))
-      (progn
-       (if gnus-offline-connected
-           (cond ((eq gnus-offline-news-fetch-method 'nnagent)
-                  ;; Get New News (gnus-agent)
-                  (gnus-agent-toggle-plugged t)
-                 
-                  ;; fetch articles
-                  (gnus-agent-fetch-session)
-                 
-                  ;; Hang Up line. then set to offline status.
-                  (if (and gnus-offline-connected
-                           gnus-offline-auto-hangup)
-                      (gnus-offline-set-unplugged-state))
-                  
-                  ;; All online jobs has done.
-                  (gnus-offline-after-jobs-done))
-                 (t
-                  (if (eq gnus-offline-news-fetch-method 'nnspool)
-                      ;; Get New News (nnspool)
-                      (gnspool-get-news))))))))
-;;
-;; Disable fetch mail
-;;
-(defun gnus-offline-disable-fetch-mail ()
-  "*Set do not fetch mail."
-  (if (eq gnus-offline-mail-fetch-method 'nnmail)
-      (setq nnmail-spool-file nil)))
-;;
-;; Enable fetch mail
-;;
-(defun gnus-offline-enable-fetch-mail ()
-  "*Set to fetch mail."
-  (if (eq gnus-offline-mail-fetch-method 'nnmail)
-      (progn
-       (setq gnus-offline-mail-fetch-method 'nnmail)
-       (setq nnmail-movemail-program 'pop3-fma-movemail)
-       (setq nnmail-spool-file (append
-                                pop3-fma-local-spool-file-alist
-                                (mapcar
-                                 (lambda (spool)
-                                   (car spool))
-                                 pop3-fma-spool-file-alist))))))
-;;
-;; Enable fetch news
-;;
-(defun gnus-offline-enable-fetch-news ()
-  "*Set to fetch news."
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (progn
-       (setq gnus-agent-handle-level gnus-level-subscribed)
-       (gnus-agent-toggle-plugged t))))
+  (cond (gnus-offline-connected
+        (when (memq gnus-offline-articles-to-fetch '(both mail))
+          ;; Mail/both
+          ;; send mail/news in spool
+          (gnus-offline-empting-spool)
+          (when (eq gnus-offline-articles-to-fetch 'mail)
+            ;; Send only mail and hang up...
+            (if gnus-offline-connected
+                (gnus-offline-set-unplugged-state))
+            ;; Disable fetch mail.
+            (gnus-offline-disable-fetch-mail)
+            (gnus-offline-after-jobs-done)))
+        (when (memq gnus-offline-articles-to-fetch '(both news))
+          ;; News/Both
+          (cond ((eq gnus-offline-news-fetch-method 'nnagent)
+                 ;; Get New News (gnus-agent)
+                 (gnus-agent-toggle-plugged t)
+                 ;; fetch articles
+                 (gnus-agent-fetch-session)
+                 ;; Hang Up line. then set to offline status.
+                 (gnus-offline-set-unplugged-state)
+                 ;; All online jobs has done.
+                 (gnus-offline-after-jobs-done))
+                (t
+                 (if (eq gnus-offline-news-fetch-method 'nnspool)
+                     ;; Get New News (nnspool)
+                     (gnspool-get-news))))))
+       (t
+        nil)))
 \f
 ;;
 ;; Add your custom header.
@@ -598,59 +597,44 @@ If value is nil , dialup line is disconnected status.")
         (progn (goto-char (point-min))
                (re-search-forward
                 (concat "^" (regexp-quote mail-header-separator) "\n"))
-               (point-marker))))
+               (point-marker)))
+       hdr str)
     (goto-char (point-min))
-    (or (re-search-forward (concat "^" header) delimline t)
-       (progn
-         (goto-char delimline)
-         (forward-line -1)
-         (beginning-of-line)
-         (setq hdr (concat header " "))
-         (setq str (concat hdr string))
-         (setq hdr (concat str "\n"))
-         (insert-string hdr)))))
+    (unless (re-search-forward (concat "^" header) delimline t)
+      (goto-char delimline)
+      (forward-line -1)
+      (beginning-of-line)
+      (setq hdr (concat header " "))
+      (setq str (concat hdr string))
+      (setq hdr (concat str "\n"))
+      (insert-string hdr))))
 ;;
 ;; Add X-Offline-Backend header.
 ;;
 (defun gnus-offline-message-add-header ()
   "*Add X-Gnus-Offline-Backend header to Mail/News message."
-  (if (eq gnus-offline-mail-treat-environ 'offline)
-      (progn
-       (if (eq gnus-offline-news-fetch-method 'nnagent)
-           (setq ver nnagent-version)
-         (setq ver nnspool-version))
-       (setq str (format "\n                        with %s" ver)
-             string (concat gnus-offline-header-string str))
-       (gnus-offline-add-custom-header "X-Gnus-Offline-Backend:" string))))
-  
+  (when (eq gnus-offline-mail-treat-environ 'offline)
+    (let* ((ver (if (eq gnus-offline-news-fetch-method 'nnagent)
+                   nnagent-version
+                 nnspool-version))
+          (str (format "\n                        with %s" ver)))
+    (gnus-offline-add-custom-header
+     "X-Gnus-Offline-Backend:" (concat gnus-offline-header-string str)))))
+
 \f
 ;;
-;; Toggle plugged/unplugged
-;;
-(defun gnus-offline-toggle-plugged (plugged)
-  "*Override function \"Jj\" - gnus-agent-toggle-plugged."
-  (interactive (list (not gnus-offline-connected)))
-  (if plugged
-      (progn
-       (setq gnus-offline-connected plugged)
-       (gnus-agent-toggle-plugged plugged)
-       ;; Set send mail/news function to offline functions.
-       (gnus-offline-set-online-sendmail-function)
-       (gnus-offline-set-online-post-news-function))
-    ;; Set to offline status
-    (gnus-offline-set-unplugged-state)))
-;;
 ;; Function of hang up line.
 ;;
 (defun gnus-offline-set-unplugged-state ()
   "*Set to unplugged state."
   (interactive)
   ;; Hang Up Line.
-  (if (functionp gnus-offline-hangup-function)
+  (if (and (memq 'disconnect gnus-offline-auto-ppp)
+          (functionp gnus-offline-hangup-function))
       (funcall gnus-offline-hangup-function))
   (setq gnus-offline-connected nil)
   (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (gnus-agent-toggle-plugged nil))
+      (ad-Orig-gnus-agent-toggle-plugged nil))
 
   ;; Set send mail/news function to offline functions.
   (gnus-offline-set-offline-sendmail-function)
@@ -662,17 +646,16 @@ If value is nil , dialup line is disconnected status.")
 ;;
 (defun gnus-offline-hangup-line ()
   "*Hangup line function."
-  (message "Hang up line ... ")
+  (message "%s" (gnus-offline-gettext 'hangup-line-1))
   (if (stringp gnus-offline-hangup-program)
       (apply 'start-process "hup" nil gnus-offline-hangup-program
             gnus-offline-hangup-program-arguments))
-  (message "Hang up line ... done."))
+  (message "%s" (gnus-offline-gettext 'hangup-line-2)))
 ;;
 ;; Hang Up line routine whe using nnspool
 ;;
 (defun gnus-offline-nnspool-hangup-line ()
-  (if (and gnus-offline-connected
-          gnus-offline-auto-hangup)
+  (if gnus-offline-connected
       (gnus-offline-set-unplugged-state))
   (gnus-offline-after-jobs-done))
 ;;
@@ -683,28 +666,67 @@ If value is nil , dialup line is disconnected status.")
   (run-hooks 'gnus-offline-after-online-hook)
   (if (eq gnus-offline-articles-to-fetch 'mail)
       (gnus-offline-restore-mail-group-level))
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (gnus-offline-agent-expire))
-  (ding)
-  (message "All online jobs have done."))
+  (if (and (eq gnus-offline-news-fetch-method 'nnagent)
+          gnus-offline-auto-expire)
+      (gnus-agent-expire))
+  (static-if (featurep 'xemacs)
+      (if (fboundp 'play-sound-file)
+         (ding nil 'drum)
+       (ding))
+    (ding))
+  (gnus-group-save-newsrc)
+  (message "%s" (gnus-offline-gettext 'after-jobs-done-1)))
 
 \f
 ;;
-;; Toggle auto hang up
+;; Set auto PPP
 ;;
-(defun gnus-offline-toggle-auto-hangup ()
-  "*Toggle auto hangup flag."
+(defun gnus-offline-set-auto-ppp ()
+  "*Decide whether to connect and/or disconnect automatically."
   (interactive)
-  (setq string "Auto hang up logic")
-  (if gnus-offline-auto-hangup
-      (progn
-       (setq gnus-offline-auto-hangup nil
-             gnus-offline-auto-hangup-indicator "Con"
-             str "disabled."))
-    (setq gnus-offline-auto-hangup t
-         gnus-offline-auto-hangup-indicator "Hup"
-         str "enabled."))
-  (message (format "%s %s" string str)))
+  (let ((keys (key-description (this-command-keys)))
+       menu title str)
+    (cond ((or (string= "misc-user" keys)
+              (string= "S-mouse-2" keys)
+              (string-match "^menu-bar" keys)
+              (string-match "^mouse" keys))
+          (setq title (gnus-offline-gettext 'menu-3))
+          (setq menu
+                (cons title
+                      (gnus-offline-get-menu-items
+                       '((set-auto-ppp-menu-1
+                          (progn
+                            (setq gnus-offline-auto-ppp '(connect disconnect))
+                            (message "%s"
+                                     (gnus-offline-gettext 'set-auto-ppp-1)))
+                          t)
+                         (set-auto-ppp-menu-2
+                          (progn
+                            (setq gnus-offline-auto-ppp '(connect))
+                            (message "%s"
+                                     (gnus-offline-gettext 'set-auto-ppp-2)))
+                          t)
+                         (set-auto-ppp-menu-3
+                          (progn
+                            (setq gnus-offline-auto-ppp nil)
+                            (message "%s"
+                                     (gnus-offline-gettext 'set-auto-ppp-3)))
+                          t)))))
+          (gnus-offline-popup menu title))
+         (t
+          (cond ((eq gnus-offline-auto-ppp nil)
+                 (setq gnus-offline-auto-ppp '(connect disconnect))
+                 (setq str (gnus-offline-gettext 'set-auto-ppp-1)))
+                ((memq 'connect gnus-offline-auto-ppp)
+                 (cond ((memq 'disconnect gnus-offline-auto-ppp)
+                        (setq gnus-offline-auto-ppp '(connect))
+                        (setq str
+                              (gnus-offline-gettext 'set-auto-ppp-2)))
+                       (t
+                        (setq gnus-offline-auto-ppp nil)
+                        (setq str
+                              (gnus-offline-gettext 'set-auto-ppp-3))))))
+          (message "%s" str)))))
 ;;
 ;; Toggle offline/online to send mail.
 ;;
@@ -716,42 +738,29 @@ If value is nil , dialup line is disconnected status.")
        ;; Sending mail under online environ.
        (gnus-offline-set-online-sendmail-function)
        (setq gnus-offline-mail-treat-environ 'online)
-       (message "Sending mail immidiately."))
+       (message "%s" (gnus-offline-gettext 'toggle-on/off-send-mail-1)))
     ;; Sending mail under offline environ.
     (gnus-offline-set-offline-sendmail-function)
     (setq gnus-offline-mail-treat-environ 'offline)
-    (message "Sending mail temporary to spool directory.")))
+    (message "%s" (gnus-offline-gettext 'toggle-on/off-send-mail-2))))
 ;;
 ;; Toggle articles to fetch ... both -> mail -> news -> both
 ;;
 (defun gnus-offline-toggle-articles-to-fetch ()
   "*Set articles to fetch... both(Mail/News) -> mail only -> News only -> both"
   (interactive)
-  (setq string "Articles fetch from server.")
-  (cond ((eq gnus-offline-articles-to-fetch 'both)
-        (setq gnus-offline-articles-to-fetch 'mail
-              str "Only Mail"))
-       ((eq gnus-offline-articles-to-fetch 'mail)
+  (let ((string (gnus-offline-gettext 'toggle-articles-to-fetch-1))
+       str)
+    (cond ((eq gnus-offline-articles-to-fetch 'both)
+          (setq gnus-offline-articles-to-fetch 'mail
+                str (gnus-offline-gettext 'toggle-articles-to-fetch-2)))
+         ((eq gnus-offline-articles-to-fetch 'mail)
           (setq gnus-offline-articles-to-fetch 'news
-                str "Only News"))
-       (t
-        (setq gnus-offline-articles-to-fetch 'both
-              str "Mail/News both")))
-  (message (format "%s %s" string str)))
-;;
-;; Toggle movemail program pop3.el -> movemail -> pop3.el
-;;
-(defun gnus-offline-toggle-movemail-program ()
-  "*Toggle movemail program movemail -> pop3.el -> movemail ->..."
-  (interactive)
-  (setq string "Set nnmail-movemail-program")
-  (cond ((eq pop3-fma-movemail-type 'lisp)
-        (setq pop3-fma-movemail-type 'exe
-              str "to movemail"))
-       (t
-        (setq pop3-fma-movemail-type 'lisp
-              str "to pop3.el")))
-  (message (format "%s %s" string str)))
+                str (gnus-offline-gettext 'toggle-articles-to-fetch-3)))
+         (t
+          (setq gnus-offline-articles-to-fetch 'both
+                str (gnus-offline-gettext 'toggle-articles-to-fetch-4))))
+    (message "%s %s" string str)))
 ;;
 ;; Send mail and Post news using Miee or gnus-agent.
 ;;
@@ -763,11 +772,11 @@ If value is nil , dialup line is disconnected status.")
       (progn
        (if (eq gnus-offline-mail-treat-environ 'offline)
            (progn
-             (message "Sending mails in spool ...")
+             (message "%s" (gnus-offline-gettext 'empting-spool-1))
              ;; Using miee to send mail.
              (mail-spool-send)
-             (message "Sending mails in spool ... done.")))
-       (message "Posting news in spool ...")
+             (message "%s" (gnus-offline-gettext 'empting-spool-2))))
+       (message "%s" (gnus-offline-gettext 'empting-spool-3))
        ;; Using miee to post news.
        (if (and (not (stringp msspool-news-server))
                 (not msspool-news-service))
@@ -775,11 +784,11 @@ If value is nil , dialup line is disconnected status.")
              (setq msspool-news-server (nth 1 gnus-select-method))
              (setq msspool-news-service 119)))
        (news-spool-post)
-       (message "Posting news in spool ... done."))
+       (message "%s" (gnus-offline-gettext 'empting-spool-4)))
     ;; Send queued message by gnus-agent
-    (message "Sending messages in spool ...")
+    (message "%s" (gnus-offline-gettext 'empting-spool-5))
     (gnus-group-send-drafts)
-    (message "Sending messages in spool ... done."))
+    (message "%s" (gnus-offline-gettext 'empting-spool-6)))
   ;;
   (run-hooks 'gnus-offline-after-empting-spool-hook))
 ;;
@@ -790,217 +799,180 @@ If value is nil , dialup line is disconnected status.")
   (interactive)
   (setq gnus-offline-interval-time
        (string-to-int (read-from-minibuffer
-                       (format "Interval time (now %s minutes) : "
+                       (format (gnus-offline-gettext 'interval-time-1)
                                gnus-offline-interval-time)
                        nil)))
   (if (< gnus-offline-interval-time 2)
       (progn
-       (message "Retrieving message logic by timer is disabled.")
+       (message "%s" (gnus-offline-gettext 'interval-time-2))
        (setq gnus-offline-interval-time 0))
-    (message (format "Interval time set to %d minutes" gnus-offline-interval-time)))
+    (message
+     (format (gnus-offline-gettext 'interval-time-3)
+            gnus-offline-interval-time)))
   (gnus-offline-processed-by-timer))
-;;
-;; Expire articles using gnus-agent.
-;;
-(defun gnus-offline-agent-expire ()
-  "*Expire expirable article on News group."
-  (interactive)
-  (gnus-agent-expire))
+
 ;;
 ;; Menu.
 ;;
 (defun gnus-offline-define-menu-and-key ()
   "*Set key and menu."
-  (if (eq gnus-offline-drafts-queue-type 'miee)
-      (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)
-    (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent))
+  (cond ((eq gnus-offline-drafts-queue-type 'miee)
+        (static-cond
+         ((featurep 'xemacs)
+          (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee))
+         (t
+          (gnus-offline-define-menu-on-miee))))
+       (t
+        (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent)))
+  ;;
   (add-hook 'gnus-group-mode-hook
-           '(lambda ()
-              (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state)
-              (local-set-key "\C-com" 'gnus-offline-toggle-movemail-program)
-              (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch)
-              (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail)
-              (local-set-key "\C-cox" 'gnus-offline-toggle-auto-hangup)
-              (local-set-key "\C-cos" 'gnus-offline-set-interval-time)
-              (substitute-key-definition
-               'gnus-group-get-new-news 'gnus-offline-gnus-get-new-news
-               gnus-group-mode-map)
-              (if (eq gnus-offline-news-fetch-method 'nnagent)
-                  (progn
-                    (substitute-key-definition
-                     'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
-                     gnus-agent-group-mode-map)
-                    (local-set-key "\C-coe" 'gnus-offline-agent-expire)))))
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (add-hook 'gnus-summary-mode-hook
-               '(lambda ()
-                  (substitute-key-definition
-                   'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
-                   gnus-agent-summary-mode-map)))))
+           #'(lambda ()
+               (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state)
+               (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch)
+               (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail)
+               (local-set-key "\C-cox" 'gnus-offline-set-auto-ppp)
+               (local-set-key "\C-cos" 'gnus-offline-set-interval-time)
+               (if (eq gnus-offline-news-fetch-method 'nnagent)
+                   (local-set-key "\C-coe" 'gnus-agent-expire))
+               (static-unless (featurep 'xemacs)
+                 (local-set-key
+                  (if (eq system-type 'windows-nt) [S-mouse-2] [mouse-3])
+                  'gnus-offline-popup-menu)))))
+
+;;
+;;
+(defun gnus-offline-popup (menu &optional title)
+  (static-cond
+   ((featurep 'xemacs)
+    (popup-menu menu))
+   (t
+    (let ((menu-func (or (and (fboundp 'easy-menu-create-menu)
+                             'easy-menu-create-menu)
+                        'easy-menu-create-keymaps))
+         keymap pop func)
+      (static-cond ((< emacs-major-version 20)
+                   ;; For Emacsen from 19.34 down to 19.28.
+                   ;; Seems the first item in MENU will be ignored.
+                   (or (keymapp menu)
+                       (setq menu
+                             (append (list ""  ;; This will be ignored.
+                                           (or title "Popup Menu")
+                                           "-----"
+                                           "-----")
+                                     (cdr menu))))
+                   (setq keymap
+                         (if (keymapp menu)
+                             (append (list 'keymap
+                                           (if title
+                                               `(nil ,title)
+                                             '(nil "Popup Menu"))
+                                           '(nil "")
+                                           '(nil ""))
+                                     (cdr menu))
+                           (funcall menu-func (car menu) (cdr menu)))))
+                  (t
+                   (setq keymap
+                         (if (keymapp menu)
+                             menu
+                           (funcall menu-func (car menu) (cdr menu))))))
+      ;; Display the popup menu.
+      (if (and (setq pop (x-popup-menu t keymap))
+              (setq func (lookup-key keymap
+                                     (apply 'vector pop))))
+         (funcall func))))))
+
+(defun gnus-offline-get-menu-items (list)
+  (let (result)
+    (dolist (elem list)
+      (setq result
+           (nconc result
+                  (list (if (listp elem)
+                            (progn
+                              (setcar elem (gnus-offline-gettext (car elem)))
+                              (vconcat elem))
+                          elem)))))
+    result))
+
+(defvar gnus-offline-menu
+  (gnus-offline-get-menu-items
+   '((menu-1 gnus-offline-toggle-articles-to-fetch t)
+     (menu-2 gnus-offline-toggle-on/off-send-mail t)
+     (menu-3 gnus-offline-set-auto-ppp t)
+     "----"
+     (menu-4 gnus-agent-expire
+            (eq gnus-offline-news-fetch-method 'nnagent))
+     (menu-5 gnus-offline-set-interval-time t)
+     "----"
+     (menu-6 gnus-offline-set-unplugged-state gnus-offline-connected)
+     "----"
+     (menu-7 gnus-ofsetup-customize t))))
 
 (defun gnus-offline-define-menu-on-miee ()
-  "*Set menu bar on MIEE menu."
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline-hup-separator]
-   '("--"))
-
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline]
-   (cons "Gnus Offline Utility"
-        (make-sparse-keymap "Gnus Offline Utiliry")))
-  
-  (if (featurep 'pop3-fma)
-      (global-set-key
-       [menu-bar
-       miee
-       gnus-offline
-       gnus-offline-toggle-movemail-program]
-       '("Toggle movemail program" .
-        gnus-offline-toggle-movemail-program)))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-articles-to-fetch]
-   '("Toggle articles to fetch" .
-     gnus-offline-toggle-articles-to-fetch))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-on/off-send-mail]
-   '("Toggle online/offline send mail" .
-     gnus-offline-toggle-on/off-send-mail))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-auto-hangup]
-   '("Toggle auto hang up" . gnus-offline-toggle-auto-hangup))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-expire-separator]
-   '("--"))
-  
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (global-set-key
-       [menu-bar
-       miee
-       gnus-offline
-       gnus-offline-agent-expire]
-       '("Expire articles" . gnus-offline-agent-expire)))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-set-interval-time]
-   '("Set interval time." . gnus-offline-set-interval-time))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-hup-separator]
-   '("--"))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-set-unplugged-state]
-   '("Hang Up Line." . gnus-offline-set-unplugged-state)))
+  "*Set and change menu bar on MIEE menu."
+  (let ((miee-menu
+        (gnus-offline-get-menu-items
+         '((menu-miee-1 news-spool-post t)
+           (menu-miee-2 mail-spool-send t)
+           "----"
+           (menu-miee-3 message-offline-state (not message-offline-state))
+           (menu-miee-4 message-online-state message-offline-state)
+           "----")))
+       menu)
+    (setq menu
+         (easy-menu-change
+          nil "Miee"
+          (append miee-menu
+                  (list (cons "Gnus Offline" gnus-offline-menu)))))
+    (static-if (featurep 'xemacs)
+       (easy-menu-add menu))))
 ;;
 ;; define menu without miee.
 ;;
 (defun gnus-offline-define-menu-on-agent ()
   "*Set menu bar on OFFLINE menu."
-  (define-key-after
-    (lookup-key global-map [menu-bar])
-    [offline]
-    (cons "Offline" (make-sparse-keymap "Offline"))
-    'help)               ;; Actually this adds before "Help".
-
-  (if (featurep 'pop3-fma)
-      (global-set-key
-       [menu-bar
-       offline
-       gnus-offline-toggle-movemail-program]
-       '("Toggle movemail program" . gnus-offline-toggle-movemail-program)))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-articles-to-fetch]
-   '("Toggle articles to fetch" . gnus-offline-toggle-articles-to-fetch))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-on/off-send-mail]
-   '("Toggle online/offline send mail" . gnus-offline-toggle-on/off-send-mail))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-auto-hangup]
-   '("Toggle auto hang up" . gnus-offline-toggle-auto-hangup))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-separator]
-   '("--"))
-  
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (progn
-       (global-set-key
-        [menu-bar
-         offline
-         gnus-offline-agent-expire]
-        '("Expire articles" . gnus-offline-agent-expire))))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-set-interval-time]
-   '("Set interval time." . gnus-offline-set-interval-time))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-hup-separator]
-   '("--"))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-set-unplugged-state]
-   '("Hang Up Line." . gnus-offline-set-unplugged-state)))
+  (easy-menu-define
+   gnus-offline-menu-on-agent gnus-group-mode-map "Gnus offline Menu"
+   (cons "Offline" gnus-offline-menu))
+  (static-if (featurep 'xemacs)
+      (easy-menu-add gnus-offline-menu-on-agent)))
+;;
+;; Popup menu within the group buffer (under Emacs).
+;;
+(static-unless (featurep 'xemacs)
+  (defun gnus-offline-popup-menu (event)
+    "Popup menu for Gnus Offline."
+    (interactive "e")
+    (apply 'gnus-offline-popup
+          (if (boundp 'miee-popup-menu)
+              (list (or (assq 'keymap
+                              (assq 'Miee (assq 'menu-bar global-map)))
+                        miee-popup-menu)
+                    "Miee")
+            (list (symbol-value 'gnus-offline-menu-on-agent)
+                  "Offline")))))
 \f
 ;;
 ;; Timer Function
 (defun gnus-offline-processed-by-timer ()
   "*Set timer interval."
-  (if (and (> gnus-offline-interval-time 0)
-          (not gnus-offline-connected))
-      ;; Timer call
-      (gnus-demon-add-handler 'gnus-offline-gnus-get-new-news
-                             gnus-offline-interval-time
-                             gnus-offline-interval-time))
-  (if (= gnus-offline-interval-time 0)
-      (gnus-demon-remove-handler 'gnus-offline-gnus-get-new-news t)))
+  (let ((func (lambda () (call-interactively 'gnus-group-get-new-news)))
+       (time gnus-offline-interval-time))
+    (cond ((and (> time 0) (not gnus-offline-connected))
+          ;; Timer call
+          (gnus-demon-add-handler func time time))
+         ((= gnus-offline-interval-time 0)
+          (gnus-demon-remove-handler func t)))))
+;;
+;; Code for making Gnus and Gnus Offline cooperate with each other.
+;;
+
+;; Display `X-Gnus-Offline-Backend' message header aesthetically.
+(eval-after-load "eword-decode"
+  '(mime-set-field-decoder 'X-Gnus-Offline-Backend nil nil))
+
+;; Enable key and menu definitions here.
+(eval '(funcall 'gnus-offline-define-menu-and-key))
+
 ;;
 ;;
-(provide 'gnus-offline)
 ;;; gnus-offline.el ends here