Exemplo n.º 1
0
        protected override void OnPreRender(EventArgs e)
        {
            SharedBasePage requestPage = Page as SharedBasePage;

            base.OnPreRender(e);
            if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "script"))
            {
                string prefix =
                    String.Format("var ct_img_expanded = '{0}';\nvar ct_img_collapsed = '{1}';",
                                  requestPage.GetThemedImageUrl("outlinedown"),
                                  requestPage.GetThemedImageUrl("outlinearrow"));

                string script;
                using (StreamReader rs = new StreamReader(GetType().Assembly.GetManifestResourceStream(GetType().Namespace + ".CategoryListJS.txt")))
                {
                    script = rs.ReadToEnd();
                }
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "script",
                                                            String.Format("<script type=\"text/javascript\">\n<!--\n{0}\n{1}\n// --></script>", prefix, script));
            }
            if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "style"))
            {
                string script;
                using (StreamReader rs = new StreamReader(GetType().Assembly.GetManifestResourceStream(GetType().Namespace + ".CategoryListCSS.txt")))
                {
                    script = rs.ReadToEnd();
                }
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "style", "");
                requestPage.InsertInPageHeader(String.Format("<style type=\"text/css\">{0}</style>", script));
            }
        }
Exemplo n.º 2
0
        private PlaceHolder RenderCategoryHeader(string cat, string displayName, bool renderLink)
        {
            PlaceHolder header = new PlaceHolder();

            // anchor for easy navigation
            string anchor = String.Format("<a name=\"{0}\"></a>", HttpUtility.UrlEncode(cat));

            header.Controls.Add(new LiteralControl(anchor));

            // category link
            if (renderLink)
            {
                HyperLink catLink = new HyperLink();
                catLink.CssClass    = "date";
                catLink.Text        = String.Format("{0} ({1})", displayName, sorted[cat].Count);
                catLink.NavigateUrl = SiteUtilities.GetCategoryViewUrl(requestPage.SiteConfig, cat);
                header.Controls.Add(catLink);
            }
            else
            {
                header.Controls.Add(new LiteralControl(String.Format("<span class=\"date\">{0} ({1})</span>", displayName, sorted[cat].Count)));
            }



            header.Controls.Add(new LiteralControl("&nbsp;"));

            if (renderLink)
            {
                // category feed
                HyperLink rssLink = new HyperLink();
                rssLink.CssClass    = "categoryListXmlLinkStyle";
                rssLink.NavigateUrl = SiteUtilities.GetRssCategoryUrl(requestPage.SiteConfig, cat);
                System.Web.UI.WebControls.Image rssImg = new System.Web.UI.WebControls.Image();
                rssImg.ImageUrl = requestPage.GetThemedImageUrl("rssButton");
                rssLink.Controls.Add(rssImg);
                header.Controls.Add(rssLink);
            }

            header.Controls.Add(new LiteralControl("<hr size=\"1\">"));

            return(header);
        }
Exemplo n.º 3
0
        private void RenderCategoriesIntoTable(Table table, string[] parentPath)
        {
            SharedBasePage requestPage      = Page as SharedBasePage;
            int            parentPathLength = parentPath.Length;

            foreach (CategoryCacheEntry categoryEntry in categories)
            {
                string[] entryPath       = categoryEntry.CategoryPath;
                int      entryPathLength = categoryEntry.CategoryPath.Length;

                // If the path shorter of equal to the parent path or if
                // the path is more than one item longer than the parent path,
                // we can skip this item. We seek for descendants only.
                if (entryPathLength != parentPathLength + 1)
                {
                    continue;
                }

                bool identicalSubpaths = true;

                // if we don't have the right subpath, skip as well
                for (int j = 0; j < parentPath.Length; j++)
                {
                    if (entryPath[j].Trim().ToUpper() != parentPath[j].Trim().ToUpper())
                    {
                        identicalSubpaths = false;
                        break;
                    }
                }
                if (!identicalSubpaths)
                {
                    continue;
                }


                TableRow  row  = new TableRow();
                TableCell cell = new TableCell();
                cell.CssClass = "categoryListCellStyle";
                table.Rows.Add(row);
                row.Cells.Add(cell);

                HyperLink rssLink = new HyperLink();
                if (showFeedBadge)
                {
                    rssLink.CssClass = "categoryListXmlLinkStyle";
                    if (requestPage.SiteConfig.UseFeedSchemeForSyndication)
                    {
                        rssLink.NavigateUrl = SiteUtilities.GetFeedCategoryUrl(requestPage.SiteConfig, categoryEntry.Name);
                    }
                    else
                    {
                        rssLink.NavigateUrl = SiteUtilities.GetRssCategoryUrl(requestPage.SiteConfig, categoryEntry.Name);
                    }
                    System.Web.UI.WebControls.Image rssImg = new System.Web.UI.WebControls.Image();
                    rssImg.ImageUrl      = requestPage.GetThemedImageUrl("feedButton");
                    rssImg.AlternateText = "[RSS]";
                    rssLink.Attributes.Add("rel", "tag");
                    rssLink.Controls.Add(rssImg);
                }

                /* PARKED
                 * HyperLink atomLink = new HyperLink();
                 * atomLink.CssClass = "categoryListXmlLinkStyle";
                 * atomLink.NavigateUrl = Utils.GetAtomCategoryUrl(requestPage.SiteConfig,categoryEntry.Name);
                 * System.Web.UI.WebControls.Image atomImg = new System.Web.UI.WebControls.Image();
                 * atomImg.ImageUrl = requestPage.GetThemedImageUrl("atomButton");
                 * atomLink.Controls.Add(atomImg);
                 */


                // the entryPath is a leaf on the parentPath ?
                if (!categories.HasChildrenInCollection(categoryEntry))
                {
                    // we just emit the link
                    if (showFeedBadge)
                    {
                        cell.Controls.Add(rssLink);
                    }
                    cell.Controls.Add(new LiteralControl("&nbsp;"));

                    /*cell.Controls.Add(atomLink);
                     * cell.Controls.Add( new LiteralControl("&nbsp;"));*/

                    HyperLink catLink = new HyperLink();
                    catLink.CssClass    = "categoryListLinkStyle";
                    catLink.Text        = categoryEntry.DisplayName;
                    catLink.NavigateUrl = SiteUtilities.GetCategoryViewUrl(requestPage.SiteConfig, categoryEntry.Name);
                    catLink.Attributes.Add("rel", "tag");
                    cell.Controls.Add(catLink);
                }
                else
                {
                    // if there are subitems, we ignore this link and render
                    // it as an categoryEntry
                    NamingPanel panel = new NamingPanel();
                    cell.Controls.Add(panel);

                    Table categoryEntryHead = new Table();
                    categoryEntryHead.CellPadding = 0; categoryEntryHead.CellSpacing = 0;
                    categoryEntryHead.CssClass    = "categoryListNestedOutlineHeaderTableStyle";
                    panel.Controls.Add(categoryEntryHead);

                    Panel collapsablePanel = new Panel();
                    Panel containerPanel   = new Panel();
                    panel.Controls.Add(collapsablePanel);
                    containerPanel.CssClass = "categoryListNestedOutlineContainer";
                    collapsablePanel.Controls.Add(containerPanel);
                    collapsablePanel.CssClass = "categoryListExpanded";
                    collapsablePanel.ID       = "panel";

                    TableCell categoryEntryBadge;
                    TableCell categoryEntryTitle;
                    categoryEntryHead.Rows.Add(new TableRow());
                    categoryEntryHead.Rows[0].Cells.Add(categoryEntryBadge = new TableCell());
                    categoryEntryHead.Rows[0].Cells.Add(categoryEntryTitle = new TableCell());
                    categoryEntryBadge.CssClass = "categoryListNestedOutlineBadgeCellStyle";
                    categoryEntryTitle.CssClass = "categoryListNestedOutlineTitleCellStyle";


                    HyperLink expandableLink = new HyperLink();

                    categoryEntryBadge.Controls.Add(rssLink);
                    categoryEntryBadge.Controls.Add(new LiteralControl("&nbsp;"));
                    categoryEntryBadge.Controls.Add(expandableLink);
                    categoryEntryBadge.Controls.Add(new LiteralControl("&nbsp;"));

                    /*categoryEntryBadge.Controls.Add(atomLink);
                     * categoryEntryBadge.Controls.Add( new LiteralControl("&nbsp;"));*/


                    expandableLink.CssClass = "categoryListNestedOutlineBadgeStyle";
                    System.Web.UI.WebControls.Image imgBadge = new System.Web.UI.WebControls.Image();
                    expandableLink.Controls.Add(imgBadge);
                    imgBadge.ID = "img";
                    expandableLink.NavigateUrl = "javascript:ct_toggleExpansionStatus( '" + collapsablePanel.ClientID + "', '" + imgBadge.ClientID + "' )";
                    imgBadge.ImageUrl          = requestPage.GetThemedImageUrl("outlinedown");
                    imgBadge.ToolTip           = requestPage.CoreStringTables.GetString("tooltip_expand");



                    HyperLink hlHead = new HyperLink();
                    hlHead.CssClass = "categoryListNestedOutlineTitleStyle";
                    categoryEntryTitle.Controls.Add(hlHead);
                    hlHead.NavigateUrl = SiteUtilities.GetCategoryViewUrl(requestPage.SiteConfig, categoryEntry.Name);
                    hlHead.Text        = categoryEntry.DisplayName;


                    Table list = new Table();
                    list.CellPadding = 0; list.CellSpacing = 0;
                    list.CssClass    = "categoryListNestedOutlineBodyTableStyle";
                    containerPanel.Controls.Add(list);

                    RenderCategoriesIntoTable(list, categoryEntry.CategoryPath);
                }
            }
        }
Exemplo n.º 4
0
        protected void Page_PreRender(object sender, System.EventArgs e)
        {
            SharedBasePage requestPage = Page as SharedBasePage;

            Control            root  = this;
            HtmlGenericControl entry = new HtmlGenericControl("div");

            if (SiteSecurity.GetUserByEmail(comment.AuthorEmail) == null)
            {
                entry.Attributes["class"] = "commentBoxStyle";
            }
            else
            {
                entry.Attributes["class"] = "commentBoxStyle commentBoxAuthorStyle";
            }
            root.Controls.Add(entry);

            HtmlGenericControl entryTitle = new HtmlGenericControl("div");

            entryTitle.Attributes["class"] = "commentDateStyle";

            //Add the unique anchor for each comment
            HtmlAnchor anchor = new HtmlAnchor();

            anchor.Name = comment.EntryId;
            entryTitle.Controls.Add(anchor);

            if (requestPage.SiteConfig.AdjustDisplayTimeZone)
            {
                entryTitle.Controls.Add(new LiteralControl(requestPage.SiteConfig.GetConfiguredTimeZone().FormatAdjustedUniversalTime(comment.CreatedUtc)));
            }
            else
            {
                entryTitle.Controls.Add(new LiteralControl(comment.CreatedUtc.ToString("U") + " UTC"));
            }
            entry.Controls.Add(entryTitle);


            HtmlGenericControl entryBody = new HtmlGenericControl("div");

            if (SiteSecurity.GetUserByEmail(comment.AuthorEmail) == null)
            {
                entryBody.Attributes["class"] = "commentBodyStyle";
            }
            else
            {
                entryBody.Attributes["class"] = "commentBodyStyle commentBodyAuthorStyle";
            }

            if (comment.Content != null)
            {
                entryBody.Controls.Add(new LiteralControl(Regex.Replace(comment.Content, "\n", "<br />")));
            }
            if (!requestPage.HideAdminTools && SiteSecurity.IsInRole("admin"))
            {
                HtmlGenericControl spamStatus = new HtmlGenericControl("div");
                spamStatus.Attributes["class"] = "commentSpamStateStyle";
                spamStatus.InnerText           = ApplicationResourceTable.GetSpamStateDescription(comment.SpamState);
                entryBody.Controls.Add(spamStatus);
            }


            entry.Controls.Add(entryBody);

            HtmlGenericControl footer = new HtmlGenericControl("div");

            footer.Attributes["class"] = "commentBoxFooterStyle";
            entry.Controls.Add(footer);


            if (requestPage.SiteConfig.CommentsAllowGravatar && String.IsNullOrEmpty(comment.AuthorEmail) == false)
            {
                string hash = "";
                byte[] data, enc;

                data = Encoding.Default.GetBytes(comment.AuthorEmail.ToLowerInvariant());

                using (MD5 md5 = new MD5CryptoServiceProvider())
                {
                    enc = md5.TransformFinalBlock(data, 0, data.Length);
                    foreach (byte b in md5.Hash)
                    {
                        hash += Convert.ToString(b, 16).ToLower().PadLeft(2, '0');
                    }
                    md5.Clear();
                }

                string nogravpath = "";
                if (requestPage.SiteConfig.CommentsGravatarNoImgPath != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarNoImgPath != "")
                    {
                        if (requestPage.SiteConfig.CommentsGravatarNoImgPath.Substring(0, 4) == "http")
                        {
                            nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.CommentsGravatarNoImgPath);
                        }
                        else
                        {
                            nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.Root + requestPage.SiteConfig.CommentsGravatarNoImgPath);
                        }
                    }
                }

                if (String.IsNullOrEmpty(requestPage.SiteConfig.CommentsGravatarNoImgPath) == false)
                {
                    if (requestPage.SiteConfig.CommentsGravatarNoImgPath == "identicon" ||
                        requestPage.SiteConfig.CommentsGravatarNoImgPath == "wavatar" ||
                        requestPage.SiteConfig.CommentsGravatarNoImgPath == "monsterid" ||
                        requestPage.SiteConfig.CommentsGravatarNoImgPath.Substring(0, 4) == "http")
                    {
                        nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.CommentsGravatarNoImgPath);
                    }
                    else
                    {
                        nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.Root + requestPage.SiteConfig.CommentsGravatarNoImgPath);
                    }
                }

                string gravborder = "";
                if (requestPage.SiteConfig.CommentsGravatarBorder != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarBorder != "")
                    {
                        gravborder = "&border=" + requestPage.SiteConfig.CommentsGravatarBorder;
                    }
                }

                string gravsize = "";
                if (requestPage.SiteConfig.CommentsGravatarSize != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarSize != "")
                    {
                        gravsize = "&size=" + requestPage.SiteConfig.CommentsGravatarSize;
                    }
                }

                string gravrating = "";
                if (requestPage.SiteConfig.CommentsGravatarRating != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarRating != "")
                    {
                        gravrating = "&rating=" + requestPage.SiteConfig.CommentsGravatarRating;
                    }
                }



                HtmlGenericControl entryGRAVATAR = new HtmlGenericControl("span");
                entryGRAVATAR.Attributes["class"] = "commentGravatarBlock";
                entryGRAVATAR.InnerHtml           = "<img class=\"commentGravatar\" src=\"http://www.gravatar.com/avatar.php?gravatar_id=" + hash + gravrating + gravsize + nogravpath + gravborder + "\"/>";
                footer.Controls.Add(entryGRAVATAR);
            }

            string authorLink = null;

            if (comment.AuthorHomepage != null && comment.AuthorHomepage.Length > 0)
            {
                authorLink = FixUrl(comment.AuthorHomepage);
            }
            else if (comment.AuthorEmail != null && comment.AuthorEmail.Length > 0)
            {
                if (!requestPage.SiteConfig.SupressEmailAddressDisplay)
                {
                    authorLink = "mailto:" + SiteUtilities.SpamBlocker(comment.AuthorEmail);
                }
            }

            if (authorLink != null)
            {
                HyperLink link = new HyperLink();
                link.Attributes["class"] = "commentPermalinkStyle";
                link.NavigateUrl         = authorLink;
                link.Text = comment.Author;
                link.Attributes.Add("rel", "nofollow");
                footer.Controls.Add(link);

                if (comment.OpenId)
                {
                    System.Web.UI.WebControls.Image i = new System.Web.UI.WebControls.Image();
                    i.ImageUrl = "~/images/openid-icon-small.gif";
                    i.CssClass = "commentOpenId";
                    link.Controls.Add(i);
                    Literal l = new Literal();
                    l.Text = comment.Author;
                    link.Controls.Add(l);
                }
            }
            else
            {
                Label l = new Label();
                l.Attributes["class"] = "commentPermalinkStyle";
                l.Text = comment.Author;
                footer.Controls.Add(l);
            }


            if (!requestPage.SiteConfig.SupressEmailAddressDisplay)
            {
                if (comment.AuthorEmail != null && comment.AuthorEmail.Length > 0)
                {
                    footer.Controls.Add(new LiteralControl(" | "));

                    HtmlGenericControl mailto = new HtmlGenericControl("span");
                    footer.Controls.Add(mailto);

                    HyperLink link = new HyperLink();
                    link.CssClass    = "commentMailToStyle";
                    link.NavigateUrl = "mailto:" + SiteUtilities.SpamBlocker(comment.AuthorEmail);
                    link.Text        = SiteUtilities.SpamBlocker(comment.AuthorEmail);
                    mailto.Controls.Add(link);
                }
            }

            if (!requestPage.HideAdminTools && SiteSecurity.IsInRole("admin"))
            {
                if (!string.IsNullOrEmpty(comment.AuthorIPAddress))
                {
                    try
                    {
                        if (requestPage.SiteConfig.ResolveCommenterIP == true)
                        {
                            System.Net.IPHostEntry hostInfo = System.Net.Dns.GetHostEntry(comment.AuthorIPAddress);
                            footer.Controls.Add(
                                new LiteralControl(" (" + comment.AuthorIPAddress + " " + hostInfo.HostName + ") "));
                        }
                        else
                        {
                            footer.Controls.Add(new LiteralControl(" (" + comment.AuthorIPAddress + ") "));
                        }
                    }
                    catch
                    {
                        footer.Controls.Add(new LiteralControl(" (" + comment.AuthorIPAddress + ") "));
                    }
                }

                footer.Controls.Add(new LiteralControl(" "));

                // create delete hyperlink
                HyperLink deleteHl = new HyperLink();
                deleteHl.CssClass = "deleteLinkStyle";
                System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image();
                img.CssClass    = "deleteLinkImageStyle";
                img.ImageUrl    = new Uri(new Uri(SiteUtilities.GetBaseUrl(requestPage.SiteConfig)), requestPage.GetThemedImageUrl("deletebutton")).ToString();
                img.BorderWidth = 0;
                deleteHl.Controls.Add(img);
                deleteHl.NavigateUrl = String.Format("javascript:deleteComment(\"{0}\", \"{1}\", \"{2}\")", Comment.TargetEntryId, Comment.EntryId, Comment.Author == null ? String.Empty : Comment.Author.Replace("\"", "\\\""));

                ResourceManager resmgr = resmgr = ApplicationResourceTable.Get();

                if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "deleteCommentScript"))
                {
                    // add the javascript to allow deletion of the comment
                    string scriptString = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
                    scriptString += "function deleteComment(entryId, commentId, commentFrom)\n";
                    scriptString += "{\n";
                    scriptString += String.Format("	if(confirm(\"{0} \\n\\n\" + commentFrom))\n", resmgr.GetString("text_delete_confirm"));
                    scriptString += "	{\n";
                    scriptString += "		location.href=\"deleteItem.ashx?entryid=\" +  entryId + \"&commentId=\" + commentId\n";
                    scriptString += "	}\n";
                    scriptString += "}\n";
                    scriptString += "</script>";

                    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "deleteCommentScript", scriptString);
                }


                footer.Controls.Add(deleteHl);

                // create approve hyperlink, when a comment is not public or if its marked as spam
                if ((!Comment.IsPublic) || (Comment.SpamState == SpamState.Spam))
                {
                    HyperLink approveHl = new HyperLink();
                    approveHl.CssClass = "approveLinkStyle";
                    System.Web.UI.WebControls.Image okImg = new System.Web.UI.WebControls.Image();
                    okImg.CssClass    = "approveImageStyle";
                    okImg.ImageUrl    = new Uri(new Uri(SiteUtilities.GetBaseUrl(requestPage.SiteConfig)), requestPage.GetThemedImageUrl("okbutton-list")).ToString();
                    okImg.BorderWidth = 0;
                    approveHl.Controls.Add(okImg);
                    approveHl.NavigateUrl = String.Format("javascript:approveComment(\"{0}\", \"{1}\")", Comment.TargetEntryId, Comment.EntryId);

                    if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "approveCommentScript"))
                    {
                        string approveScript = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
                        approveScript += "function approveComment(entryId, commentId)\n";
                        approveScript += "{\n";
                        approveScript += "	location.href=\"approveItem.ashx?entryid=\" +  entryId + \"&commentId=\" + commentId\n";
                        approveScript += "}\n";
                        approveScript += "</script>";

                        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "approveCommentScript", approveScript);
                    }

                    footer.Controls.Add(approveHl);
                }
                ISpamBlockingService spamBlockingService = requestPage.SiteConfig.SpamBlockingService;
                if ((spamBlockingService != null) && (comment.SpamState != SpamState.Spam))
                {
                    HyperLink reportSpamLink = new HyperLink();
                    reportSpamLink.CssClass = "approveLinkStyle";
                    System.Web.UI.WebControls.Image spamImg = new System.Web.UI.WebControls.Image();
                    spamImg.CssClass    = "approveImageStyle";
                    spamImg.ImageUrl    = new Uri(new Uri(SiteUtilities.GetBaseUrl(requestPage.SiteConfig)), requestPage.GetThemedImageUrl("reportspambutton")).ToString();
                    spamImg.BorderWidth = 0;
                    reportSpamLink.Controls.Add(spamImg);
                    reportSpamLink.NavigateUrl = String.Format("javascript:reportComment(\"{0}\", \"{1}\", \"{2}\")", Comment.TargetEntryId, Comment.EntryId, Comment.Author == null ? String.Empty : Comment.Author.Replace("\"", "\\\""));

                    string reportScript = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
                    reportScript += "function reportComment(entryId, commentId, commentFrom)\n";
                    reportScript += "{\n";
                    reportScript += String.Format("	if(confirm(\"{0} \\n\\n\" + commentFrom))\n", resmgr.GetString("text_reportspam_confirm"));
                    reportScript += "	{\n";
                    reportScript += "		location.href=\"deleteItem.ashx?report=true&entryid=\" +  entryId + \"&commentId=\" + commentId\n";
                    reportScript += "	}\n";
                    reportScript += "}\n";
                    reportScript += "</script>";

                    if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "reportCommentScript"))
                    {
                        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "reportCommentScript", reportScript);
                    }

                    footer.Controls.Add(reportSpamLink);
                }
            }
        }
Exemplo n.º 5
0
        private void RenderOutlinesIntoTable(Table table, OpmlOutlineCollection outlines, int depth, bool renderDescription)
        {
            SharedBasePage requestPage = Page as SharedBasePage;

            foreach (OpmlOutline outline in outlines)
            {
                TableRow  row  = new TableRow();
                TableCell cell = new TableCell();
                cell.CssClass = "blogRollCellStyle";
                table.Rows.Add(row);
                row.Cells.Add(cell);

                if (outline.outline == null || outline.outline.Count == 0)
                {
                    // if there are no sub items, we just emit the link
                    if (outline.xmlUrl != null && outline.xmlUrl.Length > 0)
                    {
                        HyperLink xmlLink = new HyperLink();
                        xmlLink.CssClass    = "blogRollXmlLinkStyle";
                        xmlLink.NavigateUrl = outline.xmlUrl;

                        if (requestPage.SiteConfig.UseFeedSchemeForSyndication)
                        {
                            if (outline.xmlUrl.StartsWith("https"))
                            {
                                xmlLink.NavigateUrl = String.Concat("feed:", new Uri(outline.xmlUrl).ToString());
                            }
                            else
                            {
                                xmlLink.NavigateUrl = String.Concat("feed:", new Uri(outline.xmlUrl).ToString().Remove(0, 5));
                            }
                        }

                        System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image();
                        img.AlternateText = "[Feed]";
                        switch (outline.type != null ? outline.type.ToLower() : "")
                        {
                        case "rss": img.ImageUrl = requestPage.GetThemedImageUrl("feedButton"); break;

                        case "atom": img.ImageUrl = requestPage.GetThemedImageUrl("atomButton"); break;

                        case "opml": img.ImageUrl = requestPage.GetThemedImageUrl("opmlButton"); break;

                        default: img.ImageUrl = requestPage.GetThemedImageUrl("feedButton"); break;
                        }

                        xmlLink.Controls.Add(img);
                        cell.Controls.Add(xmlLink);
                    }
                    cell.Controls.Add(new LiteralControl("&nbsp;"));
                    HyperLink catLink = new HyperLink();
                    catLink.CssClass    = "blogRollLinkStyle";
                    catLink.Text        = outline.title;
                    catLink.NavigateUrl = outline.htmlUrl;
                    cell.Controls.Add(catLink);

                    if (renderDescription)
                    {
                        if (outline.description != null && outline.description.Length > 0)
                        {
                            HtmlGenericControl outlineDesc = new HtmlGenericControl("div");
                            outlineDesc.Attributes.Add("class", "blogRollDescriptionStyle");
                            outlineDesc.InnerText = outline.description;
                            cell.Controls.Add(new LiteralControl("<br />"));
                            cell.Controls.Add(outlineDesc);
                        }
                    }
                }
                else
                {
                    // if there are subitems, we ignore this link and render
                    // it as an outline
                    NamingPanel panel = new NamingPanel();
                    cell.Controls.Add(panel);

                    Table outlineHead = new Table();
                    outlineHead.CssClass = "blogRollNestedOutlineHeaderTableStyle";
                    panel.Controls.Add(outlineHead);

                    Panel collapsablePanel = new Panel();
                    panel.Controls.Add(collapsablePanel);
                    collapsablePanel.CssClass = "blogRollCollapsed";
                    collapsablePanel.ID       = "panel";

                    TableCell outlineBadge;
                    TableCell outlineTitle;
                    outlineHead.Rows.Add(new TableRow());
                    outlineHead.Rows[0].Cells.Add(outlineBadge = new TableCell());
                    outlineHead.Rows[0].Cells.Add(outlineTitle = new TableCell());
                    outlineBadge.CssClass = "blogRollNestedOutlineBadgeCellStyle";
                    outlineTitle.CssClass = "blogRollNestedOutlineTitleCellStyle";

                    if (outline.description != null && outline.description.Length > 0)
                    {
                        TableCell outlineDesc;
                        outlineHead.Rows.Add(new TableRow());
                        outlineHead.Rows[1].Cells.Add(new TableCell());
                        outlineHead.Rows[1].Cells.Add(outlineDesc = new TableCell());
                        outlineDesc.CssClass = "blogRollDescriptionStyle";
                        outlineDesc.Text     = outline.description;
                    }

                    HyperLink hlBadge = new HyperLink();
                    hlBadge.CssClass = "blogRollNestedOutlineBadgeStyle";
                    outlineBadge.Controls.Add(hlBadge);
                    System.Web.UI.WebControls.Image imgBadge = new System.Web.UI.WebControls.Image();
                    hlBadge.Controls.Add(imgBadge);
                    imgBadge.ID            = "img";
                    imgBadge.AlternateText = "";
                    hlBadge.NavigateUrl    = "javascript:br_toggleExpansionStatus( '" + collapsablePanel.ClientID + "', '" + imgBadge.ClientID + "' )";

                    imgBadge.ImageUrl = requestPage.GetThemedImageUrl("outlinearrow");
                    imgBadge.ToolTip  = requestPage.CoreStringTables.GetString("tooltip_expand");


                    HyperLink hlHead = new HyperLink();
                    hlHead.CssClass = "blogRollNestedOutlineTitleStyle";
                    outlineTitle.Controls.Add(hlHead);
                    hlHead.NavigateUrl = outline.htmlUrl;
                    hlHead.Text        = outline.title;


                    Table list = new Table();
                    list.CssClass = "blogRollNestedOutlineBodyTableStyle";
                    collapsablePanel.Controls.Add(list);

                    RenderOutlinesIntoTable(list, outline.outline, depth + 1, renderDescription);
                }
            }
        }