# kTalk - NewsPro talkback addon

# Set the path to ktconfig.pl
# If it's in the same directory as npa_ktalk.pl, you may be able to leave
# this as is. If it is in another directory, or if you run into problems,
# change this to the absolute path to ktconfig.pl.
# 

$ktconfigpath = 'ktconfig.pl';

# 
# ------  NO EDITING REQURIED BELOW ---
#

require $ktconfigpath;

push(@Addons_Loaded, 'kTalk 2.0');
push(@Addons_SaveNews, 'ktalk_SaveNews');
push(@Addons_DisplaySubForm, 'ktalk_SubmitNews');
push(@Addons_loadND_3, 'ktalk_loadND_3');
push(@Addons_loadND_1, 'ktalk_loadND_1');
push(@Addons_RemoveNews2, 'ktalk_RemoveNews2');
push(@Addons_PageHandler, 'ktalk_PageHandler');
push(@Addons_MainPage, 'ktalk_MainPage');
push(@Addons_NPHTMLFoot, 'ktalk_HTMLFoot');
$Addons_List{'kTalk 2.0'} = ['npa_ktalk.pl', 'Allows users to post comments about your news items on a public talkback page. Created by KrYo.', 'http://amphibian.gagames.com/addon.cgi?ktalk&2.0'];
&CheckBuild(22, "kTalk 2.0", "npa_ktalk.pl");


# sub for putting a dropdown in newspro submitnews section
sub ktalk_SubmitNews {
    push(@formfields, 'newsktalk');
    $FormFieldsName{'newsktalk'} = 'Create talkback page?';
    $FormFieldsCustom{'newsktalk'} = q~
    <select name="newsktalk"><option value="1" selected>Yes</option>
    <option value="0">No</option></select>~;
}

sub ktalk_SaveNews {
	# Checking the dropdown

	if ($newsktalk) {
		my $resultPage;
		# Reading the template
		NPopen('INFILE',$talktmpl);
		while (<INFILE>) {
			$resultPage .= $_;
		}
		close(INFILE);
			
		
		# Get a clean filename.
		$filename = $snid; #Assuming submitted fields are in %in
		$filename =~ s/[^0-9\,]//g; # Strip out anything other than number or comma from the news ID
		$filename .= $talkext; # Add .shtml to the end.
		
		NPopen('NEWFILE',">$talkdir/$filename");
		
		#Elvii code for getting formatted newsitems
		$newsdate = GetTheDate();
		require $ndisplaypl;
		&$ktnewssub;
		# The HTML is now in $newshtml
		
		# template search and replace
		$resultPage =~ s/<!--INSTRUCTIONS[\s\S]+?END INSTRUCTIONS-->//g; # in case people leave the instruction comment in
		$resultPage =~ s/<!--kTalk NewsSubject-->/$in{'newssubject'}/gi;
		$resultPage =~ s/<!--ktalk news-->/$newshtml/gi;
		$resultPage =~ s/<!--ktalk newsID-->/<input type="hidden" name="newsID" value="$newsid"><!--ktalk format 1-->/gi;
		$resultPage =~ s/<!--ktalk postURL-->/$postcgiurl/gi;
		
		print NEWFILE $resultPage;  
		close(NEWFILE);
	}
}

sub ktalk_loadND_3 {
	opendir(KTALK, $talkdir);
 	my @talkdir = readdir(KTALK);
 	closedir(KTALK);
	
	my ($ktdirentry, $ktitemid);

	foreach $ktdirentry (@talkdir) {
		if ($ktdirentry =~ /([0-9,]+)\Q$talkext\E/) {
			$ktitemid = $1;
			NPopen(KTFILE, "$talkdir/$ktdirentry");
			KTLOOP: while (<KTFILE>) {
				if (/<!--ktalk postnum:(\d+)-->/) {
					if (defined $NewsID{$ktitemid} && $NewsData[$NewsID{$ktitemid}]) {
						$NewsData[$NewsID{$ktitemid}]->{'ktalknum'} = $1;
						$NewsData[$NewsID{$ktitemid}]->{'ktalkURL'} = "$talkbaseurl/$ktitemid$talkext";
					}
					last KTLOOP;
					
				}
			}
			close(KTFILE);
		}
	}
}

sub ktalk_loadND_1 {
	push(@ffield_add, 'ktalknum', 'ktalkURL');
	$ktalknum = '';
	$ktalkURL = '';
}

sub ktalk_RemoveNews2 {
	
	if ($ktalknum && $up == 3) {
		print qq~
		<a href="$scripturl?ktalkremove$newsid">Remove Comments</a>
		~;
	}
}

sub ktalk_PageHandler {
	if ($up == 3) {
		if ($qstring =~ /^ktalkremove([\d\,]+)/) {
			ktalk_RemoveComments1($1);
			exit;
		}
		if ($qstring =~ /^ktalkremovesave([\d\,]+)/) {
			ktalk_RemoveComments2($1);
			exit;
		}

		if ($qstring eq 'ktalkDispGenerateTalkbackForm'){
			NPHTMLHead("kTalk admin - Add comment page");
			ktalk_ktalkDispGenerateTalkbackForm();
			ktalk_printnav();
			NPHTMLFoot();
			exit;
		}

		if ($qstring eq 'ktalkGeneratekTalkPage'){
			#The generic talkback generator script
			if ($in{'ktalkpreview'}){
				#Preview
				ktalk_GenerateGenericPreview();
			}
			elsif ($in{'Submit'}) {
				# Make page
				NPHTMLHead("kTalk admin - kTalkpage generated.");
				my $ktalk_random = &ktalk_generate_random(); # Gets random figures

				my $filename = $ktrandom . $talkext;

				if (-e "$talkdir/$filename") {
					print "kTalk page generation failed, please try again.";
					ktalk_printnav();
					NPHTMLFoot();
					exit;			
				} else {
					ktalk_MakeGenericTalkbackPage($ktalk_random);
				}
				print "Made a page here [<a href=\"$talkbaseurl\/$ktalk_random$talkext\" target=\"ktalkgenerateapage\">$talkbaseurl\/$ktalk_random$talkext<\/a>]<br> (the link will open another browserwindow)";
				ktalk_printnav();
				NPHTMLFoot;
				exit;
			} else {
				# Do nothing	
				NPHTMLHead("kTalk admin - Do nothing.");
				print "Nothing to do.";
				ktalk_printnav();
				NPHTMLFoot();
				exit;

			}
		}

		if ($qstring eq 'ktalkRemovePages'){
			NPHTMLHead("kTalk admin - Choose file for removal.");
			ktalk_dir();
			ktalk_printnav();
			NPHTMLFoot();
			exit;	
		}

		if ($qstring =~ /ktalkRemovePage/){
			if ($in{'ktalkRemoveFile'}) {
				# Remove file
				my $ktRemoveFilename = $in{'ktalkRemoveFile'}; 		
				$ktRemoveFilename =~ s/[^0-9\,]//g; # Strip out anything other than number or comma from the news ID

				if (unlink("$talkdir/$ktRemoveFilename$talkext")) {
					NPHTMLHead("kTalk admin - Remove file success!.");
					print "$talkdir/$ktRemoveFilename$talkext removed";
					ktalk_printnav();
					NPHTMLFoot;
					exit; 		
				} 
				else {
					NPHTMLHead("kTalk admin - Remove file error!");
					print "Error removing [$talkdir/$ktRemoveFilename$talkext]<br>File not removed... check permissions or please try again.<br> If you cannot delete try deleting the file manually.";
					ktalk_printnav();
					NPHTMLFoot;
					exit; 					
				}

			}
			else {
				ktalk_verifyremoval();
			}
		}


		# The ktalk Admin engine
		if ($qstring eq 'ktalkadmin'){	
			if($in{'ktalk_DisplayUser'}){
				# Display the dropdown.
				NPHTMLHead("kTalk admin - User Information");
				ktalk_DisplayUser();	
				print "<hr>";
				ktalk_PrintUserSelect($in{'username'});
				ktalk_printnav();
				NPHTMLFoot;
				exit;
			} 
			elsif ($in{'ktalk_ModifyUser'}) {	
				if ($in{'ktalk_deleteuser'}){
					# Here we delete a user
					if (ktalk_deleteuser($in{'username'})) { # Checks if the user got saved.
						NPHTMLHead("kTalk admin - User deleted...");
						print "User &quot;$in{'username'}&quot; was deleted...";
						print '<hr>';
						ktalk_PrintUserSelect($in{'username'});
						ktalk_printnav();
						NPHTMLFoot();
						exit;
					} else {
						NPHTMLHead("kTalk admin - Usernot deleted.");
						print "User not deleted, please try again. <br> If the problem persists please check file permissions.";
						print "<hr>";
						ktalk_PrintUserSelect($in{'username'});
						ktalk_printnav();
						NPHTMLFoot();
						exit;
					}		

				} else {		
					
					if (ktalk_ModifyUser()) { # Checks if the user got saved.
						&NPHTMLHead("kTalk admin - User Information Saved...");
						print "User Information Saved...";
						print "<hr>";
						ktalk_PrintUserSelect($in{'username'});
						ktalk_printnav();
						NPHTMLFoot();
						exit;
					} else {
						NPHTMLHead("kTalk admin - User Information Not Saved.");
						print "User information not saved, please try again.<br> If the problem persists please check file permissions.";
						print "<hr>";
						ktalk_PrintUserSelect($in{'username'});
						ktalk_printnav();
						NPHTMLFoot();
						exit;
					}
				}

			} else {
				NPHTMLHead("kTalk admin");
				print "In the dropdown you can see the users who have registered as kTalk users. You can edit a user by selecting the user's and clicking &quot;select user&quot;.";
				ktalk_PrintUserSelect($in{'username'});
				ktalk_printnav();
				NPHTMLFoot();
				exit;
			}
		}
	}
}

sub ktalk_verifyremoval {
	unless ($qstring =~ /^ktalkRemovePage([\d\,]+)/) {
		NPdie("Error - invalid parameters to kTalk page removal.");
	}
	my $ktPage = $1;
	
	NPHTMLHead("kTalk admin - Remove Page");
	print "<b>Are you sure this is the file you want to remove?</b><br>";

	print qq~
	<form name="ktalkRemoveFile" action="$scripturl?ktalkRemovePage" method="post">
  	[<b>$talkdir/$ktPage$talkext</b>]
  	<input type="hidden" name="ktalkRemoveFile" value="$ktPage">
  	<br><br>
  	<input type="submit" name="Submit" value="Remove">
  	<input type="reset" name="Submit2" value="Cancel">
	</form>
	~;
	ktalk_printnav();
	NPHTMLFoot();
	exit;
}

sub ktalk_printnav {
	print "<hr><br>";
	print "<a href=\"$scripturl?ktalkadmin\">kTalk Admin<\/a><br>(the main kTalk administration page)<br>";
	print "<a href=\"$scripturl?ktalkDispGenerateTalkbackForm\">Create separate kTalk page<\/a><br>(creates a kTalk discussion thread which is not associated with a news item)<br>";
	print "<a href=\"$scripturl?ktalkRemovePages\">Remove kTalk Files<\/a><br>(can be slow if you many files)<br>";
	print "<a href=\"$postcgiurl?dispadduserform\">Add user<\/a><br>(add a kTalk user)<br>";
	print "<a href=\"$postcgiurl?displostpassform\">Email password<\/a><br>(sends an e-mail to a specified user that allows them to change their password)<br>";
}

sub ktalk_dir {

	my $ktfilecounter = 0;
	my $ktdir = $talkdir;
	opendir(DIR,"$ktdir");
	my @ktfiles = readdir(DIR);
	closedir(DIR);
	sort(@ktfiles);
	my (@fstat, $ktcurrentfile, @newFiles, $ktfile, $row, $postnum, $ktnid);
	
	foreach $ktfile (@ktfiles){
		$ktcurrentfile ="$ktdir/$ktfile";
		if(-d $ktcurrentfile){
			# Dir, do nothing
		} 
		else {
			@fstat = stat($ktcurrentfile);
			push(@newFiles, [$fstat[9], $ktfile, $fstat[7]]);
		}
	}
	
	my @newFiles2 = map  { $_->[0] }
		       	sort { $b->[1] <=> $a->[1] }
	          	map  { [ $_, ($_->[0]) ] } @newFiles; # Not only does it sort, but it's 99% gibberish.
		
	print q~
		<font size="1" face="Verdana">
		<table border="0"><tr><td colspan="5">
		Current files... (Clicking on a filename will open it in a new browser window if possible)<br>
		Remember to build news after removal of kTalk files.		
		<br></td></tr><tr><td>Filename</td><td>Date</td><td>Size
		</td><td>Posts</td><td>Control</td><td>Title</td></tr>
		~;
	
	foreach $row (@newFiles2){
		my $ktModified = scalar(localtime($row->[0]));
		my $ktPageSubject;
		NPopen('INF',"$talkdir/$row->[1]");
		$postnum = 0;
		CHKLOOP: while (<INF>) {
			if ($_ =~ /<!--ktalk postnum:(\d+)-->/) {
				$postnum = $1;
				if($ktDisplayTitle){
				} else {
					last CHKLOOP;
				}
			}
			if($ktDisplayTitle){
				if($_ =~ /<title>(.*?)<\/title>/){
					
					$ktPageSubject = $1;
					last CHKLOOP;
				}
			}			
		}
		if ($row->[1] =~ /^([\d\,]+)\Q$talkext\E/) {
			$ktnid = $1;
		}
		
		print qq~
		        <tr><td>
		        <font size="1"><a href="$talkbaseurl/$row->[1]" target="_blank">$row->[1]</a> 
		        </td><td><font size="1">$ktModified</font>
		        </td><td><font size="1">$row->[2] bytes</font>
		        </td><td>
		        ~;
	        	if ($postnum) {
				print qq~
				<a href="$scripturl?ktalkremove$ktnid">$postnum</a>
				~;
			}
		        print qq~
		        </td><td>[<a href="$scripturl?ktalkRemovePage$ktnid">Remove page</a>]</font>
		        </td>
		        <td>
		        	$ktPageSubject
		        </td>
		        </tr>
		        ~;
	}
	print '</table></font>';
}

sub ktalk_MakeGenericTalkbackPage {
	my $ktrandom = shift;
	my $resultPage;
	# Reading the template
	NPopen('INFILE',$talktmpl);
	while (<INFILE>) {
		$resultPage .= $_;
	}
	close(INFILE);
	
	my $filename = $ktrandom . $talkext;

	NPopen('NEWFILE',">$talkdir/$filename");
	# template search and replace
	$resultPage =~ s/<!--INSTRUCTIONS[\s\S]+?END INSTRUCTIONS-->//g; # in case people leave the instruction comment in
	$resultPage =~ s/<!--ktalk news-->/$in{'kTalkCommentObject'}/gi;
	$resultPage =~ s/<!--ktalk newsID-->/<input type="hidden" name="newsID" value="$ktrandom"><!--ktalk format 1-->/gi;
	$resultPage =~ s/<!--ktalk postURL-->/$postcgiurl/gi;
	print NEWFILE $resultPage;  
	close(NEWFILE);
}


sub ktalk_GenerateGenericPreview {

	# Reading the template
	my $resultPage;
	# Reading the template
	NPopen('INFILE',$talktmpl);
	while (<INFILE>) {
		$resultPage .= $_;
	}
	close(INFILE);

	# template search and replace
	$resultPage =~ s/<!--INSTRUCTIONS[\s\S]+?END INSTRUCTIONS-->//g; # in case people leave the instruction comment in
	$resultPage =~ s/<!--ktalk news-->/$in{'kTalkCommentObject'}/gi;
	$resultPage =~ s/<!--ktalk newsID-->/<input type="hidden" name="newsID" value="$newsid"><!--ktalk format 1-->/gi;
	$resultPage =~ s/<!--ktalk postURL-->/$postcgiurl/gi;
	print $resultPage;

	exit;

}


sub ktalk_ktalkDispGenerateTalkbackForm {
	print qq~
		<p>Instead of a regular newsitem what you write in the textarea below will be 
		  inserted.</p>
		<p>&nbsp;</p>
		<form name="addktalkpage" method="post" action="$scripturl?ktalkGeneratekTalkPage">
		  <textarea name="kTalkCommentObject" cols="70" rows="15"></textarea>
		  <br>
		  <br>
		  <input type="submit" name="Submit" value="Generate">
		  <input type="submit" name="ktalkpreview" value="Preview"><br>
		NOTICE: The preview will not work correctly with SSI-pages, and you HAVE to use your 'BACK'-button to get back to this page and post it.		  
		</form>
		<p>&nbsp; </p>
	~;
}

sub ktalk_deleteuser {

	my $ktDeleteUser = shift;
	NPopen ('CNT',$ktalkuserfile);
	my (@newCNT, $ktUserFound, @dbline);

	while (<CNT>) {
		@dbline = split(/\|/, $_);
		if (lc($dbline[0]) eq lc($ktDeleteUser)) {
			# Do nothing (delete)
	   		$ktUserFound++;
	 	} else {
   			push(@newCNT, $_);
  		}
 	}
 	close(CNT);

	unless ($ktUserFound) {
  		NPHTMLHead("kTalk Information");
  		print "Couldn't find username to delete. &quot;$ktDeleteUser&quot;. <hr>";
  		ktalk_PrintUserSelect();
  		NPHTMLFoot();
  		exit;
 	} else {
  		NPopen('CNT', ">$ktalkuserfile");
  		print CNT join('', @newCNT);
  		close(CNT);
 	}
 	return 1;
}


sub ktalk_PrintUserSelect {
	my $SelectedUser = shift;
	print qq~
		<center>
		<form action="$scripturl?ktalkadmin" method="Post">
		<select name="username">
	~;
	
	NPopen('INF',"$ktalkuserfile");
	my $usercount = 0;
	my @dbline;
	while (<INF>) {	
		@dbline = split(/\|/, $_);
		if(lc($dbline[0]) eq lc($SelectedUser)){
			print "<option value=\"$dbline[0]\" selected>$dbline[0]<\/option>\n";
		} else {
			print "<option value=\"$dbline[0]\">$dbline[0]<\/option>\n";
		}
		$usercount++;
	}
	close(INF);
	
	print qq~
	</select>
	<input type="hidden" name="ktalk_DisplayUser" value="1">
	<input type="submit" value="Select user"><br>
	Total of $usercount registered users.
	</form>
	</center>
	~;
}
	

sub ktalk_DisplayUser {
	# Prints a single user

	NPopen('INF',"$ktalkuserfile");
	my (@dbline, $selectadmin, $selectuser);
	while (<INF>) {
		chomp($_);
		@dbline = split(/\|/, $_);
		if(lc($dbline[0]) eq lc($in{'username'})) { # the names match 	
		# Set the selected state on the user information (userlevel dropdown)
		if($dbline[4] == 1) {
			$selectadmin = 'selected';
			$selectuser = '';
		} 
		else {
			$selectuser = 'selected';
			$selectadmin = '';
		}

		print qq~	 
		<div align="center">
		  <form action="$scripturl?ktalkadmin" method="Post">
		    <font face="Arial, Helvetica, sans-serif" size="2"><br>
		    <br>
		    </font> 
		    <table width="75%" border="0">
		      <tr><td colspan="3"> 
		          <input type="checkbox" name="ktalk_deleteuser" value="1">
		          <font size="1"> Delete User </font> </td>
		      </tr><tr> 
		        <td><font face="Arial, Helvetica, sans-serif" size="2">Name:</font></td>
		        <td> <font face="Arial, Helvetica, sans-serif" size="2"> 
		          <input type="text" name="username" value="$dbline[0]">
		          <input type="hidden" name="orgname" value="$dbline[0]">
		          </font></td>
		        <td>&nbsp;</td></tr><tr> 
		        <td><font face="Arial, Helvetica, sans-serif" size="2">* Password:</font></td>
		        <td> <font face="Arial, Helvetica, sans-serif" size="2"> 
		          <input type="password" name="userpass" value="">
		          </font></td>
		        <td></td></tr><tr> 
		        <td><font face="Arial, Helvetica, sans-serif" size="2">Email: </font></td>
		        <td> <font face="Arial, Helvetica, sans-serif" size="2"> 
		          <input type="text" name="usermail" value="$dbline[2]">
		          </font></td>
		        <td>&nbsp;</td></tr><tr> 
		        <td><font face="Arial, Helvetica, sans-serif" size="2">Level:</font></td>
		        <td> <font face="Arial, Helvetica, sans-serif" size="2"> 
		          <select name="userlevel">
		            <option value="1" $selectadmin>VIP User</option>
		            <option value="0" $selectuser>Regular User</option>
		          </select>
		          </font></td>
		        <td></td>
		      </tr><tr><td>&nbsp;</td><td colspan="2"><div align="center"> 
		            <p align="right"> 
		              <input type="hidden" name="ktalk_ModifyUser" value="1">
		              <input type="submit" value="Save changes" name="submit">
		            </p><p align="center"> <font size="1">* (the password is there, you cannot 
		              see it but you can change it) </font> </p>
		          </div></td></tr></table></form></div>
		~;
		}
	}
}


sub ktalk_generate_random {
	srand;
	my ($randnum, $count);
	for ($count = 0; $count < 10; $count++) {
		$randnum .= int(rand(10));
	}
	return $randnum;
}

sub ktalk_ModifyUser {

	NPopen('CNT', $ktalkuserfile);
	my (@newCNT, @dbline, $ktcPass, $ktOrgUserlevel);
	my $ktUserFound = 0;

	while (<CNT>) {
		chomp($_);
		@dbline = split(/\|/, $_);
		#($ktusername,$ktuserpass,$ktusermail,$ktusercode,$ktuserlevel) = split(/\|/,$_);
		if ($dbline[0] eq $in{'orgname'}) { # If username isn't changed	
	   		if ($in{'userpass'}){
				$ktcPass = crypt($in{'userpass'}, 'Bc');
	   		} else {
	        		$ktcPass = $dbline[1];
	       		}
	       		push(@newCNT, join('|', $in{'username'}, $ktcPass, $in{'usermail'}, $dbline[3], $in{'userlevel'}));
	   		$ktUserFound++;
	   		
	 	} else {
   			push(@newCNT, $_);
  		}
 	}
 	close(CNT);

	unless ($ktUserFound) {
  		NPHTMLHead("kTalk Information");
  		print "Couldn't find username &quot;$in{'orgname'}&quot;. <hr>";
  		ktalk_PrintUserSelect();
  		NPHTMLFoot();
 	} else {
  		NPopen('CNT', ">$ktalkuserfile");
  		print CNT join("\n", @newCNT);
  		close(CNT);
 	}
 	return 1;
}

sub ktalk_RemoveComments1 {
	my $itemID = shift;
	NPHTMLHead("Remove Comments");
	my $kfp = "$talkdir/$itemID$talkext";
	NPopen('KFILE', $kfp);
	my @kfcontents = <KFILE>;
	close(KFILE);
	my $kfc = join('', @kfcontents);
	unless ($kfc =~ /\Q<!--ktalk format 1-->\E/) {
		print qq~
		This comment page was created by an old version of kTalk, and comments cannot be removed from this page.
		~;
		NPHTMLFoot();
		exit;
	}
	print qq~<form action="$scripturl?ktalkremovesave$itemID" method="POST">~;
	my $commentID;
	my $fullcomment;
	my $commenttext;
	while ($kfc =~ /\Q<!--ktalk start_item \E([\d\-]+) \Q-->\E([\s\S]+?)\Q<!--ktalk end_item \E\1 -->/g) {
		$commentID = $1;
		$fullcomment = $2;
		unless ($fullcomment =~ /\Q<!--ktalk start_comment-->\E([\S\s]+?)\Q<!--ktalk end_comment-->\E/) {
			NPdie("Parsing error; comment file appears to be invalid.");
		}
		$commenttext = $1;
		print qq~
		$commenttext<br>Keep: <input type="radio" name="ktk--$commentID" value="keep" checked>
		Remove: <input type="radio" name="ktk--$commentID" value="remove"><hr width="95%" noshade>
		~;
	}
	print qq~
	<br><input type="submit" name="submit" value="Submit"></form>
	~;
	NPHTMLFoot();
}

sub ktalk_RemoveComments2 {
	my $itemID = shift;
	NPHTMLHead("Remove Comments");
	my $kfp = "$talkdir/$itemID$talkext";
	NPopen('KFILE', $kfp);
	my @kfcontents = <KFILE>;
	close(KFILE);
	my $kfc = join('', @kfcontents);
	unless ($kfc =~ /\Q<!--ktalk format 1-->\E/) {
		print qq~
		This comment page was created by an old version of kTalk, and comments cannot be removed from this page.
		~;
		NPHTMLFoot();
		exit;
	}	
	$kfc =~ /<!--ktalk postnum:(\d+)-->/;
	my $ktpostnum = $1;
	my $kkeynum;
	foreach $kkeynum (keys %in) {
		if ($kkeynum =~ /ktk--([\d\-]+)/) {
			if ($in{$kkeynum} eq "remove") {
				if($ktDeletedPost){ # If the variable is set then message will be altered not removed.
					$kfc =~ s/\Q<!--ktalk start_item \E$1 -->[\s\S]+?\Q<!--ktalk end_item \E$1 -->//;
					$ktpostnum--;
					
				} else {
					$kfc =~ s/\Q<!--ktalk start_item \E$1 -->[\s\S]+?\Q<!--ktalk end_item \E$1 -->//;
					$ktpostnum--;
				}
			}
		}
	}
	$kfc =~ s/<!--ktalk postnum:(\d+)-->/<!--ktalk postnum:$ktpostnum-->/;
	NPopen('KFILE', ">$kfp");
	print KFILE $kfc;
	close(KFILE);
	print qq~
	Any comments which you chose to remove have been removed. They have already been removed from the comments page,
	however the comment count on your news page will not be updated until the news is built.
	~;
	NPHTMLFoot();
}

sub ktalk_MainPage {
	if ($up == 3) {
		print qq~
		<b><a href="$scripturl?ktalkadmin">kTalk Administration</a>:</b> Administer your kTalk comment pages.<br><br>
		~;
	}
}

sub ktalk_HTMLFoot {
	if ($up == 3) {
		print qq~ <a href="$scripturl?ktalkadmin" class="navlink">kTalk Administration</a> |~;
	}	
}
1;
	