version 0.3.23
[fms.git] / src / http / pages / forumthreadspage.cpp
1 #include "../../../include/http/pages/forumthreadspage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include <cmath>\r
4 \r
5 const std::string ForumThreadsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
6 {\r
7         int currentpage=1;\r
8         std::string currentpagestr="1";\r
9         std::string content="";\r
10         int startrow=0;\r
11         std::string startrowstr="0";\r
12         int rowsperpage=25;\r
13         std::string rowsperpagestr="25";\r
14         std::string sql="";\r
15         int boardid=-1;\r
16         std::string boardidstr="-1";\r
17         int count=0;\r
18         int threadcount=0;\r
19         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
20         SQLite3DB::Statement replycountst=m_db->Prepare("SELECT COUNT(*)-1 FROM tblThreadPost WHERE ThreadID=?;");\r
21         SQLite3DB::Statement boardnamest=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard WHERE BoardID=?;");\r
22         SQLite3DB::Statement threadcountst=m_db->Prepare("SELECT COUNT(*) FROM tblThread WHERE BoardID=?;");\r
23 \r
24         if(queryvars.find("boardid")!=queryvars.end())\r
25         {\r
26                 boardidstr=(*queryvars.find("boardid")).second;\r
27                 StringFunctions::Convert(boardidstr,boardid);\r
28         }\r
29         if(queryvars.find("currentpage")!=queryvars.end())\r
30         {\r
31                 currentpagestr=(*queryvars.find("currentpage")).second;\r
32                 StringFunctions::Convert(currentpagestr,currentpage);\r
33                 if(currentpage<0)\r
34                 {\r
35                         currentpage=0;\r
36                 }\r
37                 StringFunctions::Convert(currentpage,currentpagestr);\r
38         }\r
39         if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="markallread" && boardid!=-1)\r
40         {\r
41                 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
42                 markst.Bind(0,boardid);\r
43                 markst.Step();\r
44         }\r
45 \r
46         startrow=(currentpage-1)*rowsperpage;\r
47         StringFunctions::Convert(startrow,startrowstr);\r
48 \r
49         content+=CreateForumHeader();\r
50 \r
51         content+="<table class=\"forumheader\">";\r
52         content+="<tr>";\r
53 \r
54         boardnamest.Bind(0,boardid);\r
55         boardnamest.Step();\r
56         if(boardnamest.RowReturned())\r
57         {\r
58                 std::string boardname="";\r
59                 boardnamest.ResultText(0,boardname);\r
60                 content+="<td>Forum : <a href=\"forumthreads.htm?boardid="+boardidstr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
61         }\r
62         content+="<td><a href=\"forumthreads.htm?boardid="+boardidstr+"&currentpage="+currentpagestr+"&formaction=markallread\">Mark All Read</a></td>";\r
63         content+="<td><a href=\"forumcreatepost.htm?boardid="+boardidstr+"&currentpage="+currentpagestr+"\">New Post</a></td>";\r
64         content+="</tr>";\r
65         content+="</table>\r\n";\r
66 \r
67         content+="<table class=\"threadinfo\">";\r
68         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
69         \r
70         sql="SELECT tblThread.ThreadID, tblThread.LastMessageID, tblLastMessage.FromName, tblLastMessage.MessageDate || ' ' || tblLastMessage.MessageTime, tblFirstMessage.Subject, tblFirstMessage.FromName, tblFirstMessage.IdentityID, tblLastMessage.IdentityID";\r
71         sql+=" FROM tblThread INNER JOIN tblMessage AS tblLastMessage ON tblThread.LastMessageID=tblLastMessage.MessageID INNER JOIN tblMessage AS tblFirstMessage ON tblThread.FirstMessageID=tblFirstMessage.MessageID";\r
72         sql+=" WHERE tblThread.BoardID=?";\r
73         sql+=" ORDER BY tblLastMessage.MessageDate || tblLastMessage.MessageTime DESC";\r
74         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
75 \r
76         SQLite3DB::Statement threadst=m_db->Prepare(sql);\r
77         threadst.Bind(0,boardid);\r
78         threadst.Step();\r
79         count=0;\r
80         while(threadst.RowReturned() && count++<rowsperpage)\r
81         {\r
82                 std::string threadidstr="";\r
83                 std::string lastmessageidstr="";\r
84                 std::string lastmessagefromname="";\r
85                 std::string lastmessagedate="";\r
86                 std::string firstmessagesubject="";\r
87                 std::string firstmessagefromname="";\r
88                 std::string firstmessageidentityidstr="";\r
89                 std::string lastmessageidentityidstr="";\r
90 \r
91                 threadst.ResultText(0,threadidstr);\r
92                 threadst.ResultText(1,lastmessageidstr);\r
93                 threadst.ResultText(2,lastmessagefromname);\r
94                 threadst.ResultText(3,lastmessagedate);\r
95                 threadst.ResultText(4,firstmessagesubject);\r
96                 threadst.ResultText(5,firstmessagefromname);\r
97                 threadst.ResultText(6,firstmessageidentityidstr);\r
98                 threadst.ResultText(7,lastmessageidentityidstr);\r
99 \r
100                 content+="<tr>";\r
101                 content+="<td class=\"newposts\">";\r
102 \r
103                 newthreadpostst.Bind(0,threadidstr);\r
104                 newthreadpostst.Step();\r
105                 if(newthreadpostst.RowReturned())\r
106                 {\r
107                         content+="<img src=\"showimage.htm?image=images/new_posts.png\" title=\"New Posts\">";\r
108                 }\r
109                 else\r
110                 {\r
111                         content+="<img src=\"showimage.htm?image=images/no_new_posts.png\" title=\"No New Posts\">";\r
112                 }\r
113                 newthreadpostst.Reset();\r
114 \r
115                 content+="</td>";\r
116                 content+="<td class=\"threadsubject\">";\r
117                 content+="<a href=\"forumviewthread.htm?threadid="+threadidstr+"&currentpage="+currentpagestr+"&boardid="+boardidstr+"\">"+SanitizeOutput(firstmessagesubject)+"</a>";\r
118                 content+="</td>";\r
119                 content+="<td class=\"threadauthor\">";\r
120                 content+="<a href=\"peerdetails.htm?identityid="+firstmessageidentityidstr+"\">"+FixFromName(firstmessagefromname)+"</a>";\r
121                 content+="</td>";\r
122 \r
123                 content+="<td class=\"threadreplies\">";\r
124 \r
125                 replycountst.Bind(0,threadidstr);\r
126                 replycountst.Step();\r
127                 if(replycountst.RowReturned())\r
128                 {\r
129                         std::string count="0";\r
130                         replycountst.ResultText(0,count);\r
131                         content+=count;\r
132                 }\r
133                 else\r
134                 {\r
135                         content+="0";\r
136                 }\r
137                 replycountst.Reset();\r
138 \r
139                 content+="</td>";\r
140 \r
141                 content+="<td class=\"threadlastpost\">";\r
142                 content+=lastmessagedate+"<br />by <a href=\"peerdetails.htm?identityid="+lastmessageidentityidstr+"\">"+FixFromName(lastmessagefromname)+"</a>";\r
143                 content+="</td>";\r
144 \r
145                 content+="</tr>\r\n";\r
146 \r
147                 threadst.Step();\r
148         }\r
149 \r
150         threadcountst.Bind(0,boardid);\r
151         threadcountst.Step();\r
152         if(threadcountst.RowReturned())\r
153         {\r
154                 threadcountst.ResultInt(0,threadcount);\r
155         }\r
156 \r
157         if(threadcount>=rowsperpage)\r
158         {\r
159                 int totalpages=ceil(static_cast<float>(threadcount)/static_cast<float>(rowsperpage));\r
160                 int lastwrote=0;\r
161                 content+="<tr>";\r
162                 \r
163                 content+="<td class=\"pages\" colspan=\"7\">Pages : ";\r
164 \r
165                 for(int i=1; i<=totalpages; i++)\r
166                 {\r
167                         if(i==1 || (i>currentpage-3 && i<currentpage+3) || i==totalpages)\r
168                         {\r
169                                 std::string pagestr="";\r
170                                 StringFunctions::Convert(i,pagestr);\r
171                                 if(lastwrote!=i-1)\r
172                                 {\r
173                                         content+="&nbsp;...";\r
174                                 }\r
175                                 if(i!=currentpage)\r
176                                 {\r
177                                         content+="&nbsp;<a href=\"forumthreads.htm?boardid="+boardidstr+"&currentpage="+pagestr+"\">"+pagestr+"</a>";\r
178                                 }\r
179                                 else\r
180                                 {\r
181                                         content+="&nbsp;"+pagestr;\r
182                                 }\r
183                                 lastwrote=i;\r
184                         }\r
185                 }\r
186 \r
187                 content+="<form><input type=\"hidden\" name=\"boardid\" value=\""+boardidstr+"\"><input type=\"text\" name=\"currentpage\"><input type=\"submit\" value=\"Go\"></form>";\r
188                 \r
189                 content+="</td>";\r
190 \r
191                 content+="</tr>\r\n";\r
192         }\r
193         \r
194         content+="</table>\r\n";\r
195 \r
196         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
197 }\r