using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.ISearchEngine;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using SearchHelper = CMS.ISearchEngine.SearchHelper;
public partial class CMSModules_Content_Controls_SearchDialog : CMSUserControl
{
#region "Variables"
private string mSearchControlID = null;
private string mDefaultSiteCulture = null;
private string currentSiteName = null;
private int? mSiteCulturesCount = null;
public const string SQL = "##SQL##";
public const string ANY = "##ANY##";
#endregion
#region "Properties"
///
/// Gets or sets search webpart ID.
///
public string SearchControlID
{
get
{
return mSearchControlID;
}
set
{
mSearchControlID = value;
}
}
///
/// Site cultures count.
///
private int SiteCulturesCount
{
get
{
if (mSiteCulturesCount == null)
{
DataSet dsCultures = CultureInfoProvider.GetSiteCultures(currentSiteName);
mSiteCulturesCount = !DataHelper.DataSourceIsEmpty(dsCultures) ? dsCultures.Tables[0].Rows.Count : 0;
}
return mSiteCulturesCount.Value;
}
}
///
/// Default culture of the site.
///
private string DefaultSiteCulture
{
get
{
return mDefaultSiteCulture ?? (mDefaultSiteCulture = CultureHelper.GetDefaultCulture(currentSiteName));
}
}
///
/// Gets selected index.
///
public string SelectedIndex
{
get
{
return drpIndexes.SelectedValue;
}
}
///
/// Gets WHERE condition for SQL search.
///
public string WhereCondition
{
get
{
return GetWhere();
}
}
#endregion
#region "Methods"
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
currentSiteName = CMSContext.CurrentSiteName;
}
protected void Page_Load(object sender, EventArgs e)
{
rfvText.ErrorMessage = GetString("general.requiresvalue");
drpIndexes.AutoPostBack = true;
drpIndexes.SelectedIndexChanged += drpIndexes_SelectedIndexChanged;
btnSearch.Click += btnSearch_Click;
// Init cultures
cultureElem.DropDownCultures.CssClass = "ContentDropdown";
cultureElem.AddDefaultRecord = false;
cultureElem.UpdatePanel.RenderMode = UpdatePanelRenderMode.Inline;
if (!RequestHelper.IsPostBack())
{
LoadDropDowns();
SetControls();
SetCulture();
}
else
{
SetCulture();
}
}
///
/// OnPreRender.
///
protected override void OnPreRender(EventArgs e)
{
// Hide column with languages if only one culture is assigned to the site
if (SiteCulturesCount <= 1)
{
plcLang.Visible = false;
}
base.OnPreRender(e);
}
///
/// Sets WHERE condition.
///
private string GetWhere()
{
string where = null;
string val = QueryHelper.GetString("searchculture", "##ANY##");
string mode = QueryHelper.GetString("searchlanguage", null);
const string query = " (NodeID IN (SELECT NodeID FROM View_CMS_Tree_Joined GROUP BY NodeID HAVING (COUNT(NodeID) {0} {1}))) ";
if (val == "")
{
val = "##ANY##";
}
// If culture IS
if (mode == "=")
{
// document IS in ALL cultures
if (val == "##ALL##")
{
where = String.Format(query, mode, SiteCulturesCount);
}
}
// If culture IS NOT
else if (mode == "<>")
{
switch (val)
{
// document IS NOT in ALL cultures
case "##ALL##":
where = String.Format(query, mode, SiteCulturesCount);
break;
// document IS NOT in ANY culture is always empty result
case "##ANY##":
where = SqlHelperClass.NO_DATA_WHERE;
break;
// document IS NOT in one specific culture
default:
where = " (DocumentCulture <> '" + SqlHelperClass.GetSafeQueryString(val, false) + "')";
break;
}
}
return where;
}
///
/// Sets controls from query string parameters.
///
private void SetControls()
{
drpLanguage.SelectedValue = QueryHelper.GetString("searchlanguage", "=");
cultureElem.Value = QueryHelper.GetString("searchculture", ANY);
cultureElem.ReloadData();
cultureElem.Reload(true);
drpIndexes.SelectedValue = QueryHelper.GetString("searchindex", SQL);
chkOnlyPublished.Checked = QueryHelper.GetBoolean("searchpublished", true);
if (drpIndexes.SelectedValue != SQL)
{
plcPublished.Visible = false;
}
drpSearchMode.SelectedValue = QueryHelper.GetString("searchmode", SearchHelper.GetSearchModeString(SearchModeEnum.AnyWord));
txtSearchFor.Text = QueryHelper.GetString("searchtext", null);
}
private void SetCulture()
{
string selectedCulture = cultureElem.Value.ToString();
string selected = drpIndexes.SelectedValue;
if (String.IsNullOrEmpty(selected))
{
selected = SQL;
}
if (selected != SQL)
{
cultureElem.SpecialFields = new string[,] { { GetString("transman.anyculture"), ANY } };
drpLanguage.Visible = false;
cultureElem.DropDownCultures.Width = Unit.Pixel(295);
}
else
{
cultureElem.SpecialFields = new string[,] { { GetString("transman.anyculture"), ANY }, { GetString("transman.allcultures"), "##ALL##" } };
drpLanguage.Visible = true;
cultureElem.DropDownCultures.Width = Unit.Pixel(148);
}
cultureElem.Value = selectedCulture;
cultureElem.ReloadData();
cultureElem.Reload(true);
}
///
/// Loads drop-down lists.
///
private void LoadDropDowns()
{
// Init operands
if (drpLanguage.Items.Count == 0)
{
drpLanguage.Items.Add(new ListItem(GetString("transman.translatedto"), "="));
drpLanguage.Items.Add(new ListItem(GetString("transman.nottranslatedto"), "<>"));
}
// Get site indexes
DataSet ds = SearchIndexSiteInfoProvider.GetIndexSites("IndexId", "IndexSiteID = " + CMSContext.CurrentSiteID + " AND IndexID IN (SELECT IndexID FROM CMS_SearchIndex WHERE IndexType = N'" + PredefinedObjectType.DOCUMENT + "')", null, 0);
if (!DataHelper.DataSourceIsEmpty(ds))
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
SearchIndexInfo sii = SearchIndexInfoProvider.GetSearchIndexInfo(ValidationHelper.GetInteger(dr["IndexId"], 0));
if ((sii != null) && (sii.IndexType == PredefinedObjectType.DOCUMENT))
{
drpIndexes.Items.Add(new ListItem(sii.IndexDisplayName, sii.IndexName));
}
}
}
drpIndexes.Items.Insert(0, new ListItem(GetString("search.sqlsearch"), SQL));
// Init Search for drop down list
DataHelper.FillListControlWithEnum(typeof(SearchModeEnum), drpSearchMode, "srch.dialog.", SearchHelper.GetSearchModeString);
drpSearchMode.SelectedValue = QueryHelper.GetString("searchmode", SearchHelper.GetSearchModeString(SearchModeEnum.AnyWord));
}
#endregion
#region "Events"
///
/// Index changed.
///
private void drpIndexes_SelectedIndexChanged(object sender, EventArgs e)
{
plcPublished.Visible = (drpIndexes.SelectedValue == SQL);
SetCulture();
}
///
/// Search button click.
///
private void btnSearch_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(txtSearchFor.Text.Trim()))
{
string url = URLHelper.CurrentURL;
// Remove pager query string
url = URLHelper.RemoveParameterFromUrl(url, "page");
// Update search text parameter
url = URLHelper.UpdateParameterInUrl(url, "searchtext", HttpUtility.UrlEncode(txtSearchFor.Text));
// Update search mode parameter
url = URLHelper.UpdateParameterInUrl(url, "searchmode", HttpUtility.UrlEncode(drpSearchMode.SelectedValue));
// Update search for published items
if (chkOnlyPublished.Visible)
{
url = URLHelper.UpdateParameterInUrl(url, "searchpublished", chkOnlyPublished.Checked.ToString());
}
// Update selected search index
url = URLHelper.UpdateParameterInUrl(url, "searchindex", HttpUtility.UrlEncode(drpIndexes.SelectedValue));
// Update selected language
if (plcLang.Visible)
{
url = URLHelper.UpdateParameterInUrl(url, "searchlanguage", HttpUtility.UrlEncode(drpLanguage.SelectedValue));
url = URLHelper.UpdateParameterInUrl(url, "searchculture", HttpUtility.UrlEncode(ValidationHelper.GetString(cultureElem.Value, null)));
}
// Redirect
URLHelper.Redirect(url);
}
}
#endregion
}