# $Id: Read.pm,v 1.11 2001/07/13 08:39:27 muhri Exp $
# -*- perl -*-
package Pronto::Read;
use SelfLoader;
use strict;
use MIME::Words;

sub init_read_pane
{
	my($nvbox,$lbl1,$lbl2,$lbl3,$lbl4,$lbl6,$bg);
 	if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
  		my($popup,$url,$sep,$item);
  		$popup = new Gtk::Menu;
		if ($main::HTMLWIDGET eq "GtkHTML") {
  			$main::root_window->{'html_view'} = new Gtk::HTML;
  		} elsif ($main::HTMLWIDGET eq "CscHTML") {
			$main::root_window->{'html_view'} = new Csc::HTML;
			$main::root_window->{'html_view'}->set_default_font_face($main::prefs{'MsgFontFace'});
			$main::root_window->{'html_view'}->allow_font_switch($main::prefs{'FontSwitch'});
		}
		$main::root_window->{'html_view'}->signal_connect('url_requested' =>\&Pronto::Link::load_url);
  		$main::root_window->{'html_view'}->signal_connect('link_clicked' => \&Pronto::Link::gtkhtml_link_clicked);
		$main::root_window->{'html_view'}->signal_connect('button_press_event',\&Pronto::Read::gtkhtml_mouse_click,$popup, \$url);
  		$main::root_window->{'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:$main::prefs{'MailDir'}\/tmp\///g;
                					&Pronto::Save::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);
               					        &Pronto::ViewAttachment::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);
                					&Pronto::ViewAttachment::view_attachment(undef,$source,$type,'n');
        						});
  		$item->show;
  		$popup->append($item);
  		$main::root_window->{'html_view'}->enable_debug(0);
  		$main::root_window->{'html_view'}->set_editable(0);
  	} elsif ($main::HTMLWIDGET eq "text") {
  		my($popup,$url,$sep,$item);
  		$popup = new Gtk::Menu;
  		$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:$main::prefs{'MailDir'}\/tmp\///g;
                					&Pronto::Save::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);
                					&Pronto::ViewAttachment::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);
                					&Pronto::ViewAttachment::view_attachment(undef,$source,$type,'n');
        						});
   		$item->show;
   		$popup->append($item);
  		$main::root_window->{'html_view'} = new Gtk::Text;
  		$main::root_window->{'html_view'}->show;
  		$main::root_window->{'html_view'}->set_editable(0);
		$main::root_window->{'html_view'}->signal_connect("button_release_event" =>\&Pronto::Read::textclick,$popup,\$url);
    	} else {
  		$main::root_window->{'html_view'} = new Gtk::XmHTML;
  		$main::root_window->{'html_view'}->set_anchor_buttons(0);
  		$main::root_window->{'html_view'}->set_allow_body_colors(1);
  		$main::root_window->{'html_view'}->set_hilight_on_enter(0);
  		$main::root_window->{'html_view'}->set_allow_font_switching(0);
  		$main::root_window->{'html_view'}->set_allow_images(1); 
  		$main::root_window->{'html_view'}->set_strict_checking(1);
  		$main::root_window->{'html_view'}->set_anchor_target_underline_type (1); 
  		$main::root_window->{'html_view'}->set_anchor_underline_type (1);
  		$main::root_window->{'html_view'}->set_anchor_visited_underline_type(1);
  		$main::root_window->{'html_view'}->set_anchor_target_underline_type (1);
  		$main::root_window->{'html_view'}->set_anchor_underline_type (1);  
  		$main::root_window->{'html_view'}->set_anchor_visited_underline_type(1);
  		$main::root_window->{'html_view'}->signal_connect('activate' => \&Pronto::Link::link_clicked);
 
 	}
 
 	$nvbox=new Gtk::VBox('0','0');
 	$main::root_window->{'table1'} = new Gtk::Table('2','4','0');
 	$main::root_window->{'table1'}->set_row_spacings('0');
 	$main::root_window->{'table1'}->set_col_spacings('0');
 	$main::root_window->{'table1'}->border_width('2');
 	$lbl1 = new Gtk::Label("To: ");
 	$lbl1->set_justify('left');
 	$lbl1->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($lbl1,'2','3','0','1',['fill'],[],'0','0');
 	$lbl1->set_alignment('0','0.5');
 	$lbl1->set_style($main::head_style);
 	$lbl2 = new Gtk::Label("From: ");
 	$lbl2->set_justify('left');
 	$lbl2->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($lbl2,'0','1','0','1',['fill'],[],'0','0');
 	$lbl2->set_alignment('0','0.5');
 	$lbl2->set_style($main::head_style);
 	$lbl3 = new Gtk::Label("CC: ");
 	$lbl3->set_justify('left');
 	$lbl3->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($lbl3,'2','3','1','2',['fill'],[],'0','0');
 	$lbl3->set_alignment('0','0.5');
 	$lbl3->set_style($main::head_style);
 	$lbl4 = new Gtk::Label("Subject: ");
 	$lbl4->set_justify('left');
 	$lbl4->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($lbl4,'0','1','1','2',['fill'],[],'0','0');
 	$lbl4->set_alignment('0','0.5');
 	$lbl4->set_style($main::head_style);
 	$lbl6 = new Gtk::Label("Date: ");
 	$lbl6->set_justify('left');
 	$lbl6->set_line_wrap('0');
	$main::root_window->{'table1'}->attach($lbl6,'0','1','2','3',['fill'],[],'0','0');
 	$lbl6->set_alignment('0','0.5');
 	$lbl6->set_style($main::head_style);
 	$main::root_window->{'table1'}->{'to_lbl'} = new Gtk::Label;
 	$main::root_window->{'table1'}->{'to_lbl'}->set_justify('left');
 	$main::root_window->{'table1'}->{'to_lbl'}->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($main::root_window->{'table1'}->{'to_lbl'},'3','4','0','1',['fill'],[],'0','0');
 	$main::root_window->{'table1'}->{'to_lbl'}->set_alignment('0','0.5');
 	$main::root_window->{'table1'}->{'from_lbl'} = new Gtk::Label;
 	$main::root_window->{'table1'}->{'from_lbl'}->set_justify('left');
 	$main::root_window->{'table1'}->{'from_lbl'}->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($main::root_window->{'table1'}->{'from_lbl'},'1','2','0','1',['expand','fill'],[],'0','0');
 	$main::root_window->{'table1'}->{'from_lbl'}->set_alignment('0','0.5');
 	$main::root_window->{'table1'}->{'subj_lbl'} = new Gtk::Label;
 	$main::root_window->{'table1'}->{'subj_lbl'}->set_justify('left');
 	$main::root_window->{'table1'}->{'subj_lbl'}->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($main::root_window->{'table1'}->{'subj_lbl'},'1','2','1','2',['expand','fill'],[],'0','0');
 	$main::root_window->{'table1'}->{'subj_lbl'}->set_alignment('0','0.5');
 	$main::root_window->{'table1'}->{'cc_lbl'} = new Gtk::Label;
 	$main::root_window->{'table1'}->{'cc_lbl'}->set_justify('left');
	$main::root_window->{'table1'}->{'cc_lbl'}->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($main::root_window->{'table1'}->{'cc_lbl'},'3','4','1','2',['fill'],[],'0','0');
 	$main::root_window->{'table1'}->{'cc_lbl'}->set_alignment('0','0.5');
 	$main::root_window->{'table1'}->{'date_lbl'} = new Gtk::Label;
 	$main::root_window->{'table1'}->{'date_lbl'}->set_justify('left');
 	$main::root_window->{'table1'}->{'date_lbl'}->set_line_wrap('0');
 	$main::root_window->{'table1'}->attach($main::root_window->{'table1'}->{'date_lbl'},'1','2','2','3',['expand','fill'],[],'0','0');
 	$main::root_window->{'table1'}->{'date_lbl'}->set_alignment('0','0.5');
 	$main::attpixmap = new Gtk::EventBox;
 	$main::attpixmap->set_events('button_press_mask');
 	$main::attpixmap->signal_connect("button_press_event" =>\&Pronto::MainWindow::rightclick, 1);
 	$main::attpixmap->{'popup'} = new Gtk::Menu;
 	$main::attach_menu2 = new Gtk::Menu;
 	$main::attpixmap->{'popup'}->show;
 	$main::attpixmap->{'popup'}->{'save'} = new Gtk::MenuItem(_("Save "));
 	$main::attpixmap->{'popup'}->{'save'}->show;
 	$main::attpixmap->{'popup'}->{'save'}->set_submenu($main::attach_menu2);
 	$main::attpixmap->{'popup'}->append($main::attpixmap->{'popup'}->{'save'});
 	$main::view_attach_menu2 = new Gtk::Menu;
 	$main::attpixmap->{'popup'}->show;
 	$main::attpixmap->{'popup'}->{'view'} = new Gtk::MenuItem(_("View "));
 	$main::attpixmap->{'popup'}->{'view'}->show;
 	$main::attpixmap->{'popup'}->{'view'}->set_submenu($main::view_attach_menu2);
 	$main::attpixmap->{'popup'}->append($main::attpixmap->{'popup'}->{'view'});
 	my ($button_pixmap, $button_mask);
 	$bg = $main::root_window->style->bg('normal');
 	if(-f "$main::prefs{'PixmapDir'}/ab.xpm") {
 		($button_pixmap, $button_mask) = Gtk::Gdk::Pixmap->create_from_xpm($main::root_window->window,$bg, "$main::prefs{'PixmapDir'}/ab.xpm");
 	}
 	else {
		($button_pixmap, $button_mask) = Gtk::Gdk::Pixmap->create_from_xpm_d($main::root_window->window,$bg, @main::dummy_pixmap);
 	}
 	$main::root_window->{'attbtn'} = new Gtk::Pixmap($button_pixmap, $button_mask);
 	$main::root_window->{'attbtn'}->show;
 	$main::attpixmap->add($main::root_window->{'attbtn'});
 	my $tablehbox = new Gtk::HBox(0,0);
 	$tablehbox->show;
 	$tablehbox->pack_start($main::root_window->{'table1'},1,1,5);
 	$tablehbox->pack_end($main::attpixmap,0,0,5);
 	$nvbox->pack_start($tablehbox,0,0,0);

 	if ($main::HTMLWIDGET eq "GtkHTML" or $main::HTMLWIDGET eq "text" or $main::HTMLWIDGET eq "CscHTML") {
 		 $main::root_window->{'sw'} = new Gtk::ScrolledWindow(undef, undef);
 		 $main::root_window->{'sw'}->set_policy('automatic', 'automatic');
 		 $main::root_window->{'sw'}->add($main::root_window->{'html_view'});
  		 $nvbox->add($main::root_window->{'sw'});
 	} else {
  		$nvbox->add($main::root_window->{'html_view'});
 	}

	return $nvbox,$main::root_window->{'attbtn'},$button_pixmap,$button_mask,$tablehbox;
}


# 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,@otherparts);
	my $font = Gtk::Gdk::Font->load($main::prefs{'FontComposer'});
	if ($main::prefs{'useGtkFontComposer'} eq "y") { $font = "" }
	# whatever called us has a header pane setup, so lets fill in it's info

       	$main::current = $msgid;
	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= '$msgid'";
		$query=$conn->prepare($sql);
		$query->execute();
		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)) { $main::attpixmap->show; } else { $main::attpixmap->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 $main::entity{$msgid}) {
		$main::entity{$msgid} = &Pronto::Data::Message::get_parsed_mime($msgid);
	}	
	# We got an attachment menu, lets clear it out....

	if (defined $attach_menu) {
		foreach (@{$main::attach_menu->{'items'}}) {
			$_->destroy;
		}
	        foreach (@{$main::attach_menu2->{'items'}}) {
		        $_->destroy;
		}
                foreach (@{$main::view_attach_menu->{'items'}}) {
                        $_->destroy;
                }
		foreach (@{$main::view_attach_menu2->{'items'}}) {
                        $_->destroy;
                }
	}
	if (defined $main::entity{$msgid}) {
		$main::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 $main::entity{$output_widget->{'entid'}}) {
			if ($output_widget->{'entid'} != $msgid) {
				&main::destroy_entity(undef, $output_widget->{'entid'});  # destroy_entity will decrement usecount and destroy if 0
			} else {
				$main::entity{$msgid}->{'usecount'}--;  # we are displaying the same entity we had last time, so the use count shouldnt go up
			}
		}
		if (defined $output_widget->{'sigid'}) { $output_widget->signal_disconnect($output_widget->{'sigid'});}
		$output_widget->{'sigid'} = $output_widget->signal_connect('destroy' => \&main::destroy_entity, $msgid);
		$output_widget->{'entid'} = $msgid; # so we can check next time this widget gets used...
		#$output_widget->signal_connect('destroy' => \&main::destroy_entity, $msgid); # so that when the window goes away, we can clear it out
		if ($vtype > 2) {    # the viewer wants a header.....
			$body = $main::entity{$msgid}->stringify_header;
			$type = "text/plain";
		} else {        # the viewer wants the body
			$num_parts=$main::entity{$msgid}->parts;
			if ($num_parts == 0) { # single part message
				$parts[0] = $main::entity{$msgid};
			} else { # multipart message
				@parts = $main::entity{$msgid}->parts;
			}
			foreach $part (@parts) {
       				$type=$part->mime_type;
				my $rec_filename = $part->head->recommended_filename();
			        $rec_filename = MIME::Words::decode_mimewords($rec_filename) if ($rec_filename && $rec_filename ne "");
       				if ($rec_filename && $rec_filename ne "") {
					if (defined $attach_menu) {
						my $menuitem=new Gtk::MenuItem("$rec_filename");
						$menuitem->signal_connect("activate" => \&Pronto::Save::init_fs_window, $rec_filename, "$main::prefs{'MailDir'}/tmp/$rec_filename");
						$menuitem->show; 
						push @{$main::attach_menu->{'items'}}, $menuitem;
						$main::attach_menu->append($menuitem);
					        $menuitem=new Gtk::MenuItem("$rec_filename");
						$menuitem->show;   
						$menuitem->signal_connect("activate" => \&Pronto::Save::init_fs_window, $rec_filename, "$main::prefs{'MailDir'}/tmp/$rec_filename");
						push @{$main::attach_menu2->{'items'}}, $menuitem;
						$main::attach_menu2->append($menuitem);
						$menuitem=new Gtk::MenuItem("$rec_filename");
						$menuitem->signal_connect("activate" => \&Pronto::ViewAttachment::view_attachment, "$main::prefs{'MailDir'}/tmp/$rec_filename", $type, 'y');
                                                $menuitem->show;
                                                push @{$main::view_attach_menu->{'items'}}, $menuitem;
                                                $main::view_attach_menu->append($menuitem);
					  	$menuitem=new Gtk::MenuItem("$rec_filename");
						$menuitem->signal_connect("activate" => \&Pronto::ViewAttachment::view_attachment, "$main::prefs{'MailDir'}/tmp/$rec_filename", $type, 'y');
                                                $menuitem->show;
                                                push @{$main::view_attach_menu2->{'items'}}, $menuitem;
                                                $main::view_attach_menu2->append($menuitem);
					}
					if (defined $attach_clist && $quote != 1  && $quote !=5 && ($main::prefs{'ForwardAttachments'} eq "y" || $quote != 2) ) {
				      		my $error = 0;
						open (FILE, "$main::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(("$main::prefs{'MailDir'}/tmp/$rec_filename",(sprintf("%8.2f",$size)."kb")));
						} else {
							&main::wr_debug("unable to open $rec_filename.");
						} 
					}
					if (($main::prefs{'InlineImages'} eq "y") and ($rec_filename =~ /(bmp|gif|jpg|jpeg|png)$/i)) {
						push @inlineimages, $rec_filename;
					} elsif($main::prefs{'InlineAttachments'} eq "y") {
						push @inlineattach, "$rec_filename:$type";
					}
				}
				if ($type =~ /multipart/i or $type=~ /message\/rfc/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 || $type =~/text/i) {                  # we are looking for TEXT parts...
					if (not defined $view_part) {
						$view_part = $part; 
					}  #still only want the first....
					else {
						push @otherparts,$part;
					}
				}
			}
			if (defined $view_part) {
				if ($io=$view_part->open("r")) {
 					undef $/;
 					$body = $io->getline;
 					$/ = "\n";
					$io->close;
					$type=$view_part->mime_type;
				}
				if (scalar(@otherparts)>0) {
					foreach my $extra (@otherparts) {
      						if ($io=$extra->open("r")) {
							$body=$body."\n\n --- Next Part --- \n\n";
							undef $/;
							my $next = $io->getline;
							$/ = "\n";
       							$io->close;
							$body = $body . $next;
						}
					}
				}
			} else { 
      
				$body = _("No viewable part found.");
				$type="text/plain";
			}
		}
	} else {
		$body = _("Unable to decode message. Please contact Pronto maintainers at pronto\@muhri.net.");
		$type = "text/plain";
	}
	if (($vtype == 1) or ($vtype == 3)) {   # HTML widget....
		if (($type =~ /text\/plain/i) or ($type eq "text")) {
			if ($main::HTMLWIDGET ne "text") {
				$body = &main::text2html($body, \@inlineimages);
			}
		} else {
			if (@inlineimages) {
				$image="";
				foreach (@inlineimages) {
					if ($_ ne "") {
						$url = "$main::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 = "$main::prefs{'PixmapDir'}/unknown.png";
						}
					}
					else {
						$icon = "$main::prefs{'PixmapDir'}/unknown.png";
					}
					$url = "file:$main::prefs{'MailDir'}/tmp/$_";
					if($main::HTMLWIDGET eq "text") {
						$attach = $attach . "$filename -> $url\n";
					}
					else {
						$attach = $attach . "<p><a href=$url>";
						if($main::prefs{'InlineIcons'} eq 'y') {
							$attach = $attach . "<img border=0 src=$icon>";
						}
						$attach = $attach . "$filename</a><br></p>";
					}
				}
			}
			if($main::HTMLWIDGET eq "text") {
				$body = $body . "\n--Attachments--\n\n$attach\n";
			}
			else {
				$body =~ s/<\/body>/$attach<\/body>/;
			}
		}
		if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
			my $tmpfile = "$main::prefs{'MailDir'}/file.html";
			open (DUMP,">$tmpfile");
			print DUMP $body;
			close(DUMP);
			&Pronto::Link::load_url($output_widget,$tmpfile,$output_widget->begin);
		} elsif ($main::HTMLWIDGET eq "text") {
		       $output_widget->freeze;
		       $output_widget->set_point(0);
		       $output_widget->forward_delete($output_widget->get_length);
	  	       if ($main::prefs{'UseMessageColors'} eq "y") {
		       		&main::text2gtktext($body,$font,$output_widget);
		       } else {
		       		$output_widget->insert($font,"","",$body);
		       }
		       $output_widget->thaw;
		} else {
			$body = HtmlStripper->new->parse($body)->filtered_html;
			$output_widget->source($body);
		}
	} else {    # text widget
	
		if ($quote == 1) {
			if ($main::prefs{'SliceSig'}) { #slice out sig
				$body =~ s/\n\-\- \n.*//so;
			}
			
			if (defined $main::prefs{'QuoteWith'}) {
				$body = $main::prefs{'QuoteWith'}  . $body;
				$body =~ s/\n/\n$main::prefs{'QuoteWith'} /g;
			}
			
 			$sql = "select date, sentto, subject, friendly from messages where id = ?";
			$query = $conn->prepare($sql);
			$query->execute($msgid);
 			my ($quotedate, $quoteto, $quotesubject, $quotename) = ($query->fetchrow_array());
			my $prefix = $main::prefs{'QuoteHeader'};
 			$prefix =~ s/\*n/\n/g;
 			$prefix =~ s/%t/$quoteto/g;
 			$prefix =~ s/%s/$quotesubject/g;
			$prefix =~ s/%n/$quotename/g;
			$prefix =~ s/%d/$quotedate/g;
			unless (!$prefix) { $body = $prefix . "\n\n" . $body; }
			$output_widget->insert($font,'','',"$body\n");
		        return 1;
		}  
	#edit code
		if ($quote == 3) { $output_widget->insert($font,'','',"$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;
		  }
							       

		# reply no quote 
		if ($quote == 5) {
	         	return 1; 
	       	}
		#forward code		
		if ($main::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($font,'','',"$body\n");
		} else {
			$output_widget->insert($font,'','',"$body\n");
		}
	}
	return 1;
}


sub clear_widget {
        
	if (defined $main::view_window and $main::prefs{'viewpane'} eq "n") {
		$main::view_window->{'hdr_pane'}->{'to_lbl'}->set_text("");
		$main::view_window->{'hdr_pane'}->{'from_lbl'}->set_text("");
		$main::view_window->{'hdr_pane'}->{'subj_lbl'}->set_text("");
		$main::view_window->{'hdr_pane'}->{'cc_lbl'}->set_text("");
		$main::view_window->{'hdr_pane'}->{'date_lbl'}->set_text("");
	}
	
	$main::root_window->{'table1'}->{'to_lbl'}->set_text("");
	$main::root_window->{'table1'}->{'from_lbl'}->set_text("");
	$main::root_window->{'table1'}->{'subj_lbl'}->set_text("");
	$main::root_window->{'table1'}->{'cc_lbl'}->set_text("");
	$main::root_window->{'table1'}->{'date_lbl'}->set_text("");
	if ($main::attpixmap->visible) { $main::attpixmap->hide }
	if (-f "$main::prefs{'MailDir'}/empty.html" and $main::HTMLWIDGET eq "XmHTML" or $main::HTMLWIDGET eq "GtkHTML" or $main::HTMLWIDGET eq "CscHTML") {
		&clear_view;
	} else {
		open(TMP, ">$main::prefs{'MailDir'}/empty.html");
		print TMP "<html><body><body bgcolor=FFFFFF></body></html>\n";
		close TMP;
		&clear_view;
        }
	$main::current = undef if (!$main::dragging);
	return 1;
}


sub clear_view {
	
	if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
		&Pronto::Link::load_url($main::root_window->{'html_view'}, $main::prefs{'MailDir'}."/empty.html", $main::root_window->{'html_view'}->begin);
		if (defined $main::view_window and $main::prefs{'viewpane'} eq "n") { Pronto::Link::load_url($main::view_window->{'html'},$main::prefs{'MailDir'}."/empty.html",$main::view_window->{'html'}->begin) }
	} elsif ($main::HTMLWIDGET eq "XmHTML") {
		$main::root_window->{'html_view'}->source("");
		if (defined $main::view_window and $main::prefs{'viewpane'} eq "n") { $main::view_window->{'html'}->source("");}
	} elsif ($main::HTMLWIDGET eq "text") {
		$main::root_window->{'html_view'}->freeze;
		$main::root_window->{'html_view'}->set_point(0);
		$main::root_window->{'html_view'}->forward_delete($main::root_window->{'html_view'}->get_length);
		$main::root_window->{'html_view'}->thaw;
		if (defined $main::view_window and $main::prefs{'viewpane'} eq "n") { 
			$main::view_window->{'html'}->freeze;
			$main::view_window->{'html'}->set_point(0);
			$main::view_window->{'html'}->forward_delete($main::view_window->{'html'}->get_length);
			$main::view_window->{'html'}->thaw;
		}
   	}

	return 1;

}

sub textclick {

	my ($widget, $popup, $url, $event) = @_;
	my ($position,$text,@lines);
	if ($event->{'button'} == 3) {
		$position = $widget->get_position;
	 	$text="";
		if ($position<$widget->get_length){
			my $spos=$position;
               		my $stext="";
       	 		$text=$widget->get_chars($spos,$spos+1);
       			$spos--;
	 		while ($text !~ /\s/ && $spos>=0){
	 			$stext=$text.$stext;
         			$text=$widget->get_chars($spos,$spos+1);
      				$spos--;
			}	      
       			$stext=$text.$stext if $spos<0;
			$spos=$position+1;
			$text=$widget->get_chars($spos,$spos+1);
			$spos++;
			while (defined $text && $text !~ /\s/ && $spos+1<=$widget->get_length){
				$stext.=$text;
				$text=$widget->get_chars($spos,$spos+1);
				$spos++;
			}
			$text=$stext;
	 	}
		if (!$text) { return 1 }
		@lines = split(/\n/,$text);
		foreach(@lines) {
		        if (/\bhttp:\/\/([-_=&#,;:%a-zA-Z0-9.~\/\?\$\+\@]+)/) {
				print("http://$1\n"); 
		     		&Pronto::Link::link_clicked(undef,"http://$1");
      				last;
			} elsif (/\bhttps:\/\/([-_=&#,;:%a-zA-Z0-9.~\/\?\$\+\@]+)/) {
				&Pronto::Link::link_clicked(undef,"https://$1");
				last;
			} elsif (/\bftp:\/\/([-_=&#;:%a-zA-Z0-9.~\/\?\$\+]+)/) {
				print("ftp://$1\n");
				&Pronto::Link::link_clicked(undef,"ftp://$1");
			} elsif (/\bfile:$main::prefs{'MailDir'}\/tmp\//) {
				print "$_\n";
				$$url = $_;
			        $popup->popup(undef, undef, $event, $event->{'time'});	
			} elsif (/([-_a-zA-Z0-9.]+\@[-_a-zA-Z0-9.]+\.[-_a-zA-Z0-9]+)/) {
				print("Mailto:$1\n");
				my (@fields);
				$fields[0] = $1;
				$fields[1] = "";
				$fields[2] = "";
				&Pronto::Compose::init_msg_window(0, undef, \@fields);
			}
		}
	} else { 
		return 1;
	}
	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:$main::prefs{'MailDir'}\/tmp\//) {
  		 $popup->popup(undef, undef, $event, $event->{'time'});
   	}
 
	 return 1;

}


1;
__DATA__

sub message_view_win {
	
	my ($msgid, $type) = @_;
  	
	if (not defined $msgid or $msgid eq "") {
		$msgid = &Pronto::MessageList::get_selected_msgid();
	}
	if (!$msgid) { return 1; }

  	if ($type > 2) { &head_view($type);   return 1; }
  	if (defined $main::view_window and $type < 2) { 
  		&view_message($main::conn, $msgid, $main::view_window->{'html'}, $type, 0, undef, undef, $main::view_window->{'hdr_pane'});
  		return 1; 
	}
  
  	$main::view_window=new Gtk::Window("toplevel");
  	$main::view_window->set_title(_("View Message"));
  	$main::view_window->signal_connect("destroy" => sub { $main::view_window->destroy; undef $main::view_window });
  	$main::view_window->signal_connect("delete_event" => \&Gtk::false);
  	$main::view_window->set_default_size('500','400');
  	$main::view_window->set_policy(1,1,0);
  	$main::view_window->show;
  	$main::view_window->{'vbox'}= new Gtk::VBox('0','0');
  	$main::view_window->{'vbox'}->show;
  	$main::view_window->add($main::view_window->{'vbox'});
  	$main::view_window->{'hbox'} = new Gtk::HBox(0,5);
  	$main::view_window->{'hbox'}->show;
  	$main::view_window->{'hbox2'} = new Gtk::HBox(0,5);
  	$main::view_window->{'hbox2'}->show;
  	$main::view_window->{'hbox3'} = new Gtk::HBox(0,5);
  	$main::view_window->{'hbox3'}->show;
  	$main::view_window->{'hbox4'} = new Gtk::HBox(0,5);
  	$main::view_window->{'hbox4'}->show;
  	$main::view_window->{'hbox5'} = new Gtk::HBox(0,5);
  	$main::view_window->{'hbox5'}->show;
  	$main::view_window->{'vbox'}->pack_start($main::view_window->{'hbox'},0,0,0);
  	$main::view_window->{'vbox'}->pack_start($main::view_window->{'hbox2'},0,0,0);
  	$main::view_window->{'vbox'}->pack_start($main::view_window->{'hbox3'},0,0,0);
  	$main::view_window->{'vbox'}->pack_start($main::view_window->{'hbox4'},0,0,0);
  	$main::view_window->{'vbox'}->pack_start($main::view_window->{'hbox5'},0,0,0);
  	$main::view_window->{'hdr_pane'}->{'to'} = new Gtk::Label("To: ");
  	$main::view_window->{'hdr_pane'}->{'to'}->show;
  	$main::view_window->{'hdr_pane'}->{'to_lbl'} = new Gtk::Label;
  	$main::view_window->{'hdr_pane'}->{'to_lbl'}->show;
  	$main::view_window->{'hdr_pane'}->{'from'} = new Gtk::Label("From: ");
  	$main::view_window->{'hdr_pane'}->{'from'}->show;
  	$main::view_window->{'hdr_pane'}->{'from_lbl'} = new Gtk::Label;
  	$main::view_window->{'hdr_pane'}->{'from_lbl'}->show;
  	$main::view_window->{'hdr_pane'}->{'date'} = new Gtk::Label("Date: ");
  	$main::view_window->{'hdr_pane'}->{'date'}->show;
  	$main::view_window->{'hdr_pane'}->{'date_lbl'} = new Gtk::Label;
  	$main::view_window->{'hdr_pane'}->{'date_lbl'}->show;
  	$main::view_window->{'hdr_pane'}->{'subject'} = new Gtk::Label("Subject: ");
  	$main::view_window->{'hdr_pane'}->{'subject'}->show;
  	$main::view_window->{'hdr_pane'}->{'subj_lbl'} = new Gtk::Label;
  	$main::view_window->{'hdr_pane'}->{'subj_lbl'}->show;
  	$main::view_window->{'hdr_pane'}->{'cc'} = new Gtk::Label("CC: ");
  	$main::view_window->{'hdr_pane'}->{'cc'}->show;
  	$main::view_window->{'hdr_pane'}->{'cc_lbl'} = new Gtk::Label;
  	$main::view_window->{'hdr_pane'}->{'cc_lbl'}->show;
  	$main::view_window->{'hbox'}->pack_start($main::view_window->{'hdr_pane'}->{'to'},0,0,0);
  	$main::view_window->{'hbox'}->pack_start($main::view_window->{'hdr_pane'}->{'to_lbl'},0,0,0);
  	$main::view_window->{'hbox2'}->pack_start($main::view_window->{'hdr_pane'}->{'from'},0,0,0);
  	$main::view_window->{'hbox2'}->pack_start($main::view_window->{'hdr_pane'}->{'from_lbl'},0,0,0);
  	$main::view_window->{'hbox3'}->pack_start($main::view_window->{'hdr_pane'}->{'date'},0,0,0);
  	$main::view_window->{'hbox3'}->pack_start($main::view_window->{'hdr_pane'}->{'date_lbl'},0,0,0);
  	$main::view_window->{'hbox4'}->pack_start($main::view_window->{'hdr_pane'}->{'subject'},0,0,0);
  	$main::view_window->{'hbox4'}->pack_start($main::view_window->{'hdr_pane'}->{'subj_lbl'},0,0,0);
  	$main::view_window->{'hbox5'}->pack_start($main::view_window->{'hdr_pane'}->{'cc'},0,0,0);
  	$main::view_window->{'hbox5'}->pack_start($main::view_window->{'hdr_pane'}->{'cc_lbl'},0,0,0);
  	if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
   		my ($popup,$url,$item,$sep);
   		$popup = new Gtk::Menu;
		if ($main::HTMLWIDGET eq "GtkHTML") {
   			$main::view_window->{'html'} = new Gtk::HTML;
		} elsif ($main::HTMLWIDGET eq "CscHTML") {
			$main::view_window->{'html'} = new Csc::HTML;
			$main::view_window->{'html'}->set_default_font_face($main::prefs{'MsgFontFace'});
			$main::view_window->{'html'}->allow_font_switch($main::prefs{'FontSwitch'});
		}
   		$main::view_window->{'html'}->signal_connect('url_requested' => \&Pronto::Link::load_url);
   		$main::view_window->{'html'}->signal_connect('link_clicked' => \&Pronto::Link::gtkhtml_link_clicked);
		$main::view_window->{'html'}->signal_connect('button_press_event' => \&gtkhtml_mouse_click, $popup, \$url);
   		$main::view_window->{'html'}->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:$main::prefs{'MailDir'}\/tmp\///g;
                			&Pronto::Save::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);
                			&Pronto::ViewAttachment::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);
                			&Pronto::ViewAttachment::view_attachment(undef,$source,$type,'n');
        				});
   		$item->show;
   		$popup->append($item);
   		$main::view_window->{'html'}->set_editable(0);
   		$main::view_window->{'html'}->enable_debug(0);
   
   		my $sw = new Gtk::ScrolledWindow(undef, undef);
   		$sw->set_policy('automatic', 'automatic');
   		$sw->show;
   		$sw->add($main::view_window->{'html'});
   		$main::view_window->{'vbox'}->pack_start($sw,1,1,0);
   		$main::view_window->{'html'}->realize;
   		$main::view_window->{'html'}->show;
  
  	} elsif ($main::HTMLWIDGET eq "text") {
 		 my ($popup,$url,$item,$sep);
  		$popup = new Gtk::Menu;
  		$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:$main::prefs{'MailDir'}\/tmp\///g;
                			&Pronto::Save::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);
					&Pronto::ViewAttachment::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);
                			&Pronto::ViewAttachment::view_attachment(undef,$source,$type,'n');
        				});
   		$item->show;
   		$popup->append($item);
  		$main::view_window->{'html'} = new Gtk::Text;
  		$main::view_window->{'html'}->show;
  		$main::view_window->{'html'}->set_editable(0);
		$main::view_window->{'html'}->signal_connect("button_release_event" =>\&textclick,$popup,\$url);
  		my $sw = new Gtk::ScrolledWindow(undef,undef);
  		$sw->set_policy('automatic','automatic');
  		$sw->show;
  		$sw->add($main::view_window->{'html'});
  		$main::view_window->{'vbox'}->pack_start($sw,1,1,0);
  
  	} else {
   		$main::view_window->{'html'} = new Gtk::XmHTML;
   		$main::view_window->{'html'}->set_anchor_buttons(0);
   		$main::view_window->{'html'}->set_allow_body_colors(1);
   		$main::view_window->{'html'}->set_hilight_on_enter(0);
   		$main::view_window->{'html'}->set_allow_font_switching(1);
   		$main::view_window->{'html'}->set_allow_images(1);
   		$main::view_window->{'html'}->set_strict_checking(1);
   		$main::view_window->{'html'}->set_anchor_target_underline_type (1);
   		$main::view_window->{'html'}->set_anchor_underline_type (1);
   		$main::view_window->{'html'}->set_anchor_visited_underline_type(1);
   		$main::view_window->{'html'}->signal_connect('activate' => \&Pronto::Link::link_clicked);
   		$main::view_window->{'html'}->show;
   		$main::view_window->{'vbox'}->pack_start($main::view_window->{'html'},1,1,0);
  	}

  	&view_message($main::conn, $msgid, $main::view_window->{'html'}, $type, 0, undef, undef, $main::view_window->{'hdr_pane'});
  
	return 1;

}

sub head_view {
        
	my ($type) = @_;
	my ($window, $vbox, $html_view,$msgid);
	$window=new Gtk::Window("toplevel");
       	$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 ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
   		if ($main::HTMLWIDGET eq "GtkHTML") {
			$html_view = new Gtk::HTML;
		} elsif ($main::HTMLWIDGET eq "CscHTML") {
			$html_view = new Csc::HTML;
			$html_view->set_default_font_face($main::prefs{'MsgFontFace'});
			$html_view->allow_font_switch($main::prefs{'FontSwitch'});
		}
   		$html_view->signal_connect('url_requested' => \&Pronto::Link::load_url);
   		$html_view->signal_connect('link_clicked' => \&Pronto::Link::gtkhtml_link_clicked);
   		$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;
  	} elsif ($main::HTMLWIDGET eq "text") {
  		$html_view = new Gtk::Text;
  		$html_view->show;
  		$html_view->set_editable(0);
  		$html_view->signal_connect("button_release_event" => \&textclick,undef,undef);
  		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);
  	} 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' => \&Pronto::Link::link_clicked);
   		$html_view->show;
   		$vbox->pack_start($html_view,1,1,0);
  	}
  
	$msgid = &Pronto::MessageList::get_selected_msgid();
  	
	&view_message($main::conn, $msgid, $html_view, $type, 0);

return 1;
}


sub view_raw {
        my ($msgid,$tmp,$win,$text,$body,$sw,@selection,$error,$popup,$sep,$url,$item,);
        $popup = new Gtk::Menu;
  	$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:$main::prefs{'MailDir'}\/tmp\///g;
                		&Pronto::Save::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);
                		&Pronto::Save::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);
                		&Pronto::ViewAttachment::view_attachment(undef,$source,$type,'n');
        			});
   	$item->show;
   	$popup->append($item);

    	$msgid = &Pronto::MessageList::get_selected_msgid();

  	my $font = Gtk::Gdk::Font->load($main::prefs{'FontComposer'});
	if ($main::prefs{'useGtkFontComposer'} eq "y") { $font = "" }
	$win = new Gtk::Window("toplevel");
	$win->set_policy(1,1,0);
	$win->set_title(_("Source view of Message ")."$msgid");
	$win->set_default_size('500','400');
	$sw=new Gtk::ScrolledWindow(undef, undef);
	$sw->show;
	$win->add($sw);
	$win->show;
	$text = new Gtk::Text;
	$text->show;
	$text->signal_connect("button_release_event" => \&textclick,$popup,\$url);
	$sw->add($text);
    	$body=&Pronto::Data::Message::get_source($msgid);
	$text->insert($font,"","",$body);
	return 1;
}

sub read_html
{
	
	if (!$main::hashtml) {
		&main::err_dialog(_("You dont have an HTML widget !"));
		return 1;
	}
	my $current_widget = $main::HTMLWIDGET;
	$main::HTMLWIDGET = $main::hashtml_widget;
	&html_view_win();
	$main::HTMLWIDGET = $current_widget;
	return 1;
}	


sub html_view_win {
	
	my ($html_window);	
       	my $msgid = &Pronto::MessageList::get_selected_msgid();
	
	if (!$msgid) { return 1; }
  
  	$html_window=new Gtk::Window("toplevel");
  	$html_window->set_title(_("View Message"));
  	$html_window->signal_connect("destroy" => sub { $html_window->destroy; });
  	$html_window->signal_connect("delete_event" => \&Gtk::false);
  	$html_window->set_default_size('500','400');
  	$html_window->set_policy(1,1,0);
  	$html_window->show;
  	$html_window->{'vbox'}= new Gtk::VBox('0','0');
  	$html_window->{'vbox'}->show;
  	$html_window->add($html_window->{'vbox'});
  	$html_window->{'hbox'} = new Gtk::HBox(0,5);
  	$html_window->{'hbox'}->show;
  	$html_window->{'hbox2'} = new Gtk::HBox(0,5);
  	$html_window->{'hbox2'}->show;
  	$html_window->{'hbox3'} = new Gtk::HBox(0,5);
  	$html_window->{'hbox3'}->show;
  	$html_window->{'hbox4'} = new Gtk::HBox(0,5);
  	$html_window->{'hbox4'}->show;
  	$html_window->{'hbox5'} = new Gtk::HBox(0,5);
  	$html_window->{'hbox5'}->show;
  	$html_window->{'vbox'}->pack_start($html_window->{'hbox'},0,0,0);
  	$html_window->{'vbox'}->pack_start($html_window->{'hbox2'},0,0,0);
  	$html_window->{'vbox'}->pack_start($html_window->{'hbox3'},0,0,0);
  	$html_window->{'vbox'}->pack_start($html_window->{'hbox4'},0,0,0);
  	$html_window->{'vbox'}->pack_start($html_window->{'hbox5'},0,0,0);
  	$html_window->{'hdr_pane'}->{'to'} = new Gtk::Label("To: ");
  	$html_window->{'hdr_pane'}->{'to'}->show;
  	$html_window->{'hdr_pane'}->{'to_lbl'} = new Gtk::Label;
  	$html_window->{'hdr_pane'}->{'to_lbl'}->show;
  	$html_window->{'hdr_pane'}->{'from'} = new Gtk::Label("From: ");
  	$html_window->{'hdr_pane'}->{'from'}->show;
  	$html_window->{'hdr_pane'}->{'from_lbl'} = new Gtk::Label;
  	$html_window->{'hdr_pane'}->{'from_lbl'}->show;
  	$html_window->{'hdr_pane'}->{'date'} = new Gtk::Label("Date: ");
  	$html_window->{'hdr_pane'}->{'date'}->show;
  	$html_window->{'hdr_pane'}->{'date_lbl'} = new Gtk::Label;
  	$html_window->{'hdr_pane'}->{'date_lbl'}->show;
  	$html_window->{'hdr_pane'}->{'subject'} = new Gtk::Label("Subject: ");
  	$html_window->{'hdr_pane'}->{'subject'}->show;
  	$html_window->{'hdr_pane'}->{'subj_lbl'} = new Gtk::Label;
  	$html_window->{'hdr_pane'}->{'subj_lbl'}->show;
  	$html_window->{'hdr_pane'}->{'cc'} = new Gtk::Label("CC: ");
  	$html_window->{'hdr_pane'}->{'cc'}->show;
  	$html_window->{'hdr_pane'}->{'cc_lbl'} = new Gtk::Label;
  	$html_window->{'hdr_pane'}->{'cc_lbl'}->show;
  	$html_window->{'hbox'}->pack_start($html_window->{'hdr_pane'}->{'to'},0,0,0);
  	$html_window->{'hbox'}->pack_start($html_window->{'hdr_pane'}->{'to_lbl'},0,0,0);
  	$html_window->{'hbox2'}->pack_start($html_window->{'hdr_pane'}->{'from'},0,0,0);
  	$html_window->{'hbox2'}->pack_start($html_window->{'hdr_pane'}->{'from_lbl'},0,0,0);
  	$html_window->{'hbox3'}->pack_start($html_window->{'hdr_pane'}->{'date'},0,0,0);
  	$html_window->{'hbox3'}->pack_start($html_window->{'hdr_pane'}->{'date_lbl'},0,0,0);
  	$html_window->{'hbox4'}->pack_start($html_window->{'hdr_pane'}->{'subject'},0,0,0);
  	$html_window->{'hbox4'}->pack_start($html_window->{'hdr_pane'}->{'subj_lbl'},0,0,0);
  	$html_window->{'hbox5'}->pack_start($html_window->{'hdr_pane'}->{'cc'},0,0,0);
  	$html_window->{'hbox5'}->pack_start($html_window->{'hdr_pane'}->{'cc_lbl'},0,0,0);
  	if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
   		my ($popup,$url,$item,$sep);
   		$popup = new Gtk::Menu;
		if ($main::HTMLWIDGET eq "GtkHTML") {
   			$html_window->{'html'} = new Gtk::HTML;
		} elsif ($main::HTMLWIDGET eq "CscHTML") {
			$html_window->{'html'} = new Csc::HTML;
			$html_window->{'html'}->set_default_font_face($main::prefs{'MsgFontFace'});
			$html_window->{'html'}->allow_font_switch($main::prefs{'FontSwitch'});
		}
   		$html_window->{'html'}->signal_connect('url_requested' => \&Pronto::Link::load_url);
   		$html_window->{'html'}->signal_connect('link_clicked' => \&Pronto::Link::gtkhtml_link_clicked);
		$html_window->{'html'}->signal_connect('button_press_event' => \&gtkhtml_mouse_click, $popup, \$url);
   		$html_window->{'html'}->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:$main::prefs{'MailDir'}\/tmp\///g;
                			&Pronto::Save::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);
                			&Pronto::ViewAttachment::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);
                			&Pronto::ViewAttachment::view_attachment(undef,$source,$type,'n');
        				});
   		$item->show;
   		$popup->append($item);
   		$html_window->{'html'}->set_editable(0);
   		$html_window->{'html'}->enable_debug(0);
   
   		my $sw = new Gtk::ScrolledWindow(undef, undef);
   		$sw->set_policy('automatic', 'automatic');
   		$sw->show;
   		$sw->add($html_window->{'html'});
   		$html_window->{'vbox'}->pack_start($sw,1,1,0);
   		$html_window->{'html'}->realize;
   		$html_window->{'html'}->show;
    
  	} else {
  
  		$html_window->{'html'} = new Gtk::XmHTML;
   		$html_window->{'html'}->set_anchor_buttons(0);
   		$html_window->{'html'}->set_allow_body_colors(1);
   		$html_window->{'html'}->set_hilight_on_enter(0);
   		$html_window->{'html'}->set_allow_font_switching(1);
   		$html_window->{'html'}->set_allow_images(1);
   		$html_window->{'html'}->set_strict_checking(1);
   		$html_window->{'html'}->set_anchor_target_underline_type (1);
   		$html_window->{'html'}->set_anchor_underline_type (1);
   		$html_window->{'html'}->set_anchor_visited_underline_type(1);
   		$html_window->{'html'}->signal_connect('activate' => \&Pronto::Link::link_clicked);
   		$html_window->{'html'}->show;
   		$html_window->{'vbox'}->pack_start($html_window->{'html'},1,1,0);
  	}

  	&view_message($main::conn, $msgid, $html_window->{'html'}, 1, 0, undef, undef, $html_window->{'hdr_pane'});
  
	return 1;

}

1;


syntax highlighted by Code2HTML, v. 0.9.1