#!/usr/bin/perl
################################################
$cgiext = 'pl';
################################################
eval
 {
	($0 =~ m,(.*)/[^/]+,)   && unshift (@INC, "$1");
	($0 =~ m,(.*)\\[^\\]+,) && unshift (@INC, "$1");
 
	################################################################
	# WinNT may require the full path to the files below.
	# Example:
	#     require "d:/path/to/the/file/vars_main.$cgiext";
	################################################################
	require "vars_main.$cgiext";
	require "subs_1.$cgiext";
 };
################################################
use Fcntl ':flock';
use CGI qw(:standard :cgi-lib);
use CGI::Carp qw(fatalsToBrowser carpout);
$query = new CGI;
#use strict;
#our (	%Script, %in, %List, %cookie, $cgiext, $htmloutput,
#	$ConfirmID, $ActionPerformed, $email, $name, $SubDate, $SubTime,
#	$ConfirmCode, $DebugInfo, $query, $format,
#	$lsec, $lmin, $ltime, $jdate,
#   );
################################################
################################################
# You do not need to modify anything below this line
################################################
# Perform subs
################################################
&ReadParse();
&SetGlobalVars;
&Cookies_Get();
################################################
if ($Script{IsDirect})
 {
	&RemoveFromList($in{email}) if ( $in{action} eq 'U' );
	&AddToList('Confirming') if ( $in{action} eq 'CS' );
 }
if ( ( $in{action} eq 'Sub' ) or ( $in{action} eq 'TempSub' ) )
 {
	&MissingInfo('List') unless $in{ListNumber};
	&MissingInfo('Name') if ( $Script{RequireName} && !$in{name} );

	&CheckEmail($in{email});

	if ( $in{action} eq 'TempSub' )
	 {
		&AddToTempList();
	 }
	else
	 {
	     &AddToList();	
	 }
}
elsif ( $in{action} eq 'Unsub' )
 {
 	&RemoveFromList( $in{email} );
 }
else
 {
	&PrintNotifyForm;
 }
################################################
# Print notify form
################################################
sub PrintNotifyForm
 {
	 if ( $Script{DefaultSubPage} && !$Script{SSI} )
	  {
	    print "Location: $Script{DefaultSubPage}\n\n";
	    exit;
	  }
	################################################
	&Header();
	################################################
	my $ReqNameSym = ' *' if ( $Script{RequireName} eq 'checked' );
	################################################
	&GetListSelection(1);
	################################################
	my $SubType;
	$SubType = 'TempSub' if ( $Script{UseConfirmSub} eq 'checked' );
	$SubType = 'Sub' if ( $Script{UseConfirmSub} ne 'checked' );
	################################################
	$htmloutput .= qq~
		<FORM METHOD="POST" ACTION="$Script{Script_Announcer}">
  <TABLE BORDER=0 CELLPADDING="1" ALIGN="CENTER">
    <TR> 
      <TD COLSPAN=2 ALIGN="right"><STRONG><FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" ><FONT COLOR="#940000">*</FONT> 
        indicates required field</FONT></STRONG></TD>
    </TR>
    <TR> 
      <TD ALIGN="right"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <B>Name:</B>&nbsp; </FONT> </TD>
      <TD> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}"> 
        <INPUT TYPE="text" NAME="name" SIZE="30">
        <FONT><FONT COLOR="#940000">$ReqNameSym </FONT></FONT></FONT> </TD>
    </TR>
    <TR> 
      <TD ALIGN="right"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <B>Email:</B>&nbsp; </FONT> </TD>
      <TD> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}"> 
        <INPUT TYPE="text" NAME="email" SIZE="30" VALUE="$email">
        <FONT><FONT COLOR="#940000">* </FONT></FONT></FONT> </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2><IMG SRC="http://www.healingwell.co.uk/images/xt.gif" WIDTH="4" HEIGHT="4" ALT=""> 
      </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2 ALIGN="LEFT"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <B>Please select a list:</B>&nbsp; </FONT> </TD>
    </TR>
    <TR> 
      <TD ALIGN="left"> <FONT SIZE="1">&nbsp;</FONT> </TD>
      <TD ALIGN="left"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}"> 
        $Script{ListSelection} </FONT> </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2><IMG SRC="http://www.healingwell.co.uk/images/xt.gif" WIDTH="4" HEIGHT="4" ALT=""> 
      </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2 ALIGN="LEFT"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <B>Please select the desired option:</B>&nbsp; </FONT> </TD>
    </TR>
    <TR> 
      <TD>&nbsp;</TD>
      <TD ALIGN="LEFT"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <INPUT TYPE="radio" VALUE="$SubType" NAME="action" checked>
        Subscribe me<BR>
        <INPUT TYPE="radio" VALUE="Unsub" NAME="action">
        Unsubscribe me </FONT> </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2><IMG SRC="http://www.healingwell.co.uk/images/xt.gif" WIDTH="4" HEIGHT="4" ALT=""> 
      </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2 ALIGN="LEFT"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <B>Please select an email format:</B>&nbsp; </FONT> </TD>
    </TR>
    <TR> 
      <TD>&nbsp;</TD>
      <TD ALIGN="LEFT"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}" > 
        <INPUT TYPE="radio" VALUE="TEXT" NAME="Format" checked>
        Text<BR>
        <INPUT TYPE="radio" VALUE="HTML" NAME="Format">
        HTML Formatted </FONT> </TD>
    </TR>
    <TR> 
      <TD COLSPAN=2 ALIGN="center"> <FONT FACE="$Script{FontFace}" SIZE="$Script{FontSize}" COLOR="$Script{FontColor}"> 
        <INPUT TYPE="submit" VALUE="Submit">
        </FONT> </TD>
    </TR>
  </TABLE>
</FORM>
	~;
	&IgnoreMe();
	&Footer();
 }

################################################
# sub to add to temp notify list
################################################
sub AddToTempList
 {
	&GetListInfo($in{ListNumber});
	#####################################################
	if ( -e $List{File} )
	 {
		open (FILE,"<$List{File}") || die "Can't open '$List{File}'!\n";
		flock(FILE,2) unless $Script{DisableFlock};
		while (<FILE>)
		 {
			&SplitSubscriberList($_);
			if ( $email eq $in{email} )
			 {
				$Script{MessageAlreadySubscribed} = &OnlineMessageSubst($Script{MessageAlreadySubscribed});
				&PrintResult($Script{MessageAlreadySubscribed});	
			 }
		 }
		close(FILE);
	 }
	#####################################################
	srand($$^time());
	my @RandChars=("a".."z",0..9,"A".."Z");
	$ConfirmID = $jdate.$lmin.$lsec.join("", @RandChars[map{rand @RandChars}(1..5)]).length($in{email});
	&DebugInfo('$ConfirmID', $ConfirmID, '');
	#####################################################
	chmod (0666, $Script{File_Confirm_List}) if (-e $Script{File_Confirm_List});
	open (FILE,">>$Script{File_Confirm_List}");
	flock(FILE,2) unless $Script{DisableFlock};
	print FILE "$List{Number}|$in{email}|$in{name}|$ConfirmID|$in{Format}\n";
	flock(FILE,8) unless $Script{DisableFlock};
	close(FILE);
	chmod (0666, $Script{File_Confirm_List});
	#####################################################
	&SendConfirmRequiredEmail;
	#####################################################
	$Script{MessageConfirmed} = &OnlineMessageSubst($Script{MessageConfirmed});
	#####################################################
	&PrintResult($Script{MessageConfirmed});
 }
################################################
# Online Message Subst
################################################
sub OnlineMessageSubst
 {
	my $a = shift;
	$a =~ s/\$Email\$/$in{email}/ig;
	$a =~ s/\$Name\$/$in{name}/ig;
	$a =~ s/\$ListTitle\$/$Script{SubPageTitle}/ig;
	$a =~ s/\$ListEmail\$/$Script{Email}/ig;
	$a =~ s/\$SubLink\$/$Script{SubLink}/ig;
	return $a;
 }
################################################
# sub to add to notify list
################################################
sub AddToList
 {
	my ($Confirming) = shift;
	#####################################################
	$ActionPerformed = 'Subscribe';
	#####################################################
	$in{email} =~ s/\|//g if $in{email};
	$in{name} =~ s/\|//g if $in{name};
	#####################################################
	my $SubscriberFound;
	if ( $Confirming && (-e $Script{File_Confirm_List}) )
	 {
		open (FILE,"<$Script{File_Confirm_List}") || die "Can't open '$Script{File_Confirm_List}'!\n";
		my @array = <FILE>;
		close(FILE);

		open (FILE,">$Script{File_Confirm_List}") || die "Can't open '$Script{File_Confirm_List}'!\n";
		flock(FILE,2) unless $Script{DisableFlock};
		foreach (@array)
		 {
		 	&SplitConfirmList($_);
		 	my $SubDate = substr($ConfirmCode, 0, 7);
		 	#&DebugInfo('$SubDate', $SubDate, '');
		 	if ( ($in{ConfirmCode} eq $ConfirmCode) )
		 	 {
			 	$SubscriberFound = 1;
			 	$in{name} = $name;
			 	$in{email} = $email;
			 	$in{Format} = $format;
			 	$in{ConfirmCode} = undef;
			 	$in{ListNumber} = $List{Number};
			 }
			elsif ( $jdate > ($SubDate+2) )
			 {
			 }
			else
			 {
				print FILE $_;
			 }
			 	
		 }
		flock(FILE,8) unless $Script{DisableFlock};
		close(FILE);
		chmod (0666, $Script{File_Confirm_List});
	 }
	elsif ( ($Confirming) && (!-e $Script{File_Confirm_List}) )
	 {
	 	$SubscriberFound = 0;
	 }
	else
	 {
	 	$SubscriberFound = 1;
	 }
	#################################################
	if ($SubscriberFound == 1)
	 {
		&GetListInfo($in{ListNumber});
		&DebugInfo('$List{Number}',$List{Number},'Adding');
		&DebugInfo('$List{File}',$List{File},'Adding');
		#################################################
		if ( -e $List{File} )
		 {
			open (FILE,"<$List{File}") || die "Can't open '$List{File}'!\n";
			flock(FILE,2) unless $Script{DisableFlock};
			while (<FILE>)
			 {
				&SplitSubscriberList($_);
				return unless $email;
				#&DebugInfo('$email-$in{email}',"$email-$in{email}",'Email on list - In email');
				if ( $email eq $in{email} )
				 {
					$Script{MessageAlreadySubscribed} = &OnlineMessageSubst($Script{MessageAlreadySubscribed});
					&PrintResult($Script{MessageAlreadySubscribed});
				 }
			 }
			close(FILE);
		 }
		#################################################
		open (FILE,">>$List{File}");
		flock(FILE,2) unless $Script{DisableFlock};
		print FILE "$in{email}|$in{name}|$jdate-$ltime|$ENV{'REMOTE_HOST'}|^|$in{Format}\n";
		close (FILE);
		chmod (0666, $List{File});
		#################################################
		&SendSubscribedEmail;
		&SendAdminNotice;
		#################################################
		$Script{MessageSubscribed} = &OnlineMessageSubst($Script{MessageSubscribed});
	 	&PrintResult($Script{MessageSubscribed});
	 }
	else
	 {
		$Script{MessageNotConfirmed} = &OnlineMessageSubst($Script{MessageNotConfirmed});
		&PrintResult($Script{MessageNotConfirmed});
	 }
}
################################################
# Sub to remove from notify list
################################################
sub RemoveFromList
 {
	my ($a) = shift;
	$a = $in{email} unless $a;
	#####################################################
	$ActionPerformed = 'Unsubscribe';
	#####################################################
	&GetListInfo($in{ListNumber});
	#####################################################
	my $removed;
	if (-e $List{File} )
	 {
		my @lines;
		open (FILE,"<$List{File}") || die "Can't open '$List{File}'!\n";
		@lines=<FILE>;
		close(FILE);
		#####################################################
		open (FILE,">$List{File}");
		flock(FILE,2) unless $Script{DisableFlock};
		foreach (@lines)
		 {
			&SplitSubscriberList($_);
			if ($email eq $a)
			 {
			 	$removed = 1;
			 }
			else
			 {
				print FILE $_;
			 }
		 }
		close(FILE);
	 }
	#####################################################
	if ( $removed == 1 )
	 {
		&SendUnsubscribedEmail;
		&SendAdminNotice;
		#####################################################
		$Script{MessageUnSubscribed} = &OnlineMessageSubst($Script{MessageUnSubscribed});
	 	&PrintResult($Script{MessageUnSubscribed});
	 }
	else
	 {
		$Script{MessageNotUnSubscribed} = &OnlineMessageSubst($Script{MessageNotUnSubscribed});
	 	&PrintResult($Script{MessageNotUnSubscribed});
	 }
 }
################################################
# Send the Confirm Required Email
################################################
sub SendConfirmRequiredEmail
 {
	$in{name} = $in{email} unless $in{name};
	############################################################
	my $ConfirmLink = qq($Script{Script_Announcer}?CS,$ConfirmID);
	############################################################
	# Perform Message Substitutions
	############################################################
	$Script{EmailSubConfirm} =~ s/\$Email\$/$in{email}/ig;
	$Script{EmailSubConfirm} =~ s/\$Name\$/$in{name}/ig;
	$Script{EmailSubConfirm} =~ s/\$ListTitle\$/$List{Name}/ig;
	$Script{EmailSubConfirm} =~ s/\$ListEmail\$/$Script{Email}/ig;
	$Script{EmailSubConfirm} =~ s/\$SubLink\$/$Script{SubLink}/ig;
	$Script{EmailSubConfirm} =~ s/\$ConfirmLink\$/$ConfirmLink/ig;
	############################################################
	$in{subject} = "'$List{Name}' Confirmation";
	############################################################
	&Mail_Send(
		$in{email}, #$To,
		$Script{Email}, #$From,
		'text', #Format
		$in{subject}, #$Subj,
		$Script{EmailSubConfirm}, #$TextMsg
		$in{HTMLMsg}, #$HTMLMsg
		$in{CC}, #$CC
		$in{BCC}, #$BCC
		$in{AttachFile}, #$AttachFile
		$in{AttachType}, #$AttachType
	);
 }
################################################
# Send the subscribed Email
################################################
sub SendSubscribedEmail
 {
	return unless $Script{SendConfirmOfSub};
	############################################################
	$in{name} = $in{email} unless $in{name};
	############################################################
	my $Subject = 'You have been subscribed!';
	############################################################
	my $UnSubLink = qq($Script{Script_Announcer}?U,$in{email},$List{Number});	
	my $SubDate = "$jdate ($ltime)";
	############################################################
	# Perform Message Substitutions
	############################################################
	$Script{EmailSubscribed} =~ s/\$Email\$/$in{email}/ig;
	$Script{EmailSubscribed} =~ s/\$Name\$/$in{name}/ig;
	$Script{EmailSubscribed} =~ s/\$SubDate\$/$SubDate/ig;
	$Script{EmailSubscribed} =~ s/\$ListTitle\$/$List{Name}/ig;
	$Script{EmailSubscribed} =~ s/\$ListEmail\$/$Script{Email}/ig;
	$Script{EmailSubscribed} =~ s/\$SubLink\$/$Script{SubLink}/ig;
	$Script{EmailSubscribed} =~ s/\$UnSubLink\$/$UnSubLink/ig;
	############################################################
	&Mail_Send(
		$in{email}, #$To,
		$Script{Email}, #$From,
		'text', #Format
		$Subject, #$Subj,
		$Script{EmailSubscribed}, #$TextMsg
		$in{HTMLMsg}, #$HTMLMsg
		$in{CC}, #$CC
		$in{BCC}, #$BCC
		$in{AttachFile}, #$AttachFile
		$in{AttachType}, #$AttachType
	);
 }
################################################
# Send the unsubscribed Email
################################################
sub SendUnsubscribedEmail
 {
	return unless $Script{SendConfirmOfSub};
	############################################################
	$in{name} = $in{email} unless $in{name};
	############################################################
	my $Subject = 'You have been removed!';
	############################################################
	my $UnSubLink = qq($Script{Script_Announcer}?U,$in{email},$List{Number});	
	############################################################
	# Perform Message Substitutions
	############################################################
	$Script{EmailUnsubscribed} =~ s/\$Email\$/$in{email}/ig;
	$Script{EmailUnsubscribed} =~ s/\$Name\$/$in{name}/ig;
	$Script{EmailUnsubscribed} =~ s/\$SubDate\$/$SubDate/ig;
	$Script{EmailUnsubscribed} =~ s/\$ListTitle\$/$List{Name}/ig;
	$Script{EmailUnsubscribed} =~ s/\$ListEmail\$/$Script{Email}/ig;
	$Script{EmailUnsubscribed} =~ s/\$SubLink\$/$Script{SubLink}/ig;
	$Script{EmailUnsubscribed} =~ s/\$UnSubLink\$/$UnSubLink/ig;
	############################################################
	&Mail_Send(
		$in{email}, #$To,
		$Script{Email}, #$From,
		'text', #Format
		$Subject, #$Subj,
		$Script{EmailUnsubscribed}, #$TextMsg
		$in{HTMLMsg}, #$HTMLMsg
		$in{CC}, #$CC
		$in{BCC}, #$BCC
		$in{AttachFile}, #$AttachFile
		$in{AttachType}, #$AttachType
	);
 }

################################################
# Send the Email to admin
################################################
sub SendAdminNotice
 {
	return unless $Script{AdminNotices};
	############################################################
	$in{subject} = "$ActionPerformed: $in{email} ($List{Name})";
	############################################################
	$in{Message} = qq(The request to $ActionPerformed was completed by '$in{email}' for the list '$List{Name}'.\n\n).
		($ENV{'REMOTE_HOST'} ? qq(IP: $ENV{'REMOTE_HOST'}\n\n) : '').
		qq($Script{SubPageTitle}\n$Script{SubLink}\n$Script{Email});
	############################################################
	&Mail_Send(
		$Script{Email}, #$To,
		$Script{Email}, #$From,
		'text', #Format
		$in{subject}, #$Subj,
		$in{Message}, #$TextMsg
		$in{HTMLMsg}, #$HTMLMsg
		$in{CC}, #$CC
		$in{BCC}, #$BCC
		$in{AttachFile}, #$AttachFile
		$in{AttachType}, #$AttachType
	);
 }
################################################
# Split Temp list
################################################
sub SplitConfirmList
 {
	my ($a) = shift;
	chomp $a;
	( $List{Number}, $email, $name, $ConfirmCode, $format ) = split(/\|/, $a, 5);
 }
################################################
# form not complete sub
################################################
sub MissingInfo
 {
	&Header();
	$Script{MessageNoRequired} = &OnlineMessageSubst($Script{MessageNoRequired});
	$htmloutput .= $Script{MessageNoRequired};
	&Footer();
 }
################################################
# Do not remove anything below this line
################################################

1;