예제 #1
0
            public static string SaveAndViewThisPage(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                StringBuilder js = new StringBuilder();

                js.Append("function FloatingEditMenuSubmit() {" + Environment.NewLine);
                js.Append(" submitting = true;" + Environment.NewLine);
                js.Append(" document.getElementById('" + HatCMS.Controls.EditingSystem.StartEditForm.FormId + "').submit();" + Environment.NewLine);
                js.Append(" return false;" + Environment.NewLine);
                js.Append("}" + Environment.NewLine);
                pageToRenderFor.HeadSection.AddJSStatements(js.ToString());

                return("<input type=\"button\" onclick=\"return FloatingEditMenuSubmit();\" value=\"Save & view this page\">");
            }
        public static string getDMSDownloadUrl(CmsPage pageLinkedToFile, int identifier, CmsLanguage language, string fileName)
        {
            string baseUrl = getDMSStorageFolderUrl(pageLinkedToFile, identifier, language);
            string url     = baseUrl + fileName;

            return(url);
        }
        } // CKEditorDependencies

        public static void AddPageJavascriptStatements(CmsPage page, string editorId, string renderWidth, string renderHeight, CmsLanguage language)
        {
            // ckeditor.js can not be aggregated because there is sniffing done based on this filename
            page.HeadSection.AddJavascriptFile(JavascriptGroup.Library, "js/_system/ckeditor/ckeditor.js", AggregateMode.DoNotAggregate);

            string lang = "";

            if (language.isValidLanguage && CmsConfig.Languages.Length > 1)
            {
                lang = "language: \"" + language.shortCode.ToLower() + "\", ";
            }

            page.HeadSection.AddJSOnReady("CKEDITOR.replace( '" + editorId + "', {width:\"" + renderWidth + "\", height:\"" + renderHeight + "\", " + lang + "stylesCombo_stylesSet: 'site_styles:" + PageUtils.ApplicationPath + "js/_system/ckeditor/styles.js', stylesSet: 'site_styles:" + PageUtils.ApplicationPath + "js/_system/ckeditor/styles.js', scayt_autoStartup: false} );");
        }
예제 #4
0
            public static string ViewCurrentPageRevisionInformation(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                StringBuilder       html    = new StringBuilder();
                CmsPageRevisionData revData = pageToRenderFor.getRevisionData(CmsContext.requestedPageVersionNumberToView);

                CmsPageRevisionData[] allRevs = pageToRenderFor.getAllRevisionData();
                bool isLiveVersion            = false;

                if (revData.RevisionNumber == allRevs[allRevs.Length - 1].RevisionNumber)
                {
                    isLiveVersion = true;
                }

                if (isLiveVersion)
                {
                    html.Append("Viewing live version");
                }
                else
                {
                    html.Append("Viewing page version #" + revData.RevisionNumber.ToString());
                }
                html.Append("<br />");
                html.Append("Saved by " + revData.RevisionSavedByUsername + "<br />");
                html.Append("on " + revData.RevisionSavedAt.ToString("d MMM yyyy") + " at " + revData.RevisionSavedAt.ToString("%h:mm tt") + "<br />");

                // revert to this revision
                if (isLiveVersion)
                {
                    html.Append("<a href=\"" + pageToRenderFor.Url + "\">view full edit menu</a>");
                }
                else
                {
                    html.Append("<a href=\"" + pageToRenderFor.Url + "\">go to live version</a>");
                }

                return(html.ToString());
            }
        /// <summary>
        /// derive the file storage folder path
        /// </summary>
        /// <param name="aggregatorPage"></param>
        /// <param name="identifier"></param>
        /// <returns></returns>
        public static string getDMSStorageFolderUrl(CmsPage fileDetailsPage, int identifier, CmsLanguage language)
        {
            string DMSFileStorageFolderUrl = CmsConfig.getConfigValue("DMSFileStorageFolderUrl", "");

            DMSFileStorageFolderUrl = VirtualPathUtility.ToAbsolute(DMSFileStorageFolderUrl);
            DMSFileStorageFolderUrl = VirtualPathUtility.AppendTrailingSlash(DMSFileStorageFolderUrl);

            string subDir = "";

            if (CmsConfig.getConfigValue("DMSFileStorageLocationVersion", "V1") == "V2")
            {
                subDir = fileDetailsPage.ID.ToString() + identifier.ToString() + language.shortCode.ToLower() + "/";
            }

            return(DMSFileStorageFolderUrl + subDir);
        }
예제 #6
0
            public static string RemoveEditLock(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                CmsPageLockData     lockData  = pageToRenderFor.getCurrentPageLockData();
                NameValueCollection paramList = new NameValueCollection();
                StringBuilder       html      = new StringBuilder();

                // -- Kill lock link
                if (lockData.LockedByUsername == CmsContext.currentWebPortalUser.UserName || CmsContext.currentUserIsSuperAdmin)
                {
                    paramList.Clear();
                    paramList.Add("target", pageToRenderFor.ID.ToString());
                    paramList.Add("action", "logoff");
                    string killLockLink = CmsContext.getUrlByPagePath(CmsConfig.getConfigValue("KillLockPath", "/_admin/actions/killLock"), paramList);
                    html.Append("<a href=\"#\" onclick=\"EditMenuConfirmModal('Do you really want to remove the edit lock?','" + killLockLink + "',300, 300);\"><strong>Remove</strong> edit lock</a><br />");
                }
                return(html.ToString());
            }
예제 #7
0
 public static string AdminReportsAndTools(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("AuditPagePath", "/_admin/Audit", pageToRenderFor, langToRenderFor, "<strong>Admin</strong> reports &amp; tools", 700, 400));
 }
예제 #8
0
            public static string Logoff(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                string actionPagePath         = CmsConfig.getConfigValue("LoginPath", "/_login");
                NameValueCollection paramList = new NameValueCollection();

                paramList.Add("action", "logoff");
                string actionUrl = CmsContext.getUrlByPagePath(actionPagePath, paramList, langToRenderFor);

                return("<a href=\"" + actionUrl + "\"><strong>Logoff</strong></a>");
            }
예제 #9
0
 public static string MoveThisPage(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("MovePagePath", "/_admin/actions/movePage", pageToRenderFor, langToRenderFor, "<strong>Move</strong> this page", 500, 400));
 }
예제 #10
0
            public static string RenderPopupLink(string actionConfigPagePathKey, string actionDefaultPagePath, NameValueCollection actionPageParams, CmsPage linkTargetPage, CmsLanguage langToRenderFor, string linkText, int popupWidth, int popupHeight)
            {
                string actionPagePath = CmsConfig.getConfigValue(actionConfigPagePathKey, actionDefaultPagePath);

                actionPageParams.Add("target", linkTargetPage.ID.ToString());
                string toggleEditUrl = CmsContext.getUrlByPagePath(actionPagePath, actionPageParams, langToRenderFor);

                return("<a href=\"" + toggleEditUrl + "\" onclick=\"EditMenuShowModal(this.href," + popupWidth + "," + popupHeight + "); return false;\">" + linkText + "</a>");
            }
예제 #11
0
 public static string EditThisPage(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderLink("GotoEditModePath", "/_admin/action/gotoEdit", pageToRenderFor, langToRenderFor, "<strong>Edit</strong> this page"));
 }
예제 #12
0
 public static string RenderPopupLink(string actionConfigPagePathKey, string actionDefaultPagePath, CmsPage linkTargetPage, CmsLanguage langToRenderFor, string linkText, int popupWidth, int popupHeight)
 {
     return(RenderPopupLink(actionConfigPagePathKey, actionDefaultPagePath, new NameValueCollection(), linkTargetPage, langToRenderFor, linkText, popupWidth, popupHeight));
 }
예제 #13
0
            public static string RenderLink(string actionConfigPagePathKey, string actionDefaultPagePath, NameValueCollection actionPageParams, CmsPage linkTargetPage, CmsLanguage langToRenderFor, string linkText)
            {
                string actionPagePath = CmsConfig.getConfigValue(actionConfigPagePathKey, actionDefaultPagePath);

                actionPageParams.Add("target", linkTargetPage.ID.ToString());
                string toggleEditUrl = CmsContext.getUrlByPagePath(actionPagePath, actionPageParams, langToRenderFor);

                return("<a href=\"" + toggleEditUrl + "\">" + linkText + "</a>");
            }
        public string RunInlineGlossaryFilter(CmsPage pageBeingFiltered, string placeholderHtml)
        {
            try
            {
                bool enabled = CmsConfig.getConfigValue("GlossaryHighlightFilter:Enable", false); // disabled by default

                if (!enabled || CmsContext.currentEditMode == CmsEditMode.Edit)
                {
                    return(placeholderHtml);
                }

#if DEBUG
                CmsContext.currentPage.HeadSection.AddCSSStyleStatements("span.InlineGlossaryTerm { border-bottom: 1px dotted red; }");
#endif

                // -- get the glossaryID to get data for (language specific)
                int    glossaryId  = 2;
                string glossaryIds = CmsConfig.getConfigValue("GlossaryHighlightFilter:GlossaryId", "");
                try
                {
                    string[] glossaryIdsParts = glossaryIds.Split(new char[] { CmsConfig.PerLanguageConfigSplitter }, StringSplitOptions.RemoveEmptyEntries);
                    if (glossaryIdsParts.Length >= CmsConfig.Languages.Length)
                    {
                        int index = CmsLanguage.IndexOf(CmsContext.currentLanguage.shortCode, CmsConfig.Languages);
                        if (index >= 0)
                        {
                            glossaryId = Convert.ToInt32(glossaryIdsParts[index]);
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("Error: GlossaryHighlightFilter is incorrectly configured!");
                }

                // -- get the glossary data from the database. The data is cached so that we don't hit the database for this info every time.
                GlossaryData[] gData;
                string         cacheKey = "GlossaryHighlightFilter_Data_" + glossaryId;
                if (!CmsContext.currentUserIsLoggedIn && System.Web.Hosting.HostingEnvironment.Cache[cacheKey] != null)
                {
                    gData = (GlossaryData[])System.Web.Hosting.HostingEnvironment.Cache[cacheKey];
                }
                else
                {
                    GlossaryDb db = new GlossaryDb();
                    gData = db.getGlossaryData(glossaryId);
                    if (!CmsContext.currentUserIsLoggedIn)
                    {
                        System.Web.Hosting.HostingEnvironment.Cache.Insert(cacheKey, gData, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);
                    }

                    // go through longer words first (longer words/phrases are usually more specific than shorter ones)
                    gData = GlossaryData.SortByWordLength(gData, SortDirection.Descending);
                }

                // -- short-circuit processing if there aren't any glossary terms in the system.
                if (gData.Length == 0)
                {
                    return(placeholderHtml);
                }

                // -- process the placeholderHTML
                string html = placeholderHtml;

                List <string> toSurround = new List <string>();
                List <string> prefixs    = new List <string>();
                List <string> suffixs    = new List <string>();

                foreach (GlossaryData d in gData)
                {
                    int index = html.IndexOf(d.word.Trim(), StringComparison.CurrentCultureIgnoreCase);
                    if (index >= 0 && d.word.Trim().Length > 0)
                    {
                        // string safeDesc = StringUtils.AddSlashes(d.description);
                        string safeDesc = HttpUtility.HtmlEncode(d.word + ": " + d.description);
                        safeDesc = safeDesc.Replace("\n", " ");
                        safeDesc = safeDesc.Replace("\r", " ");
                        safeDesc = safeDesc.Replace("\t", " ");
                        safeDesc = safeDesc.Replace("  ", " ");

                        string prefix = "<span title=\"" + safeDesc + "\" class=\"InlineGlossaryTerm\">";
                        string suffix = "</span>";

                        toSurround.Add(d.word.Trim());
                        prefixs.Add(prefix);
                        suffixs.Add(suffix);
                    }
                } // foreach word

                html = SurroundInHtml(toSurround.ToArray(), prefixs.ToArray(), suffixs.ToArray(), html);

                return(html.ToString());
            }
            catch (Exception ex)
            {
                placeholderHtml += ("<!-- GlossaryHighlightingFilter Error: " + ex.Message + " -->");
            }

            return(placeholderHtml);
        }
예제 #15
0
            public static string ExitFromEditing(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                // return RenderLink("GotoEditModePath", "/_admin/action/gotoView", pageToRenderFor, langToRenderFor, "<strong>Exit from editing</strong>");

                NameValueCollection paramList = new NameValueCollection();

                paramList.Add("target", pageToRenderFor.ID.ToString());
                string url = CmsContext.getUrlByPagePath(CmsConfig.getConfigValue("GotoViewModePath", "/_admin/action/gotoView"), paramList, langToRenderFor);

                return("<input type=\"button\" onclick=\"window.location = '" + url + "';\" value=\"Exit from editing\">");
            }
예제 #16
0
 public static string ChangeTemplate(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("ChangePageTemplatePath", "/_admin/actions/changeTemplate", pageToRenderFor, langToRenderFor, "Change page template", 500, 400));
 }
예제 #17
0
            public static string SwitchEditLanguage(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                if (CmsConfig.Languages.Length > 1)
                {
                    pageToRenderFor.HeadSection.AddCSSStyleStatements(".FloatingLangCurrent { text-decoration: none; color: black; font-weight: bold; } ");
                    pageToRenderFor.HeadSection.AddCSSStyleStatements(".FloatingLangNotCurrent { text-decoration: underline; color: #444; font-weight: normal; } ");

                    List <string> shortCodes = new List <string>();
                    foreach (CmsLanguage lang in CmsConfig.Languages)
                    {
                        shortCodes.Add(lang.shortCode.ToLower().Trim());
                    }

                    StringBuilder js = new StringBuilder();
                    js.Length = 0;
                    js.Append("function FloatingEditMenuSelectLanguage(langCode){" + Environment.NewLine);
                    js.Append("     var codes = [" + StringUtils.Join(",", shortCodes.ToArray(), "'", "'") + "];" + Environment.NewLine);
                    js.Append("     for(var i=0; i< codes.length; i++){" + Environment.NewLine);
                    js.Append("         if (langCode == codes[i]){" + Environment.NewLine);
                    js.Append("             document.getElementById('lang_'+codes[i]).style.display = 'block';" + Environment.NewLine);
                    js.Append("             document.getElementById('langSel_'+codes[i]).className = 'FloatingLangCurrent';" + Environment.NewLine);
                    js.Append("         } else {" + Environment.NewLine);
                    js.Append("             document.getElementById('lang_'+codes[i]).style.display = 'none';" + Environment.NewLine);
                    js.Append("             document.getElementById('langSel_'+codes[i]).className = 'FloatingLangNotCurrent';" + Environment.NewLine);
                    js.Append("         }" + Environment.NewLine);
                    js.Append("     }" + Environment.NewLine);
                    js.Append("}" + Environment.NewLine);
                    pageToRenderFor.HeadSection.AddJSStatements(js.ToString());

                    List <string> links = new List <string>();
                    foreach (CmsLanguage lang in CmsConfig.Languages)
                    {
                        string linkClass = "FloatingLangNotCurrent";
                        if (lang == CmsContext.currentLanguage)
                        {
                            linkClass = "FloatingLangCurrent";
                        }
                        links.Add("<a href=\"#\" class=\"" + linkClass + "\" id=\"langSel_" + lang.shortCode.ToLower() + "\" onclick=\"FloatingEditMenuSelectLanguage('" + lang.shortCode.ToLower() + "'); return false;\">" + lang.shortCode + "</a>");
                    } // foreach

                    StringBuilder html = new StringBuilder();
                    html.Append("Edit Language: ");
                    html.Append(string.Join(" | ", links.ToArray()));
                    return(html.ToString());
                }
                return("");
            }
예제 #18
0
 public static string ViewRevisions(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("ViewRevisionsPagePath", "/_admin/ViewRevisions", pageToRenderFor, langToRenderFor, "Revisions", 500, 400));
 }
예제 #19
0
            public static string RefreshEditLockStatus(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                CmsPageLockData lockData = pageToRenderFor.getCurrentPageLockData();
                StringBuilder   html     = new StringBuilder();

                if (lockData != null)
                {
                    html.Append("<strong>Editing is locked</strong><br />");
                    html.Append("Locked by: " + lockData.LockedByUsername + "<br />");
                    TimeSpan expiresIn  = TimeSpan.FromTicks(lockData.LockExpiresAt.Ticks - DateTime.Now.Ticks);
                    int      numMinutes = Convert.ToInt32(Math.Round(expiresIn.TotalMinutes));
                    html.Append("Lock expires in " + numMinutes + " minutes or when editing is complete<br />");
                    html.Append("<a href=\"" + pageToRenderFor.Url + "\">refresh status</a>");
                }
                return(html.ToString());
            }
예제 #20
0
            public static string DeleteThisPage(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                NameValueCollection paramList = new NameValueCollection();

                paramList.Add("target", pageToRenderFor.ID.ToString());

                string confirmText      = "Do you really want to delete this page?";
                int    numPagesToDelete = pageToRenderFor.getLinearizedPages().Keys.Count;

                if (numPagesToDelete > 1)
                {
                    confirmText = "Do you really want to delete this page and all " + (numPagesToDelete - 1) + " sub-pages?";
                }

                string deletePageUrl = CmsContext.getUrlByPagePath(CmsConfig.getConfigValue("DeletePagePath", "/_admin/actions/deletePage"), paramList, langToRenderFor);

                return("<a href=\"#\" onclick=\"EditMenuConfirmModal('" + confirmText + "','" + deletePageUrl + "',300, 300);\"><strong>Delete</strong> this page</a>");
            }
예제 #21
0
 public static string UserManagement(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("EditUsersPagePath", "/_admin/EditUsers", pageToRenderFor, langToRenderFor, "<strong>User</strong> management", 500, 400));
 }
예제 #22
0
            public static string CreateNewPage(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
            {
                action.CreateNewPageOptions = CmsCreateNewPageOptions.CreateInstanceWithDefaultsForCurrentUser(pageToRenderFor);
                NameValueCollection createPageParams = action.CreateNewPageOptions.GetCreatePagePopupParams();

                if (action.CreateNewPageOptions.RequiresUserInput())
                {
                    return(RenderPopupLink("CreateNewPagePath", "/_admin/createPage", createPageParams, pageToRenderFor, langToRenderFor, "<strong>Create</strong> a new sub-page", 500, 400));
                }
                else
                {
                    return(RenderLink("CreateNewPagePath", "/_admin/createPage", createPageParams, pageToRenderFor, langToRenderFor, "<strong>Create</strong> a new sub-page"));
                }
            }
예제 #23
0
        /// <summary>
        /// Add a control that is located on disk or as a class name to the parentToAddControlTo.
        /// </summary>
        /// <param name="controlNameOrPathToAdd"></param>
        /// <param name="controlDefn"></param>
        /// <param name="parentToAddControlTo"></param>
        /// <param name="langToRenderFor"></param>
        /// <returns></returns>
        public static bool AddControlToPage(string controlNameOrPathToAdd, CmsControlDefinition controlDefnToAdd, System.Web.UI.UserControl parentToAddControlTo, CmsLanguage langToRenderFor)
        {
            if (ControlOnDiskExists(controlNameOrPathToAdd))
            {
                Control ascxControl = LoadControlOnDisk(controlNameOrPathToAdd);
                if (ascxControl != null)
                {
                    parentToAddControlTo.Controls.Add(ascxControl);
                    ascxControl.ID = controlDefnToAdd.RawTemplateParameters;

                    return(true);
                }
            }
            else if (ControlClassExists(controlNameOrPathToAdd))
            {
                HatCMS.Controls.BaseCmsControl c = LoadControlFromClass(controlNameOrPathToAdd);
                if (c != null)
                {
                    parentToAddControlTo.Controls.Add(c.ToLiteralControl(controlDefnToAdd, langToRenderFor));
                    return(true);
                }
            }

            return(false);
        }
예제 #24
0
 public static string SortSubPages(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("SortSubPagesPath", "/_admin/actions/sortSubPages", pageToRenderFor, langToRenderFor, "<strong>Sort</strong> sub-pages", 500, 400));
 }
        public static string getDMSStorageFilenameOnDisk(CmsPage pageLinkedToFile, int identifier, CmsLanguage language, string userFilename)
        {
            string prependToFilename = "";

            if (CmsConfig.getConfigValue("DMSFileStorageLocationVersion", "V1") == "V1")
            {
                prependToFilename = pageLinkedToFile.ID.ToString() + identifier.ToString();
            }

            string baseUrl = getDMSStorageFolderUrl(pageLinkedToFile, identifier, language);

            string fn       = baseUrl + prependToFilename + userFilename;
            string fnOnDisk = System.Web.Hosting.HostingEnvironment.MapPath(fn);

            return(fnOnDisk);
        }
예제 #26
0
 public static string ChangeMenuVisibility(CmsPageEditMenuAction action, CmsPage pageToRenderFor, CmsLanguage langToRenderFor)
 {
     return(RenderPopupLink("ChangeMenuVisibilityPath", "/_admin/actions/MenuVisibilityPopup", pageToRenderFor, langToRenderFor, "<strong>Change</strong> menu visibility", 650, 400));
 }
        private CmsDependencyMessage[] contentMatches(string ContentToSearch, CmsPage inPage, CmsLanguage inLang)
        {
            if (ContentToSearch.Trim() == "")
            {
                return(new CmsDependencyMessage[0]); // short circuit if ContentToSearch is blank
            }
            List <CmsDependencyMessage> ret = new List <CmsDependencyMessage>();
            string errMsg = errMsg = "<a href=\"" + inPage.getUrl(inLang) + "\" target=\"_blank\">This page</a> {0} contain the text '" + contentToFind + "'";;

            if (placeholderTypeToMatch == "")
            {
                errMsg = "The " + placeholderTypeToMatch + " placeholder on <a href=\"" + inPage.getUrl(inLang) + "\" target=\"_blank\">this page</a> {0} contain the text '" + contentToFind + "'";
            }
            switch (existsMode)
            {
            case ExistsMode.MustExist:
                if (ContentToSearch.IndexOf(contentToFind, comparisonMode) < 0)
                {
                    ret.Add(new CmsDependencyMessage(CmsDependencyMessage.MessageLevel.Error, String.Format(errMsg, "must")));
                }
                break;

            case ExistsMode.MustNotExist:
                if (ContentToSearch.IndexOf(contentToFind, comparisonMode) >= 0)
                {
                    ret.Add(new CmsDependencyMessage(CmsDependencyMessage.MessageLevel.Error, String.Format(errMsg, "must NOT")));
                }
                break;
            }

            return(ret.ToArray());
        }
예제 #28
0
        public void ProcessRequest(HttpContext context)
        {
            string pagePath = "";

            if (context.Request.QueryString["p"] != null)
            {
                pagePath = context.Request.QueryString["p"];
            }
            CmsLanguage pageLang = CmsConfig.Languages[0];

            if (CmsConfig.Languages.Length > 1 && context.Request.QueryString["l"] != null)
            {
                string      langCode = context.Request.QueryString["l"];
                CmsLanguage testLang = CmsLanguage.GetFromHaystack(langCode, CmsConfig.Languages);
                if (!testLang.isInvalidLanguage)
                {
                    pageLang = testLang;
                }
            }

            CmsPage pageToRenderRSSFor = CmsContext.getPageByPath(pagePath, pageLang);

            if (pageToRenderRSSFor.Id < 0 || !pageToRenderRSSFor.currentUserCanRead)
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write("Error: CMS page not found");
                context.Response.Flush();
                context.Response.End();
            }
            else
            {
                // -- generate the RssFeed
                RssFeed rssFeed = new RssFeed(System.Text.UTF8Encoding.UTF8);
                rssFeed.Version = RssVersion.RSS20;


                // -- setup the RSS channel
                string titlePrefix  = CmsConfig.getConfigValue("pageTitlePrefix", "");
                string titlePostfix = CmsConfig.getConfigValue("pageTitlePostfix", "");

                string     rssTitle       = titlePrefix + pageToRenderRSSFor.getTitle(pageLang) + titlePostfix;
                string     rssDescription = pageToRenderRSSFor.getSearchEngineDescription(pageLang);
                Uri        rssLink        = new Uri(pageToRenderRSSFor.getUrl(CmsUrlFormat.FullIncludingProtocolAndDomainName, pageLang), UriKind.RelativeOrAbsolute);
                RssChannel rssChannel     = new RssChannel(rssTitle, rssDescription, rssLink);
                rssChannel.Generator = "HatCMS: https://code.google.com/p/hatcms/";

                // -- call "GetRssFeedItems()" for each placeholder.
                CmsPlaceholderDefinition[] phDefs = pageToRenderRSSFor.getAllPlaceholderDefinitions();

                foreach (CmsPlaceholderDefinition phDef in phDefs)
                {
                    RssItem[] items = Placeholders.PlaceholderUtils.GetRssFeedItems(phDef.PlaceholderType, pageToRenderRSSFor, phDef, pageLang);
                    foreach (RssItem item in items)
                    {
                        rssChannel.Items.Add(item);
                    }
                }

                rssFeed.Channels.Add(rssChannel);

                context.Response.ContentType = "application/rss+xml";
                rssFeed.Write(context.Response.OutputStream);
                context.Response.Flush();
                context.Response.End();
            }
        }