version 0.3.23
[fms.git] / src / http / pages / browseboardspage.cpp
diff --git a/src/http/pages/browseboardspage.cpp b/src/http/pages/browseboardspage.cpp
new file mode 100644 (file)
index 0000000..e759cd6
--- /dev/null
@@ -0,0 +1,212 @@
+#include "../../../include/http/pages/browseboardspage.h"\r
+#include "../../../include/stringfunctions.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+const std::string BrowseBoardsPage::BuildQueryString(const long startrow, const std::string &boardsearch, const std::string &sortby, const std::string &sortorder)\r
+{\r
+       std::string returnval="";\r
+       std::string tempval="";\r
+\r
+       if(startrow>=0)\r
+       {\r
+               StringFunctions::Convert(startrow,tempval);\r
+               returnval+="startrow="+tempval;\r
+       }\r
+\r
+       if(boardsearch!="")\r
+       {\r
+               if(returnval!="")\r
+               {\r
+                       returnval+="&";\r
+               }\r
+               returnval+="boardsearch="+boardsearch;\r
+       }\r
+\r
+       if(sortby!="")\r
+       {\r
+               if(returnval!="")\r
+               {\r
+                       returnval+="&";\r
+               }\r
+               returnval+="sortby="+sortby;\r
+               if(sortorder=="ASC" || sortorder=="DESC")\r
+               {\r
+                       if(returnval!="")\r
+                       {\r
+                               returnval+="&";\r
+                       }\r
+                       returnval+="sortorder="+sortorder;\r
+               }\r
+               else\r
+               {\r
+                       if(returnval!="")\r
+                       {\r
+                               returnval+="&";\r
+                       }\r
+                       returnval+="sortorder=ASC";\r
+               }\r
+       }\r
+\r
+       return returnval;\r
+\r
+}\r
+\r
+const std::string BrowseBoardsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+       std::string content="";\r
+       std::string sql="";\r
+       std::string boardname="";\r
+       int rowsperpage=25;\r
+       std::string rowsperpagestr="26";        // 1 more than rowsperpage so we know if there are more boards\r
+       long startrow=0;\r
+       std::string startrowstr="0";\r
+       int messagecount=0;\r
+       std::string messagecountstr="0";\r
+       std::string lastdate="";\r
+       int count=0;\r
+       std::string boardsearch="";\r
+       std::string sortby="";\r
+       std::string sortorder="";\r
+\r
+       // if startrow is specified\r
+       if(queryvars.find("startrow")!=queryvars.end())\r
+       {\r
+               startrowstr=(*queryvars.find("startrow")).second;\r
+               // convert back and forth, just in case a number wasn't passed in startrow\r
+               StringFunctions::Convert(startrowstr,startrow);\r
+               if(startrow<0)\r
+               {\r
+                       startrow=0;\r
+               }\r
+               StringFunctions::Convert(startrow,startrowstr);\r
+       }\r
+       if(queryvars.find("boardsearch")!=queryvars.end())\r
+       {\r
+               boardsearch=(*queryvars.find("boardsearch")).second;\r
+       }\r
+       if(queryvars.find("sortby")!=queryvars.end() && queryvars.find("sortorder")!=queryvars.end())\r
+       {\r
+               sortby=(*queryvars.find("sortby")).second;\r
+               sortorder=(*queryvars.find("sortorder")).second;\r
+               if(sortby!="BoardName" && sortby!="MessageCount" && sortby!="LastMessage")\r
+               {\r
+                       sortby="BoardName";\r
+               }\r
+               if(sortorder!="ASC" && sortorder!="DESC")\r
+               {\r
+                       sortorder="ASC";\r
+               }\r
+       }\r
+       else\r
+       {\r
+               sortby="BoardName";\r
+               sortorder="ASC";\r
+       }\r
+\r
+       content="<h2>Browse Messages</h2>";\r
+       content+="<form name=\"frmfilter\" method=\"post\" action=\""+m_pagename+"\">";\r
+       content+="<input type=\"text\" name=\"boardsearch\" value=\""+SanitizeOutput(boardsearch)+"\">";\r
+       content+="<input type=\"submit\" value=\"Filter\">";\r
+       content+="</form>";\r
+\r
+       content+="<table class=\"small90\">";\r
+       content+="<tr>";\r
+       content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardsearch,"BoardName",ReverseSort("BoardName",sortby,sortorder))+"\">Board</a></th>";\r
+       content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardsearch,"MessageCount",ReverseSort("MessageCount",sortby,sortorder))+"\">Message Count</a></th>";\r
+       content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardsearch,"LastMessage",ReverseSort("LastMessage",sortby,sortorder))+"\">Last Message</a></th>";\r
+       content+="</tr>";\r
+\r
+       sql="SELECT tblBoard.BoardID, tblBoard.BoardName, COUNT(tblMessageBoard.MessageID) AS 'MessageCount', MAX(tblMessage.MessageDate || ' ' || tblMessage.MessageTime) AS 'LastMessage'";\r
+       sql+="FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID ";\r
+       sql+="LEFT JOIN tblMessage ON tblMessageBoard.MessageID=tblMessage.MessageID ";\r
+       sql+="WHERE (tblMessageBoard.MessageID>=0 OR tblMessageBoard.MessageID IS NULL) ";\r
+       if(boardsearch!="")\r
+       {\r
+               sql+="AND tblBoard.BoardName LIKE '%' || ? || '%' ";\r
+       }\r
+       sql+="GROUP BY tblBoard.BoardID ";\r
+       sql+="ORDER BY "+sortby+" COLLATE NOCASE "+sortorder+" ";\r
+       sql+="LIMIT "+startrowstr+","+rowsperpagestr+";";\r
+       \r
+       SQLite3DB::Statement st=m_db->Prepare(sql);\r
+       if(boardsearch!="")\r
+       {\r
+               st.Bind(0,boardsearch);\r
+       }\r
+       \r
+       st.Step();\r
+       while(st.RowReturned() && count++<rowsperpage)\r
+       {\r
+               boardname="";\r
+               messagecount=0;\r
+               lastdate="";\r
+               std::string boardidstr="0";\r
+               st.ResultText(0,boardidstr);\r
+               st.ResultText(1,boardname);\r
+               st.ResultInt(2,messagecount);\r
+               st.ResultText(3,lastdate);\r
+\r
+               StringFunctions::Convert(messagecount,messagecountstr);\r
+\r
+               content+="<tr>";\r
+               content+="<td><a href=\"browsemessages.htm?boardid="+boardidstr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
+               content+="<td>"+SanitizeOutput(messagecountstr)+"</td>";\r
+               content+="<td>"+SanitizeOutput(lastdate)+"</td>";\r
+               content+="</tr>\r\n";\r
+               st.Step();\r
+       }\r
+\r
+       if(startrow>0 || st.RowReturned())\r
+       {\r
+               content+="<tr>";\r
+\r
+               if(startrow>0)\r
+               {\r
+                       int thisstartrow=startrow-rowsperpage;\r
+                       if(thisstartrow<0)\r
+                       {\r
+                               thisstartrow=0;\r
+                       }\r
+                       content+="<td><a href=\"boardsbrowse.htm?"+BuildQueryString(thisstartrow,boardsearch,sortby,sortorder)+"\">&lt;--</a></td>";\r
+               }\r
+               else\r
+               {\r
+                       content+="<td></td>";\r
+               }\r
+\r
+               content+="<td></td>";\r
+\r
+               if(st.RowReturned())\r
+               {\r
+                       int thisstartrow=startrow+rowsperpage;\r
+                       content+="<td><a href=\"boardsbrowse.htm?"+BuildQueryString(thisstartrow,boardsearch,sortby,sortorder)+"\">--&gt;</a></td>";\r
+               }\r
+\r
+               content+="</tr>";\r
+       }\r
+       content+="</table>";\r
+       \r
+       return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r
+\r
+const std::string BrowseBoardsPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
+{\r
+       if(sortname==currentsortby)\r
+       {\r
+               if(currentsortorder=="ASC")\r
+               {\r
+                       return "DESC";\r
+               }\r
+               else\r
+               {\r
+                       return "ASC";\r
+               }\r
+       }\r
+       else\r
+       {\r
+               return currentsortorder;\r
+       }\r
+}\r