#region Using using System; using System.Web; using System.Text; using System.IO; using System.Web.Security; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Threading; using BlogEngine.Core; #endregion public partial class admin_entry : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler { private const string RAW_EDITOR_COOKIE = "useraweditor"; protected void Page_Load(object sender, EventArgs e) { this.MaintainScrollPositionOnPostBack = true; txtTitle.Focus(); BindTags(); if (!Page.IsPostBack && !Page.IsCallback) { BindCategories(); BindUsers(); BindDrafts(); Page.Title = Resources.labels.add_Entry; Page.ClientScript.GetCallbackEventReference(this, "title", "ApplyCallback", "slug"); cbUseRaw.Text = Resources.labels.useRawHtmlEditor; if (!String.IsNullOrEmpty(Request.QueryString["id"]) && Request.QueryString["id"].Length == 36) { Guid id = new Guid(Request.QueryString["id"]); Page.Title = "Edit post"; BindPost(id); } else { PreSelectAuthor(Page.User.Identity.Name); txtDate.Text = DateTime.Now.AddHours(BlogSettings.Instance.Timezone).ToString("yyyy-MM-dd HH\\:mm"); cbEnableComments.Checked = BlogSettings.Instance.IsCommentsEnabled; if (Session["content"] != null) { txtContent.Text = Session["content"].ToString(); txtRawContent.Text = txtContent.Text; txtTitle.Text = Session["title"].ToString(); txtDescription.Text = Session["description"].ToString(); txtSlug.Text = Session["slug"].ToString(); txtTags.Text = Session["tags"].ToString(); } BindBookmarklet(); } if (!Page.User.IsInRole(BlogSettings.Instance.AdministratorRole)) ddlAuthor.Enabled = false; cbEnableComments.Enabled = BlogSettings.Instance.IsCommentsEnabled; if (Request.Cookies[RAW_EDITOR_COOKIE] != null) { txtRawContent.Visible = true; txtContent.Visible = false; cbUseRaw.Checked = true; } if (!Utils.IsMono && !cbUseRaw.Checked) Page.Form.DefaultButton = btnSave.UniqueID; } btnSave.Text = Resources.labels.savePost; // mono does not interpret the inline code correctly btnSave.Click += new EventHandler(btnSave_Click); btnCategory.Click += new EventHandler(btnCategory_Click); btnUploadFile.Click += new EventHandler(btnUploadFile_Click); btnUploadImage.Click += new EventHandler(btnUploadImage_Click); valExist.ServerValidate += new ServerValidateEventHandler(valExist_ServerValidate); cbUseRaw.CheckedChanged += new EventHandler(cbUseRaw_CheckedChanged); } void cbUseRaw_CheckedChanged(object sender, EventArgs e) { if (cbUseRaw.Checked) { txtRawContent.Text = txtContent.Text; HttpCookie cookie = new HttpCookie(RAW_EDITOR_COOKIE, "1"); cookie.Expires = DateTime.Now.AddYears(3); Response.Cookies.Add(cookie); } else { txtContent.Text = txtRawContent.Text; if (Request.Cookies[RAW_EDITOR_COOKIE] != null) { HttpCookie cookie = new HttpCookie(RAW_EDITOR_COOKIE); cookie.Expires = DateTime.Now.AddYears(-3); Response.Cookies.Add(cookie); } } txtRawContent.Visible = cbUseRaw.Checked; txtContent.Visible = !cbUseRaw.Checked; //Response.Redirect(Request.RawUrl); } private void valExist_ServerValidate(object source, ServerValidateEventArgs args) { args.IsValid = true; foreach (Category cat in Category.Categories) { if (cat.Title.Equals(txtCategory.Text.Trim(), StringComparison.OrdinalIgnoreCase)) args.IsValid = false; } } private void btnUploadImage_Click(object sender, EventArgs e) { string relativeFolder = DateTime.Now.Year.ToString() + Path.DirectorySeparatorChar + DateTime.Now.Month.ToString() + Path.DirectorySeparatorChar; string folder = BlogSettings.Instance.StorageLocation + "files" + Path.DirectorySeparatorChar; string fileName = txtUploadImage.FileName; Upload(folder + relativeFolder, txtUploadImage, fileName); string path = Utils.RelativeWebRoot.ToString(); string img = string.Format("\"\"", path, Server.UrlEncode(relativeFolder.Replace("\\", "/") + fileName)); txtContent.Text += img; txtRawContent.Text += img; } private void btnUploadFile_Click(object sender, EventArgs e) { string relativeFolder = DateTime.Now.Year.ToString() + Path.DirectorySeparatorChar + DateTime.Now.Month.ToString() + Path.DirectorySeparatorChar; string folder = BlogSettings.Instance.StorageLocation + "files" + Path.DirectorySeparatorChar; string fileName = txtUploadFile.FileName; Upload(folder + relativeFolder, txtUploadFile, fileName); string a = "

{2}

"; string text = txtUploadFile.FileName + " (" + SizeFormat(txtUploadFile.FileBytes.Length, "N") + ")"; txtContent.Text += string.Format(a, Utils.RelativeWebRoot, Server.UrlEncode(relativeFolder.Replace("\\", "/") + fileName), text); txtRawContent.Text += string.Format(a, Utils.RelativeWebRoot, Server.UrlEncode(relativeFolder.Replace("\\", "/") + fileName), text); } private void Upload(string virtualFolder, FileUpload control, string fileName) { string folder = Server.MapPath(virtualFolder); if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); control.PostedFile.SaveAs(folder + fileName); } private string SizeFormat(float size, string formatString) { if (size < 1024) return size.ToString(formatString) + " bytes"; if (size < Math.Pow(1024, 2)) return (size / 1024).ToString(formatString) + " kb"; if (size < Math.Pow(1024, 3)) return (size / Math.Pow(1024, 2)).ToString(formatString) + " mb"; if (size < Math.Pow(1024, 4)) return (size / Math.Pow(1024, 3)).ToString(formatString) + " gb"; return size.ToString(formatString); } #region Event handlers /// /// Creates and saves a new category /// private void btnCategory_Click(object sender, EventArgs e) { if (Page.IsValid) { Category cat = new Category(txtCategory.Text, string.Empty); cat.Save(); ListItem item = new ListItem(Server.HtmlEncode(txtCategory.Text), cat.Id.ToString()); item.Selected = true; cblCategories.Items.Add(item); } } /// /// Saves the post /// private void btnSave_Click(object sender, EventArgs e) { if (!Page.IsValid) throw new InvalidOperationException("One or more validators are invalid."); Post post; if (Request.QueryString["id"] != null) post = Post.GetPost(new Guid(Request.QueryString["id"])); else post = new Post(); if (cbUseRaw.Checked) txtContent.Text = txtRawContent.Text; if (string.IsNullOrEmpty(txtContent.Text)) txtContent.Text = "[No text]"; post.DateCreated = DateTime.ParseExact(txtDate.Text, "yyyy-MM-dd HH\\:mm", null).AddHours(-BlogSettings.Instance.Timezone); post.Author = ddlAuthor.SelectedValue; post.Title = txtTitle.Text.Trim(); post.Content = txtContent.Text; post.Description = txtDescription.Text.Trim(); post.IsPublished = cbPublish.Checked; post.IsCommentsEnabled = cbEnableComments.Checked; if (!string.IsNullOrEmpty(txtSlug.Text)) post.Slug = Utils.RemoveIllegalCharacters(txtSlug.Text.Trim()); post.Categories.Clear(); foreach (ListItem item in cblCategories.Items) { if (item.Selected) post.Categories.Add(Category.GetCategory(new Guid(item.Value))); } post.Tags.Clear(); if (txtTags.Text.Trim().Length > 0) { string[] tags = txtTags.Text.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (string tag in tags) { if (string.IsNullOrEmpty(post.Tags.Find(delegate (string t) { return t.Equals(tag.Trim(), StringComparison.OrdinalIgnoreCase); }))) { post.Tags.Add(tag.Trim()); } } } post.Save(); Session.Remove("content"); Session.Remove("title"); Session.Remove("description"); Session.Remove("slug"); Session.Remove("tags"); Response.Redirect(post.RelativeLink.ToString()); } #endregion #region Data binding private void BindTags() { System.Collections.Generic.List col = new System.Collections.Generic.List(); foreach (Post post in Post.Posts) { foreach (string tag in post.Tags) { if (!col.Contains(tag)) col.Add(tag); } } col.Sort(delegate(string s1, string s2) { return String.Compare(s1, s2); }); foreach (string tag in col) { HtmlAnchor a = new HtmlAnchor(); a.HRef = "javascript:void(0)"; a.Attributes.Add("onclick", "AddTag(this)"); a.InnerText = tag; phTags.Controls.Add(a); } } private void BindCategories() { foreach (Category cat in Category.Categories) { cblCategories.Items.Add(new ListItem(Server.HtmlEncode(cat.Title), cat.Id.ToString())); } } private void BindPost(Guid postId) { Post post = Post.GetPost(postId); txtTitle.Text = post.Title; txtContent.Text = post.Content; txtRawContent.Text = post.Content; txtDescription.Text = post.Description; txtDate.Text = post.DateCreated.ToString("yyyy-MM-dd HH\\:mm"); cbEnableComments.Checked = post.IsCommentsEnabled; cbPublish.Checked = post.IsPublished; txtSlug.Text = Utils.RemoveIllegalCharacters(post.Slug); PreSelectAuthor(post.Author); foreach (Category cat in post.Categories) { ListItem item = cblCategories.Items.FindByValue(cat.Id.ToString()); if (item != null) item.Selected = true; } string[] tags = new string[post.Tags.Count]; for (int i = 0; i < post.Tags.Count; i++) { tags[i] = post.Tags[i]; } txtTags.Text = string.Join(",", tags); } private void PreSelectAuthor(string author) { ddlAuthor.ClearSelection(); foreach (ListItem item in ddlAuthor.Items) { if (item.Text.Equals(author, StringComparison.OrdinalIgnoreCase)) { item.Selected = true; break; } } } private void BindBookmarklet() { if (Request.QueryString["title"] != null && Request.QueryString["url"] != null) { string title = Request.QueryString["title"]; string url = Request.QueryString["url"]; txtTitle.Text = title; txtContent.Text = string.Format("

{1}

", url, title); } } private void BindUsers() { foreach (MembershipUser user in Membership.GetAllUsers()) { ddlAuthor.Items.Add(user.UserName); } } private void BindDrafts() { Guid id = Guid.Empty; if (!String.IsNullOrEmpty(Request.QueryString["id"]) && Request.QueryString["id"].Length == 36) { id = new Guid(Request.QueryString["id"]); } int counter = 0; foreach (Post post in Post.Posts) { if (!post.IsPublished && post.Id != id) { HtmlGenericControl li = new HtmlGenericControl("li"); HtmlAnchor a = new HtmlAnchor(); a.HRef = "?id=" + post.Id.ToString(); a.InnerHtml = post.Title; System.Web.UI.LiteralControl text = new System.Web.UI.LiteralControl(" by " + post.Author + " (" + post.DateCreated.ToString("yyyy-dd-MM HH\\:mm") + ")"); li.Controls.Add(a); li.Controls.Add(text); ulDrafts.Controls.Add(li); counter++; } } if (counter > 0) { divDrafts.Visible = true; aDrafts.InnerHtml = string.Format(Resources.labels.thereAreXDrafts, counter); } } #endregion #region ICallbackEventHandler Members private string _Callback; public string GetCallbackResult() { return _Callback; } public void RaiseCallbackEvent(string eventArgument) { if (eventArgument.StartsWith("_autosave")) { string[] fields = eventArgument.Replace("_autosave", string.Empty).Split(new string[] { ";|;" }, StringSplitOptions.None); Session["content"] = fields[0]; Session["title"] = fields[1]; Session["description"] = fields[2]; Session["slug"] = fields[3]; Session["tags"] = fields[4]; } else { _Callback = Utils.RemoveIllegalCharacters(eventArgument.Trim()); } } #endregion }