<?php
/*
*********************************************************
Class: phpforumPlus
Description: a php class for rapid forums creation
Author: Tsiavos Chris <hide@address.com>
Date: Sep 2003
*********************************************************
Requirements: PHP,RDBMS(MySQL or PostgreSQL),a JavaScript
enabled web browser
*********************************************************
User Methods
*********************************************************
*********************************************************
FOR EXAMPLES & USAGE READ THE ACCOMPANING README FILE
*********************************************************
phpforumplus::set_member($topic)
sets the registered member name for the discussion board
-------------------------------------------------------------------------------
phpforumplus::display()
displays all the threads related to the topic plus information about the thread's sender,date &
number of replies
-------------------------------------------------------------------------------
phpforumplus::display_thread()
displays the select thread message body plus all the replies related to the current thread
-------------------------------------------------------------------------------
phpforumplus::reply_to_thread()
use this function to reply to the selected thread
-------------------------------------------------------------------------------
phpforumplus::post_new_thread()
use this function to post a new thread to the selected topic
-------------------------------------------------------------------------------
phpforumplus::display_forums()
used to display the forum topics with short content descriptions
*******************************************************************************************
Internal Methods
*******************************************************************************************
phpforumplus::connect_to_database()
function providing connection with the database hosting the forums
-------------------------------------------------------------------------------------------
phpforumplus::close_database()
disconnects from the database hosting the forums
-------------------------------------------------------------------------------------------
phpforumplus::init_variables()
used to initialize the $_GET & other variables utilized in several places within this script
-------------------------------------------------------------------------------------------
phpforumplus::validate($variable)
this function is used to validate $_GET variables used in different sections of the script for malicious entries.
Such variables include $_GET["forumid"],$_GET["msgid"] and others
-------------------------------------------------------------------------------------------
phpforumplus::display_error($error_number)
used to graphically display error messages generated by unsuccessfull $_GET validated variables
-------------------------------------------------------------------------------------------
phpforumplus::threads_per_page($msg_count)
used to calculate the number of thread pages according to $theads_limit_per_page value
-------------------------------------------------------------------------------------------
phpforumplus::display_thread_and_replies()
used to display the body of the current thread & call the phpforumplus::display_replies($mystyle)
function
-------------------------------------------------------------------------------------------
phpforumplus::display_replies($mystyle)
used to display all replies associated with the current thread
-------------------------------------------------------------------------------------------
phpforumplus::reply_post_table($action,$headline,$mystyle)
used to provide the html data needed by the reply_to_thread and post_new_thread functions
-------------------------------------------------------------------------------------------
phpforumplus::create_menu()
creates the menu buttons utilized in "post new thread" & "reply to thread" scripts providing a limited number of allowable
html tags for the body of a new or reply thread
-------------------------------------------------------------------------------------------
phpforumplus::insert_javascript($for_what)
inserts the javascript needed by the menu buttons to function properly
-------------------------------------------------------------------------------------------
phpforumplus::execute_query($query)
function that executes the sql query defined in the $query variable
-------------------------------------------------------------------------------------------
phpforumplus::insert_element($form_name,$form_body)
complementary function for phpforumplus::insert_javascript($for_what)
-------------------------------------------------------------------------------------------
*/
require_once("DB.php");
include("style.php");
class phpforumPlus {
/*//----------------environment options--------------
var $member;
//----------------end environment options---------
//----------------page options----------------------
var $display_forum;
var $view_thread_page;
var $reply_page;
var $post_new_thread_page;
var $search_page;
//-----------------end_page options---------------
//---------------database options------------------
var $threads_limit_per_page;
var $thread_length_limit;
var $headline_length_limit;
var $database_type;
var $db_host;
var $db_user;
var $db_passwd;
var $forum_database;
var $topic_tables;
var $table_struct;
//-------------end_database options------------
//-------------icon options-----------------------
var $forum_icon;
var $thread_icon;
var $hot_thread_icon;
var $hot_thread_limit;
//------------end_icon options------------------
//------------stylesheet options------------------
var $style_type;
//-------------end-stylesheet-options-----------
//------------site options-------------------------
var $welcome_msg;
var $site_administrator;
//-------------end_site options------------------*/
//------------internal vatiables-------------------
var $hd;
var $int_forumid;
var $int_post_table;
var $int_replies_table;
var $int_sort_by;
var $int_order;
var $int_position;
var $int_id;
var $int_target;
var $int_body;
var $int_member;
var $int_headline;
var $int_date_posted;
var $int_post_views;
var $int_post_headline;
var $int_post_body;
var $int_post_date_posted;
var $int_post_member;
var $generator;
//------------end internal variables-------------
function connect_to_database() {
$hd=DB::connect("$this->database_type://$this->db_user:$this->db_passwd@$this->db_host/$this->forum_database");
if (DB::isError($hd)) die ($hd->getMessage());
$this->hd=$hd;
}
function close_database() {
$this->hd->disconnect();
}
function init_variables() {
$this->int_target=$_SERVER["PHP_SELF"];
$this->int_forumid=$this->validate($_GET["forumid"]);
$this->int_sort_by=$this->validate($_GET["sort_by"]);
$this->int_order=$this->validate($_GET["order"]);
$this->int_position=$this->validate($_GET["position"]);
$this->int_post_table=$this->topic_tables[$this->int_forumid][0];
$this->int_replies_table=$this->topic_tables[$this->int_forumid][1];
$this->int_id=$this->table_struct["table_replies"][0];
$this->int_member=$this->table_struct["table_replies"][1];
$this->int_headline=$this->table_struct["table_replies"][2];
$this->int_body=$this->table_struct["table_replies"][3];
$this->int_date_posted=$this->table_struct["table_replies"][4];
$this->int_post_member=$this->table_struct["table_posts"][1];
$this->int_post_headline=$this->table_struct["table_posts"][2];
$this->int_post_body=$this->table_struct["table_posts"][3];
$this->int_post_date_posted=$this->table_struct["table_posts"][4];
$this->int_post_views=$this->table_struct["table_posts"][5];
$this->generator="<meta NAME=\"GENERATOR\" CONTENT=\"phpforumPlus http://phpclasses.byting.at/browse.html/package/1317.html\">";
}
function set_member($mymember) {
$this->member=$mymember;
}
function validate($variable) {
if (!isset($variable)) $this->display_error("Missing GET arguments in URL");
switch ($variable) {
case ($_GET["forumid"]):
foreach ($this->topic_tables as $topic => $key) {
$topic=urlencode($topic);
if (md5($topic)==md5(urlencode($variable))) return ($variable);
}
$this->display_error("Invalid forum selected");
case ($_GET["position"]):
if (basename($_SERVER["PHP_SELF"])==$this->post_new_thread_page) {
return 0;
break;
}
$resultset=$this->execute_query("select max(".$this->table_struct["table_posts"][0].") from ".$this->topic_tables[$_GET["forumid"]][0]);
$msg_count=$resultset->fetchRow();
if (empty($msg_count[0])) $this->display_error("Forum empty");
if ($variable>$msg_count[0]-1 || !ereg("^[0-9]+$",$variable))
$this->display_error("Invalid position identifier");
else
return ($variable);
case ($_GET["sort_by"]):
$date_posted_field=$this->table_struct["table_posts"][4];
$member_field=$this->table_struct["table_posts"][1];
!preg_match("/^($date_posted_field|$member_field)$/",$variable) && $this->display_error("Invalid sort identifier");
return ($variable);
case ($_GET["order"]):
!preg_match("/^(asc|desc)$/",$variable) && $this->display_error("Invalid order value");
return ($variable);
case ($_POST["reply_body"] || $_POST["post_body"]):
if (strlen($variable)>$this->thread_length_limit)
$this->display_error("Message too long");
else
return addslashes(strip_tags($variable,"<a><b><i><sub><sup>"));
case ($_GET["method"]):
!preg_match("/^(simple|advanced)$/",$variable) && $this->display_error("Invalid search method");
return ($variable);
case ($_GET["msgid"]):
$resultset=$this->execute_query("select max(".$this->table_struct["table_posts"][0].") from ".$this->topic_tables[$_GET["forumid"]][0]);
$msg_count=$resultset->fetchRow();
if ($variable>$msg_count[0] || !ereg("^[0-9]+$",$variable))
$this->display_error("Invalid thread number");
else
return ($variable);
}
}
function display_error($error) {
$inf="We are sorry for the inconvenience.If you see this message regularly contact the site administrator at <a href=\"mailto:$this->site_administrator\">$this->site_administrator</a>";
switch ($error) {
case "Invalid forum selected":
$error_descr="The requested forum was not found.$inf";
break;
case "Invalid thread number":
$error_descr="The requested thread was not found in database.$inf";
break;
case "Invalid position identifier":
$error_descr="The requested forum portion cannot be displayed.$inf";
break;
case "Message too long":
$error_descr="Your reply message was too long to be sent.Please try to reduce if possible your message length in order to be conformed to limits set by the site administrator";
$error_descr.=" <a href=\"mailto:$this->site_administrator\">$this->site_administrator</a>";
break;
case "Invalid sort identifier":
$error_descr=$inf;
break;
case "Invalid order value":
$error_descr=$inf;
break;
case "Missing GET arguments in URL":
$error_descr=$inf;
break;
case "Empty Subject or message body not permitted":
$error_descr="Please type a valid subject or body for your message";
break;
case "Invalid search method":
$error_descr="Supplied seach method is invalid.Check the GET['method'] variable";
break;
case "Forum empty":
print ("<strong>No threads have been uploaded for this forum topic.Be the first!</strong><br/>");
die("<a href=\"$this->post_new_thread_page?forumid=".urlencode($this->int_forumid)."&position=0&sort_by=$this->int_sort_by&order=$this->int_order\">Post new thread</a>");
}
print("<html>\n<head>\n<title>Error</title>\n");
$mystyle=new style($this->style_type);
$table_body_style=$mystyle->table_body_section[0];
print <<< ERROR_TABLE
</head>
<body>
<table border="$mystyle->table_border" width="$mystyle->table_width" height="$mystyle->table_height" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding">
<tr>
<td class="$mystyle->table_info_section"><strong>Error</strong></td>
<td class="$table_body_style">$error</td>
</tr>
<tr>
<td class="$mystyle->table_info_section"><strong>Description</strong></td>
<td class="$table_body_style">$error_descr</td>
</tr>
</table>
<br/>
<a href="javascript:history.go(-1);">Back</a>
</body>
</html>
ERROR_TABLE;
exit;
}
function display_forums() {
$this->connect_to_database();
$db_member=$this->table_struct["table_posts"][1];
$db_headline=$this->table_struct["table_posts"][2];
$db_date_posted=$this->table_struct["table_posts"][4];
$db_id=$this->table_struct["table_posts"][0];
foreach ($this->topic_tables as $topic=>$value) {
$resultset=$this->execute_query("select * from ".$this->topic_tables[$topic][0]." order by $db_date_posted desc");
$row=$resultset->fetchRow(DB_FETCHMODE_ASSOC);
$id[$topic]=$row[$db_id];
$member[$topic]=$row[$db_member];
$headline[$topic]=$row[$db_headline];
$date_posted[$topic]=$row[$db_date_posted];
$msg_count[$topic]=$resultset->numRows();
}
print("<html>\n<head>\n<title>Forum Topics</title>\n");
$mystyle=new style($this->style_type);
if (!empty($this->forum_icon)) $has_forum_icon="<td class=\"$mystyle->table_info_section\"> </td>";
print <<< DISPLAY_PAGE_HEAD
</head>
<body>
<h4>Forum topics</h4>
<strong>$this->welcome_msg</strong>
<table border="$mystyle->table_border" width="$mystyle->table_width" height="$mystyle->table_height" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding">
<tr>
$has_forum_icon
<td class="$mystyle->table_info_section">Forums</td>
<td class="$mystyle->table_info_section" align="center">Total Posts</td>
<td class="$mystyle->table_info_section" align="center">Last Post</td>
</tr>
<tr>\n
DISPLAY_PAGE_HEAD;
$style=0;
foreach ($this->topic_tables as $topic => $key) {
if (!empty($this->forum_icon[$topic]))
$forum_icon[$topic]="<td class=\"".$mystyle->table_body_section[$style]."\"><img src=\"".$this->forum_icon[$topic]."\" width=\"40\" height=\"40\"></td>";
else {
if ($has_forum_icon)
$forum_icon[$topic]="<td class=\"".$mystyle->table_body_section[$style]."\"> </td>";
}
print (
$forum_icon[$topic]."
<td class=\"".$mystyle->table_body_section[$style]."\"><a href=\"$this->display_forum?forumid=".urlencode($topic)."&position=0&sort_by=$db_date_posted&order=desc\">$topic</a>
<br/>"
.$key[2].
"</td>
<td class=\"".$mystyle->table_body_section[$style]."\" align=\"center\">".$msg_count[$topic]."</td>
<td class=\"".$mystyle->table_body_section[$style]."\" align=\"center\">".$member[$topic]." <br/><a href=\"$this->view_thread_page?forumid=".urlencode($topic)."&msgid=".$id[$topic]."&position=0&sort_by=$db_date_posted&order=desc\"'>".$headline[$topic]."</a> <br/>".$date_posted[$topic]."</td>
</tr>\n");
$style++;
if ($style==count($mystyle->table_body_section)) $style=0;
}
if ($has_forum_icon) $colspan=4;
else $colspan=3;
print("<td class=\"$mystyle->table_footer_section\" colspan=\"$colspan\"> </td>\n</table>\n</body>\n</html>");
}
function display() {
$this->connect_to_database();
$this->init_variables();
$resultset=$this->execute_query("select * from $this->int_post_table");
$msg_count=$resultset->numRows();
if ($this->database_type=="pgsql")
$resultset=$this->execute_query("select * from $this->int_post_table order by $this->int_sort_by $this->int_order limit $this->threads_limit_per_page,$this->int_position");
else
$resultset=$this->execute_query("select * from $this->int_post_table order by $this->int_sort_by $this->int_order limit $this->int_position,$this->threads_limit_per_page");
print ("<html>\n<head>\n<title>Forum threads for topic: $this->int_forumid</title>\n$this->generator\n");
$mystyle=new style($this->style_type);
print <<<SELECT_FORUM
\n</head>
<body>
Jump to forum
<form name="jump">
<select name="jump_to_forum" onChange="window.location=document.jump.jump_to_forum.options[document.jump.jump_to_forum.selectedIndex].value;">
<option value="#">Choose forum</option>\n
SELECT_FORUM;
foreach ($this->topic_tables as $forum=>$value)
print("<option value=\"$this->display_forum?forumid=".urlencode($forum)."&position=0&sort_by=".$this->table_struct["table_posts"][4]."&order=desc\">$forum - ".$value[2]."</option>\n");
$fixed_forumid=urlencode($this->int_forumid);
!empty($this->forum_icon[$this->int_forumid]) && $forum_icon="<img src=\"".$this->forum_icon[$this->int_forumid]."\" width=\"40\" height=\"40\" align=\"left\">" ;
print <<< DISPLAY_PAGE_HEAD
</select>
</form>
<br/>
$forum_icon
<br/>
<a href="$this->post_new_thread_page?forumid=$fixed_forumid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order">Post new thread</a>
<br/>
<br/>
<form method="post" action="$this->search_page?forumid=$fixed_forumid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order&method=simple">
<input type="text" name="search" size="25" maxlength="25">
<input type="submit" name="submit" value="search" onClick="javascript:this.value='Please Wait...';">
<a href="$this->search_page?forumid=$fixed_forumid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order&method=advanced">Advanced Search</a>
</form>
<br/>
<table border="$mystyle->table_border" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding" width="$mystyle->table_width">
<tr>
<td class="$mystyle->table_info_section"> </td>
<td class="$mystyle->table_info_section">Member</td>
<td class="$mystyle->table_info_section">Subject</td>
<td class="$mystyle->table_info_section">Date Posted</td>
<td class="$mystyle->table_info_section">Views</td>
<td class="$mystyle->table_info_section">Replies</td>
</tr>\n
DISPLAY_PAGE_HEAD;
$stylesheet=0;
while ($row=$resultset->fetchRow(DB_FETCHMODE_ASSOC)) {
$current_stylesheet=$mystyle->table_body_section[$stylesheet];
!empty($this->thread_icon) && $has_icon="<td class=\"$current_stylesheet\"><img src=\"$this->thread_icon\"></td>";
$msgid=$row[$this->table_struct["table_posts"][0]];
$replies_number="select count(*) as msg_count from $this->int_replies_table where $this->int_id=$msgid";
$replies_fetch=$this->hd->query($replies_number);
if (DB::isError($replies_fetch)) die ($replies_fetch->getMessage());
$replies_number_result=$replies_fetch->fetchRow(DB_FETCHMODE_ASSOC);
if ($replies_number_result["msg_count"]==NULL) $replies_number_result["msg_count"]=0;
$number_of_replies=$replies_number_result["msg_count"];
if ($number_of_replies>$this->hot_thread_limit) $has_icon="<td class=\"$current_stylesheet\"><img src=\"$this->hot_thread_icon\" width=18 height=18></td>";
$member=$row[$this->int_post_member];
$headline=$row[$this->int_post_headline];
$date_posted=$row[$this->int_post_date_posted];
$views=$row[$this->int_post_views];
isset($views) || $views=0;
print <<< DISPLAY_THREADS
<tr>
$has_icon
<td class="$current_stylesheet">$member</td>
<td class="$current_stylesheet"><a href="$this->view_thread_page?forumid=$fixed_forumid&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order">$headline</a></td>
<td class="$current_stylesheet">$date_posted</td>
<td class="$current_stylesheet">$views</td>
<td class="$current_stylesheet">$number_of_replies</td>
</tr>\n
DISPLAY_THREADS;
$current_msg_count++;
$stylesheet++;
if ($stylesheet==count($mystyle->table_body_section)) $stylesheet=0;
}
$disp=$current_msg_count+$this->int_position;
if (empty($has_icon)) $colspan=5;
else $colspan=6;
print (
"<tr>
<td class=\"$mystyle->table_footer_section\" colspan=\"$colspan\"><strong><center>Displaying threads ".(int)($this->int_position+1)." to $disp of $msg_count</center></strong></td>
</tr>
</table>
<br/>
<table width=\"$mystyle->table_width\">
<tr>\n");
if ($this->int_position-1>0 && $this->int_position<$msg_count-$current_msg_count) {
print(
"<td align=\"right\">
<a href=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=".(int)($this->int_position-$this->threads_limit_per_page)."&sort_by=$this->int_sort_by&order=$this->int_order\">Back</a> |
<a href=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=$disp&sort_by=$this->int_sort_by&order=$this->int_order\">Next</a></td>");
}
else if ($this->int_position==0 && $msg_count>$current_msg_count)
print (
"<td align=\"right\">
<a href=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=$disp&sort_by=$this->int_sort_by&order=$this->int_order\">Next</a></td>");
if ($this->int_position==$msg_count-$current_msg_count && $this->int_position!=0) {
print("
<td align=\"right\">
<a href=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=".(int)($this->int_position-$this->threads_limit_per_page)."&sort_by=$this->int_sort_by&order=$this->int_order\">Back</a>");
}
print("</tr>\n<tr>\n");
$this->threads_per_page($msg_count);
print("</tr>\n</table>\n<br/>\n");
$date_posted_column=$this->table_struct["table_posts"][4];
$member_column=$this->table_struct["table_posts"][1];
print <<< SORT_THREADS_FORM
<form method="get" action="$this->int_target" type="multipart/form-data" name="sort_form">
<input type="hidden" name="forumid" value="$this->int_forumid">
<input type="hidden" name="position" value="0">
<table>
<tr>
</tr>
<td>Sort threads by</td>
<td>
<select name="sort_by">
<option value="$date_posted_column">date_posted</option>
<option value="$member_column">member name</option>
</select>
</td>
<td>
order
</td>
<td>
<select name="order">
<option value="asc">ascending</option>
<option value="desc">descending</option>
</select>
</td>
<td><input type="submit" name="sort" value="sort" onClick="javascript:this.value='Please Wait...';"></td>
</tr>
<tr>
<td colspan="5"><small><strong>Sort:</strong>$this->int_sort_by/$this->int_order</small></td>
</tr>
<tr>
</tr>
</table>
</form>
</body>
</html>
SORT_THREADS_FORM;
$this->close_database();
}
function threads_per_page($msg_count) {
print ("<td align=\"center\">Go to page: ");
$page=0;
for ($i=0;$i<$msg_count;$i+=$this->threads_limit_per_page) {
if ($_GET["position"]==$i)
print ("<a href=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=$i&sort_by=$this->int_sort_by&order=$this->int_order\"><big><strong>$page</strong></big></a> ");
else
print ("<a href=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=$i&sort_by=$this->int_sort_by&order=$this->int_order\">$page</a> ");
$page++;
}
print ("</td>");
}
function execute_query($query) {
$result=$this->hd->query($query);
if (DB::isError($result)) die ($result->getMessage());
return $result;
}
function search() {
$this->connect_to_database();
$this->init_variables();
$this->validate($_GET["method"]);
switch ($_GET["method"]) {
case "simple":
print("<html>\n<head>\n<title>Search Results for ".$_POST["search"]."</title>\n$this->generator\n");
break;
case "advanced":
print("<html>\n<head>\n<title>Advanced Search</title>\n$this->generator\n");
}
$mystyle=new style($this->style_type);
print("\n</head>\n<body>\n<a href=\"javascript:history.go(-1);\">Back</a>\n");
switch ($_GET["method"]) {
case "advanced":
$fixed_forumid=urlencode($this->int_forumid);
$current_stylesheet=$mystyle->table_body_section[0];
print <<<SEARCH_TABLE
<br/>
<br/>
<form method="post" action="$this->search_page?forumid=$fixed_forumid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order&method=advanced">
<table border="$mystyle->table_border" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding" width="$mystyle->table_width">
<tr>
<td class="$mystyle->table_info_section">Advanced Search</td>
<td class="$mystyle->table_info_section"> </td>
</tr>
<tr>
<td class="$mystyle->table_info_section">Search by</td>
<td class="$current_stylesheet">
<select name="search_by">
<option value="$this->int_post_member">member</option>
<option value="$this->int_post_headline">headline</option>
</select>
</td>
</tr>
<tr>
<td class="$mystyle->table_info_section"> </td>
<td class="$current_stylesheet">
My search:
<input type="radio" name="radiobutton" value="starting" checked> Starts with
<input type="radio" name="radiobutton" value="ending"> Ends with
<input type="radio" name="radiobutton" value="contains"> Contains
<br/>
<br/>
<input type="text" name="adv_search" size="25" maxlength="25">
<input type="submit" name="submit" value="Search" onClick="javascript:this.value='Please Wait...';">
</td>
</tr>
<tr>
<td class="$mystyle->table_info_section">Options</td>
<td class="$current_stylesheet">
Sort results by
<select name="sort_by">
<option value="$this->int_post_member">member</option>
<option value="$this->int_post_headline">headline</option>
<option value="$this->int_post_date_posted">date_posted</option>
</select>
order
<select name="order">
<option value="asc">ascending</option>
<option value="desc">descending</option>
</select>
</td>
</tr>
</table>
</form>
SEARCH_TABLE;
if (!empty($_POST["submit"])) {
$keyword=$_POST["search_by"];
$search_value=strip_tags(addslashes($_POST["adv_search"]));
$sort=$_POST["sort_by"];
$order=$_POST["order"];
switch ($_POST["radiobutton"]) {
case "starting":
$result=$this->execute_query("select * from $this->int_post_table where $keyword LIKE '$search_value%' order by $sort $order");
break;
case "ending":
$result=$this->execute_query("select * from $this->int_post_table where $keyword LIKE '%$search_value' order by $sort $order");
break;
case "contains":
$result=$this->execute_query("select * from $this->int_post_table where $keyword LIKE '%$search_value%' order by $sort $order");
break;
}
if ($result->numRows()==0) die("\n<strong>No Matches found.Please repeat your search</strong>\n</body>\n</html>");
else {
print <<<RESULTS
<h3>Search Results for $search_value</h3>
<table border="$mystyle->table_border" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding" width="$mystyle->table_width">
<tr>
<td class="$mystyle->table_info_section">Thread Headline</td>
<td class="$mystyle->table_info_section">Member</td>
<td class="$mystyle->table_info_section">Date Posted</td>
<td class="$mystyle->table_info_section">Views</td>
<td class="$mystyle->table_info_section">Replies</td>
</tr>
RESULTS;
$stylesheet=0;
while ($row=$result->fetchRow(DB_FETCHMODE_ASSOC)) {
$current_stylesheet=$mystyle->table_body_section[$stylesheet];
$msgid=$row[$this->table_struct["table_posts"][0]];
$replies_num=$this->execute_query("select $this->int_id,count(*) as msg_count from $this->int_replies_table group by $this->int_id having $this->int_id=$msgid");
$replies_number_result=$replies_num->fetchRow(DB_FETCHMODE_ASSOC);
if ($replies_number_result["msg_count"]==NULL) $replies_number_result["msg_count"]=0;
$number_of_replies=$replies_number_result["msg_count"];
$member=$row[$this->int_post_member];
$headline=$row[$this->int_post_headline];
$date_posted=$row[$this->int_post_date_posted];
$views=$row[$this->int_post_views];
isset($views) || $views=0;
print ("
<tr>
<td class=\"$current_stylesheet\">
<a href=\"$this->view_thread_page?forumid=$fixed_forumid&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">$headline</a>
</td>
<td class=\"$current_stylesheet\">$member</td>
<td class=\"$current_stylesheet\">$date_posted</td>
<td class=\"$current_stylesheet\">$views</td>
<td class=\"$current_stylesheet\">$number_of_replies</td>
</tr>");
$stylesheet++;
if ($stylesheet==count($mystyle->table_body_section)) $stylesheet=0;
}
print<<<FOOTER
<tr>
<td class="$mystyle->table_footer_section" colspan="5"> </td>
</tr>
</table>
</body>
</html>
FOOTER;
}
}
break;
case "simple":
print ("<h3>Search Results for '".$_POST["search"]."'</h3>");
$keyword=strip_tags(addslashes($_POST["search"]));
$result=$this->execute_query("select * from $this->int_post_table where $this->int_post_headline LIKE '%$keyword%'");
if ($result->numRows()==0) die("\n<strong>No Matches found.Please repeat your search</strong>\n</body>\n</html>");
print<<<TABLE_RESULTS
<table border="$mystyle->table_border" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding" width="$mystyle->table_width">
<tr>
<td class="$mystyle->table_info_section">Thread Headline</td>
<td class="$mystyle->table_info_section">Member</td>
<td class="$mystyle->table_info_section">Date Posted</td>
<td class="$mystyle->table_info_section">Views</td>
</tr>
TABLE_RESULTS;
$stylesheet=0;
while ($row=$result->fetchRow(DB_FETCHMODE_ASSOC)) {
$current_stylesheet=$mystyle->table_body_section[$stylesheet];
$msgid=$row[$this->table_struct["table_posts"][0]];
$member=$row[$this->int_post__member];
$headline=$row[$this->int_post_headline];
$date_posted=$row[$this->int_post_date_posted];
$views=$row[$this->int_post_views];
isset($views) || $views=0;
$fixed_forumid=urlencode($this->int_forumid);
print ("
<tr>
<td class=\"$current_stylesheet\">
<a href=\"$this->view_thread_page?forumid=$fixed_forumid&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">$headline</a>
</td>
<td class=\"$current_stylesheet\">$member</td>
<td class=\"$current_stylesheet\">$date_posted</td>
<td class=\"$current_stylesheet\">$views</td>
</tr>");
$stylesheet++;
if ($stylesheet==count($mystyle->table_body_section)) $stylesheet=0;
}
print<<<REMAIN
<tr>
<td class="$mystyle->table_footer_section" colspan="4"> </td>
</tr>
</table>
<br/>
<form method="post" action="$this->search_page?forumid=$fixed_forumid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order&method=simple">
<input type="text" name="search" size="25" maxlength="25">
<input type="submit" name="submit" value="search" onClick="javascript:this.value='Please Wait...';">
<a href="$this->search_page?forumid=$fixed_forumid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order&method=advanced">Advanced Search</a>
</form>
</body>
</html>
REMAIN;
}
}
function display_thread() {
$this->connect_to_database();
$this->display_thread_and_replies();
$this->close_database();
}
function display_thread_and_replies() {
$this->init_variables();
$msgid=$this->validate($_GET["msgid"]);
$post_id=$this->table_struct["table_posts"][0];
if ($this->database_type=="pgsql")
$this->execute_query("update $this->int_post_table set $this->int_post_views=case when $this->int_post_views is NULL then 1 else $this->int_post_views+1 end where $post_id=$msgid");
else
$this->execute_query("update $this->int_post_table set $this->int_post_views=IF($this->int_post_views IS NULL,1,$this->int_post_views+1) where $post_id=$msgid");
print("<html>\n<head>\n<title>View thread</title>\n$this->generator\n");
$mystyle=new style($this->style_type);
print("\n</head>\n<body>\n");
print ("<a href=\"$this->reply_page?forumid=".urlencode($this->int_forumid)."&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">Reply</a> |
<a href=\"$this->display_forum?forumid=".urlencode($this->int_forumid)."&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">Back</a>\n<br/>");
$resultset=$this->execute_query("select count(*) as msg_count from $this->int_replies_table where $this->int_id=$msgid");
$replies_number_result=$resultset->fetchRow(DB_FETCHMODE_ASSOC);
if (empty($replies_number_result["msg_count"])) $replies_number_result["msg_count"]=0;
$resultset=$this->execute_query("select * from $this->int_post_table where $post_id=$msgid");
print (
"<br/>
<strong>Thread</strong>
<br/>
<br/>
<table border=\"$mystyle->table_border\" cellspacing=\"$mystyle->table_cell_spacing\" cellpadding=\"$mystyle->table_cell_padding\" width=\"$mystyle->table_width\" height=\"$mystyle->height\">\n");
$stylesheet=$mystyle->table_body_section[0];
$row=$resultset->fetchRow(DB_FETCHMODE_ASSOC);
$member=$row[$this->int_post_member];
$resultset=$this->execute_query("select count(*) as total_posts from $this->int_post_table where $this->int_post_member='$member'");
$posts=$resultset->fetchRow(DB_FETCHMODE_ASSOC);
$posts_number=$posts["total_posts"];
$date_posted=$row[$this->int_post_date_posted];
$headline=stripslashes(trim($row[$this->int_post_headline]));
$replies=$replies_number_result["msg_count"];
$message_body=nl2br(trim(stripslashes($row[$this->int_post_body])));
print <<<DISPLAY_POST_BODY
<tr>
<td class="$mystyle->table_info_section">Sender</td>
<td class="$mystyle->table_info_section">Threads Posted</td>
<td class="$mystyle->table_info_section">Date Posted</td>
<td class="$mystyle->table_info_section">Subject</td>
<td class="$mystyle->table_info_section">Replies</td>
</tr>
<tr>
<td class="$stylesheet">$member</td>
<td class="$stylesheet">$posts_number</td>
<td class="$stylesheet">$date_posted</td>
<td class="$stylesheet">$headline</td>
<td class="$stylesheet">$replies</td>
</tr>
<tr>
<td class="$stylesheet" colspan="5">$message_body</td>
</tr>\n
DISPLAY_POST_BODY;
print ("</table>\n<br/>\n<br/>\n<br/>\n");
$this->display_replies($mystyle);
}
function display_replies($mystyle) {
$date_posted_column=$this->table_struct["table_replies"][4];
$member_column=$this->table_struct["table_replies"][1];
!empty($_POST["sort_by"]) || $_POST["sort_by"]="$date_posted_column";
!empty($_POST["order"]) || $_POST["order"]="desc";
$sort_by=$_POST["sort_by"];
$order=$_POST["order"];
$msgid=$_GET["msgid"];
$url=urlencode($this->int_forumid);
print <<<DISPLAY_FORM_REPLIES
<form method="post" action="$this->int_target?forumid=$url&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order" type="multipart/form-data">
<table>
<tr>
<td>Sort replies by</td>
<td>
<select name="sort_by">
<option value="$date_posted_column">date_posted</option>
<option value="$member_column">member name</option>
</select>
</td>
<td>
order
</td>
<td>
<select name="order">
<option value="asc">ascending</option>
<option value="desc">descending</option>
</select>
</td>
<td><input type="submit" name="sort" value="sort" onClick="javascript:this.value='Please Wait...';"></td>
</tr>
<tr>
<td colspan="5"><small><strong>Sort:</strong>$sort_by/$order</small></td>
</tr></table>
<br/>
DISPLAY_FORM_REPLIES;
$resultset=$this->execute_query("select * from $this->int_replies_table where $this->int_id=$msgid order by $sort_by $order");
if ($resultset->numRows()==0)
print ("<br/>\n<strong>No Replies</strong>\n<br/>\n");
else {
print <<<DISPLAY_TABLE
<br/>\n<strong>Replies</strong>\n<br/>\n
<table border="$mystyle->table_border" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding" width="$mystyle->table_width" height="$mystyle->height">
<tr>
<td class="$mystyle->table_info_section">Sender</td>
<td class="$mystyle->table_info_section">Subject</td>
<td class="$mystyle->table_info_section">Date Posted</td>
</tr>
DISPLAY_TABLE;
$stylesheet_number=0;
while ($row=$resultset->fetchRow(DB_FETCHMODE_ASSOC)) {
$current_stylesheet=$mystyle->table_body_section[$stylesheet_number];
$date_posted=$row[$this->int_date_posted];
$headline=strip_tags(trim(stripslashes($row[$this->int_headline])));
$member=$row[$this->int_member];
$message_body=nl2br(trim(stripslashes($row[$this->int_body])));
print <<< DISPLAY_REPLIES
<tr>
<td class="$current_stylesheet">$member</td>
<td class="$current_stylesheet">$headline</td>
<td class="$current_stylesheet">$date_posted</td>
</tr>
<tr>
<td class="$current_stylesheet" colspan="3">$message_body</td>
</tr>\n
DISPLAY_REPLIES;
$stylesheet_number++;
if ($stylesheet_number==count($mystyle->table_body_section)) $stylesheet_number=0;
}
print("<tr>\n<td class=\"$mystyle->table_info_section\" colspan=\"3\"> </td>\n</tr>\n</table>\n");
}
print("</body>\n</html>");
}
function reply_to_thread() {
$this->connect_to_database();
$this->init_variables();
$msgid=$this->validate($_GET["msgid"]);
$post_id=$this->table_struct["table_posts"][0];
if (!empty($_POST["reply"])) {
$message_body=$this->validate($_POST["reply_body"]);
$message_headline=addslashes(strip_tags($_POST["reply_headline"]));
if (empty($message_headline) || empty($message_body))
$this->display_error("Empty Subject or message body not permitted");
$reply_query=<<< REPLY_QUERY
insert into $this->int_replies_table values ($msgid,'$this->member','$message_headline','$message_body',now())
REPLY_QUERY;
$this->execute_query($reply_query);
print ("<html>\n<head>\n<title>Reply to thread</title>\n$this->generator\n");
$mystyle=new style($this->style_type);
print("\n</head>\n<body>\n");
print ("<h3>Your reply message has been sent</h3>\n");
print ("<a href=\"$this->view_thread_page?forumid=".urlencode($this->int_forumid)."&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">Go back</a>\n");
}
else {
$resultset=$this->execute_query("select $this->int_post_headline from $this->int_post_table where $post_id=$msgid");
$headline=$resultset->fetchRow();
print ("<html>\n<head>\n<title>Reply to thread</title>\n$this->generator\n");
$mystyle=new style($this->style_type);
$this->insert_javascript("for_replies_page");
print("</head>\n<body>\n");
print ("<h4>Reply to thread: ".$headline[0]."</h4>\n");
print("<a href=\"$this->view_thread_page?forumid=".urlencode($this->int_forumid)."&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">Go back</a>\n<br/>\n<br/>\n");
print ("<form name=\"reply_form\" method=\"post\" action=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&msgid=$msgid&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\" type=\"multipart/form-data\">\n");
$this->reply_post_table("reply","Re:".$headline[0],$mystyle);
}
print("</body>\n</html>");
$this->close_database();
}
function post_new_thread() {
$this->connect_to_database();
$this->init_variables();
if (!empty($_POST["post"])) {
$message_body=$this->validate($_POST["post_body"]);
$message_headline=addslashes(strip_tags($_POST["post_headline"]));
if (empty($message_headline) || empty($message_body)) $this->display_error("Empty Subject or message body not permitted");
$insert_query=<<< INSERT_QUERY
insert into $this->int_post_table ($this->int_post_member,$this->int_post_headline,$this->int_post_body,$this->int_post_date_posted) values ('$this->member','$message_headline','$message_body',now())
INSERT_QUERY;
$this->execute_query($insert_query);
print ("<html>\n<head>\n<title>Post new thread to $this->int_forumid Forum</title>\n$this->generator\n");
$mystyle=new style($this->style_type);
print("\n</head>\n<body>\n");
print ("<h3>Your thread has been uploaded</h3>\n");
print ("<a href=\"$this->display_forum?forumid=".urlencode($this->int_forumid)."&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">Go back</a>\n");
}
else {
print ("<html>\n<head>\n<title>Post new thread to $this->int_forumid Forum</title>\n$this->generator\n");
$mystyle=new style($this->style_type);
$this->insert_javascript("for_post_page");
print("</head>\n<body>
<h4>Post new thread to $this->int_forumid Forum</h4>
<a href=\"$this->display_forum?forumid=".urlencode($this->int_forumid)."&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\">Go back</a>
<br/>
<br/>
<form name=\"post_form\" method=\"post\" action=\"$this->int_target?forumid=".urlencode($this->int_forumid)."&position=$this->int_position&sort_by=$this->int_sort_by&order=$this->int_order\" type=\"multipart/form-data\">\n");
$this->reply_post_table("post","",$mystyle);
}
print("</body>\n</html>");
$this->close_database();
}
function reply_post_table($action,$headline,$mystyle) {
$body_name=$action."_body";
$date=date("D d M Y");
$headline_name=$action."_headline";
$table_body_style=$mystyle->table_body_section[0];
$menu=$this->create_menu();
print <<< REPLY_POST_TABLE
<table border="$mystyle->table_border" cellspacing="$mystyle->table_cell_spacing" cellpadding="$mystyle->table_cell_padding" width="$mystyle->table_width" height="$mystyle->height">
<tr>
<td class="$mystyle->table_info_section">Subject</td>
<td class="$mystyle->table_info_section"><input type="text" name="$headline_name" size="$this->headline_length_limit" maxlength="$this->headline_length_limit" value="$headline"></td>
</tr>
<tr>
<td class="$mystyle->table_info_section">Posting Date</td>
<td class="$table_body_style">$date</td>
</tr>
<tr>
<td class="$mystyle->table_info_section">HTML Options</td>
<td class="$table_body_style">$menu</td>
</tr>
<tr>
<td class="$mystyle->table_info_section">Body:</td>
<td class="$table_body_style"><textarea name="$body_name" cols="70" rows="20" wrap="physical"></textarea></td>
</tr>
<tr>
<td class="$mystyle->table_info_section"> </td>
<td class="$table_body_style"><input type="submit" name="$action" value="$action" onClick="javascript:this.value='Please Wait...';"></td>
</tr>
</table>
</form>\n
REPLY_POST_TABLE;
}
function create_menu() {
$menu= <<< CREATE_MENU
<input type="button" name="strong" value="Bold" onclick="insert_element('bold');">
<input type="button" name="em" value="Italics" onclick="insert_element('italics');">
<input type="button" name="url" value="URL" onclick="insert_element('url');">
<input type="button" name="Mail" value="Mail" onclick="insert_element('mail');">
<input type="button" name="subscript" value="SUB" onclick="insert_element('subscript');">
<input type="button" name="superscript" value="SUP" onclick="insert_element('superscript');">
CREATE_MENU;
return $menu;
}
function insert_javascript($for_what) {
switch($for_what) {
case "for_post_page":
$form_name="post_form";
$form_body="post_body";
break;
case "for_replies_page":
$form_name="reply_form";
$form_body="reply_body";
break;
}
print ("\n<script language=\"JavaScript\">\n<!--\n");
$this->insert_element($form_name,$form_body);
print ("//-->\n</script>\n");
}
function insert_element($form_name,$form_body) {
print <<< JAVASCRIPT_FOR_MENU
function insert_element(myelement) {
switch (myelement) {
case "bold" :
var bold_text=window.prompt("Type the text you want to make bold ","");
document.$form_name.$form_body.value=document.$form_name.$form_body.value+bold_text.bold();
break;
case "italics" :
var it_text=window.prompt("Type the text you want to make italics","");
document.$form_name.$form_body.value=document.$form_name.$form_body.value+it_text.italics();
break;
case "url" :
var url_text=window.prompt("Type the url address you want to insert (without the http prefix)","");
document.$form_name.$form_body.value=document.$form_name.$form_body.value+url_text.link("http://"+url_text);
break;
case "mail" :
var mail=window.prompt("Type the e-mail address you want to insert ","");
document.$form_name.$form_body.value=document.$form_name.$form_body.value+mail.link("mailto:"+mail);
break;
case "subscript":
var substring=window.prompt("Type the text for the subscript effect ","");
document.$form_name.$form_body.value=document.$form_name.$form_body.value+substring.sub();
break;
case "superscript":
var substring=window.prompt("Type the text for the superscript effect ","");
document.$form_name.$form_body.value=document.$form_name.$form_body.value+substring.sup();
}
}\n\n
JAVASCRIPT_FOR_MENU;
}
}
?>