--- /dev/null
+#include "../../../include/http/pages/forumthreadspage.h"\r
+#include "../../../include/stringfunctions.h"\r
+#include <cmath>\r
+\r
+const std::string ForumThreadsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+ int currentpage=1;\r
+ std::string currentpagestr="1";\r
+ std::string content="";\r
+ int startrow=0;\r
+ std::string startrowstr="0";\r
+ int rowsperpage=25;\r
+ std::string rowsperpagestr="25";\r
+ std::string sql="";\r
+ int boardid=-1;\r
+ std::string boardidstr="-1";\r
+ int count=0;\r
+ int threadcount=0;\r
+ SQLite3DB::Statement newthreadpostst=m_db->Prepare("SELECT tblMessage.MessageID FROM tblThreadPost INNER JOIN tblMessage ON tblThreadPost.MessageID=tblMessage.MessageID WHERE tblThreadPost.ThreadID=? AND tblMessage.Read=0 LIMIT 0,1;");\r
+ SQLite3DB::Statement replycountst=m_db->Prepare("SELECT COUNT(*)-1 FROM tblThreadPost WHERE ThreadID=?;");\r
+ SQLite3DB::Statement boardnamest=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard WHERE BoardID=?;");\r
+ SQLite3DB::Statement threadcountst=m_db->Prepare("SELECT COUNT(*) FROM tblThread WHERE BoardID=?;");\r
+\r
+ if(queryvars.find("boardid")!=queryvars.end())\r
+ {\r
+ boardidstr=(*queryvars.find("boardid")).second;\r
+ StringFunctions::Convert(boardidstr,boardid);\r
+ }\r
+ if(queryvars.find("currentpage")!=queryvars.end())\r
+ {\r
+ currentpagestr=(*queryvars.find("currentpage")).second;\r
+ StringFunctions::Convert(currentpagestr,currentpage);\r
+ if(currentpage<0)\r
+ {\r
+ currentpage=0;\r
+ }\r
+ StringFunctions::Convert(currentpage,currentpagestr);\r
+ }\r
+ if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="markallread" && boardid!=-1)\r
+ {\r
+ SQLite3DB::Statement markst=m_db->Prepare("UPDATE tblMessage SET Read=1 WHERE tblMessage.Read=0 AND tblMessage.MessageID IN (SELECT MessageID FROM tblThread INNER JOIN tblThreadPost ON tblThread.ThreadID=tblThreadPost.ThreadID WHERE tblThread.BoardID=?);");\r
+ markst.Bind(0,boardid);\r
+ markst.Step();\r
+ }\r
+\r
+ startrow=(currentpage-1)*rowsperpage;\r
+ StringFunctions::Convert(startrow,startrowstr);\r
+\r
+ content+=CreateForumHeader();\r
+\r
+ content+="<table class=\"forumheader\">";\r
+ content+="<tr>";\r
+\r
+ boardnamest.Bind(0,boardid);\r
+ boardnamest.Step();\r
+ if(boardnamest.RowReturned())\r
+ {\r
+ std::string boardname="";\r
+ boardnamest.ResultText(0,boardname);\r
+ content+="<td>Forum : <a href=\"forumthreads.htm?boardid="+boardidstr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
+ }\r
+ content+="<td><a href=\"forumthreads.htm?boardid="+boardidstr+"¤tpage="+currentpagestr+"&formaction=markallread\">Mark All Read</a></td>";\r
+ content+="<td><a href=\"forumcreatepost.htm?boardid="+boardidstr+"¤tpage="+currentpagestr+"\">New Post</a></td>";\r
+ content+="</tr>";\r
+ content+="</table>\r\n";\r
+\r
+ content+="<table class=\"threadinfo\">";\r
+ content+="<thead><tr><th>New</th><th>Subject</th><th>Started By</th><th>Replies</th><th>Last Post</th></tr></thread>\r\n";\r
+ \r
+ sql="SELECT tblThread.ThreadID, tblThread.LastMessageID, tblLastMessage.FromName, tblLastMessage.MessageDate || ' ' || tblLastMessage.MessageTime, tblFirstMessage.Subject, tblFirstMessage.FromName, tblFirstMessage.IdentityID, tblLastMessage.IdentityID";\r
+ sql+=" FROM tblThread INNER JOIN tblMessage AS tblLastMessage ON tblThread.LastMessageID=tblLastMessage.MessageID INNER JOIN tblMessage AS tblFirstMessage ON tblThread.FirstMessageID=tblFirstMessage.MessageID";\r
+ sql+=" WHERE tblThread.BoardID=?";\r
+ sql+=" ORDER BY tblLastMessage.MessageDate || tblLastMessage.MessageTime DESC";\r
+ sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
+\r
+ SQLite3DB::Statement threadst=m_db->Prepare(sql);\r
+ threadst.Bind(0,boardid);\r
+ threadst.Step();\r
+ count=0;\r
+ while(threadst.RowReturned() && count++<rowsperpage)\r
+ {\r
+ std::string threadidstr="";\r
+ std::string lastmessageidstr="";\r
+ std::string lastmessagefromname="";\r
+ std::string lastmessagedate="";\r
+ std::string firstmessagesubject="";\r
+ std::string firstmessagefromname="";\r
+ std::string firstmessageidentityidstr="";\r
+ std::string lastmessageidentityidstr="";\r
+\r
+ threadst.ResultText(0,threadidstr);\r
+ threadst.ResultText(1,lastmessageidstr);\r
+ threadst.ResultText(2,lastmessagefromname);\r
+ threadst.ResultText(3,lastmessagedate);\r
+ threadst.ResultText(4,firstmessagesubject);\r
+ threadst.ResultText(5,firstmessagefromname);\r
+ threadst.ResultText(6,firstmessageidentityidstr);\r
+ threadst.ResultText(7,lastmessageidentityidstr);\r
+\r
+ content+="<tr>";\r
+ content+="<td class=\"newposts\">";\r
+\r
+ newthreadpostst.Bind(0,threadidstr);\r
+ newthreadpostst.Step();\r
+ if(newthreadpostst.RowReturned())\r
+ {\r
+ content+="<img src=\"showimage.htm?image=images/new_posts.png\" title=\"New Posts\">";\r
+ }\r
+ else\r
+ {\r
+ content+="<img src=\"showimage.htm?image=images/no_new_posts.png\" title=\"No New Posts\">";\r
+ }\r
+ newthreadpostst.Reset();\r
+\r
+ content+="</td>";\r
+ content+="<td class=\"threadsubject\">";\r
+ content+="<a href=\"forumviewthread.htm?threadid="+threadidstr+"¤tpage="+currentpagestr+"&boardid="+boardidstr+"\">"+SanitizeOutput(firstmessagesubject)+"</a>";\r
+ content+="</td>";\r
+ content+="<td class=\"threadauthor\">";\r
+ content+="<a href=\"peerdetails.htm?identityid="+firstmessageidentityidstr+"\">"+FixFromName(firstmessagefromname)+"</a>";\r
+ content+="</td>";\r
+\r
+ content+="<td class=\"threadreplies\">";\r
+\r
+ replycountst.Bind(0,threadidstr);\r
+ replycountst.Step();\r
+ if(replycountst.RowReturned())\r
+ {\r
+ std::string count="0";\r
+ replycountst.ResultText(0,count);\r
+ content+=count;\r
+ }\r
+ else\r
+ {\r
+ content+="0";\r
+ }\r
+ replycountst.Reset();\r
+\r
+ content+="</td>";\r
+\r
+ content+="<td class=\"threadlastpost\">";\r
+ content+=lastmessagedate+"<br />by <a href=\"peerdetails.htm?identityid="+lastmessageidentityidstr+"\">"+FixFromName(lastmessagefromname)+"</a>";\r
+ content+="</td>";\r
+\r
+ content+="</tr>\r\n";\r
+\r
+ threadst.Step();\r
+ }\r
+\r
+ threadcountst.Bind(0,boardid);\r
+ threadcountst.Step();\r
+ if(threadcountst.RowReturned())\r
+ {\r
+ threadcountst.ResultInt(0,threadcount);\r
+ }\r
+\r
+ if(threadcount>=rowsperpage)\r
+ {\r
+ int totalpages=ceil(static_cast<float>(threadcount)/static_cast<float>(rowsperpage));\r
+ int lastwrote=0;\r
+ content+="<tr>";\r
+ \r
+ content+="<td class=\"pages\" colspan=\"7\">Pages : ";\r
+\r
+ for(int i=1; i<=totalpages; i++)\r
+ {\r
+ if(i==1 || (i>currentpage-3 && i<currentpage+3) || i==totalpages)\r
+ {\r
+ std::string pagestr="";\r
+ StringFunctions::Convert(i,pagestr);\r
+ if(lastwrote!=i-1)\r
+ {\r
+ content+=" ...";\r
+ }\r
+ if(i!=currentpage)\r
+ {\r
+ content+=" <a href=\"forumthreads.htm?boardid="+boardidstr+"¤tpage="+pagestr+"\">"+pagestr+"</a>";\r
+ }\r
+ else\r
+ {\r
+ content+=" "+pagestr;\r
+ }\r
+ lastwrote=i;\r
+ }\r
+ }\r
+\r
+ content+="<form><input type=\"hidden\" name=\"boardid\" value=\""+boardidstr+"\"><input type=\"text\" name=\"currentpage\"><input type=\"submit\" value=\"Go\"></form>";\r
+ \r
+ content+="</td>";\r
+\r
+ content+="</tr>\r\n";\r
+ }\r
+ \r
+ content+="</table>\r\n";\r
+\r
+ return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r