using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;

namespace UUN
{
    public class 编译扩展_动态文件_留言列表 : 编译扩展接口
    {
        private SqlConnection 连接;
        private HttpContext HC;
        private 编译器 编译器;

        public 编译扩展_动态文件_留言列表(SqlConnection 连接, HttpContext HC, 编译器 编译器)
        {
            this.连接 = 连接;
            this.HC = HC;
            this.编译器 = 编译器;
        }

        private int 动态文件_留言列表_一页显示记录数 = 0;

        public string 开始执行代码()
        {
            编译器.方法库 += @"	private String 当前页面=@""" + 编译器.文件名称.Replace("\"", "\"\"") + @""";
	//参数
	private String 所属留言本;
	private int 保密状态;
	private int 回复状态;
	private int 排序;
	//其它
	private String 跳页表单项;
	private String _3G跳页表单项;
	private String 查询条件="""";
	private String 留言本名称;
	//列表分页
	private int 当前页;
	private int 总页数;
	private int 总记录数;
	private int 一页显示记录数;
	private String 获取留言本名称()
	{
		String 返回值="""";
		if(所属留言本!=null&&所属留言本!=""""&&所属留言本.IndexOf('|')<1)
		{
			SqlCommand 语句=new SqlCommand(""SELECT [留言本名称] FROM [""+程序.数据表前缀+""其它_留言_留言本] WHERE [ID]=""+所属留言本,访问.连接);
			SqlDataReader 读取=语句.ExecuteReader();
			if(读取.Read())
				返回值=读取[""留言本名称""].ToString();
			读取.Close();
		}
		return 返回值;
	}
	private String 列表跳页(int 页码)
	{
		return Server.HtmlEncode(常用.处理地址(当前页面+""?bid=""+Server.UrlEncode(所属留言本)+
			""&ishidden=""+保密状态+""&isreply=""+回复状态+""&page=""+页码,访问.用户[""标识""].ToString()));
	}
	private String 生成余下全部地址()
	{
		return """";
	}
";
            String 返回值 = "";
            返回值 += @"	所属留言本=Request.QueryString[""bid""];
	保密状态=Convert.ToInt32(Request.QueryString[""ishidden""]);
	回复状态=Convert.ToInt32(Request.QueryString[""isreply""]);
	排序=Convert.ToInt32(Request.QueryString[""order""]);
	一页显示记录数=获取一页显示记录数();
	跳页表单项=""<postfield name=\""bid\"" value=\""""+Server.HtmlEncode(所属留言本)+""\"" />""+
		""<postfield name=\""ishidden\"" value=\""""+保密状态+""\"" />""+
		""<postfield name=\""isreply\"" value=\""""+回复状态+""\"" />""+
		""<postfield name=\""order\"" value=\""""+排序+""\"" />""+
		""<postfield name=\""""+程序.设置[""标识名称""]+""\"" value=\""""+访问.用户[""标识""]+""\"" />"";
	_3G跳页表单项=""<input type=\""hidden\"" name=\""bid\"" value=\""""+Server.HtmlEncode(所属留言本)+""\"" />""+
		""<input type=\""hidden\"" name=\""ishidden\"" value=\""""+保密状态+""\"" />""+
		""<input type=\""hidden\"" name=\""isreply\"" value=\""""+回复状态+""\"" />""+
		""<input type=\""hidden\"" name=\""order\"" value=\""""+排序+""\"" />""+
		""<input type=\""hidden\"" name=\""""+程序.设置[""标识名称""]+""\"" value=\""""+访问.用户[""标识""]+""\"" />"";
";
            返回值 += 生成留言列表条件(true, "");
            返回值 += "\t\t当前页=Convert.ToInt32(Request.QueryString[\"page\"]);\r\n";
            返回值 += "\t\t总记录数=Convert.ToInt32(数量语句.ExecuteScalar());\r\n";
            返回值 += "\t\t总页数=常用.计算总页数(总记录数,一页显示记录数);\r\n";
            返回值 += "\t\t当前页=常用.计算当前页(总页数,当前页);\r\n";

            return 返回值;
        }

        private String 生成留言列表条件(bool 是否数量, String 查询字段)
        {
            String 返回值 = "";
            String 语句名称 = 是否数量 ? "数量语句" : "语句";
            if (是否数量)
                返回值 += @"		查询条件+="" WHERE 1=1"";
		if (所属留言本 != """" && 所属留言本 != ""0"" && 所属留言本 != null)
		{
			String[] 留言本数组 = 所属留言本.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
			String 所属留言本查询 = ""("";
			for (int i = 0; i < 留言本数组.Length; i++)
				所属留言本查询 += (i == 0 ? """" : "" OR "") + ""[留言本ID]="" + Convert.ToInt32(留言本数组[i]);
			所属留言本查询 += "")"";
			查询条件 += "" AND "" + 所属留言本查询;
		}
		if (保密状态 == 1)
			查询条件 += "" AND [是否保密]=0"";
		if (回复状态 == 1)
			查询条件 += "" AND [是否已回复]=1"";
";
            返回值 += "\t\tString " + 语句名称 + "SQL=\"SELECT " + (是否数量 ? "COUNT(ID)" : 查询字段) + " FROM [\"+程序.数据表前缀+\"其它_留言_留言]\"+查询条件;\r\n";

            if (!是否数量)
                返回值 += @"		"+语句名称+ @"SQL+="" ORDER BY "";
		switch(排序)
		{
			case 0:
				"+语句名称+ @"SQL+=""[ID]"";
				break;
			case 1:
				"+语句名称+ @"SQL+=""[ID] DESC"";
				break;
			default:
				"+语句名称+@"SQL+=""[回复时间] DESC"";
				break;
		}
";
            返回值 += "\t\tSqlCommand " + 语句名称 + "=new SqlCommand(" + 语句名称 + "SQL,访问.连接);\r\n";
            return 返回值;
        }

        public string 编译公共标签(string 代码)
        {
            switch (代码)
            {
                case "留言本名称":
                    return "\t\t返回值.Append(Server.HtmlEncode(留言本名称));\r\n";
                case "当前页":
                    return "\t\t返回值.Append(当前页);\r\n";
                case "总页数":
                    return "\t\t返回值.Append(总页数);\r\n";
                case "总记录数":
                    return "\t\t返回值.Append(总记录数);\r\n";
                default:
                    return "";
            }
        }

        private String 编译模板方法_动态文件_留言列表(String 空记录代码, String 格式, String 交替格式, String 保密状态文字, String 回复状态文字, int 字数, String 时间格式)
        {
            String 随机值 = 常用.随机字符(8);

            Hashtable 必须字段 = new Hashtable();
            必须字段.Add("序号", "");
            必须字段.Add("留言地址", "ID,留言本ID");
            必须字段.Add("留言本地址", "留言本ID");
            Hashtable 字段代码 = new Hashtable();
            字段代码.Add("序号", "(当前页-1)*一页显示记录数+i+1");
            字段代码.Add("留言地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"L_Message.aspx?GID=""+行[""留言本ID""]+""&ID=""+行[""ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("留言本地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"GuestBook.aspx?ID=""+行[""留言本ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("留言本名称", @"Server.HtmlEncode(行[""留言本名称""].ToString())");
            字段代码.Add("标题", @"Server.HtmlEncode(常用.截取字符串(行[""标题""].ToString()," + 字数 + "))");
            字段代码.Add("发表人", @"Server.HtmlEncode(行[""发表人""].ToString())");
            字段代码.Add("留言表情", @"常用.获取留言表情图片(行[""留言表情""].ToString())");
            字段代码.Add("留言内容", @"Server.HtmlEncode(行[""留言内容""].ToString())");
            字段代码.Add("留言时间", @"Convert.ToDateTime(行[""留言时间""]).ToString(""" + 时间格式 + "\")");
            String[] 保密状态数组 = 保密状态文字.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            字段代码.Add("是否保密", @"Convert.ToBoolean(行[""是否保密""])?@""" + 保密状态数组[0].Replace("\"", "\"\"") + @""":@""" + 保密状态数组[1].Replace("\"", "\"\"") + @"""");
            String[] 回复状态数组 = 回复状态文字.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            字段代码.Add("是否已回复", @"Convert.ToBoolean(行[""是否已回复""])?@""" + 回复状态数组[0].Replace("\"", "\"\"") + @""":@""" + 回复状态数组[1].Replace("\"", "\"\"") + @"""");
            字段代码.Add("回复内容", @"Server.HtmlEncode(行[""回复内容""].ToString())");
            字段代码.Add("回复时间", @"Convert.ToDateTime(行[""回复时间""]).ToString(""" + 时间格式 + "\")");

            String 查询字段, 行代码;
            查询字段 = 编译器.生成查询字段(格式, 交替格式, 必须字段, 字段代码, out 行代码);

            编译器.方法库 += "\tprivate void 留言列表" + 随机值 + "()\r\n";
            编译器.方法库 += "\t{\r\n";
            编译器.方法库 += "\t\tif(总记录数<1)\r\n";
            编译器.方法库 += "\t\t\t返回值.Append(@\"" + 空记录代码.Replace("\"", "\"\"") + "\");\r\n";
            编译器.方法库 += 生成留言列表条件(false, 查询字段);
            编译器.方法库 += 生成查询结果列表(行代码);

            return "\t\t留言列表" + 随机值 + "();\r\n";
        }
        private String 生成查询结果列表(String 行代码)
        {
            String 返回值 = "";
            返回值 += "\t\tDataSet 数据=new DataSet();\r\n";
            返回值 += "\t\tSqlDataAdapter 填充=new SqlDataAdapter(语句);\r\n";
            返回值 += "\t\t填充.Fill(数据,(当前页-1)*一页显示记录数,一页显示记录数,\"表\");\r\n";
            返回值 += "\t\tfor(int i=0;i<数据.Tables[0].Rows.Count;i++)\r\n";
            返回值 += "\t\t{\r\n";
            返回值 += 行代码;
            返回值 += "\t\t}\r\n";
            返回值 += "\t\t}\r\n";
            return 返回值;
        }

        private String 编译模板方法_动态文件_列表分页(int ID, String 无分页代码)
        {
            return 编译器.编译内容分页(
                (编译器.文件名称.StartsWith(程序.安装位置 + "club/", StringComparison.OrdinalIgnoreCase) ? "Club" : "Content"),
                "Page", ID, 无分页代码);
        }

        private String 编译模板方法_动态文件_分页设置(int 一页显示记录数)
        {
            if (一页显示记录数 > 0)
                动态文件_留言列表_一页显示记录数 = 一页显示记录数;
            return "";
        }

        public string 编译模板方法(string 方法名称, String[] 属性数组)
        {
            switch (方法名称)
            {
                case "_留言列表":
                    return 编译模板方法_动态文件_留言列表(属性数组[0],
                        属性数组[1],
                        属性数组[2],
                        属性数组[3],
                        属性数组[4],
                        Convert.ToInt32(属性数组[5]),
                        属性数组[6]);
                case "列表分页":
                    return 编译模板方法_动态文件_列表分页(Convert.ToInt32(属性数组[0]),
                        属性数组[1]);
                case "分页设置":
                    return 编译模板方法_动态文件_分页设置(Convert.ToInt32(属性数组[0]));
                default:
                    return "";
            }
        }

        public string 结束执行代码()
        {
            编译器.方法库 += @"	private int 获取一页显示记录数()
	{
";
            if (动态文件_留言列表_一页显示记录数 == 0)
                编译器.方法库 += "\t\treturn 访问.获取一页显示记录数();\r\n";
            else
                编译器.方法库 += "\t\treturn " + 动态文件_留言列表_一页显示记录数 + ";\r\n";
            编译器.方法库 += @"
	}
";
            return "";
        }
    }
}