using Sitecore;
using Sitecore.Text;
using System;
using System.Globalization;
using System.Text;
using System.Web;
namespace TxtAv.Sc.Search.Util
{
public class SearchQueryBuilder
{
private readonly UrlString _url;
public struct Keys
{
public static string PAGE_KEY = "page";
public static string SEARCH_KEY = "find";
public static string TOPIC_KEY = "topic";
public static string YEAR_KEY = "year";
public static string AIRCRAFT_KEY = "aircraft";
public static string MEDIATYPE_KEY = "mediatype";
public static int PAGES_TO_DISPLAY = 5;
}
public SearchQueryBuilder(string url, string hash = null)
{
Hash = hash;
//
Append hash to the URL, if it was specified
if (!String.IsNullOrEmpty(Hash) && !url.Contains("#"))
{
url = url + StringUtil.EnsurePrefix('#', Hash);
}
_url = new UrlString(url);
int currentPage;
Int32.TryParse(_url.Parameters[Keys.PAGE_KEY], out currentPage);
CurrentPage = Math.Max(1, currentPage);
SearchQuery = HttpUtility.UrlDecode(_url.Parameters[Keys.SEARCH_KEY]);
Guid topicId;
if (Guid.TryParse(_url.Parameters[Keys.TOPIC_KEY], out topicId))
{
TopicFilterOption = topicId;
}
Guid aircraftId;
if (Guid.TryParse(_url.Parameters[Keys.AIRCRAFT_KEY], out aircraftId))
{
AircraftFilterOption = aircraftId;
}
Guid mediaTypeId;
if (Guid.TryParse(_url.Parameters[Keys.MEDIATYPE_KEY], out mediaTypeId))
{
MediaTypeFilterOption =
mediaTypeId;
}
int year;
if (Int32.TryParse(_url.Parameters[Keys.YEAR_KEY], out year))
{
Year = year;
}
}
public string Hash { get; set; }
public int? CurrentPage { get; set; }
public string SearchQuery { get; set; }
public Guid? TopicFilterOption { get; set; }
public Guid? AircraftFilterOption { get; set; }
public Guid? MediaTypeFilterOption { get; set; }
public int? Year { get; set; }
public string GetUrl()
{
return GetUrl(CurrentPage);
}
public string GetUrl(int? page, string hash = null)
{
// Page
if (page.HasValue && page.Value != 1)
_url.Add(Keys.PAGE_KEY, page.ToString());
else
_url.Remove(Keys.PAGE_KEY);
// Year
if (Year.HasValue)
_url.Add(Keys.YEAR_KEY, Year.ToString());
else
_url.Remove(Keys.YEAR_KEY);
// Topic
ID
if (TopicFilterOption.HasValue)
_url.Add(Keys.TOPIC_KEY,
TopicFilterOption.ToString());
else
_url.Remove(Keys.TOPIC_KEY);
//
Aircraft ID
if (AircraftFilterOption.HasValue)
_url.Add(Keys.AIRCRAFT_KEY,
AircraftFilterOption.ToString());
else
_url.Remove(Keys.AIRCRAFT_KEY);
// Media
Type
if (MediaTypeFilterOption.HasValue)
_url.Add(Keys.MEDIATYPE_KEY,
MediaTypeFilterOption.ToString());
else
_url.Remove(Keys.MEDIATYPE_KEY);
// Query
if (!String.IsNullOrEmpty(SearchQuery))
_url.Add(Keys.SEARCH_KEY, SearchQuery);
else
_url.Remove(Keys.SEARCH_KEY);
// Hash
string hashToAppend = !string.IsNullOrEmpty(hash) ? hash : Hash;
if (!string.IsNullOrEmpty(hashToAppend))
{
_url.Hash = hashToAppend;
}
return _url.GetUrl();
}
public HtmlString RenderPagination(int totalItemCount, int pageSize)
{
var currentPage = CurrentPage ?? 1;
int pageCount = (int)Math.Ceiling(totalItemCount / (double)pageSize);
if (pageCount < 2) return null;
var sb = new StringBuilder();
//
Handle previous link
if (currentPage > 1)
{
sb.Append(BuildPageLink("←",
currentPage - 1, "prev"));
}
int start = 1;
int end = pageCount;
if (pageCount > Keys.PAGES_TO_DISPLAY)
{
int middle = (int)Math.Ceiling(Keys.PAGES_TO_DISPLAY / 2d) - 1;
int below = (currentPage - middle);
int above = (currentPage + middle);
if (below < 4)
{
above = Keys.PAGES_TO_DISPLAY;
below = 1;
}
else if (above > (pageCount - 4))
{
above = pageCount;
below = (pageCount - Keys.PAGES_TO_DISPLAY);
}
start = below;
end = above;
}
if (start > 3)
{
sb.Append(BuildPageLink("1", 1));
sb.Append("<span>…</span>");
}
for (int i = start; i <= end; i++)
{
if (i == CurrentPage)
{
sb.AppendFormat("<span
class=\"active\">{0}</span>", i);
}
else
{
sb.Append(BuildPageLink(i.ToString(CultureInfo.InvariantCulture),
i));
}
}
if (end < (pageCount - 3))
{
sb.Append("<span>…</span>");
sb.Append(BuildPageLink(pageCount.ToString(CultureInfo.InvariantCulture),
pageCount));
}
// Next
if (CurrentPage < pageCount)
{
sb.Append(BuildPageLink("→",
currentPage + 1, "next"));
}
return new HtmlString(sb.ToString());
}
private string BuildPageLink(string linkText, int page, string cssClass = null)
{
string url = GetUrl(page);
return String.Format(
"<a
href=\"{0}\"{1}>{2}</a>",
url,
!String.IsNullOrEmpty(cssClass)
? " class=\"" + cssClass + "\"" : String.Empty,
linkText
);
}
public string GetMoreLink(string hash = null)
{
return GetUrl(CurrentPage + 1, hash);
}
public string GetTopicLink(Guid? guid, string hash = null)
{
SearchQueryBuilder tempSearchQueryBuilder =
new SearchQueryBuilder(GetUrl(1, hash))
{
TopicFilterOption = guid
};
return tempSearchQueryBuilder.GetUrl();
}
public string GetAircraftLink(Guid? guid, string hash = null)
{
SearchQueryBuilder tempSearchQueryBuilder =
new SearchQueryBuilder(GetUrl(1, hash))
{
AircraftFilterOption = guid
};
return tempSearchQueryBuilder.GetUrl();
}
public string GetMediaTypetLink(Guid? guid, string hash = null)
{
SearchQueryBuilder tempSearchQueryBuilder =
new SearchQueryBuilder(GetUrl(1, hash))
{
MediaTypeFilterOption =
guid
};
return tempSearchQueryBuilder.GetUrl();
}
public string GetSearchLink(string term = null, string hash = null)
{
SearchQueryBuilder tempSearchQueryBuilder =
new SearchQueryBuilder(GetUrl(1, hash))
{
SearchQuery = term
};
return tempSearchQueryBuilder.GetUrl();
}
}
}
protected void lbSearch_Click(object sender, EventArgs e)
{
RootSearchQueryBuilder.CurrentPage
= 1; // Reset pagnation upon filter
Response.Redirect(RootSearchQueryBuilder.GetSearchLink(txtSearch.Text));
No comments:
Post a Comment