diff --git a/web/lib/msgslib.ssjs b/web/lib/msgslib.ssjs index 08ebb09d7f6bc0043245082e9ed82fc3501e01ff..d8ce76e280927c040a329f0ba4c78109e377983f 100644 --- a/web/lib/msgslib.ssjs +++ b/web/lib/msgslib.ssjs @@ -8,21 +8,12 @@ http_reply.header["Expires"]="0"; var grp=http_request.query.msg_grp; if(grp=='' || grp==null) grp=undefined; -var g=parseInt(http_request.query.msg_grp); var sub=http_request.query.msg_sub; if(grp=='E-Mail') sub='mail'; var s=-1; -if(sub != undefined) { - if(msg_area.grp_list[g] != undefined) { - for(stmp in msg_area.grp_list[g].sub_list) { - if(msg_area.grp_list[g].sub_list[stmp].code == sub) { - s=stmp; - } - } - } +if(sub != undefined) var msgbase = new MsgBase(sub); -} var message=http_request.query.message; var m=parseInt(http_request.query.message); var path=http_request.virtual_path; diff --git a/web/root/msgs/attachments.ssjs b/web/root/msgs/attachments.ssjs index ebd125a1b823f452265610fc95ba986ac614eb41..cd0b308f193d643016e4f6886fc4d47e357bd6bc 100644 --- a/web/root/msgs/attachments.ssjs +++ b/web/root/msgs/attachments.ssjs @@ -1,7 +1,7 @@ /* * Attachment FS emulator * Request attachments in the form: - * attachments.ssjs/group/sub/messageID/filename + * attachments.ssjs/sub/messageID/filename */ load("html_inc/template.ssjs"); @@ -11,10 +11,9 @@ var path=http_request.path_info.split(/\//); if(path==undefined) { error("No path info!"); } -var group=parseInt(path[1]); -var sub=path[2]; -var id=parseInt(path[3]); -var filename=path[4]; +var sub=path[1]; +var id=parseInt(path[2]); +var filename=path[3]; var msgbase = new MsgBase(sub); if(msgbase.open!=undefined && msgbase.open()==false) { diff --git a/web/root/msgs/inline.ssjs b/web/root/msgs/inline.ssjs index 73b2e786cb7e5c2ad5832befe5aa5bcdb4b68f2c..0b43f9730a6c50819c2de2cdbd6bcbf36becd894 100644 --- a/web/root/msgs/inline.ssjs +++ b/web/root/msgs/inline.ssjs @@ -1,7 +1,7 @@ /* * Inline attachment FS emulator * Request attachments in the form: - * attachments.ssjs/group/sub/messageID/Content-ID + * attachments.ssjs/sub/messageID/Content-ID */ load("html_inc/template.ssjs"); @@ -11,10 +11,9 @@ var path=http_request.path_info.split(/\//); if(path==undefined) { error("No path info!"); } -var group=parseInt(path[1]); -var sub=path[2]; -var id=parseInt(path[3]); -var cid=path[4]; +var sub=path[1]; +var id=parseInt(path[2]); +var cid=path[3]; var msgbase = new MsgBase(sub); if(msgbase.open!=undefined && msgbase.open()==false) { diff --git a/web/root/msgs/management.ssjs b/web/root/msgs/management.ssjs index 9e332099f8c3db583f0554855778ef2b2124994e..fd810814744351e28d77034b0fb494fab8347ca1 100644 --- a/web/root/msgs/management.ssjs +++ b/web/root/msgs/management.ssjs @@ -22,13 +22,13 @@ if(http_request.query.Action=="Delete Message(s)") { errorlist.push("Cannot delete message "+mnum); continue; } - if(sub!='mail' && !msg_area.grp_list[g].sub_list[s].is_operator) { - if(!msg_area.grp_list[g].sub_list[s].settings&SUB_DEL) { + if(sub!='mail' && !msg_area.sub[sub].is_operator) { + if(!msg_area.sub[sub].settings&SUB_DEL) { errorlist.push("Only operators can delete messages!"); errors++; continue; } - if(msg_area.grp_list[g].sub_list[s].settings&SUB_DELLAST) { + if(msg_area.sub[sub].settings&SUB_DELLAST) { if(msgbase.last_msg!=mnum) { errorlist.push("You can only delete the last post!"); errors++; diff --git a/web/root/msgs/msg.ssjs b/web/root/msgs/msg.ssjs index e5bf8651057d2270f08ecdd978a27bcc2fb8c3ed..eb6eee1524f0c8e3d2b08b64f5bf4a9fb236f682 100644 --- a/web/root/msgs/msg.ssjs +++ b/web/root/msgs/msg.ssjs @@ -7,10 +7,10 @@ if(msgbase.open!=undefined && msgbase.open()==false) { if(sub=='mail') { template.group=new Object; - template.group.number=-1; + template.group.name="E-Mail"; } else { - template.group=msg_area.grp_list[g]; + template.group=msg_area.grp[msg_area.sub[sub].grp_name]; } if(sub=='mail') { @@ -19,8 +19,8 @@ if(sub=='mail') { template.sub.code="mail"; } else { - template.sub=msg_area.grp_list[g].sub_list[s]; - if(!msg_area.grp_list[g].sub_list[s].can_read) + template.sub=msg_area.sub[sub]; + if(!msg_area.sub[sub].can_read) error("You can't read messages in this sub!"); } diff --git a/web/root/msgs/msgframe.ssjs b/web/root/msgs/msgframe.ssjs index 641796157794e1bdc76fe2ba89057bec631c38af..1bd6ff34e27d446ca4d7bae78896da6fd8470bd6 100644 --- a/web/root/msgs/msgframe.ssjs +++ b/web/root/msgs/msgframe.ssjs @@ -1,7 +1,7 @@ /* * Message FS emulator * Request messages in the form: - * msgframe.ssjs/group/sub/messageID/filename + * msgframe.ssjs/sub/messageID/filename */ load("html_inc/template.ssjs"); @@ -11,9 +11,8 @@ var path=http_request.path_info.split(/\//); if(path==undefined) { error("No path info!"); } -var group=parseInt(path[1]); -var sub=path[2]; -var id=parseInt(path[3]); +var sub=path[1]; +var id=parseInt(path[2]); var msgbase = new MsgBase(sub); @@ -23,10 +22,10 @@ if(msgbase.open!=undefined && msgbase.open()==false) { if(sub=='mail') { template.group=new Object; - template.group.number=-1; + template.group.name="E-Mail"; } else { - template.group=msg_area.grp_list[group]; + template.group=msg_area.grp[msg_area.sub[sub].grp_name]; } if(sub=='mail') { @@ -35,7 +34,7 @@ if(sub=='mail') { template.sub.code="mail"; } else { - template.sub=msg_area.grp_list[group].sub_list[sub]; + template.sub=msg_area.sub[sub]; } template.hdr=msgbase.get_msg_header(false,id); diff --git a/web/root/msgs/msgs.ssjs b/web/root/msgs/msgs.ssjs index 73e9a25a185e232227c76fbb98c9f96043a6312b..8eaf794ec13510cc2072182b73b0d5beb6801570 100644 --- a/web/root/msgs/msgs.ssjs +++ b/web/root/msgs/msgs.ssjs @@ -25,7 +25,7 @@ if(sub=='mail') { } else { msgarray=get_all_message_offsets(); - template.can_delete=msg_area.grp_list[g].sub_list[s].is_operator; + template.can_delete=msg_area.sub[sub].is_operator; } var total_pages=Math.floor(msgarray.length/max_messages); var firstpage=0; @@ -63,15 +63,15 @@ if(total_pages>1) { if(currpage==page) template.pagelinks += '<b>'+(page+1)+'</b> '; else - template.pagelinks += "<a href=\""+path+'?msg_grp='+g+'&msg_sub='+encodeURIComponent(sub)+'&offset='+(page*max_messages)+'">'+(page+1)+'</a> '; + template.pagelinks += "<a href=\""+path+'?msg_sub='+encodeURIComponent(sub)+'&offset='+(page*max_messages)+'">'+(page+1)+'</a> '; } if(offset+max_messages < msgarray.length) { - template.pagelinks+='<a href="'+path+'?msg_grp='+g+'&msg_sub='+encodeURIComponent(sub)+'&offset='+(offset+max_messages)+'">NEXT</a>'; + template.pagelinks+='<a href="'+path+'?msg_sub='+encodeURIComponent(sub)+'&offset='+(offset+max_messages)+'">NEXT</a>'; } if(offset>0) { - template.pagelinks='<a href="'+path+'?msg_grp='+g+'&msg_sub='+encodeURIComponent(sub)+'&offset='+(offset-max_messages)+'">PREV</a> '+template.pagelinks; + template.pagelinks='<a href="'+path+'?msg_sub='+encodeURIComponent(sub)+'&offset='+(offset-max_messages)+'">PREV</a> '+template.pagelinks; } } @@ -82,12 +82,12 @@ if(sub=='mail') { template.sub.code="mail"; } else { - template.title="Messages in "+msg_area.grp_list[g].sub_list[s].description; - template.sub=msg_area.grp_list[g].sub_list[s]; + template.title="Messages in "+msg_area.sub[sub].description; + template.sub=msg_area.sub[sub]; } if(sub!='mail') { - if(! msg_area.grp_list[g].sub_list[s].can_read) { + if(! msg_area.sub[sub].can_read) { error("You don't have sufficient rights to read this sub"); } } @@ -96,7 +96,14 @@ write_template("header.inc"); last_offset=msgarray.length-1-offset; template.messages=new Array; -template.group=msg_area.grp_list[g]; +if(sub=='mail') { + template.group=new Object; + template.group.name="E-Mail"; + template.group.description="E-Mail"; +} +else { + template.group=msg_area.grp[msg_area.sub[sub].grp_name]; +} for(displayed=0;displayed<max_messages && last_offset >= 0 && msgarray[last_offset].hdr != null;last_offset--) { if(msgarray[last_offset].hdr.subject=='') diff --git a/web/root/msgs/post.ssjs b/web/root/msgs/post.ssjs index 496aba36fea95f01b2743965a15220670e2d4c33..a106ca3605cbfcdb436613d6c71621116da85bec 100644 --- a/web/root/msgs/post.ssjs +++ b/web/root/msgs/post.ssjs @@ -1,6 +1,6 @@ load("html_inc/msgslib.ssjs"); -template.group=msg_area.grp_list[g]; +template.group=msg_area.grp_list[msg_area.sub[sub].grp_name]; if(sub=='mail') { template.sub=new Object; @@ -8,11 +8,11 @@ if(sub=='mail') { template.sub.code="mail"; } else { - template.sub=msg_area.grp_list[g].sub_list[s]; + template.sub=msg_area.sub[sub]; } if(sub!='mail') { - if(! msg_area.grp_list[g].sub_list[s].can_post) { + if(! msg_area.sub[sub].can_post) { error("You don't have sufficient rights to post in this sub"); } } diff --git a/web/root/msgs/reply.ssjs b/web/root/msgs/reply.ssjs index c8ff9f16f06141ccaf4644a9ce8ea499957b8a94..be9f5065d83b797066b74b3ab3f43ff3e458c0c9 100644 --- a/web/root/msgs/reply.ssjs +++ b/web/root/msgs/reply.ssjs @@ -1,6 +1,6 @@ load("html_inc/msgslib.ssjs"); -template.group=msg_area.grp_list[g]; +template.group=msg_area.grp[msg_area.sub[sub].grp_name]; if(sub=='mail') { template.sub=new Object; @@ -8,11 +8,11 @@ if(sub=='mail') { template.sub.code="mail"; } else { - template.sub=msg_area.grp_list[g].sub_list[s]; + template.sub=msg_area.sub[sub]; } if(sub!='mail') { - if(! msg_area.grp_list[g].sub_list[s].can_post) { + if(! msg_area.sub[sub].can_post) { error("You don't have sufficient rights to post in this sub"); } } diff --git a/web/root/msgs/savemsg.ssjs b/web/root/msgs/savemsg.ssjs index 0564c76bab93dd0a5556454be9d5d1917aadd605..95a82bc1272a34c80b2f9a644c6fdfacfaa8f888 100644 --- a/web/root/msgs/savemsg.ssjs +++ b/web/root/msgs/savemsg.ssjs @@ -1,6 +1,6 @@ load("html_inc/msgslib.ssjs"); -template.group=msg_area.grp_list[g]; +template.group=msg_area.grp[msg_area.sub[sub].grp_name]; if(sub=='mail') { template.sub=new Object; @@ -8,12 +8,12 @@ if(sub=='mail') { template.sub.code="mail"; } else { - template.sub=msg_area.grp_list[g].sub_list[s]; + template.sub=msg_area.sub[sub]; } var hdrs = new Object; if(sub!='mail') { - if(! msg_area.grp_list[g].sub_list[s].can_post) { + if(! msg_area.sub[sub].can_post) { error("You don't have sufficient rights to post in this sub"); } } diff --git a/web/root/msgs/subinfo.ssjs b/web/root/msgs/subinfo.ssjs index 444f72af933353e6e8aac836caed9082aaf63a63..1d29e42fd95a7a6f7fc8eb27a7e84c3796735a37 100644 --- a/web/root/msgs/subinfo.ssjs +++ b/web/root/msgs/subinfo.ssjs @@ -1,7 +1,7 @@ load("sbbsdefs.js"); load("html_inc/msgslib.ssjs"); -if((g==undefined || isNaN(g) || g==-1) && sub=='mail') { +if(sub=='mail') { template.type="Internet"; template.sub=new Object; template.sub.description="Internet E-Mail"; @@ -15,7 +15,7 @@ if((g==undefined || isNaN(g) || g==-1) && sub=='mail') { template.sub.max_msgs="Unknown"; } else { - template.sub=msg_area.grp_list[g].sub_list[s]; + template.sub=msg_area.sub[sub]; if(template.sub.settings & SUB_FIDO) { template.type="FidoNet"; template.tagline=template.sub.fidonet_origin; diff --git a/web/root/msgs/subs.ssjs b/web/root/msgs/subs.ssjs index d66e0fe6d8383d55d5adb0c7e43fbcb63aaadbd4..378c9ff3508f4ee95282855d1100e6e6c3b9f0a6 100644 --- a/web/root/msgs/subs.ssjs +++ b/web/root/msgs/subs.ssjs @@ -1,11 +1,11 @@ load("html_inc/msgslib.ssjs"); -title="Message Subs in "+msg_area.grp_list[g].description; +title="Message Subs in "+msg_area.grp[grp].description; write_template("header.inc"); -template.group=msg_area.grp_list[g]; -template.subs=msg_area.grp_list[g].sub_list; +template.group=msg_area.grp[grp]; +template.subs=msg_area.grp[grp].sub_list; write_template("msgs/subs.inc"); write_template("footer.inc"); diff --git a/web/templates/msgs/groups.inc b/web/templates/msgs/groups.inc index 34b38642e1ac4d1125e63704af02008494d6f8ab..223e1d67432f93af1b0204dcb590badaf88cd6a3 100644 --- a/web/templates/msgs/groups.inc +++ b/web/templates/msgs/groups.inc @@ -5,7 +5,7 @@ </tr> <<REPEAT groups>> <tr> - <td class="grouplist"><a class="grouplist" href="subs.ssjs?msg_grp=^^groups:number^^">%%groups:name%%</a></td> + <td class="grouplist"><a class="grouplist" href="subs.ssjs?msg_grp=^^groups:name^^">%%groups:name%%</a></td> <td class="grouplist">%%groups:description%%</td> </tr> <<END REPEAT groups>> diff --git a/web/templates/msgs/msg.inc b/web/templates/msgs/msg.inc index 636e2498ddb01fcb6c08a163e1d1a3825a1dc357..c32682f6092c563d2f695073ff3b14f12bab0b3b 100644 --- a/web/templates/msgs/msg.inc +++ b/web/templates/msgs/msg.inc @@ -1,6 +1,6 @@ -<p class="navigation"><a class="navigation" href="http://^^JS:system.inet_addr^^">Home</a> : <a class="navigation" href="/members/">Members</a> : <a class="navigation" href="index.ssjs">Groups</a> : <a class="navigation" href="subs.ssjs?msg_grp=^^group:number^^">%%group:description%%</a> : -<a class="navigation" href="msgs.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^">%%sub:description%%</a> -<a class="navigation" href="subinfo.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^">[?]</a><br /></p> +<p class="navigation"><a class="navigation" href="http://^^JS:system.inet_addr^^">Home</a> : <a class="navigation" href="/members/">Members</a> : <a class="navigation" href="index.ssjs">Groups</a> : <a class="navigation" href="subs.ssjs?msg_grp=^^group:name^^">%%group:description%%</a> : +<a class="navigation" href="msgs.ssjs?msg_sub=^^sub:code^^">%%sub:description%%</a> +<a class="navigation" href="subinfo.ssjs?msg_sub=^^sub:code^^">[?]</a><br /></p> <table class="msg" border="0" width="95%"> <tr class="msg"> <td class="msgheader" nowrap="nowrap">Subject:</td> @@ -17,7 +17,7 @@ <tr><td colspan="4"><hr /></td></tr> <tr> <td colspan="4"> - <object class="msg" type="text/html" border="2" data="msgframe.ssjs/^^group:number^^/^^sub:code^^/^^hdr:number^^" standby="Loading Message ..." width="100%" height="450"> + <object class="msg" type="text/html" border="2" data="msgframe.ssjs/^^sub:code^^/^^hdr:number^^" standby="Loading Message ..." width="100%" height="450"> <pre class="leftalign">@@body@@</pre> </object> </td> @@ -26,8 +26,8 @@ @@JS:if(template.attachments==undefined) '<!--'; else '';@@ <b>Attachments:</b><br /> <<REPEAT attachments>> -<a href="attachments.ssjs/^^group:number^^/^^sub:code^^/^^hdr:number^^/^^attachments:name^^">%%attachments:name%%</a><br /> +<a href="attachments.ssjs/^^sub:code^^/^^hdr:number^^/^^attachments:name^^">%%attachments:name%%</a><br /> <<END REPEAT attachments>> @@JS:if(template.attachments==undefined) '-->'; else '';@@ -<p class="msgcenter"><a href="reply.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^&reply_to=^^hdr:number^^">Reply</a></p> +<p class="msgcenter"><a href="reply.ssjs?msg_sub=^^sub:code^^&reply_to=^^hdr:number^^">Reply</a></p> diff --git a/web/templates/msgs/msgs.inc b/web/templates/msgs/msgs.inc index cfb386203a666732165affbaa87a80db046623fd..437d8884b9bb59b85f06986e72afe51c2620e35e 100644 --- a/web/templates/msgs/msgs.inc +++ b/web/templates/msgs/msgs.inc @@ -1,10 +1,9 @@ <p class="navigation"> <a class="navigation" href="http://^^JS:system.inet_addr^^/">Home</a> : <a class="navigation" href="/members/">Members</a> : - <a class="navigation" href="index.ssjs">Groups</a> : <a class="navigation" href="subs.ssjs?msg_grp=^^group:number^^">%%group:description%%</a> : %%sub:description%% - <a class="navigation" href="subinfo.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^">[?]</a> -> - <a class="navigation" href="post.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^&post=new">Post New Message</a></p> + <a class="navigation" href="index.ssjs">Groups</a> : <a class="navigation" href="subs.ssjs?msg_grp=^^group:name^^">%%group:description%%</a> : %%sub:description%% + <a class="navigation" href="subinfo.ssjs?msg_sub=^^sub:code^^">[?]</a> -> + <a class="navigation" href="post.ssjs?msg_sub=^^sub:code^^&post=new">Post New Message</a></p> <form action="management.ssjs" method="post"> -<input type="hidden" name="msg_grp" value="^^group:number^^" /> <input type="hidden" name="msg_sub" value="^^sub:code^^" /> <table class="msglist" cellpadding="5" cellspacing="2" border="0" width="100%"> <tr class="msglist"> @@ -23,7 +22,7 @@ @@JS:if(@@messages:attachments@@>0) '<img alt="Attachment" src="/graphics/attach_black.gif" />'; else ' ';@@ </td> <td> - <a class="msglist" href="msg.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^&message=^^messages:number^^">%%messages:subject%%</a> + <a class="msglist" href="msg.ssjs?msg_sub=^^sub:code^^&message=^^messages:number^^">%%messages:subject%%</a> </td> <td> %%messages:from%% diff --git a/web/templates/msgs/post.inc b/web/templates/msgs/post.inc index bac1a2a11a04aa833df04c4a2721681393c3957c..f0433a3bf18671dba93eb9bf9dbdfbb78d6311c7 100644 --- a/web/templates/msgs/post.inc +++ b/web/templates/msgs/post.inc @@ -1,6 +1,5 @@ <form action="savemsg.ssjs" method="post"> <table class="postmsg" border="0" cellspacing="2" cellpadding="0"> -<input type="hidden" name="msg_grp" value="%%group:number%%" /> <input type="hidden" name="msg_sub" value="%%sub:code%%" /> <tbody> <tr> diff --git a/web/templates/msgs/posted.inc b/web/templates/msgs/posted.inc index 82288fc7f00effde5a5cf37765ed925049e9c6c7..a67ded3853e8f6534483bb2f1a3fefe28a116982 100644 --- a/web/templates/msgs/posted.inc +++ b/web/templates/msgs/posted.inc @@ -1,13 +1,13 @@ -<p class="navigation"><a class="navigation" href="http://^^JS:system.inet_addr^^/">Home</a> : <a class="navigation" href="index.ssjs">Groups</a> : <a class="navigation" href="subs.ssjs?msg_grp=^^group:number^^">%%group:description%%</a> : - <a class="navigation" href="msgs.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^">%%sub:description%%</a> - <a class="navigation" href="subinfo.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^">[?]</a></p> +<p class="navigation"><a class="navigation" href="http://^^JS:system.inet_addr^^/">Home</a> : <a class="navigation" href="index.ssjs">Groups</a> : <a class="navigation" href="subs.ssjs?msg_grp=^^group:name^^">%%group:description%%</a> : + <a class="navigation" href="msgs.ssjs?msg_sub=^^sub:code^^">%%sub:description%%</a> + <a class="navigation" href="subinfo.ssjs?msg_sub=^^sub:code^^">[?]</a></p> <table class="posted" cellspacing="2" cellpadding="2"> <tbody> <tr> <td class="posted"> <h1>Message posted successfully</h1> - <p class="posted"><a href="msgs.ssjs?msg_grp=^^group:number^^&msg_sub=^^sub:code^^">Return to %%sub:description%%</a></p> + <p class="posted"><a href="msgs.ssjs?msg_sub=^^sub:code^^">Return to %%sub:description%%</a></p> </td> </tr> </tbody> diff --git a/web/templates/msgs/reply.inc b/web/templates/msgs/reply.inc index 2787550bb7ee80899fe7ee562bcb3dded76a6add..9367a4fd52d0e6f3ac0a4b54fadaee979c78d410 100644 --- a/web/templates/msgs/reply.inc +++ b/web/templates/msgs/reply.inc @@ -1,6 +1,5 @@ <form action="savemsg.ssjs" method="post"> <table class="replymsg" border="0" cellspacing="2" cellpadding="0"> -<input type="hidden" name="msg_grp" value="%%group:number%%" /> <input type="hidden" name="msg_sub" value="%%sub:code%%" /> <input type="hidden" name="reply_to" value="%%number%%" /> <tbody> diff --git a/web/templates/msgs/subs.inc b/web/templates/msgs/subs.inc index 8ddf3653e97e52a3f4861adce4184ea63dd04f7e..e9da151e5f287d4133d469f25de74c5d0bf86af8 100644 --- a/web/templates/msgs/subs.inc +++ b/web/templates/msgs/subs.inc @@ -7,8 +7,8 @@ </tr> <<REPEAT subs>> <tr> - <td class="sublist"><a class="msglist" href="msgs.ssjs?msg_grp=^^group:number^^&msg_sub=^^subs:code^^">%%subs:name%%</a></td> - <td class="sublist"><a class="msglist" href="subinfo.ssjs?msg_grp=^^group:number^^&msg_sub=^^subs:code^^">[?]</a></td> + <td class="sublist"><a class="msglist" href="msgs.ssjs?msg_sub=^^subs:code^^">%%subs:name%%</a></td> + <td class="sublist"><a class="msglist" href="subinfo.ssjs?msg_sub=^^subs:code^^">[?]</a></td> <td class="sublist">%%subs:description%%</td> </tr> <<END REPEAT subs>>