version 0.3.23
[fms.git] / src / http / pages / forumthreadspage.cpp
diff --git a/src/http/pages/forumthreadspage.cpp b/src/http/pages/forumthreadspage.cpp
new file mode 100644 (file)
index 0000000..0777fe1
--- /dev/null
@@ -0,0 +1,197 @@
+#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+"&currentpage="+currentpagestr+"&formaction=markallread\">Mark All Read</a></td>";\r
+       content+="<td><a href=\"forumcreatepost.htm?boardid="+boardidstr+"&currentpage="+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+"&currentpage="+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+="&nbsp;...";\r
+                               }\r
+                               if(i!=currentpage)\r
+                               {\r
+                                       content+="&nbsp;<a href=\"forumthreads.htm?boardid="+boardidstr+"&currentpage="+pagestr+"\">"+pagestr+"</a>";\r
+                               }\r
+                               else\r
+                               {\r
+                                       content+="&nbsp;"+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