private string getItemDisplay(IndexableFileInfo fileInfo, string defaultOutputTemplate)
        {
            /*
             * Item Output Template String Format:
             * {0} = Page's Title
             * {1} = Page's MenuTitle
             * {2} = Page's relative URL
             * {3} = the search string snippet to display for this page
             * {4} = Page's breadcrumb created using MenuTitle's, concatenated using ' > ' spacers
             * {5} = "odd" or "even"
             *
             */

            CmsPage targetPage = getPageFromIndex(fileInfo);

            // allow per-template ItemTemplates
            string itemOutputTemplate = CmsControlUtils.getControlParameterKeyValue(CmsContext.currentPage, this, "ItemTemplate_" + targetPage.TemplateName, defaultOutputTemplate);

            string url = targetPage.Url;

            if (fileInfo.FilenameParameters != "")
            {
                if (url.IndexOf("?") > -1)
                {
                    url += "&" + fileInfo.FilenameParameters;
                }
                else
                {
                    url += "?" + fileInfo.FilenameParameters;
                }
            }

            string ItemBreadcrumb = getItemBreadcrumbOutput(targetPage);

            string OddOrEven = "even";

            if (oddItem)
            {
                OddOrEven = "odd";
            }

            oddItem = !oddItem;

            try
            {
                string ret = String.Format(itemOutputTemplate, targetPage.Title, targetPage.MenuTitle, url, StringUtils.StripHTMLTags(fileInfo.Contents), ItemBreadcrumb, OddOrEven);
                return(ret);
            }
            catch (Exception fEx)
            {
                throw new Exception("Search Item Display Template error (url: \"" + url + "\"); template: (" + itemOutputTemplate + ")");
            }
            return("");
        }
        private static IndexableFileInfo[] indexStandardPage(CmsPage page)
        {
            List <IndexableFileInfo> ret = new List <IndexableFileInfo>();

            foreach (CmsLanguage lang in CmsConfig.Languages)
            {
                string desc = page.getSearchEngineDescription(lang);
                if (desc.Trim() != "")
                {
                    // -- use the searchEngineDescription
                    IndexableFileInfo fInfo = new IndexableFileInfo(getPageFilenameForIndex(page), "", page.Title, desc, lang.shortCode, page.LastUpdatedDateTime, true);
                    return(new IndexableFileInfo[] { fInfo });
                }
                else
                {
                    string            content = PageUtils.StripTags(page.renderAllPlaceholdersToString(lang, CmsPage.RenderPlaceholderFilterAction.RunAllPageAndPlaceholderFilters));
                    IndexableFileInfo fInfo   = new IndexableFileInfo(getPageFilenameForIndex(page), "", page.Title, content, lang.shortCode, page.LastUpdatedDateTime, false);
                    ret.Add(fInfo);
                }
            } // foreach language
            return(ret.ToArray());
        }
 /// <summary>
 /// if the language is not found, returns the Invalid language (that has .isInvalidLanguage set to TRUE)
 /// </summary>
 /// <param name="fi"></param>
 /// <returns></returns>
 private CmsLanguage getLanguageFromIndex(IndexableFileInfo fi)
 {
     return(CmsLanguage.GetFromHaystack(fi.SectionName, CmsConfig.Languages));
 }
 private CmsPage getPageFromIndex(IndexableFileInfo fi)
 {
     return(CmsContext.getPageById(Convert.ToInt32(fi.Filename)));
 }
        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            CmsPage currentPage = CmsContext.currentPage;

            /*
             * Item Output Template String Format:
             * {0} = Page's Title
             * {1} = Page's MenuTitle
             * {2} = Page's relative URL
             * {3} = the search string snippet to display for this page
             * {4} = Page's breadcrumb created using MenuTitle's, concatenated using ' > ' spacers
             * {5} = "odd" or "even"
             *
             */
            string defaultItemTemplate = "<div class=\"SearchResultItem {5}\"><a class=\"SearchResultItemLink\" href=\"{2}\">{0}</a><br/><blockquote class=\"SearchResultInfo\"><div class=\"Snippet\">{3}</div><div class=\"SearchResultItemBreadcrumb\">{4}</div></blockquote></div>";
            string itemOutputTemplate  = CmsControlUtils.getControlParameterKeyValue(CmsContext.currentPage, this, "ItemTemplate", defaultItemTemplate);

            string        action = PageUtils.getFromForm("action", "");
            StringBuilder html   = new StringBuilder();

            html.Append("<div class=\"SearchResults\">");

            if (action == "re-Index All Pages" || action.ToLower() == "reindexall")
            {
                ReIndexAllPages();
                html.Append("<p><strong>All Pages have been re-indexed</strong><p>");
            }

            string noQuery = Guid.NewGuid().ToString();
            string query   = PageUtils.getFromForm("q", noQuery);

            html.Append("<div class=\"SearchBox\">");
            // -- output search box
            string formId = "SearchResults";

            html.Append(currentPage.getFormStartHtml(formId));
            if (query == noQuery)
            {
                html.Append(PageUtils.getInputTextHtml("q", "queryBox", "", 20, 255));
            }
            else
            {
                html.Append(PageUtils.getInputTextHtml("q", "queryBox", query, 20, 255));
            }
            html.Append("<input type=\"submit\" value=\"search\">");

            // -- output doIndex button
            if (CmsContext.currentUserIsSuperAdmin)
            {
                html.Append(" Admin:<input type=\"submit\" name=\"action\" value=\"re-Index All Pages\">");
            }
            html.Append(currentPage.getFormCloseHtml(formId));
            html.Append("</div>");
            html.Append("<p>");

            LuceneKeywordSearch search = new LuceneKeywordSearch(IndexStorageDirectory, SpellCheckIndexStorageDirectory);

            if (query != noQuery)
            {
                // -- do the search with keyword highlighting
                IndexableFileInfo[] fileInfos = search.doSearch(query, query);

                fileInfos = getFileInfosForCurrentLanguage(fileInfos);

                // -- output the results
                if (fileInfos.Length < 1)
                {
                    // -- no results
                    html.Append("<strong>Your search for \"" + query + "\" returned no results</strong>");
                    // -- get spelling suggestion
                    string spellingSuggestion = search.getSpellingSuggestion(query);
                    if (spellingSuggestion.Trim() != query.Trim())
                    {
                        NameValueCollection p = new NameValueCollection();
                        p.Add("q", spellingSuggestion);
                        string newSearchUrl = CmsContext.getUrlByPagePath(CmsContext.currentPage.Path, p);
                        html.Append("<p><font color=\"#cc0000\">Did you mean:</font> \"<a href=\"" + newSearchUrl + "\">" + spellingSuggestion + "</a>\" <font color=\"#cc0000\">?</font></p>");
                    }
                }
                else
                {
                    html.Append("<strong>Your search for \"" + query + "\" returned " + fileInfos.Length + " results</strong><p>");
                    html.Append("<p>" + getPagerOutput(fileInfos) + "</p>");

                    int startAtItemNumber = PageUtils.getFromForm("num", 0);
                    if (startAtItemNumber >= fileInfos.Length)
                    {
                        startAtItemNumber = fileInfos.Length - 1;
                    }
                    int endAt = Math.Min(startAtItemNumber + numItemsPerPage - 1, fileInfos.Length - 1);

                    if (startAtItemNumber == 0 && endAt == 0 && fileInfos.Length == 1)
                    {
                        html.Append(getItemDisplay(fileInfos[0], itemOutputTemplate));
                    }
                    else
                    {
                        for (int i = startAtItemNumber; i <= endAt; i++)
                        {
                            if (endAt <= 0)
                            {
                                break;
                            }
                            IndexableFileInfo fileInfo = fileInfos[i];
                            html.Append(getItemDisplay(fileInfo, itemOutputTemplate));
                        } // for

                        html.Append("<p>" + getPagerOutput(fileInfos) + "</p>");
                    } // else
                }
            }             // if query != noQuery

            html.Append("</div>");

            writer.WriteLine(html.ToString());
        }         // Render