#region Using using System; using System.Web; using System.Text; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using BlogEngine.Core; #endregion namespace Controls { /// /// Summary description for Calendar /// public class PostCalendar : Calendar, ICallbackEventHandler { protected override void OnLoad(EventArgs e) { Page.ClientScript.GetCallbackEventReference(this, "arg", null, "context"); base.OnLoad(e); } protected override void OnPreRender(EventArgs e) { if (!Page.IsCallback && !Page.IsPostBack) base.VisibleDate = DateTime.Now; if (!Page.IsPostBack && Context.Request.QueryString["date"] != null) { DateTime date = DateTime.Now; if (DateTime.TryParse(Context.Request.QueryString["date"], out date)) base.VisibleDate = date; } base.OnPreRender(e); if (!ShowPostTitles) ShowTitle = false; } public bool ShowPostTitles { get { return (bool)(ViewState["ShowPostTitles"] ?? default(bool)); } set { ViewState["ShowPostTitles"] = value; } } protected override void OnDayRender(TableCell cell, CalendarDay day) { if (day.IsToday) { cell.Attributes["id"] += "today"; } List list = Post.GetPostsByDate(day.Date, day.Date); if (list.Count > 0) { cell.Controls.Clear(); if (ShowPostTitles) { cell.Controls.Add(new LiteralControl(day.DayNumberText)); foreach (Post post in list) { if (post.IsVisible) { HtmlAnchor a = new HtmlAnchor(); a.InnerHtml = "

" + post.Title; a.HRef = post.RelativeLink.ToString(); cell.Controls.Add(a); } } } else { if (list[0].IsVisible) { HtmlAnchor a = new HtmlAnchor(); a.InnerHtml = day.DayNumberText; a.HRef = Utils.RelativeWebRoot + day.Date.Year + "/" + day.Date.ToString("MM") + "/" + day.Date.ToString("dd") + "/default" + BlogSettings.Instance.FileExtension; a.Attributes["class"] = "exist"; cell.Controls.Add(a); } else { cell.Text = day.DayNumberText; } } } else { cell.Controls.Clear(); cell.Text = day.DayNumberText; } } protected override void Render(HtmlTextWriter writer) { if (!ShowPostTitles) { if ((Page.IsPostBack && !Page.IsCallback) || VisibleDate == DateTime.MinValue) VisibleDate = DateTime.Now; writer.Write("
"); writer.Write(""); writer.Write(""); writer.Write("
"); DateTime oldest = GetOldestPostDate(); if (VisibleDate.Year != oldest.Year || VisibleDate.Month != oldest.Month) writer.Write("" + HttpUtility.HtmlEncode(PrevMonthText) + "  "); else writer.Write(HttpUtility.HtmlEncode(PrevMonthText) + "  "); writer.Write("" + VisibleDate.ToString("MMMM yyyy") + ""); if (VisibleDate.Year != DateTime.Now.Year || VisibleDate.Month != DateTime.Now.Month) writer.Write("  " + HttpUtility.HtmlEncode(NextMonthText) + ""); else writer.Write("  " + HttpUtility.HtmlEncode(NextMonthText)); writer.Write("
"); base.Attributes.Add("summary", "Post calendar"); try { base.Render(writer); } catch (Exception) { writer.Write("Reload page"); } writer.Write("
"); if (!Page.IsCallback) writer.Write(Script()); } else if (!Page.IsCallback) { base.Render(writer); } } private DateTime GetOldestPostDate() { if (Post.Posts.Count > 0) { return Post.Posts[Post.Posts.Count - 1].DateCreated; } return DateTime.Now; } private string Script() { StringBuilder sb = new StringBuilder(); sb.Append(@""); /* "); sb.Append("var months = new Object();"); sb.Append("function CalNav(date){"); sb.Append("if (months[date] == null || months[date] == 'undefined')"); sb.Append("{" + Page.ClientScript.GetCallbackEventReference(this, "date", "BlogEngine.updateCalendar", "date") + "}"); sb.Append("else {BlogEngine.updateCalendar(months[date], date)}"); sb.Append("}"); sb.Append(""); */ return sb.ToString(); } #region ICallbackEventHandler Members private string _Callback; public string GetCallbackResult() { return _Callback; } public void RaiseCallbackEvent(string eventArgument) { DateTime date = DateTime.Now; if (DateTime.TryParse(eventArgument, out date)) { base.VisibleDate = date; base.ShowTitle = false; using (System.IO.StringWriter sw = new System.IO.StringWriter()) { this.RenderControl(new HtmlTextWriter(sw)); _Callback = sw.ToString(); } } } #endregion } }