Commits

youngs  committed 9e48fe5

Sync BBDB to version 2.32

Add ibuffer.el and search-buffers.el to edit-utils

Sync Eicq to version 0.2.14

Sync ilisp to version 5.11.1

Sync mailcrypt to version 3.5.6

  • Participants
  • Parent commits a0f8bbb
  • Tags eicq-1_05

Comments (0)

Files changed (37)

+2001-06-06  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq-report.el (eicq-report-debug): New.
+	(eicq-prepare-report): Use it.
+
+2001-06-05  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-version): Add optional arg so you can insert the
+	version string at point.  Autoload it.
+	(eicq-user-meta-web-aware): Type boolean.
+	(eicq-user-meta-hide-ip): Ditto.
+	(eicq-user-meta-authorization): Ditto.
+	(eicq-log-info-mark): Ditto.
+	(eicq-log-buddy-status-mark): Ditto.
+	(eicq-log-buddy-message-mark): Ditto.
+	(eicq-log-outgoing-mark): Ditto.
+	(eicq-log-error-mark): Ditto.
+	(eicq-log-debug-mark): Ditto.
+	(eicq-log-system-mark): Ditto.
+	(eicq-buddy-status-color-hint-flag): Ditto.
+
+	Most user variables moved to take advantage of new bug-report
+	code.
+
+2001-06-03  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-user-meta-birth-year): Format for this variable
+	should be YY, update doc accordingly.
+
+2001-05-31  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-pack-keep-alive-1): Remove - obsolete.
+	(eicq-pack-info-request): Ditto.
+	(eicq-pack-info-ext-request): Ditto.
+	(eicq-pack-update-info): Ditto.
+	(eicq-pack-update-info-ext): Ditto.
+	
+2001-05-20  Steve Youngs  <youngs@xemacs.org>
+
+	* Makefile (superupgrade): Make sure owner/group is set correctly
+	in source tree.
+
+	* eicq.texi: Finally started to write this.  Not finished yet,
+	but maybe by the end of the weekend.
+
+	* eicq.el (eicq-log-buddy-message): Switch to log buffer for smileys.
+	(eicq-auto-away-timeout-set): Use a 2nd itimer so auto na works 
+	properly.
+
+	* etc/eicq/world: Updated.  Somehow it got overwritten with an old
+	version of itself.
+
+2001-05-07  Steve Youngs  <youngs@xemacs.org>
+
+	* Makefile (superupgrade): New target for me only.
+
+	* eicq.el (eicq-buddy-show-buffer): Remove "*** Contacts ***".
+	(eicq-auto-away-timeout-set): Typo.
+	(eicq-interface): New customize group.
+	(eicq-hide-window): Add eicq-status-window.
+
+2001-05-05  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-status-show-buffer): Change name of buffer to "*Status*".
+
+2001-05-02  Steve Youngs  <youngs@xemacs.org>
+
+	* Makefile (AUTO_PRELOADS): New.
+
+2001-04-28  Steve Youngs  <youngs@xemacs.org>
+
+	* Version 0.2.13 released.
+
+	* eicq.el (eicq-message-sound): Removed, put into alist.
+	(eicq-chat-sound): Ditto.
+	(eicq-url-sound): Ditto.
+	(eicq-buddy-sound): Ditto.
+	(eicq-auth-sound): Ditto.
+	(eicq-emailx-sound): Ditto.
+	(eicq-pager-sound): Ditto.
+	(eicq-sound-alist): New.
+	(eicq-use-sound-flag): New.
+	(eicq-do-message-helper): Use 'eicq-sound-alist', 'eicq-use-sound-flag'.
+	(eicq-do-online): Ditto.
+	(eicq-log-buddy-message): Run 'smiley-buffer' and 'goto-address'.
+
+
+2001-04-22  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-buddy-show-buffer): Rename and rearrange status widgets.
+	(eicq-status-window-height): New.
+	(eicq-status-buffer): New.
+	(eicq-status-show-buffer): New.
+	(eicq-show-window): Show the status buffer as well.
+	(eicq-disconnect): Kill the status buffer.
+	(eicq-switch-to-buddy-buffer): New.
+
+	* eicq-toolbar.el: Reduced the number of tools on the toolbar.
+
+2001-04-21  Steve Youngs  <youngs@xemacs.org>
+
+	* Version 0.2.12 released.
+
+	* eicq-toolbar.el (eicq-toolbar-disconnect): Do 'eicq-logout' before
+	'eicq-disconnect'.
+	(eicq-buddy-toolbar): Remove.  Use the same toolbar for both the 
+	buddy and log buffers.
+	(eicq-install-buddy-toolbar): Use the log toolbar.
+
+	* eicq.el (eicq-do-login-confirm): Run 'eicq-show-window'.
+	(eicq-disconnect): Kill the Eicq buffers.
+	(eicq-log-mode): Load both the log menu and the buddy menu.
+	(eicq-buddy-mode): Ditto.
+
+2001-04-01  Steve Youngs  <youngs@xemacs.org>
+
+	* README: Added section about submitting patches.
+
+2001-03-21  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-log-next-unread): Make it interactive.
+	(eicq-log-previous-unread): Ditto.
+
+2001-03-19  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el (eicq-log-mode-map): 'n' & 'p' are now next and previous
+	Unread messages.  'N' & 'P' are for next and previous message.  
+	Mark unread has been moved to 'v'.
+	(eicq-buddy-show-buffer): Add widgets for changing status via the 
+	buddy buffer.
+
+2001-03-18  Jack Twilley  <jmt@tbe.net>
+
+	* eicq.el (eicq-log-next-unread): New.
+	(eicq-log-previous-unread): New.
+
+2001-03-12  Jack Twilley  <jmt@tbe.net>
+
+	* eicq.el (eicq-user-auto-away-p): New variable.
+	(eicq-auto-away-timeout-set): Use new variable, change docstring.
+	Reordered away tests.   
+	(eicq-send-message-helper): Use new variable.
+	(eicq-change-status): Use new variable.
+	(eicq-log-*-mark): New variables.
+	(eicq-log-*): Use new variables.
+	(eicq-log-buffer-position-flag): New variable.
+	(eicq-log-entry-re): New variable.
+	(eicq-log): Use new variables, change docstring.
+	(eicq-buddy-update-status): Only display status packet if status
+	has changed.
+
+2001-03-09  Steve Youngs  <youngs@xemacs.org>
+
+	* Version 0.2.11 released.
+
+	* eicq.el (eicq-blurb): Update.
+	(eicq-do-offline-message): Remove require 'timezone and move
+	it to top of file.
+
+	* eicq-report.el (eicq-prepare-report): New.
+	(reporter-version): Remove.
+	(vars): Ditto.
+	(reporter-confirm-p): Ditto.
+	(reporter-package-abbrev): Ditto.
+	(eicq-report-other-vars): Ditto.
+	(eicq-report-avoid-vars): Ditto.
+	(eicq-report-get-versions): Ditto.
+	(eicq-report-get-user-vars): Ditto.
+	(eicq-gnus-submit-report): Ditto.
+	(eicq-report-bug): Don't use reporter.el.
+
+	* eicq-toolbar.el (eicq-icon-directory): Make it customizable.
+
+2001-03-06  Steve Youngs  <youngs@xemacs.org>
+
+	* eicq.el: (eicq-delete-offline-messages-flag): Change default to 'ask.
+
+2001-03-06  Steve Youngs  <youngs@xemacs.org>
+
+	* Version 0.2.10 released.
+
+	* eicq.el: Re-arrange variables and constants for a clean build.
+	(eicq-version): Increment.
+	(eicq-bridge-filename): Change default to /usr/local/bin/udp2tcp
+	(eicq-browse-homepage): Autoload it.
+
+	* eicq-user-install.sh (RCFILE): Change default to
+	/usr/local/lib/xemacs/site-packages/etc/eicq/world.
+
+	* eicq-report.el: Update doc strings.
+
+	* eicq-toolbar.el: Ditto.
+	(eicq-icon-directory): Change default to
+	/usr/local/lib/xemacs/site-packages/etc/eicq/
+
+	* infohack: New file.
+
+	* README: Update URL.
+
+	* INSTALL: Updated to reflect not being an XEmacs Package.
+
+	* Makefile: Complete re-write to use standard 'make', 'make install'.
+
 2001-03-02  Steve Youngs  <youngs@xemacs.org>
 
 	* Makefile: Re-shuffle the order of the variables so everything
 
-===========================================================
-As of the latest version, I develop and test Eicq _only_ on
-my system, XEmacs 21.2.x & 21.1.x in GNU/Linux. I use some 
-XEmacs 20 specific codes and thus Eicq will not run in other 
-versions of Emacs without modifications. Feel free to test 
-and port it in other platforms, and send me the patch.
-===========================================================
+========================================================================
+As of the latest version, I develop and test Eicq _only_ on my system,
+XEmacs 21.2.x on GNU/Linux. I use some XEmacs 20 specific codes and thus
+Eicq will not run in other versions of Emacs without modifications. Feel
+free to test and port it in other platforms, and send me the patch.
+========================================================================
 
 This installation is definitely a 'no-brainer'
 
-1 - cd /usr/local/lib/xemacs/xemacs-packages RET (or where your package
-      root is)
-2 - tar zxvf /path/to/eicq-x.x.x.tar.gz RET
-
-Yeah, I know, you're swearing at me because you've already unpacked the
-thing to /usr/local/src.  Well life is full of things like that... :P
+1) Check the Makefile, and edit anything as required.
+2) 'make'
+3) become 'root' and then 'make install'
 
 Hold it, you're not finished yet...
 
 
 As the user that will be using Eicq, run...
 
-/usr/local/lib/xemacs/xemacs-packages/lib-src/eicq-user-install.sh
+eicq-user-install.sh
 
 That will set up the needed stuff in your home directory.
 

File Makefile.upstream

+## Makefile for Eicq   -*-Makefile-*-
+
+## Copyright (C) 2001 Steve Youngs
+
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+PACKAGE = eicq
+
+# csh... yell no, we won't go!
+SHELL = /bin/sh
+
+# Everything hangs off this.  
+PREFIX = /usr/local
+
+# Where the lisp files go.
+LISP_DIR = $(PREFIX)/lib/xemacs/site-packages/lisp/$(PACKAGE)
+
+# Where the toolbar images go.
+DATA_DIR = $(PREFIX)/lib/xemacs/site-packages/etc/$(PACKAGE)
+
+# Where the binary and user install script go.
+BIN_DIR = $(PREFIX)/bin
+
+# Where the info files go.
+INFO_DIR = $(PREFIX)/lib/xemacs/site-packages/info
+
+# Programs and their flags.
+EMACS = xemacs
+EMACS_FLAGS = -batch
+CC = g++
+CFLAGS = -O2 -Wall
+INSTALL = ginstall -o 0 -g 0
+INSTALL_INFO = install-info
+INSTALL_INFO_FLAGS = --info-dir=/usr/info \
+	--info-file=$(INFO_DIR)/$(PACKAGE).info
+
+############################################################################
+##                No User Configurable Items Below Here                   ##
+############################################################################
+
+BIN = udp2tcp
+USERSH = eicq-user-install.sh
+OBJECTS = eicq.elc eicq-toolbar.elc eicq-report.elc 
+SOURCES = eicq.el eicq-toolbar.el eicq-report.el 
+EXTRA_SRC = ChangeLog INSTALL NEWS README TODO
+EXTRA_OBJ = $(wildcard ./auto-autoloads.el*) $(wildcard ./custom-load.el*)
+DATA_FILES = $(wildcard ./etc/$(PACKAGE)/*.xpm) ./etc/$(PACKAGE)/world
+TEXI_FILES = $(PACKAGE).texi
+INFO_FILES = $(wildcard ./$(PACKAGE).info*)
+
+EICQ_INFO_COMPILE = ./infohack.el 
+PRELOADS = -eval \("push default-directory load-path"\)
+AUTO_PRELOADS = -eval \("setq autoload-package-name \"$(PACKAGE)\""\)
+
+.SUFFIXES:
+.SUFFIXES: .info .texi .elc .el
+
+all:: bin autoloads $(OBJECTS) customloads texinfo
+
+bin: $(BIN).cc
+	$(CC) $(CFLAGS) -o $(BIN) $(BIN).cc
+
+autoloads: auto-autoloads.el
+
+customloads: custom-load.el
+
+.el.elc:
+	$(EMACS) $(EMACS_FLAGS) $(PRELOADS) -f batch-byte-compile $<
+
+texinfo: $(TEXI_FILES)
+	$(EMACS) $(EMACS_FLAGS) -l $(EICQ_INFO_COMPILE) -f batch-makeinfo $<
+
+auto-autoloads.el : $(SOURCES)
+	$(EMACS) $(EMACS_FLAGS) $(AUTO_PRELOADS) -f batch-update-directory ./
+	$(EMACS) $(EMACS_FLAGS) -f batch-byte-compile ./auto-autoloads.el
+
+custom-load.el : $(SOURCES)
+	$(EMACS) $(EMACS_FLAGS) -f Custom-make-dependencies ./
+	$(EMACS) $(EMACS_FLAGS) -f batch-byte-compile ./custom-load.el
+
+install: all
+	$(INSTALL) -d $(BIN_DIR) $(DATA_DIR) $(INFO_DIR) $(LISP_DIR)
+	$(INSTALL) -s -m 755 $(BIN) $(BIN_DIR)
+	$(INSTALL) -m 755 $(USERSH) $(BIN_DIR)
+	$(INSTALL) -m 644 $(DATA_FILES) $(DATA_DIR)
+	$(INSTALL) -m 644 $(INFO_FILES) $(INFO_DIR)
+	$(INSTALL) -m 644 $(SOURCES) $(EXTRA_SRC) $(OBJECTS) $(EXTRA_OBJ) \
+		$(LISP_DIR)
+	$(INSTALL_INFO) $(INSTALL_INFO_FLAGS)
+
+
+upgrade: uninstall install
+
+uninstall:: 
+	rm -rf $(DATA_DIR) $(LISP_DIR)
+	rm -f $(INFO_DIR)/$(INFO_FILES) $(BIN_DIR)/$(BIN) $(BIN_DIR)/$(USERSH)
+	$(INSTALL_INFO) --remove $(INSTALL_INFO_FLAGS)
+
+clean::
+	rm -f $(OBJECTS) $(BIN) $(INFO_FILES) \
+		auto-autoloads.el* custom-load.el*
+
+distclean: clean
+	rm -f core *~
+
+# Targets for Steve only.
+superupgrade: distclean upgrade
+	chown -R steve.xemacs /usr/local/lib/xemacs/site-packages/*
+	chown -R steve.xemacs ./*
--*- outline -*-
+-*- Outline -*-
 
-* from 0.2.8 to 0.2.9
+* 0.2.13 to 0.2.14
 
-** New function 'eicq-report-bug'
-** 'eicq-email-author' uses Gnus if available.
+- Rewrote the bug report code.  
+	It now reports any user variable that has be changed 
+	from the default.
+- eicq-version now accepts arg.
+	So C-u M-x eicq-version RET will insert the version string
+	in the current buffer at point.
+- Added type boolean to all the 'on/off' defcustoms.
+- Removed some obsolete v2 stuff.
+	
 
-* from 0.2.5 to 0.2.8
+* 0.2.12 to 0.2.13
 
-** Mainly just doc fixes.
+- The number of tools on toolbar reduced.
+- Statuses moved from buddy buffer to their own read-only buffer.
+- Smilies 
+- URL/email highlighting in normal messages.
+- Can turn sounds off/on.
 
-* from 0.2.4 to 0.2.5
+* 0.2.11 to 0.2.12
 
-** entered into the mainstream XEmacs packages
+- Change status via widgets in the buddy buffer.
+- In log buffer:
+	'n' move to next unread message
+	'p' move to previous unread message
+	'N' move to next message (whether read or unread)
+	'P' move to previous message (whether read or unread)
+	Outgoing messages are automatically marked as read.
+- Auto away/na timeouts now work correctly.
+- Auto online after a auto away/na.
+- Use the same toolbar in both the log and buddy buffers.
+- M-x eicq-login automatically brings up the buddy and log buffers.
+- The toolbar button "Disconnect":
+	Does a 'eicq-logout'
+	Kills the Eicq buffers.
 
-* from 0.2.3 to 0.2.4
+* 0.2.10 to 0.2.11
 
-** clickety click toolbars
-** new locations for files (a system wide approach)
-** more sound
+- 'eicq-report-bug' now working.
 
-* from 0.2.2 to 0.2.3
+* 0.2.9 to 0.2.10
 
-** sound added
+- No longer distributed as an XEmacs package (due to compatibility issues)
+- Re-arrange variables so that everything compiles cleanly with no errors.
+- Uses XEmacs to create the info documentation.
 
-* from 0.2.1 to 0.2.2
+* 0.2.8 to 0.2.9
 
-** highlight alias and url (from Erik)
-** world-mode
-** eicq-change-user, eicq-hide-window
+- New function 'eicq-report-bug'
+- 'eicq-email-author' uses Gnus if available.
 
-* from 0.2.0 to 0.2.1
+* 0.2.5 to 0.2.8
 
-** remove relogin, more stable
+- Mainly just doc fixes.
 
-* from 0.1.3 to 0.2.0
+* 0.2.4 to 0.2.5
 
-** ICQ version 5 protocol
-** meta user info query and update
-** register new user, change password
-** receive contact list transfer
-** forward message
-** more stable (less kicked out)
+- entered into the mainstream XEmacs packages
 
-* from 0.1.2 to 0.1.3
+* 0.2.3 to 0.2.4
 
-** restructure of eicq-world
-** use resource file instead of lisp structure
-** new files in package: NEWS and world (resource file)
-** alias selection as temporary group
-** fixed random popping up uin
-** safer udp2tcp: use length prefix instead of delimiting magic string
-** eicq-do-status-update-hook and eicq-do-message-hook for customization
-** split and send long messages
-** search users, update basic info and extended info
-** relogin quiently after being kicked out
-** auto-na
+- clickety click toolbars
+- new locations for files (a system wide approach)
+- more sound
+
+* 0.2.2 to 0.2.3
+
+- sound added
+
+* 0.2.1 to 0.2.2
+
+- highlight alias and url (from Erik)
+- world-mode
+- eicq-change-user, eicq-hide-window
+
+* 0.2.0 to 0.2.1
+
+- remove relogin, more stable
+
+* 0.1.3 to 0.2.0
+
+- ICQ version 5 protocol
+- meta user info query and update
+- register new user, change password
+- receive contact list transfer
+- forward message
+- more stable (less kicked out)
+
+* 0.1.2 to 0.1.3
+
+- restructure of eicq-world
+- use resource file instead of lisp structure
+- new files in package: NEWS and world (resource file)
+- alias selection as temporary group
+- fixed random popping up uin
+- safer udp2tcp: use length prefix instead of delimiting magic string
+- eicq-do-status-update-hook and eicq-do-message-hook for customization
+- split and send long messages
+- search users, update basic info and extended info
+- relogin quiently after being kicked out
+- auto-na
+
+
 
 * Introduction
 
-http://users.ozlinx.com.au/~youngs_s/eicq/README (version 0.2.5)
+http://eicq.sourceforge.net/INSTALL (version 0.2.14)
 
 This file is best viewed under XEmacs. Press C-c C-o now to
 see the outline of topics. You can use XEmacs menu to
 
 eicq uses version 5 protocol and it can:
 
-- send message/url to single or multi users or group
+- send message/url
 - authorize, search, query and update meta user info
 - receive contact list transfer
 - register new user, change password
 * Installation
 See the file 'INSTALL' in this directory.
 
-You can also subscribe to eicq mailing list by sending an
-email to majordomo@aarg.net with "subscribe eicq" in the
-body.
+There are a few mailing lists. See <http://eicq.sourceforge.net/#maillist>
 
 Have fun!
 
+* Submitting Patches
+If you've got a patch for a bug fix or some wiz-bang new feature mail
+them to <eicq-devel@lists.sourceforge.net>.  The Eicq developers will
+review your contribution and either accept it and add it to the Eicq
+code, or reject it.  Whether accepted or rejected, you'll hear back
+from us.
+
+Two things, one an insistance, and one a preference...
+
+	- I insist that every patch has a ChangeLog entry.  If you
+	  think your change isn't worth doing a ChangeLog entry for,
+	  do one anyway.  Leave it to me to decide whether or not it's
+	  worth it.
+
+	- I prefer unified diffs. (diff -u oldfile newfile > patch.diff). 
+	  I simply find unified diffs much easier to review.
+
 * Faq and tips
 
 ** password
 And just because something is on the list doesn't mean that it will
 become part of Eicq.
 
-Feel free to do any of these things and send me a patch
-<youngs@xemacs.org>
+Feel free to do any of these things and send a patch to
+<eicq-devel@lists.sourceforge.net>
 
 * Todo list
 
-** write the info docs (this one probably is a priority)
-
-** hilarious auto reply messages
-
-** face colors for light background
-
 ** figure out why sometime being kicked out after long inactivity
 
 ** builtin udp support in XEmacs
 
 	not necessary once Eicq is totally Lisp.
 
-** eicq-report-bug
-
-	Use Gnus if available (partially implemented already)

File eicq-report.el

 
 ;; Copyright (C) 2001 Steve Youngs
 
+;; RCS: $Id$
+;; Author: Steve Youngs <youngs@xemacs.org>
+;; Maintainer: Steve Youngs <youngs@xemacs.org>
+;; Last-Modified: <2001-6-6 00:29:58 (steve)>
+;; Keywords: bug-report
 
-;; This program is free software; you can redistribute it and/or modify
+;; Eicq is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation; either version 2 of the License, or
 ;; (at your option) any later version.
 
-;; This program is distributed in the hope that it will be useful,
+;; Eicq is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
 ;;; Code:
 (require 'eicq)
 (require 'gnus)
-(require 'gnus-util)
-(require 'reporter)
 
-(defvar reporter-version) ; For the byte-compiler
+;; To keep the byte-compiler from spewing out warnings.
+(defvar after-sep-pos)
+(defvar final-resting-place)
 
 ;;; Variables
 
    "Salut bug team:"
    "Guten Tag bug team:"
    "To whom it may concern:"
-   "Fellow eicq'ers:"
+   "Fellow Eicq'ers:"
    "Yo bug team:"
    "G'day bug team:"
-   "Greetings earthlings:"]
+   "Greetings Earthlings:"]
   "A list of salutations used for `eicq-report-bug'.")
 
 (defvar eicq-bug-address
   "Eicq Bugs <eicq-bugs@lists.sourceforge.net>"
   "The address used for submitting bug reports.")
 
-(defconst eicq-report-other-vars
-  '(reporter-version
-    features)
-  "A list of variables that aren't generated below.")
+(defvar eicq-report-blurb nil)
 
-(defconst eicq-report-avoid-vars
-  '(eicq-user-password
-    eicq-auto-away-timeout
-    eicq-world-rc-regexp
-    eicq-global-key-prefix)
-  "A list of variables we don't want to see in the bug report.")
-
-(defvar eicq-report-blurb nil)
 ;;; Functions
 
-(defun eicq-report-get-versions ()
-  "Return a list of eicq versions variables."
-  (mapcar
-   'intern
-   (sort
-    (let (completion-ignore-case)
-      (all-completions
-       "eicq-" obarray
-       (function
-	(lambda (sym)
-	  (and (boundp sym)
-	       (let ((name (symbol-name sym)))
-		 (and (>= (length name) 8)
-		      (string-equal (substring name -8) "-version"))))))))
-    'string-lessp)))
-
-(defun eicq-report-get-user-vars ()
-  "Return a list of eicq user variables."
-  (mapcar
-   'intern
-   (sort
-    (let (completion-ignore-case)
-      (all-completions "eicq-" obarray 'user-variable-p))
-    'string-lessp)))
-
 (defun eicq-report-pre-hook ()
   "Pre hook run by report-submit-bug-report."
   (message-goto-subject)
 	   ?\n ?\ )
 	(insert subj)))))
 
-(defun eicq-gnus-submit-report ()
-  "Mimic `reporter-submit-bug-report', but use Gnus."
-  (unless (gnus-alive-p)
-    (gnus))
-  (gnus-group-mail 1)
+;; Stolen from Gnus.
+(defun eicq-report-debug ()
+  "Go through the Eicq source files and report what variables have been changed.
+The source file has to be in the load path."
+  (interactive)
+  (let ((files '("eicq.el" "eicq-toolbar.el"))
+	(point (point))
+	file expr olist sym)
+    (message "Please wait while we snoop your variables...")
+    (sit-for 0)
+    ;; Go through all the files looking for non-default values for variables.
+    (save-excursion
+      (set-buffer (get-buffer-create " *eicq bug info*"))
+      (while files
+	(erase-buffer)
+	(when (and (setq file (locate-library (pop files)))
+		   (file-exists-p file))
+	  (insert-file-contents file)
+	  (goto-char (point-min))
+	  (if (not (re-search-forward "^;;* *Internal variables" nil t))
+	      (message "Malformed sources in file %s" file)
+	    (narrow-to-region (point-min) (point))
+	    (goto-char (point-min))
+	    (while (setq expr (ignore-errors (read (current-buffer))))
+	      (ignore-errors
+		(and (or (eq (car expr) 'defvar)
+			 (eq (car expr) 'defcustom))
+		     (stringp (nth 3 expr))
+		     (or (not (boundp (nth 1 expr)))
+			 (not (equal (eval (nth 2 expr))
+				     (symbol-value (nth 1 expr)))))
+		     (push (nth 1 expr) olist)))))))
+      (kill-buffer (current-buffer)))
+    (when (setq olist (nreverse olist))
+      (insert "\n"))
+    (while olist
+      (if (boundp (car olist))
+	  (condition-case ()
+	      (pp `(setq ,(car olist)
+			 ,(if (or (consp (setq sym (symbol-value (car olist))))
+				  (and (symbolp sym)
+				       (not (or (eq sym nil)
+						(eq sym t)))))
+			      (list 'quote (symbol-value (car olist)))
+			    (symbol-value (car olist))))
+		  (current-buffer))
+	    (error
+	     (format "(setq %s 'whatever)\n" (car olist))))
+	(insert ";; (makeunbound '" (symbol-name (car olist)) ")\n"))
+      (setq olist (cdr olist)))
+    (insert "\n\n\n")
+    ;; Remove any control chars - they seem to cause trouble for some
+    ;; mailers.  (Byte-compiled output from the stuff above.)
+    (goto-char point)
+    (while (re-search-forward "[\000-\010\013-\037\200-\237]" nil t)
+      (replace-match (format "\\%03o" (string-to-char (match-string 0)))
+		     t t))))
+
+(defun eicq-prepare-report ()
+  "Grabs the variables, features to include in bug report.
+Then put it all into a mail buffer, nicely formatted."
   (message-goto-to)
   (insert eicq-bug-address)
   (message-goto-body)
   (forward-line 1)
   (setq after-sep-pos (point))
   (setq final-resting-place (point-marker))
-  (insert "\n\n")
-  (reporter-dump-state
-   "eicq"
-   vars
-   nil nil)
+  (insert "\n\n"
+	  (emacs-version) "\n")
+  (eicq-version 1)
+  (insert "\n\nCurrent State:\n==============")
+  (eicq-report-debug)
+  (insert
+   (format "\n\nFeatures:\n\t%s" (symbol-value 'features)))
+  (message "Formatting output so the bug team can read it.  Please wait...")
+  (fill-paragraph t)
   (insert "\n\n")
   (eicq-report-pre-hook)
   (eicq-report-post-hook)
 (defun eicq-report-bug (&optional blurb no-confirm)
   "Submit a bug report for eicq.
 Optional argument BLURB is a string that adds a preamble to the bug report.
-Optional argument NO-CONFIRM if 't' will not ask for confirmation."
+Optional argument NO-CONFIRM if 't' will not ask for confirmation.
+
+If you have Gnus it will be used, otherwise the standard XEmacs mail
+command is used.
+
+Yes, it's all part of a secret plot to make more people use 
+the MUA of Gods.  Bwahahaha."
   (interactive)
-  (let ((reporter-confirm-p nil)
-	(reporter-prompt-for-summary-p nil)
-	(reporter-package-abbrev "eicq"))
-    ;; Look out for old reporter versions.
-    (or (boundp 'reporter-version)
-	(setq reporter-version
-	      "Your version of reporter is obsolete.  Please upgrade."))
-    (if (or no-confirm
-	    (y-or-n-p "Do you want to submit a bug report on Eicq? "))
-	(let ((eicq-report-blurb blurb)
-	      (vars (nconc (eicq-report-get-versions)
-			   (eicq-report-get-user-vars)
-			   eicq-report-other-vars))
-	      (avoids eicq-report-avoid-vars))
-	  (while avoids
-	    (setq vars (delq (car avoids) vars))
-	    (setq avoids (cdr avoids)))
-	  (if (featurep 'gnus)
-	      (eicq-gnus-submit-report)
-	    (reporter-submit-bug-report
-	     eicq-bug-address
-	     "eicq"
-	     vars
-	     (function eicq-report-pre-hook)
-	     (function eicq-report-post-hook)
-	     (aref eicq-report-salutations
-		   (% (+ (% (random) 1000) 1000)
-		      (length eicq-report-salutations)))))))))
+  (if (or no-confirm
+	  (y-or-n-p "Do you want to submit a bug report on Eicq? "))
+      (progn
+	(setq eicq-report-blurb blurb)
+	(if (featurep 'gnus)
+	    (progn
+	      (unless (gnus-alive-p)
+		(gnus))
+	      (gnus-group-mail 1)
+	      (eicq-prepare-report))
+	  (mail)
+	  (eicq-prepare-report)))))
 
 ;;; email-author code
 
 
 ;;;###autoload
 (defun eicq-email-author ()
-  "Email comments or money to author."
+  "Email comments or money to author.
+
+Uses Gnus if available, otherwise standard mail command."
   (interactive)
   (if (y-or-n-p "Do you want to send comments to the Eicq author? ")
       (progn
 (provide 'eicq-report)
 
 ;;; eicq-report.el ends here
+
+
+;Local Variables:
+;time-stamp-start: "Last-Modified:[ 	]+\\\\?[\"<]+"
+;time-stamp-end: "\\\\?[\">]"
+;time-stamp-line-limit: 10
+;time-stamp-format: "%4y-%m-%d %02H:%02M:%02S (%u)"
+;End: 

File eicq-toolbar.el

-;; eicq-toolbar.el   -*-Emacs-Lisp-*-
-;; $Id$
-;; Copyright (C) 2000 Steve Youngs
+;;; eicq-toolbar.el --- A toolbar for Eicq   -*-Emacs-Lisp-*-
 
+;; Copyright (C) 2000, 2001 Steve Youngs
 
+;; RCS: $Id$
 ;; Author: Steve Youngs <youngs@xemacs.org>
-;;
+;; Maintainer: Steve Youngs <youngs@xemacs.org>
+;; Last-Modified: <2001-6-5 21:56:16 (steve)>
 ;; Keywords: eicq, toolbar, comm
 
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
+;; Eicq is free software; you can redistribute it and/or modify it
 ;; under the terms of the GNU General Public License as published by the
 ;; Free Software Foundation; either version 2, or (at your option) any
 ;; later version.
 
-;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
+;; Eicq is distributed in the hope that it will be useful, but WITHOUT
 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 ;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 ;; for more details.
 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;; Boston, MA 02111-1307, USA.
 
-;; Commentary:
+;;; Commentary:
+;; 
+;;            A toolbar for eicq.
+;;
+(require 'eicq)
 
-;;            A toolbar for eicq
-
-;; Set some variables for the icon directory and files
-(eval-when-compile
-  (require 'eicq))
-
-(defvar eicq-icon-directory 
-  "/usr/local/lib/xemacs/xemacs-packages/etc/eicq/"
-  "The directory where the icon data files for eicq are installed.")
-
-(defvar eicq-password-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "password.xpm" eicq-icon-directory))
-  "A password toolbar icon.")
-
-(defvar eicq-show-log-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "show.xpm" eicq-icon-directory))
-  "A show-window toolbar icon.")
-
-(defvar eicq-hide-log-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "hide.xpm" eicq-icon-directory))
-  "A hide log toolbar icon.")
-
-(defvar eicq-send-message-here-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "send-message-here.xpm" eicq-icon-directory))
-  "A send message toolbar icon.")
-
-(defvar eicq-send-message-around-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "send-message-around.xpm" eicq-icon-directory))
-  "A send message toolbar icon.")
-
-(defvar eicq-send-url-here-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "url-here.xpm" eicq-icon-directory))
-  "A send URL toolbar icon.")
-
-(defvar eicq-send-url-around-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "url-around.xpm" eicq-icon-directory))
-  "A send URL toolbar icon.")
-
-(defvar eicq-query-info-here-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "query-here.xpm" eicq-icon-directory))
-  "A query info here toolbar icon.")
-
-(defvar eicq-query-info-around-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "query-around.xpm" eicq-icon-directory))
-  "A query info here toolbar icon.")
-
-(defvar eicq-update-info-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "update-info.xpm" eicq-icon-directory))
-  "A update info toolbar icon.")
-
-(defvar eicq-search-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "search.xpm" eicq-icon-directory))
-  "A search toolbar icon.")
-
-(defvar eicq-authorize-here-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "authorize-here.xpm" eicq-icon-directory))
-  "A authorize toolbar icon.")
-
-(defvar eicq-authorize-around-icon 
-  (toolbar-make-button-list 
-   (expand-file-name "authorize-around.xpm" eicq-icon-directory))
-  "A authorize toolbar icon.")
-
-(defvar eicq-login-icon
-  (toolbar-make-button-list
-   (expand-file-name "login.xpm" eicq-icon-directory))
-  "A login toolbar icon")
-
-(defvar eicq-logout-icon
-  (toolbar-make-button-list
-   (expand-file-name "logout.xpm" eicq-icon-directory))
-  "A logout toolbar icon")
-
-(defvar eicq-disconnect-icon
-  (toolbar-make-button-list
-   (expand-file-name "disconnect.xpm" eicq-icon-directory))
-  "A disconnect toolbar icon")
-
-(defvar eicq-mark-log-read-icon
-  (toolbar-make-button-list
-   (expand-file-name "read.xpm" eicq-icon-directory))
-  "Mark log read toolbar icon")
-
-(defvar eicq-mark-log-unread-icon
-  (toolbar-make-button-list
-   (expand-file-name "unread.xpm" eicq-icon-directory))
-  "Mark log unread toolbar icon")
-
-(defvar eicq-next-log-icon
-  (toolbar-make-button-list
-   (expand-file-name "next.xpm" eicq-icon-directory))
-  "Next log item toolbar icon")
-
-(defvar eicq-previous-log-icon
-  (toolbar-make-button-list
-   (expand-file-name "previous.xpm" eicq-icon-directory))
-  "Previous log item toolbar icon")
-
-(defvar eicq-new-log-icon
-  (toolbar-make-button-list
-   (expand-file-name "new-log.xpm" eicq-icon-directory))
-  "New log file toolbar icon")
-
-(defvar eicq-contract-log-icon
-  (toolbar-make-button-list
-   (expand-file-name "contract.xpm" eicq-icon-directory))
-  "Contract the log toolbar icon")
-
-(defvar eicq-expand-log-icon
-  (toolbar-make-button-list
-   (expand-file-name "expand.xpm" eicq-icon-directory))
-  "Expand the log toolbar icon")
-
-;; Define the functions for the toolbar
-
-(defun eicq-toolbar-change-password (password)
-  "Change password from the toolbar."
-  (interactive (list (read-passwd "Password: " 'confirm)))
-  (eicq-change-password password))
-
-(defun eicq-toolbar-show-log ()
-  "Show the log window from the toolbar"
-  (interactive)
-  (eicq-show-window))
-
-(defun eicq-toolbar-hide-log ()
-  "Hide the log window from the toolbar"
-  (interactive)
-  (eicq-hide-window))
-
-(defun eicq-toolbar-send-message-here ()
-  "Send message from toolbar"
-  (interactive)
-  (eicq-send-message-alias-here))
-
-(defun eicq-toolbar-send-message-around ()
-  "Send message from toolbar"
-  (interactive)
-  (eicq-send-message))
-
-(defun eicq-toolbar-send-url-here ()
-  "Send URL from the toolbar"
-  (interactive)
-  (eicq-send-url-alias-here))
-
-(defun eicq-toolbar-send-url-around ()
-  "Send URL from the toolbar"
-  (interactive)
-  (eicq-send-url))
-
-(defun eicq-toolbar-query-info-here ()
-  "Query info from the toolbar"
-  (interactive)
-  (eicq-query-info-alias-here))
-
-(defun eicq-toolbar-query-info-around ()
-  "Query info from the toolbar"
-  (interactive)
-  (eicq-query-info))
-
-(defun eicq-toolbar-update-info ()
-  "Update meta info from the toolbar"
-  (interactive)
-  (eicq-update-meta-info))
-
-(defun eicq-toolbar-search (nick-name first-name last-name email)
-  "Search from the toolbar"
-  (interactive "sNick-name: \nsFirst-name: \nsLast-name: \nsEmail: \n")
-  (eicq-search nick-name first-name last-name email))
-
-(defun eicq-toolbar-authorize-here ()
-  "Authorize from the toolbar"
-  (interactive)
-  (eicq-authorize-alias-here))
-
-(defun eicq-toolbar-authorize-around ()
-  "Authorize from the toolbar"
-  (interactive)
-  (eicq-authorize))
-
-(defun eicq-toolbar-login ()
-  "Login from the toolbar"
-  (interactive)
-  (eicq-login))
-
-(defun eicq-toolbar-logout ()
-  "Logout from the toolbar"
-  (interactive)
-  (eicq-logout))
-
-(defun eicq-toolbar-disconnect ()
-  "Disconnect from the toolbar"
-  (interactive)
-  (eicq-disconnect))
-
-(defun eicq-toolbar-log-read ()
-  "Mark log item read from the toolbar"
-  (interactive)
-  (eicq-log-mark-read))
-
-(defun eicq-toolbar-log-unread ()
-  "Mark log item unread from the toolbar"
-  (interactive)
-  (eicq-log-mark-unread))
-
-(defun eicq-toolbar-next-log ()
-  "Next log item from the toolbar"
-  (interactive)
-  (eicq-log-next 1))
-
-(defun eicq-toolbar-previous-log ()
-  "Previous log item from the toolbar"
-  (interactive)
-  (eicq-log-previous 1))
-
-(defun eicq-toolbar-new-log ()
-  "New log file from the toolbar"
-  (interactive)
-  (eicq-log-new-file))
-
-(defun eicq-toolbar-contract-log ()
-  "Contract the log from the toolbar"
-  (interactive)
-  (eicq-log-contract))
-
-(defun eicq-toolbar-expand-log ()
-  "Expand the log from the toolbar"
-  (interactive)
-  (eicq-log-expand))
-
-;; Now define the toolbar
-
-(defvar eicq-buddy-toolbar
-  '([eicq-password-icon 
-     eicq-toolbar-change-password t "Change password"]
-    [eicq-show-log-icon 
-     eicq-toolbar-show-log t "Show log"]
-    [eicq-hide-log-icon 
-     eicq-toolbar-hide-log t "Hide log"]
-    [eicq-send-message-here-icon 
-     eicq-toolbar-send-message-here t "Send message here"]
-    [eicq-send-message-around-icon
-     eicq-toolbar-send-message-around t "Send message..."]
-    [eicq-send-url-here-icon 
-     eicq-toolbar-send-url-here t "Send URL here"]
-    [eicq-send-url-around-icon 
-     eicq-toolbar-send-url-around t "Send URL..."]
-    [eicq-query-info-here-icon 
-     eicq-toolbar-query-info-here t "Query info here"]
-    [eicq-query-info-around-icon
-     eicq-toolbar-query-info-around t "Query info..."]
-    [eicq-update-info-icon 
-     eicq-toolbar-update-info t "Update info"]
-    [eicq-search-icon 
-     eicq-toolbar-search t "Search"]
-    [eicq-authorize-here-icon 
-     eicq-toolbar-authorize-here t "Authorize here"]
-    [eicq-authorize-around-icon
-     eicq-toolbar-authorize-around t "Authorize..."]
-    [eicq-login-icon
-     eicq-toolbar-login t "Login"]
-    [eicq-logout-icon
-     eicq-toolbar-logout t "Logout"]
-    [eicq-disconnect-icon
-     eicq-toolbar-disconnect t "Disconnect"])
-  "The clickety click eicq buddy toolbar")
-
-(defvar eicq-log-toolbar
-  '([eicq-send-message-here-icon 
-     eicq-toolbar-send-message-here t "Send message here"]
-    [eicq-send-message-around-icon
-     eicq-toolbar-send-message-around t "Send message..."]
-    [eicq-send-url-here-icon 
-     eicq-toolbar-send-url-here t "Send URL here"]
-    [eicq-send-url-around-icon 
-     eicq-toolbar-send-url-around t "Send URL..."]
-    [eicq-query-info-here-icon 
-     eicq-toolbar-query-info-here t "Query info here"]
-    [eicq-query-info-around-icon
-     eicq-toolbar-query-info-around t "Query info..."]
-    [eicq-authorize-here-icon 
-     eicq-toolbar-authorize-here t "Authorize here"]
-    [eicq-authorize-around-icon
-     eicq-toolbar-authorize-around t "Authorize..."]
-    [eicq-mark-log-read-icon
-     eicq-toolbar-log-read t "Mark read"]
-    [eicq-mark-log-unread-icon
-     eicq-toolbar-log-unread t "Mark unread"]
-    [eicq-next-log-icon
-     eicq-toolbar-next-log t "Next"]
-    [eicq-previous-log-icon
-     eicq-toolbar-previous-log t "Previous"]
-    [eicq-new-log-icon
-     eicq-toolbar-new-log t "New log file"]
-    [eicq-contract-log-icon
-     eicq-toolbar-contract-log t "Contract log"]
-    [eicq-expand-log-icon
-     eicq-toolbar-expand-log t "Expand log"]
-    [eicq-login-icon
-     eicq-toolbar-login t "Login"]
-    [eicq-logout-icon
-     eicq-toolbar-logout t "Logout"]
-    [eicq-disconnect-icon
-     eicq-toolbar-disconnect t "Disconnect"])
-  "A clickety click eicq log buffer toolbar")
+;;; Code:
+(defcustom eicq-icon-directory
+  "/usr/local/lib/xemacs/site-packages/etc/eicq/"
+  "*The directory where the icon files for Eicq are installed."
+  :group 'eicq-option
+  :type 'directory
+  :tag "Toolbar Directory")
 
 (defcustom eicq-use-toolbar (if (featurep 'toolbar)
 				'default-toolbar
 		 (const :tag "no toolbar" nil))
   :group 'eicq-option)
 
+;;; Internal variables
+
+(defvar eicq-password-icon
+  (toolbar-make-button-list
+   (expand-file-name "password.xpm" eicq-icon-directory))
+  "A password toolbar icon.")
+
+(defvar eicq-send-message-here-icon
+  (toolbar-make-button-list
+   (expand-file-name "send-message-here.xpm" eicq-icon-directory))
+  "A send message toolbar icon.")
+
+(defvar eicq-send-message-around-icon
+  (toolbar-make-button-list
+   (expand-file-name "send-message-around.xpm" eicq-icon-directory))
+  "A send message toolbar icon.")
+
+(defvar eicq-send-url-here-icon
+  (toolbar-make-button-list
+   (expand-file-name "url-here.xpm" eicq-icon-directory))
+  "A send URL toolbar icon.")
+
+(defvar eicq-send-url-around-icon
+  (toolbar-make-button-list
+   (expand-file-name "url-around.xpm" eicq-icon-directory))
+  "A send URL toolbar icon.")
+
+(defvar eicq-query-info-here-icon
+  (toolbar-make-button-list
+   (expand-file-name "query-here.xpm" eicq-icon-directory))
+  "A query info here toolbar icon.")
+
+(defvar eicq-query-info-around-icon
+  (toolbar-make-button-list
+   (expand-file-name "query-around.xpm" eicq-icon-directory))
+  "A query info here toolbar icon.")
+
+(defvar eicq-update-info-icon
+  (toolbar-make-button-list
+   (expand-file-name "update-info.xpm" eicq-icon-directory))
+  "A update info toolbar icon.")
+
+(defvar eicq-search-icon
+  (toolbar-make-button-list
+   (expand-file-name "search.xpm" eicq-icon-directory))
+  "A search toolbar icon.")
+
+(defvar eicq-authorize-here-icon
+  (toolbar-make-button-list
+   (expand-file-name "authorize-here.xpm" eicq-icon-directory))
+  "A authorize toolbar icon.")
+
+(defvar eicq-login-icon
+  (toolbar-make-button-list
+   (expand-file-name "login.xpm" eicq-icon-directory))
+  "A login toolbar icon.")
+
+(defvar eicq-logout-icon
+  (toolbar-make-button-list
+   (expand-file-name "logout.xpm" eicq-icon-directory))
+  "A logout toolbar icon.")
+
+(defvar eicq-disconnect-icon
+  (toolbar-make-button-list
+   (expand-file-name "disconnect.xpm" eicq-icon-directory))
+  "A disconnect toolbar icon.")
+
+(defvar eicq-new-log-icon
+  (toolbar-make-button-list
+   (expand-file-name "new-log.xpm" eicq-icon-directory))
+  "New log file toolbar icon.")
+
+;; Define the functions for the toolbar
+
+(defun eicq-toolbar-change-password (password)
+  "Change PASSWORD from the toolbar."
+  (interactive (list (read-passwd "Password: " 'confirm)))
+  (eicq-change-password password))
+
+(defun eicq-toolbar-send-message-here ()
+  "Send message from toolbar."
+  (interactive)
+  (eicq-send-message-alias-here))
+
+(defun eicq-toolbar-send-message-around ()
+  "Send message from toolbar."
+  (interactive)
+  (eicq-send-message))
+
+(defun eicq-toolbar-send-url-here ()
+  "Send URL from the toolbar."
+  (interactive)
+  (eicq-send-url-alias-here))
+
+(defun eicq-toolbar-send-url-around ()
+  "Send URL from the toolbar."
+  (interactive)
+  (eicq-send-url))
+
+(defun eicq-toolbar-query-info-here ()
+  "Query info from the toolbar."
+  (interactive)
+  (eicq-query-info-alias-here))
+
+(defun eicq-toolbar-query-info-around ()
+  "Query info from the toolbar."
+  (interactive)
+  (eicq-query-info))
+
+(defun eicq-toolbar-update-info ()
+  "Update meta info from the toolbar."
+  (interactive)
+  (eicq-update-meta-info))
+
+(defun eicq-toolbar-search (nick-name first-name last-name email)
+  "Search from the toolbar.
+Argument NICK-NAME is the ICQ name of the person you're searching for.
+Argument FIRST-NAME is the first name of the person you're searching for.
+Argument LAST-NAME is the last name of the person you are searching for.
+Argument EMAIL is the email address of the person you're searching for."
+  (interactive "sNick-name: \nsFirst-name: \nsLast-name: \nsEmail: \n")
+  (eicq-search nick-name first-name last-name email))
+
+(defun eicq-toolbar-authorize-here ()
+  "Authorize from the toolbar."
+  (interactive)
+  (eicq-authorize-alias-here))
+
+(defun eicq-toolbar-login ()
+  "Login from the toolbar."
+  (interactive)
+  (eicq-login))
+
+(defun eicq-toolbar-logout ()
+  "Logout from the toolbar."
+  (interactive)
+  (eicq-logout))
+
+(defun eicq-toolbar-disconnect ()
+  "Disconnect from the toolbar."
+  (interactive)
+  (eicq-logout)
+  (eicq-disconnect))
+
+(defun eicq-toolbar-new-log ()
+  "New log file from the toolbar."
+  (interactive)
+  (eicq-log-new-file))
+
+;; Now define the toolbar
+(defvar eicq-log-toolbar
+  '([eicq-password-icon
+     eicq-toolbar-change-password t "Change password"]
+    [eicq-send-message-here-icon
+     eicq-toolbar-send-message-here t "Send message here"]
+    [eicq-send-message-around-icon
+     eicq-toolbar-send-message-around t "Send message..."]
+    [eicq-send-url-here-icon
+     eicq-toolbar-send-url-here t "Send URL here"]
+    [eicq-send-url-around-icon
+     eicq-toolbar-send-url-around t "Send URL..."]
+    [eicq-query-info-here-icon
+     eicq-toolbar-query-info-here t "Query info here"]
+    [eicq-query-info-around-icon
+     eicq-toolbar-query-info-around t "Query info..."]
+    [eicq-search-icon
+     eicq-toolbar-search t "Search"]
+    [eicq-authorize-here-icon
+     eicq-toolbar-authorize-here t "Authorize here"]
+    [eicq-new-log-icon
+     eicq-toolbar-new-log t "New log file"]
+    [eicq-login-icon
+     eicq-toolbar-login t "Login"]
+    [eicq-logout-icon
+     eicq-toolbar-logout t "Logout"]
+    [eicq-disconnect-icon
+     eicq-toolbar-disconnect t "Disconnect"])
+  "A clickety click Eicq log buffer toolbar.")
+
 (defun eicq-install-buddy-toolbar ()
+  "Install the toolbar for `eicq-buddy-mode' in Eicq."
   (and eicq-use-toolbar
        (set-specifier (symbol-value eicq-use-toolbar)
-		      (cons 
-		       (current-buffer) eicq-buddy-toolbar))))
+		      (cons
+		       (current-buffer) eicq-log-toolbar))))
 
 (defun eicq-install-log-toolbar ()
+  "Install the toolbar for `eicq-log-mode' in Eicq."
   (and eicq-use-toolbar
        (set-specifier (symbol-value eicq-use-toolbar)
-		      (cons 
+		      (cons
 		       (current-buffer) eicq-log-toolbar))))
 
 (provide 'eicq-toolbar)
 
+;;; eicq-toolbar.el ends here
 
+
+;Local Variables:
+;time-stamp-start: "Last-Modified:[ 	]+\\\\?[\"<]+"
+;time-stamp-end: "\\\\?[\">]"
+;time-stamp-line-limit: 10
+;time-stamp-format: "%4y-%m-%d %02H:%02M:%02S (%u)"
+;End: 

File eicq-user-install.sh

 ## eicq-user-install.sh   -*-Shell-script-*-
 ## $Id$
 
-## Copyright (C) 2000 Steve Youngs
+## Copyright (C) 2000, 2001 Steve Youngs
 
 
 ## This program is free software; you can redistribute it and/or modify
 # Variables and constants
 MKDIR=/bin/mkdir
 INSTALL=/usr/bin/install
-RCFILE=/usr/local/lib/xemacs/xemacs-packages/etc/eicq/world
+RCFILE=/usr/local/lib/xemacs/site-packages/etc/eicq/world
 RCDIR=${HOME}/.eicq
 
 # Code
 ;;; eicq.el --- ICQ client for Emacs
-;; $Id$
+
 ;; Copyright (C) 1999 by Stephen Tse
-;; Copyright (C) 2000 Steve Youngs
-
-;; Original Author: Stephen Tse <stephent@sfu.ca>
+;; Copyright (C) 2000, 2001 Steve Youngs
+
+;; RCS: $Id$
+;; OriginalAuthor: Stephen Tse <stephent@sfu.ca>
 ;; Maintainer: Steve Youngs <youngs@xemacs.org>
-
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
+;; Created: Aug 08, 1998
+;; Last-Modified: <2001-6-7 00:09:40 (steve)>
+;; Version: 0.2.14
+;; Homepage: http://eicq.sourceforge.net/
+;; Keywords: comm ICQ
+
+;; Eicq is free software; you can redistribute it and/or modify it
 ;; under the terms of the GNU General Public License as published by the
 ;; Free Software Foundation; either version 2, or (at your option) any
 ;; later version.
 
-;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
+;; Eicq is distributed in the hope that it will be useful, but WITHOUT
 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 ;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 ;; for more details.
 ;; Boston, MA 02111-1307, USA.
 
 
-;; Created: Aug 08, 1998
-;; Updated: Feb 17, 2001
-
-;; Version: 0.2.9
-;; Homepage: http://eicq.sourceforge.net/
-;; Keywords: comm ICQ
-
 ;;; Commentary:
 ;;
 ;; Clone of Mirabilis ICQ communication client.
 ;; Entry points:
 ;;   eicq-login
 ;;   eicq-show-window
-;;   eicq-email-author
 ;;   eicq-customize
 ;;
-;;
-;; See README which comes with this file
+;; See README & INSTALL which come with this package
 ;;
 ;; This project is done without the consent of Mirabilis.
 ;;
 
 ;;; Code:
 
-(eval-when-compile
-  (require 'browse-url)
-  (require 'outline))
-
-(defconst eicq-version "0.2.9"
+(require 'browse-url)
+(require 'outline)
+(require 'timezone)
+(require 'wid-edit)
+(require 'goto-addr)
+(require 'smiley)
+
+(defconst eicq-version "0.2.14"
   "Version of eicq you are currently using.")
 
+;; Customize Groups.
+
 (defgroup eicq nil
   "Mirabilis ICQ communication client."
   :group 'comm)
   "Sound preferences."
   :group 'eicq)
 
-(defun eicq-version ()
-  "Return the version of eicq you are currently using."
-  (interactive)
-  (message "eicq version %s" eicq-version))
-
-;;; Code - compatibility:
-
-;; MULE compatibility functions for 20.4
-
-(defun-when-void encode-coding-string (string encoding-system)
-  "Stub for compatibility with MULE."
-  string)
-
-(defun-when-void decode-coding-string (string encoding-system)
-  "Stub for compatibility with MULE."
-  string)
-
-;;; Code - user info:
-
-(defcustom eicq-user-alias "me"
-  "*Your alias in `eicq-world'.
-Run `eicq-world-update' after modifying this variable."
-  :group 'eicq-info)
-
-(defcustom eicq-user-password nil
-  "*Password for your ICQ account.
-Nil means prompt for entering password every time you login."
- :group 'eicq-info)
-
-;;; Code - user meta info:
+(defgroup eicq-interface nil
+  "Change the look and \"feel\"."
+  :group 'eicq)
+
+;; Customize.
 
 (defcustom eicq-user-meta-nickname "e-i-c-q"
   "*Your nickname stored on the ICQ server.
   :group 'eicq-meta)
 
 (defcustom eicq-user-meta-web-aware t
-  "*Set this to 't' if you want your presence know on the web.
-This doesn't appear to work. :-(
+  "*Set this to non-nil if you want your presence know on the web.
 Run `eicq-update-meta-info' after modifying this variable."
+  :type 'boolean
   :group 'eicq-meta)
 
 (defcustom eicq-user-meta-hide-ip nil
-  "*Set to 't' if you want to hide your IP.
+  "*Set to non-nil if you want to hide your IP.
 Run `eicq-update-meta-info' after modifying this variable."
+  :type 'boolean
   :group 'eicq-meta)
 
 (defcustom eicq-user-meta-authorization t
   "*Authorization needed to add you to others' contact lists..
 Run `eicq-update-meta-info' after modifying this variable."
+  :type 'boolean
   :group 'eicq-meta)
 
 (defcustom eicq-user-meta-about
                  (item not-entered)))
 
 (defcustom eicq-user-meta-birth-year nil
-  "*Your birth year (YYYY) stored on the ICQ server.
+  "*Your birth year (YY) stored on the ICQ server.
 Run `eicq-update-meta-info' after modifying this variable."
   :group 'eicq-meta)
 
 Run `eicq-update-meta-info' after modifying this variable."
   :group 'eicq-meta)
 
+(defcustom eicq-use-sound-flag nil
+  "*Whether to use sound or not.
+SOUND-CARD - use the sound card.
+PC-SPEAKER - use the PC speaker.
+NIL - don't use sound.
+
+This is not yet fully implemented and setting this to anything
+other than SOUND-CARD will turn the sound off."
+  :group 'eicq-sound
+  :type '(choice
+	  (item sound-card) 
+	  (item pc-speaker) 
+	  (item nil)) 
+  :tag "Use Sound")
+
 (defcustom eicq-sound-directory 
   "/usr/local/lib/xemacs/xemacs-packages/etc/sounds/"
   "*Directory where sound files are kept."
   :type 'directory 
   :tag "eicq-sound-directory")
 
-(defcustom eicq-message-sound nil
-  "*Incoming message sound."
+(defcustom eicq-sound-alist
+  '((message-sound . nil)
+    (chat-sound . nil)
+    (url-sound . nil)
+    (buddy-sound . nil)
+    (auth-sound . nil)
+    (emailx-sound . nil)
+    (pager-sound . nil))
+  "*Sound event to sound file alist.
+The possible sound events are:
+      \"message-sound\" - Incoming message sound.
+      \"chat-sound\"    - Incoming chat request sound.
+      \"url-sound\"     - Incoming url sound.
+      \"buddy-sound\"   - Online notify sound.
+      \"auth-sound\"    - Authorise sound.
+      \"emailx-sound\"  - Email express sound.
+      \"pager-sound\"   - Pager sound."
   :group 'eicq-sound
-  :type 'file
-  :tag "Message Sound")
-
-(defcustom eicq-chat-sound nil
-  "*Incoming chat request sound."
-  :group 'eicq-sound
-  :type 'file
-  :tag "Chat Request Sound")
-
-(defcustom eicq-url-sound nil
-  "*Incoming URL sound."
-  :group 'eicq-sound
-  :type 'file
-  :tag "Incoming URL Sound")
-
-(defcustom eicq-buddy-sound nil
-  "*Buddy online notify sound."
-  :group 'eicq-sound
-  :type 'file
-  :tag "Online Notify Sound")
-
-(defcustom eicq-auth-sound nil
-  "*Authorize sound."
-  :group 'eicq-sound
-  :type 'file
-  :tag "Authorize Sound")
-
-(defcustom eicq-emailx-sound nil
-  "*Email Express sound."
-  :group 'eicq-sound
-  :type 'file
-  :tag "Email Express Sound")
-
-(defcustom eicq-pager-sound nil
-  "*Pager sound."
-  :group 'eicq-sound
-  :type 'file
-  :tag "Pager Sound")
+  :type '(repeat 
+	  (cons (sexp :tag "Sound Event") 
+		(sexp :tag "Sound File")))
+  :tag "Sounds")
+
+(defcustom eicq-coding-system nil
+  "*Coding for incoming and outgoing messages.
+This feature is supported only in Emacs with MULE.
+Nil means not to use any codings.
+See `list-coding-systems'."
+  :group 'eicq-option
+  :type
+  (append '(choice (item nil))
+          (if (fboundp 'coding-system-list)
+              (mapcar
+               (lambda (x) (list 'item x))
+               (coding-system-list)))))
+
+(defcustom eicq-bridge-filename 
+  "/usr/local/bin/udp2tcp"
+  "*Filename for `eicq-bridge' program."
+  :group 'eicq-option)
+
+(defcustom eicq-bridge-buffer nil
+  "Buffer for `eicq-bridge'.
+Nil means no associated buffer, or no debug info."
+  :group 'eicq-option)
+
+(defcustom eicq-bridge-hostname "127.0.0.1"
+  "*IP address of `eicq-bridge'.
+See `eicq-connect'."
+  :group 'eicq-option)
+
+(defcustom eicq-bridge-port
+  ;; plant random seed
+  (progn (random t) nil)
+  "*Port of `eicq-bridge'.
+See `eicq-connect'."
+  :group 'eicq-option)
+
+(defcustom eicq-server-hostname "icq1.mirabilis.com"
+  "*Hostname or IP address of Mirabilis ICQ server."
+  :group 'eicq-option)
+
+(defcustom eicq-server-port 4000
+  "*Port of Mirabilis ICQ server."
+  :group 'eicq-option)
+
+(defvar eicq-valid-statuses
+  '("online" "away" "occ" "dnd" "ffc" "na" "invisible")
+  "All statuses valid for selection.
+Used by `eicq-change-status' and in `eicq-buddy-buffer'.")
+
+(defcustom eicq-user-initial-status "invisible"
+  "*Initial user status when login."
+  :group 'eicq-option
+  :type
+  (cons 'choice
+        (mapcar
+         (lambda (x) (list 'item x))
+         eicq-valid-statuses)))
+
+(defcustom eicq-auto-reply-away
+  "I am currently away from ICQ.
+Please leave me messages,
+I'll come back to you soon."
+  "Auto reply with this when you are away."
+  :group 'eicq-option)
+
+(defcustom eicq-auto-reply-occ
+  "I am currently occupied.
+Please leave me messages,
+I'll come back to you soon."
+  "Auto reply with this when you are occupied."
+  :group 'eicq-option)
+
+(defcustom eicq-auto-reply-dnd
+  "I am currently concentrating on some stuff.
+Please leave me messages,
+I'll come back to you soon."
+  "Auto reply with this when you want to leave alone."
+  :group 'eicq-option)
+
+(defcustom eicq-auto-reply-na
+  "I am currently not in the mood of ICQ.
+Please leave me messages,
+I'll come back to you soon."
+  "Auto reply with this when you are not available."
+  :group 'eicq-option)
+
+(defcustom eicq-delete-offline-messages-flag 'ask
+  "*Non-nil means delete all offline messages from server.
+'ask means to ask user every time.
+Nil means leave messages on server and you will receive the same offline
+messages again next time you login."
+  :group 'eicq-option
+  :type '(choice (item t) (item ask) (item nil)))
+
+(defcustom eicq-buddy-window-width 20
+  "*Width of window for `eicq-buddy-buffer'."
+  :group 'eicq-interface)
+
+(defcustom eicq-status-window-height 9
+  "*Height of window for `eicq-status-buffer'."
+  :group 'eicq-interface)
+
+(defcustom eicq-log-fill-column 50
+  "Fill column for `eicq-log-buffer'.
+Log in buffer is auto-filled, that is, word-wrapped upto this column.
+Normally frame width is 80 and window width of `eicq-buddy-buffer' is 20,
+therefore default value 50 will be nice."
+  :group 'eicq-log)
+
+(defcustom eicq-log-filename "~/.eicq/log"
+  "*Pathname and filename for storing eicq log.
+Automatically created if the directory is non-existent."
+  :group 'eicq-log)
+
+(defcustom eicq-log-buffer-position-flag 'tail
+  "*Non-nil means automatically updating buffer position.
+Nil means no automatic update, 'tail means keeping the bottom of the buffer 
+visible, other non-nil means keeping the top of the buffer visible."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))  
+
+(defcustom eicq-log-info-flag 'tail
+  "*Non-nil means log misc info.
+These include any info from ICQ server other than buddy messages, status
+change notice, and query results.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-buddy-status-flag 'tail
+  "*Non-nil means log buddy status change notice.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-buddy-message-flag 'tail
+  "*Non-nil means log buddy messages from ICQ server.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-outgoing-flag 'tail
+  "*Non-nil means log outgoing messages to ICQ server.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-error-flag 'tail
+  "*Non-nil means log critical error messages.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-debug-flag nil
+  "*Non-nil means log verbose debugging messages.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-system-flag 'tail
+  "*Non-nil means log system messages.
+These include network status, login status, and others.
+Nil means no log, 'tail means putting new log at the end of the log
+buffer, other non-nil means putting new log at the beginning."
+  :group 'eicq-log
+  :type '(choice (item t) (item tail) (item nil)))
+
+(defcustom eicq-log-info-mark nil
+  "*Non-nil means mark unread.
+These include any info from ICQ server other than buddy messages, 
+status change notice, and query results.
+Nil means mark read."
+  :group 'eicq-log
+  :type 'boolean)
+
+(defcustom eicq-log-buddy-status-mark nil
+  "*Non-nil means mark buddy status change notice unread.
+Nil means mark read."
+  :type 'boolean
+  :group 'eicq-log)
+
+(defcustom eicq-log-buddy-message-mark t
+  "*Non-nil means mark buddy messages unread.
+Nil means mark read."
+  :type 'boolean
+  :group 'eicq-log)
+
+(defcustom eicq-log-outgoing-mark nil
+  "*Non-nil means mark outgoing messages unread.
+Nil means mark read."
+  :group 'eicq-log
+  :type 'boolean)
+
+(defcustom eicq-log-error-mark t
+  "*Non-nil means mark critical error messages unread.
+Nil means mark read."
+  :group 'eicq-log
+  :type 'boolean)
+
+(defcustom eicq-log-debug-mark t
+  "*Non-nil means mark verbose debugging messages unread.
+Nil means mark read."
+  :group 'eicq-log
+  :type 'boolean)
+
+(defcustom eicq-log-system-mark nil
+  "*Non-nil means mark system messages unread.
+Nil means mark read."
+  :group 'eicq-log
+  :type 'boolean)
+
+(defcustom eicq-buddy-status-color-hint-flag t
+  "*Non-nil means put status color hints."
+  :type 'boolean
+  :group 'eicq-buddy)
+
+(defcustom eicq-buddy-view 
+  'eicq-connected-aliases
+  "*View of buddy buffer.
+It determines what aliases to be display in buddy buffer.  For example,
+\(eicq-connected-aliases) means display all connected aliases.
+
+See `eicq-buddy-view-all', `eicq-buddy-view-connected', and
+`eicq-buddy-view-active'."
+  :group 'eicq-buddy
+  :type '(choice (item eicq-all-aliases)
+                 (item eicq-connected-aliases)
+                 (item eicq-active-aliases))
+  :initialize 'custom-initialize-default)
+
+(defvar eicq-user-status "offline"
+  "Current user status.")
+
+(defvar eicq-dropped-packet-counter 0
+  "For debug purpose only.")
+
+(defvar eicq-resend-packet-counter 0
+  "For debug purpose only.")
+
+(defvar eicq-recent-packet nil
+  "The most recent incoming packet.
+For debug only.")
+
+(defvar eicq-trimmed-packet-counter 0
+  "For debug purpose only.")
+
+(defvar eicq-error-packets nil
+  "A list of error incoming packets.
+For debug only.")
+
+(defvar eicq-world-rc-filename "~/.eicq/world"
+  "*Filename for resource file.")
+
+(defvar eicq-do-message-hook nil
+  "*Hooks to run when there is an incoming message.
+Dynamically ALIAS and MESSAGE are binded to be used in hooks.")
+
+(defvar eicq-do-status-update-hook nil
+  "*Hooks to run when a buddy change his status.
+Dynamically ALIAS and STATUS are binded to be used in hooks.")
+
+;;; Internal variables
+
+(defcustom eicq-user-alias "me"
+  "*Your alias in `eicq-world'.
+Run `eicq-world-update' after modifying this variable."
+  :group 'eicq-info)
+
+(defcustom eicq-user-password nil
+  "*Password for your ICQ account.
+Nil means prompt for entering password every time you login."
+ :group 'eicq-info)
+
+;;;###autoload
+(defun eicq-version (&optional arg)
+  "Return the version of eicq you are currently using.
+If ARG, insert version string at point."
+  (interactive "P")
+  (if arg
+      (insert (message "Eicq version %s" eicq-version))
+    (message "Eicq version %s" eicq-version)))
+
+;;; Code - compatibility:
+
+;; MULE compatibility functions for 20.4
+
+(defun-when-void encode-coding-string (string encoding-system)
+  "Stub for compatibility with MULE."
+  string)
+
+(defun-when-void decode-coding-string (string encoding-system)
+  "Stub for compatibility with MULE."
+  string)
 
 ;; Load the toolbar
 (add-hook 'eicq-buddy-mode-hook 'eicq-install-buddy-toolbar)
   (interactive)
   (customize-group 'eicq))
 
+;;;###autoload
 (defun eicq-browse-homepage ()
   "Browse eicq homepage for news and files."
   (interactive)
   (browse-url "http://eicq.sourceforge.net/"))
 
-(defcustom eicq-coding-system nil
-  "*Coding for incoming and outgoing messages.
-This feature is supported only in Emacs with MULE.
-Nil means not to use any codings.
-See `list-coding-systems'."
-  :group 'eicq-option
-  :type
-  (append '(choice (item nil))
-          (if (fboundp 'coding-system-list)
-              (mapcar
-               (lambda (x) (list 'item x))
-               (coding-system-list)))))
-
 (defun eicq-encode-string (string)
   "Return a encoded string from STRING with DOS stuff added.
 Encode string with `eicq-coding-system'."
     "%" "%%")
    eicq-coding-system))
 
+(defconst eicq-message-max-size 350
+  "Maximum size of message that ICQ will accept.
+Set it to small because size expands after `eicq-encode-string'.")
+
 (defun eicq-spliter (x)
   "Split a long message X into parts of maximum length `eicq-message-max-size'.
 Only split at whitespace."
                        bin
                        (or count 0))))))
 
-(defvar eicq-dropped-packet-counter 0
-  "For debug purpose only.")
-
-(defvar eicq-resend-packet-counter 0
-  "For debug purpose only.")
-
 (defun eicq-send-queue-start ()
   "Start sending outgoing queue."
   (eicq-send-queue-stop)
   "Process `udp2tcp'.
 It bridges UDP (ICQ server) and TCP (Emacs).")
 
-(defcustom eicq-bridge-filename 
-  "/usr/local/lib/xemacs/xemacs-packages/lib-src/udp2tcp"
-  "*Filename for `eicq-bridge' program."
-  :group 'eicq-option)
-
-(defcustom eicq-bridge-buffer nil
-  "Buffer for `eicq-bridge'.
-Nil means no associated buffer, or no debug info."
-  :group 'eicq-option)
-
-(defcustom eicq-bridge-hostname "127.0.0.1"
-  "*IP address of `eicq-bridge'.
-See `eicq-connect'."
-  :group 'eicq-option)
-
-(defcustom eicq-bridge-port
-  ;; plant random seed
-  (progn (random t) nil)
-  "*Port of `eicq-bridge'.
-See `eicq-connect'."
-  :group 'eicq-option)
-
-(defcustom eicq-server-hostname "icq1.mirabilis.com"
-  "*Hostname or IP address of Mirabilis ICQ server."
-  :group 'eicq-option)
-
-(defcustom eicq-server-port 4000
-  "*Port of Mirabilis ICQ server."
-  :group 'eicq-option)
-
 (defun eicq-bridge-show-buffer ()
   "Switch to `eicq-bridge-buffer' for network dump info."
   (interactive)
    (t
     (eicq-log-system "....connection failed"))))
 
+(defvar eicq-main-map
+  (let ((map (make-keymap 'eicq-main-map)))
+    (suppress-keymap map)
+    (define-key map [X] nil)            ; BUG?
+    (define-key map [X i] 'eicq-login)
+    (define-key map [X o] 'eicq-logout)
+    (define-key map [X s] 'eicq-change-status)
+    (define-key map [S] 'eicq-group-select-aliases)
+    (define-key map [s] 'eicq-group-select-aliases)
+    (define-key map [w] 'eicq-show-window)
+    (define-key map [h] 'eicq-hide-window)
+    (define-key map [M] 'eicq-send-message)
+    (define-key map [m] 'eicq-send-message)
+    (define-key map [U] 'eicq-send-url)
+    (define-key map [u] 'eicq-send-url)
+    (define-key map [A] 'eicq-authorize)
+    (define-key map [a] 'eicq-authorize)
+    (define-key map [i] 'eicq-query-info)
+    (define-key map [I] 'eicq-query-info)
+    (define-key map [f] 'world-find)
+    (define-key map [V] nil)
+    (define-key map [V c] 'eicq-buddy-view-connected)
+    (define-key map [V v] 'eicq-buddy-view-active)
+    (define-key map [V a] 'eicq-buddy-view-all)
+    (define-key map [?1] 'eicq-buddy-show-buffer)
+    (define-key map [?2] 'eicq-log-show-buffer)
+    (define-key map [?4] 'eicq-bridge-show-buffer)
+    map)
+  "Keyboard map common for `eicq-log-mode-map' and `eicq-buddy-mode-map'.")
+
+(defvar eicq-main-menu
+  '("Eicq"
+    ["Show Window" eicq-show-window t]
+    ["Hide Window" eicq-hide-window t]
+    ["Register New UIN" eicq-register-new-user t]
+    ["Change Password" eicq-change-password t]
+    ["Login" eicq-login t]
+    ["Logout" eicq-logout t]
+    ["Disconnect" eicq-disconnect t]
+    "---"
+    ["Select" eicq-group-select-aliases t]
+    ["Send Message" eicq-send-message t]
+    ["Send URL" eicq-send-url t]
+    ["Authorize" eicq-authorize t]
+    ["Change Status" eicq-change-status t]
+    ["Search" eicq-search t]
+    ["Update Meta Info" eicq-update-meta-info t]
+    "---"
+    ["alias -> uin" eicq-alias-uin t]
+    ["uin -> alias" eicq-uin-alias t]
+    ["Redo Packet" eicq-redo-hex t]
+    ["Resend Contact List" eicq-send-contact-list t]
+    ["Buddy Buffer" eicq-buddy-show-buffer t]
+    ["Log Buffer" eicq-log-show-buffer t]
+    ["Bridge Buffer" eicq-bridge-show-buffer t]
+    "---"
+    ["Email Author" eicq-email-author t]
+    ["Submit Bug Report" (eicq-report-bug eicq-blurb) t]
+    ["Customize" eicq-customize t])
+  "Menu for both `eicq-log-mode' and `eicq-buddy-mode'.")
+
+(easy-menu-define
+ eicq-main-easymenu nil "Eicq Main" eicq-main-menu)
+
 (defun eicq-bridge-mode ()
   "Major mode for bridge debug output.
 Commands: \\{eicq-main-mode}"
   (interactive)
   (eicq-logout 'kill)
   (eicq-network-kill)
-  (eicq-bridge-kill))
+  (eicq-bridge-kill)
+  (loop for each in '(eicq-log-buffer 
+		      eicq-buddy-buffer 
+		      eicq-status-buffer
+		      eicq-bridge-buffer)
+    do (kill-buffer (symbol-value each)))
+  (delete-other-windows))
 
 (defun eicq-connected-p ()
   "Return non-nil if the network is ready for sending string."
   (and (processp eicq-network)
        (eq (process-status eicq-network) 'open)))
 
-(defconst eicq-message-max-size 350
-  "Maximum size of message that ICQ will accept.
-Set it to small because size expands after `eicq-encode-string'.")
-
 (defun eicq-send-internal (bin)
   "Send a binary string BIN to `eicq-network'.
 `process-send-string' restricts the length of BIN to 500 or less."
 `eicq-network-separator' to concatenate a packet across two callbacks.
 Usually only one per 1000 packets needs this.")
 
-(defvar eicq-trimmed-packet-counter 0
-  "For debug purpose only.")
-
 (defun eicq-network-separator (bin)