#!/usr/bin/perl

# PMC - Perl/GTK Mail Client
# Copyright (C) 2000 Charlie Schmdit <ishamael@themes.org>
# PMC is maintained by Jens Luedicke <jens@irs-net.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
######################################################################

my $user_config = "$ENV{'HOME'}/.pmcrc";       			     	
my $address_book = "$ENV{'HOME'}/.addressbook";                    
my $maildir = "$ENV{'HOME'}/mail/";                      
my $spooldir = "/var/spool/mail/";   
my $modules = "/usr/share/pmc/";

my $debug = 0; # 1 = show POP/SMTP Debug informations
	       # 0 = disable             	

my $pgp = 0; # 1 = PGP support
	     # 0 = disable

######################################################################
push(@INC, "$modules");
use strict; 
use Gtk;
use Net::SMTP;
use Net::POP3;
# use Net::IMAP::Simple;
use PMC::GUI;
use PMC::MBox;
use PMC::PGP;

my $false = 0; 
my $true = 1;
my $version = "0.9-pre1";

my (
	$i,
	$spool_folder,
	@folders,
	@head,
	@messages,
	@headings,
	@number_of_mails,
	@messages_to_del,
	@FOLDER_HANDLES,
	$current_folder,
	$current_folder_number,
	$current_mail,
	$signature_text,
	$sig,
	@addresses,
	$button,
	$label,
	$handlebox,
	$toolbar,
	$scrollbar
);

init Gtk;
	
#### lock the mbox: 
my $lock = PMC::MBox->lock();
if($lock eq undef) { PMC::GUI->fyi("Could not lock mbox: $!"); }
	
#### Read PMC's configuration file.....
my (
	$cnf_name,
	$cnf_email,
	$cnf_sig,
	$cnf_smtp,
	$cnf_pop3_server,
	$cnf_pop3_user,
	$cnf_pop3_pass,
	$cnf_imap_server,
	$cnf_imap_user,
	$cnf_imap_pass,
	$cnf_prn,
	$cnf_quote,
	$cnf_pgp_userid,
	$cnf_pgp_passphrase
) = &read_config($user_config);

######################################################################
#### MAIN WINDOW

my (
	$main_window,
	$menubar,
	$main_vbox1,
	$main_vbox2,
	$main_vbox3,
	$main_vbox4,
	$main_hbox1,
	$main_hbox2,
	$main_hbox3,
	$main_hbox4,
	$main_hbox5,
	$main_vpane1,
	$main_vscroll1,
	$main_hpane1,
	$main_hscroll1,
	$main_hscroll2,
	$folder_list,
	$message_list,
	$main_mailreader,
	$statusbar,
	$main_p_bar
);

$main_window = new Gtk::Window(-toplevel);
$main_window->set_title("pmc $version");
$main_window->set_usize(750,550);
$main_window->realize();
$main_window->signal_connect("delete_event", \&quit);

$main_vbox1 = new Gtk::VBox($false,0);
$main_vbox1->show();
$main_window->add($main_vbox1);

######################################################################
#### menubar ...
######################################################################

$handlebox = new Gtk::HandleBox();
$main_vbox1->pack_start($handlebox,$false,$false,0);

$menubar = new Gtk::MenuBar();
$handlebox->add($menubar);
$menubar->show();

#### create PMC's "File"-Menu: 
my $file_menu = new Gtk::Menu();
       
## Items for the "File"-Menu: 
my $check_menu_item = new Gtk::MenuItem("Check POP3 Mail");
my $abook_menu_item = new Gtk::MenuItem("Address Book");
my $cnf_menu_item = new Gtk::MenuItem("Settings");
my $quit_menu_item = new Gtk::MenuItem("Quit");

$file_menu->append($check_menu_item);
$file_menu->append($abook_menu_item);
$file_menu->append($cnf_menu_item);
$file_menu->append($quit_menu_item);

$check_menu_item->signal_connect('activate', \&get_pop3);
$abook_menu_item->signal_connect('activate',\&address_book);
$cnf_menu_item->signal_connect('activate', \&configure);
$quit_menu_item->signal_connect('activate', \&quit);

$check_menu_item->show();
$abook_menu_item->show();
$cnf_menu_item->show();
$quit_menu_item->show();
           
my $file_submenu = new Gtk::MenuItem("File");
$file_submenu->show();
$file_submenu->set_submenu($file_menu);
$menubar->append($file_submenu);

#### create PMC's "Mail"-Menu: 
my $mail_menu = new Gtk::Menu();

## Items for the "Mail"-Menu:
my $compose_menu_item = new Gtk::MenuItem("New Mail");
my $reply_menu_item = new Gtk::MenuItem("Reply");
my $replyall_menu_item = new Gtk::MenuItem("Reply to All");
my $forward_menu_item = new Gtk::MenuItem("Foward");
my $delete_menu_item = new Gtk::MenuItem("Delete");
my $view_menu_item = new Gtk::MenuItem("View");
my $save_menu_item = new Gtk::MenuItem("Save");
my $print_menu_item = new Gtk::MenuItem("Print");

$mail_menu->append($compose_menu_item);
$mail_menu->append($reply_menu_item);
$mail_menu->append($replyall_menu_item);
$mail_menu->append($forward_menu_item);
$mail_menu->append($delete_menu_item);
$mail_menu->append($view_menu_item);
$mail_menu->append($save_menu_item);

$compose_menu_item->signal_connect('activate', sub {&compose("","","")});
$reply_menu_item->signal_connect('activate', sub {&compose($head[$current_folder_number][$current_mail][5],"Re:$head[$current_folder_number][$current_mail][2]",$messages[$current_folder_number][$current_mail])});
$replyall_menu_item->signal_connect('activate', sub {&compose("$head[$current_folder_number][$current_mail][1], $head[$current_folder_number][$current_mail][4]$head[$current_folder_number][$current_mail][6]","Re:$head[$current_folder_number][$current_mail][2]",$messages[$current_folder_number][$current_mail])}); 
$forward_menu_item->signal_connect('activate', sub {&compose("","Fwd: $head[$current_folder_number][$current_mail][2]",$messages[$current_folder_number][$current_mail])});
$delete_menu_item->signal_connect('activate', sub {&del_mail()});
$view_menu_item->signal_connect('activate', sub {&view_mail($current_mail)});
$save_menu_item->signal_connect('activate', sub {&save_mail($current_mail)});
$print_menu_item->signal_connect('activate', sub {&print_mail($current_mail)});

$compose_menu_item->show();
$reply_menu_item->show();
$replyall_menu_item->show();
$forward_menu_item->show();
$delete_menu_item->show();
$view_menu_item->show();
$save_menu_item->show();
$print_menu_item->show();

my $mail_submenu = new Gtk::MenuItem("Mail");
$mail_submenu->show();
$mail_submenu->set_submenu($mail_menu);
$menubar->append($mail_submenu);

#### create PMC's "Folder"-Menu: 
my $folder_menu = new Gtk::Menu();
       
## Items for the "Folder"-Menu:
my $search_menu_item = new Gtk::MenuItem("Search");
my $flush_menu_item = new Gtk::MenuItem("Flush");
         
$folder_menu->append($search_menu_item);
$folder_menu->append($flush_menu_item);

$search_menu_item->signal_connect('activate', \&search_entry);
$flush_menu_item->signal_connect('activate', \&flush_mails);

$search_menu_item->show();
$flush_menu_item->show();

my $folder_submenu = new Gtk::MenuItem("Folder");
$folder_submenu->show();
$folder_submenu->set_submenu($folder_menu);
$menubar->append($folder_submenu);

$handlebox->show();

######################################################################
#### toolbar....

$handlebox = new Gtk::HandleBox();
$main_vbox1->pack_start($handlebox,$false,$false,0);

$toolbar = new Gtk::Toolbar('horizontal','text');
# $toolbar->border_width(5);
$toolbar->set_space_size(2);
$handlebox->add($toolbar);

# Check Mail-Button:
$button = $toolbar->append_item("Check Mail","Check for new mail","","",);
$button->signal_connect("clicked", \&get_pop3);
$toolbar->append_space();

# Compose-Button:
$button = $toolbar->append_item("Compose","Compose New Mail","","",);
$button->signal_connect("clicked", sub { &compose('','',''); });
$toolbar->append_space();

# Reply-Button:
$button = $toolbar->append_item("Reply","write a reply","","",);
$button->signal_connect("clicked", sub {&compose($head[$current_folder_number][$current_mail][5],"Re:$head[$current_folder_number][$current_mail][2]",$messages[$current_folder_number][$current_mail])});
$toolbar->append_space();

# Reply to All-Button:
$button = $toolbar->append_item("Reply to All","write a reply to all","","",);
$button->signal_connect("clicked", sub {&compose("$head[$current_folder_number][$current_mail][1], $head[$current_folder_number][$current_mail][4]$head[$current_folder_number][$current_mail][6]","Re:$head[$current_folder_number][$current_mail][2]",$messages[$current_folder_number][$current_mail])}); 
$toolbar->append_space();

# Forward-Button:
$button = $toolbar->append_item("Forward","forward mail","","",);
$button->signal_connect("clicked", sub {&compose("","Fwd: $head[$current_folder_number][$current_mail][2]",$messages[$current_folder_number][$current_mail]); $message_list->set_text($current_mail,1,"FWD");});
$toolbar->append_space();

# Delete-Button:
$button = $toolbar->append_item("Delete","delete mail","","",);
$button->signal_connect("clicked", sub {&del_mail()});
$toolbar->append_space();

# Prev. Mail-Button:
$button = $toolbar->append_item("<","switch to prev. mail","","",);
$button->signal_connect("clicked", sub {$current_mail--; $message_list->select_row($current_mail,0)});
$toolbar->append_space();

# View -Button:
$button = $toolbar->append_item("View","open selected mail in own window","","",);
$button->signal_connect("clicked", sub { &view_mail($current_mail)});
$toolbar->append_space();

# Next -Button:
$button = $toolbar->append_item(">","switch to next mail","","",);
$button->signal_connect("clicked", sub {$current_mail++; $message_list->select_row($current_mail,0)});
$toolbar->append_space();

# Quit -Button:
$button = $toolbar->append_item("Quit","Quit","","",);
$button->signal_connect("clicked", \&quit);
$toolbar->append_space();

$toolbar->show();
$handlebox->show();

$main_hpane1 = new Gtk::HPaned;
$main_hpane1->show();
$main_vbox1->pack_start($main_hpane1,$true,$true,0);

$main_hscroll1 = new Gtk::ScrolledWindow;
$main_hscroll1->set_policy('automatic','automatic');
$main_hscroll1->set_usize(150,100);
$main_hscroll1->show();
$main_hpane1->add($main_hscroll1);


#### Folder-List:

$folder_list = new_with_titles Gtk::CList("Folders","Mails");
$folder_list->set_column_width(0,90);
$folder_list->set_column_width(1,20);
$folder_list->column_titles_passive;

&update_mails;

$folder_list->signal_connect("select-row", \&select_folder);
$folder_list->signal_connect("unselect-row", \&unselect_folder);

$folder_list->show();
$main_hscroll1->add_with_viewport($folder_list);


#### Message-List:
$main_vpane1 = new Gtk::VPaned;
$main_vpane1->show();
$main_hscroll2 = new Gtk::ScrolledWindow;
$main_hscroll2->set_policy('automatic','automatic');
$main_hscroll2->show();
$main_hpane1->add($main_hscroll2);
$main_hscroll2->add_with_viewport($main_vpane1);

$main_vscroll1 = new Gtk::ScrolledWindow;
$main_vscroll1->set_policy('automatic','always');
$main_vscroll1->show();
$main_vpane1->add($main_vscroll1);
$message_list = new_with_titles Gtk::CList("#","-","From","Subject","Date");
$message_list->set_usize(490,250);
$message_list->set_column_width(0,20);
$message_list->set_column_width(1,20);
$message_list->set_column_width(2,150);
$message_list->set_column_width(3,150);
$message_list->set_column_width(4,150);
$message_list->column_titles_passive;

$message_list->signal_connect("select-row", \&select_mail);
$message_list->signal_connect("unselect-row", \&unselect_mail);

$message_list->show();
$main_vscroll1->add($message_list);

#### Textbox for reading selected mails:
$main_hbox2 = new Gtk::HBox($false,0);
$main_hbox2->show();
$main_vpane1->add($main_hbox2);

$main_mailreader = new Gtk::Text;
$main_mailreader->set_word_wrap(1);
$main_mailreader->set_editable(0);
$main_mailreader->insert('','','',"\n");
$scrollbar = new Gtk::VScrollbar($main_mailreader->vadj);

$scrollbar->show();
$main_mailreader->show();
$main_hbox2->pack_start($main_mailreader,$true,$true,0);
$main_hbox2->pack_start($scrollbar,$false,$false,0);
$main_hbox2->show();

#### add a nice statusbar/progressbar....

$main_hbox5 = new Gtk::HBox($false,0);
$main_hbox5->show();
$main_vbox1->pack_start($main_hbox5,$false,$false,0);

$statusbar = new Gtk::Statusbar;
$statusbar->set_usize(550,20);
$statusbar->label();
$statusbar->push(1,"pmc $version");
$statusbar->show();
$main_hbox5->pack_start($statusbar,$true,$true,0);

$main_p_bar = new Gtk::ProgressBar;
$main_p_bar->set_usize(200,20);
$main_p_bar->set_bar_style('continuous'); 	
$main_p_bar->show();
$main_hbox5->pack_start($main_p_bar,$true,$true,0);

#### show everything....
$main_window->show();
main Gtk;

######################################################################
##### FUNCTIONS

##### Configuration-Window:
sub configure {
	my (
		$cwindow, 
		$cvbox1,
		$cvbox2,
		$chbox1,
		$chbox2,
		$cfolder_list,
		$sel_folder,
		$notebook,
		$label,
		$frame,
		$table,
		$name_entry,
		$email_entry,
		$sig_entry,
		$smtp_entry,
		$pop3_server_entry,
		$pop3_user_entry,
		$pop3_password_entry,
		$imap_server_entry,
		$imap_user_entry,
		$imap_password_entry,
		$prn_entry,
		$quote_entry,
		$pgp_userid_entry,
		$pgp_passphrase_entry,
		$label_box
	);

	$cwindow = new Gtk::Window();
	$cwindow->set_title("Configure");
	$cwindow->signal_connect("delete_event",sub {$cwindow->destroy});

	$cvbox1 = new Gtk::VBox($false,0);
	$cvbox1->show();
	$cwindow->add($cvbox1);

	$notebook = new Gtk::Notebook;
	$notebook->show();
	$cvbox1->pack_start($notebook,$true,$true,0);

	$label_box = new Gtk::HBox($false,0);
	$label = new Gtk::Label("User");
	$label->show();
	$label_box->pack_start($label,$false,$true,0);
	$label_box->show();
	$frame = new Gtk::Frame("User");
	$table = new Gtk::Table(3,2,0);
	$table->show();
	$frame->add($table);
	$frame->show();

	$label = new Gtk::Label("Name: ");
	$label->show();
	$name_entry = new Gtk::Entry;
	$name_entry->set_text("$cnf_name");
	$name_entry->show();
	$table->attach_defaults($label,0,1,1,2);
	$table->attach_defaults($name_entry,1,2,1,2);

	$label = new Gtk::Label("eMail-Address: ");
	$label->show();
	$email_entry = new Gtk::Entry;
	$email_entry->set_text("$cnf_email");
	$email_entry->show();
	$table->attach_defaults($label,0,1,2,3);
	$table->attach_defaults($email_entry,1,2,2,3);

	$sig_entry = new Gtk::Entry;
	$sig_entry->set_text("$cnf_sig");
	$sig_entry->show();
	$button = new Gtk::Button("Signature: ");
	$button->signal_connect("clicked",sub {&select_sig($sig_entry)});
	$button->show();
	$table->attach_defaults($button,0,1,7,8);
	$table->attach_defaults($sig_entry,1,2,7,8);

	$notebook->append_page($frame,$label_box);

	$label_box = new Gtk::HBox($false,0);
	$label = new Gtk::Label("Network");
	$label->show();
	$label_box->pack_start($label,$false,$true,0);
	$label_box->show();
	$frame = new Gtk::Frame("SMTP / POP3 / IMAP");
	$table = new Gtk::Table(4,4,0);
	$table->show();
	$frame->add($table);
	$frame->show();

	$label = new Gtk::Label("SMTP Server: ");
	$label->show();
	$smtp_entry = new Gtk::Entry;
	$smtp_entry->set_text("$cnf_smtp");
	$smtp_entry->show();
	$table->attach_defaults($label,0,1,1,2);
	$table->attach_defaults($smtp_entry,1,2,1,2);

	$label = new Gtk::Label("POP3 Server: ");
	$label->show();
	$pop3_server_entry = new Gtk::Entry;
	$pop3_server_entry->set_text("$cnf_pop3_server");
	$pop3_server_entry->show();
	$table->attach_defaults($label,0,1,2,3);
	$table->attach_defaults($pop3_server_entry,1,2,2,3);

	$label = new Gtk::Label("POP3 Username: ");
	$label->show();
	$pop3_user_entry = new Gtk::Entry;
	$pop3_user_entry->set_text("$cnf_pop3_user");
	$pop3_user_entry->show();
	$table->attach_defaults($label,0,1,3,4);
	$table->attach_defaults($pop3_user_entry,1,2,3,4);

	$label = new Gtk::Label("POP3 Password: ");
	$label->show();
	$pop3_password_entry = new Gtk::Entry;
	$pop3_password_entry->set_text("$cnf_pop3_pass");
	$pop3_password_entry->show();
	$table->attach_defaults($label,0,1,4,5);
	$table->attach_defaults($pop3_password_entry,1,2,4,5);

	$label = new Gtk::Label("IMAP Server: ");
	$label->show();
	$imap_server_entry = new Gtk::Entry;
#	$imap_server_entry->set_text("$cnf_imap_server");
	$imap_server_entry->set_text("OUT OF ORDER!");
	$imap_server_entry->show();
	$table->attach_defaults($label,0,1,5,6);
	$table->attach_defaults($imap_server_entry,1,2,5,6);

	$label = new Gtk::Label("IMAP Username: ");
	$label->show();
	$imap_user_entry = new Gtk::Entry;
#	$imap_user_entry->set_text("$cnf_imap_user");
	$imap_user_entry->set_text("OUT OF ORDER!");
	$imap_user_entry->show();
	$table->attach_defaults($label,0,1,6,7);
	$table->attach_defaults($imap_user_entry,1,2,6,7);

	$label = new Gtk::Label("IMAP Password: ");
	$label->show();
	$imap_password_entry = new Gtk::Entry;
#	$imap_password_entry->set_text("$cnf_imap_pass");
	$imap_password_entry->set_text("OUT OF ORDER!");
	$imap_password_entry->show();
	$table->attach_defaults($label,0,1,7,8);
	$table->attach_defaults($imap_password_entry,1,2,7,8);

	$notebook->append_page($frame,$label_box);

	$label_box = new Gtk::HBox($false,0);
	$label = new Gtk::Label("Folders");
	$label->show();
	$label_box->pack_start($label,$false,$true,0);
	$label_box->show();
	$frame = new Gtk::Frame("Folders");
	$chbox2 = new Gtk::HBox($false,0);
	$chbox2->show();
	$frame->add($chbox2);
	$frame->show();

	$cfolder_list = new_with_titles Gtk::CList("Folder");
	$cfolder_list->column_titles_passive;
	$cfolder_list->set_column_width(0,80);

	&read_folders($cfolder_list);

	$cfolder_list->signal_connect("select-row",sub {$sel_folder = $folders[$_[1]]});
	$cfolder_list->show();

	$chbox2->pack_start($cfolder_list,$true,$true,0);
	$cvbox2 = new Gtk::VBox($false,0);
	$cvbox2->show();
	$chbox2->pack_start($cvbox2,$true,$true,0);

	$button = new Gtk::Button("Add");
	$button->signal_connect("clicked",sub {&add_folder_diag($cfolder_list)});
	$button->show();
	$cvbox2->pack_start($button,$false,$false,0);

	$button = new Gtk::Button("Delete");
	$button->signal_connect("clicked",sub {&del_folder($sel_folder,$cfolder_list)});
	$button->show();
	$cvbox2->pack_start($button,$false,$false,0);

	$notebook->append_page($frame,$label_box);

	$label_box = new Gtk::HBox($false,0);
	$label = new Gtk::Label("Misc.");
	$label->show();
	$label_box->pack_start($label,$false,$true,0);
	$label_box->show();
	$frame = new Gtk::Frame("Misc. Settings");
	$table = new Gtk::Table(2,2,0);
	$table->show();
	$frame->add($table);
	$frame->show();

	$label = new Gtk::Label("Printing: ");
	$label->show();
	$prn_entry = new Gtk::Entry;
	$prn_entry->set_text("$cnf_prn");
	$prn_entry->show();
	$table->attach_defaults($label,0,1,1,2);
	$table->attach_defaults($prn_entry,1,2,1,2);

	$label = new Gtk::Label("Quote Indention: ");
	$label->show();
	$quote_entry = new Gtk::Entry;
	$quote_entry->set_text("$cnf_quote");
	$quote_entry->show();
	$table->attach_defaults($label,0,1,2,3);
	$table->attach_defaults($quote_entry,1,2,2,3);

	$notebook->append_page($frame,$label_box);

	$label_box = new Gtk::HBox($false,0);
	$label = new Gtk::Label("PGP");
	$label->show();
	$label_box->pack_start($label,$false,$true,0);
	$label_box->show();
	$frame = new Gtk::Frame("PGP Settings");
	$table = new Gtk::Table(2,2,0);
	$table->show();
	$frame->add($table);
	$frame->show();

	$label = new Gtk::Label("PGP userid:");
	$label->show();
	$pgp_userid_entry = new Gtk::Entry;
	$pgp_userid_entry->set_text("$cnf_pgp_userid");
	$pgp_userid_entry->show();
	$table->attach_defaults($label,0,1,1,2);
	$table->attach_defaults($pgp_userid_entry,1,2,1,2);

	$label = new Gtk::Label("PGP passphrase: ");
	$label->show();
	$pgp_passphrase_entry = new Gtk::Entry;
	$pgp_passphrase_entry->set_text("$cnf_pgp_passphrase");
	$pgp_passphrase_entry->show();
	$table->attach_defaults($label,0,1,2,3);
	$table->attach_defaults($pgp_passphrase_entry,1,2,2,3);

	$notebook->append_page($frame,$label_box);
		
	$chbox1 = new Gtk::HBox($false,0);
	$chbox1->show();
	$cvbox1->pack_start($chbox1,$false,$false,0);

	$button = new Gtk::Button("Ok");
	$button->signal_connect("clicked",sub {
	    &read_folders($folder_list); 
	    &write_config(
		$name_entry->get_text(),
		$email_entry->get_text(),
		$sig_entry->get_text(),
		$smtp_entry->get_text(),
		$pop3_server_entry->get_text(),
		$pop3_user_entry->get_text(),
		$pop3_password_entry->get_text(),
		$imap_server_entry->get_text(),
		$imap_user_entry->get_text(),
		$imap_password_entry->get_text(),
		$prn_entry->get_text(),
		$quote_entry->get_text(),
		$pgp_userid_entry->get_text(),
		$pgp_passphrase_entry->get_text(),
		$user_config); 
		$cwindow->destroy;
	});

	$button->show();
	$chbox1->pack_start($button,$true,$true,0);

	$button = new Gtk::Button("Cancel");
	$button->signal_connect("clicked",sub {$cwindow->destroy});
	$button->show();
	$chbox1->pack_end($button,$true,$true,0);

	$cwindow->show();
}	

##### Signature-Selection:
sub select_sig {
        my ($widget) = @_;
        my $sig_window = new Gtk::FileSelection("Signature");
        $sig_window->position(-mouse);
        $sig_window->signal_connect("destroy", sub {$sig_window->destroy;});
        $sig_window->signal_connect("delete_event", sub {$sig_window->destroy;});
	$sig_window->ok_button->signal_connect("clicked",sub {$sig = $sig_window->get_filename(); $widget->set_text("$sig");$sig_window->destroy(); return()});
	$sig_window->cancel_button->signal_connect("clicked", sub {$sig_window->destroy;});
	$sig_window->set_filename($cnf_sig);
	$sig_window->show();
}

sub add_folder_diag {
	my $widget = $_[0];
	my ($dvbox1,$dhbox1,$entry,$button);
	my $diag_window = new Gtk::Window;
	$diag_window->set_title("Add Folder");

	$dvbox1 = new Gtk::VBox($false,0);
	$dvbox1->show;
	$diag_window->add($dvbox1);
	
	$entry = new Gtk::Entry(50);
	$entry->show();
	$dvbox1->pack_start($entry,$true,$true,0);
	
	$dhbox1 = new Gtk::HBox($false,0);
	$dhbox1->show();
	$dvbox1->pack_start($dhbox1,$false,$false,0);

	$button = new Gtk::Button("Add");
	$button->signal_connect("clicked",sub {&add_folder($entry->get_text(),$widget); $diag_window->destroy});
	$button->show();
	$dhbox1->pack_start($button,$true,$true,0);

	$button = new Gtk::Button("Cancel");
	$button->signal_connect("clicked",sub {$diag_window->destroy});
	$button->show();
	$dhbox1->pack_start($button,$true,$true,0);

	$diag_window->show();
	
}

#### POP3...
sub get_pop3 {
	my (
	    $pop3, 
	    $msg, 
	    $mails, 
	    $m, 
	);

	$message_list->clear();

        $statusbar->push(1,"POP3: Please wait ...");
   	$pop3 = Net::POP3->new("$cnf_pop3_server",Debug => $debug);

	if($pop3 eq undef) {
		PMC::GUI->fyi("POP3: Can't connect to server");
	} else {
		$mails = $pop3->login($cnf_pop3_user, $cnf_pop3_pass);
		
		if ($mails eq "0E0") {
			$statusbar->push(1,"No mails on server !!");
		} else {	
	
		    while (Gtk->events_pending) { Gtk->main_iteration; }
		    open(SPOOL, ">>$spooldir$ENV{'USER'}");
    		    $main_p_bar->configure(1,0,$mails);

	    	    for ($msg = 1; $msg <= $mails; $msg++) {
	    		    $statusbar->push(1,"POP3: getting $msg of $mails ...");
			    $main_p_bar->set_value($msg);
			    $m = $pop3->get($msg);
			    $pop3->delete($msg);
			    print SPOOL "From pmc_check Mon Jan  1 15:30:07 2000\n";
			    print SPOOL @$m;
			    print SPOOL "\n\n";
			    while (Gtk->events_pending) { Gtk->main_iteration; }
		    }
		    close(SPOOL);
		    $pop3->quit;
		    &update_mails;	
		}
		$main_p_bar->set_value(0);
    	        $statusbar->push(1,"pmc $version");
	}
}

#### IMAP...
#### this is damn simple (Net::IMAP::Simple)... Don't expect too much....
#sub get_imap {
#	return; # The mails that are received with IMAP won't parse correctly....
#		# so, IMAP is disabled....
#	my (
#		$imap,
#		$msg,
#		$mails,
#		$m,
#	);
#	$message_list->clear();
#
#	$statusbar->push(1,"IMAP: Please wait....");
 #  	my $imap = Net::IMAP::Simple->new("$cnf_imap_server");
#
#	if($imap eq undef) {
#		$statusbar->push(1,"IMAP: Can't connect to server");
#	} else {
#		$imap->login($cnf_imap_user, $cnf_imap_pass);
#		$mails = $imap->select("INBOX");
#		open(SPOOL, ">>$spooldir/$ENV{'USER'}"); 
#
#		if($mails eq undef) {	
#			$statusbar->push(1,"IMAP: INBOX empty!");
#		} else {
#    			while (Gtk->events_pending) { Gtk->main_iteration; }
#    			$main_p_bar->configure(1,0,$mails);
#    			for ($msg = 1; $msg <= $mails; $msg++) {
#				$statusbar->push(1,"IMAP: getting mail $msg of $mails....");
#    				$main_p_bar->set_value($msg);
#				$m = $imap->get($msg);
#				print SPOOL "From pmc_check Mon Jan  1 15:30:07 2000\n";
#				print SPOOL @$m;
#				print SPOOL "\n\n";
#				while (Gtk->events_pending) { Gtk->main_iteration; }
#			}
#			$statusbar->push(1,"IMAP: Finished!!");
#		}
#		close(SPOOL);
#	        $imap->quit();
#	        &update_mails;	
#	}
#        $main_p_bar->set_value(0);
#}

sub compose {
	my ($to,$subj,$mesg) = @_;
	my ($cvbox1,$chbox1,$chbox2,$ctable,$compose_edit,$to_entry,$from_entry,$cc_entry,$subject_entry,@mesg_lines);

	my $compose_window = new Gtk::Window;
	$compose_window->set_title("Compose Message");
	$compose_window->set_usize(550,350);
	$cvbox1 = new Gtk::VBox($false,0);
	$cvbox1->show();
	$compose_window->add($cvbox1);

	##### Handle/Toolbar with Send/Cancel Buttons:
	$handlebox = new Gtk::HandleBox();
	$cvbox1->pack_start($handlebox,$false,$false,0);
	$toolbar = new Gtk::Toolbar('horizontal','text');
	$toolbar->set_space_size(2);
	$handlebox->add($toolbar);

	# Send-Button:
	$button = $toolbar->append_item("Send","Send Mail","","",);
	$button->signal_connect("clicked", sub {&send_mail($to_entry->get_text(),$from_entry->get_text(),$subject_entry->get_text(),$cc_entry->get_text(),$compose_edit->get_chars(0,-1),$compose_window)});
	$toolbar->append_space();

	# Cancel-Button:
	$button = $toolbar->append_item("Cancel","Discard mail and close window","","",);
	$button->signal_connect("clicked", sub {$compose_window->destroy});
	$toolbar->append_space();

	if($pgp eq "1") {
		# Sign-Button:
		$button = $toolbar->append_item("Sign","Sign with PGP","","",);
		$button->signal_connect("clicked", sub {PMC::PGP->sign_mail($compose_edit->get_chars(0,-1),$compose_edit)});
		$toolbar->append_space();

		# Encrypt-Button:
		$button = $toolbar->append_item("Encrypt","Encrypt with PGP","","",);
		$button->signal_connect("clicked", sub {PMC::PGP->encrypt_mail($to_entry->get_text(),$cc_entry->get_text(),$compose_edit->get_chars(0,-1),$compose_edit)}); 	$toolbar->append_space();

		# Sign/Encrypt-Button:
		$button = $toolbar->append_item("Sign/Encrypt","Encrypt with PGP","","",);
		$button->signal_connect("clicked", sub {PMC::PGP->sign_encrypt_mail($to_entry->get_text(),$cc_entry->get_text(),$compose_edit->get_chars(0,-1),$compose_edit)});
		$toolbar->append_space();
	}

	$toolbar->show();
	$handlebox->show();

	##### HandleBox/Toolbar for "From" - Entry:
	$handlebox = new Gtk::HandleBox();
	$cvbox1->pack_start($handlebox,$false,$false,0);
	$toolbar = new Gtk::Toolbar('horizontal','text');
	$toolbar->set_space_size(2);
	$handlebox->add($toolbar);

	$label = new Gtk::Label("From: ");
	$label->set_usize(100,20);
	$label->show();
	$toolbar->append_widget($label,"","");

	$from_entry = new Gtk::Entry;
	$from_entry->set_text("$cnf_name <$cnf_email>");
	$from_entry->set_usize(300,20);
	$from_entry->show();
	$toolbar->append_widget($from_entry,"your default eMail-Address","");

	$toolbar->show();
	$handlebox->show();

	##### Handlebox/Toolbox for "To" - Entry:
	$handlebox = new Gtk::HandleBox();
	$cvbox1->pack_start($handlebox,$false,$false,0);
	$toolbar = new Gtk::Toolbar('horizontal','text');
	$toolbar->set_space_size(2);
	$handlebox->add($toolbar);

	$button = $toolbar->append_item("To:","select eMail-Addrs. from your Address-Book","","");
	$button->set_usize(100,20);
	$button->signal_connect("clicked", sub {&select_address($to_entry)});

	$to_entry = new Gtk::Entry;
	$to_entry->set_text("$to");
	$to_entry->set_usize(300,20);
	$to_entry->show();
	$toolbar->append_widget($to_entry,"recpt. of your mail","");

	$toolbar->show();
	$handlebox->show();

	##### HandleBox/Toolbar for "CC" - Entry: 
	$handlebox = new Gtk::HandleBox();
	$cvbox1->pack_start($handlebox,$false,$false,0);
	$toolbar = new Gtk::Toolbar('horizontal','text');
	$toolbar->set_space_size(2);
	$handlebox->add($toolbar);

	$button = $toolbar->append_item("CC:","select eMail-Addrs. from your Address-Book","","",);
	$button->set_usize(100,20);
	$button->signal_connect("clicked", sub {&select_address($cc_entry)});

	$cc_entry = new Gtk::Entry;
	$cc_entry->set_text("$to");
	$cc_entry->set_usize(300,20);
	$cc_entry->show();
	$toolbar->append_widget($cc_entry,"CCopies of your mail","",);

	$toolbar->show();
	$handlebox->show();

	##### HandleBox/Toolbar for Subject-Entry:
	$handlebox = new Gtk::HandleBox();
	$cvbox1->pack_start($handlebox,$false,$false,0);
	$toolbar = new Gtk::Toolbar('horizontal','text');
	$toolbar->set_space_size(2);
	$handlebox->add($toolbar);

	$label = new Gtk::Label("Subject: ");
	$label->set_usize(100,20);
	$label->show();
	$toolbar->append_widget($label,"","",);

	$subject_entry = new Gtk::Entry;
	$subject_entry->set_text("$subj");
	$subject_entry->set_usize(300,20);
	$subject_entry->show();
	$toolbar->append_widget($subject_entry,"enter your subject-line","",);

	$toolbar->show();
	$handlebox->show();
	
	######### Create Editor-Window: 
	$chbox2 = new Gtk::HBox($false,0);
	$chbox2->show();
	$cvbox1->pack_start($chbox2,$true,$true,0);
	
	$compose_edit = new Gtk::Text;
	$compose_edit->set_word_wrap(1);
	$compose_edit->set_editable(1);

	$signature_text = "";
	open(SIG,"$cnf_sig");
	while(<SIG>) {
		$signature_text = "$signature_text$_";
	}

	@mesg_lines = split(/\n/,$mesg);
	$mesg = "";
	for ($i = 0; $i <= $#mesg_lines; $i++) {
		$mesg = "$mesg$cnf_quote $mesg_lines[$i]\n";
	}

	$compose_edit->insert('','','',"$mesg");
	$compose_edit->insert('','','',"--\n$signature_text");

	$scrollbar = new Gtk::VScrollbar($compose_edit->vadj);
	$scrollbar->show();
	$compose_edit->show();
	$chbox2->pack_start($compose_edit,$true,$true,0);	
	$chbox2->pack_start($scrollbar,$false,$false,0);
	$chbox2->show();
	$compose_window->show();

}


sub select_folder {
	($i,$current_folder_number) = @_;
	my $j = $number_of_mails[$current_folder_number];

	if($j < 0) {
		$folder_list->set_text($current_folder_number,1,"0");
	} else {
		my $j2 = $j + 1;
		$folder_list->set_text($current_folder_number,1,"$j2");
	}

	$message_list->freeze();
	$message_list->clear();
	$i = 0;
	while($i <= $j) {
		my @a = ($i+1,"$head[$current_folder_number][$i][0]","$head[$current_folder_number][$i][1]","$head[$current_folder_number][$i][2]","$head[$current_folder_number][$i][3]");
		$message_list->insert($i,@a);
		$i++;
	}
	$message_list->thaw();
}

sub unselect_folder {
	$current_folder_number = "";
	$current_mail = "";
	$message_list->clear()
}

sub select_mail {
	my($message,$i) = @_;
	$current_mail = $i;
	$head[$current_folder_number][$i][0] = "RO";
	$headings[$current_folder_number][$current_mail] =~ s/Status: .+/Status: RO/;
	$i = $main_mailreader->get_chars(0,-1);
	$main_mailreader->freeze();
	$main_mailreader->set_point(length($i));
	$main_mailreader->backward_delete(length($i));
	$main_mailreader->insert('','','',"From: $head[$current_folder_number][$current_mail][1]\nTo: $head[$current_folder_number][$current_mail][4]\nSubject: $head[$current_folder_number][$current_mail][2]\nCC: $head[$current_folder_number][$current_mail][6]\nReply-to: $head[$current_folder_number][$current_mail][5]\nDate: $head[$current_folder_number][$current_mail][3]\n\n$messages[$current_folder_number][$current_mail]");
	$main_mailreader->thaw();
	$message_list->freeze();
	$message_list->set_text($current_mail,1,"RO");
	$message_list->thaw();
}

sub unselect_mail {
	$current_mail = "";
}

sub view_mail {
	my($vwindow,$viewmail_reader,$vm_vbox,$vm_hbox1,$vm_hbox2); 
	my($message,$i) = @_;

	if ($current_mail eq undef) {
	} else {
    
	    $vwindow = new Gtk::Window(-toplevel);
	    $vwindow->set_title("Mail-Window");	    
	    $vwindow->set_usize(480,350);

	    $vm_vbox = new Gtk::VBox($false,0);
	    $vm_vbox->show();
	    $vwindow->add($vm_vbox);
    
	    $handlebox = new Gtk::HandleBox();
	    $vm_vbox->pack_start($handlebox,$false,$false,0);

	    $toolbar = new Gtk::Toolbar('horizontal','text');
	    $toolbar->set_space_size(2);
	    $handlebox->add($toolbar);

	    # Print-Button:
	    $button = $toolbar->append_item("Print","print mail","","",);
	    $button->signal_connect("clicked", sub {&print_mail($current_mail)});
	    $toolbar->append_space();

	    # Save-Button:
	    $button = $toolbar->append_item("Save","save mail","","",);
	    $button->signal_connect("clicked", sub {&save_mail($current_mail)});
	    $toolbar->append_space();

	    # Close-Button:
	    $button = $toolbar->append_item("Close","Quit","","",);
	    $button->signal_connect("clicked", sub { $vwindow->destroy()});
	    $toolbar->append_space();

	    $viewmail_reader = new Gtk::Text;
	    $viewmail_reader->set_word_wrap(1);
	    $viewmail_reader->set_editable(0);
	    $viewmail_reader->insert('','','',"From: $head[$current_folder_number][$current_mail][1]\nTo: $head[$current_folder_number][$current_mail][4]\nSubject: $head[$current_folder_number][$current_mail][2]\nCC: $head[$current_folder_number][$current_mail][6]\nReply-to: $head[$current_folder_number][$current_mail][5]\nDate: $head[$current_folder_number][$current_mail][3]\n\n$messages[$current_folder_number][$current_mail]");
	    $viewmail_reader->show();

	    $scrollbar = new Gtk::VScrollbar($viewmail_reader->vadj);
	    $scrollbar->show();

	    $vm_hbox2 = new Gtk::HBox($false,0);
	    $vm_hbox2->show();
	    $vm_vbox->add($vm_hbox2);

	    $vm_hbox2->pack_start($viewmail_reader,$true,$true,0);
	    $vm_hbox2->pack_start($scrollbar,$false,$false,0);
    
	    $toolbar->show();
	    $handlebox->show();
	    $vwindow->show();
	}
}

sub print_mail {
	if($cnf_prn eq "") {
		PMC::GUI->fyi("No printing command defined!!\nAborting...");
	} else {
    	        my($message,$i) = @_;
	        my $printfile = "/tmp/pmc.tmp";
	        open(PMCPRINT, ">$printfile");
	        print PMCPRINT "From: $head[$current_folder_number][$current_mail][1]\nTo: $head[$current_folder_number][$current_mail][4]\nSubject: $head[$current_folder_number][$current_mail][2]\nCC: $head[$current_folder_number][$current_mail][6]\nReply-to: $head[$current_folder_number][$current_mail][5]\nDate: $head[$current_folder_number][$current_mail][3]\n\n$messages[$current_folder_number][$current_mail]";
	        close(PMCPRINT);
	        system("$cnf_prn $printfile");
	        unlink($printfile);
	}
}

sub save_mail {
	my($message,$i) = @_;
	my $savefile = "$ENV{HOME}/pmc-$head[$current_folder_number][$current_mail][2]";

        open(SAVEFILE, ">$savefile");
        print SAVEFILE "From: $head[$current_folder_number][$current_mail][1]\nTo: $head[$current_folder_number][$current_mail][4]\nSubject: $head[$current_folder_number][$current_mail][2]\nCC: $head[$current_folder_number][$current_mail][6]\nReply-to: $head[$current_folder_number][$current_mail][5]\nDate: $head[$current_folder_number][$current_mail][3]\n\n$messages[$current_folder_number][$current_mail]";
        close(SAVEFILE);

	my $current_mail2 = $current_mail + 1;
        PMC::GUI->fyi("Mail $current_mail2 saved to $ENV{'HOME'}/$savefile");
}

sub search_entry {
	my ($swindow,$svbox,$shbox,$rlist_scroll,$result_list,$query,$button);

	$swindow = new Gtk::Window;
	$swindow->set_title("Search Query");

	$svbox = new Gtk::VBox($false,0);
	$svbox->show();
	$swindow->add($svbox);

	$shbox = new Gtk::HBox($false,0);
	$shbox->show();
	$svbox->pack_start($shbox,$false,$false,0);

	$query = new Gtk::Entry;
	$query->show();
	$shbox->pack_start($query,$false,$false,0);

	$button = new Gtk::Button("Search");
	$button->signal_connect("clicked", sub {&do_search($query->get_text(), $result_list)});
	$button->show();
	$shbox->pack_start($button,$false,$false,0);

	$button = new Gtk::Button("Clear");
	$button->signal_connect("clicked", sub{$result_list->clear()});
	$button->show();
	$shbox->pack_start($button,$false,$false,0);
	
	$button = new Gtk::Button("Close");
	$button->signal_connect("clicked", sub {$swindow->destroy()});
	$button->show();
	$shbox->pack_start($button,$false,$false,0);

	$result_list = new_with_titles Gtk::CList("Search Results");
	$result_list->set_usize(200,100);
	$result_list->set_column_width(0,200);
	$result_list->show();

	$rlist_scroll = new Gtk::ScrolledWindow(undef, undef);
	$rlist_scroll->set_policy('automatic', 'always');
	$rlist_scroll->show();
	$svbox->pack_start($rlist_scroll,$true,$true,0);
	$rlist_scroll->add($result_list);
	
	$swindow->show()
}

sub do_search {
	my ($query,$result_list) = @_;
	my ($r, $i, $j);
	$result_list->clear();
	for ($j = 0; $j <= $number_of_mails[$i]; $j++) {
		if ($messages[$i][$j] =~ /\b$query\b/) {
			$result_list->insert($j,">> $head[$current_folder_number][$j][2] <<");
		}
	}
}

sub mbox_write {
	my($i,$j);
	for ($i = 0; $i <= $#folders; $i++) {
		open(FOLDER,">$folders[$i]");
		for ($j = 0; $j <= $number_of_mails[$i]; $j++) {
			print FOLDER "From pmc_check Mon Jan  1 15:30:07 2000\n";
			print FOLDER "$headings[$i][$j]\n\n";
			print FOLDER "$messages[$i][$j]\n";
		}
		close(FOLDER);
	}
}

sub update_mails {
	&read_folders($folder_list);
	my ($head_ref,$messages_ref,$headings_ref,$num_ref) = &generate_mails();
	@head = @$head_ref;
	@messages = @$messages_ref;
	@headings = @$headings_ref;
	@number_of_mails = @$num_ref;
}

sub read_folders {
	my $widget = $_[0];
	my (@a,@indices);
	@folders = ();
	my @folder_names = ();
	opendir(MAILDIR, $maildir) || PMC::GUI->fyi("Can't open $maildir !!");
	@folders = grep !/^\.\.?$/, readdir MAILDIR;
	closedir(MAILDIR);
	for ($i = 0; $i <= $#folders; $i++) {
		$folders[$i] = "$maildir$folders[$i]"
	}
	$folders[$#folders+1] = "$spooldir$ENV{'USER'}";
	@folders = sort(@folders);
	@folder_names = @folders;
	for ($i = 0; $i <= $#folders; $i++) {
		@a = split(/\//,$folder_names[$i]);
		$folder_names[$i] = $a[$#a];
	}
	@indices = sort {$folder_names[$a] cmp $folder_names[$b]} (0 .. $#folder_names);
	@folders = @folders[@indices];
	@folder_names = sort @folder_names;

	$widget->freeze();
	$widget->clear();
	for ($i = 0; $i <= $#folders; $i++) {
		$widget->insert($i,$folder_names[$i]);
		$folder_list->set_text($i,1,"0");
	}
	$widget->thaw();
}

sub generate_mails {
	my ($i,$j,$k,$body,$heading,@headers,@a);
	
	for ($i = 0; $i <= $#folders; $i++) {
		open(MAILFILE, "$folders[$i]");
		$/ = "\n\nFrom ";
		$j = 0;
		while ($body = <MAILFILE>) {
			$body =~ s/\nFrom $//s; 		
			$body =~ s/^.*\n//m;
			$body =~ /(.+?)\n\n/s and $heading = $1;
			$body =~ s/(.+?)\n\n//s;

			if($pgp eq "1") {
				if($body =~ /^-----BEGIN PGP SIGNED MESSAGE-----/) {
					my $body_pgp = $body;
					$body = PMC::PGP->decrypt_mail($body_pgp);
				} elsif($body =~ /^-----BEGIN PGP MESSAGE-----/) {
					my $body_pgp = $body;
					$body = PMC::PGP->decrypt_mail($body_pgp);
				}
			}

			$messages[$i][$j] = $body;
			$heading =~ s/\n\s+//g;
			$headings[$i][$j] = $heading;
			@headers = split /\n/, $heading;
			foreach (@headers) {
				chomp;
				/^Status:\s+(.+)/i and $head[$i][$j][0] = $1;
				/^From:\s+(.+)/i and $head[$i][$j][1] = "$1";
				/^Subject:\s+(.+)/i and $head[$i][$j][2] = $1;
				/^Date:\s+(.+)/i and $head[$i][$j][3] = $1;
				/^To:\s+(.+)/i and $head[$i][$j][4] = $1;
				/^Reply-To:\s+(.+)/i and $head[$i][$j][5] = $1;
				/^Cc:\s+(.+)/i and $head[$i][$j][6] = $1;
				s/\[/\\\[/g;
				s/\]/\\\]/g;
			}
			if ($head[$i][$j][5] eq "") {
				$head[$i][$j][5]  = $head[$i][$j][1];
			}

			$head[$i][$j][1] = &fix_addresses($head[$i][$j][1]);
			$head[$i][$j][4] = &fix_addresses($head[$i][$j][4]);
			$head[$i][$j][5] = &fix_addresses($head[$i][$j][5]);
			$head[$i][$j][6] = &fix_addresses($head[$i][$j][6]);

			if ($head[$i][$j][1] =~ /MAILER-DAEMON/) {
				$j--;
			}
			$j++;
		}
		$number_of_mails[$i] = $#{$messages[$i]};
		close(MAILDIR);
	}
        $/ = "\n";
	return(\@head,\@messages,\@headings,\@number_of_mails)
}

sub fix_addresses {
	my ($address) = @_;
	my (@a,$i,$fixed);
	$address =~ s/\"//g;
	$address =~ s/\>//g;
	$address =~ s/\<//g;
	$address =~ s/\)//g;
	$address =~ s/\(//g;
	@a = split(/ /,$address);
	$fixed = "";
	for ($i = 0; $i <= $#a; $i++) {
		if ($a[$i] =~ /\@/) {
			$a[$i] =~ s/\s+$//;;
			$fixed =  "$a[$i], $fixed";
		}
	}
	$fixed =~ s/\s+$//;
	$fixed =~ s/,$//;
	$fixed =~ s/,$//; # dont ask....
	return($fixed);
}

sub add_folder {
	my ($folder,$widget) = @_;
	open(FOLDER,">$maildir$folder") || PMC::GUI->fyi("Cannot write folder");
	$number_of_mails[$#number_of_mails+1] = -1;
	$folders[$#folders] = "$maildir$folder";
	close(FOLDER);
	&read_folders($widget);
}

sub del_folder {
	my ($folder,$widget) = @_;
	if ($folder ne "" && $folder ne "$maildir/$ENV{'USER'}") {
		unlink($_[0]);
		&read_folders($widget);
	}
}

sub read_config {
	my $file = $_[0];
	my ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o);

	open(FILE, "$file");
	while(<FILE>) {
		chomp($_);
		if (/name .*/) { 		($a,$b) = split(/ /,$_,2); }
		if (/email .*/) { 		($a,$c) = split(/ /,$_,2); }
		if (/sig .*/) {			($a,$d) = split(/ /,$_,2); }
		if (/smtp .*/) { 		($a,$e) = split(/ /,$_,2); }
		if (/pop3_server .*/) {		($a,$f) = split(/ /,$_,2); }
		if (/pop3_user .*/) { 		($a,$g) = split(/ /,$_,2); }
		if (/pop3_pass .*/) { 		($a,$h) = split(/ /,$_,2); }
		if (/imap_server .*/) {		($a,$i) = split(/ /,$_,2); }
		if (/imap_user .*/) { 		($a,$j) = split(/ /,$_,2); }
		if (/imap_pass .*/) { 		($a,$k) = split(/ /,$_,2); }
		if (/prn .*/) { 		($a,$l) = split(/ /,$_,2); }
		if (/quote .*/) { 		($a,$m) = split(/ /,$_,2); }
		if (/pgp_userid .*/) { 		($a,$n) = split(/ /,$_,2); }
		if (/pgp_passphrase .*/) { 	($a,$o) = split(/ /,$_,2); }
	}
	close(FILE);
	return($b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o);
}

sub write_config {
	my ($c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$file) = @_;
	$cnf_name = 		$c;
    	$cnf_email = 		$d;
	$cnf_sig = 		$e;
	$cnf_smtp = 		$f;
	$cnf_pop3_server = 	$g;
	$cnf_pop3_user = 	$h;
	$cnf_pop3_pass = 	$i;
	$cnf_imap_server = 	$j;
	$cnf_imap_user = 	$k;
	$cnf_imap_pass = 	$l;
	$cnf_prn = 		$m;
	$cnf_quote = 		$n;
	$cnf_pgp_passphrase = 	$o;
	$cnf_pgp_userid = 	$p;
	open(FILE, ">$file");
	print FILE "name $cnf_name\n";
	print FILE "email $cnf_email\n";
	print FILE "sig $cnf_sig\n";
	print FILE "smtp $cnf_smtp\n";
	print FILE "pop3_server $cnf_pop3_server\n";
	print FILE "pop3_user $cnf_pop3_user\n";
	print FILE "pop3_pass $cnf_pop3_pass\n";
	print FILE "imap_server $cnf_imap_server\n";
	print FILE "imap_user $cnf_imap_user\n";
	print FILE "imap_pass $cnf_imap_pass\n";
	print FILE "prn $cnf_prn\n";
	print FILE "quote $cnf_quote\n";
	print FILE "pgp_userid $cnf_pgp_userid\n";
	print FILE "pgp_passphrase $cnf_pgp_passphrase\n";
	close(FILE);
}

sub del_mail {
	if ($current_mail ne "" && $current_folder_number ne "") {
		splice(@{$messages[$current_folder_number]},$current_mail,1);
		splice(@{$head[$current_folder_number]},$current_mail,1);
		splice(@{$headings[$current_folder_number]},$current_mail,1);
		$number_of_mails[$current_folder_number]--;
	 	&select_folder($current_mail,$current_folder_number);
		$i = $main_mailreader->get_chars(0,-1);
		$main_mailreader->freeze();
		$main_mailreader->set_point(length($i));
		$main_mailreader->backward_delete(length($i));
		$main_mailreader->thaw();
		&mbox_write();
	}
}

sub flush_mails {
	my($c,$i,$j);
	if ($current_folder_number ne "") {
	    $j = -1;
	    $c = $number_of_mails[$current_folder_number];  
	    while ($j <= $c) {
		$j++;
		splice(@{$messages[$current_folder_number]},$current_mail,1);
		splice(@{$head[$current_folder_number]},$current_mail,1);
		splice(@{$headings[$current_folder_number]},$current_mail,1);
	 	&select_folder($current_mail,$current_folder_number);
		$number_of_mails[$current_folder_number]--;
		$i = $main_mailreader->get_chars(0,-1);
		$main_mailreader->freeze();
		$main_mailreader->set_point(length($i));
		$main_mailreader->backward_delete(length($i));
		$main_mailreader->thaw();
		&mbox_write();
	    }
	}
    &update_mails;
}


sub send_mail {
	my ($to,$from,$subject,$cc,$text,$widget) = @_;
	my ($smtp,$data,@a,@rcpt,$i);
	if ($to eq "" || $from eq "") {
		return();
	}
	@rcpt = split(/,/,"$to,$cc");
	$data = "To: $to\nCC: $cc\nSubject:$subject\n\n$text\r\n";
	@a = split(/@/, $from,2);
	$smtp = Net::SMTP->new(	"$cnf_smtp",
				Hello => "$a[1]",
				Timeout => 100,
				Debug => $debug 
			       );	
	if($smtp eq undef) {
		PMC::GUI->fyi("Can't connect to $cnf_smtp");
	} else {
		$smtp->mail($from);
		for ($i = 0; $i <= $#rcpt; $i++) {
			$smtp->to("$rcpt[$i]");
		}
		$smtp->data($data);
		$smtp->quit();
		$widget->destroy();
	}
}


sub address_book {
	my (@a,$addresses_ref,$sel_address,$ahbox,$ahbox2,$avbox,$address_list,$button);
	$addresses_ref = &read_addresses();
	@addresses = @$addresses_ref;
	my $addy_window = new Gtk::Window(-toplevel);
	$addy_window->set_title("Address Book");
	
	$avbox = new Gtk::VBox($false,0);
	$avbox->show();
	$addy_window->add($avbox);

	$address_list = new_with_titles Gtk::CList("Name","eMail");
	$address_list->signal_connect("select-row",sub {$sel_address = $_[1]});
	$address_list->set_column_width(0,100);
	$address_list->set_column_width(1,200);
	$address_list->show();
	for ($i = 0; $i <= $#addresses; $i++) {
		@a = ("$addresses[$i][1]","$addresses[$i][2]");
		$address_list->insert($i,@a);
	}
	$avbox->pack_start($address_list,$true,$true,0);
	
	$ahbox = new Gtk::HBox($false,0);
	$ahbox->show();
	$avbox->pack_start($ahbox,$false,$false,0);
	
	$button = new Gtk::Button("Add");
	$button->signal_connect("clicked", sub {&add_addy($address_list)});
	$button->show();
	$ahbox->pack_start($button,$true,$true,0);

	$button = new Gtk::Button("Delete");
	$button->signal_connect("clicked", sub {&del_addy($address_list,$sel_address)});
	$button->show();
	$ahbox->pack_start($button,$true,$true,0);

	$button = new Gtk::Button("Close");
	$button->signal_connect("clicked", sub{&write_book(); $addy_window->destroy()});
	$button->show();
	$ahbox->pack_start($button,$true,$true,0);
	
	$addy_window->show();
}

sub read_addresses {
	my ($i,@a);
	open(BOOK,"$address_book");
	$i = 0;
	while(<BOOK>) {
		chomp;
		@{$a[$i]} = split(/\t/, $_);
		$i++;
	}
	return(\@a);
}

sub add_addy {
	my ($widget) = @_;
	my ($add_addy_window,$atable,$n_entry,$e_entry);
	$add_addy_window = new Gtk::Window;
	$add_addy_window->set_title("Add Address");

	$atable = new Gtk::Table(3,2,0);
	$atable->show;
	$add_addy_window->add($atable);
	
	$label = new Gtk::Label("Name: ");
	$label->show();
	$n_entry = new Gtk::Entry(50);
	$n_entry->show();
	$atable->attach_defaults($label,0,1,0,1);
	$atable->attach_defaults($n_entry,1,2,0,1);

	$label = new Gtk::Label("eMail Address: ");
	$label->show();
	$e_entry = new Gtk::Entry(50);
	$e_entry->show();
	$atable->attach_defaults($label,0,1,1,2);
	$atable->attach_defaults($e_entry,1,2,1,2);
		
	$button = new Gtk::Button("Add");
	$button->signal_connect("clicked",sub {&add_name($n_entry->get_text(),$e_entry->get_text(),$widget); $add_addy_window->destroy});
	$button->show();
	$atable->attach_defaults($button,0,1,2,3);

	$button = new Gtk::Button("Cancel");
	$button->signal_connect("clicked",sub {$add_addy_window->destroy});
	$button->show();
	$atable->attach_defaults($button,1,2,2,3);

	$add_addy_window->show();
}

sub add_name {
	my ($name,$email,$widget) = @_;
	my (@a,$i);
	if ($name eq "" || $email eq "") {
		return;
	}
	@{$addresses[$#addresses+1]} = ($name,$name,$email,,);
	$widget->freeze();
	$widget->clear();
	for ($i = 0; $i <= $#addresses; $i++) {
		@a = ("$addresses[$i][1]","$addresses[$i][2]");
		$widget->insert($i,@a);
	}
	$widget->thaw();
}

sub write_book {
	my ($i,$j);
	open (BOOK,">$address_book");
	for($i = 0; $i <= $#addresses; $i++) {
		for ($j = 0; $j <= 4; $j++) {
			chomp($addresses[$i][$j]);
			print BOOK "$addresses[$i][$j]	";
		}
		print BOOK "\n";
	}
	close(BOOK);
} 

sub del_addy {
	my ($widget,$sel_address) = @_;
	my @a;
	splice(@addresses,$sel_address,1);
	$widget->freeze();
	$widget->clear();
	for ($i = 0; $i <= $#addresses; $i++) {
		@a = ("$addresses[$i][1]","$addresses[$i][2]");
		$widget->insert($i,@a);
	}
	$widget->thaw();
}

sub select_address {
	my ($widget) = @_;
	my (@a,$sa_window,$addresses_ref,$sel_address,$sa_hbox,$sa_vbox,$address_list);
	$addresses_ref = &read_addresses();
	@addresses = @$addresses_ref;
	$sa_window = new Gtk::Window(-toplevel);
	$sa_window->set_title("Select address");
	
	$sa_vbox = new Gtk::VBox($false,0);
	$sa_vbox->show();
	$sa_window->add($sa_vbox);

	$address_list = new_with_titles Gtk::CList("Name","eMail");
	$address_list->signal_connect("select-row",sub {$sel_address = $addresses[$_[1]][2]});
	$address_list->set_column_width(0,100);
	$address_list->set_column_width(1,200);
	$address_list->show();
	for ($i = 0; $i <= $#addresses; $i++) {
		@a = ("$addresses[$i][1]","$addresses[$i][2]");
		$address_list->insert($i,@a);
	}
	$sa_vbox->pack_start($address_list,$true,$true,0);
	
	$sa_hbox = new Gtk::HBox($false,0);
	$sa_hbox->show();
	$sa_vbox->add($sa_hbox);

	$button = new Gtk::Button("Select");
	$button->signal_connect("clicked", sub {$widget->set_text($sel_address); $sa_window->destroy()});
	$button->show();
	$sa_hbox->pack_start($button,$true,$true,0);

	$sa_window->show();
}	

sub quit {
	&mbox_write();
	my $unlock = PMC::MBox->unlock();
	if($unlock eq undef) {
	    PMC::GUI->fyi("Could not unlock mbox: $!");	
	} 
	Gtk->exit(0);
}

