+(defvar mime/tmp-dir (or (getenv "TM_TMP_DIR") "/tmp/"))
+
+(defvar mime/use-multi-frame
+ (and (>= emacs-major-version 19) window-system))
+
+(defvar mime/find-file-function
+ (if mime/use-multi-frame
+ (function find-file-other-frame)
+ (function find-file)
+ ))
+
+(defvar mime/output-buffer-window-is-shared-with-bbdb t
+ "*If t, mime/output-buffer window is shared with BBDB window.")
+
+
+;;; @ constants
+;;;
+
+(defconst mime/output-buffer-name "*MIME-out*")
+(defconst mime/temp-buffer-name " *MIME-temp*")
+
+
+;;; @ charset and encoding
+;;;
+
+(defvar mime-charset-type-list
+ '((us-ascii 7 nil)
+ (iso-8859-1 8 "quoted-printable")
+ (iso-8859-2 8 "quoted-printable")
+ (iso-8859-3 8 "quoted-printable")
+ (iso-8859-4 8 "quoted-printable")
+ (iso-8859-5 8 "quoted-printable")
+ (koi8-r 8 "quoted-printable")
+ (iso-8859-7 8 "quoted-printable")
+ (iso-8859-8 8 "quoted-printable")
+ (iso-8859-9 8 "quoted-printable")
+ (iso-2022-jp 7 "base64")
+ (iso-2022-kr 7 "base64")
+ (euc-kr 8 "base64")
+ (big5 8 "base64")
+ (iso-2022-jp-2 7 "base64")
+ (iso-2022-int-1 7 "base64")
+ ))
+
+(defun mime/encoding-name (transfer-level &optional not-omit)
+ (cond ((> transfer-level 8) "binary")
+ ((= transfer-level 8) "8bit")
+ (not-omit "7bit")
+ ))
+
+(defun mime/make-charset-default-encoding-alist (transfer-level)
+ (mapcar (function
+ (lambda (charset-type)
+ (let ((charset (upcase (symbol-name (car charset-type))))
+ (type (nth 1 charset-type))
+ (encoding (nth 2 charset-type))
+ )
+ (if (<= type transfer-level)
+ (cons charset (mime/encoding-name type))
+ (cons charset encoding)
+ ))))
+ mime-charset-type-list))
+
+
+;;; @ button
+;;;
+
+(defun tm:set-face-region (b e face)
+ (let ((overlay (tl:make-overlay b e)))
+ (tl:overlay-put overlay 'face face)
+ ))
+
+(setq tm:button-face 'bold)
+(setq tm:mouse-face 'highlight)
+
+(defun tm:add-button (from to func &optional data)
+ "Create a button between FROM and TO with callback FUNC and data DATA."
+ (and tm:button-face
+ (tl:overlay-put (tl:make-overlay from to) 'face tm:button-face))
+ (tl:add-text-properties from to
+ (append (and tm:mouse-face
+ (list 'mouse-face tm:mouse-face))
+ (list 'tm-callback func)
+ (and data (list 'tm-data data))
+ ))
+ )
+
+(defvar tm:mother-button-dispatcher nil)
+
+(defun tm:button-dispatcher (event)
+ "Select the button under point."
+ (interactive "e")
+ (let (buf point func data)
+ (save-window-excursion
+ (mouse-set-point event)
+ (setq buf (current-buffer)
+ point (point)
+ func (get-text-property (point) 'tm-callback)
+ data (get-text-property (point) 'tm-data)
+ )
+ )
+ (save-excursion
+ (set-buffer buf)
+ (goto-char point)
+ (if func
+ (apply func data)
+ (if (fboundp tm:mother-button-dispatcher)
+ (funcall tm:mother-button-dispatcher event)
+ )
+ ))))