;;; GNU Emacs refer mode package. Last tested under v18.59. 
;;; Alberto Segre (1989) segre@cs.cornell.edu

(provide 'refer)

;;; Refer-mode definition file.  Each command prompts for each field
;;; to be filled.  These functions only help in entering the majority
;;; of cases.  They will not fit all cases and so you have to some
;;; entering by hand.

;;; Add to auto-mode-alist to go into refer mode for .ref files.

(setq auto-mode-alist (cons '("\\.ref$" . refer-mode) auto-mode-alist))

;;; Refer major mode keymap.

(defvar refer-mode-map nil
  "Major mode keymap for refer-mode buffers")

(defun refer-mode ()
  (interactive)
  (kill-all-local-variables)
  (or refer-mode-map
      (progn (setq refer-mode-map (make-sparse-keymap))
	     (define-key refer-mode-map "\C-ca" 'refer-article)
	     (define-key refer-mode-map "\C-cb" 'refer-book)
	     (define-key refer-mode-map "\C-ch" 'refer-help)
	     (define-key refer-mode-map "\C-cj" 'refer-journal)
	     (define-key refer-mode-map "\C-cm" 'refer-misc)
	     (define-key refer-mode-map "\C-cp" 'refer-proceedings)
	     (define-key refer-mode-map "\C-cr" 'refer-report)
	     (define-key refer-mode-map "\C-ct" 'refer-thesis)))
  (use-local-map refer-mode-map)
  (setq mode-name "Refer")
  (setq major-mode 'refer-mode)
  (end-of-buffer)
  (initialize-refer-help)
  (refer-help))

(defun initialize-refer-help ()
  (or (get-buffer "*Refer Help*")
      (save-excursion
	(save-window-excursion
	  (let ((help-buffer (get-buffer-create "*Refer Help*")))
	    (princ "Refer Mode Help:\n\n" help-buffer)
	    (princ "  C-c a: Article in book.\n" help-buffer)
	    (princ "  C-c b: Book.\n" help-buffer)
	    (princ "  C-c h: Help (this page).\n" help-buffer)
	    (princ "  C-c j: Journal article.\n" help-buffer)
	    (princ "  C-c m: Miscellaneous entry.\n" help-buffer)
	    (princ "  C-c p: Conference Proceedings.\n" help-buffer)
	    (princ "  C-c r: Technical Report.\n" help-buffer)
	    (princ "  C-c t: Ph.D. Thesis.\n" help-buffer)
	    (set-buffer "*Refer Help*")
	    (set-buffer-modified-p nil)
	    (setq buffer-read-only t))))))

(defun refer-help ()
  (interactive)
  (save-excursion
    (initialize-refer-help)
    (delete-other-windows)
    (split-window (selected-window) (- (screen-height) 14))
    (display-buffer "*Refer Help*" t)
    (message "Type C-x 1 to remove refer help window.")))

(defun read-entry (keystring promptstring)
  (let ((entry (read-string promptstring "")))
    (cond ((string-equal "" entry) nil)
	  (t (insert-string (concat keystring entry))
	     (newline)
	     entry))))

(defun basic-entry (&optional inpt)
  (end-of-buffer)
  (read-entry "%T " "Title: ")
  (while (read-entry "%A " "Author: ")
	 nil))

(defun refer-article ()
  (interactive)
  (basic-entry)
  (read-entry "%B " "In Book: ")
  (while (read-entry "%E " "Editor: ")
	 nil)
  (read-entry "%I " "Publisher: ")
  (read-entry "%C " "City: ")
  (read-entry "%P " "Page numbers:")
  (read-entry "%D " "Date: ")
  (read-entry "%K " "Keywords: ")
  (newline))

(defun refer-book ()
  (interactive)
  (basic-entry)
  (read-entry "%I " "Publisher: ")
  (read-entry "%C " "City: ")
  (read-entry "%D " "Date: ")
  (read-entry "%K " "Keywords: ")
  (newline))

(defun refer-journal ()
  (interactive)
  (basic-entry)
  (read-entry "%J " "Journal: ")
  (read-entry "%V " "Volume number: ")
  (read-entry "%N " "Issue number: ")
  (read-entry "%P " "Page numbers: ")
  (read-entry "%D " "Date: ")
  (read-entry "%K " "Keywords: ")
  (newline))

(defun refer-misc ()
  (interactive)
  (basic-entry)
  (read-entry "%S " "Series title: ")
  (read-entry "%R " "Report number: ")
  (while (read-entry "%E " "Editor: ")
	 nil)
  (read-entry "%J " "Journal: ")
  (read-entry "%V " "Volume number: ")
  (read-entry "%N " "Issue number: ")
  (read-entry "%I " "Publisher: ")
  (read-entry "%C " "City: ")
  (read-entry "%P " "Page numbers: ")
  (read-entry "%D " "Date: ")
  (read-entry "%G " "Govt. order number: ")
  (read-entry "%F " "Caption: ")
  (read-entry "%O " "Other: ")
  (read-entry "%K " "Keywords: ")
  (newline))

(defun refer-proceedings ()
  (interactive)
  (basic-entry)
  (read-entry "%J " "Proceedings: ")
  (read-entry "%C " "City: ")
  (read-entry "%P " "Page numbers:")
  (read-entry "%D " "Date: ")
  (read-entry "%I " "Publisher: ")
  (read-entry "%K " "Keywords: ")
  (newline))

(defun refer-report ()
  (interactive)
  (basic-entry)
  (read-entry "%R " "Report number: ")
  (read-entry "%I " "Institution: ")
  (read-entry "%C " "City: ")
  (read-entry "%D " "Date: ")
  (read-entry "%K " "Keywords: ")
  (newline))

(defun refer-thesis ()
  (interactive)
  (basic-entry)
  (read-entry "%R " "Report number: ")
  (read-entry "%I Ph.D. thesis, " "Institution: ")
  (read-entry "%C " "City: ")
  (read-entry "%D " "Date: ")
  (read-entry "%K " "Keywords: ")
  (newline))
