Monday, November 08, 2010 at 12:04 AM.

system.verbs.builtins.mainResponder.adminSite.macros.listSites

on listSites () {
	<<Changes
		<<12/12/03; 11:50:10 PM by JES
			<<If the last-modified time can't be converted to a date type, just return it as a string.
		<<9/8/02; 4:55:26 PM by JES
			<<Use the local globe icon instead of the one hosted at UserLand.
		<<9/3/02; 4:33:36 AM by JES
			<<Added a small padlock icon next to the name of editors only sites.
		<<8/20/02; 4:16:45 PM by JES
			<<Added links to multiple pages for servers that have more than 25 sites.
	
	local (pta);
	try {pta = html.getPageTableAddress ()};
	
	local (bgcolor1, bgcolor2, ctitems=0, thisPageUrl="");
	try {bgcolor1 = pta^.trbg1; bgcolor2 = pta^.trbg2; tisPageUrl = pta^.uri};
	local (start = 1, count = 25);
	bundle { //get start and count from pta^.searchArgTable, if present
		if defined (pta^.searchArgTable.s) {
			try {start = number (pta^.searchArgTable.s)}};
		if defined (pta^.searchArgTable.m) {
			try {count = number (pta^.searchArgTable.m)}}};
	
	local (globeicon, lockicon);
	bundle { //set globeicon and lockicon
		globeicon = "<img src=\"mainResponderResources/userlandIcons/remote\" width=\"11\" height=\"11\" border=\"0\">";
		lockicon = "<img src=\"/mainResponderResources/icons/lock\" width=\"9\" height=\"12\" border=\"0\">"};
	
	local (htmlText = "", indentlevel = 0);
	on add (s) {
		htmlText = htmlText + (string.filledString ("\t", indentlevel) + s + "\r");};
	
	local (flFoundSites = false);
	local (adrcache = mainResponder.adminSite.macros.initSiteListCache ());
	local (adrincache = @adrcache^.sites);
	if sizeOf (adrincache) > 0 {
		flFoundSites = true};
	
	bundle { //description
		add ("<p>Below is a list of Manila sites on this server. For more detailed information and managerial functions, click a site's name. To view a site, click the globe icon. You can also <a href=\"" + mainResponder.adminSite.urls.newSite + "\">create a new site</a>.</p>")};
	
	bundle { //build the table that gets rendered as HTML
		if flFoundSites {
			
			local (yesterday = date.yesterday (clock.now ()));
			on shortDateTime (d) {
				try {
					if d < yesterday {
						return (date.shortString (d))}
					else {
						return (string.timeString (d))}}
				else {
					return (d)}};
			
			bundle { //start the table
				add ("<table cellpadding=\"10\" cellspacing=\"0\" boreder=\"0\" width=\"99%\">"); indentlevel++};
			
			<<Loop through the table of info about the sites on this server.
			local (numSites = sizeOf (adrincache^));
			for i = start to (start + count - 1) {
				if i > numSites {
					break};
				
				local (bgcolor);
				if i % 2 == 1 {
					bgcolor = bgcolor1}
				else {
					bgcolor = bgcolor2};
				
				local (adrItem = @adrincache^[i]);
				
				local (editor = adrItem^.managingEditor);
				local (tagline = string.replaceAll (adrItem^.tagline, "\"", """));
				local (editUrl = thisPageUrl + "?site=" + string.urlEncode (adrItem^.site));
				local (editLink = "<a href=\"" + editUrl + "\" title=\"" + tagline + "\">" + adrItem^.displaySiteName + "</a>");
				bundle { //add lock icon for editors only sites
					if defined (adrItem^.adrSite^.["#newsSite"].flEditorsOnlyAccessToSite) {
						if adrItem^.adrSite^.["#newsSite"].flEditorsOnlyAccessToSite {
							editLink = editLink + "  " + lockicon}}};
				local (siteLink, editorLink);
				bundle { //set siteLink, editorLink, tagline
					if adrItem^.flInstalled {
						siteLink = "<a href=\"" + adrItem^.siteUrl + "\" title=\"" + tagline + "\">" + globeIcon + "</a>";
						editorLink = html.getLink (editor, adrItem^.profilesUrl + editor);
						try { //get the real name of the editor, if possible //PBS06/05/01: was a bundle, now a try, so errors aren't fatal
							local (groupName = adrItem^.membershipGroupName);
							local (adrInfo = mainResponder.members.getMemberTable (groupName, editor));
							if (defined (adrInfo^.personalInfo.name)) and (adrInfo^.personalInfo.name != "") {
								editorLink = html.getLink (adrInfo^.personalInfo.name, adrItem^.profilesUrl + editor)}}}
					else {
						siteLink = "";
						editorLink = string.replace (editor, "@", "\\@")}};
				
				bundle { //add the info for this site
					add ("<tr bgcolor=\"" + bgcolor + "\">"); indentlevel++;
					add ("<td valign=\"bottom\" style=\"padding-bottom: 0px;\"><span style=\"width:11;\">" + siteLink + "</span>  <b>" + editLink + "</b></td>");
					add ("<td valign=\"bottom\"  style=\"padding-bottom: 0px;\" class=\"small\"  valign=\"bottom\"><nobr><b>" + shortDateTime (adrItem^.modified) + "</b></nobr></td>");
					add ("<td valign=\"bottom\" style=\"padding-bottom: 0px;\" class=\"small\" style=\"padding-top: 0px;\" align=\"right\"><nobr><b>" + string.addCommas (adrItem^.totalHits) + "</b> hits; <b>" + adrItem^.hitsToday + "</b> today</nobr>" + "</td>");
					add ("</tr>"); indentlevel--;
					
					add ("<tr bgcolor=\"" + bgcolor + "\">"); indentlevel++;
					add ("<td valign=\"bottom\" style=\"padding-top: 0px;\" class=\"small\">Owner: <b>" + editorLink + "</b></td>");
					local (memberstring = "members");
					if adrItem^.ctMembers == 1 {
						memberstring = "member"};
					add ("<td class=\"small\"  style=\"padding-top: 0px;\"><b>" + string.addCommas (adrItem^.ctMembers) + "</b> " + memberstring + "</td>");
					add ("<td class=\"small\"  style=\"padding-top: 0px;\" align=\"right\"><b>" + string.addCommas (adrItem^.ctMessages) + "</b> messages</td>");
					add ("</tr>"); indentlevel--}};
			add ("</table>"); indentlevel--}};
	
	if not flFoundSites {
		add ("<hr size=\"0\" /><p>There are no sites to list at this time.</p>")};
	
	if flFoundSites { //possibly add links to more pages
		local (ctsites = sizeOf (adrincache^));
		if ctsites > count {
			add ("<b>  More sites:</b>");
			local (ctpages = 0);
			local (n = 1);
			while n <= ctsites {
				ctpages++;
				if n < start or n >= (start + count) { //link
					add ("<a href=\"" + pta^.uri + "?s=" + n + "&m=" + count + "\">" + ctpages + "</a>")}
				else {
					add ("<b>" + ctpages + "</b>")};
				n = n + count}}};
	
	return (htmlText)};

<<bundle //test code
	<<listSites ()



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.