#!/usr/bin/perl -w
use strict;
use vars qw( %prefs $libpath );

BEGIN { 
 $libpath = $0;
 $libpath =~ s!/[^/]+$!!;
 $libpath =~ s!/bin$!/lib/cscmail!;
 if (! -e $libpath) { die "Can't find required files in $libpath"; };
}

use lib "$libpath";

require "csclib.pl";

my ($HTMLWIDGET, $THREADS, $ONETIME);
my $passphrase;		# Sorry bout the global, but it needs to be. Not putting it in
			# $prefs{} for OBVIOUS reasons.

unless (eval 'use Gtk::HTML; $HTMLWIDGET = "GtkHTML";') {
	eval 'use Gtk::XmHTML; $HTMLWIDGET = "XmHTML"; require "HtmlStripper.pm";'
}
use MIME::Parser;
use File::Copy;
use Gtk;
$THREADS = 0;
eval 'use Thread; $THREADS = 1;';
use MIME::Types;
use Text::ParseWords;
use Date::Manip;
use Text::Wrap;
use CSCcrypt::GPG;
use URI::URL;
use IO::Socket;
use IO::File;
use Lingua::Ispell;

#
#  CSC Mail version 1.6.2
#  Written by Steven Kordik (countzero@cyberdeck.org)
#  Distributed under the GNU public license
#  
#  Development team members: (In no particular order)
#  Muhri
#  Noidd
#  Flavio
#  and others...



wr_debug("Loading CSCMail");
init Gtk;
init Gtk::Gdk::Rgb;
if ($HTMLWIDGET eq "GtkHTML") {
 init Gtk::HTML;
} else {
 init Gtk::XmHTML;
}
Gtk::Rc->parse("$libpath/cscmail.gtkrc");
Gtk::Widget->set_default_colormap(Gtk::Gdk::Rgb->get_cmap());
Gtk::Widget->set_default_visual(Gtk::Gdk::Rgb->get_visual());
my $parser = new MIME::Parser;
$parser->output_dir("$prefs{'MailDir'}/tmp/");
opendir(DIR,"$prefs{'MailDir'}/tmp");
while (defined (my $nuke = readdir DIR)) {
 next if $nuke =~ /^\.\.?$/;
 unlink "$prefs{'MailDir'}/tmp/$nuke";
}
closedir(DIR);



my (%folderidtoname, $attach_menu, $view_attach_menu, @attach_menu_items, $attach_menu2, $view_attach_menu2, %foldernametoid, $conn, $cp_folder_menu, $mv_folder_menu, $folder_tree, $acct_menu2, $acct_menu, $message_clist,  @titles, @ft_node, %ft_id, %smtphash, $smtp_default, $msg_window, $sql, $query, %cp_menu_items,  %mv_menu_items, %acct_menu_items, %acct_menu2_items,  @cfg, $prefs, %pmv_items, %pcp_items, $pcp_menu, $pmv_menu, $refresh_timer, $check_timer, %entity, $redirect_timerID, %parent, @msg_count, @new_count, @target_table, $root_window, $view_timer, $mark_timer, $version, $wb_win, $test);

$version = "v1.6.2";
@titles = ( 'Folder', 'Msg', 'New' );

use constant  TARGET_STRING => 0;
use constant  TARGET_ROOTWIN => 1;

@target_table = (
        {'target' => "STRING", 'flags' => 0, 'info' => TARGET_STRING},
        {'target' => "text/plain", 'flags' => 0, 'info' => TARGET_STRING},
        {'target' => "application/x-rootwin-drop", 'flags' => 0, 'info' =>TARGET_ROOTWIN},
);

$SIG{CHLD} = 'IGNORE';

unlink("$prefs{'MailDir'}/.cscmail.refresh");

my @flttypes = ("Inactive", "Account Based", "To/Cc Based", "Subject Based",
                "From Based", "Generic", "Scoring");

sub init_webbrowser {
	my ($url) = @_;
	my ($window, $bg, $query, $sql, @row);
	if ($HTMLWIDGET eq "XmHTML") {
		&err_dialog("You must use the GtkHTML widget to use the Mini Browser.");
		return 1;
	}

	if (not defined $url) { $url = $prefs{'HomePage'};} 
	if (defined $wb_win) {
		wb_view_url(undef, $url);
		return 1;
	}
	$wb_win = new Gtk::Window("toplevel");
	$wb_win->signal_connect('destroy' => sub { $wb_win->destroy; undef $wb_win; });
	$wb_win->signal_connect('delete_event' => \&Gtk::false);
	$wb_win->set_default_size('640','480');
	$wb_win->set_policy(1,1,0);
	$wb_win->set_title("CSCMail Mini Browser");
	$wb_win->{'vbox'} = new Gtk::VBox(0,0);
	$wb_win->{'vbox'}->show;
	$wb_win->show;
	$wb_win->add($wb_win->{'vbox'});
	$window = $wb_win->window;
	$bg = $wb_win->style->bg('normal');
  	$wb_win->{'menu'} = new Gtk::MenuBar;
  	$wb_win->{'menu'}->{'file'} = new Gtk::MenuItem("File");
  	$wb_win->{'menu'}->{'file'}->show;
	$wb_win->{'menu'}->show;
  	$wb_win->{'menu'}->append($wb_win->{'menu'}->{'file'});
  	$wb_win->{'file_menu'} = new Gtk::Menu;
	$wb_win->{'menu'}->{'file'}->set_submenu($wb_win->{'file_menu'});
  	$wb_win->{'file_menu'}->{'home'} = new Gtk::MenuItem("Home");
	$wb_win->{'file_menu'}->{'home'}->signal_connect("activate" => \&wb_view_url, $prefs{'HomePage'});
  	$wb_win->{'file_menu'}->{'home'}->show;
  	$wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'home'});
  	$wb_win->{'file_menu'}->{'back'} = new Gtk::MenuItem("Back");
	$wb_win->{'file_menu'}->{'back'}->signal_connect("activate" => \&wb_view_url, "back");
  	$wb_win->{'file_menu'}->{'back'}->show;
  	$wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'back'});
	$wb_win->{'file_menu'}->{'search'} = new Gtk::MenuItem("Search");
	$wb_win->{'file_menu'}->{'search'}->show;
	$wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'search'});
  	$wb_win->{'file_menu'}->{'close'} = new Gtk::MenuItem("Close");
  	$wb_win->{'file_menu'}->{'close'}->signal_connect("activate" => sub { $wb_win->destroy; undef $wb_win; });
  	$wb_win->{'file_menu'}->{'close'}->show;
  	$wb_win->{'file_menu'}->append($wb_win->{'file_menu'}->{'close'});
	$wb_win->{'file_menu'}->show;
	$wb_win->{'vbox'}->pack_start($wb_win->{'menu'},0,0,0);
	$wb_win->{'toolbar'} = new Gtk::Toolbar('horizontal', 'both');
	$wb_win->{'toolbar'}->set_button_relief('none');
	$wb_win->{'toolbar'}->set_tooltips('1');
	$wb_win->{'toolbar'}->border_width('2');
	$wb_win->{'toolbar'}->show;
	$wb_win->{'vbox'}->pack_start($wb_win->{'toolbar'},0,0,0);
	$wb_win->{'back_button'} = $wb_win->{'toolbar'}->append_item("Back","Click here to go back a page", "",new_pixmap("$prefs{'PixmapDir'}/back.xpm", $window, $bg));
	$wb_win->{'home_button'} = $wb_win->{'toolbar'}->append_item("Home","Click here to go to your homepage", "",new_pixmap("$prefs{'PixmapDir'}/top.xpm", $window, $bg));
	$wb_win->{'entry'} = new Gtk::Entry;
	$wb_win->{'entry'}->set_text($url);
	$wb_win->{'entry'}->show;
	$wb_win->{'toolbar'}->append_widget($wb_win->{'entry'}, "Type a URL here and press enter to go to that page", "");
	$wb_win->{'entry'}->set_usize(300,25);
	$wb_win->{'go_button'} = new Gtk::Button;
	$wb_win->{'go_button'}->show;
	my ($pixmap,$mask)=Gtk::Gdk::Pixmap->create_from_xpm($window,$bg,"$prefs{'PixmapDir'}/go.xpm");
	$wb_win->{'go_button'}->{'pixmap'} = new Gtk::Pixmap($pixmap, $mask);
	$wb_win->{'go_button'}->{'pixmap'}->show;
	$wb_win->{'go_button'}->add($wb_win->{'go_button'}->{'pixmap'});
	$wb_win->{'bookmarks'}->{'button'}= new Gtk::Button("Bookmarks");
	$wb_win->{'bookmarks'}->{'button'}->set_usize(75,25);
	$wb_win->{'bookmarks'}->{'button'}->show;
	$wb_win->{'toolbar'}->append_widget($wb_win->{'go_button'}, "Click here to load page", "");
	$wb_win->{'toolbar'}->append_widget($wb_win->{'bookmarks'}->{'button'}, "Bookmarks", "");
	$wb_win->{'toolbar'}->insert_space(2);
	$wb_win->{'toolbar'}->insert_space(4);
	$wb_win->{'toolbar'}->insert_space(6);
	$wb_win->{'toolbar'}->set_space_size(10);
	$wb_win->{'statusbar'} = new Gtk::Statusbar;
	$wb_win->{'statusbar'}->show;
	$wb_win->{'progress'}=new Gtk::ProgressBar;
	$wb_win->{'progress'}->set_usize(200,20);
	$wb_win->{'progress'}->show;
	$wb_win->{'popup'} = new Gtk::Menu;
	$wb_win->{'popup'}->{'sep'} = new Gtk::MenuItem;
	$wb_win->{'popup'}->show;
	$wb_win->{'popup'}->{'sep'}->show;
	$wb_win->{'popup'}->append($wb_win->{'popup'}->{'sep'});
	$wb_win->{'popup'}->{'save'} = new Gtk::MenuItem("Save Link As...");
	$wb_win->{'popup'}->{'save'}->signal_connect("activate" => \&download_url);
	$wb_win->{'popup'}->{'save'}->show;
	$wb_win->{'popup'}->append($wb_win->{'popup'}->{'save'});
	$wb_win->{'bookmarks'}->{'popup'} = new Gtk::Menu;
	$wb_win->{'bookmarks'}->{'popup'}->{'bm_page'} = new Gtk::MenuItem("Bookmark Current Page");
	$wb_win->{'bookmarks'}->{'popup'}->{'bm_page'}->signal_connect("activate" => \&add_bookmark, $wb_win);
	$wb_win->{'bookmarks'}->{'popup'}->{'bm_page'}->show;
	$wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{'bm_page'});
	$wb_win->{'bookmarks'}->{'popup'}->{'sep'} = new Gtk::MenuItem;
	$wb_win->{'bookmarks'}->{'popup'}->{'sep'}->show;
	$wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{'sep'});
	$sql = "select id, title, url from bookmarks order by id";
	$query=$conn->prepare($sql);
	$query->execute();
	while (@row=$query->fetchrow_array()) {
		$wb_win->{'bookmarks'}->{'popup'}->{$row[0]} = new Gtk::MenuItem($row[1]);
		$wb_win->{'bookmarks'}->{'popup'}->{$row[0]}->signal_connect("activate" => \&wb_view_url, $row[2]);
		$wb_win->{'bookmarks'}->{'popup'}->{$row[0]}->show;
		$wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{$row[0]});
	}
	$wb_win->{'html'} = new Gtk::HTML;
	if ($THREADS == 1) {
	    	$wb_win->{'html'}->signal_connect('url_requested' => \&thread_lwu);
	} else {
	    	$wb_win->{'html'}->signal_connect('url_requested' => \&load_wb_url);
	}
	$wb_win->{'html'}->signal_connect('link_clicked' => \&wb_view_url);
	$wb_win->{'html'}->signal_connect('title_changed' => sub {$wb_win->set_title($wb_win->{'html'}->get_title())});
	$wb_win->{'html'}->signal_connect('on_url' => \&wb_status);
	$wb_win->{'html'}->signal_connect('submit' => \&on_submit);
	$wb_win->{'html'}->signal_connect('redirect' => \&on_redirect);
   	$wb_win->{'html'}->set_editable(0);
   	$wb_win->{'html'}->enable_debug(0);
   	$wb_win->{'sw'} = new Gtk::ScrolledWindow(undef, undef);
   	$wb_win->{'sw'}->set_policy('automatic', 'automatic');
   	$wb_win->{'sw'}->show;
   	$wb_win->{'sw'}->add($wb_win->{'html'});
   	$wb_win->{'vbox'}->pack_start($wb_win->{'sw'},1,1,0);
	$wb_win->{'hbox'}= new Gtk::HBox(0,0);
	$wb_win->{'hbox'}->show;
	$wb_win->{'vbox'}->pack_end($wb_win->{'hbox'},0,0,0);
	$wb_win->{'hbox'}->pack_start($wb_win->{'statusbar'},1,1,0);
	$wb_win->{'hbox'}->pack_end($wb_win->{'progress'},0,0,0);
   	$wb_win->{'html'}->realize;
   	$wb_win->{'html'}->show;
	$wb_win->{'html'}->signal_connect('button_press_event' => \&wb_mouse_click);

	$wb_win->{'entry'}->signal_connect("activate" => \&wb_entry_url);
	$wb_win->{'back_button'}->signal_connect("clicked" => \&wb_view_url, "back");
	$wb_win->{'home_button'}->signal_connect("clicked" => \&wb_view_url, $prefs{'HomePage'});
	$wb_win->{'go_button'}->signal_connect("clicked" => \&wb_entry_url);
	$wb_win->{'bookmarks'}->{'button'}->signal_connect("clicked" => sub {$wb_win->{'bookmarks'}->{'popup'}->popup(undef, undef, 0, 0);});
  	$wb_win->{'file_menu'}->{'search'}->signal_connect("activate" => sub { $wb_win->{'html'}->search; });
	&wb_view_url(undef, $url);
	return 1;
}
sub add_bookmark {
	my ($widget, $wb_win) = @_;
	my ($sql, $query, $title, $address, $id);
	$title = $wb_win->{'html'}->get_title();
	$address = $wb_win->{'current'}->as_string;
	print ("title = $title\naddress = $address\n");
	$sql = "insert into bookmarks (id, title, url) values (?, ?, ?)";
	$query = $conn->prepare($sql);
	$id = &newid('bookmarks', $conn);
	$query->execute($id, $title, $address);
	$wb_win->{'bookmarks'}->{'popup'}->{$id} = new Gtk::MenuItem($title);
	$wb_win->{'bookmarks'}->{'popup'}->{$id}->signal_connect("activate" => \&wb_view_url, $address);
	$wb_win->{'bookmarks'}->{'popup'}->{$id}->show;
	$wb_win->{'bookmarks'}->{'popup'}->append($wb_win->{'bookmarks'}->{'popup'}->{$id});
	return 1;
}
 
sub on_submit {
	my ($widget, $method, $action, $encoding) = @_;
	if ($method eq "GET") {
		$action.="?$encoding";
		&wb_view_url(undef, $action);
	} elsif ($method eq "POST") {
		$wb_win->{'length'} = length($encoding);
		$wb_win->{'message'} = $encoding;
		print ("$wb_win->{'message'}\n");
		if (!$action) {$action = $wb_win->{'current'}; }
		&wb_view_url(undef, $action);
	} else {
		print ("Unsupported Form Method: $method\nAction: $action\nEncoding: $encoding\n");
	}
	return 1;
}

sub redirect_timer_event {
	my ($redirect_url) = @_;
	Gtk->timeout_remove($redirect_timerID);
	undef $redirect_timerID;
	&wb_view_url(undef, $redirect_url);
}

sub on_redirect {
	my ($widget, $url, $delay) = @_;
	if (not defined $redirect_timerID) {
		$redirect_timerID = Gtk->timeout_add($delay * 1000, \&redirect_timer_event, $url);
	}
}

sub wb_mouse_click {
	
	my ($widget, $event) = @_;
	if ($event->{'button'} != 3) {
		return 1;
	}
	if (!$wb_win->{'mouse_url'}) {
		return 1;
	}
	$wb_win->{'popup'}->popup(undef, undef, $event->{'button'}, $event->{'time'});
	return 1;	
}

sub gtkhtml_mouse_click {
	my ($widget, $popup, $url, $event) = @_;
        if ($event->{'button'} != 3) {
                return 1;
        }
	if(!defined $$url) {
		return 1;
	}
	if($$url =~ /^file:$prefs{'MailDir'}\/tmp\//) {
        	$popup->popup(undef, undef, $event, $event->{'time'});
	}
        return 1;
}

sub wb_status {
	shift;
	my $url = shift;
	if (defined $url) {
		my $stat = (new URI::URL $url, $wb_win->{'base'})->abs($wb_win->{'base'},1);
		$wb_win->{'statusbar'}->push(1,$stat);
		$wb_win->{'mouse_url'} = $stat;
	} else {
		$wb_win->{'statusbar'}->pop(1);
		$wb_win->{'mouse_url'} = "";
	}
	return 1;
}

sub wb_entry_url {
	my ($url);
	$url = $wb_win->{'entry'}->get_text;
	if ($url !~ /^\w+:/) { $url = "http://" . $url; }
	&wb_view_url(undef, $url);
	return 1;
}

sub wb_view_url {
	my ($widget, $url) = @_;
	if (!$url) { return 1; }
	my ($request, $host, $port, $path, $type, $header, $status, $st_num, $full_url, $socket, $redirect_url, $back);
	$back = 0;
	if ($url =~ /^mailto:(.+)/) {
		my ($address, @fields);
		$address = $1;
		$fields[0] = $address;    
		$fields[1] = "";
		$fields[2] = "";
		&init_msg_window(0, undef, \@fields);
		return 1;
	}

	if (not defined $wb_win) {
		&init_webbrowser($url);
		return 1;
	}
	if ($url eq "back") {
		if (defined @{$wb_win->{'history'}}) {
			my $tmp = pop @{$wb_win->{'history'}};
			if ($tmp) { $url = $tmp; $back = 1;} else { return 1; }
		} else {
			return 1;
		}
	}
	if (defined $wb_win) {
		$wb_win->{'statusbar'}->pop(1);
	}
	$wb_win->{'progress'}->set_activity_mode(1);
	if ($url =~ /^file:(.+)/) {
		$full_url = $url;
		my $path = $1;
		if (-d $path) {   # its a directory
			if ($path !~ /\/$/) { $path.="/"; }
			$wb_win->{'entry'}->set_text($full_url);
			$wb_win->{'current'} = $full_url;
			$wb_win->{'base'} = $full_url;
			$type = "text/html";
			opendir DIR, $path;
			my @entries = grep !/^\.\.?$/, readdir DIR;
			closedir(DIR);
			open (TMP,">$prefs{'MailDir'}/temp.html");
			print TMP ("<html><head><title>Items in $path</title></head><body>\n");
			print TMP ("<p><h1>Items in $path</h1></p>\n");
			print TMP ("<a href=\"file:$path\">.</a><br>\n");
			my $tmp = $path;
			$tmp =~ s/(.*\/)\w+\/$/$1/;
			print TMP ("<a href=\"file:$tmp\">..</a><br>\n");
			foreach (sort(@entries)) {
				if (-d "$path$_") {
					print TMP ("<a href=\"file:$path$_/\">$_</a><br>\n");
				} else {
					print TMP ("<a href=\"file:$path$_\">$_</a><br>\n");
				}
			}
			print TMP ("</body></html>");
			close(TMP);
			$full_url = "file:$prefs{'MailDir'}/temp.html";
		} else {		# its a file of some sort
			($type) = MIME::Types::by_suffix($1);
			if (!$type) { $type = "application/unknown"; }
		}
	} else {
		$full_url = (new URI::URL $url, $wb_win->{'base'})->abs($wb_win->{'base'},1);
#		$full_url =~ s/%(\w\w)/chr(hex($1))/eg;
		$full_url =~ /http:\/\/([\w\.-]+)([:\d]*)(.*)/;
		if (!$3) { $path = "/"; } else { $path = $3; }
		if (!$2) { $port = 80; } else { $port = $2; }
		if (!$1) { return 1; } else { $host = $1; }
		if ($prefs{'Proxy'}) {
			$socket = IO::Socket::INET->new(PeerAddr => $prefs{'Proxy'}, PeerPort => $prefs{'ProxyPort'}, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM) or return 1;
			print $socket "HEAD $full_url HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";
		} else {
			$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM) or return 1;
			print $socket "HEAD $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";

		}
CONTINUE:	$status = <$socket>;
		$/ = "";
		$header = <$socket>;
		$/ = "\n";
		$status =~ /HTTP\/\d.\d (\d+)/ and $st_num = $1;
		if ($st_num == 301 || $st_num == 302) {
			$header =~ /Location: ?(.+)/i and $redirect_url = $1;
			&wb_view_url(undef, $redirect_url);
			return 1;
		} elsif ($st_num == 100) {
			goto CONTINUE;
		} elsif ($st_num != 200) {
			&err_dialog("$status");
			return 1;
		}
		$header =~ /Content-Type: ?(.+)/i and $type = $1;
	}
	if ($type !~ /text\//i) {
		if ($type =~ /image\//) {
			$full_url =~ s/ /%20/g;
			open (TMP,">$prefs{'MailDir'}/temp.html");
			print TMP ("<html><head><title>$full_url</title></head><body><img src=$full_url></body></html>");
			close(TMP);
			$full_url = "file:$prefs{'MailDir'}/temp.html";
		} else {
			&download_url(undef, $full_url);
			return 1;
		}
	}

	if (defined $wb_win->{'current'} && $back != 1) {
		push @{$wb_win->{'history'}}, $wb_win->{'current'};
	}
	$wb_win->{'current'} = $full_url;
	$wb_win->{'base'} = $full_url;
	$wb_win->{'entry'}->set_text($full_url);
	$wb_win->{'html'}->begin($full_url);
	$wb_win->{'progress'}->set_activity_mode(0);
	return 1;
}

sub download_url {
	my ($widget, $url) = @_;
	if (!$url && !($url = $wb_win->{'mouse_url'})) { return 1; }
	my ($filename, $fs_window);
	$url =~ /\/([-\w\.]+)$/ and $filename = $1;
	if (!$filename) { $filename=""; }
	print ("File before: $filename\n");
	$fs_window = new Gtk::FileSelection "Download File";
	$fs_window->position(-mouse);
	$fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
	$fs_window->signal_connect("delete_event" => \&Gtk::false);
	$fs_window->ok_button->signal_connect("clicked", \&begin_dl, $fs_window, $url);
	$fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
	$fs_window->set_filename($filename);
	$fs_window->show;
	return 1;
}

sub begin_dl {
	my ($widget, $fs_window, $url) = @_;
	my ($fh, $status_dialog, $sd_vbox, $sd_label, $sd_pbar, $sd_button, $path, $port, $host, $socket, $status, $st_num, $length, $count, $d);
	my ($answer, $header) = ("","");
	my $filename = $fs_window->get_filename();
	print ("Filename: $filename\n");
	$fs_window->destroy;
	if ($url =~ /^file:(.+)/) {
		my $from = $1;
		copy($from, $filename);
		return 1;
	}
	$status_dialog = new Gtk::Dialog; 
	$status_dialog->signal_connect("destroy" => sub { $status_dialog->destroy; });
	$status_dialog->signal_connect("delete_event" => sub { $status_dialog->destroy; });
	$status_dialog->set_title("Downloading File...");
	$status_dialog->border_width(0);
	$sd_vbox=new Gtk::VBox(0,5);
	$sd_vbox->border_width(10);
	$status_dialog->vbox->pack_start($sd_vbox,1,1,0);
	$sd_vbox->show;
	$sd_label=new Gtk::Label "Downloading $filename...";
	$sd_label->set_alignment(0.0,0.5);
	$sd_vbox->pack_start($sd_label,0,1,0);
	$sd_label->show;
	$sd_pbar=new Gtk::ProgressBar;
	$sd_pbar->set_usize(200,20);
	$sd_vbox->pack_start($sd_pbar,1,1,0);
	$sd_pbar->show;
	$sd_pbar->set_show_text(1);
	$sd_pbar->set_text_alignment(0.5,0.5);
	$sd_pbar->set_format_string("%v of %u - %p %%");
	$sd_button=new Gtk::Button "Cancel Transfer";
	$sd_button->can_default(1);
	$status_dialog->action_area->pack_start($sd_button,1,1,0);
	$sd_button->grab_default;
	$sd_button->show;
	$status_dialog->show;
	$sd_button->signal_connect("clicked", sub { $status_dialog->destroy; $fh->close; $socket->close; return 1; });
#	$url =~ s/%(\w\w)/chr(hex($1))/eg;
#	$url =~ s/ //g;
	$url =~ /http:\/\/([\w\.-]+)([:\d]*)(.*)/;
	if (!$3) { $path = "/"; } else { $path = $3; }
	if (!$2) { $port = 80; } else { $port = $2; }
	if (!$1) { return 1; } else { $host = $1; }
	print ("Host: $host\nPath: $path\nPort: $port\n");
	if ($prefs{'Proxy'}) {
		$socket = IO::Socket::INET->new(PeerAddr => $prefs{'Proxy'}, PeerPort => $prefs{'ProxyPort'}, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM);
		print $socket "GET $url HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";

	} else {
		$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM);
		print $socket "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";
	}
CONTINUE:	$status = <$socket>;
	$status =~ /HTTP\/\d.\d (\d+)/ and $st_num = $1;
	while (defined $answer and $answer ne "\n") {
	$answer = <$socket>;
		if ($answer) {
			$answer =~ s/\r//g;
			$header.= $answer;
		}
	}
	if ($st_num == 301 || $st_num ==302) {
		$header =~ /\nLocation: ?(.+)/i and $url = $1;
		&begin_dl($widget, $fs_window, $url);
		return 1;
	} elsif ($st_num == 100) {
		goto CONTINUE;
	} elsif ($st_num != 200) {
		&err_dialog("$status");
		return 1;
	}
	print ("$header\n");
	$header =~ /Content-Length: ?(\d+)/i and $length = $1;
	$sd_pbar->configure(0,0,$length);
	if ($fh = new IO::File ">$filename") {
		if (defined $length && $length > 8192) {
			my $numfullpackets = int($length/8192);
			my $lastpacket = $length - ($numfullpackets * 8192);
			for (my $i = 1; $i <= $numfullpackets; $i++) {
				$count+=8192;
				$sd_pbar->set_value($count);
				while (Gtk->events_pending) {
					Gtk->main_iteration;
				}
				$socket->read($d, 8192);
				print $fh $d;
			}
			$socket->read($d, $lastpacket);
		} else {
			$socket->read($d, 8192);
		}
		print $fh $d;
	}
	$status_dialog->destroy;
	return 1;
}

sub thread_lwu {
	my ($html, $url, $handle) = @_;
	my $t = new Thread \&thread_start_lwu, $html, $url, $handle;
	$t->detach;
	return 1;
}

sub thread_start_lwu {
	my ($html, $url, $handle) = @_;
	Gtk::Gdk->threads_enter();
	&load_wb_url($html, $url, $handle);
	Gtk::Gdk->threads_leave();
	POSIX::_exit();
}

sub load_wb_url {
	my ($html, $url, $handle) = @_;
	my ($full_url, $socket, $answer, $length, $header, $host, $path, $port, $d, $xferencode, $status, $st_num);
	$header=""; 
	$answer = "";
	$full_url = (new URI::URL $url, $wb_win->{'base'})->abs($wb_win->{'base'},1);
	if ($full_url->as_string =~ /^file:(.+)/) {
		my $path = $1;
		$path =~ s/%(\w\w)/chr(hex($1))/eg;
		my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size)=stat $path;
		$socket = IO::File->new($path) or return 1;
		$socket->read($d, $size);
		$html->write($handle, $d);
		$html->end($handle, 'ok');
		return 1;
	}
	$full_url =~ /http:\/\/([\w\.-]+)([:\d]*)(.*)/;
	if (!$3) { $path = "/"; } else { $path = $3; }
	if (!$2) { $port = 80; } else { $port = $2; }
	if ($1) { $host = $1; } else { return 1; }
	if ($prefs{'Proxy'}) {
		$socket = IO::Socket::INET->new(PeerAddr => $prefs{'Proxy'}, PeerPort => $prefs{'ProxyPort'}, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM) or return 1;
	} else {
		$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM) or return 1;
	}
	if (!$wb_win->{'message'}) {
		if ($prefs{'Proxy'}) {
			print $socket "GET $full_url HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";
		} else {
			print $socket "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";
		}
	} else {
		if ($prefs{'Proxy'}) {
			print $socket "POST $full_url HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\nContent-type: application/x-www-form-urlencode\r\nContent-length: $wb_win->{'length'}\r\n\r\n$wb_win->{'message'}\r\n";
		} else {
			print $socket "POST $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\nContent-type: application/x-www-form-urlencode\r\nContent-length: $wb_win->{'length'}\r\n\r\n$wb_win->{'message'}\r\n";
		}
		undef $wb_win->{'message'};
		undef $wb_win->{'length'};
	}
CONTINUE:	$status = <$socket>;
	$status =~ /HTTP\/\d.\d (\d+)/ and $st_num = $1;
	while (defined $answer and $answer ne "\n") {
		$answer = <$socket>;
		if ($answer) {
			$answer =~ s/\r//g;
			$header.= $answer;
		}
	}
	if ($st_num == 301 || $st_num ==302) {
		$url = "";
		$header =~ /Location: ?(.+)/i and $url = $1;
		unless ($url eq "") {
			&load_wb_url($html, $url, $handle);
			return 1;
		}
	} elsif ($st_num == 100) {
		$answer = "";
		goto CONTINUE;
	} elsif ($st_num != 200) {
		&err_dialog("$status");
		return 1;
	}
	$header =~ /Content-Length: ?(\d+)/i and $length = $1;
	$header =~ /\nTransfer-Encoding: ?(.+)/i and $xferencode = $1;
	if (defined $xferencode && $xferencode =~ /chunked/) {
		$wb_win->{'progress'}->set_activity_mode(1);
		my ($body, $line);
		$/ = "\r\n"; 
		$line = <$socket>;
		$/ = "\n";
		$line =~ /^(\w+)/ and $length = $1;
		while (hex($length) > 0) {
			$socket->read($d, hex($length));
			$body.=$d;
			$/ = "\r\n";
			$line = <$socket>;
			$line = <$socket>;
			$length = 0;
			$line =~ /^(\w+)/ and $length = $1;
			$/ = "\n";
		}
		$html->write($handle, $body);
		$wb_win->{'progress'}->set_activity_mode(0);
	} else {
		if (defined $length && $length > 8192) {
			$wb_win->{'progress'}->configure(0,0,$length);
			my $numfullpackets = int($length/8192);
			my $lastpacket = $length - ($numfullpackets * 8192);
			for (my $i = 1; $i <= $numfullpackets; $i++) {
				$socket->read($d, 8192);
				$wb_win->{'progress'}->set_value($i * 8192);
				$html->write($handle, $d);
			}
			$wb_win->{'progress'}->set_value($length);
			$socket->read($d, $lastpacket);
		} else {
			$socket->read($d, 65535);
		}
		$html->write($handle, $d);
	}
	$html->end($handle, 'ok');
	$wb_win->{'progress'}->set_value(0);
	return 1;
}
	
# I believe the mini browser stuff ends here... - Oliof

sub new_folder {
  my ($fldr_dlg, $fd_hbox, $fd_label, $fd_button, $fd_ok, $fd_entry,
      $fldr_ctree, $fldr_scroll, $fd_label2, %lparent, @nf_node, $sql,
      $query, %lft_id, @row, $title);
  $fldr_dlg = new Gtk::Dialog;
  $fldr_dlg->position(-mouse);
  $fldr_dlg->signal_connect("destroy" => sub { $fldr_dlg->destroy; });
  $fldr_dlg->signal_connect("delete_event" => \&Gtk::false);
  $fldr_dlg->set_title("Enter Folder Name...");
  $fldr_dlg->border_width(0);
  $fd_hbox=new Gtk::HBox(0,0);
  $fd_hbox->border_width(10);
  $fldr_dlg->vbox->pack_start($fd_hbox,0,1,0);
  $fd_hbox->show;
  $fd_label=new Gtk::Label "Folder Name: ";
  $fd_label->set_alignment(0.5,0.5);
  $fd_hbox->pack_start($fd_label,0,1,0);
  $fd_label->show;
  $fd_entry=new Gtk::Entry;
  $fd_entry->set_text('');
  $fd_entry->set_editable('1');
  $fd_hbox->pack_start($fd_entry,1,1,0);
  $fd_entry->show;
  $fd_label2=new Gtk::Label "Create new folder in:";
  $fd_label2->set_alignment(0.0,0.5);
  $fldr_dlg->vbox->pack_start($fd_label2,0,1,0);
  $fd_label2->show;
  $fldr_ctree = new Gtk::CTree(1,0);
  $fldr_ctree->set_column_width(0,130);
  $sql = "select name,id,sibling,parent from boxlist order by parent,sibling";
  $query = $conn->prepare($sql);
  $query->execute();
  while (@row=$query->fetchrow_array()) {
   $title = [ $row[0] ];
   if (($row[2] == 65535) and ($row[3] == -1)) {
    $nf_node[$row[1]] = $fldr_ctree->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
   } elsif ($row[2] == 65535) {
    $nf_node[$row[1]] = $fldr_ctree->insert_node($nf_node[$row[3]],undef,$title,5,undef,undef,undef,undef,0,1);
   } else {
    $nf_node[$row[1]] = $fldr_ctree->insert_node($nf_node[$row[3]],$nf_node[$row[2]],$title,5,undef,undef,undef,undef,0,1);
   }
   $lft_id{$nf_node[$row[1]]} = $row[1];
  }
  $fldr_ctree->show;
  $fldr_scroll = new Gtk::ScrolledWindow(undef,undef);
  $fldr_scroll->set_policy('automatic', 'automatic');
  $fldr_scroll->show;
  $fldr_scroll->add($fldr_ctree);
  $fldr_dlg->vbox->pack_start($fldr_scroll,1,1,0);
  $fd_ok=new Gtk::Button "Ok";
  $fd_ok->can_default(1);
  $fd_ok->show;
  $fldr_dlg->action_area->pack_start($fd_ok,1,1,0);
  $fd_button=new Gtk::Button "Cancel";
  $fd_button->signal_connect("clicked", sub { $fldr_dlg->destroy; });
  $fd_button->can_default(1);
  $fldr_dlg->action_area->pack_start($fd_button,1,1,0);
  $fd_ok->grab_default;
  $fd_button->show;
  $fldr_dlg->show;
  $fd_ok->signal_connect("clicked" => \&add_new_folder, $fd_entry,
     $fldr_dlg, $fldr_ctree, \%lft_id);
  $fd_entry->signal_connect("activate" => \&add_new_folder, $fd_entry,
     $fldr_dlg, $fldr_ctree, \%lft_id);
  return 1;
}

sub help_view_win {
	my ($widget, $node, $x, $y, $filemenu, $bar) = @_;
  	my ($help_window, $window, $bg, $toolbar, $tb_back, $tb_prev, $vbox, $html_view, $body, $root_menu, $rm_file, $file_menu, $fm_top, $fm_prev, $fm_close);
  	$help_window=new Gtk::Window("toplevel");
  	$help_window->set_title('Help Viewer');
  	$help_window->signal_connect("destroy" => sub { $help_window->destroy; });
  	$help_window->signal_connect("delete_event" => \&Gtk::false);
  	if (defined $x and defined $y) { $help_window->set_default_size($x,$y) }
else {	$help_window->set_default_size('685','400'); }
  	$help_window->set_policy(1,1,0);
  	$help_window->show;
	$window = $help_window->window;
	$bg = $help_window->style->bg('normal');
 	$vbox= new Gtk::VBox('0','0');
  	$vbox->show;
  	$help_window->add($vbox);
  	$root_menu = new Gtk::MenuBar;
  	$rm_file=new Gtk::MenuItem("File");
  	$rm_file->show;
	if (not defined $filemenu) { $root_menu->show; }
  	$root_menu->append($rm_file);
  	$file_menu = new Gtk::Menu;
	$rm_file->set_submenu($file_menu);
  	$fm_top = new Gtk::MenuItem("Top");
  	$fm_top->show;
  	$file_menu->append($fm_top);
  	$fm_prev = new Gtk::MenuItem("Previous Node");
  	$fm_prev->show;
  	$file_menu->append($fm_prev);
  	$fm_close = new Gtk::MenuItem("Close");
  	$fm_close->signal_connect("activate" => sub { $help_window->destroy; });
  	$fm_close->show;
  	$file_menu->append($fm_close);
	$file_menu->show;
	$vbox->pack_start($root_menu,0,0,0);
	$toolbar= new Gtk::Toolbar('horizontal', 'both');
	$toolbar->set_button_relief('none');
	$toolbar->set_tooltips('1');
	$toolbar->border_width('2');
	$vbox->pack_start($toolbar,0,0,0);
	if (not defined $bar) {$toolbar->show;}
	$tb_back = $toolbar->append_item("Back","Click here to go back a node", "",new_pixmap("$prefs{'PixmapDir'}/back.xpm", $window, $bg));
	$tb_prev = $toolbar->append_item("Top","Click here to jump to the top node", "",new_pixmap("$prefs{'PixmapDir'}/top.xpm", $window, $bg));

  	if ($HTMLWIDGET eq "GtkHTML") {
		$html_view = new Gtk::HTML;
    		$html_view->signal_connect('url_requested' => \&load_help_url);
   		$html_view->signal_connect('link_clicked' => \&help_link_clicked);
		$html_view->signal_connect('title_changed' => sub {$help_window->set_title($html_view->get_title())});
   		$html_view->set_editable(0);
   		$html_view->enable_debug(0);
   		my $sw = new Gtk::ScrolledWindow(undef, undef);
   		$sw->set_policy('automatic', 'automatic');
   		$sw->show;
   		$sw->add($html_view);
   		$vbox->pack_start($sw,1,1,0);
   		$html_view->realize;
   		$html_view->show;
  	} else {
  	 	$html_view = new Gtk::XmHTML;
   		$html_view->set_anchor_buttons(0);
   		$html_view->set_allow_body_colors(1);
   		$html_view->set_hilight_on_enter(0);
   		$html_view->set_allow_font_switching(1);
   		$html_view->set_allow_images(1);
   		$html_view->set_strict_checking(1);
   		$html_view->set_anchor_target_underline_type (1);
   		$html_view->set_anchor_underline_type (1);
   		$html_view->set_anchor_visited_underline_type(1);
		$html_view->signal_connect('activate' => \&help_link_clicked);
   		$html_view->show;
   		$vbox->pack_start($html_view,1,1,0);
  	}
	$tb_back->signal_connect("clicked" => \&view_url, $html_view, $node, 2);
	$tb_prev->signal_connect("clicked" => \&view_url, $html_view, $node, 1);
  	$fm_top->signal_connect("activate" => \&view_url, $html_view, $node, 1);
	$fm_prev->signal_connect("activate" => \&view_url, $html_view, $node, 2);
	&view_url(undef, $html_view, $node, 1);
	return 1;
}

sub message_view_win {
  
  my ($widget,$row, $type) = @_;
  my ($window, $vbox, $html_view,$msgid, $hdr_pane);
  $window=new Gtk::Window("toplevel");
  if ($type < 2) {
   $window->set_title('View Message');
  } else {
   $window->set_title('View Header');
  }
  $window->signal_connect("destroy" => sub { $window->destroy; });
  $window->signal_connect("delete_event" => \&Gtk::false);
  $window->set_default_size('500','400');
  $window->set_policy(1,1,0);
  $window->show;
  $vbox= new Gtk::VBox('0','0');
  $vbox->show;
  $window->add($vbox);
  if ($type < 2) {
  my ($hbox, $hbox2, $hbox3, $hbox4, $hbox5); 
  $hbox = new Gtk::HBox(0,5);
  $hbox->show;
  $hbox2 = new Gtk::HBox(0,5);
  $hbox2->show;
  $hbox3 = new Gtk::HBox(0,5);
  $hbox3->show;
  $hbox4 = new Gtk::HBox(0,5);
  $hbox4->show;
  $hbox5 = new Gtk::HBox(0,5);
  $hbox5->show;
  $vbox->pack_start($hbox,0,0,0);
  $vbox->pack_start($hbox2,0,0,0);
  $vbox->pack_start($hbox3,0,0,0);
  $vbox->pack_start($hbox4,0,0,0);
  $vbox->pack_start($hbox5,0,0,0);
  
  $hdr_pane->{'to'} = new Gtk::Label("To: ");
  $hdr_pane->{'to'}->show;
  $hdr_pane->{'to'}->set_alignment(0.0,0.5);
  $hdr_pane->{'to_lbl'} = new Gtk::Label;
  $hdr_pane->{'to_lbl'}->show;
  $hdr_pane->{'from'} = new Gtk::Label("From: ");
  $hdr_pane->{'from'}->show;
  $hdr_pane->{'from_lbl'} = new Gtk::Label;
  $hdr_pane->{'from_lbl'}->show;
  $hdr_pane->{'date'} = new Gtk::Label("Date: ");
  $hdr_pane->{'date'}->show;
  $hdr_pane->{'date_lbl'} = new Gtk::Label;
  $hdr_pane->{'date_lbl'}->show;
  $hdr_pane->{'subject'} = new Gtk::Label("Subject: ");
  $hdr_pane->{'subject'}->show;
  $hdr_pane->{'subj_lbl'} = new Gtk::Label;
  $hdr_pane->{'subj_lbl'}->show;
  $hdr_pane->{'cc'} = new Gtk::Label("CC: ");
  $hdr_pane->{'cc'}->show;
  $hdr_pane->{'cc_lbl'} = new Gtk::Label;
  $hdr_pane->{'cc_lbl'}->show;
  $hbox->pack_start($hdr_pane->{'to'},0,0,0);
  $hbox->pack_start($hdr_pane->{'to_lbl'},0,0,0);
  $hbox2->pack_start($hdr_pane->{'from'},0,0,0);
  $hbox2->pack_start($hdr_pane->{'from_lbl'},0,0,0);
  $hbox3->pack_start($hdr_pane->{'date'},0,0,0);
  $hbox3->pack_start($hdr_pane->{'date_lbl'},0,0,0);
  $hbox4->pack_start($hdr_pane->{'subject'},0,0,0);
  $hbox4->pack_start($hdr_pane->{'subj_lbl'},0,0,0);
  $hbox5->pack_start($hdr_pane->{'cc'},0,0,0);
  $hbox5->pack_start($hdr_pane->{'cc_lbl'},0,0,0);
     }
  if ($HTMLWIDGET eq "GtkHTML") {
   my ($popup,$url,$item,$sep);
   $popup = new Gtk::Menu;
   $html_view = new Gtk::HTML;
   $html_view->signal_connect('url_requested' => \&load_url);
  # $html_view->signal_connect('link_clicked' => \&wb_view_url);
   $html_view->signal_connect('link_clicked' => \&gtkhtml_link_clicked);
   $html_view->signal_connect('button_press_event' => \&gtkhtml_mouse_click, $popup, \$url);
   $html_view->signal_connect('on_url' => sub { shift; $url = shift;});
   $sep = new Gtk::MenuItem;
   $popup->show;
   $sep->show;
   $popup->append($sep);
   $item = new Gtk::MenuItem("Save As...");
   $item->signal_connect("activate" => 
	sub {
		my ($temp,$filename,$source);
		($temp,$source,$type) = split(/:/,$url);
		$filename = $source;
                $filename =~ s/^file:$prefs{'MailDir'}\/tmp\///g;
                &init_fs_window(undef,$filename,$source);
	});
   $item->show;
   $popup->append($item);
   $item = new Gtk::MenuItem("View");
   $item->signal_connect("activate" =>
        sub {
                my ($temp,$filename,$source,$type);
                ($temp,$source,$type) = split(/:/,$url);
                &view_attachment(undef,$source,$type,'y');
        });
   $item->show;
   $popup->append($item);
   $item = new Gtk::MenuItem("View With...");
   $item->signal_connect("activate" =>
        sub {
                my ($temp,$filename,$source,$type);
                ($temp,$source,$type) = split(/:/,$url);
                &view_attachment(undef,$source,$type,'n');
        });
   $item->show;
   $popup->append($item);
   $html_view->set_editable(0);
   $html_view->enable_debug(0);
   
   my $sw = new Gtk::ScrolledWindow(undef, undef);
   $sw->set_policy('automatic', 'automatic');
   $sw->show;
   $sw->add($html_view);
   $vbox->pack_start($sw,1,1,0);
   $html_view->realize;
   $html_view->show;
  } else {
   $html_view = new Gtk::XmHTML;
   $html_view->set_anchor_buttons(0);
   $html_view->set_allow_body_colors(1);
   $html_view->set_hilight_on_enter(0);
   $html_view->set_allow_font_switching(1);
   $html_view->set_allow_images(1);
   $html_view->set_strict_checking(1);
   $html_view->set_anchor_target_underline_type (1);
   $html_view->set_anchor_underline_type (1);
   $html_view->set_anchor_visited_underline_type(1);
   $html_view->signal_connect('activate' => \&link_clicked);
   $html_view->show;
   $vbox->pack_start($html_view,1,1,0);
  }
  $msgid = ${$widget->get_row_data($row)};
  if ($type < 2) {
  &view_message($conn, $msgid, $html_view, $type, 0, undef, undef, $hdr_pane);
  } else { 
  &view_message($conn, $msgid, $html_view, $type, 0);
  }
  return 1;
}


sub address_editwin {
  my ($aw_dlg, $alias, $address, $public_key, $addrid, $lbl1,
$lbl2, $lbl3, $hbox1, $hbox2, $hbox3, $aw_ok, $aw_cancel, @row,
@selection);
  my ($widget, $clist, $action, $row) = @_;
  if ($action eq "edit") {
   if (not defined $row) {
    if (@selection = $clist->selection()) {
     $row = $selection[0];
    } else { 
	&err_dialog("Select an entry to edit!");
	return 1; 
    }
   }
   $addrid = ${$clist->get_row_data($row)};
  }
  if ($addrid) {
   $sql = "select alias, address, public_key from addresses where id=?";
   $query = $conn->prepare($sql);
   $query->execute($addrid);
   ($alias, $address, $public_key) = $query->fetchrow_array();
  } else {
   ($alias, $address, $public_key) = ("","","");
  }
  $aw_dlg = new Gtk::Dialog;
  $aw_dlg->position(-mouse);
  $aw_dlg->{'action'} = $action;
  $aw_dlg->{'id'} = $addrid;
  $aw_dlg->signal_connect("destroy" => sub { $aw_dlg->destroy; });
  $aw_dlg->signal_connect("delete_event" => \&Gtk::false);
  $aw_dlg->set_title("Addressbook Editor");
  $aw_dlg->border_width(0);
  $lbl1 = new Gtk::Label ("Alias: ");
  $lbl1->set_alignment(0.5,0.5);
  $lbl1->show;
  $aw_dlg->{'alias'} = new Gtk::Entry;
  $aw_dlg->{'alias'}->set_text($alias);
  $aw_dlg->{'alias'}->set_editable('1');
  $aw_dlg->{'alias'}->show;
  $hbox1=new Gtk::HBox(0,0);
  $hbox1->border_width('3');
  $hbox1->pack_start($lbl1,0,1,0);
  $hbox1->pack_start($aw_dlg->{'alias'},1,1,0);
  $lbl2 = new Gtk::Label ("Address: ");
  $lbl2->set_alignment(0.5,0.5);
  $lbl2->show;
  $aw_dlg->{'addr'} = new Gtk::Entry;
  $aw_dlg->{'addr'}->set_text($address);
  $aw_dlg->{'addr'}->set_editable('1');
  $aw_dlg->{'addr'}->show;
  $hbox2=new Gtk::HBox(0,0);
  $hbox2->border_width('3');
  $hbox2->pack_start($lbl2,0,1,0);
  $hbox2->pack_start($aw_dlg->{'addr'},1,1,0);
  $lbl3 = new Gtk::Label ("Public Key: ");
  $lbl3->set_alignment(0.5,0.5);
  $lbl3->show;
  $aw_dlg->{'pubkey'} = new Gtk::Entry;
  $aw_dlg->{'pubkey'}->set_text($public_key);
  $aw_dlg->{'pubkey'}->set_editable('1');
  $aw_dlg->{'pubkey'}->show;
  $hbox3=new Gtk::HBox(0,0);
  $hbox3->border_width('3');
  $hbox3->pack_start($lbl3,0,1,0);
  $hbox3->pack_start($aw_dlg->{'pubkey'},1,1,0);
  $hbox1->show;
  $hbox2->show;
  $hbox3->show;
  $aw_dlg->vbox->pack_start($hbox1,1,1,0);
  $aw_dlg->vbox->pack_start($hbox2,1,1,0);
  $aw_dlg->vbox->pack_start($hbox3,1,1,0);
  $aw_ok=new Gtk::Button "Ok";
  $aw_ok->signal_connect("clicked" => \&update_address, $aw_dlg, $clist);
  $aw_ok->can_default(1);
  $aw_ok->show;
  $aw_dlg->action_area->pack_start($aw_ok,1,1,0);
  $aw_cancel=new Gtk::Button "Cancel";
  $aw_cancel->signal_connect("clicked", sub { $aw_dlg->destroy; });
  $aw_dlg->action_area->pack_start($aw_cancel,1,1,0);
  $aw_ok->grab_default;
  $aw_cancel->show;
  $aw_dlg->show;
  return 1;
}

sub mime_editwin {
  my ($mw_dlg, $mime, $command, $icon, $mimeid, $lbl1,
$lbl2, $lbl3, $hbox1, $hbox2, $hbox3, $button, $mw_ok, $mw_cancel, @row,
@selection);
  my ($widget, $clist, $action, $row) = @_;
  if ($action eq "edit") {
   if (not defined $row) {
    if (@selection = $clist->selection()) {
     $row = $selection[0];
    } else {
        &err_dialog("Select an entry to edit!");
        return 1;
    }
   }
   $mimeid = ${$clist->get_row_data($row)};
  }
  if ($mimeid) {
   $sql = "select mime,command,icon from mimetypes where id=?";
   $query = $conn->prepare($sql);
   $query->execute($mimeid);
   ($mime, $command, $icon) = $query->fetchrow_array();
  } else {
   ($mime, $command, $icon) = ("","","");
  }
  $mw_dlg = new Gtk::Dialog;
  $mw_dlg->position(-mouse);
  $mw_dlg->{'action'} = $action;
  $mw_dlg->{'id'} = $mimeid;
  $mw_dlg->signal_connect("destroy" => sub { $mw_dlg->destroy; });
  $mw_dlg->signal_connect("delete_event" => \&Gtk::false);
  $mw_dlg->set_title("Mimetype Editor");
  $mw_dlg->border_width(0);
  $lbl1 = new Gtk::Label ("Mime: ");
  $lbl1->set_alignment(0.5,0.5);
  $lbl1->show;
  $mw_dlg->{'mime'} = new Gtk::Entry;
  $mw_dlg->{'mime'}->set_text($mime);
  $mw_dlg->{'mime'}->set_editable('1');
  $mw_dlg->{'mime'}->show;
  $hbox1=new Gtk::HBox(0,0);
  $hbox1->border_width('3');
  $hbox1->pack_start($lbl1,0,1,0);
  $hbox1->pack_start($mw_dlg->{'mime'},1,1,0);
  $lbl2 = new Gtk::Label ("Command: ");
  $lbl2->set_alignment(0.5,0.5);
  $lbl2->show;
  $mw_dlg->{'command'} = new Gtk::Entry;
  $mw_dlg->{'command'}->set_text($command);
  $mw_dlg->{'command'}->set_editable('1');
  $mw_dlg->{'command'}->show;
  $hbox2=new Gtk::HBox(0,0);
  $hbox2->border_width('3');
  $hbox2->pack_start($lbl2,0,1,0);
  $hbox2->pack_start($mw_dlg->{'command'},1,1,0);
  $button=new Gtk::Button("Browse");
  $button->signal_connect("clicked" => \&init_browse_dlg, $mw_dlg->{'command'}, "attachment_command");
  $button->set_usize(55,25);
  $hbox2->pack_start($button,0,0,0);
  $button->show;
  $lbl3 = new Gtk::Label ("Icon: ");
  $lbl3->set_alignment(0.5,0.5);
  $lbl3->show;
  $mw_dlg->{'icon'} = new Gtk::Entry;
  $mw_dlg->{'icon'}->set_text($icon);
  $mw_dlg->{'icon'}->set_editable('1');
  $mw_dlg->{'icon'}->show;
  $hbox3=new Gtk::HBox(0,0);
  $hbox3->border_width('3');
  $hbox3->pack_start($lbl3,0,1,0);
  $hbox3->pack_start($mw_dlg->{'icon'},1,1,0);
  $button=new Gtk::Button("Browse");
  $button->signal_connect("clicked" => \&init_browse_dlg, $mw_dlg->{'icon'}, "attachment_icon");
  $button->set_usize(55,25);
  $hbox3->pack_start($button,0,0,0);
  $button->show;
  $hbox1->show;
  $hbox2->show;
  $hbox3->show;
  $mw_dlg->vbox->pack_start($hbox1,1,1,0);
  $mw_dlg->vbox->pack_start($hbox2,1,1,0);
  $mw_dlg->vbox->pack_start($hbox3,1,1,0);
  $mw_ok=new Gtk::Button "Ok";
  $mw_ok->signal_connect("clicked" => \&update_mime, $mw_dlg, $clist);
  $mw_ok->can_default(1);
  $mw_ok->show;
  $mw_dlg->action_area->pack_start($mw_ok,1,1,0);
  $mw_cancel=new Gtk::Button "Cancel";
  $mw_cancel->signal_connect("clicked", sub { $mw_dlg->destroy; });
  $mw_dlg->action_area->pack_start($mw_cancel,1,1,0);
  $mw_ok->grab_default;
  $mw_cancel->show;
  $mw_dlg->show;
  return 1;
}

sub update_address {
 my ($widget, $dlg, $clist) = @_;
 my ($alias, $address, $pubkey, $id, $sql, $query, $action, @tmp);
 $alias=$dlg->{'alias'}->get_text();
 if (!$alias) { 
     &err_dialog("No alias specified!");
     return 1; 
 }
 $address = $dlg->{'addr'}->get_text();
 if (!$address) { 
     &err_dialog("no address given for alias!");
     return 1; 
 }
 $action = $dlg->{'action'};
 if (!($pubkey = $dlg->{'pubkey'}->get_text())) {
  $pubkey = " ";
 }
 $id = $dlg->{'id'};
 if ($action eq "new") {
  $sql = "select alias from addresses where alias = ?";
  $query = $conn->prepare($sql);
  $query->execute($alias);
  if (@tmp = $query->fetchrow_array()) {
   &err_dialog("Alias exists, please enter another");
   return 1;
  }  
  $sql = "insert into addresses (id, alias, address, public_key)
          values (?,?,?,?)";
  $query = $conn->prepare($sql);
  $query->execute(&newid('addresses', $conn), $alias, $address, $pubkey);
 } elsif ($action eq "edit") {
  $sql = "update addresses set alias=?, address=?, public_key=?
          where id=?";
  $query = $conn->prepare($sql);
  $query->execute($alias, $address, $pubkey, $id);
 }
 &clist_refresh($clist);
 $dlg->destroy;
 return 1;
}

sub update_mime {
 my ($widget, $dlg, $clist) = @_;
 my ($mime, $command, $icon, $id, $sql, $query, $action, @tmp);
 $mime=$dlg->{'mime'}->get_text();
 if (!$mime) {
     &err_dialog("No mime specified!");
     return 1;
 }
 $command = $dlg->{'command'}->get_text();
 if (!$command) {
     &err_dialog("no command given for mime!");
     return 1;
 }
 $action = $dlg->{'action'};
 $icon = $dlg->{'icon'}->get_text();
 $id = $dlg->{'id'};
 if ($action eq "new") {
  $sql = "select mime from mimetypes where mime = ?";
  $query = $conn->prepare($sql);
  $query->execute($mime);
  if (@tmp = $query->fetchrow_array()) {
   &err_dialog("Mime exists");
   return 1;
  } 
  $sql = "insert into mimetypes (id, mime, command, icon)
          values (?,?,?,?)";
  $query = $conn->prepare($sql);
  $query->execute(&newid('mimetypes', $conn), $mime, $command, $icon);
 } elsif ($action eq "edit") {
  $sql = "update mimetypes set mime=?, command=?, icon=?
          where id=?";
  $query = $conn->prepare($sql);
  $query->execute($mime, $command, $icon, $id);
 }
 &clist_refresh($clist);
 $dlg->destroy;
 return 1;
}


sub filter_editwin {
  my ($fw_dlg, $type, $boxid, $regex, $addr, $name, $fltid, $lbl1, $c_score, $hbox7, $lbl7,
$lbl2, $lbl3, $lbl4, $lbl5, $lbl6, $hbox1, $hbox2, $hbox3, $hbox4, $hbox5,
$hbox6, $e_name, $c_type, $c_boxid, $c_acct, $e_regex, $e_addr, $fw_ok,
$fw_cancel, %acctlist, @row, @acctnms, @selection);
  my ($widget, $filter_clist, $action, $row) = @_;
  if ($action eq "edit") {
   if (not defined $row) {
    if (@selection = $filter_clist->selection()) {
     $row = $selection[0];
    } else { 
	&err_dialog("Select a filter to edit first!");
	return 1; 
    }
   }
   $fltid = ${$filter_clist->get_row_data($row)};
  }
  if ($fltid) {
   $sql = "select type, boxid, regex, addr, name from filters where id=?";
   $query = $conn->prepare($sql);
   $query->execute($fltid);
   ($type, $boxid, $regex, $addr, $name) = $query->fetchrow_array();
  } else {
   ($type, $boxid, $regex, $addr, $name) = (0,1,"","","");
  }
  $sql = "select descr, id from accounts";
  $query = $conn->prepare($sql);
  $query->execute();
  while (@row=$query->fetchrow_array()) {
   $acctlist{$row[1]}=$row[0];
   push @acctnms, $row[0];
  }
  $fw_dlg = new Gtk::Dialog;
  $fw_dlg->signal_connect("destroy" => sub { $fw_dlg->destroy; });
  $fw_dlg->signal_connect("delete_event" => \&Gtk::false);
  $fw_dlg->set_title("Filter Editor");
  $fw_dlg->position(-mouse);
  $fw_dlg->border_width(5);
  $lbl1 = new Gtk::Label ("Filter Name: ");
  $lbl1->set_alignment(0.5,0.5);
  $lbl1->show;
  $e_name = new Gtk::Entry;
  $e_name->set_text($name);
  $e_name->set_editable('1');
  $e_name->show;
  $hbox1=new Gtk::HBox(0,0);
  $hbox1->border_width('3');
  $hbox1->pack_start($lbl1,0,1,0);
  $hbox1->pack_start($e_name,1,1,0);
  $lbl2 = new Gtk::Label ("Filter Type: ");
  $lbl2->set_alignment(0.5,0.5);
  $lbl2->show;
  $c_type = new Gtk::Combo;
  $c_type->set_case_sensitive('0');
  $c_type->set_use_arrows('1');
  $c_type->set_popdown_strings(@flttypes);
  $c_type->entry->set_text($flttypes[$type]);
  $c_type->show;
  $hbox2=new Gtk::HBox(0,0);
  $hbox2->border_width('3');
  $hbox2->pack_start($lbl2,0,1,0);
  $hbox2->pack_start($c_type,1,1,0);
  $lbl3 = new Gtk::Label ("Folder to Move to: ");
  $lbl3->set_alignment(0.5,0.5);
  $lbl3->show;
  $c_boxid = new Gtk::Combo;
  $c_boxid->set_case_sensitive('0');
  $c_boxid->set_use_arrows('1');
  $c_boxid->set_popdown_strings(keys(%foldernametoid));
  $c_boxid->entry->set_text($folderidtoname{$boxid});
  $c_boxid->show;
  $hbox3=new Gtk::HBox(0,0);
  $hbox3->border_width('3');
  $hbox3->pack_start($lbl3,0,1,0);
  $hbox3->pack_start($c_boxid,1,1,0);
  $lbl6 = new Gtk::Label ("if received on Account: ");
  $lbl6->set_alignment(0.5,0.5);
  $lbl6->show;
  $c_acct = new Gtk::Combo;
  $c_acct->set_case_sensitive('0');
  $c_acct->set_use_arrows('1');
  $c_acct->set_popdown_strings(@acctnms);
  if ($regex =~ /^\d/) {
   $c_acct->entry->set_text($acctlist{$regex});
  }
  $c_acct->show;
  $hbox6=new Gtk::HBox(0,0);
  $hbox6->border_width('3');
  $hbox6->pack_start($lbl6,0,1,0);
  $hbox6->pack_start($c_acct,1,1,0);
  $lbl4 = new Gtk::Label ("Search Expression: ");
  $lbl4->set_alignment(0.5,0.5);
  $lbl4->show;
  $e_regex = new Gtk::Entry;
  $e_regex->set_text($regex);
  $e_regex->set_editable('1');
  $e_regex->show;
  $hbox4=new Gtk::HBox(0,0);
  $hbox4->border_width('3');
  $hbox4->pack_start($lbl4,0,1,0);
  $hbox4->pack_start($e_regex,1,1,0);
  $lbl5 = new Gtk::Label ("Forward To: ");
  $lbl5->set_alignment(0.5,0.5);
  $lbl5->show;
  $e_addr = new Gtk::Entry;
  $e_addr->set_text($name);
  $e_addr->set_editable('1');
  $e_addr->show;
  $hbox5=new Gtk::HBox(0,0);
  $hbox5->border_width('3');
  $hbox5->pack_start($lbl5,0,1,0);
  $hbox5->pack_start($e_addr,1,1,0);
  $hbox7 = new Gtk::HBox(0,0);
  $hbox7->border_width('3');
  $c_score = new Gtk::Combo;
  $c_score->set_case_sensitive('1');
  $c_score->set_use_arrows('1');
  $c_score->set_popdown_strings("-3", "-2", "-1", "1", "2", "3");
  $c_score->entry->set_text($boxid);
  $c_score->show;
  $lbl7 = new Gtk::Label("Score Modifier: ");
  $lbl7->set_alignment(0.5,0.5);
  $lbl7->show;
  $hbox7->pack_start($lbl7,0,1,0);
  $hbox7->pack_start($c_score,1,1,0);
  $hbox1->show;
  $hbox2->show;
  $hbox3->show;
  if ($type != 1) {$hbox4->show;} else {$hbox6->show;}
  if ($type == 6) {$hbox3->hide; $hbox7->show;}
  $fw_dlg->vbox->pack_start($hbox1,1,1,0);
  $fw_dlg->vbox->pack_start($hbox2,1,1,0);
  $fw_dlg->vbox->pack_start($hbox3,1,1,0);
  $fw_dlg->vbox->pack_start($hbox7,1,1,0);
  $fw_dlg->vbox->pack_start($hbox4,1,1,0);
  $fw_dlg->vbox->pack_start($hbox6,1,1,0);
  $fw_dlg->vbox->pack_start($hbox5,1,1,0);

  $fw_ok=new Gtk::Button "Ok";
  $fw_ok->signal_connect("clicked" => \&update_filters, $action,
    $fw_dlg, $filter_clist, $e_name, $c_type, $c_boxid, $e_regex,
    $e_addr, $c_acct, $fltid, $c_score);
  $fw_ok->can_default(1);
  $fw_ok->show;
  $fw_dlg->action_area->pack_start($fw_ok,1,1,0);
  $fw_cancel=new Gtk::Button "Cancel";
  $fw_cancel->signal_connect("clicked", sub { $fw_dlg->destroy; });
  $fw_dlg->action_area->pack_start($fw_cancel,1,1,0);
  $fw_ok->grab_default;
  $fw_cancel->show;
  $fw_dlg->show;
  $c_type->popwin->signal_connect("hide", \&ftype_change,
    $c_type, $hbox4, $hbox6, $hbox7, $hbox3);
  $c_boxid->popwin->signal_connect("hide", \&fboxid_change,
    $c_boxid, $hbox5);
return 1;
}

sub ftype_change {
 my ($widget, $c_type, $hbox4, $hbox6, $hbox7, $hbox3) = @_;
 if ($c_type->entry->get_text() eq "Account Based") {
  $hbox4->hide;
  $hbox6->show;
  $hbox7->hide;
  $hbox3->show;
 } elsif ($c_type->entry->get_text() eq "Scoring") {
  $hbox4->show;
  $hbox6->hide;
  $hbox3->hide;
  $hbox7->show;
 } else {
  $hbox4->show;
  $hbox6->hide;
  $hbox7->hide;
  $hbox3->show;
 }
 return 1;
}

sub fboxid_change {
 my ($widget, $c_boxid, $hbox5) = @_;
 if ($c_boxid->entry->get_text() eq "Outbox") {
  $hbox5->show;
 } else {
  $hbox5->hide;
 }
 return 1;
}

sub acct_editwin {
  my ($aw_cancel, $aw_ok, $action, $mainid, @entry, @cbut, $aw_dlg, $i, @hbox,
      $name, @en_val, @cb_val, @sig, $acct_clist, @label, $aw_sig, $sig_scroll,
      $sig_hbox, $sig_label, @ent_labels, $c_type, $c_hbox, $c_label, $account_type, @ent_label);
  $action = $_[1];
  $mainid = $_[2];
  $acct_clist = $_[3];
  if ($_[4]) { @en_val = @{$_[4]}; } else { @en_val = ("", "","","","","","","",""); }
  if ($_[5]) { @cb_val = @{$_[5]}; } else {  @cb_val = (1, 1, 0, 0); }
  if (!$en_val[4]) { $en_val[4] = 110; }
  if ($_[6]) { @sig = @{$_[6]}; }
  my @acttypes = ("Pop3", "mbox", "Maildir");
  if (defined $en_val[8] && $en_val[8] ne "") { 
		$account_type = $en_val[8];
	} else { 
		$account_type = "Pop3"; 
	}
  if ($account_type eq "mbox" || $account_type eq "Maildir") { $en_val[8] = $en_val[3]; $en_val[3] = ""; } else { $en_val[8] = ""; }
  @ent_labels = ("Account Desc: ", "Friendly Name: ", "SMTP Server: ", "POP3 Server: ", "Port: ",
	     "Reply Address: ", "Username: ", "Password: ", "Local Spool File: ");
	
	# set the name of the text-label for spoolfile to maildir...
	if ($account_type eq "Maildir"){
		$ent_labels[8]="Local Maildir-Path: ";
	}
  my @buttons = (" Include in Full Mail check?",
                 " Delete messages from server?",
		 " Default account to send messages from?", 
		 " Don't download dupes\n(if delete is checked they will get removed!)?");
  
  $aw_dlg = new Gtk::Dialog;
  $aw_dlg->signal_connect("destroy" => sub { $aw_dlg->destroy; });
  $aw_dlg->signal_connect("delete_event" => \&Gtk::false);
  $aw_dlg->set_title("Account Editor");
  $aw_dlg->position(-mouse);
  $aw_dlg->border_width(0);
  $i = 0;

  $c_hbox = new Gtk::HBox(0,0);
  $c_hbox->border_width(5);
  $c_label = new Gtk::Label("Account Type:");
  $c_label->set_alignment(0.5,0.5);
  $c_type = new Gtk::Combo;
  $c_type->set_case_sensitive('0');
  $c_type->set_use_arrows('1');
  $c_type->set_popdown_strings(@acttypes);
  $c_type->entry->set_text($account_type);
  $c_type->show;
  $c_hbox->pack_start($c_label,0,1,0);
  $c_hbox->pack_start($c_type,1,1,0);
  $c_hbox->show;
  $c_label->show;
  $aw_dlg->vbox->pack_start($c_hbox,1,1,0);

  foreach $name (@ent_labels) {
   $hbox[$i]=new Gtk::HBox(0,0);
   $hbox[$i]->border_width(5);
   $aw_dlg->vbox->pack_start($hbox[$i],1,1,0);
   $hbox[$i]->show;
   $ent_label[$i]=new Gtk::Label "$name ";
   $ent_label[$i]->set_alignment(0.5,0.5);
   $hbox[$i]->pack_start($ent_label[$i],0,1,0);
   $ent_label[$i]->show;
   $entry[$i]=new Gtk::Entry;
   $entry[$i]->set_text($en_val[$i]);
   $entry[$i]->set_editable('1');
   $hbox[$i]->pack_start($entry[$i],1,1,0);
   $entry[$i]->show;
   $i++;
  }
  $entry[7]->set_visibility('0');

  if ($account_type eq "Pop3") { 
  	$hbox[8]->hide;
  } else {
        $hbox[3]->hide;
        $hbox[4]->hide;
        $hbox[6]->hide;
				$hbox[7]->hide;
  }
  $i = 0;
  foreach $name (@buttons) {
   my $hbox;
   $cbut[$i] = new_with_label Gtk::CheckButton("$name");
   $cbut[$i]->show;
   $cbut[$i]->set_active($cb_val[$i]);
   $hbox=new Gtk::HBox(0,0);
   $hbox->border_width(3);
   $hbox->pack_start($cbut[$i],1,1,0);
   $hbox->show;
   $aw_dlg->vbox->pack_start($hbox,1,1,0);
   $i++;
  }
  $sig_label = new Gtk::Label ("Signature:");
  $sig_label->show;
  $aw_sig=new Gtk::Text(undef,undef);
  $aw_sig->set_word_wrap(1);
  $aw_sig->set_editable('1');
  $sig_scroll = new Gtk::VScrollbar($aw_sig->vadj);
  $sig_scroll->show;
  if (@sig) { 
   foreach (@sig) {
    $aw_sig->insert('','','',"$_");
   }
  }
  $aw_sig->show;
  $sig_hbox= new Gtk::HBox(0,0);
  $sig_hbox->border_width('3');
  $sig_hbox->pack_start($aw_sig,1,1,0);
  $sig_hbox->pack_start($sig_scroll,0,0,0);
  $sig_hbox->show;
  $aw_dlg->vbox->pack_start($sig_label,0,0,0);
  $aw_dlg->vbox->pack_start($sig_hbox,1,1,0);
  $aw_ok=new Gtk::Button "Ok";
  $aw_ok->signal_connect("clicked" => \&update_accounts, $action,
       $mainid, $aw_dlg, $acct_clist, \@entry, \@cbut, $aw_sig, $c_type);
  $aw_ok->can_default(1);
  $aw_ok->show;
  $aw_dlg->action_area->pack_start($aw_ok,1,1,0);

  $c_type->popwin->signal_connect("hide", \&accttype_change,
    $c_type, \@hbox, \@ent_label);

  $aw_cancel=new Gtk::Button "Cancel";
  $aw_cancel->signal_connect("clicked", sub { $aw_dlg->destroy; });
  $aw_dlg->action_area->pack_start($aw_cancel,1,1,0);
  $aw_ok->grab_default;
  $aw_cancel->show;
  $aw_dlg->show;
  return 1;
}

sub accttype_change {
	my ($widget, $c_type, $ref, $reflabels) = @_;
	my @hbox = @{$ref};
	my @labels = @{$reflabels};
	if ($c_type->entry->get_text() eq "Pop3") { 
		$hbox[8]->hide;
		$hbox[3]->show;
		$hbox[4]->show;
		$hbox[6]->show;
		$hbox[7]->show;
	} else {
		$hbox[8]->show;
		$hbox[3]->hide;
		$hbox[4]->hide;
		$hbox[6]->hide;
		$hbox[7]->hide;
	}
	if ($c_type->entry->get_text() eq "Maildir"){
		$labels[8]->set_text("Local Maildir-Path: ");
	} elsif ($c_type->entry->get_text() eq "mbox"){
		$labels[8]->set_text("Local Spool File: ");
	}
}

sub update_filters {
	my ($widget, $action, $fw_dlg, $filter_clist, $e_name, $c_type, $c_boxid, $e_regex, $e_addr, $c_acct, $fltid, $c_score) = @_;
	my ($sorder, $type, $boxid, $regex, $addr, $name, $sql, $query, $i, $score);
	$name=$e_name->get_text();
	if (!$name) {
		&err_dialog("Choose a filter name!");
		return 1;
	}
	$type = $c_type->entry->get_text();
	if (!$type) { 
		&err_dialog("Select a filter type!");
		return 1; 
	}
	if ($type ne "Scoring") {
		$boxid = $c_boxid->entry->get_text();
	} else {
		$boxid = $c_score->entry->get_text();
	}
	if (!$boxid) { 
		&err_dialog("Specify a destination folder!");
		return 1; 
	}
	if ($type eq "Account Based") {
		$regex = $c_acct->entry->get_text();
		$sql = "select id from accounts where descr=?";
		$query = $conn->prepare($sql);
		$query->execute($regex);
		($regex) = $query->fetchrow_array();
	} else {
		$regex = $e_regex->get_text();
	}
	if ($type ne "Scoring") {
		$boxid = $foldernametoid{$boxid};
		if (defined $boxid && $boxid == 2) {
			$addr = $e_addr->get_text();
		} else {
			$addr = "";
		}
	}
	$i = 0;
	foreach (@flttypes) {
		if ($type eq $_) {
			$type = $i;
		}
		$i++;
	}
	if ($action eq "new") {
		$sql = "select sorder from filters order by sorder desc";
		$query = $conn->prepare($sql);
		$query->execute();
		$sorder = ($query->fetchrow_array());
		$sorder++;
		$sql = "insert into filters (id, type, boxid, regex, addr, name, sorder) values (?,?,?,?,?,?,?)";
		$query = $conn->prepare($sql);
		my $fltid = &newid('filters', $conn);
		$query->execute($fltid, $type, $boxid, $regex, $addr, $name, $sorder);
	} elsif ($action eq "edit") {
		$sql = "update filters set type=?, boxid=?, regex=?, addr=?, name=? where id=?";
		$query = $conn->prepare($sql);
		$query->execute($type, $boxid, $regex, $addr, $name, $fltid);
	}
	&clist_refresh($filter_clist);
	$fw_dlg->destroy;
	return 1;
}

sub update_accounts {
 my ($widget, $action, $mainid, $aw_win, $acct_clist, $entref, $cbref,
     $aw_sig, $c_type) = @_;
 my ($i, @entwidg, @cbwidg, $widg, @ent, @cb, $sig, $account_type);
 @entwidg = @$entref;
 @cbwidg = @$cbref;
 $i=0;
 $account_type = $c_type->entry->get_text();
 foreach $widg (@entwidg) {
  $ent[$i] = $widg->get_text;
  $i++;
 }
 if ($account_type eq "mbox" || $account_type eq "Maildir") {
  if (!$ent[0] || !$ent[1] || !$ent[2] || !$ent[5] || !$ent[8]) { 
      &err_dialog("Be sure You have filled all fields");
      return 1; }
 } else {
  	if (!$ent[0] || !$ent[1] || !$ent[2] || !$ent[3] || !$ent[4] || !$ent[5] || !$ent[6] || !$ent[7]) { 
      &err_dialog("Be sure You have filled all fields");
			return 1; 
		}
 }
 $i=0;
 foreach $widg (@cbwidg) {
  if ($widg->active) {
    $cb[$i] = "y";
  } else {
    $cb[$i] = "n";
  }
  $i++;
 }
 if ($account_type eq "mbox" || $account_type eq "Maildir") {
	$ent[3] = $ent[8];
 }
 if ($aw_sig) { $sig = $aw_sig->get_chars(0,-1); } else { $sig = ""; }
 if ($action eq "new") {
  my ($sql, $query);
  $sql = "insert into accounts (id, uname, friendly, smtp, pop, pport, pass,
          reply, include, dm, def, type, dupecheck, descr) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
  $query = $conn->prepare($sql);
  my $id = &newid('accounts', $conn);
  $query->execute($id, $ent[6], $ent[1], $ent[2], $ent[3], $ent[4], $ent[7],
    $ent[5], $cb[0], $cb[1], $cb[2], $account_type, $cb[3], $ent[0]) or return;
  if ($cb[2] eq "y") {
   $sql = "update accounts set def=?";
   $query=$conn->prepare($sql);
   $query->execute("n");
   $sql = "update accounts set def=? where id=?";
   $query=$conn->prepare($sql);
   $query->execute("y", $id);
  }
  my $menuitem=new Gtk::MenuItem("$ent[0]");
  $menuitem->signal_connect("activate" => \&check_mail, $id, "1");
  $menuitem->show;
  $acct_menu_items{$id} = $menuitem;
  $acct_menu->append($menuitem);
   my $menuitem2=new Gtk::MenuItem("$ent[0]");
     $menuitem2->signal_connect("activate" => \&check_mail, $id, "1");
       $menuitem2->show;
         $acct_menu2_items{$id} = $menuitem2;
	   $acct_menu2->append($menuitem2);
	   
  if ($sig) {
   open (TMP,">$prefs{'MailDir'}/sig/$id.sig");
    print TMP $sig;
   close(TMP);
  } else {
   unlink("$prefs{'MailDir'}/sig/$id.sig");
  }
 } elsif ($action eq "edit") {
  my ($sql, $query);
  $sql = "update accounts set uname=?, friendly=?, smtp=?, pop=?, pport=?,
          pass=?, reply=?, include=?, dm=?, def=?, type=?, dupecheck=?, descr=? where id=?";
  $query = $conn->prepare($sql);
  $query->execute($ent[6], $ent[1], $ent[2], $ent[3], $ent[4], $ent[7],
                  $ent[5], $cb[0], $cb[1], $cb[2], $account_type,$cb[3],$ent[0], $mainid) or return;
  if ($cb[2] eq "y") {
   $sql = "update accounts set def=?";
   $query=$conn->prepare($sql);
   $query->execute("n");
   $sql = "update accounts set def=? where id=?";
   $query=$conn->prepare($sql);
   $query->execute("y", $mainid);
  }
  if ($sig) {
   open (TMP,">$prefs{'MailDir'}/sig/$mainid.sig");
    print TMP $sig;
   close(TMP);
  } else {
   unlink("$prefs{'MailDir'}/sig/$mainid.sig");
  }
 }
 &clist_refresh($acct_clist);
 $aw_win->destroy;
 return 1;
}

sub clist_refresh {
 my ($clist) = @_;
 if (!$clist) { return; }
 my ($sql, $query, $row, @row, $query2, $flag);
 $flag = $clist->{'name'};
 $clist->freeze;
 $clist->clear;
 if ($flag eq "address") {
  $sql = "select id, alias, address, public_key from
         addresses";
 } elsif ($flag eq "account") {
  $sql = "select id, descr, friendly, pop, reply, include, dm, def, dupecheck from
          accounts";
 } elsif ($flag eq "filter") {
  $sql = "select id, name, type, boxid, regex, addr, sorder from
          filters order by sorder";
 } elsif ($flag eq "mimetypes") {
  $sql = "select id, mime, command, icon from
         mimetypes";
 }
 $query=$conn->prepare($sql);
 $query->execute();
 $row=0;
 while (@row=$query->fetchrow_array()) {
  if ($flag eq "address") {
   $clist->insert($row,$row[1],$row[2],$row[3]);
  } elsif ($flag eq "mimetypes") {
    $clist->insert($row,$row[1],$row[2],$row[3]);
  } elsif ($flag eq "account") {
   $clist->insert($row,$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],($row[8]) ? $row[8] : "n");
  } elsif ($flag eq "filter") {
   if ($row[2] == 1) {
    $sql = "select descr from accounts where id = ?";
    $query2=$conn->prepare($sql);
    $query2->execute($row[4]);
    $row[4] = ($query2->fetchrow_array());
   }
   if (!$row[5]) { $row[5] = " "; }
   if ($row[2] != 6) { $row[3] = $folderidtoname{$row[3]}; }
   $clist->insert($row,$row[1],$flttypes[$row[2]],$row[3],$row[4],$row[5]);
  }
  $clist->set_row_data($row, \$row[0]);
  $row++;
 }
 if ($flag ne "filter") { $clist->sort; }
 $clist->thaw;
 return 1;
}

sub create_database {
 my ($sql, $query);
 mkdir($prefs{'MailDir'}, 0755);
 mkdir("$prefs{'MailDir'}/sig", 0755);
 mkdir("$prefs{'MailDir'}/tmp", 0755);

 if ($prefs{'DatabaseDriver'} eq "CSV") {
  $sql = "create table accounts (id int,
          uname text, descr varchar(100), friendly varchar(100), smtp text, pop text,
          pport int, pass text, reply text, include text, dm text, def text,
	  type text, dupecheck text)";
  $conn->do($sql) or die "Could not create table accounts\n";
  $sql = "create table boxlist (id int,
          name varchar(100), sibling int, parent int)";
  $conn->do($sql) or die "Could not create table boxlist\n";
  $sql = "create table filters (id int,
          sorder int, type int, boxid int, regex text, addr text,
          name varchar(100) )";
  $conn->do($sql) or die "Could not create table filters\n";
  $sql = "create table messages (id int, msgid varchar(255), boxid int, accountid int,
          date text, sentto text, sentfrom text, subject text, contenttype text,
          contentxferencode text, mimeversion text, precedence text,
          approvedby text, inreplyto text, replyto text, listsub text,
          listunsub text, status text, xorigip text, cc text, sender text,
          returnpath text, priority text, xmailer text, xsender text,
          localdate text, newmsg text, replyf int, friendly text, rreceiptto text, score int)";
  $conn->do($sql) or die "Could not create table Messages\n";
  $sql = "create table bookmarks (id int, title text, url text)";
  $conn->do($sql) or die "Could not create table Bookmarks\n";
  $sql = "create table addresses (id int, alias text, address text,
          public_key text)";
  $conn->do($sql) or die "Could not create table Addresses\n";
  $sql = "create table mimetypes (id int, mime varchar(100), command varchar(100), icon varchar(100))";
  $conn->do($sql) or die "Could not create table Mimestypes\n";

 } elsif ($prefs{'DatabaseDriver'} eq "Pg") {
  $sql = "create table accounts (id int4, 
          uname text, descr text UNIQUE, friendly text, smtp text, pop
          text, pport int4, pass text, reply text, include text, dm text,
          def text, type text, dupecheck text)";
  $conn->do($sql) or die "Could not create table accounts\n";
  $sql = "create table boxlist (id int4,
          name text UNIQUE, sibling int4, parent int4)";
  $conn->do($sql) or die "Could not create table boxlist\n";
  $sql = "create table filters (id int4,
          sorder int4, type int4, boxid int4, regex text, addr text,
          name text UNIQUE)";
  $conn->do($sql) or die "Could not create table filters\n";
  $sql = "create table messages (id int4 PRIMARY
          KEY, msgid text, boxid int4, accountid int4,
          date text, sentto text, sentfrom text, subject text, contenttype text,
          contentxferencode text, mimeversion text, precedence text,
          approvedby text, inreplyto text, replyto text, listsub text,
          listunsub text, status text, xorigip text, cc text, sender text,
          returnpath text, priority text, xmailer text, xsender text,
          localdate text, newmsg text, replyf int4, friendly text, rreceiptto text, score int4)";
  $conn->do($sql) or die "Could not create table Messages\n";
  $sql = "create table bookmarks (id int4, title text, url text)";
  $conn->do($sql) or die "Could not create table Bookmarks\n";
  $sql = "create table addresses (id int4, alias text, address text,
          public_key text)";
  $conn->do($sql) or die "Could not create table Addresses\n";
  $sql = "create table mimetypes (id int4, mime text, command text, icon text)";
  $conn->do($sql) or die "Could not create table Mimetypes\n";
 } elsif ($prefs{'DatabaseDriver'} eq "mysql") {
  $sql = "create table accounts (id int4 PRIMARY KEY,
          uname text, friendly varchar(100), descr varchar(100) NOT NULL, smtp text, pop text,
          pport int4, pass text, reply text, include text, dm text, def text,
          type text, dupecheck text, UNIQUE descr (descr))";
  $conn->do($sql) or die "Could not create table accounts\n";
  $sql = "create table boxlist (id int4 PRIMARY KEY,
          name varchar(100) NOT NULL, sibling int4, parent int4,
          UNIQUE name (name))";
  $conn->do($sql) or die "Could not create table boxlist\n";
  $sql = "create table filters (id int4 PRIMARY KEY,
          sorder int4, type int4, boxid int4, regex text, addr text,
          name varchar(100) NOT NULL, UNIQUE name (name))";
  $conn->do($sql) or die "Could not create table filters\n";
  $sql = "create table messages (id int4 PRIMARY
          KEY, msgid varchar(255), boxid int4, accountid int4,
          date text, sentto text, sentfrom text, subject text, contenttype text,
          contentxferencode text, mimeversion text, precedence text,
          approvedby text, inreplyto text, replyto text, listsub text,
          listunsub text, status text, xorigip text, cc text, sender text,
          returnpath text, priority text, xmailer text, xsender text,
          localdate text, newmsg text, replyf int4, friendly text, rreceiptto text, score int4)";
  $conn->do($sql) or die "Could not create table Messages\n";
  $sql = "create table bookmarks (id int4, title text, url text)";
  $conn->do($sql) or die "Could not create table Bookmarks\n";
  $sql = "create table addresses (id int4, alias text, address text,
          public_key text)";
  $conn->do($sql) or die "Could not create table Addresses\n";
  $sql = "create table mimetypes (id int4, mime text, command text, icon text)";
  $conn->do($sql) or die "Could not create table Mimetypes\n";
 } else { die "I don't know how to make your tables...\nPlease make them manually using the source code from lines 916 through 942 as an example.\n"; }
  $sql= "insert into boxlist (id, name, sibling, parent) values (?, ?, ?,
?)";
  $query=$conn->prepare($sql);
  $query->execute(0, "Folders", 65535, -1) or die "Could not insert Master Folder\n";
  $query->execute(1, "Inbox", 2, 0) or die "Could not insert Inbox\n";
  $query->execute(2, "Outbox", 3, 0) or die "Could not insert Outbox\n";
  $query->execute(3, "Sent Items", 4, 0) or die "Could not insert Sent Items\n";
  $query->execute(4, "Deleted Items", 5, 0) or die "Could not insert Deleted Items\n";
  $query->execute(5, "Drafts", 65535, 0) or die "Could not insert Drafts\n";
 return 1;
}

sub refresh_folder_menus {
	my ($sql, $query, @row, $style);
	my $fontbold = Gtk::Gdk::Font->load($prefs{'FontMLBold'});
	my $fontnormal = Gtk::Gdk::Font->load($prefs{'FontMLNormal'});
    
	
	@new_count = ();
	@msg_count = ();
	$sql = "select newmsg, boxid from messages";
	$query = $conn->prepare($sql);
	$query->execute();
	while (@row=$query->fetchrow_array()) {
		if (($row[0]) and ($row[0] eq "y")) {
			$new_count[$row[1]]++;
			$new_count[0]++;
		}
		$msg_count[$row[1]]++;
		$msg_count[0]++;
	}
	$folder_tree->freeze;
	foreach (keys(%folderidtoname)) {
		if (!$msg_count[$_]) { $msg_count[$_] = 0;}
		if (!$new_count[$_]) { $new_count[$_] = 0;}
		$folder_tree->node_set_text($ft_node[$_], 1, $msg_count[$_]);
		$folder_tree->node_set_text($ft_node[$_], 2, $new_count[$_]);
		if (($new_count[$_] != 0) and ($prefs{'FolderNewBold'} eq "y")) {
			$style = $folder_tree->style->copy;
			$style->font($fontbold);
			$folder_tree->node_set_row_style($ft_node[$_], $style);
		} else {
			$style = $folder_tree->style->copy;
			$style->font($fontnormal);
			$folder_tree->node_set_row_style($ft_node[$_], $style);
		}
	}
	$folder_tree->thaw;
	&set_win_title;
	return 1;
}

sub set_win_title {
 my (@selection, $box, $boxname);
 @selection = $folder_tree->selection();
 if (@selection) {
  $box = $ft_id{$selection[0]};
 } else {
  $box = 0;
 }
 $boxname = $folderidtoname{$box};
 
 $root_window->set_title("CSC Mail $version - $boxname: $msg_count[$box] ($new_count[$box])");
 return 1;
}

sub click_column {
	my ($clist, $column) = @_;
	if ($column == $clist->{'sortcol'}) {
		if ($clist->{'name'} eq 'message') { $prefs{'SortDir'} = $clist->{'sortdir'}; }
		if ($clist->{'sortdir'} eq "descending") {
			$clist->{'sortdir'} = "ascending";
		} else {
			$clist->{'sortdir'} = "descending";
		}
	}
	$clist->{'sortcol'} = $column;
	if ($clist->{'name'} eq 'message') { $prefs{'SortCol'} = $column; }
	if (($clist->{'name'} eq "message") and ($clist->{'sortcol'} == 5)) {
		$clist->set_sort_column(6);
	} else {
		$clist->set_sort_column($clist->{'sortcol'});
	}
	$clist->sort;
	&set_labels($clist);
	return 1;
}

sub set_labels {
 my ($clist) = @_;
 my($x, $lblbox, $lbl, $arrow, $pixmap, $mask);
 my @headers = @{$clist->{'labels'}};
 if ($clist->{'name'} eq "message") {
  for($x = 2; $x <= 5; $x++) {
   $clist->set_column_title($x, $headers[$x]);
  }
 } else {
  $x = 0;
  foreach (@headers) {
   $clist->set_column_title($x, $_);
   $x++;
  }
 }
 if (($clist->{'name'} ne "message") or ($clist->{'sortcol'} > 1)) {
  $lblbox = new Gtk::HBox(0,0);
  $lbl = new Gtk::Label($headers[$clist->{'sortcol'}]);
  if ($clist->{'sortdir'} eq "ascending") {
   ($pixmap,$mask)=Gtk::Gdk::Pixmap->create_from_xpm($clist->clist_window,$clist->style->bg('normal'),"$prefs{'PixmapDir'}/down.xpm");
  } else {
   ($pixmap,$mask)=Gtk::Gdk::Pixmap->create_from_xpm($clist->clist_window,$clist->style->bg('normal'),"$prefs{'PixmapDir'}/up.xpm");
  }
  $arrow = new Gtk::Pixmap($pixmap, $mask);
  $lblbox->pack_start($lbl,0,0,0);
  $lblbox->pack_end($arrow,0,0,5);
  $lblbox->show;
  $lbl->show;
  $arrow->show;
  $clist->set_column_widget($clist->{'sortcol'}, $lblbox);
 }
}

sub clist_sort {
	my ($clist, $a, $b) = @_;
	if ($clist->{'sortdir'} eq "descending") {
		my $tmp = $a;
		$a = $b;
		$b = $tmp;
	}
	if ($a =~ /^\d+$/ and $b =~ /^\d+$/) {
		return ($a <=> $b);
	} else {
		return (uc($a) cmp uc($b));
	}
}

sub refresh_messages {
	my ($sql, $query, @row, @selection, $box, $row, @msg_sel, %selected, $background, $style, $paperclip, $paperclip_mask, $exclamation, $exclamation_mask, $replyf, $replyf_mask, $forwardf, $forwardf_mask);
	my $fontbold = Gtk::Gdk::Font->load($prefs{'FontMLBold'});
	my $fontnormal = Gtk::Gdk::Font->load($prefs{'FontMLNormal'});
	@selection = $folder_tree->selection();
	if (!@selection) {return 1;}
	if ($mark_timer) { Gtk->timeout_remove($mark_timer); }
	@msg_sel = $message_clist->selection();
	if (@msg_sel) {
		foreach (@msg_sel) {
			$selected{${$message_clist->get_row_data($_)}} = 1;
		}
	}
	$message_clist->freeze;
	$row=0;
	$message_clist->clear;
	$box = $ft_id{$selection[0]};
	($paperclip,$paperclip_mask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'),"$prefs{'PixmapDir'}/paperclip.xpm");
	($exclamation,$exclamation_mask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'),"$prefs{'PixmapDir'}/exclamation.xpm");
	($replyf,$replyf_mask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'),"$prefs{'PixmapDir'}/reply_flag.xpm");
	($forwardf,$forwardf_mask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'),"$prefs{'PixmapDir'}/forward_flag.xpm");

	if (($box != 3) and ($box != 2) and ($box != 5)) {
		${$message_clist->{'labels'}}[3] = "From";
		$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score from messages where boxid=?";
	} else {
		${$message_clist->{'labels'}}[3] = "To";
		$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score from messages where boxid=?";
	}
	&set_labels($message_clist);
	$query = $conn->prepare($sql);
	$query->execute($box);
	while (@row=$query->fetchrow_array()) {
		if (not defined $row[9]) { $row[9] = 0; }
		if ($row[9] == 0) { $row[9] = " "; }
		$message_clist->insert($row,'','',$row[9],$row[1],$row[2],&localdate_to_displaydate($row[5]),$row[5]);
		if ($row[6] && ($row[6] !~ /text/i && $row[6] !~ /alternative/i && $row[6] !~ /multipart\/report/i)) {
			$message_clist->set_pixmap($row, 1, $paperclip, $paperclip_mask);
		}
		if (($row[7]) and ($row[7] =~ /high/i)) {
			$message_clist->set_pixmap($row, 0, $exclamation, $exclamation_mask);
		}
		if ($row[8]) {
			if ($row[8] == 1) {
				$message_clist->set_pixtext($row, 3, $row[1],1,$replyf, $replyf_mask);
			} elsif ($row[8] == 2) {
				$message_clist->set_pixtext($row, 3, $row[1],1,$forwardf, $forwardf_mask);
			}
		}
		if (($row[4]) and ($row[4] eq "y")) {
			$style = $message_clist->style->copy;
			$style->font($fontbold);
		} else {
			$style = $message_clist->style->copy;
			$style->font($fontnormal);
		}
		$message_clist->set_row_style($row, $style);
		if ($selected{$row[0]}) {
			$message_clist->select_row($row,1);
		}
		$message_clist->set_row_data($row, \$row[0]);
		$row++;
	}
	$message_clist->sort;
	@msg_sel = $message_clist->selection;
	if (@msg_sel) {
		$message_clist->moveto($msg_sel[0],0,'0.5','0.5');
		$message_clist->set_focus_row($msg_sel[0]);
	}
	$message_clist->thaw;
	&set_win_title;
	return 1;
}

sub folderlist_drop {
	my ($widget, $context, $x, $y, $data, $info, $time) = @_;
	if (($data->length >= 0) && ($data->format == 8)) {
		printf ("Received \"%s\" in label\n", $data->data);
		$context->finish (1, 0, $time);
		return 1;
	}
	$context->finish (0, 0, $time);
}

sub init_folder_menu {
 my ($sql, $query, @row);
 $sql = "select name,id,sibling,parent from boxlist order by parent,sibling";
 $query = $conn->prepare($sql);
 $query->execute();
 $cp_folder_menu = new Gtk::Menu;
 $mv_folder_menu = new Gtk::Menu;
 $pcp_menu = new Gtk::Menu;
 $pmv_menu = new Gtk::Menu;
 $folder_tree = new_with_titles Gtk::CTree(0,@titles);
 if (not defined $prefs{'FolderTreeColWidth0'}) { $folder_tree->set_column_width(0,130); }
 if (not defined $prefs{'FolderTreeColWidth1'}) { $folder_tree->set_column_width(1,30); }
 if (not defined $prefs{'FolderTreeColWidth2'}) { $folder_tree->set_column_width(2,20); }
 for (my $i = 0; $i < 3; $i++) {
 	if (defined $prefs{'FolderTreeColWidth' . $i}) {
		$folder_tree->set_column_width($i, $prefs{'FolderTreeColWidth' . $i});
	}
 }
 $folder_tree->set_reorderable(1);
# $folder_tree->drag_dest_set('all', ['copy', 'move'], @target_table[0..1]);
# $folder_tree->signal_connect("drag_data_received", \&folderlist_drop);
 $folder_tree->signal_connect("select_row", \&refresh_messages);
 $folder_tree->signal_connect("unselect_row", sub { $message_clist->clear; });
 $folder_tree->signal_connect("tree_move", \&folder_moved);
 $folder_tree->signal_connect("resize-column" => sub {my ($d, $c, $w)=@_; $prefs{'FolderTreeColWidth'. $c}=$w;});
 %foldernametoid = ();
 %folderidtoname = ();
 while (@row=$query->fetchrow_array()) {
  my ($cp_menuitem,$mv_menuitem, $cp_menuitem2, $mv_menuitem2 ,$title);
  $foldernametoid{$row[0]} = $row[1];
  $folderidtoname{$row[1]} = $row[0];
  $parent{$row[1]} = $row[3];
  $title = [ $row[0] , "" , "" ];
  if (($row[2] == 65535) and ($row[3] == -1)) {
    $ft_node[$row[1]] = $folder_tree->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
   } elsif ($row[2] == 65535) {
    $ft_node[$row[1]] = $folder_tree->insert_node($ft_node[$row[3]],undef,$title,5,undef,undef,undef,undef,0,1);
   } else {
    $ft_node[$row[1]] = $folder_tree->insert_node($ft_node[$row[3]],$ft_node[$row[2]],$title,5,undef,undef,undef,undef,0,1);
   }
  $ft_id{$ft_node[$row[1]]} = $row[1];
  if ($row[1] != 0) {
   $cp_menuitem = new Gtk::MenuItem("$row[0]");
   $cp_menuitem2 = new Gtk::MenuItem("$row[0]");
   $cp_menuitem->signal_connect("activate" => \&copy_messages, $row[1]);
   $cp_menuitem2->signal_connect("activate" => \&copy_messages, $row[1]);
   $cp_menuitem->show;
   $cp_menuitem2->show;
   $cp_menu_items{$row[1]} = $cp_menuitem;
   $pcp_items{$row[1]} = $cp_menuitem2;
   $cp_folder_menu->append($cp_menuitem);
   $pcp_menu->append($cp_menuitem2);
   $mv_menuitem = new Gtk::MenuItem("$row[0]");
   $mv_menuitem2 = new Gtk::MenuItem("$row[0]");
   $mv_menuitem->signal_connect("activate" => \&move_messages, $row[1]);
   $mv_menuitem2->signal_connect("activate" => \&move_messages, $row[1]);
   $mv_menuitem->show;
   $mv_menuitem2->show;
   $mv_menu_items{$row[1]} = $mv_menuitem;
   $pmv_items{$row[1]} = $mv_menuitem2;
   $mv_folder_menu->append($mv_menuitem);
   $pmv_menu->append($mv_menuitem2);
  }
 }
 return 1;
}

sub folder_moved {
 my ($widget, $node1, $node2, $node3) = @_;
 my ($folder, $new_parent, $new_sib, $sql, $query);
 if (defined $node1) { $folder = $ft_id{$node1}; }
 if (defined $node2) { $new_parent = $ft_id{$node2}; }
 if (defined $node3) {
  $new_sib = $ft_id{$node3}; 
 } else {
  $new_sib = 65535;
 }
 $sql = "select sibling from boxlist where id = ?";
 $query=$conn->prepare($sql);
 $query->execute($folder);
 my ($old_sib) = $query->fetchrow_array();
 $sql = "select id from boxlist where sibling = ?";
 $query=$conn->prepare($sql);
 $query->execute($folder);
 my ($old_pre) = $query->fetchrow_array();
 $sql = "select id from boxlist where ((sibling = ?) and (parent = ?))";
 $query=$conn->prepare($sql);
 $query->execute($new_sib, $new_parent);
 my ($new_pre) = $query->fetchrow_array();
 $sql = "update boxlist set sibling = ? where id = ?";
 $query=$conn->prepare($sql);
 $query->execute($old_sib,$old_pre);
 if (defined $new_pre) { $query->execute($folder,$new_pre); }
 $sql = "update boxlist set parent = ?, sibling = ? where id = ?";
 $query=$conn->prepare($sql);
 $query->execute($new_parent,$new_sib,$folder);
 $parent{$folder} = $new_parent;
 return 1;
}

sub rename_folder {
my ($sql, $query, @foldersel, $foldername, $curfolder, @row, $win,
$hbox, $ok, $cancel, $lbl, $entry, $newfoldername);
 
 if (@foldersel = $folder_tree->selection()) {
      $curfolder = $ft_id{$foldersel[0]};} else {
&err_dialog("Please select a folder first!"); return 1;}
  
$sql = "select name from boxlist where id = $curfolder";
$query=$conn->prepare($sql);
$query->execute();
$foldername = $query->fetchrow_array();
$win = new Gtk::Dialog;
$win->set_title("Rename Folder $foldername"); 
$win->signal_connect("destroy" => sub  { $win->destroy });
$win->signal_connect("delete_event" => \&Gtk::false);
$win->set_default_size('300','90');
$win->set_policy(1,1,0);
$win->position(-mouse);
$hbox = new Gtk::HBox(0,5);
$win->vbox->pack_start($hbox,1,1,0);
$hbox->show;
$win->show;
$lbl = new Gtk::Label("Rename $foldername to: ");
$lbl->set_alignment(0.0,0.5);
$lbl->show;
$hbox->pack_start($lbl,0,0,5);
$entry = new Gtk::Entry;
$entry->set_editable('1');  

$entry->show;

$hbox->pack_start($entry,1,0,1);
$ok = new Gtk::Button "Ok";
$ok->can_default(0);
$ok->signal_connect("clicked", sub { $newfoldername =
$entry->get_text;
if ($newfoldername eq '') { &err_dialog("enter a name
please!"); return 1; } else {
$sql = "update boxlist set name = '$newfoldername' where id =
'$curfolder'";
$query = $conn->prepare($sql);
$query->execute();
$win->destroy;
&refresh_folder_name($curfolder, $newfoldername);

}
}
);
$ok->show;
$win->action_area->pack_start($ok,1,1,0);
$cancel = new Gtk::Button "Cancel";
$cancel->signal_connect("clicked", sub { $win->destroy; });
$cancel->can_default(1);
$win->action_area->pack_start($cancel, 1, 1, 0);
$cancel->grab_default;
$cancel->show;
}

sub refresh_folder_name {

 my ($folderid, $newfoldername) = @_;
 $folder_tree->freeze;
 $folder_tree->node_set_text($ft_node[$folderid], 0, "$newfoldername");
 $folder_tree->thaw;
 $cp_menu_items{$folderid}->destroy;
 $mv_menu_items{$folderid}->destroy;
 $pcp_items{$folderid}->destroy;
 $pmv_items{$folderid}->destroy;	 
 my ($cp_menuitem,$mv_menuitem, $cp_menuitem2, $mv_menuitem2);
 $cp_menuitem = new Gtk::MenuItem("$newfoldername");
 $cp_menuitem2 = new Gtk::MenuItem("$newfoldername");
 $cp_menuitem->signal_connect("activate" => \&copy_messages, $folderid);
 $cp_menuitem2->signal_connect("activate" => \&copy_messages, $folderid);
 $cp_menuitem->show;
 $cp_menuitem2->show;
 $cp_menu_items{$folderid} = $cp_menuitem;
 $pcp_items{$folderid} = $cp_menuitem2;
 $cp_folder_menu->append($cp_menuitem);
 $pcp_menu->append($cp_menuitem2);
 $mv_menuitem = new Gtk::MenuItem("$newfoldername");
 $mv_menuitem2 = new Gtk::MenuItem("$newfoldername");
 $mv_menuitem->signal_connect("activate" => \&move_messages, $folderid);
 $mv_menuitem2->signal_connect("activate" => \&move_messages, $folderid);
 $mv_menuitem->show;
 $mv_menuitem2->show;
 $mv_menu_items{$folderid} = $mv_menuitem;
 $pmv_items{$folderid} = $mv_menuitem2;
 $mv_folder_menu->append($mv_menuitem);
 $pmv_menu->append($mv_menuitem2);
 delete $folderidtoname{$folderid};
 $folderidtoname{$folderid} = $newfoldername;
&set_win_title;
return 1;

}
	      
sub delete_folder {
	my ($widget, $curfolder) = @_;
	my (@foldersel, $sql, $query, @row);
	if (!$curfolder) {
		if (@foldersel = $folder_tree->selection()) {
			$curfolder = $ft_id{$foldersel[0]};
		} else { return; }
	}
	if ($curfolder <= 4) { return; }
	if ($parent{$curfolder} == 4) {
		$folder_tree->remove_node($ft_node[$curfolder]);
		$sql = "delete from boxlist where id=$curfolder";
		$conn->do($sql);
		$sql = "delete from filters where boxid=$curfolder and type != 6";
		$conn->do($sql);
		$sql = "select id from messages where boxid=?";
		$query = $conn->prepare($sql);
		$query->execute($curfolder);
		while (@row=$query->fetchrow_array()) {
			my $tmp;
			$tmp = filename_to_tree("$prefs{'MailDir'}/$row[0]");
			unlink("$tmp");
		}
		$sql = "delete from messages where boxid=$curfolder";
		$conn->do($sql);
		$cp_menu_items{$curfolder}->destroy;
		$mv_menu_items{$curfolder}->destroy;
		$pcp_items{$curfolder}->destroy;
		$pmv_items{$curfolder}->destroy;
		if ($foldersel[0]) {
			delete $ft_id{$foldersel[0]};
		}
		delete $foldernametoid{$folderidtoname{$curfolder}};
		delete $folderidtoname{$curfolder};
	} else {
		$folder_tree->move($ft_node[$curfolder],$ft_node[4],undef);
		$parent{$curfolder} = 4;
	}
	return 1;
}

sub add_new_folder {
	my ($widget, $entry, $win, $fldr_ctree, $ftidref) = @_;
	my ($nfparent, $foldername, @sel, %lft_id);
	$foldername = $entry->get_text;
	if ($foldername eq '') { &err_dialog("Enter a name first !"); return 1; }
	foreach (keys(%foldernametoid)) {
		if ($foldername eq $_) {
			$win->destroy;
			return 1;
		}
	}
 %lft_id = %{$ftidref};
 @sel = $fldr_ctree->selection();
 if (@sel) {
  $nfparent = $lft_id{$sel[0]};
 } else {
  $nfparent = 0;
 }
 my ($sql, $query, $sort, $id);
 $sql="select id from boxlist where ((parent = ?) and (sibling = 65535))";
 $query = $conn->prepare($sql);
 $query->execute($nfparent);
 my ($oldtail) = $query->fetchrow_array();
 $sql="insert into boxlist (id, name, parent, sibling) values (?,?,?,?)";
 $query = $conn->prepare($sql);
 $id = &newid('boxlist', $conn);
 $query->execute($id, $foldername,$nfparent,65535);
 if (defined $oldtail) {
  $sql="update boxlist set sibling = ? where id = ?";
  $query = $conn->prepare($sql);
  $query->execute($id,$oldtail);
 }
 my ($cp_menuitem,$mv_menuitem, $cp_menuitem2, $mv_menuitem2,$title);
 $foldernametoid{$foldername} = $id;
 $folderidtoname{$id} = $foldername;
 $title = [ $foldername , "" ];
 $ft_node[$id] = $folder_tree->insert_node($ft_node[$nfparent],undef,$title,5,undef,undef,undef,undef,0,1);
 $ft_id{$ft_node[$id]} = $id;
 $parent{$id}=$nfparent;
 $cp_menuitem = new Gtk::MenuItem("$foldername");
 $cp_menuitem2 = new Gtk::MenuItem("$foldername");
 $cp_menuitem->signal_connect("activate" => \&copy_messages, $id);
 $cp_menuitem2->signal_connect("activate" => \&copy_messages, $id);
 $cp_menuitem->show;
 $cp_menuitem2->show;
 $cp_menu_items{$id} = $cp_menuitem;
 $pcp_items{$id} = $cp_menuitem2;
 $cp_folder_menu->append($cp_menuitem);
 $pcp_menu->append($cp_menuitem2);
 $mv_menuitem = new Gtk::MenuItem("$foldername");
 $mv_menuitem2 = new Gtk::MenuItem("$foldername");
 $mv_menuitem->signal_connect("activate" => \&move_messages, $id);
 $mv_menuitem2->signal_connect("activate" => \&move_messages, $id);
 $mv_menuitem->show;
 $mv_menuitem2->show;
 $mv_menu_items{$id} = $mv_menuitem;
 $pmv_items{$id} = $mv_menuitem2;
 $mv_folder_menu->append($mv_menuitem);
 $pmv_menu->append($mv_menuitem2);
 $win->destroy;
 &refresh_folder_menus;
 return 1;
}

sub init_acct_menu {
 my ($sql, $query, @row);
 $sql = "select id, descr from accounts order by id";
 $query = $conn->prepare($sql);
 $query->execute();
 $acct_menu = new Gtk::Menu;
 $acct_menu2 = new Gtk::Menu;
 while (@row=$query->fetchrow_array()) {
  my $menuitem=new Gtk::MenuItem("$row[1]");
  $menuitem->signal_connect("activate" => \&check_mail, $row[0], "1");
  $menuitem->show;
  $acct_menu_items{$row[0]} = $menuitem;
  $acct_menu->append($menuitem);
 my $menuitem2=new Gtk::MenuItem("$row[1]"); 
 $menuitem2->signal_connect("activate" => \&check_mail, $row[0], "1");
  $menuitem2->show;
   $acct_menu2_items{$row[0]} = $menuitem2;
   $acct_menu2->append($menuitem2);
 }
# &err_dialog("Be sure You have filled out all the fields!");
 return 1;
}


sub copy_messages {
 my $destfldr = $_[1];
 my (@selection, @foldersel, $curfolder, $msgid, $sql, $query, @row);
 if (@foldersel = $folder_tree->selection()) {
  $curfolder = $ft_id{$foldersel[0]};
 } else { $curfolder = 0; }
 if ($curfolder == $destfldr) { 
     # no err_dialog here: it doesn't give any useful info, and there's 
     # the effect of the user getting what he wants for free
     return 1; 
 }
 @selection = $message_clist->selection;
 foreach (@selection) {
  $msgid = ${$message_clist->get_row_data($_)};
  $sql = "select accountid, date, sentto, sentfrom, subject, contenttype,
          contentxferencode, mimeversion, precedence, approvedby,
          inreplyto, replyto, listsub, listunsub, status, xorigip, cc,
          sender, returnpath, priority, xmailer, xsender, msgid, replyf,
          friendly, newmsg, localdate from messages where id = ?";
  $query = $conn->prepare($sql);
  $query->execute($msgid);
  @row=$query->fetchrow_array();
  $sql = "insert into messages (id, boxid, accountid, date, sentto,
       sentfrom, subject, contenttype, contentxferencode, mimeversion,
       precedence, approvedby, inreplyto, replyto, listsub, listunsub,
       status, xorigip, cc, sender, returnpath, priority, xmailer,
       xsender, msgid, replyf, friendly, newmsg, localdate)
       values
       (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
       ?, ?, ?, ?, ?, ?)";
  $query=$conn->prepare($sql);
  my $newid = &newid('messages', $conn);
  $query->execute($newid, $destfldr, $row[0], $row[1],
		  $row[2], $row[3], $row[4],
                  $row[5], $row[6], $row[7], $row[8], $row[9], $row[10],
                  $row[11], $row[12], $row[13], $row[14], $row[15],
                  $row[16], $row[17], $row[18], $row[19], $row[20],
                  $row[21], "$row[22]", $row[23], $row[24], $row[25],
		  $row[26]);
  my ($tmp, $tmp2);
  $tmp = filename_to_tree("$prefs{'MailDir'}/$msgid");
  $tmp2 = filename_to_tree("$prefs{'MailDir'}/$newid");
  copy($tmp, $tmp2);
 }
 &refresh_folder_menus;
 return 1;
}

sub empty_trash {
	my ($sql, $query, @foldersel, $curfolder, @row);
	$sql = "select id from boxlist where parent = 4";
	$query=$conn->prepare($sql);
	$query->execute();
	while (@row=$query->fetchrow_array()) {
		&delete_folder(undef, $row[0]);
	}
	$sql = "select id from messages where boxid = 4";
	$query=$conn->prepare($sql);
	$query->execute();
	while (@row=$query->fetchrow_array()) {
		my $tmp;
		$tmp = filename_to_tree("$prefs{'MailDir'}/$row[0]");
		unlink("$tmp");
	}
	$sql = "delete from messages where boxid = 4";
	$conn->do($sql);
	if (@foldersel = $folder_tree->selection()) {
		$curfolder = $ft_id{$foldersel[0]};
		if ($curfolder == 4) { $message_clist->clear; }
	}
	&refresh_folder_menus; 
	return 1;
}

sub empty_folder {

my ($sql, $sql2, $query, @foldersel, $curfolder, @row);
     
     if (@foldersel = $folder_tree->selection()) {
     $curfolder = $ft_id{$foldersel[0]};
     if ($curfolder == 4) { &err_dialog("Use Empty deleted items for the trash folder"); return 1;}
 } else { &err_dialog("Please select a folder first!"); return 1; }

$sql = "select id from messages where boxid = '$curfolder'";

$query=$conn->prepare($sql);
$query->execute();

while (@row = $query->fetchrow_array()) {

$sql = "update messages set boxid = 4  where id = @row";
        $conn->do($sql);

if ($prefs{'DeleteMarksAsRead'} eq "y") { 
$sql2 = "update messages set newmsg = 'n' where id = @row";
$conn->do($sql2);}

}
	&refresh_folder_menus; 
	$message_clist->clear;  
	return 1;
}
	       

sub delete_msgs {
	my (@selection,@foldersel,$curfolder,$msgid, $sql, $query, $tmp, $hirow, $count, $target);
	if (@foldersel = $folder_tree->selection()) {
		$curfolder = $ft_id{$foldersel[0]};
	} else { 
		return 1; 
	}
	if ($curfolder != 4) {
		&move_messages(0,4); 
	} else {
		unless (@selection = $message_clist->selection) {
			&err_dialog("Select message(s) to delete!");
		}
		$message_clist->freeze;
		$count = 0;
		foreach (sort numerically (@selection)) {
			$target = $_ - $count;
			$msgid = ${$message_clist->get_row_data($target)};
			$message_clist->remove($target);
			$hirow = $target;
			$tmp = filename_to_tree("$prefs{'MailDir'}/$msgid");
			unlink("$tmp");
			$sql = "delete from messages where id = $msgid";
			$conn->do($sql);
			$count++;
		}
		if ($message_clist->rows != 0) {
			while ($hirow >= $message_clist->rows) { $hirow--; }
			$message_clist->moveto($hirow, 0, '0.5', '0.5');
			$message_clist->select_row($hirow,0);
		}
		$message_clist->thaw;
		&refresh_folder_menus;
	}
	return 1;
}

sub move_messages {
	my ($d, $destfldr) = @_;
	my (@selection,@foldersel,$curfolder,$msgid, $sql, $query, $hirow, $sql2, $count, $target);
	if (@foldersel = $folder_tree->selection()) {
		$curfolder = $ft_id{$foldersel[0]};
	} else { return 1; }
	if ($curfolder == $destfldr) { return 1; }
	if (@selection = $message_clist->selection) {
		$message_clist->freeze;
		$count = 0;
		foreach (sort numerically (@selection)) {
			$target = $_ - $count;
			$msgid = ${$message_clist->get_row_data($target)};
			$message_clist->remove($target);
			$hirow=$target;
			$sql = "update messages set boxid = $destfldr where id = $msgid";
			if ($d == 0  and $prefs{'DeleteMarksAsRead'} eq "y") {
				$sql = "update messages set boxid = $destfldr, newmsg = 'n' where id = $msgid";
			}
			$conn->do($sql);
			$count++;
		}
		if ($message_clist->rows != 0) {
			while ($hirow >= $message_clist->rows) { $hirow--; }
			$message_clist->moveto($hirow, 0, '0.5', '0.5');
			$message_clist->select_row($hirow,0);
		}
		$message_clist->thaw;
		&refresh_folder_menus;
	}
	return 1;
}

sub new_pixmap {
	my ($filename, $window, $background) = @_;
	my ($pixmap, $mask) = create_from_xpm Gtk::Gdk::Pixmap($window, $background, $filename);
	return new Gtk::Pixmap($pixmap, $mask);
}

sub selection_handler {
 my ($widget,$html_view,$attach_menu,$view_attach_menu,$hdr_pane,$row,$col)=@_;
 if ($view_timer) {
   Gtk->timeout_remove($view_timer);
 }
 $view_timer=Gtk->timeout_add(100,\&view_msg,$widget,$row,$col,$html_view,$attach_menu,$view_attach_menu,$hdr_pane);
 return 1;
}

sub check_receipt {
	my ($msgid)=@_;
	my ($query,$receiptto,$subject);
  $sql = "select subject, rreceiptto from messages where id=$msgid";
  $query=$conn->prepare($sql);
  $query->execute();
  ($subject, $receiptto)=$query->fetchrow_array();
  if (defined $receiptto && $receiptto ne "" && $receiptto ne "sent" && $receiptto ne "never"){
		# check the prefs what to do with the receipt
	  if (defined $prefs{'SendReceipt'} && $prefs{'SendReceipt'} eq "never"){
			&receipt_never(undef, undef, $msgid);
		} elsif (defined $prefs{'SendReceipt'} && $prefs{'SendReceipt'} eq "all") {
			&receipt_now(undef, undef, $msgid);
		} else {
			&receipt_dialog($msgid, $subject, $receiptto);
		}
	}
}

sub receipt_dialog {
 my ($msgid, $subject, $receiptto) = @_;
 my ($dlg, $lbl, $ok, $later, $never);
 $dlg = new Gtk::Dialog;
 $dlg->set_modal(1);
 $dlg->position(-mouse);
 $dlg->signal_connect("destroy", sub {$dlg->destroy;});
 $dlg->signal_connect("delete_event" => \&Gtk::false);
 $dlg->set_title("Receipt request");
 $dlg->vbox->border_width(5);
 $dlg->set_default_size(170, 140);
 $lbl = new Gtk::Label "$receiptto requested a receipt for the mail \"$subject\".\n\nDo you want me to send one?";
 $lbl->set_alignment(0.5,0.5);
 $lbl->set_line_wrap(1);
 $dlg->vbox->pack_start($lbl,1,1,5);
 $lbl->show;

 $ok = new Gtk::Button "Yes";
 $ok->signal_connect("clicked", \&receipt_now, $dlg, $msgid);
 $ok->set_usize(55,25);
 $ok->show;
 $dlg->action_area->pack_start($ok,0,0,0);

 $later = new Gtk::Button "Later";
 $later->signal_connect("clicked", \&receipt_later, $dlg);
 $later->set_usize(55,25);
 $later->show;
 $dlg->action_area->pack_start($later,0,0,0);

 $never = new Gtk::Button "Never";
 $never->signal_connect("clicked", \&receipt_never, $dlg, $msgid);
 $never->set_usize(55,25);
 $never->show;
 $dlg->action_area->pack_start($never,0,0,0);
 $dlg->show;
 return 1;
}

sub receipt_never {
	my ($widget,$dlg,$msgid)=@_;
	my $sql;
	if (defined $dlg){
		$dlg->destroy;
	}
  $sql = "update messages set rreceiptto='never' where id = $msgid";
  $conn->do($sql);
}

sub receipt_later {
	my ($widget,$dlg)=@_;
	if (defined $dlg){
		$dlg->destroy;
	}
}

sub receipt_now {
	my ($widget,$dlg,$msgid)=@_;
	my ($nuke,$file);
	my (@attachment);
	
	if (defined $dlg){
		$dlg->destroy;
	}
	
  $sql = "select subject, sentfrom, sentto, date, accountid from messages where id=$msgid";
  $query=$conn->prepare($sql);
  $query->execute();
  my ($subject, $from, $to, $date, $acctid)=$query->fetchrow_array();

# read the message for inclusion in the reply
  $file = &filename_to_tree("$prefs{'MailDir'}/$msgid");
	push @attachment, $file;
  
	my $tmpmail=<<"ENDOFMSG"
The message sent on $date to $to with subject "$subject" has been displayed.  

This is no guarantee that the message has been read or understood.

The original message has been attached.
ENDOFMSG
;
  &send_message(undef, undef, undef, undef, $tmpmail, $to, $from, "auto-generated receipt", $acctid, \@attachment);
  $sql = "update messages set rreceiptto='sent' where id = $msgid";
  $conn->do($sql);
}


sub mark_read {
	if ($mark_timer) { Gtk->timeout_remove($mark_timer); }
	my ($widget, $row, $msgid) = @_;
	my ($query,$receiptto);
	my $fontbold = Gtk::Gdk::Font->load($prefs{'FontMLBold'});
	my $fontnormal = Gtk::Gdk::Font->load($prefs{'FontMLNormal'});
 
	my $style=$widget->style->copy;
	$style->font($fontnormal);
	$widget->set_row_style($row, $style);
	$sql = "update messages set newmsg='n' where id = $msgid";
	$conn->do($sql);
	&check_receipt($msgid);
	&refresh_folder_menus;
}

sub view_msg {
 my ($widget, $row, $col, $html_view, $attach_menu, $view_attach_menu, $hdr_pane) = @_;
 my ($msgid, $sql, $query, $newmsg);
 if ($col == 1) { 
     return 1; 
 }
 $sql = "select newmsg from messages where id=?";
 $query=$conn->prepare($sql);
 if ($view_timer) { Gtk->timeout_remove($view_timer); }
 undef $view_timer;
 $msgid = ${$widget->get_row_data($row)};
 &view_message($conn, $msgid, $html_view, 1, 0, $attach_menu, $view_attach_menu, $hdr_pane);
 $query->execute($msgid);
 ($newmsg) = $query->fetchrow_array();
## mark as read
 if (($newmsg) and ($newmsg eq "y")) {
  if ($mark_timer) {
   Gtk->timeout_remove($mark_timer);
  }
  $mark_timer = Gtk->timeout_add($prefs{'MarkAsReadDelay'} * 1000, \&mark_read, $widget, $row, $msgid);
 } else { 
## if already read check if return receipt has already been sent, if no, ask to 
  &check_receipt($msgid);
 }
 return 1;
}

sub edit {
	my ($msgid, $sql, $query, @selection, $acctid, $subject, $cc, $to, @fields);
	@selection = $message_clist->selection;
	if (!@selection) {      
	    &err_dialog("Select a message to edit!");
	    return 1; 
	}
	$msgid = ${$message_clist->get_row_data($selection[0])};
	$sql = "select accountid, subject, cc, sentto from messages where id=?";
	$query=$conn->prepare($sql);
	$query->execute($msgid);
	($acctid, $subject, $cc, $to) = $query->fetchrow_array();
	$fields[0] = $to;
	$fields[1] = $cc;
	$fields[2] = $subject;
	&init_msg_window(0, undef, \@fields, $msgid, $acctid, 3);
	return 1;
}


sub reply {
	my ($msgid, $sql, $query, @selection, $acctid, $subject, $reply, $from, @fields);
	@selection = $message_clist->selection;
	if (!@selection) { 
	    &err_dialog("Select a message to reply to!");
	    return 1; 
	}
	$msgid = ${$message_clist->get_row_data($selection[0])};
	$sql = "select accountid, subject, replyto, sentfrom from messages where id=?";
	$query=$conn->prepare($sql);
	$query->execute($msgid);
	($acctid, $subject, $reply, $from) = $query->fetchrow_array();
	if (!$reply) { $reply = $from; }
	unless ($subject =~ /^Re: /i) {
		$subject = "Re: " . $subject;
	}
	$fields[0] = $reply;
	$fields[1] = "";
	$fields[2] = $subject;
	&init_msg_window(0, undef, \@fields, $msgid, $acctid, 1);
	return 1;
}

sub reply_all {
 my ($msgid, $sql, $query, @selection, $acctid, $subject, $reply, $from, 
     $to, $cc, @msgbody, @row, @fields, @temp);
 @selection = $message_clist->selection;
 if (!@selection) { 
     &err_dialog("Select a message to reply to!");
     return 1; 
 }
 $msgid = ${$message_clist->get_row_data($selection[0])};
 $sql = "select accountid, subject, replyto, sentto, cc,
         sentfrom from
         messages where id=?";
 $query=$conn->prepare($sql);
 $query->execute($msgid);
 ($acctid, $subject, $reply, $to, $cc, $from) = $query->fetchrow_array();
 if (!$reply) { $reply = $from; }
 #if ($reply =~ /<(\S+)>/) { $reply = $1; } same goes for reply-all.
 unless ($subject =~ /^Re: /i) {
  $subject = "Re: " . $subject;
 }
 $fields[0] = $reply . ", " . $to;

 # add from field to the to listing if the reply to is set...
 $fields[0].= ",".$from if ($reply && $reply ne $from);
 $fields[1] = $cc;
 $fields[2] = $subject;
 &init_msg_window(0, undef, \@fields, $msgid, $acctid, 1);
 return 1;
}

sub view_header {
  my ($widget, $clist) = @_;
  my (@selection);
  @selection = $clist->selection;
  if (!@selection) { return 1; }
  &message_view_win($clist, $selection[0], 3);
  return 1;
}

sub clist2ab {
  my ($widget, $clist) = @_;
  my (@selection, $sql, $query, $from);
  @selection = $clist->selection;
  if (!@selection) { 
	    &err_dialog("You must select a message first!");
      return 1; 
  }
  $sql = "select sentfrom from messages where id = ?";
  $query=$conn->prepare($sql);
  foreach (@selection) {
   $query->execute(${$clist->get_row_data($_)});
   ($from) = ($query->fetchrow_array());
   &add2ab($from);
  }
  return 1;
}

sub add2ab {
  my ($from) = @_;
  if (not defined $from) { 
      &err_dialog("Could not extract sender address!");
      return 1; 
  }
  my ($sql, $query, @row, $alias, $address, @tmp);
  if ($from =~ /^\"?(.+?)\"? ?<(.+)>/) { $alias = $1; $address = $2; }
  if ($from =~ /^\"?(.+?)\"? ?\(\"?(.+?)\"?\)/) { $alias = $2; $address=$1; }
  if (!$alias) {
   $alias = $from;
   $address = $from;
  }
  $sql = "select alias from addresses where alias = ?";
  $query = $conn->prepare($sql);
  $query->execute($alias);
  if (@tmp = $query->fetchrow_array()) {
   return 1;
  }
  $sql = "insert into addresses (id, alias, address, public_key)
          values (?,?,?,?)";
  $query= $conn->prepare($sql);
  $query->execute(&newid('addresses', $conn), $alias, $address, " ");
  return 1;
}

sub forward {
 my ($msgid, $sql, $query, @selection, $acctid, $subject, 
     @msgbody, @row, @fields);
 @selection = $message_clist->selection;
 if (!@selection) { 
     &err_dialog("Select message to forward!");
     return 1; 
 }
 $msgid = ${$message_clist->get_row_data($selection[0])};
 $sql = "select accountid, subject from
         messages where id = ?";
 $query=$conn->prepare($sql);
 $query->execute($msgid);
 ($acctid, $subject) = $query->fetchrow_array();
 unless ($subject =~ /^Fw: /i) {
  $subject = "Fw: " . $subject;
 }
 $fields[0] = "";
 $fields[1] = "";
 $fields[2] = $subject;
 &init_msg_window(0, undef, \@fields, $msgid, $acctid, 2);
 return 1;
}

sub rw_select_all {
	my ($i);
	for ($i = 0; $i < $message_clist->rows; $i++) {
		$message_clist->select_row($i, 0);
	}
	return 1;
}

sub clear_selection {
	my ($i);
	for ($i = 0; $i < $message_clist->rows; $i++) {
		$message_clist->unselect_row($i, 0);
	}
	return 1;
}


sub send_message {
	my ($widget, $msg_window, $in_refto,$forrep, $pbody, $pfrom, $pto, $psubject, $pacctid, $pattachments) = @_;
	my ($from, $to, $cc, $subj, $body, $sender) = ("","","","","","","");
	my (@entry, $sql, $query, @row, $acctid, @attachments, $arrtmp, $tmp, $mimemail, $mimetype, $mimeencode, $defaultmime, $defaultenc);
	$defaultmime="application/x-unknown";
	$defaultenc="base64";
	if (defined $msg_window){
		$from = $msg_window->{'fromCombo'}->entry->get_text;
		$sql = "select id, friendly, reply from accounts where descr=?";
		$query=$conn->prepare($sql);
 
		$query->execute($from);
		if (@row=$query->fetchrow_array()) {
			$acctid = $row[0];
			$from = "$row[1] <$row[2]>";
		} else { 
		    &err_dialog("You must choose an account to send from!");
		    return 1; 
		}
		$to = $msg_window->{'ToEntry'}->get_text;
		if (!$to) { 
		    &err_dialog("You must specify at least one recipient!");
		    return 1; 
		}
		$cc = $msg_window->{'CcEntry'}->get_text;
		$subj = $msg_window->{'SubjEntry'}->get_text;

		if (!$subj) { $subj = " "; }  # allow blank subjects
		$body = $msg_window->{'mailText'}->get_chars(0,-1);
		if (!$body) { 
		    &err_dialog("Message has no body!");
		    return 1; 
		}
	} else { 
		$from=$pfrom;
		$acctid=$pacctid;	 
		$to=$pto;
		$subj=$psubject;
		$body=$pbody;
	}
	$Text::Wrap::columns = $prefs{'WrapAfter'};
	$body=&Text::Wrap::wrap("","",$body);
	wr_debug("Checking to see if message should be encrypted");
	if (($prefs{'Encrypt'}) || ($prefs{'Sign'})) {
		$body = "\n".$body; ## For some reason the first line is lost
		wr_debug("This mail should be encrypted");
		wr_debug("Obtaining a list of EMail addresses");

		my @email_addresses;
		push(@email_addresses, get_addresses_from_string($to));
		push(@email_addresses, get_addresses_from_string($cc));
		if ($prefs{'EncToSelf'}) {
			push(@email_addresses, get_addresses_from_string($from));
		}

		wr_debug("EMails: @email_addresses");
		wr_debug("Checking each address for a coresponding PGP key");
 
		my $sth1 = $conn->prepare("select public_key from addresses where address=?");
 
		my @keys;
		foreach my $check_email (@email_addresses) {
			$sth1->execute($check_email);
 
			my @raw_return = $sth1->fetchrow_array;
			my $key = $raw_return[0];

			if (not defined $key) {
				wr_debug("No key specified in Addressbook - I got: $key");
				&err_dialog("No key specified in addressbook for\n$check_email.\nOpen Addressbook and specify the key there.");
				return 1;
			} else {
				push(@keys, $key);
			}
 
		} 

		wr_debug("Keys: @keys");

		my $gpg_object = new CSCcrypt::GPG({'gpgpath' => '/usr/local/bin/gpg'});

		my ($stdout, $sterr) = $gpg_object->encrypt(\@keys, [$body], $prefs{'Encrypt'}, $prefs{'Sign'}, $passphrase);

		wr_debug("STDOUT: $stdout");
		wr_debug("STERR: $sterr");

		if (($stdout eq undef) || (grep(/BAD_PASSPHRASE/, @$sterr))) {
			wr_debug("Unable to encrypt - Raise errorbox");
			err_dialog("Encryption did not complete with the following errors:\n @$sterr");

			if ($prefs{'Sign'}) {
				wr_debug("OPening obtain_passphrase");
				obtain_passphrase();
			}

			return 1;
		}

		wr_debug("STDOUT2: @$stdout");
		$body = join('', @$stdout);

		wr_debug("BODY: $body");

	}
 
	my $date = &date_now;
	my $localdate = &date_to_localdate($date);
	my $msgid = scalar(localtime) . "\@$from";

	# build the time..
  
	# Assemble the mail body and the headers....
	# encode attachments as necessary
	$mimemail=build MIME::Entity(  From=>$from,
					To=>$to,
 					CC=>$cc,
					'Reply-To'=>$from,
					Subject=>$subj,
					'X-Mailer'=>"CSCMail ".$version,
					Date=>&UnixDate(&ParseDateString("epoch ".time()),"%d %b %Y %H:%M:%S %Z"),
					Data=>$body);
	# check if a reciept is requested
	if (defined $msg_window && $msg_window->{'receiptCheck'}->active){
		my $frommail=$from;
		$frommail=~s/(.+) \<(.+)\>/\<$2\>/;
 		$mimemail->head->add('Disposition-Notification-To',$frommail);
 		$mimemail->head->add('Return-Receipt-To',$frommail);
	}
	# check if priority is not normal, then set the header field
	my @priolist=("1 (Highest)","2 (High)","3 (Normal)","4 (Low)","5 (Lowest)");
	if (defined $msg_window && !$msg_window->{'priorityRadio'}[2]->active){
		for (my $tmp=0;$tmp<scalar(@priolist);$tmp++){
			last if ($msg_window->{'priorityRadio'}[$tmp]->active);
		}
 		$mimemail->head->add('X-Priority',$priolist[$tmp]);
	}
 
	# method to get the names of attachments
	@attachments=();
	if (defined $msg_window){ 
		if ($msg_window->{'attachClist'}->rows>0){
			for (my $tmp=0;$tmp<$msg_window->{'attachClist'}->rows;$tmp++){
				push @attachments, $msg_window->{'attachClist'}->get_text($tmp, 0);
			}
		}
	} else {
 		@attachments=@{$pattachments};
	}
	if (@attachments && scalar(@attachments)>0){
		for ($tmp=0;$tmp<scalar(@attachments);$tmp++){
			($mimetype,$mimeencode)=MIME::Types::by_suffix($attachments[$tmp]);
			if (!defined $mimetype || $mimetype eq ""){
				$mimetype=$defaultmime;
				$mimeencode=$defaultenc;
			}
			$mimemail->attach( Path=>$attachments[$tmp],
						Type=>$mimetype,
						Encoding=>$mimeencode);
		}
	}
	#$mimemail->sign;
	$body=$mimemail->as_string;
	# new body= the assembled mimemail
	my $folder;
	if (defined $msg_window && defined $msg_window->{'folder'}) {
		$folder = $msg_window->{'folder'};
	} else {
		$folder = 2;
	}
	$sql = "insert into messages (id, accountid, sentfrom, sentto, subject, cc,
	         localdate, boxid, contenttype, date, msgid, friendly) values
	         (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	$query=$conn->prepare($sql);
	my $newid = &newid('messages', $conn);
	$query->execute($newid, $acctid, $from, $to, $subj, $cc, $localdate, $folder, $mimemail->mime_type(), $date,
		$msgid, &process_from($to));
	$tmp = filename_to_tree("$prefs{'MailDir'}/$newid");
	open(TMP,">$tmp");
	print TMP $body;
	close(TMP);
	if (defined $in_refto && $forrep != 0) {
		$sql = "update messages set replyf = ? where id = ?";
		$query=$conn->prepare($sql);
		$query->execute($forrep, $in_refto);
		if ($prefs{'AddReplytoAB'} eq "y") {
			$sql = "select sentfrom from messages where id = ?";
			$query=$conn->prepare($sql);
			$query->execute($in_refto);
			my ($addfrom) = ($query->fetchrow_array());
			&add2ab($addfrom);
		}
	}
	if (defined $forrep && $forrep == 0) {
		$sql = "select boxid from messages where id = ?";
		$query=$conn->prepare($sql);
		$query->execute($in_refto);
		my ($cur_folder) = ($query->fetchrow_array());
		if (defined $cur_folder && ($cur_folder == 5 || $cur_folder == 2)) {
			$sql = "delete from messages where id = ?";
			$query=$conn->prepare($sql);
			$query->execute($in_refto);
			my $nuke_me = &filename_to_tree("$prefs{'MailDir'}/$in_refto");
			unlink($nuke_me);
			if (defined $entity{$in_refto}) {
				&destroy_entity(undef, $in_refto);
			}
			#refresh if we are running onetime.
			if (defined $ONETIME && $ONETIME != 1) {
			    &refresh_messages;}
		}
	}
	#refresh the folders if we aren't runing for one time
	if (defined $ONETIME && $ONETIME != 1) {
	    &refresh_folder_menus;}
        #send those messages cause we are dying
       	if (defined $ONETIME and $ONETIME == 1 and $prefs{'SendImmediately'} eq "y") {  &send_out }
	
	if (defined $msg_window){
		$msg_window->destroy;
	}
 
	if ($prefs{'SendImmediately'} eq "y") { &send_out; }
	return 1;

}

sub insertFromFileSelect {
 my ($widget, $win)=@_ ;
 my ($fs_window);
 $fs_window = new Gtk::FileSelection "Choose file to insert into Message...";
 $fs_window->position(-mouse);
 $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
 $fs_window->signal_connect("delete_event" => \&Gtk::false);
 $fs_window->ok_button->signal_connect("clicked", \&insertFromFile, $fs_window, $win);
 $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
 $fs_window->show;
 return 1;
}

sub insertFromFile {
	my ($widget, $filewin, $win)=@_;
	my ($filename, $error, $tmp, $textbox);
	$textbox=$win->{'mailText'};
	$error=0;
	$filename=$filewin->get_filename();
	$filewin->destroy;
	open FILE, $filename or $error=1;
	if ($error == 1){
		&err_dialog("$filename could not get opened!");
	} else {
		$tmp="";
		while (<FILE>){
			$tmp.=$_;
		}
		close FILE;
		$tmp.="\n".$textbox->get_chars(0,-1);
		$textbox->set_point(0);
		$textbox->forward_delete($textbox->get_length);
		$textbox->insert('','','',"$tmp");
	}
	return 1;
}

sub init_msg_window {
	my ($vbox, $toolbar, $tb_item1, $tb_item2, $tb_item3, $tb_item4, $tb_item5, $hbox1, $hbox5, $scrollwin, $scrollbar, $window, $bg, $accel_group, $msg_window, $i, @entry, $textbox, $from_combo, @poplist,@msgbody, $from_label, $msglbl, @frmlabels, $sql, $query, @row, $default, $sigid, $pgp_hbox, $pgp_enc_togg, $pgp_sign_tog, $pgp_keycheck_tog, $width, $height, $spell_window);
	my @fields = ("","","");
	my ($widget, $data, $fildref, $msgid, $actid, $forrep) = @_;
	if ($fildref) { @fields = @$fildref; }
	my (@attachments);
	my ($rcptcheck,$optbox,$priocombo);
	my @priolist=("1 (Highest)","2 (High)","3 (Normal)","4 (Low)","5 (Lowest)");
	my $priodefault="3 (Normal)";
	my ($notebook, $nbox1, $nbox2);
	my ($smenu, $sm_message, $smm_menu, $sm_options, $smo_menu, $sm_sep, $sm_help, $hmm_help);
 
	$sql = "select descr, def,id from accounts";
	$query=$conn->prepare($sql);
	$query->execute();
	$i = 0;
	while (@row=$query->fetchrow_array()) {
		$poplist[$i] = $row[0];
		if (($row[1] eq "y") and (!$actid)) {
			$default = $row[0];
			$sigid = $row[2];
		}
		if (($actid) and ($row[2] == $actid)) {
			$default = $row[0];
			$sigid = $row[2];
		}
		$i++;
	}

	$msg_window = new Gtk::Window("toplevel");
	$msg_window->position(-mouse);
	$msg_window->set_title('Compose Message');
	$msg_window->signal_connect("delete_event" => 
		sub {
			if(defined $spell_window) {
				$spell_window->destroy;
				undef $spell_window;
			}
			Gtk::false;
		});
        ($width,$height) = get_win_size("MsgWinstartUp",500,540);
       	$msg_window->set_default_size($width,$height);
	$msg_window->set_policy(1,1,0);
	$msg_window->show;
	$msg_window->{'folder'} = 2;
	$accel_group = new Gtk::AccelGroup;
	$msg_window->add_accel_group($accel_group);
	$window = $msg_window->window;
	$bg = $msg_window->style->bg('normal');
	$vbox = new Gtk::VBox('0','0');
	$vbox->show;
	$msg_window->add($vbox);
	## the toolbar
	my $handlebox = new Gtk::HandleBox;
	$toolbar = new Gtk::Toolbar('horizontal','both');
	$toolbar->set_button_relief('none');
	$toolbar->set_tooltips('1');
	$toolbar->border_width('2');
	$handlebox->add($toolbar);
	## the send menubar
	$smenu=new Gtk::MenuBar;
	$smenu->show;
	## the Message Menu
	my ($smm_send, $smm_draft, $smm_spell, $smm_cancel, $smm_insert);
	$sm_message=new Gtk::MenuItem('Message');
	$sm_message->show;
	$smenu->append($sm_message);
	$smm_menu=new Gtk::Menu;
	$smm_insert= new Gtk::MenuItem('Insert from file...');
	$smm_insert->show;
	$smm_menu->append($smm_insert);
	$sm_sep=new Gtk::MenuItem;
	$sm_sep->show();
	$smm_menu->append($sm_sep);
	$smm_send=new Gtk::MenuItem('Send');
	$accel_group->add( 0x073, "mod1-mask" ,['visible'], $smm_send, "activate"); 
	$smm_send->show();
	$smm_menu->append($smm_send);
	$smm_draft=new Gtk::MenuItem('Save as Draft');
	$smm_draft->show();
	$smm_draft->signal_connect('activate' => sub { $msg_window->{'folder'} = 5; &send_message(undef, $msg_window, $msgid, $forrep); });
	$smm_menu->append($smm_draft);
	$smm_spell=new Gtk::MenuItem('Spelling');
	$smm_spell->signal_connect('activate', \&spellcheck,$msg_window,\$spell_window,$sigid,'n');
	$smm_spell->show();
	$accel_group->add(  0xFFC4, "release-mask" ,['visible'], $smm_spell, "activate");
	$smm_menu->append($smm_spell);
	$sm_sep=new Gtk::MenuItem;
	$sm_sep->show();
	$smm_menu->append($sm_sep);
	$smm_cancel=new Gtk::MenuItem('Cancel');
	$accel_group->add( 0x063, "control-mask" ,['visible'], $smm_cancel, "activate"); 
	$smm_cancel->show();
	$smm_menu->append($smm_cancel);
	$sm_message->set_submenu($smm_menu);
	if (defined $ONETIME && $ONETIME == 1) { $smm_cancel->signal_connect('activate'=> sub { $msg_window->destroy; Gtk->exit(0);});}
	$smm_cancel->signal_connect('activate'=> sub {$msg_window->destroy;});
	 
	## the options menu
	my ($smo_receipt, $smo_prio, $smo_encrypt, $smoe_menu, $smop_menu);
	$sm_options=new Gtk::MenuItem('Options');
	$sm_options->show;
	$smenu->append($sm_options);
	$smo_menu=new Gtk::Menu;
	$msg_window->{'receiptCheck'}=new Gtk::CheckMenuItem('Return-Receipt');
	$msg_window->{'receiptCheck'}->set_show_toggle('1');
	$msg_window->{'receiptCheck'}->show();
	$smo_menu->append($msg_window->{'receiptCheck'});
	$smo_prio=new Gtk::MenuItem('Priority');
	$smo_prio->show();
	$smo_menu->append($smo_prio);
	## the priority sub
	my ($smop_1, $smop_2, $smop_3, $smop_4, $smop_5);
	$smop_menu=new Gtk::Menu;			 
	$msg_window->{'priorityRadio'}[0]=new Gtk::RadioMenuItem($priolist[0]);
	$msg_window->{'priorityRadio'}[0]->show;
	$smop_menu->append($msg_window->{'priorityRadio'}[0]);
	$msg_window->{'priorityRadio'}[1]=new Gtk::RadioMenuItem($priolist[1],$msg_window->{'priorityRadio'}[0]);
	$msg_window->{'priorityRadio'}[1]->show;
	$smop_menu->append($msg_window->{'priorityRadio'}[1]);
	$msg_window->{'priorityRadio'}[2]=new Gtk::RadioMenuItem($priolist[2],$msg_window->{'priorityRadio'}[0]);
	$msg_window->{'priorityRadio'}[2]->set_active(1);
	$msg_window->{'priorityRadio'}[2]->show;
	$smop_menu->append($msg_window->{'priorityRadio'}[2]);
	$msg_window->{'priorityRadio'}[3]=new Gtk::RadioMenuItem($priolist[3],$msg_window->{'priorityRadio'}[0]);
	$msg_window->{'priorityRadio'}[3]->show;
	$smop_menu->append($msg_window->{'priorityRadio'}[3]);
	$msg_window->{'priorityRadio'}[4]=new Gtk::RadioMenuItem($priolist[4],$msg_window->{'priorityRadio'}[0]);
	$msg_window->{'priorityRadio'}[4]->show;
	$smop_menu->append($msg_window->{'priorityRadio'}[4]);
	$smo_prio->set_submenu($smop_menu);
	$sm_sep=new Gtk::MenuItem;
	$sm_sep->show();
	$smo_menu->append($sm_sep);
	$smo_encrypt=new Gtk::MenuItem('Encryption');
	$smo_encrypt->show();
	$smo_menu->append($smo_encrypt);
	## the encription sub
	my ($smoe_encrypt, $smoe_sign, $smoe_keycheck);
	$smoe_menu=new Gtk::Menu;
	$msg_window->{'encryptCheck'}=new Gtk::CheckMenuItem("Encrypt");
	$msg_window->{'encryptCheck'}->set_show_toggle('1');
	if ($prefs{'Encrypt'}) {$msg_window->{'encryptCheck'}->set_active(1);}
	$msg_window->{'encryptCheck'}->show();
	$smoe_menu->append($msg_window->{'encryptCheck'});
	$msg_window->{'signCheck'}=new Gtk::CheckMenuItem("Sign");
	$msg_window->{'signCheck'}->set_show_toggle('1');
	if ($prefs{'Sign'}) {$msg_window->{'signCheck'}->set_active(1);}
	$msg_window->{'signCheck'}->show();
	$smoe_menu->append($msg_window->{'signCheck'});
	$smoe_keycheck=new Gtk::MenuItem("Key check");
	$smoe_keycheck->signal_connect('activate', \&keyserver_search_window);
	$smoe_keycheck->show();
	$smoe_menu->append($smoe_keycheck);
	$smo_encrypt->set_submenu($smoe_menu);
	$sm_options->set_submenu($smo_menu);
	## the help menu
	$sm_help=new Gtk::MenuItem('Help');
	$sm_help->show;
	$smenu->append($sm_help);
	my $smh_menu=new Gtk::Menu;
	$hmm_help=new Gtk::MenuItem('Help');
	$accel_group->add( 0xFFBE, "release-mask" ,['visible'], $hmm_help, "activate"); 
	$hmm_help->show();
	$sm_help->set_submenu($smh_menu);
	$smh_menu->append($hmm_help);
	 
	$vbox->pack_start($smenu,0,0,0);
        $toolbar->show;
	$handlebox->show;
	$vbox->pack_start($handlebox,0,0,0);

	$tb_item1 = $toolbar->append_item("Send","Click here to send this message", "",new_pixmap("$prefs{'PixmapDir'}/tb_send.xpm", $window, $bg));
	$tb_item2 = $toolbar->append_item("Spelling","Click here to spell-check this message", "",new_pixmap("$prefs{'PixmapDir'}/spellcheck.xpm", $window, $bg));
	$tb_item4 = $toolbar->append_item("Addressbook", "Click here to open the Addressbook", "",new_pixmap("$prefs{'PixmapDir'}/addressbook.xpm", $window, $bg));
	## notebook tab Mail
	$nbox1=new Gtk::VBox(0,0);
	$nbox1->show();
	$hbox1 = new Gtk::HBox(0,0);
	$hbox1->border_width('3');
	$hbox1->show;
	$from_label = new Gtk::Label('From:');
	$from_label->set_padding('5','5');
	$from_label->show;
	$hbox1->pack_start($from_label,0,0,0);
	$msg_window->{'fromCombo'} = new Gtk::Combo;
	$msg_window->{'fromCombo'}->set_case_sensitive('0');
	$msg_window->{'fromCombo'}->set_use_arrows('1');
	$msg_window->{'fromCombo'}->set_popdown_strings(@poplist);
	$msg_window->{'fromCombo'}->entry->set_text($default);
	$msg_window->{'fromCombo'}->show;
	$hbox1->pack_start( $msg_window->{'fromCombo'},1,1,0);
	$nbox1->pack_start($hbox1,0,0,0);
	@frmlabels = ("To:","Cc:","Subj:");
	my $tmp;
	$i=0;
	foreach $msglbl (@frmlabels) {
		my ($hbox, $label);
		$hbox = new Gtk::HBox(0,0);
		$hbox->border_width('3');
		$hbox->show;
		$label = new Gtk::Label($msglbl);
		$label->set_padding('5','5');
		$label->show;
		$hbox->pack_start($label,0,0,0);
		$tmp=$msglbl;
		$tmp=~s/://;
		$msg_window->{$tmp.'Entry'}= new Gtk::Entry;
		$msg_window->{$tmp.'Entry'}->set_text($fields[$i]);
		$msg_window->{$tmp.'Entry'}->set_editable('1');
		$msg_window->{$tmp.'Entry'}->signal_connect_after("key-press-event" => \&Gtk::false);
		$msg_window->{$tmp.'Entry'}->show;
		$hbox->pack_start($msg_window->{$tmp.'Entry'},1,1,0);
		$nbox1->pack_start($hbox,0,0,0);
		$i++;
	}
	my ($avbox,$ahbox,$abutbox,$abutton,$afilelist,$ahbox2, $afilewin);

	$avbox= new Gtk::VBox(0,0);
	$avbox->border_width(3);
	$avbox->show;
	$ahbox=new Gtk::HBox(0,5);
	$ahbox->show();
	$avbox->pack_start($ahbox, 1,1,0);
 
	$afilewin=new Gtk::ScrolledWindow(undef,undef); 
	$afilewin->set_policy('automatic','automatic');
	$ahbox->pack_start($afilewin, 1,1,0);
	$afilewin->can_focus(0);
	my @titles=("Filename","Size");
	$msg_window->{'attachClist'}=new_with_titles Gtk::CList(@titles);
	$msg_window->{'attachClist'}->set_selection_mode("single");
	$msg_window->{'attachClist'}->set_usize(50,50);
	$msg_window->{'attachClist'}->set_column_width(0,260);
	$afilewin->add($msg_window->{'attachClist'});
	$msg_window->{'attachClist'}->show();
	$afilewin->show();
 
	$abutbox = new Gtk::VButtonBox;
	$abutbox->set_usize(-1,32);
	$abutbox->set_layout_default('start');
	$ahbox->pack_start($abutbox, 0,1,5);

	$abutton = new_with_label Gtk::Button("Add...");
	$abutton->set_usize(50,-1);
	$abutton->signal_connect('clicked', \&selectAttachFile,$msg_window->{'attachClist'});
	$abutbox->add($abutton);
	$abutton->show;

	$abutton = new_with_label Gtk::Button("Delete");
	$abutton->set_usize(50,-1);
	$abutton->signal_connect('clicked', \&deleteAttachFile,$msg_window->{'attachClist'});
	$abutbox->add($abutton);
	$abutton->show;

	$abutton = new_with_label Gtk::Button("Clear All");
	$abutton->set_usize(50,-1);
	$abutton->signal_connect('clicked', \&clearAttachFile,$msg_window->{'attachClist'});
	$abutbox->add($abutton);
	$abutton->show;
	$abutbox->show;
	$abutbox->show;
 
	$notebook=new Gtk::Notebook;
	my $lbl1=new Gtk::Label("Mail");
	$lbl1->show;
	$notebook->append_page($nbox1,$lbl1);
	my $lbl2=new Gtk::Label("Attachments");
	$lbl2->show;
	$notebook->append_page($avbox,$lbl2);
	$notebook->show();

	$vbox->pack_start($notebook, 0,0,0);

	$msg_window->{'ToEntry'}->signal_connect('focus_out_event' => \&alias_expand, $msg_window->{'ToEntry'});
	$msg_window->{'CcEntry'}->signal_connect('focus_out_event' => \&alias_expand, $msg_window->{'CcEntry'});
	$msg_window->{'mailText'} = new Gtk::Text(undef,undef);
	$msg_window->{'mailText'}->set_word_wrap(1);
	$scrollbar = new Gtk::VScrollbar($msg_window->{'mailText'}->vadj);
	$scrollbar->show;
	$msg_window->{'mailText'}->set_editable('1');
	if ($msgid) {
		&view_message($conn, $msgid, $msg_window->{'mailText'}, 2, $forrep, undef, undef, undef, undef, $msg_window->{'attachClist'});
	}
	unless (defined $forrep && $forrep == 3) {
		if (($sigid) and (open(TMP, "<$prefs{'MailDir'}/sig/$sigid.sig"))) {
			my @sig = <TMP>;
			close(TMP);
			$msg_window->{'mailText'}->insert('','','',"\n-- \n");
			foreach (@sig) {
				$msg_window->{'mailText'}->insert('','','',"$_");
			}
			$msg_window->{'mailText'}->insert('','','',"\n");
		}
	}
	$msg_window->{'mailText'}->set_point(0);
	$msg_window->{'mailText'}->show;
	$hbox5 = new Gtk::HBox(0,0);
	$hbox5->border_width('3');
	$hbox5->pack_start($msg_window->{'mailText'},1,1,0);
	$hbox5->pack_start($scrollbar,0,0,0);
	$hbox5->show;
	$vbox->add($hbox5);
	if($prefs{'autospell'} eq 'y') {
		$tb_item1->signal_connect('clicked', \&spellcheck, $msg_window, \$spell_window, $sigid, 'y', $msgid, $forrep);
		$smm_send->signal_connect('activate', \&spellcheck, $msg_window, \$spell_window, $sigid, 'y', $msgid, $forrep);
	} else {
		$tb_item1->signal_connect('clicked', \&send_message, $msg_window, $msgid, $forrep);
		$smm_send->signal_connect('activate', \&send_message, $msg_window, $msgid, $forrep);
	}
	$smm_insert->signal_connect('activate', \&insertFromFileSelect, $msg_window );
	$tb_item2->signal_connect('clicked', \&spellcheck, $msg_window,\$spell_window,$sigid,'n');
	$data->{'to'} = $msg_window->{'ToEntry'};
	$data->{'cc'} = $msg_window->{'CcEntry'};
	$tb_item4->signal_connect('clicked', \&init_win, "address", $data);
 
	$msg_window->{'fromCombo'}->popwin->signal_connect("hide", \&switch_sig,  $msg_window->{'fromCombo'},  $msg_window->{'mailText'});
	$scrollbar->can_focus(0);
	$notebook->can_focus(0);
	$lbl1->can_focus(0);  
	$lbl2->can_focus(0);
	$msg_window->{'ToEntry'}->grab_focus;
 
	$msg_window->{'encryptCheck'}->signal_connect('toggled', \&toggle_enc);
	$msg_window->{'signCheck'}->signal_connect('toggled', \&toggle_sign);
	$toolbar->set_style($prefs{'toolbarstyle'});
	if ($prefs{'toolbar'} eq "n") { $handlebox->hide; }
	if (defined $ONETIME && $ONETIME == 1) { $msg_window->signal_connect("destroy", sub { $msg_window->destroy; Gtk->exit(0) });}
	$msg_window->signal_connect("destroy" => \&msg_window_destroy, $data);
	$msg_window->signal_connect("size-request" => \&save_win_size, "MsgWinstartUp", $msg_window->window);
	return 1;
}

sub msg_window_destroy {
 my ($window, $data) = @_;
 undef $data->{'to'};
 undef $data->{'cc'};
 $window->destroy;
}

sub alias_expand {
	my ($widget, $entry, $event) = @_;
	my ($text, @fields, $sql, $query, @row, %alias, $check);
	$text = $entry->get_text();
	$sql = "select alias, address from addresses";
	$query = $conn->prepare($sql);
	$query->execute();
	while (@row = $query->fetchrow_array()) {
		$alias{$row[0]}=$row[1];
	}
	@fields = quotewords(", ", 1, $text);
	foreach (@fields) {
		if (defined $_) {
			if (!/.+\@.+\.+./) {  # didn't see anything that looks like an address
				foreach $check (keys(%alias)) {
					if (($check =~ /\b\Q$_\E/i) or ($alias{$check} =~ /\b\Q$_\E/i)) {
						$_ = "\"$check\" <$alias{$check}>";
						last;
					}
				}
			}
		} else {
			pop @fields;
		}
	}
	$text = join ', ', @fields;
	$entry->set_text($text);   
	return 1; 
}

sub toggle_enc {
 if ($prefs{'Encrypt'}) {
  $prefs{'Encrypt'} = 0;
 } else {
  $prefs{'Encrypt'} = 1;
 }
 save_prefs();
}

sub toggle_sign {
 if ($prefs{'Sign'}) {
  $prefs{'Sign'} = 0;
 } else {
  $prefs{'Sign'} = 1;
 }
 save_prefs();
}

sub switch_sig {
 my ($widget, $from_combo, $textbox) = @_;
 my ($friendly, $sql, $query, @row, @sig, $sigid, $body);
 $body = $textbox->get_chars(0,-1);
 $textbox->freeze;
 $textbox->set_point(length($body));
 $textbox->backward_delete(length($body));
 $body =~ s/\n-- \n.*//s;
 $textbox->insert('','','',$body);
 $friendly = $from_combo->entry->get_text();
 $sql = "select id from accounts where descr=?";
 $query=$conn->prepare($sql);
 $query->execute($friendly);
 @row = $query->fetchrow_array();
 $sigid = $row[0];
 if (open(TMP,"<$prefs{'MailDir'}/sig/$sigid.sig")) {
  @sig = <TMP>;
  close(TMP);
  $textbox->insert('','','',"\n-- \n");
  foreach (@sig) {
   $textbox->insert('','','',$_);
  }
  $textbox->insert('','','',"\n");
 }
 $textbox->thaw;
 return 1;
}

sub delete_item {
 my ($widget, $clist) = @_;
 my (@selection, $id, $sql, $query, @row, $flag);
 $flag = $clist->{'name'};
 if (@selection = $clist->selection) {
  $id = ${$clist->get_row_data($selection[0]);}} else { &err_dialog("Select an entry to delete!"); return 1;}
  if ($flag eq "account") {
   $sql = "delete from accounts where id=$id";
   $acct_menu_items{$id}->destroy;
   delete $acct_menu_items{$id};
   $acct_menu2_items{$id}->destroy;
   delete $acct_menu2_items{$id};
  } elsif ($flag eq "filter") {
   $sql = "delete from filters where id=$id";
  } elsif ($flag eq "address") {
   $sql = "delete from addresses where id=$id";
  } elsif ($flag eq "mimetypes") {
   $sql = "delete from mimetypes where id=$id";
  }
  $conn->do($sql);
  &clist_refresh($clist);
 }


sub edit_account {
 my ($widget, $acct_clist, $row) = @_;
 my (@selection, $acctid, $sql, $query, @entry, @cbox, $count, $i, @sig);
 if (not defined $row) {
  if (@selection = $acct_clist->selection) {
   $row = $selection[0];
  } else { 
      return 1; 
  }
 }
 $acctid = ${$acct_clist->get_row_data($row)};
 $sql = "select descr, friendly, smtp, pop, pport, reply, uname, pass, type
         from accounts where id=?";
 $query=$conn->prepare($sql);
 $query->execute($acctid);
 @entry=$query->fetchrow_array();
 $sql = "select include, dm, def, dupecheck
         from accounts where id=?";
 $query=$conn->prepare($sql);
 $query->execute($acctid);
 @cbox=$query->fetchrow_array();
 for ($i = 0; $i < 4; $i++) {
  if (!$cbox[$i] || $cbox[$i] eq "n") { $cbox[$i] = 0;}
  if ($cbox[$i] eq "y") { $cbox[$i] = 1; }
 }
 if (open(TMP, "<$prefs{'MailDir'}/sig/$acctid.sig")) {
  @sig = <TMP>;
  close(TMP);
 }
 &acct_editwin(0,"edit", $acctid, $acct_clist, \@entry, \@cbox, \@sig);
 return 1;
}

sub init_win {
	my ($widget, $flag, $data) = @_;
	my $winName=$flag."Win";
	if ((defined $data->{'winopen'}) and ($data->{'winopen'} == 1)) {
		return 1;
	}
	$data->{'winopen'} = 1;
	my ($win, $vbox, $hbox, $hbox2, $edit_but, $del_but, $ok_but, $new_but, $scroll, $clist, @headers);
	if ($flag eq "account") {
		(@headers)=("Description","Name","Server","Address","Include?","Delete?","Default?", "Check dupes?");
	} elsif ($flag eq "address") {
		(@headers)=("Alias","Address","Public Key");
	} elsif ($flag eq "filter") {
		(@headers)=("Name","Type","Folder","Expression","Address");
	} elsif ($flag eq "mimetypes") {
		(@headers)=("Mime","Command","Pixmap");
	}
	$win = new Gtk::Window("toplevel");
	$win->signal_connect("delete_event" => \&Gtk::false);
	my($width,$height)=get_win_size($winName,500,150);
	$win->set_default_size($width,$height);
	$win->set_policy(1,1,0);
	$win->show;
	$vbox = new Gtk::VBox(0,0);
	$vbox->show;
	$win->add($vbox);
	$clist = new_with_titles Gtk::CList(@headers);
	@{$clist->{'labels'}} = @headers;
	if ($flag ne "filter") {
		$clist->{'sortcol'} = 0;
		$clist->{'sortdir'} = "descending";
		$clist->signal_connect('click_column', \&click_column);
	}
	$clist->{'name'} = $flag;
	$clist->set_compare_func(\&clist_sort);
	$clist->signal_connect('button_press_event', \&click_clist, $data);
	&clist_refresh($clist);
	$clist->show;
	$clist->{'popup'} = new Gtk::Menu;
	if ($flag eq "address") {
		$clist->{'popup'}->{'sep2'} = new Gtk::MenuItem;
		$clist->{'popup'}->{'sep2'}->show;
		$clist->{'popup'}->append($clist->{'popup'}->{'sep2'});
		$clist->{'popup'}->{'to'} = new Gtk::MenuItem("Add to To");
		$clist->{'popup'}->{'to'}->show;
		$clist->{'popup'}->append($clist->{'popup'}->{'to'});
		$clist->{'popup'}->{'to'}->signal_connect("activate" => \&add_to_field, $clist, "to", $data);
		$clist->{'popup'}->{'cc'} = new Gtk::MenuItem("Add to CC");
		$clist->{'popup'}->{'cc'}->show;
		$clist->{'popup'}->append($clist->{'popup'}->{'cc'});
		$clist->{'popup'}->{'cc'}->signal_connect("activate" => \&add_to_field, $clist, "cc", $data);
	}
	$clist->{'popup'}->{'sep1'} = new Gtk::MenuItem;
	$clist->{'popup'}->{'sep1'}->show;
	$clist->{'popup'}->append($clist->{'popup'}->{'sep1'});
	$clist->{'popup'}->{'edit'} = new Gtk::MenuItem("Edit");
	$clist->{'popup'}->{'edit'}->show;
	$clist->{'popup'}->append($clist->{'popup'}->{'edit'});
	$clist->{'popup'}->{'delete'} = new Gtk::MenuItem("Delete");
	$clist->{'popup'}->{'delete'}->show;
	$clist->{'popup'}->append($clist->{'popup'}->{'delete'});
	$clist->{'popup'}->{'delete'}->signal_connect("activate", \&delete_item, $clist);
	$scroll = new Gtk::ScrolledWindow(undef,undef);
	$scroll->set_policy('automatic','automatic');
	$scroll->show;
	$scroll->add($clist);
	$vbox->pack_start($scroll,1,1,0);
	$hbox = new Gtk::HBox(0,0);
	$hbox->border_width('5');
	$hbox->show;
	$new_but = new Gtk::Button("New");
	$new_but->show;
	$new_but->set_usize(55,25);
	$hbox->pack_start($new_but,1,0,0);
	$edit_but = new Gtk::Button("Edit");
	$edit_but->show;
	$edit_but->set_usize(55,25);
	$hbox->pack_start($edit_but,1,0,0);
	$del_but = new Gtk::Button("Delete");
	$del_but->show;
	$del_but->set_usize(55,25);
	$hbox->pack_start($del_but,1,0,0);
	$ok_but = new Gtk::Button("Close");
	$ok_but->show;
	$ok_but->set_usize(55,25);
	$hbox->pack_start($ok_but,1,0,0);
	$vbox->pack_start($hbox,0,1,0);
	$del_but->signal_connect("clicked", \&delete_item, $clist);
	if ($flag eq "account") {
		$clist->set_column_width(0,75);
		$clist->set_column_width(1,75);
		$clist->set_column_width(2,75);
		$clist->set_column_width(3,125);
		$new_but->signal_connect("clicked", \&acct_editwin, "new", 0, $clist);
		$edit_but->signal_connect("clicked", \&edit_account, $clist);
		$clist->{'popup'}->{'edit'}->signal_connect("activate", \&edit_account, $clist);
		$win->set_title("Account List");
	} elsif ($flag eq "address") {
		$win->set_title("Address Book");
		$clist->set_column_width(0,150);
		$clist->set_column_width(1,150);
		$clist->set_column_width(2,150);
		$new_but->signal_connect("clicked", \&address_editwin, $clist, "new");
		$edit_but->signal_connect("clicked", \&address_editwin, $clist, "edit");
		$clist->{'popup'}->{'edit'}->signal_connect("activate", \&address_editwin, $clist, "edit");
	} elsif ($flag eq "filter") {
		$win->set_title("Filter List");
		$clist->set_column_width(0,100);
		$clist->set_column_width(1,100);
		$clist->set_column_width(2,75);
		$clist->set_column_width(3,100);
		$new_but->signal_connect("clicked", \&filter_editwin, $clist, "new");
		$edit_but->signal_connect("clicked", \&filter_editwin, $clist, "edit");
		$clist->{'popup'}->{'edit'}->signal_connect("activate",\&filter_editwin, $clist, "edit");
		$clist->set_reorderable(1);
		$clist->signal_connect("row_move", \&filter_reorder);
	} elsif ($flag eq "mimetypes") {
		$win->set_title("Mimetypes List");
		$clist->set_column_width(0,100);
                $clist->set_column_width(1,100);
                $clist->set_column_width(1,100);
		$new_but->signal_connect("clicked", \&mime_editwin, $clist, "new");
		$edit_but->signal_connect("clicked", \&mime_editwin, $clist, "edit");
		$clist->{'popup'}->{'edit'}->signal_connect("activate", \&mime_editwin, $clist, "edit");
	}
	if ($flag ne "filter") { &click_column($clist, $clist->{'sortcol'}); }
	$ok_but->signal_connect("clicked" => \&dest_win, $win, $data);
	$win->signal_connect("destroy" => \&dest_win, $win, $data);
	$win->signal_connect("size-request" => \&save_win_size, $winName, $win->window);
	return 1;
}

sub filter_reorder {
	my ($clist, $oldpos, $newpos) = @_;

	return 1;
}

sub dest_win {
	my ($widget, $win, $data) = @_;
	if (defined $data->{'winopen'}) {
		undef $data->{'winopen'};
	}
	$win->destroy;
}

sub add_to_field {
 my ($widget, $clist, $field, $data, $row) = @_;
 my ($entry, @selection, $id, $sql, $query, $alias, $address,
     $string, $oldval, @fields);
 if (not defined $row) {
  @selection = $clist->selection();
  $row = $selection[0];
 }
 $id = ${$clist->get_row_data($row)};
 $sql = "select alias, address from addresses where id = ?";
 $query = $conn->prepare($sql);
 $query->execute($id);
 ($alias, $address) = ($query->fetchrow_array());
 $string = "\"$alias\" <$address>";
 if (defined $data->{"$field"}) {
  $oldval = $data->{"$field"}->get_text();
  if ((defined $oldval) and ($oldval ne "")) {
   $string = $oldval . ", " . $string;
  }
  $data->{"$field"}->set_text($string);
 } else {
  if ($field eq "to") {
   $fields[0] = $string;
   $fields[1] = "";
  } else {
   $fields[0] = "";
   $fields[1] = $string;
  }
  $fields[2] = "";
  &init_msg_window(0, $data, \@fields);
 }
 return 1;
}

sub init_fs_window {
  my ($widget, $filename, $source) = @_;
  if (!$filename) { $filename=""; }
  my ($fs_window);
  $fs_window = new Gtk::FileSelection "Save File...";
  $fs_window->position(-mouse);
  $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
  $fs_window->signal_connect("delete_event" => \&Gtk::false);
  $fs_window->ok_button->signal_connect("clicked", \&file_selection_ok, $fs_window, $source);
  $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
  $fs_window->set_filename($filename);
  $fs_window->show;
  return 1;
}

sub view_attachment {
  my ($widget, $source, $type, $use_db) = @_;
  my($window,$vbox,$type_entry,$command_entry,$icon_entry,$button,$button2,$hbox,$label,$sql,$query,@row,@command);
  if($use_db eq 'y') {
  	$sql = "select id,mime,command,icon from mimetypes where mime=?";
  	$query = $conn->prepare($sql);
  	$query->execute($type);
  	if(@row=$query->fetchrow_array) {
    		@command = split(/ /,$row[2]); 
		if(-f $command[0]) {
			my $child;
			$row[2] =~ s/\%f/$source/g;
        		unless ($child = fork) {
  				die "cannot fork: $~" unless defined $child;
       				exec($row[2]);
        		}
		}
		else {
			&err_dialog("You must specify an executalbe that exists for $row[1]");
		}
		return 1;
  	}
  }
  $window = new Gtk::Window("toplevel");
  $window->set_position("mouse");
  $window->set_title("View Attachment");
  $window->set_default_size('130','80');
  $window->signal_connect("destroy" => sub{$window->destroy;});
  $window->signal_connect("delete_event" => \&Gtk::false);
  $vbox = new Gtk::VBox(1,1);
  $window->add($vbox);
  $vbox->show;
  $hbox = new Gtk::HBox(0,0);
  $vbox->pack_start($hbox,0,0,0);
  $hbox->show;
  $label = new Gtk::Label("Mime-Type:");
  $hbox->pack_start($label,0,0,0);
  $label->show;
  $type_entry = new Gtk::Entry();
  $type_entry->set_text($type);
  $hbox->pack_start($type_entry,0,0,0);
  $type_entry->show;
  $hbox = new Gtk::HBox(0,0);
  $vbox->pack_start($hbox,0,0,0);
  $hbox->show;
  $label = new Gtk::Label("Command:");
  $hbox->pack_start($label,0,0,0);
  $label->show;
  $command_entry = new Gtk::Entry();
  $hbox->pack_start($command_entry,0,0,0);
  $command_entry->show;
  $button=new Gtk::Button("Browse");
  $button->signal_connect("clicked" => \&init_browse_dlg, $command_entry, "attachment_command");
  $button->set_usize(55,25);
  $hbox->pack_start($button,0,0,0);
  $button->show;
  if($use_db eq 'y') {
  	$hbox = new Gtk::HBox(0,0);
  	$vbox->pack_start($hbox,0,0,0);
	$hbox->show;
        $label = new Gtk::Label("Icon:");
        $hbox->pack_start($label,0,0,0);
        $label->show;
        $icon_entry = new Gtk::Entry();
        $hbox->pack_start($icon_entry,0,0,0);
        $icon_entry->show;
        $button=new Gtk::Button("Browse");
        $button->signal_connect("clicked" => \&init_browse_dlg, $icon_entry, "attachment_icon");
        $button->set_usize(55,25);
        $hbox->pack_start($button,0,0,0);
  	$button->show;
  }
  $button = new Gtk::Button("Execute");
  $button->signal_connect('clicked' =>
        sub {
	      my $command = $command_entry->get_text();
	      @command = split(/ /,$command);
              if(-f $command[0]) {
			if($use_db eq 'y') {
				my $id = &newid("mimetypes",$conn);
				$sql = "insert into mimetypes (id,mime,command,icon)
					values (?,?,?,?)";
				$query = $conn->prepare($sql);
				$query->execute($id,$type,$command_entry->get_text(),$icon_entry->get_text());
			}
	               	$command =~ s/\%f/$source/g;
			my $child;
	               	unless ($child = fork) {
	                       	die "cannot fork: $~" unless defined $child;
	                       	exec("$command");
	               	}
	               	$window->destroy;
		}
        });
  $vbox->pack_start($button,0,0,0);
  $button->show;
  $window->show;
  return 1;
}


sub file_selection_ok {
 my ($widget, $fs_window, $file) = @_;
 my ($filename);
 $filename = $fs_window->get_filename();
 $fs_window->destroy;
 copy($file,$filename);
 return 1;
}
 
sub save_message_as {
 my (@selection, $msgid, $filename,);
 @selection = $message_clist->selection;
 if (!@selection) {
     &err_dialog("Select the message You want to save!");
     return 1; 
 }
 $msgid = ${$message_clist->get_row_data($selection[0])};
 $filename = "message$msgid.txt";
 my $tmp = filename_to_tree("$prefs{'MailDir'}/$msgid");
 &init_fs_window(undef, $filename, $tmp);
 return 1;
}

sub print_message {

my ($flag) = @_;
my (@selection, $msgid, $child, $forrep, $sql, $query, $print, $printed);
$forrep = 4;

@selection = $message_clist->selection;

if (!@selection) {
    &err_dialog("Select the message You want to print!"); return 1;}

$msgid = ${$message_clist->get_row_data($selection[0])};
$sql = "select contenttype from messages where id = $msgid";
$query = $conn->prepare($sql);
$query->execute();
my ($type) = ($query->fetchrow_array());
if ($type =~/html/) { &err_dialog("Can't print HTML Messages yet"); return 1;}

if ($flag eq "withheader") { 

$print->{'format'} = new Gtk::Text;
my $header = &view_message($conn, $msgid, $print->{'format'}, 4, $forrep, undef, undef, undef, undef, undef, "n");
my $body = &view_message($conn, $msgid, $print->{'format'}, 2, $forrep, undef, undef, undef, undef, undef, "n");
$printed = $print->{'format'}->get_chars(0, -1);
                            
			    }

elsif ($flag eq "body") {

$print->{'format'} = new Gtk::Text;
my $body = &view_message($conn, $msgid, $print->{'format'}, 2, $forrep, undef, undef, undef, undef, undef, "y");
$printed = $print->{'format'}->get_chars(0, -1);

                    }
		    
open (TMP, ">$prefs{'MailDir'}/tmp/printed$msgid");
print TMP "$printed";
close TMP;
#print "$printed";

unless ($child = fork) { die "cannot fork: $~" unless defined $child;
exec("$prefs{'PrintCommand'} $prefs{'MailDir'}/tmp/printed$msgid");
                      }
return 1;
}

sub mark_as_read {
	my (@selection, $msgid, $sql, $query);
	@selection = $message_clist->selection;

	if (!@selection) {
		&err_dialog("Select the message You want to Mark as Read!");
		return 1;
	}
	foreach (@selection) { 
		$msgid = ${$message_clist->get_row_data($_)};
	       	$sql = "update messages set newmsg = 'n' where id = $msgid";
		$query=$conn->prepare($sql);
		$query->execute();
	}
	&refresh_messages;
	&refresh_folder_menus;
	return 1;
}
	

sub init_about_dlg {
 my
($about_win,$window,$bg,$tbox,$vbox,$hbox,$sep,$butbox,$button,$pixmap);

 $about_win = new Gtk::Window("dialog");
 $about_win->set_title("About CSCMail");
 $about_win->signal_connect("destroy" => sub { $about_win->destroy; });
 $about_win->signal_connect("delete_event" => \&Gtk::false);
 $about_win->set_default_size('350','350');
 $about_win->set_policy(1,1,0);
 $about_win->show;
 $window = $about_win->window;
 $bg = $about_win->style->bg('normal');
 $vbox= new Gtk::VBox(0,0);
 $about_win->add($vbox);
 $vbox->show;
 $pixmap = new_pixmap("$prefs{'PixmapDir'}/about.xpm", $window, $bg);  
 $pixmap->show;
 $vbox->pack_start($pixmap,1,1,1);
    $tbox = new Gtk::Label("CSCMail $version\n\nCSCMail is a powerful and
highly modularized mail client written completely in perl
by Steven Kordik <countzero\@cyberdeck.org>
Other development team members include:
Muhri <muhri\@muhri.net>
Noidd <red\@madhouse.org.uk>
Flavio <fcu\@no-way.org>
and CmdrTaco <malda\@slashdot.org>
for more info:");
 $vbox->pack_start($tbox,1,1,1);
      $tbox->show;
   
    $hbox = new Gtk::HBox(0,0);   
    $vbox->pack_start($hbox,0,0,0);
    $hbox->show;
    my $cyberdeck = new Gtk::Button("Visit the Cyberdeck");
    $cyberdeck->signal_connect("clicked", => \&cyberdeck);
    $hbox->pack_start($cyberdeck,1,0,0);
    $cyberdeck->show;
 $sep = new Gtk::HSeparator;
   $sep->set_usize(-1,5);
    $vbox->pack_start($sep,0,1,0);
     $sep->show;
    
     $butbox = new Gtk::HButtonBox;
     $butbox->set_usize(-1,32);
     $vbox->pack_start($butbox, 0,1,0); 
     $butbox->show;  
 $button = new_with_label Gtk::Button("OK");
     $button->set_usize(50,-1);
     $button->signal_connect('clicked', sub { $about_win->destroy; });
                     $button->can_default(1);
                                     $button->grab_default;
                                     $butbox->add($button);
                                     $button->show;
     
  return 1;
}    
     
sub cyberdeck {
     
    my $url = "http://cyberdeck.org/cscmail";
    if ($HTMLWIDGET eq "XmHTML" or $prefs{'useAlternateViewer'} eq "y") {
                                     
    my $cmd = $prefs{'ViewerPath'} . " -remote 'OpenURL($url,new_window)'";
    my $bug = system($cmd);
    if ($bug != 0) {
  my ($child);
    unless ($child = fork) {
    die "cannot fork: $~" unless defined $child;
    exec($prefs{'ViewerPath'}." $url");}
    }
    return 1;
}                                    
    
&init_webbrowser($url);
}

sub spellcheck {
 my ($window,$msg_window,$spell_window,$sigid,$autospell,$msgid,$forrep) = @_;
 my ($textbox,$body,@spell_list,$vbox,$tbox,$bg,$butbox,$ok_button,$combo,$i,$sum,$replace_button,$last_combo_connect,$next_button,$add_button,$last_add_connect);
 if(defined $$spell_window) {
	return 1;
 }
 $textbox=$msg_window->{'mailText'};
 if(-f $prefs{'ispellpath'}) {
 	$Lingua::Ispell::path = $prefs{'ispellpath'};
 }
 else {
	&err_dialog("The path to ispell or aspell is not set correctly");
	return 1;
 }
 exec_ispell($textbox,\@spell_list,$sigid,\$sum);
 if(($sum == 0) && ($autospell eq 'y')) {
	send_message($msg_window,$msg_window,$msgid,$forrep);
	return 1;
 }
 $i = 0;
 $$spell_window = new Gtk::Window("toplevel");
 $$spell_window->set_position("mouse");
 $$spell_window->set_title("Spell Check");
 $$spell_window->signal_connect("destroy" => 
	sub { 
		$$spell_window->destroy;
		undef $$spell_window;
	 });
 $$spell_window->signal_connect("delete_event" => \&Gtk::false);
 $$spell_window->set_default_size('180','130');
 $$spell_window->set_policy(1,1,0);
 $$spell_window->show;
 $window = $$spell_window->window;
 $vbox = new Gtk::VBox(0,0);
 $$spell_window->add($vbox);
 $vbox->show;
 $tbox = new Gtk::Label("");
 $vbox->pack_start($tbox,1,1,1);
 $tbox->show;
 $combo = new Gtk::Combo();
 $vbox->pack_start($combo,1,1,1);
 $combo->hide;
 $replace_button = new Gtk::Button("Replace");
 $vbox->pack_start($replace_button,1,1,1);
 $replace_button->hide;
 $add_button = new Gtk::Button("Add to Dictionary");
 $vbox->pack_start($add_button,1,1,1);
 $add_button->hide;
 $butbox = new Gtk::HButtonBox;
 $butbox->show;
 $vbox->pack_start($butbox,1,1,1);
 if($autospell eq 'y') {
	$ok_button = new_with_label Gtk::Button("Send");
 }
 else {
 	$ok_button = new_with_label Gtk::Button("OK");
 }
 $ok_button->set_usize(50,-1);
 $ok_button->signal_connect('clicked', 
	sub { 
		$$spell_window->destroy;
		if($autospell eq 'y') {
			send_message($msg_window,$msg_window,$msgid,$forrep);
		}
	    });
 $ok_button->can_default(1);
 $ok_button->grab_default;
 $next_button = new_with_label Gtk::Button("Next");
 $next_button->set_usize(50,-1);
 $next_button->signal_connect('clicked',
        sub {
		if((++$i == $sum) && (0 != $sum)) {
			$i=-1;
			$tbox->set_text("End of Message\nPress Next to\nGo Back to Top");
			$replace_button->hide;
			$combo->hide;
			$add_button->hide;
			exec_ispell($textbox,\@spell_list,$sigid,\$sum);
		}
		else {
                	spellcheck_next($textbox,$spell_list[$i],$tbox,$combo,$replace_button,$add_button,$i,$sum,\$last_combo_connect,\$last_add_connect,$next_button);
		}
        });
 $next_button->can_default(1);
 $next_button->grab_default;
 $butbox->add($next_button);
 $next_button->show;
 $butbox->add($ok_button);
 $ok_button->show;
 spellcheck_next($textbox,$spell_list[$i],$tbox,$combo,$replace_button,$add_button,$i,$sum,\$last_combo_connect,\$last_add_connect,$next_button);
 return 1;
}

sub spellcheck_next {
 my($textbox, $r, $tbox, $combo, $replace_button, $add_button, $i, $sum, $last_combo_connect,$last_add_connect,$next_button) = @_;
 my($body,$end,$start,$word_num,$miss,$misses,$array,$j);
 $word_num = $i+1;
 $misses ="";
 if($sum==0) {
        $tbox->set_text("Found No Mispelled Words");
	$next_button->hide;
	$combo->hide;
	$replace_button->hide;
	$add_button->hide;
 }
 if(defined $r) {
   $array = $r->{'misses'};
   $j=0;
   $body = $textbox->get_chars(0,-1);
   $body =~ s/\n/ /g;
   $body =~ s/_/ /g;
   $body =~ s/[0-9]/ /g;
   if($body =~ m/\b$r->{'term'}\b/g) {
        $end = pos $body;
        $start = $end - length($r->{'term'});
        if (!$array) { 
		$tbox->set_text("$word_num of $sum [$r->{'term'}]\n was not found in dictionary"); 
		$replace_button->hide; 
		$combo->hide; 
	} 
	else {
		$tbox->set_text("$word_num of $sum Mispelled Words\nSuggestions:");
        	$combo->set_popdown_strings(@$array);
        	$replace_button->show;
		$combo->show; 
	}	
        if(defined $$last_combo_connect) {
                $replace_button->signal_disconnect($$last_combo_connect);
        }
        $$last_combo_connect=$replace_button->signal_connect('clicked',
                sub{
                        $textbox->freeze;
                        $textbox->set_point($start);
                        $textbox->forward_delete($end-$start);
                        $textbox->insert("","","",$combo->entry->get_text());
                        $textbox->thaw;
                        $end = $start + length($combo->entry->get_text());
                        $textbox->freeze;
                        $textbox->select_region($start,$end);
                        $textbox->thaw;
			$next_button->signal_emit('clicked');
                });
	if(defined $$last_add_connect) {
                $add_button->signal_disconnect($$last_add_connect);
        }
	$$last_add_connect=$add_button->signal_connect('clicked', sub{add_word($r->{'term'},$next_button);}); 
	$add_button->show;
        $textbox->freeze;
        $textbox->select_region($start,$end);
        $textbox->thaw;
   }
   else {
        $tbox->set_text("$word_num of $sum Spelling Changed");
        $combo->hide;
        $replace_button->hide;
	$add_button->hide;
   }
 }
 $tbox->show;

 return 1;
}

sub exec_ispell{
 my($textbox,$spell_list,$sigid,$sum) = @_;
 my($body);
 $body = $textbox->get_chars(0,-1);
 $body =~ s/\n/ /g;
 if (($sigid) and (open(TMP, "<$prefs{'MailDir'}/sig/$sigid.sig"))) {
   my @sig = <TMP>;
   close(TMP);
   my $sig=join("",@sig);
   $sig =~ s/\?/\\?/g;
   $sig =~ s/\*/\\*/g;
   $sig =~ s/\n/ /g;
   $body=~ s/$sig//;
 }
 $$sum=0;
 @$spell_list = Lingua::Ispell::spellcheck( $body );
 while(defined $$spell_list[$$sum]) {
   $$sum++;
 }
 return 1;
}

sub add_word {
 my ($word,$next_button) = @_;
 my ($window,$vbox,$butbox,$button,$tbox);
 $window = new Gtk::Window("toplevel");
 $window->set_position("mouse");
 $window->set_title("Add Word to Dictionary");
 $window->signal_connect("destroy" => sub{$window->destroy;});
 $window->signal_connect("delete_event" => \&Gtk::false);
 $window->set_default_size('200','70');
 $window->set_policy(1,1,0);
 $window->show;
 $vbox = new Gtk::VBox(1,1);
 $window->add($vbox);
 $vbox->show;
 $tbox = new Gtk::Label("Add $word\nto the Dictionary?");
 $vbox->pack_start($tbox,1,1,1);
 $tbox->show;
 $butbox = new Gtk::HButtonBox;
 $vbox->pack_start($butbox,1,1,1);
 $button = new Gtk::Button("No");
 $button->signal_connect('clicked', sub{$window->destroy;});
 $butbox->add($button);
 $button->show;
 $button = new Gtk::Button("Yes");
 $button->signal_connect('clicked', 
	sub{
		Lingua::Ispell::add_word($word);
		$next_button->signal_emit('clicked');
		$window->destroy;
	});
 $butbox->add($button);
 $button->show;
 $butbox->show;
 return 1;
}

sub attach_file {
 my ($widget)=shift;
 my ($attachments)=shift;
 my ($attach_win,$window,$bg,$tbox,$hbox,$sep,$butbox,$button,$butbox1,$filelist,
     $tmp,$hbox2, $filewin);
 my ($attach_rows,$arrtmp);
 $attach_rows=-1;
 $attach_win = new Gtk::Window("dialog");
 $attach_win->set_title("Attach files");
 $attach_win->signal_connect("destroy" => sub { $attach_win->destroy; });
 $attach_win->signal_connect("delete_event" => \&Gtk::false);
 $attach_win->set_default_size('350','200');
 $attach_win->set_policy(1,1,0);
 $attach_win->show;
 $window = $attach_win->window;
 $bg = $attach_win->style->bg('normal');
 $hbox= new Gtk::VBox(0,0);
 $attach_win->add($hbox);
 $hbox->show;

 $hbox2=new Gtk::HBox(0,5);

 $hbox->pack_start($hbox2, 1,1,0);
 $hbox2->show();
 
 $filewin=new Gtk::ScrolledWindow(undef,undef); 
 $filewin->set_policy('automatic','automatic');
 
 $hbox2->pack_start($filewin, 1,1,0);
 my @titles=("Filename","Size");
 $filelist=new_with_titles Gtk::CList(@titles);
 $filelist->set_selection_mode("single");
 $filelist->set_usize(50,50);
 $filelist->set_column_width(0,160);
# $filelist->signal_connect('select_row', \&selectAttach,\$attach_rows);
# $filelist->signal_connect('unselect_row', \&unSelectAttach,\$attach_rows);
 $filewin->add($filelist);
# $hbox->pack_start($filelist, 0,0,0);
 if (scalar(@$attachments)>0){
		for ($tmp=0;$tmp<scalar(@$attachments);$tmp++){
			$arrtmp=@$attachments[$tmp];
 		 	$filelist->append((@$arrtmp[0],@$arrtmp[1]));
		}
 }
 $filelist->show();
 $filewin->show();
  
 $butbox1 = new Gtk::VButtonBox;
 $butbox1->set_usize(-1,32);
 $butbox1->set_layout_default('start');
 $hbox2->pack_start($butbox1, 0,1,5);
 
 $button = new_with_label Gtk::Button("Add...");
 $button->set_usize(50,-1);
 $button->signal_connect('clicked', \&selectAttachFile,$filelist);
 $butbox1->add($button);
 $button->show;

 $button = new_with_label Gtk::Button("Delete");
 $button->set_usize(50,-1);
 $button->signal_connect('clicked', \&deleteAttachFile,$filelist);
 $butbox1->add($button);
 $button->show;
 $butbox1->show;

 $button = new_with_label Gtk::Button("Clear All");
 $button->set_usize(50,-1);
 $button->signal_connect('clicked', \&clearAttachFile,$filelist);
 $butbox1->add($button);
 $button->show;
 $butbox1->show;
 
 $sep = new Gtk::HSeparator;
 $sep->set_usize(-1,5);
 $hbox->pack_start($sep,0,1,0);
 $sep->show;

 $butbox = new Gtk::HButtonBox;
 $butbox->set_usize(-1,32);
 $hbox->pack_start($butbox, 0,1,0);
 $butbox->show;
     
 $button = new_with_label Gtk::Button("OK");
 $button->set_usize(50,-1);
 $button->signal_connect('clicked', \&okAttach,$attach_win, $filelist, $attachments);
 $button->can_default(1);
 $button->grab_default;
 $butbox->add($button);
 $button->show;

 $button = new_with_label Gtk::Button("Cancel");
 $button->set_usize(50,-1);
 $button->signal_connect('clicked', sub { $attach_win->destroy; });
 $button->can_default(1);
 $button->grab_default;
 $butbox->add($button);
 $button->show;

 
 return 1;
}

sub okAttach {
 my ($widget,$attach_win,$list,$attachments)=@_;
 my ($tmp,$tmp1,$tmp2);
 if ($list->rows>=1){
   for ($tmp=0;$tmp<$list->rows;$tmp++){
     $tmp1=$list->get_text($tmp,0);
     $tmp2=$list->get_text($tmp,1);   
		 @$attachments[$tmp]=[$tmp1,$tmp2];
   }
 } else {
 }
 $attach_win->destroy;
}

sub clearAttachFile {
 my ($widget,$listwidget)=@_;
 $listwidget->clear();
 return 1;
}

sub selectAttachFile {
 my ($widget,$listwidget)=@_;
 my ($fs_window);
 $fs_window = new Gtk::FileSelection "Select File to Attach...";
 $fs_window->position(-mouse);
 $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
 $fs_window->signal_connect("delete_event" => \&Gtk::false);
 $fs_window->ok_button->signal_connect("clicked", \&addAttachFile, $fs_window, $listwidget);
 $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
 $fs_window->show;
 return 1;
}

sub init_import_win {
 my ($listwidget,$flag)=@_ ;
 my ($fs_window);
 $fs_window = new Gtk::FileSelection "Choose MBOX file to import...";
     
     if (defined $flag and $flag eq "recrusive") {
         $fs_window->set_title("Choose Directory to import ...");
	   }

 $fs_window->position(-mouse);
 $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
 $fs_window->signal_connect("delete_event" => \&Gtk::false);
 
          if (defined $flag and $flag eq "recrusive") { 
              $fs_window->ok_button->signal_connect("clicked", sub {
	          
	           my $dir = $fs_window->get_filename;
	           $fs_window->destroy;
		   opendir IMPORTDIR,$dir;
	           my @folderlist=grep !/^\.\.?$/, readdir(IMPORTDIR);
	           close IMPORTDIR;
	           foreach (@folderlist) { my $dirfile = "$_"; &import_from_mbox( undef, undef, undef, $conn, $dir, $dirfile); }
			});
			    }
		
 $fs_window->ok_button->signal_connect("clicked", \&import_from_mbox, $fs_window, $listwidget, $conn);
 $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
 $fs_window->show;
 return 1;
}
   
sub init_export_win {
 my ($widget, $listwidget)=@_ ;
 my ($fs_window);
 $fs_window = new Gtk::FileSelection "Choose MBOX file to export to ...";
 $fs_window->position(-mouse);
 $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
 $fs_window->signal_connect("delete_event" => \&Gtk::false);
 $fs_window->ok_button->signal_connect("clicked", \&write_to_mbox, $fs_window, $listwidget, $conn);
 $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
 $fs_window->show;
 return 1;
}


sub init_export_folder {
 
 my ($widget, $listwidget)=@_;
 my ($fs_window, $sql, $query, @foldersel, $curfolder, $foldername);

   if (@foldersel = $folder_tree->selection()) {
        $curfolder = $ft_id{$foldersel[0]};
	}  else { &err_dialog("Please select a folder first!"); return 1; }
 
 $sql = "select name from boxlist where id = '$curfolder'";
 $query=$conn->prepare($sql);
 $query->execute();
 $foldername = $query->fetchrow_array();
 $fs_window = new Gtk::FileSelection "Choose Directory to export folder ($foldername) to  ...";
 $fs_window->position(-mouse);
 #$fs_window->set_filename("/home/$ENV{'USER'}/$foldername");
 $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
   $fs_window->signal_connect("delete_event" => \&Gtk::false);
    $fs_window->ok_button->signal_connect("clicked", \&export_folder, $fs_window, $listwidget, $conn, $curfolder, $foldername);
    $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
     $fs_window->show;
      return 1;
      }
      
sub init_import_folder {

 my ($widget, $listwidget)=@_;
 my ($fs_window, $sql, $query, @foldersel, $curfolder, $foldername);
  
     if (@foldersel = $folder_tree->selection()) {
         $curfolder = $ft_id{$foldersel[0]};
	 }  else { &err_dialog("Please select a folder first!"); return 1; }
 
  $sql = "select name from boxlist where id = '$curfolder'";		     
  $query=$conn->prepare($sql);
  $query->execute();
  $foldername = $query->fetchrow_array();
 $fs_window = new Gtk::FileSelection "Choose File to import into folder ($foldername)  ...";
 $fs_window->position(-mouse);
 $fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
 $fs_window->signal_connect("delete_event" => \&Gtk::false);
 $fs_window->ok_button->signal_connect("clicked", \&import_folder, $fs_window, $listwidget, $conn, $curfolder, $foldername);
 $fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
 $fs_window->show;
      return 1;
}

sub addAttachFile {
 my ($widget,$fswin,$list)=@_;
 my ($filename);
 my $error=0;
 $filename = $fswin->get_filename();
 $fswin->destroy;
 open FILE, $filename or $error=1;
 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size)=stat FILE;
 close FILE or $error=1;
 if ($error==0){
   $size=$size/1024;
	 $list->append(($filename,(sprintf("%8.2f",$size)."kb")));
 } else {
 		&wr_debug("unable to open $filename.");
 }
 return 1;
}

sub deleteAttachFile {
 my ($widget,$list)=@_;
 if (defined $list->selection() && $list->selection()>=0){
   $list->remove($list->selection());
 }
 return 1;
}

sub toggle_table {
 my ($widget, $table) = @_;
 if ($prefs{'HeaderBar'} eq "y") {
  $table->hide;
  $prefs{'HeaderBar'}="n";
 } else {
  $table->show;
  $prefs{'HeaderBar'}="y";
 }
 return 1;
}


sub message_drag_data {
  my ($widget, $context, $data, $info, $time) = @_;
  if ($info == TARGET_ROOTWIN) {
    print ("I was dropped on the rootwin\n");
  } else {
    $data->set ($data->target, 8, "I'm Data!");
  }
}

sub close_app {
	my ($widget, $window) = @_;
	$window->destroy;
	&save_prefs;	
	foreach (keys(%entity)) {
		$entity{$_}->purge;
	}
	opendir(DIR,"$prefs{'MailDir'}/tmp");
	while (defined (my $nuke = readdir DIR)) {
	next if $nuke =~ /^\.\.?$/;
	unlink "$prefs{'MailDir'}/tmp/$nuke";
	                                  }
	closedir(DIR);
	  
	$query->finish;
	$conn->disconnect;
	Gtk->exit(0);
} 


# Pass it a name, and a width & height to fall back on
# if we aren't or can't saveSize

sub get_win_size {
        my ($name,$dw,$dh) = @_;

        return ($dw,$dh) unless $prefs{'saveSize'} eq "y";
        return ($dw,$dh) unless defined $prefs{$name.'Width'} and
                            defined $prefs{$name.'Height'} >0;
        return ($prefs{$name.'Width'},
                $prefs{$name.'Height'});

}


sub save_win_size {
        my ($widget, $name, $window) = @_;
        my ($x, $y, $w, $h)=$window->get_geometry;
        if (defined $prefs{'saveSize'} && $prefs{'saveSize'} eq "y"){
                $prefs{$name.'Width'}=$w;
                $prefs{$name.'Height'}=$h;
        }
        return Gtk::false;
}


sub save_sizepane {
        my ($widget, $window) = @_;
  if (defined $prefs{'saveSize'} && $prefs{'saveSize'} eq "y"){
                $prefs{'startPaneWidth'}=@$window[2];
                $prefs{'startPaneHeight'}=@$window[3];
        }
        return Gtk::false;
}

sub init_main_window {

 my ($root_menu, $rm_file, $file_menu, $fm_emtrash, $am_sep, $accel_group, $fm_save, 
 $fm_sattach, $fm_sep1, $fm_nfldr, $fm_dfldr, $fm_sep2, $fm_exit, $rm_edit, $edit_menu, 
 $fm_wb, $em_selall, $em_clear, $em_sep2, $em_addybook, $em_options, $em_mime, $rm_mail, 
 $mail_menu, $mm_checkall, $mm_check, $mm_import, $mm_export,  $mm_sep1, $mm_newm, 
 $mm_reply, $mm_forward, $mm_sep2, $mm_accts, $mm_filters, $mm_sep3, $mm_delete, 
 $hm_help, $mm_copy, $mm_move, $rm_help, $help_menu, $hm_about, $root_vbox, 
 $mm_view_header, $toolbar, $window, $bg, $root_vpane, $vpane_hpane, $scroll1, $scroll2, 
 $scroll3, $mp_newm, $mp_reply, $mp_edit, $mp_forward, $table1, $html_view, $mp_sep2, 
 $mp_delete, $mp_copy, $mp_print, $mp_move, $mp_sep1, $nvbox, $mp_view_header, 
 @msg_headers, $mm_add2ab, $mp_add2ab, $message_menu, $lbl1, $lbl1_style, $lbl2, 
 $lbl2_style, $lbl3, $lbl3_style, $lbl4, $lbl4_style, $lbl5, $lbl5_style, $lbl6, 
 $lbl6_style, $mm_tglhdr, $clip, $exclame, $width, $height, $rm_message, $mm_scoreup, 
 $mm_scoredown, $mp_plus, $mp_minus, $mp_sep3, $mp_sep4, $mp_mar, $handlebox,
 $pixmap, $mask, $clippixmap, $clipmask);

# my $fm_debug;

 $root_window=new Gtk::Window("toplevel");
 $root_window->set_title("CSCMail $version");
 $root_window->signal_connect("destroy" => \&close_app, $root_window);
 $root_window->signal_connect("delete_event" => \&Gtk::false);

 ($width,$height) = get_win_size("startUp",685,400);
 $root_window->set_default_size($width,$height);


 $root_window->set_policy(1,1,0);
 $root_window->show;
  
 $toolbar = new Gtk::Toolbar('horizontal','both');
 $toolbar->set_button_relief('none');
 $toolbar->set_tooltips('1');
 $toolbar->border_width('2');

 $accel_group = new Gtk::AccelGroup;
 $root_window->add_accel_group($accel_group);
 $table1 = new Gtk::Table('2','4','0');
 my $tablehbox = new Gtk::HBox(0,0);
 $tablehbox->show;
 $window = $root_window->window;
 $bg = $root_window->style->bg('normal');
 my ($icon_pixmap, $icon_mask) = Gtk::Gdk::Pixmap->create_from_xpm($window,$bg, "$prefs{'PixmapDir'}/csc-icon.xpm");
 $window->set_icon(undef, $icon_pixmap, $icon_mask);
 $window->set_icon_name("CSCMail");
 $root_menu = new Gtk::MenuBar;
 $rm_file=new Gtk::MenuItem("File");
 $root_menu->append($rm_file);
 $file_menu = new Gtk::Menu;
# $fm_debug = new Gtk::MenuItem("Debug");
# $accel_group->add( 0x064, "mod1-mask" ,['visible'], $fm_debug, "activate"); 
# $fm_debug->signal_connect("activate" => \&debug);
# $file_menu->append($fm_debug);
 $fm_wb = new Gtk::MenuItem("Mini Browser");
 $accel_group->add( 0x062, "mod1-mask" ,['visible'], $fm_wb, "activate"); 
 $fm_wb->signal_connect("activate" => \&wb_view_url, $prefs{'HomePage'});
 $file_menu->append($fm_wb);
 $fm_save = new Gtk::MenuItem("Save");
 $accel_group->add( 0x073, "mod1-mask" ,['visible'], $fm_save, "activate"); 
 $fm_save->signal_connect("activate" => \&save_message_as);
 $file_menu->append($fm_save);
 $fm_sattach = new Gtk::MenuItem("Save Attachments");
 $file_menu->append($fm_sattach);
 $attach_menu = new Gtk::Menu;
 $am_sep = new Gtk::MenuItem;
 $attach_menu->append($am_sep);
 $fm_sattach->set_submenu($attach_menu);
 $fm_sattach = new Gtk::MenuItem("View Attachments");
 $file_menu->append($fm_sattach);
 $view_attach_menu = new Gtk::Menu;
 $am_sep = new Gtk::MenuItem;
 $view_attach_menu->append($am_sep);
 $fm_sattach->set_submenu($view_attach_menu);
 $fm_sep1 = new Gtk::MenuItem;
 $file_menu->append($fm_sep1);
 $fm_nfldr = new Gtk::MenuItem("New Folder");
 $fm_nfldr->signal_connect("activate" => \&new_folder);
 $file_menu->append($fm_nfldr);
 $fm_dfldr = new Gtk::MenuItem("Delete Folder");
 $fm_dfldr->signal_connect("activate" => \&delete_folder);
 $file_menu->append($fm_dfldr);
 $fm_emtrash = new Gtk::MenuItem("Empty Deleted Items");
 $fm_emtrash->signal_connect("activate" => \&empty_trash);
 $file_menu->append($fm_emtrash);
 $fm_sep2 = new Gtk::MenuItem;
 $file_menu->append($fm_sep2);
 $fm_exit = new Gtk::MenuItem("Exit");
 $accel_group->add( 0x078, "mod1-mask" ,['visible'], $fm_exit, "activate"); 
 $fm_exit->signal_connect("activate" => \&close_app, $root_window);
 $file_menu->append($fm_exit);
 $rm_file->set_submenu($file_menu);
 $rm_edit=new Gtk::MenuItem("Edit");
 $root_menu->append($rm_edit);
 $edit_menu = new Gtk::Menu;
 $em_selall = new Gtk::MenuItem("Select All");
 $em_selall->signal_connect("activate" => \&rw_select_all);
 $edit_menu->append($em_selall);
 $em_clear = new Gtk::MenuItem("Clear Selection");
 $em_clear->signal_connect("activate" => \&clear_selection);
 $edit_menu->append($em_clear);
 $em_sep2 = new Gtk::MenuItem;
 $edit_menu->append($em_sep2);
 $em_options = new Gtk::MenuItem("Options...");
 $accel_group->add( 0x06f, "control-mask" ,['visible'], $em_options, "activate"); 
 $em_options->signal_connect("activate" => \&init_config);
 $edit_menu->append($em_options);
 $em_mime = new Gtk::MenuItem("Mimetypes...");
 $em_mime->signal_connect("activate" => \&init_win, "mimetypes");
 $edit_menu->append($em_mime);
 $em_addybook = new Gtk::MenuItem("AddressBook");
 $accel_group->add( 0x061, "mod1-mask" ,['visible'], $em_addybook, "activate"); 
 $em_addybook->signal_connect("activate" => \&init_win, "address");
 $rm_edit->set_submenu($edit_menu);
 
 my $rm_view = new Gtk::MenuItem("View");
 $root_menu->append($rm_view);
 #toolbar menu stuf
 my $tb_view  = new Gtk::Menu; #view menu
 my $tb_submenu = new Gtk::Menu; #view -> toolbar
 my $tb_icondir = new Gtk::Menu; # view->toolbar->switchicons
 
 $tb_view->{'Toolbar'} = new Gtk::MenuItem("Toolbar");
 $tb_view->{'Toolbar'}->set_submenu($tb_submenu);
 $tb_view->append($tb_view->{'Toolbar'});
 
 $tb_submenu->{'show'} = new Gtk::CheckMenuItem("Show");
 if ($prefs{'toolbar'} eq "n") { $tb_submenu->{'show'}->set_active('0');}
 if ($prefs{'toolbar'} eq "y") { $tb_submenu->{'show'}->set_active('1');}
 $tb_submenu->{'show'}->set_show_toggle('1');
 $tb_submenu->append($tb_submenu->{'show'});
 
 $tb_submenu->{'icon'} = new Gtk::RadioMenuItem("As Icons");
 $tb_submenu->{'icon'}->signal_connect("toggled", sub { $toolbar->set_style('icons'); $prefs{'toolbarstyle'} = "icons";});
 $tb_submenu->append($tb_submenu->{'icon'});

 
 $tb_submenu->{'text'} = new Gtk::RadioMenuItem("As Text", $tb_submenu->{'icon'});
 $tb_submenu->{'text'}->signal_connect("toggled", sub { $toolbar->set_style('text'); $prefs{'toolbarstyle'} = "text";});
 $tb_submenu->append($tb_submenu->{'text'});

 
 $tb_submenu->{'both'} = new Gtk::RadioMenuItem("As Both",  $tb_submenu->{'text'});
 $tb_submenu->{'both'}->signal_connect("toggled", sub { $toolbar->set_style('both'); $prefs{'toolbarstyle'} = "both";});
 $tb_submenu->append($tb_submenu->{'both'});
 			 
 $tb_submenu->{'switch'} = new Gtk::MenuItem("Switch Icons");
 $tb_submenu->append($tb_submenu->{'switch'});
 $tb_submenu->{'rescan'} = new Gtk::MenuItem("Rescan Icon dir");
 $tb_submenu->append($tb_submenu->{'rescan'});
 $mm_tglhdr = new Gtk::CheckMenuItem("Header Panel");
 if ($prefs{'HeaderBar'} eq "n") { $mm_tglhdr->set_active('0');}
 if ($prefs{'HeaderBar'} eq "y") { $mm_tglhdr->set_active('1');}
 $mm_tglhdr->signal_connect("toggled" => \&toggle_table, $tablehbox);
 $mm_tglhdr->set_show_toggle('1');
 $tb_view->append($mm_tglhdr);
 $rm_view->set_submenu($tb_view);      
 $tb_submenu->{'show'}->signal_connect("toggled", sub { &toggle_toolbar($handlebox, $tb_submenu) });
 
 $rm_mail=new Gtk::MenuItem("Mail");
 $root_menu->append($rm_mail);
 $rm_message=new Gtk::MenuItem("Message");
 $root_menu->append($rm_message);
 $mail_menu = new Gtk::Menu;
 $message_menu = new Gtk::Menu;
 $mm_checkall = new Gtk::MenuItem("Send & Receive");
 $accel_group->add ( 0x06d, "mod1-mask",['visible'], $mm_checkall, "activate");    
 $mm_checkall->signal_connect("activate" => \&check_mail, "all", "1");
 $mail_menu->append($mm_checkall);
 $mm_check = new Gtk::MenuItem("Check");
 $mail_menu->append($mm_check);
 $mm_check->set_submenu($acct_menu);
 $mm_import = new Gtk::MenuItem("Import");
 $mm_import->{'menu'} = new Gtk::Menu;
 $mm_import->{'menu'}->{'mass'} = new Gtk::MenuItem("A File ..");
 $mm_import->{'menu'}->{'mass'}->signal_connect("activate" => \&init_import_win);
 $mm_import->{'menu'}->append($mm_import->{'menu'}->{'mass'});
 $mm_import->{'menu'}->{'dir'} = new Gtk::MenuItem("A directory");
 $mm_import->{'menu'}->{'dir'}->signal_connect("activate", sub { &init_import_win($mm_import->{'menu'}->{'dir'}, "recrusive"); });
 $mm_import->{'menu'}->append($mm_import->{'menu'}->{'dir'});
 $mm_import->set_submenu($mm_import->{'menu'});
 $mail_menu->append($mm_import);
 $mm_export = new Gtk::MenuItem("Export");
 $mm_export->signal_connect("activate" => \&init_export_win);
 $mail_menu->append($mm_export);
 $mm_sep1 = new Gtk::MenuItem;
 $mail_menu->append($mm_sep1);
 $mm_newm = new Gtk::MenuItem("New Message...");
 $accel_group->add( 0x06e, "mod1-mask" ,['visible'], $mm_newm, "activate"); 
 $mm_newm->signal_connect("activate" => \&init_msg_window);
 $message_menu->append($mm_newm);
 $mm_reply = new Gtk::MenuItem("Reply...");
 $accel_group->add( 0x072, "mod1-mask" ,['visible'], $mm_reply, "activate"); 
 $mm_reply->signal_connect("activate" => \&reply);
 $message_menu->append($mm_reply);
 $mm_forward = new Gtk::MenuItem("Forward...");
 $accel_group->add( 0x066, "mod1-mask" ,['visible'], $mm_forward, "activate"); 
 $mm_forward->signal_connect("activate" => \&forward);
 $message_menu->append($mm_forward);
 $mm_view_header = new Gtk::MenuItem("View Header");
 $message_menu->append($mm_view_header);
 $mm_add2ab = new Gtk::MenuItem("Add to Addressbook");
 $message_menu->append($mm_add2ab);
 $mm_accts = new Gtk::MenuItem("Accounts...");
 $mm_accts->signal_connect("activate" => \&init_win, "account");
 $mail_menu->append($mm_accts);
 $mm_filters = new Gtk::MenuItem("Filters...");
 $mm_filters->signal_connect("activate" => \&init_win, "filter");
 $mail_menu->append($mm_filters);
 $mail_menu->append($em_addybook);
 $mm_sep3 = new Gtk::MenuItem;
 $message_menu->append($mm_sep3);
 $mm_scoreup = new Gtk::MenuItem("Score +1");
 $accel_group->add( 0x02b, ["shift-mask", "mod1-mask"], ['visible'], $mm_scoreup, "activate");
 $message_menu->append($mm_scoreup);
 $mm_scoredown = new Gtk::MenuItem("Score -1");
 $accel_group->add( 0x02d, "mod1-mask", ['visible'], $mm_scoredown, "activate");
 $message_menu->append($mm_scoredown);
 $mm_delete = new Gtk::MenuItem("Delete");
 $accel_group->add( 0x064, "mod1-mask" ,['visible'], $mm_delete, "activate"); 
 $mm_delete->signal_connect("activate" => \&delete_msgs);
 $message_menu->append($mm_delete);
 $mm_copy = new Gtk::MenuItem("Copy");
 $message_menu->append($mm_copy);
 $mm_copy->set_submenu($cp_folder_menu);
 $mm_move = new Gtk::MenuItem("Move");
 $message_menu->append($mm_move);
 $mm_move->set_submenu($mv_folder_menu);
 $rm_mail->set_submenu($mail_menu);
 $rm_message->set_submenu($message_menu);
 $rm_help=new Gtk::MenuItem("Help");
 $root_menu->append($rm_help);
 $help_menu = new Gtk::Menu;
 $hm_help = new Gtk::MenuItem("Help...");
 $accel_group->add( 0xFFBE, "release-mask" ,['visible'], $hm_help, "activate"); 
 $hm_help->signal_connect("activate" => \&help_view_win, "index.html");
 $help_menu->append($hm_help);
 $hm_about = new Gtk::MenuItem("About CSCMail");
 $hm_about->signal_connect("activate" => \&init_about_dlg);
 $help_menu->append($hm_about);
 $rm_help->set_submenu($help_menu);
 $root_vbox= new Gtk::VBox(0,0);
 $root_vbox->pack_start($root_menu,0,0,0);

 #make our toolbar.
 
 &create_toolbar(undef, $toolbar,$window,$bg); 
 $handlebox = new Gtk::HandleBox;
 $handlebox->add($toolbar);
 $root_vbox->pack_start($handlebox,0,0,0);

 $root_vpane = new Gtk::VPaned;
 $vpane_hpane = new Gtk::HPaned;
 $scroll1 = new Gtk::ScrolledWindow(undef,undef);
 $scroll1->set_policy('automatic','automatic');

 my ($swidth,$sheight) = get_win_size("startPane",225,125);
 $scroll1->set_usize($swidth,$sheight);

 $vpane_hpane->add($scroll1);
 $scroll1->show;
 $scroll2 = new Gtk::ScrolledWindow(undef,undef);
 $scroll2->set_policy('automatic','automatic');
 $scroll3 = new Gtk::ScrolledWindow(undef,undef);
 $scroll3->set_policy('never','never');
 $vpane_hpane->add($scroll2);
 
 $scroll1->add($folder_tree);
 $folder_tree->signal_connect('button_press_event', \&click_clist, 1);
 
 $folder_tree->{'popup'} =  new Gtk::Menu;
 $folder_tree->{'popup'}->{'sep'} = new Gtk::MenuItem;
 $folder_tree->{'popup'}->{'sep'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'sep'});
 $folder_tree->{'popup'}->{'new'} = new Gtk::MenuItem("New Folder");
 $folder_tree->{'popup'}->{'new'}->signal_connect("activate" => \&new_folder);
 $folder_tree->{'popup'}->{'new'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'new'});
 $folder_tree->{'popup'}->{'delete'} = new Gtk::MenuItem("Delete Folder");
 $folder_tree->{'popup'}->{'delete'}->signal_connect("activate" => \&delete_folder);
 $folder_tree->{'popup'}->{'delete'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'delete'});
 $folder_tree->{'popup'}->{'rename'} = new Gtk::MenuItem("Rename Folder");
 $folder_tree->{'popup'}->{'rename'}->signal_connect("activate" => \&rename_folder);
 $folder_tree->{'popup'}->{'rename'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'rename'});
 $folder_tree->{'popup'}->{'sep2'} = new Gtk::MenuItem;
 $folder_tree->{'popup'}->{'sep2'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'sep2'});
 $folder_tree->{'popup'}->{'import'} = new Gtk::MenuItem("Import into Folder");
 $folder_tree->{'popup'}->{'import'}->signal_connect("activate" => \&init_import_folder);
 $folder_tree->{'popup'}->{'import'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'import'});
 $folder_tree->{'popup'}->{'export'} = new Gtk::MenuItem("Export Folder");
 $folder_tree->{'popup'}->{'export'}->signal_connect("activate" => \&init_export_folder);
 $folder_tree->{'popup'}->{'export'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'export'});
 $folder_tree->{'popup'}->{'sep3'} = new Gtk::MenuItem;
 $folder_tree->{'popup'}->{'sep3'}->show;    
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'sep3'});
 $folder_tree->{'popup'}->{'emptydeleted'} = new Gtk::MenuItem("Empty Deleted Items");
 $folder_tree->{'popup'}->{'emptydeleted'}->signal_connect("activate" => \&empty_trash);
 $folder_tree->{'popup'}->{'emptydeleted'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'emptydeleted'});
 $folder_tree->{'popup'}->{'emptyfolder'} = new Gtk::MenuItem("Empty Selected folder");
 $folder_tree->{'popup'}->{'emptyfolder'}->signal_connect("activate" => \&empty_folder);
 $folder_tree->{'popup'}->{'emptyfolder'}->show;
 $folder_tree->{'popup'}->append($folder_tree->{'popup'}->{'emptyfolder'});
 
 @msg_headers = (" "," ","Score","From","Subject","Date", "Hidden Field");
 $message_clist = new_with_titles Gtk::CList(@msg_headers);
 @{$message_clist->{'labels'}} = @msg_headers;
 $message_clist->{'name'} = "message";
# $message_clist->drag_source_set (['button1_mask'],['copy', 'move'], @target_table);
 if (defined $prefs{'Scoring'} && $prefs{'Scoring'} ne "y") { $message_clist->set_column_visibility(2, 0); }
 $message_clist->set_column_justification(2, "center");
 $message_clist->set_column_visibility(6, 0);
 $message_clist->column_titles_active;
 $message_clist->set_selection_mode('extended');
 if (not defined $prefs{'MessageListColWidth3'}) { $message_clist->set_column_width(3,127); }
 if (not defined $prefs{'MessageListColWidth4'}) { $message_clist->set_column_width(4,175); }
 for (my $i = 0; $i < 5; $i++) {
 	if (defined $prefs{'MessageListColWidth' . $i}) {
		$message_clist->set_column_width($i, $prefs{'MessageListColWidth' . $i});
	}
 }
 $message_clist->set_row_height(17);
#$message_clist->signal_connect('drag_data_get', \&message_drag_data);
 $message_clist->signal_connect('click_column', \&click_column);
 $message_clist->signal_connect('button_press_event', \&click_clist, 1);
 $message_clist->{'sortcol'} = $prefs{'SortCol'};
 $message_clist->{'sortdir'} = $prefs{'SortDir'};
 $message_clist->set_compare_func(\&clist_sort);
 $message_clist->signal_connect("resize-column" => sub {my ($d, $c, $w)=@_; $prefs{'MessageListColWidth'. $c}=$w;});
 $scroll2->add($message_clist);
 $message_clist->{'popup'} = new Gtk::Menu;
 $mp_sep1 = new Gtk::MenuItem;
 $message_clist->{'popup'}->append($mp_sep1);
 $mp_reply = new Gtk::MenuItem("Reply...");
 $mp_reply->signal_connect("activate" => \&reply);
 $message_clist->{'popup'}->append($mp_reply);
 $mp_forward = new Gtk::MenuItem("Forward...");
 $mp_forward->signal_connect("activate" => \&forward);
 $message_clist->{'popup'}->append($mp_forward);
 $mp_mar = new Gtk::MenuItem("Mark as Read ..");
 $mp_mar->signal_connect("activate" => \&mark_as_read);
 $message_clist->{'popup'}->append($mp_mar);
 $mp_edit = new Gtk::MenuItem("Edit...");
 $mp_edit->signal_connect("activate" => \&edit);
 $mp_sep2 = new Gtk::MenuItem();
 $message_clist->{'popup'}->append($mp_sep2);
 $mp_plus = new Gtk::MenuItem("Score +1");
 $message_clist->{'popup'}->append($mp_plus);
 $mp_minus = new Gtk::MenuItem("Score -1");
 $message_clist->{'popup'}->append($mp_minus);
 $mp_sep3 = new Gtk::MenuItem();
 $message_clist->{'popup'}->append($mp_sep3);
 $message_clist->{'popup'}->append($mp_edit);
 $mp_view_header = new Gtk::MenuItem("View Header");
 $message_clist->{'popup'}->append($mp_view_header);
 my $printmenu = new Gtk::Menu;
 $printmenu->{'withheader'} = new Gtk::MenuItem("With Raw Header");
 $printmenu->{'withheader'}->signal_connect("activate", sub {  &print_message("withheader") }); 
 $printmenu->{'withheader'}->show;
 $printmenu->append($printmenu->{'withheader'});
 $printmenu->{'body'} = new Gtk::MenuItem("Body only");
 $printmenu->{'body'}->signal_connect("activate", sub { &print_message("body") });
 $printmenu->{'body'}->show;
 $printmenu->append($printmenu->{'body'});
 $mp_print = new Gtk::MenuItem("Print");
 $mp_print->set_submenu($printmenu);
 $message_clist->{'popup'}->append($mp_print);
 $mp_add2ab = new Gtk::MenuItem("Add to Addressbook");
 $message_clist->{'popup'}->append($mp_add2ab);
 $mp_sep4 = new Gtk::MenuItem;
 $message_clist->{'popup'}->append($mp_sep4);
 $mp_delete = new Gtk::MenuItem("Delete");
 $mp_delete->signal_connect("activate" => \&delete_msgs);
 $message_clist->{'popup'}->append($mp_delete);
 $mp_copy = new Gtk::MenuItem("Copy");
 $message_clist->{'popup'}->append($mp_copy);
 $mp_copy->set_submenu($pcp_menu);
 $mp_move = new Gtk::MenuItem("Move");
 $message_clist->{'popup'}->append($mp_move);
 $mp_move->set_submenu($pmv_menu);
 if ($HTMLWIDGET eq "GtkHTML") {
  my($popup,$url,$sep,$item);
  $popup = new Gtk::Menu;
  $html_view = new Gtk::HTML;
  $html_view->signal_connect('url_requested' => \&load_url);
#  $html_view->signal_connect('link_clicked' => \&wb_view_url);
  $html_view->signal_connect('link_clicked' => \&gtkhtml_link_clicked);
  $html_view->signal_connect('button_press_event',\&gtkhtml_mouse_click, $popup, \$url);
  $html_view->signal_connect('on_url' => sub { shift; $url = shift;});
  $sep = new Gtk::MenuItem;
  $popup->show;
  $sep->show;
  $popup->append($sep);
  $item = new Gtk::MenuItem("Save As...");
  $item->signal_connect("activate" =>
        sub {
                my ($temp,$filename,$source,$type);
                ($temp,$source,$type) = split(/:/,$url);
                $filename = $source;
                $filename =~ s/^file:$prefs{'MailDir'}\/tmp\///g;
                &init_fs_window(undef,$filename,$source);
        });
  $item->show;
  $popup->append($item);
  $item = new Gtk::MenuItem("View");
  $item->signal_connect("activate" =>
        sub {
                my ($temp,$filename,$source,$type);
                ($temp,$source,$type) = split(/:/,$url);
                &view_attachment(undef,$source,$type,'y');
        });
  $item->show;
  $popup->append($item);
  $item = new Gtk::MenuItem("View With...");
  $item->signal_connect("activate" =>
        sub {
                my ($temp,$filename,$source,$type);
                ($temp,$source,$type) = split(/:/,$url);
                &view_attachment(undef,$source,$type,'n');
        });
  $item->show;
  $popup->append($item);
  $html_view->enable_debug(0);
  $html_view->set_editable(0);
  } else {
  $html_view = new Gtk::XmHTML;
  $html_view->set_anchor_buttons(0);
  $html_view->set_allow_body_colors(1);
  $html_view->set_hilight_on_enter(0);
  $html_view->set_allow_font_switching(0);
  $html_view->set_allow_images(1); 
  $html_view->set_strict_checking(1);
  $html_view->set_anchor_target_underline_type (1); 
  $html_view->set_anchor_underline_type (1);
  $html_view->set_anchor_visited_underline_type(1);
  $html_view->set_anchor_target_underline_type (1);
  $html_view->set_anchor_underline_type (1);  
  $html_view->set_anchor_visited_underline_type(1);
  $html_view->signal_connect('activate' => \&link_clicked);
 
 }
 $nvbox=new Gtk::VBox('0','0');
 $table1->set_row_spacings('0');
 $table1->set_usize('630','55');
 $table1->set_col_spacings('0');
 $table1->border_width('2');
 $lbl1 = new Gtk::Label("To: ");
 $lbl1->set_justify('left');
 $lbl1->set_line_wrap('0');
 $table1->attach($lbl1,'2','3','0','1',['fill'],[],'0','0');
 $lbl1->set_alignment('0','0.5');
 $lbl1_style=new Gtk::Style;
 $lbl1_style->font(Gtk::Gdk::Font->load($prefs{'FontUIBold'}));
 $lbl1->set_style($lbl1_style);
 $lbl2 = new Gtk::Label("From: ");
 $lbl2->set_justify('left');
 $lbl2->set_line_wrap('0');
 $table1->attach($lbl2,'0','1','0','1',['fill'],[],'0','0');
 $lbl2->set_alignment('0','0.5');
 $lbl2_style=new Gtk::Style;
 $lbl2_style->font(Gtk::Gdk::Font->load($prefs{'FontUIBold'}));
 $lbl2->set_style($lbl2_style);
 $lbl3 = new Gtk::Label("CC: ");
 $lbl3->set_justify('left');
 $lbl3->set_line_wrap('0');
 $table1->attach($lbl3,'2','3','1','2',['fill'],[],'0','0');
 $lbl3->set_alignment('0','0.5');
 $lbl3_style=new Gtk::Style;
 $lbl3_style->font(Gtk::Gdk::Font->load($prefs{'FontUIBold'}));
 $lbl3->set_style($lbl3_style);
 $lbl4 = new Gtk::Label("Subject: ");
 $lbl4->set_justify('left');
 $lbl4->set_line_wrap('0');
 $table1->attach($lbl4,'0','1','1','2',['fill'],[],'0','0');
 $lbl4->set_alignment('0','0.5');
 $lbl4_style=new Gtk::Style;
 $lbl4_style->font(Gtk::Gdk::Font->load($prefs{'FontUIBold'}));
 $lbl4->set_style($lbl4_style);
# Kept table order intact - lbl5 not used
# $lbl5 = new Gtk::Label("");
# $lbl5->set_justify('left');
# $lbl5->set_line_wrap('0');
# $table1->attach($lbl5,'2','3','2','3',['fill'],[],'0','0');
# $lbl5->set_alignment('0','0.5');
# $lbl5_style=new Gtk::Style;
# $lbl5_style->font(Gtk::Gdk::Font->load($prefs{'FontUIBold'}));
# $lbl5->set_style($lbl5_style);
 $lbl6 = new Gtk::Label("Date: ");
 $lbl6->set_justify('left');
 $lbl6->set_line_wrap('0');
 $table1->attach($lbl6,'0','1','2','3',['fill'],[],'0','0');
 $lbl6->set_alignment('0','0.5');
 $lbl6_style=new Gtk::Style;
 $lbl6_style->font(Gtk::Gdk::Font->load($prefs{'FontUIBold'}));
 $lbl6->set_style($lbl6_style);
 $table1->{'to_lbl'} = new Gtk::Label;
 $table1->{'to_lbl'}->set_justify('left');
 $table1->{'to_lbl'}->set_line_wrap('0');
 $table1->attach($table1->{'to_lbl'},'3','4','0','1',['expand','fill'],[],'0','0');
 $table1->{'to_lbl'}->set_alignment('0','0.5');
 $table1->{'from_lbl'} = new Gtk::Label;
 $table1->{'from_lbl'}->set_justify('left');
 $table1->{'from_lbl'}->set_line_wrap('0');
 $table1->attach($table1->{'from_lbl'},'1','2','0','1',['expand','fill'],[],'0','0');
 $table1->{'from_lbl'}->set_alignment('0','0.5');
 $table1->{'subj_lbl'} = new Gtk::Label;
 $table1->{'subj_lbl'}->set_justify('left');
 $table1->{'subj_lbl'}->set_line_wrap('0');
 $table1->attach($table1->{'subj_lbl'},'1','2','1','2',['expand','fill'],[],'0','0');
 $table1->{'subj_lbl'}->set_alignment('0','0.5');
 $table1->{'cc_lbl'} = new Gtk::Label;
 $table1->{'cc_lbl'}->set_justify('left');
 $table1->{'cc_lbl'}->set_line_wrap('0');
 $table1->attach($table1->{'cc_lbl'},'3','4','1','2',['expand','fill'],[],'0','0');
 $table1->{'cc_lbl'}->set_alignment('0','0.5');
 $table1->{'date_lbl'} = new Gtk::Label;
 $table1->{'date_lbl'}->set_justify('left');
 $table1->{'date_lbl'}->set_line_wrap('0');
 $table1->attach($table1->{'date_lbl'},'1','2','2','3',['expand','fill'],[],'0','0');
 $table1->{'date_lbl'}->set_alignment('0','0.5');
 $test = new Gtk::EventBox;
 $test->set_events('button_press_mask');
 $test->signal_connect("button_press_event" => \&rightclick, 1);
 $test->{'popup'} = new Gtk::Menu;
 $attach_menu2 = new Gtk::Menu;
 $test->{'popup'}->show;
 $test->{'popup'}->{'save'} = new Gtk::MenuItem("Save ");
 $test->{'popup'}->{'save'}->show;
 $test->{'popup'}->{'save'}->set_submenu($attach_menu2);
 $test->{'popup'}->append($test->{'popup'}->{'save'});
 $view_attach_menu2 = new Gtk::Menu;
 $test->{'popup'}->show;
 $test->{'popup'}->{'view'} = new Gtk::MenuItem("View ");
 $test->{'popup'}->{'view'}->show;
 $test->{'popup'}->{'view'}->set_submenu($view_attach_menu2);
 $test->{'popup'}->append($test->{'popup'}->{'view'});

 my ($button_pixmap, $button_mask) = Gtk::Gdk::Pixmap->create_from_xpm($window,$bg, "$prefs{'PixmapDir'}/ab.xpm");

 my $attbtn;
 $attbtn->{'clip'} = new Gtk::Pixmap($button_pixmap, $button_mask);
 $attbtn->{'clip'}->show;
 $test->add($attbtn->{'clip'});
 $tablehbox->pack_start($table1,1,1,5);
 $tablehbox->pack_end($test,0,0,5);
 $nvbox->pack_start($tablehbox,0,0,0);
 
 if ($HTMLWIDGET eq "GtkHTML") {
  my $sw = new Gtk::ScrolledWindow(undef, undef);
  $sw->set_policy('automatic', 'automatic');
  $sw->add($html_view);
  $nvbox->add($sw);
 } else {
  $nvbox->add($html_view);
 }
 $scroll3->add_with_viewport($nvbox);
 $root_vpane->add($vpane_hpane);
 $root_vpane->add($scroll3);
 $root_vbox->pack_start($root_vpane,1,1,0);
 $root_window->add($root_vbox);
 $message_clist->signal_connect('select_row', \&selection_handler,
        $html_view, $attach_menu, $view_attach_menu, $table1);
 $mm_view_header->signal_connect("activate" => \&view_header, $message_clist);
 $mp_view_header->signal_connect("activate" => \&view_header, $message_clist);
 $mm_add2ab->signal_connect("activate" => \&clist2ab, $message_clist);
 $mp_add2ab->signal_connect("activate" => \&clist2ab, $message_clist);
 $mp_plus->signal_connect("activate" => \&scoring, $message_clist, "up");
 $mp_minus->signal_connect("activate" => \&scoring, $message_clist, "down");
 $mm_scoreup->signal_connect("activate" => \&scoring, $message_clist, "up");
 $mm_scoredown->signal_connect("activate" => \&scoring, $message_clist, "down");
 $html_view->realize;
 show_all $root_window;
 ($clippixmap,$clipmask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'), "$prefs{'PixmapDir'}/paperclip.xpm");
 $clip = new Gtk::Pixmap($clippixmap, $clipmask);
 $message_clist->set_column_widget(1, $clip);
 ($pixmap,$mask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'),"$prefs{'PixmapDir'}/exclamation.xpm");
 $exclame = new Gtk::Pixmap($pixmap, $mask);
 $message_clist->set_column_widget(0, $exclame);
 &click_column($message_clist, $message_clist->{'sortcol'});
 $message_clist->{'popup'}->show_all;
 
#build icondir menu 
 my @results=&get_pixmap_dirs;
              foreach(@results) {
	      $tb_icondir->{'dir'} = new Gtk::MenuItem(@{$_}[0]);
	      $tb_icondir->{'dir'}->signal_connect("activate" =>\&create_toolbar, $toolbar, $window, $bg, $message_clist, $exclame, $pixmap, $mask, $clip, $clippixmap, $clipmask, $attbtn, $button_pixmap, $button_mask, @{$_}[1], "recreate");
	      $tb_icondir->append($tb_icondir->{'dir'});
	      $tb_icondir->{'dir'}->show;
	      }
  $tb_submenu->{'switch'}->set_submenu($tb_icondir); #set it
  #rescan icondir
  $tb_submenu->{'rescan'}->signal_connect("activate" => 
              sub { 
	      $tb_icondir->detach;
	      $tb_icondir->destroy;
	      $tb_icondir = new Gtk::Menu;
	      my @results=&get_pixmap_dirs;
              foreach(@results) {
	      $tb_icondir->{'dir'} = new Gtk::MenuItem(@{$_}[0]);
	      $tb_icondir->{'dir'}->signal_connect("activate" =>\&create_toolbar, $toolbar, $window, $bg, $message_clist, $exclame, $pixmap, $mask, $clip, $clippixmap, $clipmask, $attbtn, $button_pixmap, $button_mask, @{$_}[1], "recreate");
	      $tb_icondir->append($tb_icondir->{'dir'});
	      $tb_icondir->{'dir'}->show;
	      $tb_submenu->{'switch'}->set_submenu($tb_icondir);
	      }
	      });
 
   
  if ($prefs{'HeaderBar'} eq "n") { $table1->hide; }
 
     if ($prefs{'toolbar'} eq "n") { 
         $handlebox->hide; 
         $tb_submenu->{'icon'}->set_sensitive(0);
         $tb_submenu->{'text'}->set_sensitive(0);
         $tb_submenu->{'both'}->set_sensitive(0);
    
               }
 
$scroll1->signal_connect("size-allocate" => \&save_sizepane);
$root_window->signal_connect("size-request" => \&save_win_size, "startUp", $root_window->window);
$toolbar->set_style($prefs{'toolbarstyle'});

 if ($prefs{'toolbarstyle'} eq "icons") { $tb_submenu->{'icon'}->set_active('1');}
 if ($prefs{'toolbarstyle'} eq "text") { $tb_submenu->{'text'}->set_active('1');}
 if ($prefs{'toolbarstyle'} eq "both") { $tb_submenu->{'both'}->set_active('1');}
 $test->hide;
 return 1;
}


sub get_pixmap_dirs {
my ($pixpath, $tmp);
my (@results);

$pixpath=$libpath."/pixmaps";
opendir DIR,$pixpath; 
foreach (readdir(DIR)){
$tmp=$pixpath."/".$_;
if (-d $tmp && $_ !~ /^\.\.?/ && defined
&check_pixmap_path($tmp)){ 
push (@results, [$_, $tmp]);
}
}
closedir(DIR);
return @results;
}


sub create_toolbar {
  
  my ($widget, $toolbar, $window, $bg, $message_clist, $exclame, $pixmap, $mask, $clip, 
  $clippixmap, $clipmask, $attbtn, $button_pixmap, $button_mask, $path, $flag) = @_;
          
	  if (defined $flag and $flag eq "recreate") { 
	  $prefs{'PixmapDir'} = $path;
	  #detach our menu.
	  $acct_menu2->detach;
	  #destroy toolbar items.
          $toolbar->{'item6'}->destroy;
          $toolbar->{'item1'}->destroy;
          $toolbar->{'item2'}->destroy;
          $toolbar->{'item3'}->destroy;
          $toolbar->{'item4'}->destroy;
          $toolbar->{'item5'}->destroy;
          $toolbar->{'item7'}->destroy;
          #destroy clist pixmaps..
          $exclame->destroy;
          ($pixmap,$mask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'),"$prefs{'PixmapDir'}/exclamation.xpm");
          $exclame = new Gtk::Pixmap($pixmap, $mask);
          $message_clist->set_column_widget(0, $exclame);
          $clip->destroy;
          ($clippixmap, $clipmask)=Gtk::Gdk::Pixmap->create_from_xpm($message_clist->clist_window,$message_clist->style->bg('normal'), "$prefs{'PixmapDir'}/paperclip.xpm");
          $clip = new Gtk::Pixmap($clippixmap, $clipmask);
          $message_clist->set_column_widget(1, $clip);
          #headerpanel attachement button
	  $attbtn->{'clip'}->destroy;
          ($button_pixmap, $button_mask) = Gtk::Gdk::Pixmap->create_from_xpm($window,$bg, "$prefs{'PixmapDir'}/ab.xpm");
          $attbtn->{'clip'} = new Gtk::Pixmap($button_pixmap, $button_mask);
	  $attbtn->{'clip'}->show;
	  $test->add($attbtn->{'clip'});
	  }
	  
  #toolbar again.  
 $toolbar->{'item1'} = $toolbar->append_item("New Message","Click here to send a new message","",new_pixmap("$prefs{'PixmapDir'}/tb_new_mail.xpm", $window, $bg));
 $toolbar->{'item1'}->signal_connect('clicked', \&init_msg_window);
 $toolbar->{'item2'} = $toolbar->append_item("Reply","Click here to reply to this message","",new_pixmap("$prefs{'PixmapDir'}/tb_reply.xpm", $window, $bg));
 $toolbar->{'item2'}->signal_connect('clicked', \&reply);
 $toolbar->{'item3'} = $toolbar->append_item("Reply All","Click here to reply-all to this message","",new_pixmap("$prefs{'PixmapDir'}/tb_replyall.xpm", $window, $bg));
 $toolbar->{'item3'}->signal_connect('clicked', \&reply_all);
 $toolbar->{'item4'} = $toolbar->append_item("Forward","Click here to forward this message to someone","",new_pixmap("$prefs{'PixmapDir'}/tb_forward.xpm", $window, $bg));
 $toolbar->{'item4'}->signal_connect('clicked', \&forward);
 $toolbar->{'item5'} = $toolbar->append_item("Delete","Click here to delete the selected messages","",new_pixmap("$prefs{'PixmapDir'}/tb_delete.xpm", $window, $bg));
 $toolbar->{'item5'}->signal_connect('clicked', \&delete_msgs);
 $toolbar->{'item6'} = $toolbar->append_item("Send & Receive","Click here to send mail in your Outbox, if any, as well as check  all of your accounts for new mail, Or right-click for a list of accounts to check for new mail only or to send mail in outbox only.","",new_pixmap("$prefs{'PixmapDir'}/prefs.xpm", $window, $bg));
 $toolbar->{'item6'}->signal_connect('clicked', \&check_mail, "all", "1");
 $toolbar->{'item6'}->signal_connect("button_press_event" => \&rightclick, 1);
 #popup menu for send and rec.
 $toolbar->{'item6'}->{'popup'} = new Gtk::Menu;
 $toolbar->{'item6'}->{'popup'}->{'sep'} = new Gtk::MenuItem;
 $toolbar->{'item6'}->{'popup'}->{'sep'}->show;
 $toolbar->{'item6'}->{'popup'}->append($toolbar->{'item6'}->{'popup'}->{'sep'});
 $toolbar->{'item6'}->{'popup'}->{'check'} = new Gtk::MenuItem("Check");
 $toolbar->{'item6'}->{'popup'}->{'check'}->show;
 $toolbar->{'item6'}->{'popup'}->{'check'}->set_submenu($acct_menu2);
 $toolbar->{'item6'}->{'popup'}->append($toolbar->{'item6'}->{'popup'}->{'check'});
 $toolbar->{'item6'}->{'popup'}->{'sep2'} = new Gtk::MenuItem;
 $toolbar->{'item6'}->{'popup'}->{'sep2'}->show;
 $toolbar->{'item6'}->{'popup'}->{'send'} = new Gtk::MenuItem("Send only");
 $toolbar->{'item6'}->{'popup'}->{'send'}->signal_connect("activate" => \&send_out);
 $toolbar->{'item6'}->{'popup'}->{'send'}->show;
 $toolbar->{'item6'}->{'popup'}->append($toolbar->{'item6'}->{'popup'}->{'send'});
 #end popupmenu
 $toolbar->{'item7'} = $toolbar->append_item("Address Book","Click here to edit/add addresses", "", new_pixmap("$prefs{'PixmapDir'}/addressbook.xpm", $window, $bg));
 $toolbar->{'item7'}->signal_connect('clicked', \&init_win, "address");

            if (defined $flag and $flag eq "recreate") {
	    my @selection = $folder_tree->selection();
	    if (!@selection) { return 1; } else {  &refresh_messages }
	   	    }

}


sub toggle_toolbar {
  my ($handlebox, $tb_submenu) = @_;
  if ($prefs{'toolbar'} eq "y") { 
  $handlebox->hide; 
  $prefs{'toolbar'} = "n"; 
  $tb_submenu->{'icon'}->set_sensitive(0);
  $tb_submenu->{'text'}->set_sensitive(0);
  $tb_submenu->{'both'}->set_sensitive(0); 
  $tb_submenu->{'switch'}->set_sensitive(0);
  
 } else { 
  
  $handlebox->show; 
  $prefs{'toolbar'} = "y";
 $tb_submenu->{'icon'}->set_sensitive(1);
 $tb_submenu->{'text'}->set_sensitive(1);
 $tb_submenu->{'both'}->set_sensitive(1);
 $tb_submenu->{'switch'}->set_sensitive(1);      
 }
return 1;
}

sub scoring {
	my ($widget, $clist, $flag) = @_;
	my ($score, $sql, $query, $row, @selection);
	if (@selection = $clist->selection()) {
		$row = $selection[0];
	} else {return 1;}
	$score = $clist->get_text($row, 2);
	if ($flag eq "up") { $score++; } else { $score--; }
	$sql = "update messages set score = ? where id = ?";
	$query=$conn->prepare($sql);
	$query->execute($score, ${$clist->get_row_data($row)});
	if ($score == 0) { $score = " "; }
	$clist->set_text($row, 2, $score);
	return 1;
}

sub debug {
	my (@selection) = $message_clist->selection();
	foreach (@selection) {
		$message_clist->unselect_row($_,0);
	}
	$message_clist->select_row(0,0);
	$message_clist->set_focus_row(0);
	$message_clist->draw_focus;
	1;
}

sub view_url {
	my ($widget, $html_view, $node, $flag) = @_;
	my ($tmp);
	if ($flag == 1) {
		undef @{$html_view->{'history'}};
	} elsif ($flag == 2) {
		if (defined @{$html_view->{'history'}}) {
			$tmp = pop @{$html_view->{'history'}};
			if ($tmp) { $node = $tmp; }
		} else {
			return 1;
		}
	} else {
		if (defined $html_view->{'current'}) {
			push @{$html_view->{'history'}}, $html_view->{'current'};
		}
	}
	$html_view->{'current'} = $node;
	my $tmpfile = "$prefs{'DocDir'}/$node";
	if (open(FILE,"<$tmpfile")) {
	 	undef $/;
	 	my $body = <FILE>;
	 	close(FILE);
	 	$/ = "\n";
		$body =~ s/<--!version-->/$version/g;  # find version tag
		$body =~ s/<img src=\"(.+)\">/<img src=\"$prefs{'DocDir'}\/$1\">/g;
		if ($HTMLWIDGET eq "GtkHTML") {
			my $file = "$prefs{'MailDir'}/help.html";
			open(TEMP,">$file");
			print TEMP $body;
			close(TEMP);
	 		$html_view->begin($file);
		} else {
	 		$html_view->source($body);
		}
	}
	return 1;
}

sub help_link_clicked {
	my (@fields, $address, $url, $widget, $info);

	if ($HTMLWIDGET eq "GtkHTML") {
		($widget, $url) = @_;
	} else {
		($widget, $info) = @_;
		$url = $info->{'href'};
	}
	if ($url =~ /^mailto:(.+)/) {
		$address = $1;
		$fields[0] = $address;    
		$fields[1] = "";
		$fields[2] = "";
		&init_msg_window(0, undef, \@fields);
	} elsif ($url =~ /^sub:(.+)/) {  # its a special sub url.. lets run the sub...
		no strict 'refs';
		my $sub = $1;
		&{$sub};
	} else {
		&view_url(undef, $widget, $url, 3);
	}
	return 1;
}

sub link_clicked {
 if ($HTMLWIDGET eq "XmHTML") {
  my ($widget, $info) = @_;
  my (@fields, $address);
  if (($info->{"urltype"} eq "http") or ($info->{"urltype"} eq "ftp")) {
   my $url = $info->{"href"};
   my $cmd = $prefs{'ViewerPath'} . " -remote 'OpenURL($url, new_window)'";
   my $bug = system($cmd);
   if ($bug != 0) {
    my ($child);
    unless ($child = fork) {
     die "cannot fork: $~" unless defined $child;
     exec($prefs{'ViewerPath'}." $url");
    }
   }
  } elsif ($info->{"href"} =~ /mailto:/) {
   $info->{"href"} =~ /mailto:(.+)/ and $address = $1;
   $fields[0] = $address;    
   $fields[1] = "";
   $fields[2] = "";
   &init_msg_window(0, undef, \@fields);
  } elsif ($info->{"href"} =~ /^file:$prefs{'MailDir'}\/tmp\//) {
        my ($temp,$filename,$source,$type);
        ($temp,$source,$type) = split(/:/,$info->{"href"});
        if($prefs{'attachLeftView'} eq 'y') {
                &view_attachment(undef,$source,$type,'y');
        }
        else {
                $filename = $source;
                $filename =~ s/^file:$prefs{'MailDir'}\/tmp\///g;
                &init_fs_window(undef,$filename,$source);
        }
  }
} else {
 my ($widget, $url) = @_;
 my $cmd = $prefs{'ViewerPath'} . " -remote 'OpenURL($url, new_window)'";
 my $bug = system($cmd);
 if ($bug != 0) {
 my ($child);
 unless ($child = fork) {
 die "cannot fork: $~" unless defined $child;
 exec($prefs{'ViewerPath'}." $url");
                         }
			    }
      }
 1;
}

sub gtkhtml_link_clicked {
  my($window,$url) = @_;
  if ($url =~ /^mailto:(.+)/) {
       my ($address, @fields);
        $address = $1;
        $fields[0] = $address;
        $fields[1] = "";
        $fields[2] = "";
        &init_msg_window(0, undef, \@fields);
        return 1;
  }
  elsif ($url =~ /^file:$prefs{'MailDir'}\/tmp\//) {
	my ($temp,$filename,$source,$type);
	($temp,$source,$type) = split(/:/,$url);
        if($prefs{'attachLeftView'} eq 'y') {
		&view_attachment(undef,$source,$type,'y');
	}
	else {
		$filename = $source;
		$filename =~ s/^file:$prefs{'MailDir'}\/tmp\///g;
		&init_fs_window(undef,$filename,$source);
	}
  } 	
  elsif ($prefs{'useAlternateViewer'} eq "y") {
       &link_clicked(undef, $url);
        return 1;
  }
  else {
       &wb_view_url(undef, $url);
       return 1;
  }
}


sub load_help_url {  
	my ($html, $url, $handle) = @_;
	my ($d);
	my $io = new IO::File($url);
	$io->read($d, 1000000);
	$html->write($handle, $d);
	$io->close;
	$html->end($handle, 'ok');
}

sub load_url {  
	my ($html, $url, $handle) = @_;
	my ($io, $d, $path, $port, $host, $socket, $answer, $header, $length, $xferencode, $status, $st_num);
	unless ($url =~ /^\w+:/) {
		if ($io = new IO::File($url)) {
			$io->read($d, 1000000);
			$html->write($handle, $d);
			$io->close;
			$html->end($handle, 'ok');
		} else {
			$html->end($handle, 'error');
		}
		return 1;
	}
	$answer = "";
	$header ="";
	$url =~ /http:\/\/([\w\.-]+)([:\d]*)(.*)/;
	if (!$3) { $path = "/"; } else { $path = $3; }
	if (!$2) { $port = 80; } else { $port = $2; }
	if (!$1) { return 1; } else { $host = $1; }
	if ($prefs{'Proxy'}) {
		$socket = IO::Socket::INET->new(PeerAddr => $prefs{'Proxy'}, PeerPort => $prefs{'ProxyPort'}, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM);
		print $socket "GET $url HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";

	} else {
		$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP", Timeout => "30", Type => SOCK_STREAM);
		print $socket "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: CSCMail/$version\r\nConnection: close\r\n\r\n";
	}
CONTINUE:
	$status = <$socket>;
	$status =~ /HTTP\/\d.\d (\d+)/ and $st_num = $1;
	while (defined $answer and $answer ne "\n") {
		$answer = <$socket>;
		if ($answer) {
			$answer =~ s/\r//g;
			$header.= $answer;
		}
	}
	if ($st_num == 301 || $st_num ==302) {
		$header =~ /\nLocation: ?(.+)/i and $url = $1;
		&load_url($html, $url, $handle);
		return 1;
	} elsif ($st_num == 100) {
		goto CONTINUE;
	} elsif ($st_num != 200) {
		&err_dialog("$status");
		return 1;
	}
	print ("$header\n");
	$header =~ /Content-Length: ?(\d+)/i and $length = $1;
	$header =~ /Transfer-Encoding: ?(.+)/i and $xferencode = $1;
	if (defined $xferencode && $xferencode =~ /chunked/) {
		my ($body, $line);
		$/ = "\r\n"; 
		$line = <$socket>;
		$/ = "\n";
		$line =~ /^(\w+)/ and $length = $1;
		while (hex($length) > 0) {
			while (Gtk->events_pending) { Gtk->main_iteration; }
			$socket->read($d, hex($length));
			$body.=$d;
			$/ = "\r\n";
			$line = <$socket>;
			$line = <$socket>;
			$length = 0;
			$line =~ /^(\w+)/ and $length = $1;
			$/ = "\n";
		}
		$html->write($handle, $body);
	} else {
		if (defined $length && $length > 8192) {
			my $numfullpackets = int($length/8192);
			my $lastpacket = $length - ($numfullpackets * 8192);
			for (my $i = 1; $i <= $numfullpackets; $i++) {
				while (Gtk->events_pending) {
					Gtk->main_iteration;
				}
				$socket->read($d, 8192);
				$html->write($handle, $d);
			}
			$socket->read($d, $lastpacket);
		} else {
			$socket->read($d, 8192);
		}
		$html->write($handle, $d);
	}
	$html->end($handle, 'ok');
	return 1;

}

sub dblclick_clist {
  my ($widget, $event, $data) = @_;
  my ($x, $y, $flag);
  $x = $event->{'x'};
  $y = $event->{'y'};
  my ($row, $col) = $widget->get_selection_info($x,$y);
  $flag = $widget->{'name'};
  if (not defined $row) { return 1; }
  if ($flag eq "message") {
   &message_view_win($widget, $row, 1);
  } elsif ($flag eq "account") {
   &edit_account($widget, $widget, $row);
  } elsif ($flag eq "filter") {
   &filter_editwin($widget, $widget, "edit", $row);
  } elsif ($flag eq "address") {
    &add_to_field($widget, $widget, "to", $data, $row);
  }
  return 1;
}

sub destroy_entity {
 my ($widget, $msgid) = @_;
 $entity{$msgid}->{'usecount'}--;
 if ($entity{$msgid}->{'usecount'} >= 1) {
  return 1;
 } else {
  $entity{$msgid}->purge;
  delete $entity{$msgid};
  return 1;
 }
}

sub click_clist {
  my ($widget, $data, $event) = @_;
   if ($event->{type} eq "2button_press") {
   &dblclick_clist($widget, $event, $data);
   } 

  if (($event->{button} == 3) and ($widget->{'popup'})) {
   $widget->{'popup'}->popup(undef,undef,$event->{button},1);
  }
return 1;
}

sub rightclick {

my ($widget, $data, $event) = @_;
if (($event->{button} == 3) and ($widget->{'popup'})) {
   $widget->{'popup'}->popup(undef,undef,$event->{button},1);
     }
     return 1;
}

# sub click_attachment {
#  my ($widget, $filename, $source, $type, $event, $menuitem) = @_;
#  if ($event->{button} == 3) {
#  	if($prefs{'attachLeftView'} eq 'y') {
#       		&init_fs_window($widget, $filename, $source);
#   	}
#   	else {
#   		&view_attachment($widget, $source, $type,'y');
#   	}
#  }
#  elsif ($event->{button} == 1) {
#  	if($prefs{'attachLeftView'} eq 'y') {
#   		&view_attachment($widget, $source, $type,'y');
#   	}
#   	else {
#   		&init_fs_window($widget, $filename, $source);
#   	}
#  }
#  return 1;
#}

sub destroy_window {
 my($widget, $windowref) = @_;
 $$windowref = undef;
 return 1;
}

sub refresh_semaphore {
 open(TMP,"<$prefs{'MailDir'}/.cscmail.refresh") or return 1;
 close(TMP);
 unlink("$prefs{'MailDir'}/.cscmail.refresh");
 &refresh_folder_menus;
 &refresh_messages;
 return 1;
}

sub init_config {

my ($main, $vbox1, $tab1_label, $tab2_label, $tab3_label, $tab4_label, $page1_vbox, $page2_vbox, 
    $page3_vbox, $page4_vbox, $page1_hbox, $page1_hbox2, $page2_rr, $page2_import, $page1_wrap, 
    $page2_hbox1, $page2_hbox2, $page2_check1, $page2_check2, $page3_hbox1, $page3_hbox2, 
    $page3_hbox3, $page3_hbox5, $page5_fm_label, $page5_fm_label2, $page5_fm_label3, 
    $page5_fm_label4, $page5_hbox8, $page5_hbox7, $page5_fn_but, $page5_fn_but2, $page5_fn_but3, 
    $page3_date, $page5_fn_but4, $page4_hbox1, $page4_label, $page4_hbox2, $page4_label2, 
    $page4_label3, $page4_hbox3, $hbox_but, $ok_but, $cancel_but, $help_but, $tab5_label, 
    $page5_vbox, $notebook, $page5_hbox1, $page5_hbox2, $page3_mra1, $page3_mra2, $page5_hbox3, 
    $page5_hbox4, $page5_hbox5, $page5_hbox6, $page1_hbox1, $page1_hbox3, $page1_check1_lbl, 
    $page1_check2_lbl, $page3_check1_lbl, $page3_check2_lbl, $page1_hbox4, $page1_check3_lbl, 
    $page3_print, $page3_hbox6, $page3_hbox7, $page1_hbox5, $page1_hbox6, $page1_quotepre, 
    $page1_quotewith, $page1_hbox7, $page2_scoring, $page2_hbox3, $page2_hbox4, $page2_hbox5, 
    $page2_hbox6, $page2_sndcmd, $page2_sndfl, $page2_hbox7, $page2_dupe, $page2_sound, $tab6_label, 
    $page6_vbox, $page6_hbox3, $page6_hbox4, $page6_hbox5, $page6_hbox6, $page6_label2, $page6_label3, $page6_button2, $page6_button3, $page6_frame1, 
    $page6_icons, $page3_check9_lbl, $page3_check10_lbl, $page3_check11_lbl, $page3_check12_lbl, $page3_check13_lbl, $page3_check3_lbl, $page3_hbox8,  $page3_hbox9, $page3_hbox10, $page3_hbox11, $page3_hbox12, $page3_hbox13, $tab7_label, 
    $page7_vbox, $page2_hbox8, $page7_proxy, $page7_proxyport, $page7_hbox1, $page7_hbox2, $page7_hbox3, $page7_homepage, $page1_hbox8, $page1_check4_lbl, $page1_hbox9, $page1_check5_lbl);


$main = new Gtk::Window("toplevel");
$main->set_title("CSCMail Configuration");

#$main->set_usize(get_win_size("config",500,330));
$main->set_default_size(get_win_size("config",500,330));
$main->position(-mouse);
$main->signal_connect("destroy" => sub {$main->destroy;});
$main->signal_connect("delete_event" => \&Gtk::false);
$notebook = new Gtk::Notebook;

#  Page One of Notebook
$tab1_label = new Gtk::Label("Send");
$notebook->{'SendImmediately'} = new Gtk::CheckButton();
if ($prefs{'SendImmediately'} eq "y") { $notebook->{'SendImmediately'}->set_active('1'); }
if ($prefs{'SendImmediately'} eq "n") { $notebook->{'SendImmediately'}->set_active('0'); }
$notebook->{'SendImmediately'}->set_usize(16,17);
$page1_check1_lbl = new Gtk::Label("Send Messages Immediately?");
$page1_check1_lbl->set_alignment(0.0,0.5);
$page1_hbox1 = new Gtk::HBox(0,5);
$page1_hbox1->pack_start($notebook->{'SendImmediately'},0,0,0);
$page1_hbox1->pack_start($page1_check1_lbl,0,0,0);
$notebook->{'AddReplytoAB'} = new Gtk::CheckButton();
if ($prefs{'AddReplytoAB'} eq "y") { $notebook->{'AddReplytoAB'}->set_active('1'); }
if ($prefs{'AddReplytoAB'} eq "n") { $notebook->{'AddReplytoAB'}->set_active('0'); }
$notebook->{'AddReplytoAB'}->set_usize(16,17);
$page1_check2_lbl = new Gtk::Label("Automatically put people I reply to in my addressbook?");
$page1_check2_lbl->set_alignment(0.0,0.5);
$page1_hbox2 = new Gtk::HBox(0,5);
$page1_hbox2->pack_start($notebook->{'AddReplytoAB'},0,0,0);
$page1_hbox2->pack_start($page1_check2_lbl,0,0,0);
$notebook->{'ForwardAttachments'} = new Gtk::CheckButton();
if ($prefs{'ForwardAttachments'} eq "y") { $notebook->{'ForwardAttachments'}->set_active('1'); }
if ($prefs{'ForwardAttachments'} eq "n") { $notebook->{'ForwardAttachments'}->set_active('0'); }
$notebook->{'ForwardAttachments'}->set_usize(16,17);
$page1_check3_lbl = new Gtk::Label("Forward Attachments?");
$page1_check3_lbl->set_alignment(0.0,0.5);
$page1_hbox3 = new Gtk::HBox(0,5);
$page1_hbox3->pack_start($notebook->{'ForwardAttachments'},0,0,0);
$page1_hbox3->pack_start($page1_check3_lbl,0,0,0);
$notebook->{'ForwardHeader'} = new Gtk::CheckButton();
if ($prefs{'ForwardHeader'} eq "y") { $notebook->{'ForwardHeader'}->set_active('1'); }
if ($prefs{'ForwardHeader'} eq "n") { $notebook->{'ForwardHeader'}->set_active('0'); }
$notebook->{'ForwardHeader'}->set_usize(16,17);
$page1_check4_lbl = new Gtk::Label("When Forwarding, include a brief header?");
$page1_check4_lbl->set_alignment(0.0,0.5);
$page1_hbox8 = new Gtk::HBox(0,5);
$page1_hbox8->pack_start($notebook->{'ForwardHeader'},0,0,0);
$page1_hbox8->pack_start($page1_check4_lbl,0,0,0);
$notebook->{'autospell'} = new Gtk::CheckButton();
if ($prefs{'autospell'} eq "y") { $notebook->{'autospell'}->set_active('1'); }
if ($prefs{'autospell'} eq "n") { $notebook->{'autospell'}->set_active('0'); }
$notebook->{'autospell'}->set_usize(16,17);
$page1_check5_lbl = new Gtk::Label("Check Spelling on Send?");
$page1_check5_lbl->set_alignment(0.0,0.5);
$page1_hbox9 = new Gtk::HBox(0,5);
$page1_hbox9->pack_start($notebook->{'autospell'},0,0,0);
$page1_hbox9->pack_start($page1_check5_lbl,0,0,0);
$page1_wrap = new Gtk::Label("Wrap after how many columns");
$page1_wrap->set_alignment(0.0,0.5);
$notebook->{'WrapAfter'} = new Gtk::Entry;
$notebook->{'WrapAfter'}->set_text($prefs{'WrapAfter'});
$notebook->{'WrapAfter'}->set_editable('1');
$notebook->{'WrapAfter'}->set_usize(45,22);
$page1_hbox4 = new Gtk::HBox(0,5);
$page1_hbox4->pack_start($page1_wrap,0,0,5);
$page1_hbox4->pack_start($notebook->{'WrapAfter'},0,0,5);
$page1_quotepre = new Gtk::Label("Put the following line in front of Quoted Messages:\n(%n and %d will be replaced with Name and Date)");
$page1_quotepre->set_usize(400,38);
$page1_quotepre->set_alignment(0.0,0.5);
$page1_quotepre->set_line_wrap(1);
$page1_hbox5 = new Gtk::HBox(0,5);
$page1_hbox5->pack_start($page1_quotepre,0,0,5);
$notebook->{'QuoteHeader'} = new Gtk::Entry;
$notebook->{'QuoteHeader'}->set_text($prefs{'QuoteHeader'});
$notebook->{'QuoteHeader'}->set_editable('1');
$notebook->{'QuoteHeader'}->set_usize(400,22);
$page1_hbox6 = new Gtk::HBox(0,5);
$page1_hbox6->pack_start($notebook->{'QuoteHeader'},0,0,5);

$page1_quotewith = new Gtk::Label("Quote Character?");
$page1_quotewith->set_alignment(0.0,0.5);
$notebook->{'QuoteWith'} = new Gtk::Entry;
$notebook->{'QuoteWith'}->set_text($prefs{'QuoteWith'});
$notebook->{'QuoteWith'}->set_editable('1');
$notebook->{'QuoteWith'}->set_usize(35,22);
$page1_hbox7 = new Gtk::HBox(0,5);
$page1_hbox7->pack_start($page1_quotewith,0,0,0);
$page1_hbox7->pack_start($notebook->{'QuoteWith'},0,0,5);


$page1_vbox = new Gtk::VBox(0,5);
$page1_vbox->set_border_width(5);
$page1_vbox->pack_start($page1_hbox1,0,0,0);
$page1_vbox->pack_start($page1_hbox2,0,0,0);
$page1_vbox->pack_start($page1_hbox3,0,0,0);
$page1_vbox->pack_start($page1_hbox8,0,0,0);
$page1_vbox->pack_start($page1_hbox9,0,0,0);
$page1_vbox->pack_start($page1_hbox4,0,0,0);
$page1_vbox->pack_start($page1_hbox5,0,0,0);
$page1_vbox->pack_start($page1_hbox6,0,0,0);
$page1_vbox->pack_start($page1_hbox7,0,0,0);


#  Page Two of Notebook
$tab2_label = new Gtk::Label("Receive");
$page2_check1 = new Gtk::Label("Check mail every");
$page2_check1->set_alignment(0.0,0.5);
$page2_check2 = new Gtk::Label("Minutes (0 to disable)");
$page2_check2->set_alignment(0.0,0.5);
$notebook->{'AutoCheckTime'} = new Gtk::Entry;
$notebook->{'AutoCheckTime'}->set_text($prefs{'AutoCheckTime'});
$notebook->{'AutoCheckTime'}->set_editable('1');
$notebook->{'AutoCheckTime'}->set_usize(45,22);
$page2_hbox1 = new Gtk::HBox(0,5);
$page2_hbox1->pack_start($page2_check1,0,0,5);
$page2_hbox1->pack_start($notebook->{'AutoCheckTime'},0,0,0);
$page2_hbox1->pack_start($page2_check2,0,0,5);
$page2_rr = new Gtk::Label("Return Receipt");
$page2_rr->set_alignment(0.0,0.5);
$notebook->{'RetRecAsk'} = new Gtk::RadioButton("Ask");
$notebook->{'RetRecAlways'} = new Gtk::RadioButton("Always",$notebook->{'RetRecAsk'});
$notebook->{'RetRecNever'} = new Gtk::RadioButton("Never", $notebook->{'RetRecAlways'});
if (defined $prefs{'SendReceipt'} && $prefs{'SendReceipt'} eq "never"){
	$notebook->{'RetRecNever'}->set_active(1);
} elsif (defined $prefs{'SendReceipt'} && $prefs{'SendReceipt'} eq "all") {
	$notebook->{'RetRecAlways'}->set_active(1);
} else {
	$notebook->{'RetRecAsk'}->set_active(1);
}
$page2_hbox2 = new Gtk::HBox(0,5);
$page2_hbox2->pack_start($page2_rr,0,0,5);
$page2_hbox2->pack_start($notebook->{'RetRecAsk'},0,0,0);
$page2_hbox2->pack_start($notebook->{'RetRecAlways'},0,0,0);
$page2_hbox2->pack_start($notebook->{'RetRecNever'},0,0,0);
$page2_scoring = new Gtk::Label("Use Message Scoring System?");
$page2_scoring->set_alignment(0.0,0.5);
$notebook->{'Scoring'} = new Gtk::CheckButton();
$notebook->{'Scoring'}->set_usize(16,17);
if (defined $prefs{'Scoring'} && $prefs{'Scoring'} eq "y") {$notebook->{'Scoring'}->set_active('1'); }
if (defined $prefs{'Scoring'} && $prefs{'Scoring'} eq "n") {$notebook->{'Scoring'}->set_active('0'); }
$page2_hbox3 = new Gtk::HBox(0,5);
$page2_hbox3->pack_start($notebook->{'Scoring'},0,0,0);
$page2_hbox3->pack_start($page2_scoring,0,0,0);
$page2_import = new Gtk::Label("When importing mail, mark it as new?");
$page2_import->set_alignment(0.0,0.5);
$notebook->{'import'} = new Gtk::CheckButton();
$notebook->{'import'}->set_usize(16,17);
if (defined $prefs{'import'} && $prefs{'import'} eq "y") {$notebook->{'import'}->set_active('1'); }
if (defined $prefs{'import'} && $prefs{'import'} eq "n") {$notebook->{'import'}->set_active('0'); }
$page2_hbox7 =  new Gtk::HBox(0,5);
$page2_hbox7->pack_start($notebook->{'import'},0,0,0);
$page2_hbox7->pack_start($page2_import,0,0,0);
$page2_dupe = new Gtk::Label("Dupe check mails over all accounts?");
$page2_dupe->set_alignment(0.0,0.5);
$notebook->{'checkDupeOnAll'} = new Gtk::CheckButton();
$notebook->{'checkDupeOnAll'}->set_usize(16,17);
if (defined $prefs{'checkDupeOnAll'} && $prefs{'checkDupeOnAll'} eq "y") {$notebook->{'checkDupeOnAll'}->set_active('1'); }
if (defined $prefs{'checkDupeOnAll'} && $prefs{'checkDupeOnAll'} eq "n") {$notebook->{'checkDupeOnAll'}->set_active('0'); }
$page2_hbox8 =  new Gtk::HBox(0,5);
$page2_hbox8->pack_start($notebook->{'checkDupeOnAll'},0,0,0);
$page2_hbox8->pack_start($page2_dupe,0,0,0);
$page2_sound = new Gtk::Label("Play sound if I have new mail?");
$page2_sound->set_alignment(0.0,0.5);
$notebook->{'PlaySound'} = new Gtk::CheckButton();
$notebook->{'PlaySound'}->set_usize(16,17);
if (defined $prefs{'PlaySound'} && $prefs{'PlaySound'} eq "y") {$notebook->{'PlaySound'}->set_active('1');  }
if (defined $prefs{'PlaySound'} && $prefs{'PlaySound'} eq "n") {$notebook->{'PlaySound'}->set_active('0'); }

$page2_hbox4 = new Gtk::HBox(0,5);
$page2_hbox4->pack_start($notebook->{'PlaySound'},0,0,0);
$page2_hbox4->pack_start($page2_sound,0,0,0);
$page2_sndcmd = new Gtk::Label("Sound Command: ");
$page2_sndcmd->set_alignment(0.0,0.5);
$notebook->{'SndCmd'} = new Gtk::Entry;
$notebook->{'SndCmd'}->set_usize(120,22);

if (defined $prefs{'SndCmd'}) { $notebook->{'SndCmd'}->set_text($prefs{'SndCmd'}); }

$page2_hbox5 = new Gtk::HBox(0,5);
$page2_hbox5->pack_start($page2_sndcmd,0,0,5);
$page2_hbox5->pack_start($notebook->{'SndCmd'},0,0,5);

$page2_sndfl = new Gtk::Label("Sound File: ");
$page2_sndfl->set_alignment(0.0,0.5);
$notebook->{'SndFl'} = new Gtk::Entry;
$notebook->{'SndFl'}->set_usize(220,22);

if (defined $prefs{'SndFl'}) { $notebook->{'SndFl'}->set_text($prefs{'SndFl'}) ;}

$page2_hbox6 = new Gtk::HBox(0,5);
$page2_hbox6->pack_start($page2_sndfl,0,0,5);
$page2_hbox6->pack_start($notebook->{'SndFl'},0,0,5);

$page2_vbox = new Gtk::VBox(0,5);
$page2_vbox->set_border_width(5);
$page2_vbox->pack_start($page2_hbox1,0,0,0);
$page2_vbox->pack_start($page2_hbox2,0,0,0);
$page2_vbox->pack_start($page2_hbox3,0,0,0);
$page2_vbox->pack_start($page2_hbox7,0,0,0);
$page2_vbox->pack_start($page2_hbox8,0,0,0);
$page2_vbox->pack_start($page2_hbox4,0,0,0);
$page2_vbox->pack_start($page2_hbox5,0,0,0);
$page2_vbox->pack_start($page2_hbox6,0,0,0);

#  Page Three of Notebook
$tab3_label = new Gtk::Label("View");
$notebook->{'InlineImages'} = new Gtk::CheckButton();
if ($prefs{'InlineImages'} eq "y") { $notebook->{'InlineImages'}->set_active('1'); }
if ($prefs{'InlineImages'} eq "n") { $notebook->{'InlineImages'}->set_active('0'); }
$notebook->{'InlineImages'}->set_usize(16,17);
$page3_check1_lbl = new Gtk::Label("Display image attachments inline in the message view window?");
$page3_check1_lbl->set_alignment(0.0,0.5);
$page3_hbox1 = new Gtk::HBox(0,5);
$page3_hbox1->pack_start($notebook->{'InlineImages'},0,0,0);
$page3_hbox1->pack_start($page3_check1_lbl,0,0,0);
$notebook->{'InlineAttachments'} = new Gtk::CheckButton();
if ($prefs{'InlineAttachments'} eq "y") { $notebook->{'InlineAttachments'}->set_active('1'); }
if ($prefs{'InlineAttachments'} eq "n") { $notebook->{'InlineAttachments'}->set_active('0'); }
$notebook->{'InlineAttachments'}->set_usize(16,17);
$page3_check12_lbl = new Gtk::Label("Display attachments inline in the message view window?");
$page3_check12_lbl->set_alignment(0.0,0.5);
$page3_hbox12 = new Gtk::HBox(0,5);
$page3_hbox12->pack_start($notebook->{'InlineAttachments'},0,0,0);
$page3_hbox12->pack_start($page3_check12_lbl,0,0,0);
$notebook->{'InlineIcons'} = new Gtk::CheckButton();
if ($prefs{'InlineIcons'} eq "y") { $notebook->{'InlineIcons'}->set_active('1'); }
if ($prefs{'InlineIcons'} eq "n") { $notebook->{'InlineIcons'}->set_active('0'); }
$notebook->{'InlineIcons'}->set_usize(16,17);
$page3_check13_lbl = new Gtk::Label("Display icons for attachments inline with the message view window?");
$page3_check13_lbl->set_alignment(0.0,0.5);
$page3_hbox13 = new Gtk::HBox(0,5);
$page3_hbox13->pack_start($notebook->{'InlineIcons'},0,0,0);
$page3_hbox13->pack_start($page3_check13_lbl,0,0,0);
$notebook->{'FolderNewBold'} = new Gtk::CheckButton();
if ($prefs{'FolderNewBold'} eq "y") { $notebook->{'FolderNewBold'}->set_active('1'); }
if ($prefs{'FolderNewBold'} eq "n") { $notebook->{'FolderNewBold'}->set_active('0'); }
$notebook->{'FolderNewBold'}->set_usize(16,17);
$page3_check2_lbl = new Gtk::Label("Change folder font if it contains new mail?");
$page3_check2_lbl->set_alignment(0.0,0.5);
$page3_hbox2 = new Gtk::HBox(0,5);
$page3_hbox2->pack_start($notebook->{'FolderNewBold'},0,0,0);
$page3_hbox2->pack_start($page3_check2_lbl,0,0,0);
$notebook->{'DeleteMarksAsRead'} = new Gtk::CheckButton();
$notebook->{'DeleteMarksAsRead'}->set_usize(16,17); 
if ($prefs{'DeleteMarksAsRead'} eq "y") { $notebook->{'DeleteMarksAsRead'}->set_active('1'); } 
if ($prefs{'DeleteMarksAsRead'} eq "n") { $notebook->{'DeleteMarksAsRead'}->set_active('0'); }
$page3_check3_lbl = new Gtk::Label("Deleting new messages marks them as read?");
$page3_check3_lbl->set_alignment(0.0,0.5);
$page3_hbox8 = new Gtk::HBox(0,5);
$page3_hbox8->pack_start($notebook->{'DeleteMarksAsRead'},0,0,0);
$page3_hbox8->pack_start($page3_check3_lbl,0,0,0);
$page3_mra1 = new Gtk::Label("Mark messages as read in viewpane after");
$page3_mra1->set_alignment(0.0,0.5);
$notebook->{'MarkAsReadDelay'} = new Gtk::Entry;
$notebook->{'MarkAsReadDelay'}->set_editable('1');
$notebook->{'MarkAsReadDelay'}->set_text($prefs{'MarkAsReadDelay'});
$notebook->{'MarkAsReadDelay'}->set_usize(35,22);
$page3_mra2 = new Gtk::Label("seconds.");
$page3_mra2->set_alignment(0.0,0.5);
$page3_hbox3 = new Gtk::HBox(0,5);
$page3_hbox3->pack_start($page3_mra1,0,0,5);
$page3_hbox3->pack_start($notebook->{'MarkAsReadDelay'},0,0,0);
$page3_hbox3->pack_start($page3_mra2,0,0,5);
$page3_print = new Gtk::Label("Print Command");
$page3_print->set_alignment(0.0,0.5);
$notebook->{'PrintCommand'} = new Gtk::Entry;
$notebook->{'PrintCommand'}->set_editable('1');
$notebook->{'PrintCommand'}->set_text($prefs{'PrintCommand'});
$notebook->{'PrintCommand'}->set_usize(120,22);
$page3_hbox5 = new Gtk::HBox(0,5);
$page3_hbox5->pack_start($page3_print,0,0,5);
$page3_hbox5->pack_start($notebook->{'PrintCommand'},0,0,5);
$page3_date = new Gtk::Label("Date format: (%M = Month, %d = Day, %y = 2 digit Year, %Y = 4 digit year, %h = Hour, %m = Minute, %s = Second)");
$page3_date->set_usize(400,38);
$page3_date->set_line_wrap(1);
$page3_date->set_alignment(0.0,0.5);
$page3_hbox6 = new Gtk::HBox(0,5);
$page3_hbox6->pack_start($page3_date,0,0,5);
$notebook->{'DateDisplayFormat'} =  new Gtk::Entry;
$notebook->{'DateDisplayFormat'}->set_text($prefs{'DateDisplayFormat'});
$notebook->{'DateDisplayFormat'}->set_editable('1');
$notebook->{'DateDisplayFormat'}->set_usize(200,22);
$page3_hbox7 = new Gtk::HBox(0,5);
$page3_hbox7->pack_start($notebook->{'DateDisplayFormat'},0,0,5);
$notebook->{'saveSize'} = new Gtk::CheckButton();
if ($prefs{'saveSize'} eq "y") { $notebook->{'saveSize'}->set_active('1'); }
if ($prefs{'saveSize'} eq "n") { $notebook->{'saveSize'}->set_active('0'); }
$notebook->{'saveSize'}->set_usize(16,17);
$page3_check9_lbl = new Gtk::Label("Save window size on exit");
$page3_check9_lbl->set_alignment(0.0,0.5);
$page3_hbox9 = new Gtk::HBox(0,5);
$page3_hbox9->pack_start($notebook->{'saveSize'},0,0,0);
$page3_hbox9->pack_start($page3_check9_lbl,0,0,0);
$notebook->{'useAlternateViewer'} = new Gtk::CheckButton();
if ($prefs{'useAlternateViewer'} eq "y") { $notebook->{'useAlternateViewer'}->set_active('1'); }
if ($prefs{'useAlternateViewer'} eq "n") { $notebook->{'useAlternateViewer'}->set_active('0'); }
$notebook->{'useAlternateViewer'}->set_usize(16,17);
$page3_check10_lbl = new Gtk::Label("Use Netscape with GtkHTML");
$page3_check10_lbl->set_alignment(0.0,0.5);
$page3_hbox10 = new Gtk::HBox(0,5);
$page3_hbox10->pack_start($notebook->{'useAlternateViewer'},0,0,0);
$page3_hbox10->pack_start($page3_check10_lbl,0,0,0);
$notebook->{'attachLeftView'} = new Gtk::CheckButton();
if ($prefs{'attachLeftView'} eq "y") { $notebook->{'attachLeftView'}->set_active('1'); }
if ($prefs{'attachLeftView'} eq "n") { $notebook->{'attachLeftView'}->set_active('0'); }
$notebook->{'attachLeftView'}->set_usize(16,17);
$page3_check11_lbl = new Gtk::Label("Left Click on Attachment opens Viewer instead of Save");
$page3_check11_lbl->set_alignment(0.0,0.5);
$page3_hbox11 = new Gtk::HBox(0,5);
$page3_hbox11->pack_start($notebook->{'attachLeftView'},0,0,0);
$page3_hbox11->pack_start($page3_check11_lbl,0,0,0);         

$page3_vbox = new Gtk::VBox(0,5);
$page3_vbox->set_border_width(5);
$page3_vbox->pack_start($page3_hbox1,0,0,0);
$page3_vbox->pack_start($page3_hbox12,0,0,0);
$page3_vbox->pack_start($page3_hbox13,0,0,0);
$page3_vbox->pack_start($page3_hbox2,0,0,0);
$page3_vbox->pack_start($page3_hbox8,0,0,0);
$page3_vbox->pack_start($page3_hbox9,0,0,0);
$page3_vbox->pack_start($page3_hbox10,0,0,0);
$page3_vbox->pack_start($page3_hbox11,0,0,0);
$page3_vbox->pack_start($page3_hbox3,0,0,0);
$page3_vbox->pack_start($page3_hbox5,0,0,0);
$page3_vbox->pack_start($page3_hbox6,0,0,0);
$page3_vbox->pack_start($page3_hbox7,0,0,0);

#  Page Four of Notebook
$tab4_label = new Gtk::Label("Database");
$page4_label = new Gtk::Label("Database Driver (CSV, Pg, mysql..)");
$page4_label->set_alignment(0.0,0.5);
$notebook->{'DatabaseDriver'} = new Gtk::Entry;
$notebook->{'DatabaseDriver'}->set_editable('1');
$notebook->{'DatabaseDriver'}->set_text($prefs{'DatabaseDriver'});
$page4_hbox1 = new Gtk::HBox(0,5);
$page4_hbox1->pack_start($page4_label,0,0,5);
$page4_hbox1->pack_start($notebook->{'DatabaseDriver'},0,0,5);
$page4_label2 = new Gtk::Label("Database Username");
$page4_label2->set_alignment(0.0,0.5);
$notebook->{'DatabaseUser'} = new Gtk::Entry;
$notebook->{'DatabaseUser'}->set_editable('1');
if (defined $prefs{'DatabaseUser'}) {
	$notebook->{'DatabaseUser'}->set_text($prefs{'DatabaseUser'});
}
$page4_hbox2 = new Gtk::HBox(0,5);
$page4_hbox2->pack_start($page4_label2,0,0,5);
$page4_hbox2->pack_start($notebook->{'DatabaseUser'},0,0,5);
$page4_label3 = new Gtk::Label("Database Username Password");
$page4_label3->set_alignment(0.0,0.5);
$notebook->{'DatabasePassword'} = new Gtk::Entry;
$notebook->{'DatabasePassword'}->set_editable('1');
$notebook->{'DatabasePassword'}->set_visibility('0');
if (defined $prefs{'DatabasePassword'}) {
	$notebook->{'DatabasePassword'}->set_text($prefs{'DatabasePassword'});
}
$page4_hbox3 = new Gtk::HBox(0,5);
$page4_hbox3->pack_start($page4_label3,0,0,5);
$page4_hbox3->pack_start($notebook->{'DatabasePassword'},0,0,5);
$page4_vbox = new Gtk::VBox(0,5);
$page4_vbox->set_border_width(5);
$page4_vbox->pack_start($page4_hbox1,0,0,0);
$page4_vbox->pack_start($page4_hbox2,0,0,0);
$page4_vbox->pack_start($page4_hbox3,0,0,0);

#  Page Five of Notebook
$tab5_label = new Gtk::Label("Fonts");
$page5_fm_label = new Gtk::Label("Font used for new items:");
$page5_fm_label->set_alignment(0.0,0.5);
$page5_hbox1 = new Gtk::HBox(0,5);
$page5_hbox1->pack_start($page5_fm_label,0,0,5);
$notebook->{'FontMLBold'} = new Gtk::Entry;
$notebook->{'FontMLBold'}->set_editable('0');
$notebook->{'FontMLBold'}->set_text($prefs{'FontMLBold'});
$page5_fn_but = new Gtk::Button("Change");
$page5_fn_but->signal_connect("clicked" => \&init_font_dlg, $notebook->{'FontMLBold'});
$page5_fn_but->set_usize(55,25);
$page5_hbox2 = new Gtk::HBox(0,5);
$page5_hbox2->pack_start($notebook->{'FontMLBold'},1,1,5);
$page5_hbox2->pack_end($page5_fn_but,0,0,5);
$page5_fm_label2 = new Gtk::Label("Font used for normal items:");
$page5_fm_label2->set_alignment(0.0,0.5);
$page5_hbox3 = new Gtk::HBox(0,5);
$page5_hbox3->pack_start($page5_fm_label2,0,0,5);
$notebook->{'FontMLNormal'} = new Gtk::Entry;
$notebook->{'FontMLNormal'}->set_editable('0');
$notebook->{'FontMLNormal'}->set_text($prefs{'FontMLNormal'});
$page5_fn_but2 = new Gtk::Button("Change");
$page5_fn_but2->signal_connect("clicked" => \&init_font_dlg, $notebook->{'FontMLNormal'});
$page5_fn_but2->set_usize(55,25);
$page5_hbox4 = new Gtk::HBox(0,5);
$page5_hbox4->pack_start($notebook->{'FontMLNormal'},1,1,5);
$page5_hbox4->pack_end($page5_fn_but2,0,0,5);
$page5_fm_label3 = new Gtk::Label("Font used to display messages (Not implimented)");
$page5_fm_label3->set_alignment(0.0,0.5);
$page5_hbox5 = new Gtk::HBox(0,5);
$page5_hbox5->pack_start($page5_fm_label3,0,0,5);
$notebook->{'FontMessages'} = new Gtk::Entry;
$notebook->{'FontMessages'}->set_text($prefs{'FontMessages'});
$notebook->{'FontMessages'}->set_editable('0');
$page5_fn_but3 = new Gtk::Button("Change");
$page5_fn_but3->signal_connect("clicked" => \&init_font_dlg, $notebook->{'FontMessages'});
$page5_fn_but3->set_usize(55,25);
$page5_hbox6 =  new Gtk::HBox(0,5);
$page5_hbox6->pack_start($notebook->{'FontMessages'},1,1,5);
$page5_hbox6->pack_end($page5_fn_but3,0,0,5);
$page5_fm_label4 = new Gtk::Label("Font used for labels in the Header Panel");
$page5_fm_label4->set_alignment(0.0,0.5);
$page5_hbox7 = new Gtk::HBox(0,5);
$page5_hbox7->pack_start($page5_fm_label4,0,0,5);
$notebook->{'FontUIBold'} = new Gtk::Entry;
$notebook->{'FontUIBold'}->set_editable('0');
$notebook->{'FontUIBold'}->set_text($prefs{'FontUIBold'});
$page5_fn_but4 = new Gtk::Button("Change");
$page5_fn_but4->signal_connect("clicked" => \&init_font_dlg, $notebook->{'FontUIBold'});
$page5_fn_but4->set_usize(55,25);
$page5_hbox8 = new Gtk::HBox(0,5);
$page5_hbox8->pack_start($notebook->{'FontUIBold'},1,1,5);
$page5_hbox8->pack_end($page5_fn_but4,0,0,5);
$page5_vbox = new Gtk::VBox(0,5);
$page5_vbox->set_border_width(5);
$page5_vbox->pack_start($page5_hbox1,0,0,0);
$page5_vbox->pack_start($page5_hbox2,0,0,0);
$page5_vbox->pack_start($page5_hbox3,0,0,0);
$page5_vbox->pack_start($page5_hbox4,0,0,0);
$page5_vbox->pack_start($page5_hbox5,0,0,0);
$page5_vbox->pack_start($page5_hbox6,0,0,0);
$page5_vbox->pack_start($page5_hbox7,0,0,0);
$page5_vbox->pack_start($page5_hbox8,0,0,0);
# page 6
$tab6_label=new Gtk::Label("Paths");
$page6_label2=new Gtk::Label("Ispell or Aspell Path");
$page6_label2->set_alignment(0.0,0.5);
$page6_hbox3=new Gtk::HBox(0,5);
$page6_hbox3->pack_start($page6_label2,0,0,5);
$notebook->{'ispellpath'} = new Gtk::Entry;
$notebook->{'ispellpath'}->set_text($prefs{'ispellpath'});
$page6_button2=new Gtk::Button("Browse");
$page6_button2->signal_connect("clicked" => \&init_browse_dlg, $notebook->{'ispellpath'}, "ispell_path");
$page6_button2->set_usize(55,25);
$page6_hbox4=new Gtk::HBox(0,5);
$page6_hbox4->pack_start($notebook->{'ispellpath'},1,1,5);
$page6_hbox4->pack_end($page6_button2,0,0,5);
$page6_label3 = new Gtk::Label("Path to Netscape (XmHTML and Alternate Viewer for GtkHTML)");
$page6_label3->set_alignment(0.0,0.5);
$page6_hbox5 = new Gtk::HBox(0,5);
$page6_hbox5->pack_start($page6_label3,0,0,5);
$notebook->{'ViewerPath'} = new Gtk::Entry;
$notebook->{'ViewerPath'}->set_text($prefs{'ViewerPath'});
$page6_button3=new Gtk::Button("Browse");
$page6_button3->signal_connect("clicked" => \&init_browse_dlg, $notebook->{'ViewerPath'}, "viewer_path");
$page6_button3->set_usize(55,25);
$page6_hbox6=new Gtk::HBox(0,5);
$page6_hbox6->pack_start($notebook->{'ViewerPath'},1,1,5);
$page6_hbox6->pack_end($page6_button3,0,0,5);
$page6_vbox = new Gtk::VBox(0,5);
$page6_vbox->set_border_width(5);
$page6_vbox->pack_start($page6_hbox3,0,0,0);
$page6_vbox->pack_start($page6_hbox4,0,0,0);
$page6_vbox->pack_start($page6_hbox5,0,0,0);
$page6_vbox->pack_start($page6_hbox6,0,0,0);

# page 7
$tab7_label=new Gtk::Label("Web Browser");
$page7_homepage = new Gtk::Label("Homepage");
$page7_homepage->set_alignment(0.0,0.5);
$notebook->{'HomePage'} =  new Gtk::Entry;
$notebook->{'HomePage'}->set_text($prefs{'HomePage'});
$notebook->{'HomePage'}->set_usize(250,22);
$page7_hbox1 = new Gtk::HBox(0,5);
$page7_hbox1->pack_start($page7_homepage,0,0,5);
$page7_hbox1->pack_start($notebook->{'HomePage'},0,0,5);
$page7_proxy=new Gtk::Label("Proxy Server");
$page7_proxy->set_alignment(0.0,0.5);
$notebook->{'Proxy'} = new Gtk::Entry;
$notebook->{'Proxy'}->set_usize(250,22);

if (defined $prefs{'Proxy'}) {
	$notebook->{'Proxy'}->set_text($prefs{'Proxy'});
}
$page7_hbox2=new Gtk::HBox(0,5);
$page7_hbox2->pack_start($page7_proxy,0,0,5);
$page7_hbox2->pack_start($notebook->{'Proxy'},0,0,5);
$page7_proxyport=new Gtk::Label("Proxy Port");
$page7_proxyport->set_alignment(0.0,0.5);
$notebook->{'ProxyPort'} = new Gtk::Entry;
$notebook->{'ProxyPort'}->set_usize(50,22);
if (defined $prefs{'ProxyPort'}) {
	$notebook->{'ProxyPort'}->set_text($prefs{'ProxyPort'});
}
$page7_hbox3=new Gtk::HBox(0,5);
$page7_hbox3->pack_start($page7_proxyport,0,0,5);
$page7_hbox3->pack_start($notebook->{'ProxyPort'},0,0,5);
$page7_vbox = new Gtk::VBox(0,5);
$page7_vbox->set_border_width(5);
$page7_vbox->pack_start($page7_hbox1,0,0,0);
$page7_vbox->pack_start($page7_hbox2,0,0,0);
$page7_vbox->pack_start($page7_hbox3,0,0,0);
#page8

my ($tab8_label, $msg_label, $color1_label, $color1_button, 
$color2_label, $color2_button,$color3_label, $color3_button, $color4_label, $color4_button, $color5_label, $color5_button, $quote_lbl, 
$page8_hbox, $page8_hbox1, $page8_hbox2, $page8_hbox3, $page8_hbox4, $page8_hbox5, $page8_hbox6, 
$page8_vbox, $default);

$tab8_label=new Gtk::Label("Message Colors");
$notebook->{'msgcolors'} = new Gtk::CheckButton;
$notebook->{'msgcolors'}->set_usize(16,17);
if ($prefs{'UseMessageColors'} eq "y") { $notebook->{'msgcolors'}->set_active(1)}
if ($prefs{'UseMessageColors'} eq "n") { $notebook->{'msgcolors'}->set_active(0) }
$msg_label = new Gtk::Label("Colorize Messages?");
$msg_label->set_alignment(0.0,0.5);
$page8_hbox = new Gtk::HBox(0,5);
$page8_hbox->pack_start($notebook->{'msgcolors'},0,0,0);
$page8_hbox->pack_start($msg_label,0,0,0);
$page8_vbox = new Gtk::VBox(0,5);
$page8_vbox->set_border_width(5);
$quote_lbl = new Gtk::Label("Color replies based on these symbols, seperate by commas.");
$quote_lbl->set_alignment(0.0,0.5);
$notebook->{'QuoteSymbol'} = new Gtk::Entry;
$notebook->{'QuoteSymbol'}->set_usize(60,22);
$notebook->{'QuoteSymbol'}->set_text($prefs{'QuoteSymbols'});
$notebook->{'QuoteSymbol'}->set_editable(1);
$page8_hbox1 = new Gtk::HBox(0,5);
$page8_hbox1->pack_start($quote_lbl,0,0,0);
$page8_hbox1->pack_start($notebook->{'QuoteSymbol'},0,0,0);
$color1_label = new Gtk::Label("Message Color ");
$color1_label->set_alignment(0.0,0.5);
$notebook->{'MessageColor'} = new Gtk::Entry;
$notebook->{'MessageColor'}->set_editable(0);
$notebook->{'MessageColor'}->set_text($prefs{'MessageColor'});
$notebook->{'MessageColor'}->set_usize(60,22);
$color1_button = new Gtk::Button("Change");
$color1_button->signal_connect("clicked" => \&select_color, $notebook->{'MessageColor'}, "message");
$default->{'color1'} = new Gtk::Button("Default");
$default->{'color1'}->signal_connect("clicked", sub { $notebook->{'MessageColor'}->set_text("000000")});
$page8_hbox2 = new Gtk::HBox(0,5);
$page8_hbox2->pack_start($color1_label,0,0,0);
$page8_hbox2->pack_start($notebook->{'MessageColor'},0,0,0);
$page8_hbox2->pack_start($color1_button,0,0,0);
$page8_hbox2->pack_start($default->{'color1'},0,0,0);
$color2_label= new Gtk::Label("Quote Color 1  ");
$color2_label->set_alignment(0.0,0.5);
$notebook->{'QuoteColor1'} = new Gtk::Entry;
$notebook->{'QuoteColor1'}->set_text($prefs{'QuoteColor1'});
$notebook->{'QuoteColor1'}->set_usize(60,22);
$notebook->{'QuoteColor1'}->set_editable(0);
$color2_button = new Gtk::Button("Change");
$color2_button->signal_connect("clicked" => \&select_color, $notebook->{'QuoteColor1'}, "quote1");
$default->{'color2'} = new Gtk::Button("Default");
$default->{'color2'}->signal_connect("clicked", sub { $notebook->{'QuoteColor1'}->set_text("FF0000");});
$page8_hbox3 = new Gtk::HBox(0,5);
$page8_hbox3->pack_start($color2_label,0,0,0);
$page8_hbox3->pack_start($notebook->{'QuoteColor1'},0,0,0);
$page8_hbox3->pack_start($color2_button,0,0,0);
$page8_hbox3->pack_start($default->{'color2'},0,0,0);
$color3_label= new Gtk::Label("Quote Color 2 ");
$color3_label->set_alignment(0.0,0.5);
$notebook->{'QuoteColor2'} = new Gtk::Entry;
$notebook->{'QuoteColor2'}->set_text($prefs{'QuoteColor2'});
$notebook->{'QuoteColor2'}->set_usize(60,22);
$notebook->{'QuoteColor2'}->set_editable(0);
$color3_button = new Gtk::Button("Change");
$color3_button->signal_connect("clicked" => \&select_color, $notebook->{'QuoteColor2'}, "quote2");
$default->{'color3'} = new Gtk::Button("Default");
$default->{'color3'}->signal_connect("clicked", sub { $notebook->{'QuoteColor2'}->set_text("0000FF");});
$page8_hbox4 = new Gtk::HBox(0,5);
$page8_hbox4->pack_start($color3_label,0,0,0);
$page8_hbox4->pack_start($notebook->{'QuoteColor2'},0,0,0);
$page8_hbox4->pack_start($color3_button,0,0,0);
$page8_hbox4->pack_start($default->{'color3'},0,0,0);
$color4_label= new Gtk::Label("Quote Color 3 ");
$color4_label->set_alignment(0.0,0.5);
$notebook->{'QuoteColor3'} = new Gtk::Entry;
$notebook->{'QuoteColor3'}->set_text($prefs{'QuoteColor3'});
$notebook->{'QuoteColor3'}->set_usize(60,22);
$notebook->{'QuoteColor3'}->set_editable(0);
$color4_button = new Gtk::Button("Change");
$color4_button->signal_connect("clicked" => \&select_color, $notebook->{'QuoteColor3'}, "quote3");
$default->{'color4'} = new Gtk::Button("Default");
$default->{'color4'}->signal_connect("clicked", sub { $notebook->{'QuoteColor3'}->set_text("FF00FF");});
$page8_hbox5 = new Gtk::HBox(0,5);
$page8_hbox5->pack_start($color4_label,0,0,0);
$page8_hbox5->pack_start($notebook->{'QuoteColor3'},0,0,0);
$page8_hbox5->pack_start($color4_button,0,0,0);
$page8_hbox5->pack_start($default->{'color4'},0,0,0);
$color5_label = new Gtk::Label("Body Color       ");
$color5_label->set_alignment(0.0,0.5);
$notebook->{'MessageBgColor'} = new Gtk::Entry;
$notebook->{'MessageBgColor'}->set_editable(0);
$notebook->{'MessageBgColor'}->set_text($prefs{'MessageBgColor'});
$notebook->{'MessageBgColor'}->set_usize(60,22);
$color5_button = new Gtk::Button("Change");
$color5_button->signal_connect("clicked" => \&select_color, $notebook->{'MessageBgColor'}, "bg");
$default->{'color5'} = new Gtk::Button("Default");
$default->{'color5'}->signal_connect("clicked", sub { $notebook->{'MessageBgColor'}->set_text("FFFFFF");});
$page8_hbox6 = new Gtk::HBox(0,5);
$page8_hbox6->pack_start($color5_label,0,0,0);
$page8_hbox6->pack_start($notebook->{'MessageBgColor'},0,0,0);
$page8_hbox6->pack_start($color5_button,0,0,0);
$page8_hbox6->pack_start($default->{'color5'},0,0,0);
$page8_vbox->pack_start($page8_hbox,0,0,0);
$page8_vbox->pack_start($page8_hbox1,0,0,0);
$page8_vbox->pack_start($page8_hbox2,0,0,0);
$page8_vbox->pack_start($page8_hbox3,0,0,0); 
$page8_vbox->pack_start($page8_hbox4,0,0,0);
$page8_vbox->pack_start($page8_hbox5,0,0,0);
$page8_vbox->pack_start($page8_hbox6,0,0,0);

# Main View
$notebook->append_page($page1_vbox, $tab1_label);
$notebook->append_page($page2_vbox, $tab2_label);
$notebook->append_page($page3_vbox, $tab3_label);
$notebook->append_page($page4_vbox, $tab4_label);
$notebook->append_page($page5_vbox, $tab5_label);
$notebook->append_page($page6_vbox, $tab6_label);
$notebook->append_page($page7_vbox, $tab7_label);
$notebook->append_page($page8_vbox, $tab8_label);
$ok_but = new Gtk::Button("OK");
$ok_but->set_usize(55,25);
$ok_but->signal_connect("clicked" => \&update_conf, $main, $notebook);
$cancel_but = new Gtk::Button("Cancel");
$cancel_but->signal_connect("clicked", sub {$main->destroy;});
$cancel_but->set_usize(55,25);
$help_but = new Gtk::Button("Help");
$help_but->signal_connect("clicked" => \&help_view_win, "option.html" );
$help_but->set_usize(55,25);
$hbox_but = new Gtk::HBox(0,5);
$hbox_but->pack_start($ok_but,1,0,0);
$hbox_but->pack_start($cancel_but,1,0,0);
$hbox_but->pack_start($help_but,1,0,0);
$vbox1 = new Gtk::VBox(0,5);
$vbox1->set_border_width(5);
$vbox1->pack_start($notebook,1,1,0);
$vbox1->pack_start($hbox_but,0,0,0);

$main->add($vbox1);

show_all $main;
$main->signal_connect("size-request" => \&save_win_size, "config", $main->window);

return 1;
}

sub select_color {
my ($widget, $entry, $name) = @_;
my ($dialog,$colorsel);
if ($name eq "quote1") {
$dialog = new Gtk::ColorSelectionDialog("Select Quote Color 1");
}
if ($name eq "quote2") {
$dialog = new Gtk::ColorSelectionDialog("Select Quote Color 2");
}
if ($name eq "quote3") {
$dialog = new Gtk::ColorSelectionDialog("Select Quote Color 3");
}
if ($name eq "message") {
$dialog = new Gtk::ColorSelectionDialog("Select Message text Color");
}
if ($name eq "bg") {
$dialog = new Gtk::ColorSelectionDialog("Select Body Background Color");
}
$dialog->show;
$colorsel = $dialog->colorsel;
$dialog->signal_connect("destroy", sub { $dialog->destroy; });
$dialog->signal_connect("delete_event" => \&Gtk::false);
$dialog->ok_button->signal_connect("clicked", sub { $dialog->destroy; });
$dialog->cancel_button->signal_connect("clicked", sub { 
                                        if ($name eq "quote1") {
					$entry->set_text($prefs{'QuoteColor1'})
					}
					
					if ($name eq "quote2") {
                                        $entry->set_text($prefs{'QuoteColor2'})
                                        }

					if ($name eq "quote3") {
                                        $entry->set_text($prefs{'QuoteColor3'})
                                        }
					
					if ($name eq "message") {
					$entry->set_text($prefs{'MessageColor'})
					}
					
					if ($name eq "bg") {
					$entry->set_text($prefs{'MessageBgColor'});
					}
					
                                        $dialog->destroy;});
$colorsel->signal_connect("color_changed", sub { 
             
	     my @color=$colorsel->get_color();
	     my ($red, $green, $blue, $gdk_color);
	     

    $gdk_color->{ 'red' } = $color[0] * 65535.0;
    $gdk_color->{ 'green' } = $color[1] * 65535.0;
    $gdk_color->{ 'blue' } = $color[2] * 65535.0;
	    
          # Convert to HTML format
          $red = $gdk_color->{ 'red' } / 256;
          $green = $gdk_color->{ 'green' } / 256;
          $blue = $gdk_color->{ 'blue' } / 256;
			    
          $red = uc( sprintf( "%lx", $red ) );
	  $green = uc( sprintf( "%lx", $green ) );
          $blue = uc( sprintf( "%lx", $blue ) );
					
	  $red = "0" . $red if ( $red =~ /^\d$/ );
          $green = "0" . $green if ( $green =~ /^\d$/ );
	  $blue = "0" . $blue if ( $blue =~ /^\d$/ );
						    
          $entry->set_text($red.$green.$blue);});
}
								      
sub update_conf {
	my ($widget, $window, $notebook) = @_;
	$prefs{'AutoCheckTime'} = $notebook->{'AutoCheckTime'}->get_text;
	$prefs{'MarkAsReadDelay'} = $notebook->{'MarkAsReadDelay'}->get_text;
	$prefs{'DatabaseDriver'} = $notebook->{'DatabaseDriver'}->get_text;
	$prefs{'DatabaseUser'} = $notebook->{'DatabaseUser'}->get_text;
	$prefs{'DatabasePassword'} = $notebook->{'DatabasePassword'}->get_text;
	$prefs{'DateDisplayFormat'} = $notebook->{'DateDisplayFormat'}->get_text;
	$prefs{'QuoteHeader'} = $notebook->{'QuoteHeader'}->get_text;
	$prefs{'QuoteWith'} = $notebook->{'QuoteWith'}->get_text;
	$prefs{'HomePage'} = $notebook->{'HomePage'}->get_text;
	$prefs{'FontMLBold'} = $notebook->{'FontMLBold'}->get_text;
	$prefs{'FontMLNormal'} = $notebook->{'FontMLNormal'}->get_text;
	$prefs{'FontMessages'} = $notebook->{'FontMessages'}->get_text;
	$prefs{'FontUIBold'} = $notebook->{'FontUIBold'}->get_text;
	$prefs{'WrapAfter'} = $notebook->{'WrapAfter'}->get_text;
	$prefs{'ViewerPath'} = $notebook->{'ViewerPath'}->get_text;
	$prefs{'PrintCommand'} = $notebook->{'PrintCommand'}->get_text;
	$prefs{'Proxy'} = $notebook->{'Proxy'}->get_text;
	$prefs{'ProxyPort'} = $notebook->{'ProxyPort'}->get_text;
	$prefs{'SndCmd'} = $notebook->{'SndCmd'}->get_text;
	$prefs{'SndFl'} = $notebook->{'SndFl'}->get_text;
	$prefs{'ispellpath'} = $notebook->{'ispellpath'}->get_text;
	$prefs{'QuoteSymbols'} = $notebook->{'QuoteSymbol'}->get_text;
	$prefs{'MessageColor'} = $notebook->{'MessageColor'}->get_text;
	$prefs{'QuoteColor1'} = $notebook->{'QuoteColor1'}->get_text;
	$prefs{'QuoteColor2'} = $notebook->{'QuoteColor2'}->get_text;
	$prefs{'QuoteColor3'} = $notebook->{'QuoteColor3'}->get_text;
	$prefs{'MessageBgColor'} = $notebook->{'MessageBgColor'}->get_text;
	if($notebook->{'RetRecAsk'}->active){$prefs{'SendReceipt'}='ask';}
	if($notebook->{'RetRecAlways'}->active){$prefs{'SendReceipt'}='all';}
	if($notebook->{'RetRecNever'}->active){$prefs{'SendReceipt'}='never';}
	if ($notebook->{'SendImmediately'}->active) { $prefs{'SendImmediately'} = "y"; } else { $prefs{'SendImmediately'} = "n"; }
	if ($notebook->{'saveSize'}->active) { $prefs{'saveSize'} = "y"; } else { $prefs{'saveSize'} = "n"; }
        if ($notebook->{'useAlternateViewer'}->active) { $prefs{'useAlternateViewer'} = "y"; } else { $prefs{'useAlternateViewer'} = "n"; }
	if ($notebook->{'attachLeftView'}->active) { $prefs{'attachLeftView'} = "y"; } else { $prefs{'attachLeftView'} = "n"; }
	if ($notebook->{'Scoring'}->active) { $prefs{'Scoring'} = "y"; $message_clist->set_column_visibility(2, 1); } else { $prefs{'Scoring'} = "n"; $message_clist->set_column_visibility(2, 0); }
	if ($notebook->{'import'}->active) { $prefs{'import'} = "y"; } else { $prefs{'import'} = "n";}
	if ($notebook->{'checkDupeOnAll'}->active) { $prefs{'checkDupeOnAll'} = "y"; } else { $prefs{'checkDupeOnAll'} = "n";}
	if ($notebook->{'PlaySound'}->active) { $prefs{'PlaySound'} = "y"; } else { $prefs{'PlaySound'} = "n";}
	if ($notebook->{'InlineImages'}->active) { $prefs{'InlineImages'} = "y"; } else { $prefs{'InlineImages'} = "n";}
	if ($notebook->{'InlineAttachments'}->active) { $prefs{'InlineAttachments'} = "y"; } else { $prefs{'InlineAttachments'} = "n";}
	if ($notebook->{'InlineIcons'}->active) { $prefs{'InlineIcons'} = "y"; } else { $prefs{'InlineIcons'} = "n";}
	if ($notebook->{'FolderNewBold'}->active) { $prefs{'FolderNewBold'} = "y"; } else {$prefs{'FolderNewBold'} = "n";}
	if ($notebook->{'AddReplytoAB'}->active) { $prefs{'AddReplytoAB'} = "y";} else {$prefs{'AddReplytoAB'} = "n"; }
	if ($notebook->{'ForwardAttachments'}->active) { $prefs{'ForwardAttachments'} = "y";} else {$prefs{'ForwardAttachments'} = "n"; }
	if ($notebook->{'ForwardHeader'}->active) {$prefs{'ForwardHeader'} = "y";} else { $prefs{'ForwardHeader'} = "n"; }
        if ($notebook->{'autospell'}->active) {$prefs{'autospell'} = "y";} else { $prefs{'autospell'} = "n"; }
	if ($notebook->{'DeleteMarksAsRead'}->active) { $prefs{'DeleteMarksAsRead'} = "y"; } else { $prefs{'DeleteMarksAsRead'} = "n"; }
	if ($notebook->{'msgcolors'}->active) { $prefs{'UseMessageColors'} = "y"; } else { $prefs{'UseMessageColors'} = "n";}
	if ($check_timer) { Gtk->timeout_remove($check_timer); }
	if ($prefs{'AutoCheckTime'} > 0) {
		$check_timer = Gtk->timeout_add($prefs{'AutoCheckTime'}*60000, \&check_mail, 0, "all", "0");
	}
	&save_prefs;
	my $fontbold = Gtk::Gdk::Font->load($prefs{'FontMLBold'});
	my $fontnormal = Gtk::Gdk::Font->load($prefs{'FontMLNormal'});
	
#	$fontbold = Gtk::Gdk::Font->load($prefs{'FontMLBold'});
#	$fontnormal = Gtk::Gdk::Font->load($prefs{'FontMLNormal'});
	&refresh_folder_menus;
	&refresh_messages;
	$window->destroy;
	return 1;  
}

sub init_browse_dlg {
	my ($widget, $entry, $dlg_type) = @_;
	my ($fs_window);
	$fs_window = new Gtk::FileSelection "Choose Directory...";
	$fs_window->position(-mouse);
	$fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
	$fs_window->signal_connect("delete_event" => \&Gtk::false);
	if($dlg_type eq "ispell_path") {
		$fs_window->set_title("Select Ispell or Aspell path ...");
		$fs_window->ok_button->signal_connect("clicked", \&check_ispell_path, $fs_window, $entry);
	}
	elsif($dlg_type eq "viewer_path") {
                $fs_window->set_title("Select Viewer path ...");
                $fs_window->ok_button->signal_connect("clicked", \&check_viewer_path, $fs_window, $entry);
        }
	elsif($dlg_type eq "attachment_command") {
		$fs_window->set_title("Select Viewer ...");
		$fs_window->ok_button->signal_connect("clicked", \&check_view_attachment, $fs_window, $entry);
	}
	elsif($dlg_type eq "attachment_icon") {
                $fs_window->set_title("Select Icon ...");
                $fs_window->ok_button->signal_connect("clicked", \&check_icon_attachment, $fs_window, $entry);
        }
	$fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
	$fs_window->show;
	return 1;
}
 	 
 
sub check_pixmap_path {
	my ($dirname) = @_;
	
	my @pixmaps = ("about.xpm", "addressbook.xpm", "back.xpm", 
	"csc-icon.xpm", "down.xpm", "exclamation.xpm", "forward_flag.xpm", 
	"go.xpm",  "paperclip.xpm", "prefs.xpm", "reply_flag.xpm", 
	 "spellcheck.xpm", "tb_delete.xpm", "tb_forward.xpm", 
	"tb_new_mail.xpm", "tb_reply.xpm", "ab.xpm", "tb_replyall.xpm", 
	"tb_send.xpm", "top.xpm", "up.xpm");
	
         foreach (@pixmaps) { if (-f "$dirname/$_") { 
	 next;
       	 } else {
	 #print($_ . "\n");
	 return undef;}
	 }
return 1;
}

sub check_ispell_path {
        my ($widget, $fs_window, $entry) = @_;
	if (($fs_window->get_filename =~ /ispell/) || ($fs_window->get_filename =~ /aspell/)) {
		$entry->set_text($fs_window->get_filename);
                $fs_window->destroy;
                return 1;
        } else {
                &err_dialog("You must select the location of ispell");
                return 1;
        }
}

sub check_viewer_path {
        my ($widget, $fs_window, $entry) = @_;
        if ($fs_window->get_filename =~ /netscape/) {
                $entry->set_text($fs_window->get_filename);
                $fs_window->destroy;
                return 1;
        } else {
                &err_dialog("You must select the location of Netscape");
                return 1;
        }
}

sub check_view_attachment {
        my ($widget, $fs_window, $entry) = @_;
        if (-f $fs_window->get_filename) {
                $entry->set_text($fs_window->get_filename . " \%f");
                $fs_window->destroy;
                return 1;
        } else {
                &err_dialog("You must select a Viewer");
                return 1;
        }
}

sub check_icon_attachment {
        my ($widget, $fs_window, $entry) = @_;
        if ((-f $fs_window->get_filename) && ($fs_window->get_filename =~ /(bmp|gif|jpg|jpeg|png)$/i)) {
                $entry->set_text($fs_window->get_filename());
                $fs_window->destroy;
                return 1;
        } else {
                &err_dialog("You must select a Icon");
                return 1;
        }
}


sub init_font_dlg {
	my ($widget, $entry) = @_;
	my ($font_dlg);
	$font_dlg = new Gtk::FontSelectionDialog("Select Font");
	$font_dlg->position(-mouse);
	$font_dlg->set_font_name($entry->get_text);
	$font_dlg->set_preview_text("CSCMail $version");
	$font_dlg->signal_connect("destroy", sub {$font_dlg->destroy;});
	$font_dlg->ok_button->signal_connect("clicked", sub {$entry->set_text($font_dlg->get_font_name()); $font_dlg->destroy; return 1;});
	$font_dlg->cancel_button->signal_connect("clicked", sub {$font_dlg->destroy;});
	$font_dlg->show;
}

# view_message is gonna take a msgid, and a widget, and a "content
# type"  and then its gonna work miracles on the msgid, and dump the
# part with the appropriate content type into the widget.
#
# it will also take an "attachment menu" and if found, it'll fill that
# menu with any attachments found as it mangles the message.
#
# it will also take a "header view pane" and if found, it'll fill that
# pane with relevent info (subject, to, cc, date, from)
# 
# vtype is numeric ... 1 == HTML, 2 == Text, 3 == HTML/headeronly
#                      4 == Text/headeronly
#
# quote is a flag for text output.. do we quote it? 1/0
#
sub view_message {
	my ($conn, $msgid, $output_widget, $vtype, $quote, $attach_menu, $view_attach_menu, $hdr_pane, $attach_clist, $forrep, $printh) = @_;
	my ($io, $type, $body, $num_parts, $file, $part, @inlineimages, @inlineattach, $view_part, $sql, $query, $header, @parts, $url, $image, $attach);
# whatever called us has a header pane setup, so lets fill in it's info
#

	if (defined $hdr_pane) {
# lets suck some info in from the db about the message
		$sql = "select sentfrom, sentto, date, subject, cc, contenttype from messages where id=?";
		$query=$conn->prepare($sql);
		$query->execute($msgid);
		my ($from, $to, $date, $subject, $cc, $ct) = $query->fetchrow_array();
		$hdr_pane->{'to_lbl'}->set_text($to);
		$hdr_pane->{'from_lbl'}->set_text($from);
		$hdr_pane->{'date_lbl'}->set_text($date);
		$hdr_pane->{'subj_lbl'}->set_text($subject);
		$hdr_pane->{'cc_lbl'}->set_text($cc);
	        if ($ct && ($ct !~ /text/i && $ct !~ /alternative/i && $ct !~ /multipart\/report/i)) { $test->show; } else { $test->hide;}
	}

# is there a global entity object for this msgid already open?
# if so, we use it, otherwise make a new one....

	if (not defined $entity{$msgid}) {
		$file = &filename_to_tree("$prefs{'MailDir'}/$msgid");
		if (open (FILE,"<$file")) {
			$entity{$msgid}=$parser->read(\*FILE);
			close(FILE);
		} else {
			&err_dialog("Unable to open msg file for parsing");
		}
	}

# We got an attachment menu, lets clear it out....

	if (defined $attach_menu) {
		foreach (@{$attach_menu->{'items'}}) {
			$_->destroy;
		}
	        foreach (@{$attach_menu2->{'items'}}) {
		        $_->destroy;
		}
                foreach (@{$view_attach_menu->{'items'}}) {
                        $_->destroy;
                }
		foreach (@{$view_attach_menu2->{'items'}}) {
                        $_->destroy;
                }
	}
	if (defined $entity{$msgid}) {
		$entity{$msgid}->{'usecount'}++;  # we got one more thing using this entity, so don't nuke it...
# lets look at the display objects entity "id". if its some
# other message, we know we are about to change messages
# so lets decriment the usage count on that other entity
# and if usage drops to 0 we know nothing else is using
# it, so we can nuke it...

		if (defined $output_widget->{'entid'} && defined $entity{$output_widget->{'entid'}}) {
			if ($output_widget->{'entid'} != $msgid) {
				&destroy_entity(undef, $output_widget->{'entid'});  # destroy_entity will decrement usecount and destroy if 0
			} else {
				$entity{$msgid}->{'usecount'}--;  # we are displaying the same entity we had last time, so the use count shouldnt go up
			}
		}
		$output_widget->{'entid'} = $msgid; # so we can check next time this widget gets used...
		$output_widget->signal_connect('destroy' => \&destroy_entity, $msgid); # so that when the window goes away, we can clear it out
		if ($vtype > 2) {    # the viewer wants a header.....
			$body = $entity{$msgid}->stringify_header;
			$type = "text/plain";
		} else {        # the viewer wants the body
			$num_parts=$entity{$msgid}->parts;
			if ($num_parts == 0) { # single part message
				$parts[0] = $entity{$msgid};
			} else { # multipart message
				@parts = $entity{$msgid}->parts;
			}
			foreach $part (@parts) {
				$type=$part->mime_type;
				my $rec_filename = $part->head->recommended_filename;
				if (defined $rec_filename) {
					if (defined $attach_menu) {
						my $menuitem=new Gtk::MenuItem("$rec_filename");
						$menuitem->signal_connect("activate" => \&init_fs_window, $rec_filename, "$prefs{'MailDir'}/tmp/$rec_filename");
						$menuitem->show; 
						push @{$attach_menu->{'items'}}, $menuitem;
						$attach_menu->append($menuitem);
					        $menuitem=new Gtk::MenuItem("$rec_filename");
						$menuitem->show;   
						$menuitem->signal_connect("activate" => \&init_fs_window, $rec_filename, "$prefs{'MailDir'}/tmp/$rec_filename");
						push @{$attach_menu2->{'items'}}, $menuitem;
						$attach_menu2->append($menuitem);
						$menuitem=new Gtk::MenuItem("$rec_filename");
                                                $menuitem->signal_connect("activate" => \&view_attachment, "$prefs{'MailDir'}/tmp/$rec_filename", $type, 'y');
                                                $menuitem->show;
                                                push @{$view_attach_menu->{'items'}}, $menuitem;
                                                $view_attach_menu->append($menuitem);
					  	$menuitem=new Gtk::MenuItem("$rec_filename");
                                                $menuitem->signal_connect("activate" => \&view_attachment, "$prefs{'MailDir'}/tmp/$rec_filename", $type, 'y');
                                                $menuitem->show;
                                                push @{$view_attach_menu2->{'items'}}, $menuitem;
                                                $view_attach_menu2->append($menuitem);
					}
					if (defined $attach_clist && $quote != 1 && ($prefs{'ForwardAttachments'} eq "y" || $quote != 2) ) {
						my $error = 0;
						open (FILE, "$prefs{'MailDir'}/tmp/$rec_filename") or $error=1;
						my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size)=stat FILE;
						close FILE or $error=1;
						if ($error==0){
							$size=$size/1024;
							$attach_clist->append(("$prefs{'MailDir'}/tmp/$rec_filename",(sprintf("%8.2f",$size)."kb")));
						} else {
							&wr_debug("unable to open $rec_filename.");
						} 
					}
					if (($prefs{'InlineImages'} eq "y") and ($rec_filename =~ /(bmp|gif|jpg|jpeg|png)$/i)) {
						push @inlineimages, $rec_filename;
					} elsif($prefs{'InlineAttachments'} eq "y") {
						push @inlineattach, "$rec_filename:$type";
					}
				}
				if ($type =~ /multipart/i) {   # this is a multipart part, so lets flatten
					push @parts, $part->parts;
				}
				if (($vtype == 1) and ($type =~ /text\/html/i)) {   #  we are looking for an HTML part and found one!
					if (not defined $view_part) { $view_part = $part; }  # we only want the FIRST HTML part...
				} elsif ($type =~ /text\/plain/i) {                  # we are looking for TEXT parts...
					if (not defined $view_part) { $view_part = $part; }  #still only want the first....
				}
			}
			if (defined $view_part) {
				if ($io=$view_part->open("r")) {
					$body="";
					while(defined($_=$io->getline)) { $body=$body.$_ }
					$io->close;
					$type=$view_part->mime_type;
				}
			} else { 
				$body = "No viewable part found.";
				$type="text/plain";
			}
		}
	} else {
		$body = "Unable to decode message. Please contact CSCMail maintainers at cscmail\@cscmail.penguinpowered.com.";
		$type = "text/plain";
	}
	if (($vtype == 1) or ($vtype == 3)) {   # HTML widget....
		if (($type =~ /text\/plain/i) or ($type eq "text")) {
			$body = &text2html($body, \@inlineimages);
		} else {
			if (@inlineimages) {
				$image="";
				foreach (@inlineimages) {
					if ($_ ne "") {
						$url = "$prefs{'MailDir'}/tmp/$_";
						$image = $image . "<p>$_<br><img src=\"$url\"></p>";
					}
				}
				$body =~ s/<\/html>/$image<\/html>/;
			}
		}
		if (@inlineattach) {
			$attach="";
			foreach(@inlineattach) {
				if($_ ne "") {
					my ($filename,$type,$sql,$query,$icon);
                                        ($filename,$type) = split(/:/,$_);
					$sql = "select icon from mimetypes where mime = ?";
					$query = $conn->prepare($sql);
					$query->execute($type);	
					if(($icon) = $query->fetchrow_array()) {
						if(!(-f $icon)) {
							$icon = "$prefs{'PixmapDir'}/unknown.png";
						}
					}
					else {
						$icon = "$prefs{'PixmapDir'}/unknown.png";
					}
					$url = "file:$prefs{'MailDir'}/tmp/$_";
					$attach = $attach . "<p><a href=$url>";
					if($prefs{'InlineIcons'} eq 'y') {
						$attach = $attach . "<img border=0 src=$icon>";
					}
					$attach = $attach . "$filename</a><br></p>";
				}
			}
			$body =~ s/<\/body>/$attach<\/body>/;
		}
		if ($HTMLWIDGET eq "GtkHTML") {
			my $tmpfile = "$prefs{'MailDir'}/file.html";
			open (DUMP,">$tmpfile");
			print DUMP $body;
			close(DUMP);
			$output_widget->begin("$tmpfile");
		} else {
			$body = HtmlStripper->new->parse($body)->filtered_html;
			$output_widget->source($body);
		}
	} else {    # text widget
		$Text::Wrap::columns = ($prefs{'WrapAfter'}-length($prefs{'QuoteWith'}." "));
		$body = &Text::Wrap::wrap("","",$body);
		if ($quote == 1) {
			if (defined $prefs{'QuoteWith'}) {
				$body = $prefs{'QuoteWith'}  . $body;
				$body =~ s/\n/\n$prefs{'QuoteWith'} /g;
			}
			$sql = "select date, friendly from messages where id = ?";
			$query = $conn->prepare($sql);
			$query->execute($msgid);
			my ($quotedate, $quotename) = ($query->fetchrow_array());
			my $prefix = $prefs{'QuoteHeader'};
			$prefix =~ s/%n/$quotename/g;
			$prefix =~ s/%d/$quotedate/g;
			unless (!$prefix) { $body = $prefix . "\n\n" . $body; }
			$output_widget->insert('','','',"$body\n");
		        return 1;
		}  
#edit code - DONT REMOVE!		
		if ($quote == 3) { $output_widget->insert('','','',"$body\n"); return 1;}

#print code

 if($quote == 4) {
   $sql = "select date, replyto, sentfrom, subject, sentto from messages where id = ?";
   $query = $conn->prepare($sql);
   $query->execute($msgid);
   my ($fdate, $reply, $from, $subject, $to) = ($query->fetchrow_array());
   if (!$reply) { $reply = $from }
   if (defined $printh and $printh eq "y") {
   my $printheader = "  \n\n From: $reply\n To: $to\n Sent: $fdate\n Subject: $subject";
   $body = $printheader . "\n\n" . $body;
   $output_widget->insert('','','',"$body\n");
   }
   else {  $output_widget->insert('','','',"$body\n"); }
   return 1;
		  }
							       


#forward code		
		if ($prefs{'ForwardHeader'} eq "y") {
			$sql = "select date, replyto, sentfrom, subject, sentto from messages where id = ?";
		        $query = $conn->prepare($sql);
		        $query->execute($msgid);
		        my ($fdate, $reply, $from, $subject, $to) = ($query->fetchrow_array());
		        if (!$reply) { $reply = $from }
		        my $forwardheader = "  \n\n--- Forwarded Message ---\n From: $reply\n To: $to\n Sent: $fdate\n Subject: $subject";
		        $body = $forwardheader . "\n\n" . $body;
			$output_widget->insert('','','',"$body\n");
		} else {
			$output_widget->insert('','','',"$body\n");
		}
	}
	return 1;
}

sub send_out {
  
  if (open(TMP,"<$prefs{'MailDir'}/cscsend.running")) {
   &err_dialog("CSCsend is already running. If this is not true, please delete\ncscsend.running in $prefs{'MailDir'}");
   return 1;
   }
   
 my ($child);
 unless ($child = fork) {
  die "cannot fork: $~" unless defined $child;
  exec("cscsend");
 }
 
 return 1;

}

sub check_mail {
 if (open(TMP,"<$prefs{'MailDir'}/cscget.running")) {
 &err_dialog("CSCget is already running. If this is not true, please delete\ncscget.running in $prefs{'MailDir'}");
 return 1;
 }
 
 my $acct = $_[1];
 my $inter = $_[2];
 my ($child);
 unless ($child = fork) {
  die "cannot fork: $~" unless defined $child;
  exec("cscget $acct $inter");
 }

if ($prefs{'SendImmediately'} eq "n")
{&send_out;}
 return 1;

}

sub init_timers {

 my $test = new Gtk::ProgressBar;

 if ($prefs{'AutoCheckTime'} > 0) {
  $check_timer = Gtk->timeout_add($prefs{'AutoCheckTime'}*60000, \&check_mail, 0, "all", "0");
 }

 $refresh_timer = Gtk->timeout_add(1000, \&refresh_semaphore, $test);
 return 1;
}

sub get_addresses_from_string {
 my $string = shift;
 my @raw_addresses;
 my @addresses;

 wr_debug("get_addresses_from_string\($string\)");

 @raw_addresses = split(/[<>\s,")(]+/, $string);
 wr_debug("Fragments: @raw_addresses");

 foreach my $frag (@raw_addresses) {
  if ($frag =~ /\@/) {
   push(@addresses, $frag);
   wr_debug("$frag: Valid Email address");
  } else {
   wr_debug("$frag: Invalid Email address");
  }
 }

 return(@addresses);

}

sub obtain_passphrase {
	my $passwindow = new Gtk::Window(-toplevel);
	$passwindow->set_title("Please enter your passphrase");
	my $hbox = new Gtk::HBox(0,0);
	my $label = new Gtk::Label("Passphrase");
	my $entry = new Gtk::Entry();
	$entry->set_visibility(0);
	my $button = new Gtk::Button("Submit");
	$button->signal_connect('clicked', \&set_passphrase, [$entry, $passwindow]);

	$hbox->pack_start($label,0,0,0);
	$hbox->pack_start($entry,0,0,0);
	$hbox->pack_start($button,0,0,0);

	$passwindow->add($hbox);
	$button->show;
	$hbox->show;
	$label->show;
	$entry->show;
	$passwindow->show;

	return 1;
}

sub set_passphrase {
	my $button = shift;
	my $secondbit = shift;

	$passphrase = ($secondbit->[0])->get_text;
	($secondbit->[1])->destroy;
	return 1;
}

sub keyserver_search_window {
	wr_debug("Opening keyserver search window");
	return 1;
}


sub firstSetup {
	my ($setup_win,$window,$bg,$tbox,$hbox,$sep, $butbox,$ok,$cancel,$pixmap);
  my @dbidrivers=({'drvname'=>'CSV','installed'=>0},
									{'drvname'=>'mysql','installed'=>0},
									{'drvname'=>'Pg','installed'=>0});

	$setup_win = new Gtk::Window("dialog");
	$setup_win->set_title("CSCMail - Database Setup...");
	$setup_win->signal_connect("destroy" => sub { $setup_win->destroy; });
	$setup_win->signal_connect("delete_event" => \&Gtk::false);
	$setup_win->border_width('2');
	$setup_win->position(-mouse);
	$setup_win->set_default_size('350','350');
	$setup_win->set_policy(1,1,0);
	$setup_win->show;
	$window = $setup_win->window;
	$bg = $setup_win->style->bg('normal');
	$hbox= new Gtk::VBox(0,0);
	$setup_win->add($hbox);
	$hbox->show;
	$pixmap = new_pixmap("$prefs{'PixmapDir'}/about.xpm", $window, $bg);
	$pixmap->show;
	$hbox->pack_start($pixmap,1,1,1);   
	$setup_win->{'label'}=new Gtk::Label("CSCMail Database Setup");
	$setup_win->{'label'}->set_alignment(0.5,0.5);
	$hbox->pack_start($setup_win->{'label'},1,0,1);   
	$setup_win->{'label'}->show;
	my ($tmp,$errmessage, $supportlist);
	# test for DBI
	my $dbiinstalled=0;
	my $installed=0;
	$tmp="use DBI;";
	eval $tmp; $dbiinstalled=1 unless $@;
	for(my $i=0;$i<scalar(@dbidrivers);$i++){
		# test for the dbi dirvers
		$tmp="use DBD::".$dbidrivers[$i]{'drvname'}.";";
		eval $tmp; $dbidrivers[$i]{'installed'}=1 unless $@;
		$supportlist.=$dbidrivers[$i]{'drvname'}." ";
		$installed=1 if $dbidrivers[$i]{'installed'};
	}

	# we found something?
	if ($installed && $dbiinstalled){
		$setup_win->{'flabel'}=new Gtk::Label("Please select your driver from the list below:\nNote that CSV does not need\n a username or a password");
		$setup_win->{'flabel'}->set_alignment(0.5,0.5);
		$hbox->pack_start($setup_win->{'flabel'},1,1,1);   
		$setup_win->{'flabel'}->show;
		$setup_win->{'select'}=new Gtk::Combo;
		$setup_win->{'select'}->set_case_sensitive(1);
		$setup_win->{'select'}->set_usize(25,25);
		my @drvlist;
		for(my $i=0;$i<scalar(@dbidrivers);$i++){
			push (@drvlist, $dbidrivers[$i]{'drvname'}) if $dbidrivers[$i]{'installed'};
		}
		$setup_win->{'select'}->set_popdown_strings(@drvlist);
		$setup_win->{'select'}->entry->set_editable(0);
		$setup_win->{'select'}->show;
		$hbox->pack_start($setup_win->{'select'},1,0,1);   
		
		my ($hb1,$hb2,$l1,$l2);
		$hb1=new Gtk::HBox(0,0);
		$l1=new Gtk::Label("DB Username:");
		$l1->set_alignment(0.0,0.5);
		$hb1->pack_start($l1, 0,0,5);
		$l1->show();
		$setup_win->{'user'}=new Gtk::Entry;
		$hb1->pack_start($setup_win->{'user'},0,0,5);
		$setup_win->{'user'}->show;
		$hbox->pack_start($hb1,0,0,0);
		$hb1->show;
		$hb2=new Gtk::HBox(0,0);
		$l2=new Gtk::Label("DB Password:");
		$l2->set_alignment(0.0,0.5);
		$hb2->pack_start($l2, 0,0,5);
		$l2->show();
		$setup_win->{'pw'}=new Gtk::Entry;
		$hb2->pack_start($setup_win->{'pw'},0,0,5);
		$setup_win->{'pw'}->set_visibility(0);
		$setup_win->{'pw'}->show;
		$hbox->pack_start($hb2,0,0,0);
		$hb2->show;
		} else {
		# we have no driver found, show message
		if (!$dbiinstalled){
			$errmessage="DBI not found. Install it from CPAN (www.cpan.org). \nGet there your favorite DBD driver too.";
		} else {
			$errmessage="No supported DBD driver ($supportlist) found.\nPlease get one for your db system at CPAN.\nIf you don't have any database installed get the DBD::CSV \nmodule.If you use a unsupported driver, please\ncontact cscmail\@cscmail.penguinpowered.com";
		}
		$setup_win->{'errlabel'}=new Gtk::Label($errmessage);
		$setup_win->{'errlabel'}->set_alignment(0.5,0.5);
		$hbox->pack_start($setup_win->{'errlabel'},1,1,1);   
		$setup_win->{'errlabel'}->show;
	}
	$sep = new Gtk::HSeparator;
	$sep->set_usize(-1,5);
	$hbox->pack_start($sep,0,1,0);
	$sep->show;

	$butbox = new Gtk::HButtonBox;
	$butbox->set_usize(-1,32);
	$hbox->pack_start($butbox, 0,1,0);
	$butbox->show;

	if ($installed){	
		$ok = new_with_label Gtk::Button("OK");
		$ok->set_usize(50,-1);
		$ok->signal_connect('clicked', \&testSetup, $setup_win);
		$ok->can_default(1);
		$ok->grab_default;
		$butbox->add($ok);
		$ok->show;
	}

	$cancel = new_with_label Gtk::Button("Cancel");
	$cancel->set_usize(50,-1);
	$cancel->signal_connect('clicked', sub { $setup_win->destroy; Gtk->exit(0);});
	$cancel->can_default(1);
	$cancel->grab_default;
	$butbox->add($cancel);
	$cancel->show;
}

sub testSetup {
	my ($widget, $win)=@_;
	my ($tmp);
	my $error=0;
	$prefs{'DatabaseDriver'}=$win->{'select'}->entry->get_text;
	$prefs{'DatabaseUser'}=$win->{'user'}->get_text;
	$prefs{'DatabasePassword'}=$win->{'pw'}->get_text;
	$tmp='$conn=&open_db_conn';
	eval $tmp or $error=1;
	if ($error){
		# unable to open the db itself
		&err_dialog("Please go back to the setup dialog:\n $DBI::errstr");
		$tmp="$DBI::errstr";
	} else {
		# now let's do a select...
		$sql = "select * from accounts";
		$query = $conn->prepare($sql);
		$query->execute() or $error=1;
		if ($error){
			$win->{'flabel'}->set_text("Creating tables...");
			&create_database;
		}
		$win->destroy;
		&appInit();
	}
	return 1;
}

sub appInit {
    &read_prefs;
    &save_prefs;
       
        $conn=&open_db_conn;

	$sql = "select * from accounts";
	$query = $conn->prepare($sql);
	$query->execute() or &create_database;

	&init_folder_menu;
	&init_acct_menu;
	&init_main_window;
	&refresh_folder_menus;
	&init_timers;
}

##### initial setup
## test for existing config file
## if not existing call setupdialog and setup tables (if they don't exist)

my $configfile=$ENV{'HOME'}."/.cscmailrc";

unless (-f $configfile) {
	
	&firstSetup();

} else {
      
      if (defined $ARGV[0] and $ARGV[0] eq "--help") { 
      print("CSCMail $version\nUsage: cscmail to-someone\@foo.com subject cc-someone\@bar.com\n");
      exit;
      }
      
      if (defined $ARGV[0] and $ARGV[0] ne "") {
 
        
	&read_prefs;
	$ONETIME = 1;
	$conn=&open_db_conn;
        my @fields;
        
	$fields[0] = $ARGV[0]; #to
	#subject
	if (defined $ARGV[1]) 
	         { $fields[2] = $ARGV[1] 
		 } else { 
		 $fields[2] = "" }
	#cc
	if (defined $ARGV[2]) 
	{ $fields[1] = $ARGV[2] 
	} else { 
	$fields[1] = "" }
	
	&init_msg_window(0, undef, \@fields);

} else {

&appInit();}

}


if ($THREADS == 1) { Gtk::Gdk->threads_enter; }
main Gtk;
if ($THREADS == 1) { Gtk::Gdk->threads_leave; }
