--- /dev/null
+#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)+"\"><--</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)+"\">--></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 ¤tsortby, const std::string ¤tsortorder)\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