The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Newsletter::Html;

use warnings;

use strict;

use Newsletter::Html::Templ;
use Newsletter;
use base ("Newsletter::Html::Templ", "Newsletter::Html::Upload");
use MIME::Base64;
use File::Path;

use vars qw($VERSION);

our $VERSION = '0.02';

sub new {
        my $obj = shift;
	my $newsletterObj = shift;
	my $uploadPath = shift;

	if(!$newsletterObj) {
		die "Newsletter Param is empty\n";
	}

        my $self = {};
	#$self->{'cgi'} = new CGI;
	$self->{'nl'} = $$newsletterObj;
	$self->{'out'} = '';
	$self->{'persistent'} = {};
	$self->{'tmp'} = {};
	$self->{'info'} = undef;
	$self->{'uploadPath'} = '/tmp';

	if( $uploadPath ) {
		$self->{'uploadPath'} = $uploadPath;
		if(! -d $self->{'uploadPath'} ) {
			warn "Upload path [$uploadPath] does not exist! try to create\n";
			mkpath( $self->{'uploadPath'} );		
		}
	}

        bless($self,$obj);
	$self->init;

        return($self);
}


sub header {
	my ($self, %param) = @_;

	my @cookies = $self->_persistent();

	if( exists $self->{'persistent'}->{'pSection'} ) {
		if( $self->{'persistent'}->{'pSection'} eq "home" && 
		    $self->{'cgi'}->param() == 1
		) {
			@cookies = $self->_persistentClean();
		}
	} 

	$self->_out( $self->{'cgi'}->header( 
			-cookie=>\@cookies, 
			-expires=>'now',
	) );

	$self->_out( $self->{'cgi'}->start_html( 
			-title=>'Newsletter Simple',
		    	-author=>'hochreiter@soft.uni-linz.ac.at',
			-meta=>{'keywords' => 'Newsletter Mail Sender Simple',
			    	'copyright'=> 'Dominik Hochreiter published under GNU'},
			%param,
	) );

	if(! exists $param{'-style'} ) {
		require Newsletter::Html::CSS;
		$self->_out( $Newsletter::Html::CSS::CSS );
	}

	$self->_out( $self->{'cgi'}->p( {-align=>'left'}, $self->{'cgi'}->a( {-href => "?pSection=home"}, "Home" ) ) );
	$self->_out( $self->{'cgi'}->hr );

	return $self->_outString;
}


sub body {
	my ($self) = @_;



	if( !exists $self->{'persistent'}->{'pSection'} ) {
		$self->startpage;
	}

	elsif( $self->{'persistent'}->{'pSection'} eq "home" ) {
               $self->startpage;
        }

	elsif( $self->{'persistent'}->{"pSection"} eq "openList" ) {
               if( $self->{'nl'}->list( list => { name => $self->{'persistent'}->{"pOpenList"} } ) ) {
                       	$self->openList;
               } else {
                       $self->_out( $self->{'nl'}->error(1) );
               }
        }

	elsif( $self->{'persistent'}->{"pSection"} eq "addToList" ) {

		foreach my $key ( $self->{'cgi'}->param ) {
			if( $key =~ /newMember\d\d\d\d/ ) {

				next if( !$self->{'cgi'}->param($key) );

				if( $self->{'nl'}->list( member => {
					listname => $self->{'persistent'}->{"pOpenList"},
					mail => $self->{'cgi'}->param($key),
					rereadOff => 1
				} ) ) {
					$self->_info( $self->{'cgi'}->param($key)." added" );
					if( $self->{'nl'}->error ) {
						$self->_info( $self->{'nl'}->error(1) );
					}
				} else {
					$self->_info( $self->{'nl'}->error(1) );
				}
			}
		}

		if( $self->{'nl'}->list( list => { name => $self->{'persistent'}->{"pOpenList"} } ) ) {
                        $self->openList;
               	} else {
                       	$self->_out( $self->{'nl'}->error(1) );
               	}

        }

#ONLY VCM [start]
	elsif( $self->{'persistent'}->{"pSection"} eq "addToListRemote" ) {

                foreach my $key ( $self->{'cgi'}->param ) {
                        if( $key =~ /newMember\d\d\d\d/ ) {

                                next if( !$self->{'cgi'}->param($key) );

                                if( $self->{'nl'}->list( member => {
                                        listname => $self->{'persistent'}->{"pOpenList"},
                                        mail => $self->{'cgi'}->param($key),
                                        rereadOff => 1
                                } ) ) {
                                        #$self->_info( $self->{'cgi'}->param($key)." added" );
                                        #if( $self->{'nl'}->error ) {
                                        #        $self->_info( $self->{'nl'}->error(1) );
                                        #}
                                } else {
                                        #$self->_info( $self->{'nl'}->error(1) );
                                }
                        }
                }

                #if( $self->{'nl'}->list( list => { name => $self->{'persistent'}->{"pOpenList"} } ) ) {
                #        $self->openList;
                #} else {
                #        $self->_out( $self->{'nl'}->error(1) );
                #}

        }
#ONLY VCM [end]


	elsif( $self->{'persistent'}->{"pSection"} eq "delFromList" ) {

		foreach my $member ( $self->{'cgi'}->param("openListMembers") ) {
			if( $self->{'nl'}->list( remove => {
                                        listname => $self->{'persistent'}->{"pOpenList"},
                                        mail => $member
                        } ) ) {
                        	$self->_info( "$member removed" );
                                if( $self->{'nl'}->error ) {
                                                $self->_info( $self->{'nl'}->error(1) );
                                }
                        } else {
                       	        $self->_info( $self->{'nl'}->error(1) );
			}
		}

                if( $self->{'nl'}->list( list => { name => $self->{'persistent'}->{"pOpenList"} } ) ) {
                        $self->openList;
                } else {
                        $self->_out( $self->{'nl'}->error(1) );
                }

        }

	elsif( $self->{'persistent'}->{"pSection"} eq "deleteList" ) {
		$self->{'nl'}->list(
        		remove => {
                		# remove whole list
                		listname => $self->{'cgi'}->param('listName')
        		}
		);

		$self->{'nl'}->list( reread => 1 );
		$self->startpage;
		$self->_out( $self->{'nl'}->error(1) );
	}

	elsif( $self->{'persistent'}->{"pSection"} eq "editTmpl" ) {
	
		foreach my $is ('tmplFilesHeader', 'tmplFilesFooter') {	
			foreach my $tmpl ( $self->{'cgi'}->param($is) ) {
				if( $is eq 'tmplFilesHeader') {
					$self->{'nl'}->template( use => { filename => $tmpl, is => +HEADER } );
				}

				if( $is eq 'tmplFilesFooter') {
					$self->{'nl'}->template( use => { filename => $tmpl, is => +FOOTER } );
				}

				if( $self->{'cgi'}->param("tmplFilesAction") eq "open" ) {
					if( $self->{'nl'}->{'senderHeader'}->{ +HTML_TMPL } ) {
						$self->openTmpl($self->{'nl'}->{'senderHeader'}->{ +HTML_TMPL }, +HTML_TMPL);
					}
					elsif( $self->{'nl'}->{'senderHeader'}->{ +TEXT_TMPL } ) {
                                        	$self->openTmpl($self->{'nl'}->{'senderHeader'}->{ +TEXT_TMPL }, +TEXT_TMPL );
                                	}
					elsif( $self->{'nl'}->{'senderFooter'}->{ +HTML_TMPL } ) {
                                                $self->openTmpl($self->{'nl'}->{'senderFooter'}->{ +HTML_TMPL }, +HTML_TMPL);
                                        }
					elsif( $self->{'nl'}->{'senderFooter'}->{ +TEXT_TMPL } ) {
                                                $self->openTmpl($self->{'nl'}->{'senderFooter'}->{ +TEXT_TMPL }, +TEXT_TMPL );
                                        }

				}

				elsif( $self->{'cgi'}->param("tmplFilesAction") eq "delete" ) { 
					if( $is eq 'tmplFilesHeader') {
					 	$self->{'nl'}->template( 
							use => { is => 'header', filename => $tmpl },
							remove => 1
						);
					}
					elsif( $is eq 'tmplFilesFooter') {
                                                $self->{'nl'}->template( 
                                                        use => { is => 'footer', filename => $tmpl },
                                                        remove => 1
                                                );
                                        }
					$self->{'nl'}->template( reread => 1 );
                                }


				if( $self->{'nl'}->error ) {
                                	$self->_info( $self->{'nl'}->error(1) );
                        	}
                	}
		}

		$self->editTmpl;
	}

	elsif( $self->{'persistent'}->{"pSection"} eq "tmplFileUpload") {
		$self->fileuploadTmpl;
	}
	
	elsif( $self->{'persistent'}->{"pSection"} eq "finishTmplFileUpload" ) {

		# Upload embedded
		my @embedded = ();
		for( my $a = 0; $a < 10; $a++ ) {
			if( $self->{'cgi'}->param("embFileUpload$a") ) {
				my $filename = $self->fileUpload("embFileUpload$a");
				push(@embedded, $self->{'uploadPath'}.'/'.$filename);
			}
		}

		
		if( $self->{'cgi'}->param("tmplSchema") ) {
			$self->{'nl'}->template(
                                file => {
                                        path => $self->{'uploadPath'}.'/'.$self->{'cgi'}->param("tmplFile"),
                                        type => $self->{'persistent'}->{"pTmplFileUploadType"},
                                        is => $self->{'persistent'}->{"pTmplFileUploadIs"},
					schema => $self->{'cgi'}->param("tmplSchema"),
					embedded => \@embedded
                                }
                        );

		} else {

			$self->{'nl'}->template(
				file => {
					path => $self->{'uploadPath'}.'/'.$self->{'cgi'}->param("tmplFile"),
					type => $self->{'persistent'}->{"pTmplFileUploadType"},
					is => $self->{'persistent'}->{"pTmplFileUploadIs"},
					embedded => \@embedded
				}
			);
		}

		$self->{'nl'}->template( reread => 1 );

		$self->editTmpl;
		$self->_out( $self->{'nl'}->error );
	}


	elsif( $self->{'persistent'}->{"pSection"} eq "sendList" ) {
		$self->sendList;
	}	

	elsif( $self->{'persistent'}->{"pSection"} eq "sendListPreview" ) {
		$self->sendListPreview;
        }

	elsif( $self->{'persistent'}->{"pSection"} eq "sendListEdit" ) {
		$self->sendListPreview;
	}

	elsif( $self->{'persistent'}->{"pSection"} eq "sendListEmail" ) {
		$self->sendListMail;
		return "";
	}

	else {
		$self->startpage;
	}

	return $self->_outString;
}


sub footer {
	my ($self) = @_;

	if( $self->{'info'} ) {
		$self->_out( "<font color=\"red\"><pre>".$self->{'info'}."</pre></font>" );
	}

	$self->_out( $self->{'cgi'}->hr );
	$self->_out( $self->{'cgi'}->p( {-align=>'right'}, "HTML Newsletter Simple Version $Newsletter::VERSION") );
	$self->_out( $self->{'cgi'}->end_html );

	return $self->_outString;
}


sub _out ($$) {
	my ($self, $string) = @_;
	if( $string ) {
		$self->{'out'} .= $string;
	}
}


sub _outString {
        my ($self) = @_;
	my $out = $self->{'out'};
	$self->{'out'} = '';
        return $out;
}


sub _persistent {
	my ($self) = @_;

	my @coockies = ();


	# read in
        foreach my $key ( $self->{'cgi'}->cookie() ) {
		if( $self->{'cgi'}->cookie($key) ) {
			if( $key =~ /^pl/ ) {
				foreach my $file ( $self->{'cgi'}->cookie($key) ) {
                                        push( @{ $self->{'persistent'}->{$key} }, $file );
                                }
			} else {
		                $self->{'persistent'}->{$key} = decode_base64( $self->{'cgi'}->cookie($key) );
			}
		} elsif( $key =~ /^p/ ) {
			if( $key =~ /^pl/ ) {
				$self->{'persistent'}->{$key} = [];
			} else {
				$self->{'persistent'}->{$key} = '';
			}
		}
        }


	foreach my $key ( $self->{'cgi'}->param ) {
		if( $key =~ /^p/) {

			if( $key =~ /^pl/ ) {
				push(@coockies,
                                        $self->{'cgi'}->cookie(
                                        -name => $key,
                                        -value => [ $self->{'cgi'}->param($key) ]
                                        )
                                );

				if( exists $self->{'persistent'}->{$key} ) {
					$self->{'persistent'}->{$key} = [];
				}

				foreach my $file ( $self->{'cgi'}->param($key) ) {
					push( @{ $self->{'persistent'}->{$key} }, $file );
				}

			}  elsif( $key =~ /^p/ ) {

				push(@coockies,
					$self->{'cgi'}->cookie(
					-name => $key,
                        	        -value => encode_base64( $self->{'cgi'}->param($key) )
					)
				);
				$self->{'persistent'}->{$key} = $self->{'cgi'}->param($key);
			}
		}
	}


	return @coockies;
}


sub _persistentClean {
	my ($self) = @_;
	
	my @coockies = ();

	# read in
        foreach my $key ( $self->{'cgi'}->cookie() ) {
		if( $key =~ /^p/) {
	        	push(@coockies,
        	        	$self->{'cgi'}->cookie(
                	        -name => $key,
                        	-value => ''
                		)
			);

			if( exists $self->{'persistent'}->{$key} ) {
				delete $self->{'persistent'}->{$key};
			}
		}
        }

	return @coockies;
}


sub _info {
	my ($self,$msg) = @_;
	$self->{'info'} .= "$msg\n";
}




=head1 NAME

Newsletter::Html - generate html!

=head1 VERSION

Version 0.02

=cut

#our $VERSION = '0.01';

=head1 SYNOPSIS

The Html module for Newsletter

Perhaps a little code snippet.

    use Newsletter::Html;

    my $foo = Newsletter::Html->new( $newsletterObj, $uploadPath );
    ...

=head1 EXPORT

A list of functions that can be exported.  You can delete this section
if you don't export anything, such as for a purely object-oriented module.

=head1 FUNCTIONS

=head1 AUTHOR

Dominik Hochreiter, C<< <dominik at soft.uni-linz.ac.at> >>

=head1 BUGS

Please report any bugs or feature requests to
C<bug-newsletter-html at rt.cpan.org>, or through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Newsletter>.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Newsletter

You can also look for information at:

=over 4

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Newsletter>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Newsletter>

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Newsletter>

=item * Search CPAN

L<http://search.cpan.org/dist/Newsletter>

=back

=head1 ACKNOWLEDGEMENTS

=head1 COPYRIGHT & LICENSE

Copyright 2006 Dominik Hochreiter, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut

1; # End of Newsletter::Html