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

namespace UUN
{
    /// <summary>
    /// 图片内容列表模板的编译部分
    /// </summary>
    public class 编译扩展_内容模板_内容列表_图片 : 编译扩展接口
    {
        private SqlConnection 连接;
        private HttpContext HC;
        private 编译器 编译器;

        public 编译扩展_内容模板_内容列表_图片(SqlConnection 连接, HttpContext HC, 编译器 编译器)
        {
            this.连接 = 连接;
            this.HC = HC;
            this.编译器 = 编译器;
        }

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

        public String 开始执行代码()
        {
            编译器.方法库 += @"	private String 当前页面;
	//参数
	private new int ID;
	private int 排序;
	//其它
	private String 跳页表单项;
	private String _3G跳页表单项;
	private String 查询条件="""";
	private DataRow 内容栏目;
	private DataSet 下级栏目数据;
	//列表分页
	private int 当前页;
	private int 总页数;
	private int 总记录数;
	private int 一页显示记录数;
	private String 列表跳页(int 页码)
	{
		return Server.HtmlEncode(常用.处理地址(当前页面+""?ID=""+ID+""&order=""+排序+
			""&page=""+页码,访问.用户[""标识""].ToString()));
	}
	private DataRow 获取内容栏目()
	{
		DataRow 返回值=null;
		DataSet 内容栏目=(DataSet)Application[""UUN_UUN3G_NeiRongLanMu""];
		for(int i=0;i<内容栏目.Tables[0].Rows.Count;i++)
		{
			DataRow 行=内容栏目.Tables[0].Rows[i];
			if(ID==0&&行[""栏目类型""].ToString()==""图片"")
				ID=Convert.ToInt32(行[""ID""]);
			if(Convert.ToInt32(行[""ID""])==ID)
				返回值=行;
		}

		if(返回值==null)
			throw new Exception(""内容栏目不存在"");

		if(返回值[""外部链接地址""].ToString()!="""")
			Response.Redirect(常用.处理地址(返回值[""外部链接地址""].ToString(),访问.用户[""标识""].ToString()));


		return 返回值;
	}
	private int 获取内容排序()
	{
		if(Request.QueryString[""order""]==null)
		{
			switch(内容栏目[""默认排序方式""].ToString())
			{
				case ""发布时间顺序"":
					return 0;
				case ""发布时间倒序"":
					return 1;
				case ""点击数"":
					return 2;
				case ""日点击数"":
					return 3;
				case ""周点击数"":
					return 4;
				case ""收藏数"":
					return 5;
				case ""评论数"":
					return 6;
				case ""最后评论时间"":
					return 7;
				default:
					return 8;
			}
		}
		else
			return Convert.ToInt32(Request.QueryString[""order""]);
	}
	private String 生成余下全部地址()
	{
		return """";
	}
	private void 生成下级栏目数据()
	{
		DataSet 数据=(DataSet)Application[""UUN_UUN3G_NeiRongLanMu""];
		DataSet 栏目数据=new DataSet();
		栏目数据.Tables.Add(数据.Tables[0].Clone());
		for(int i=0;i<数据.Tables[0].Rows.Count;i++)
			if(Convert.ToInt32(数据.Tables[0].Rows[i][""所属栏目""])==ID)
				栏目数据.Tables[0].Rows.Add(常用.数据_复制行(栏目数据.Tables[0],数据.Tables[0].Rows[i]));
		下级栏目数据=栏目数据;
	}
";
            String 返回值 = "";
            返回值 += @"	ID=Convert.ToInt32(Request.QueryString[""ID""]);
	内容栏目=获取内容栏目();
	当前页面=程序.安装位置+""" +(编译器.是否WML网页?"":"3G_")+ @"Column.aspx"";
	排序=获取内容排序();
	一页显示记录数=获取一页显示记录数();
	生成下级栏目数据();
	跳页表单项=""<postfield name=\""order\"" value=\""""+排序+""\"" />""+
		""<postfield name=\""ID\"" value=\""""+ID+""\"" />""+
		""<postfield name=\""""+程序.设置[""标识名称""]+""\"" value=\""""+
		访问.用户[""标识""]+""\"" />"";
	_3G跳页表单项=""<input type=\""hidden\"" name=\""order\"" value=\""""+排序+""\"" />""+
		""<input type=\""hidden\"" name=\""ID\"" value=\""""+ID+""\"" />""+
		""<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 返回值;
        }
        public String 编译公共标签(String 代码)
        {
            switch (代码)
            {
                case "栏目名称":
                    return "\t\t返回值.Append(Server.HtmlEncode(内容栏目[\"栏目名称\"].ToString()));\r\n";
                case "栏目简介":
                    return "\t\t返回值.Append(内容栏目[\"栏目简介\"].ToString()==\"\"?\"\":常用.UBB转换(Server.HtmlEncode(内容栏目[\"栏目简介\"].ToString())+\"<br/>\",访问.用户));\r\n";
                case "包含下级栏目":
                    return "\t\tif(Convert.ToBoolean(内容栏目[\"是否拥有子栏目\"]))\r\n\t\t{\r\n";
                case "/包含下级栏目":
                    return "\t\t}\r\n";
                case "当前页":
                    return "\t\t返回值.Append(当前页.ToString());\r\n";
                case "总页数":
                    return "\t\t返回值.Append(总页数.ToString());\r\n";
                case "总记录数":
                    return "\t\t返回值.Append(总记录数.ToString());\r\n";
                default:
                    return "";
            }
        }

        public String 编译模板方法(String 方法名称, String[] 属性数组)
        {
            switch (方法名称)
            {
                case "下级栏目列表":
                    return 编译模板方法_动态文件_图片列表_下级栏目列表(属性数组[0],
                        属性数组[1],
                        属性数组[2],
                        Convert.ToInt32(属性数组[3]));
                case "上级栏目列表":
                    return 编译模板方法_动态文件_图片列表_上级栏目列表(Convert.ToInt32(属性数组[0]),
                        属性数组[1]);
                case "上级栏目代码":
                    return 编译模板方法_动态文件_图片列表_上级栏目代码(属性数组[0]);
                case "_图片列表":
                    return 编译模板方法_动态文件_图片列表_图片列表(属性数组[0], 属性数组[1],
                        属性数组[2],
                        Convert.ToInt32(属性数组[3]),
                        属性数组[4]);
                case "列表分页":
                    return 编译模板方法_动态文件_图片列表_列表分页(Convert.ToInt32(属性数组[0]),
                        属性数组[1]);
                case "分页设置":
                    return 编译模板方法_动态文件_图片列表_分页设置(Convert.ToInt32(属性数组[0]));
                default:
                    return "";
            }
        }

        private String 编译模板方法_动态文件_图片列表_下级栏目列表(String 格式, String 交替格式, String 空记录代码, int 字数)
        {
            String 随机值 = 常用.随机字符(8);

            Hashtable 必须字段 = new Hashtable();
            必须字段.Add("序号", "");
            必须字段.Add("栏目地址", "ID,外部链接地址");
            Hashtable 字段代码 = new Hashtable();
            字段代码.Add("序号", "i+1");
            字段代码.Add("栏目名称", "Server.HtmlEncode(行[\"栏目名称\"].ToString())");
            字段代码.Add("栏目地址", @"行[""外部链接地址""].ToString()!=""""?Server.HtmlEncode(常用.处理地址(行[""外部链接地址""].ToString(),访问.用户[""标识""].ToString())):Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Column.aspx?ID=""+行[""ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("栏目简介", @"常用.UBB转换(常用.截取字符串(行[""栏目简介""].ToString(),100),访问.用户)");

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

            编译器.方法库 += "\tprivate void 下级栏目列表" + 随机值 + "()\r\n" +
                "\t{\r\n";
            编译器.方法库 += @"

		DataSet 数据=下级栏目数据;
		if(数据.Tables[0].Rows.Count<1)
			返回值.Append(@""" + 空记录代码.Replace("\"", "\"\"") + @""");
		else
			for(int i=0;i<数据.Tables[0].Rows.Count;i++)
			{
" + 行代码 + @"
			}
	}
";
            return "\t\t\t下级栏目列表" + 随机值 + "();\r\n";
        }

        private String 编译模板方法_动态文件_图片列表_上级栏目代码(String 代码)
        {
            String 返回值 = "";
            String 随机值 = 常用.随机字符(8);
            返回值 += "\t\tint 所属栏目" + 随机值 + "=Convert.ToInt32(内容栏目[\"所属栏目\"]);\r\n";
            返回值 += "\t\tif(所属栏目" + 随机值 + "!=0)\r\n";
            返回值 += "\t\t{\r\n";
            Hashtable 属性列表 = new Hashtable();
            属性列表.Add("栏目名称", "Server.HtmlEncode(常用.获取栏目名称(所属栏目" + 随机值 + "))");
            属性列表.Add("地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Column.aspx?ID=""+所属栏目" + 随机值 + @"+"",访问.用户[""标识""].ToString()))");
            返回值 += 编译器.生成代码项(属性列表, 代码);
            返回值 += "\t\t}\r\n";
            return 返回值;
        }

        private String 编译模板方法_动态文件_图片列表_上级栏目列表(int 排序, String 代码)
        {
            String 返回值 = "";
            String 随机值 = 常用.随机字符(8);
            编译器.方法库 += "\tprivate String 生成上级栏目列表代码" + 随机值 + "(DataSet 数据,int ID)\r\n";
            编译器.方法库 += "\t{\r\n";
            编译器.方法库 += "\t\tif(ID!=0)\r\n";
            编译器.方法库 += "\t\t{\r\n";
            编译器.方法库 += "\t\t\tString 返回值=\"\";\r\n";
            编译器.方法库 += "\t\t\tString 栏目名称=\"\";\r\n";
            编译器.方法库 += "\t\t\tint 上级栏目=0;\r\n";
            编译器.方法库 += "\t\t\tfor(int i=0;i<数据.Tables[0].Rows.Count;i++)\r\n";
            编译器.方法库 += "\t\t\t{\r\n";
            编译器.方法库 += "\t\t\t\tDataRow 行=数据.Tables[0].Rows[i];\r\n";
            编译器.方法库 += "\t\t\t\tif(Convert.ToInt32(行[\"ID\"])==ID)\r\n";
            编译器.方法库 += "\t\t\t\t{\r\n";
            编译器.方法库 += "\t\t\t\t\t栏目名称=Convert.ToString(行[\"栏目名称\"]);\r\n";
            编译器.方法库 += "\t\t\t\t\t上级栏目=Convert.ToInt32(行[\"所属栏目\"]);\r\n";
            编译器.方法库 += "\t\t\t\t}\r\n";
            编译器.方法库 += "\t\t\t}\r\n";
            Hashtable 属性列表 = new Hashtable();
            属性列表.Add("栏目名称", "Server.HtmlEncode(栏目名称)");
            属性列表.Add("地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Column.aspx?ID=""+ID,访问.用户[""标识""].ToString()))");
            编译器.方法库 += 编译器.生成代码项(属性列表, 代码, "返回值");
            if (排序 == 0)
                编译器.方法库 += "\t\t\t\treturn 生成上级栏目列表代码" + 随机值 + "(数据,上级栏目)+返回值;\r\n";
            else
                编译器.方法库 += "\t\t\t\treturn 返回值+生成上级栏目列表代码" + 随机值 + "(数据,上级栏目);\r\n";
            编译器.方法库 += "\t\t}\r\n";
            编译器.方法库 += "\t\telse\r\n";
            编译器.方法库 += "\t\t{\r\n";
            编译器.方法库 += "\t\t\treturn \"\";\r\n";
            编译器.方法库 += "\t\t}\r\n";
            编译器.方法库 += "\t}\r\n";
            返回值 += "\t\tif(Convert.ToInt32(内容栏目[\"所属栏目\"])!=0)\r\n";
            返回值 += "\t\t{\r\n";
            返回值 += "\t\t\tDataSet 数据" + 随机值 + "=(DataSet)Application[\"UUN_UUN3G_NeiRongLanMu\"];\r\n";
            返回值 += "\t\t\t返回值.Append(生成上级栏目列表代码" + 随机值 + "(数据" + 随机值 + ",Convert.ToInt32(内容栏目[\"所属栏目\"])));\r\n";
            返回值 += "\t\t}\r\n";
            return 返回值;
        }

        private String 生成图片列表条件(bool 是否数量, String 查询字段)
        {
            String 返回值 = "";
            String 语句名称 = 是否数量 ? "数量语句" : "语句";
            if (是否数量)
                返回值 += "\t\t查询条件+=\" WHERE [是否审核]=@是否审核 AND [是否删除]=@是否删除 AND [所属栏目]=@所属栏目\";\r\n";

            返回值 += "\t\tString " + 语句名称 + "SQL=\"SELECT " + (是否数量 ? "COUNT(ID)" : 查询字段) + " FROM [\"+程序.数据表前缀+\"内容_图片_图片]\"+查询条件;\r\n";

            if (!是否数量)
                返回值 += 编译器.编译模板方法_动态文件_内容排序(语句名称);
            返回值 += "\t\tSqlCommand " + 语句名称 + "=new SqlCommand(" + 语句名称 + "SQL,访问.连接);\r\n";
            返回值 += "\t\t" + 语句名称 + ".Parameters.Add(\"@是否审核\",SqlDbType.Bit).Value=false;\r\n";
            返回值 += "\t\t" + 语句名称 + ".Parameters.Add(\"@是否删除\",SqlDbType.Bit).Value=false;\r\n";
            返回值 += "\t\t" + 语句名称 + ".Parameters.Add(\"@所属栏目\",SqlDbType.Int).Value=ID;\r\n";
            return 返回值;
        }

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

            Hashtable 必须字段 = new Hashtable();
            必须字段.Add("序号", "");
            必须字段.Add("标题", "标题,标题样式_粗体,标题样式_斜体,标题样式_删除线,标题样式_颜色");
            必须字段.Add("栏目名称", "所属栏目");
            必须字段.Add("图片地址", "ID,所属栏目,外部链接");
            必须字段.Add("栏目地址", "所属栏目");
            必须字段.Add("评论地址", "ID,所属栏目");
            必须字段.Add("图片内容", "文件资源");
            必须字段.Add("随机图片", "文件资源");
            Hashtable 字段代码 = new Hashtable();
            字段代码.Add("序号", "(当前页-1)*一页显示记录数+i+1");
            字段代码.Add("标题", "常用.标题样式(行[\"标题\"].ToString(),Convert.ToBoolean(行[\"标题样式_粗体\"]),Convert.ToBoolean(行[\"标题样式_斜体\"]),Convert.ToBoolean(行[\"标题样式_删除线\"]),Convert.ToString(行[\"标题样式_颜色\"])," + 字数 + ")");
            字段代码.Add("图片地址", @"行[""外部链接""].ToString()!=""""?Server.HtmlEncode(常用.处理地址(行[""外部链接""].ToString(),访问.用户[""标识""].ToString())):Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Content.aspx?CID=""+行[""所属栏目""]+""&ID=""+行[""ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("栏目地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Column.aspx?ID=""+行[""所属栏目""],访问.用户[""标识""].ToString()))");
            字段代码.Add("评论地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Comment.aspx?CID=""+行[""所属栏目""]+""&ID=""+行[""ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("栏目名称", @"Server.HtmlEncode(常用.获取栏目名称(Convert.ToInt32(行[""所属栏目""])))");
            字段代码.Add("发布时间", @"Convert.ToDateTime(行[""发布时间""]).ToString(""" + 时间格式 + "\")");
            字段代码.Add("最后评论时间", @"Convert.ToDateTime(行[""最后评论时间""]).ToString(""" + 时间格式 + "\")");
            字段代码.Add("最后收藏时间", @"Convert.ToDateTime(行[""最后收藏时间""]).ToString(""" + 时间格式 + "\")");
            字段代码.Add("图片内容", @"常用.显示图片(行[""文件资源""].ToString(),false)");
            字段代码.Add("随机图片", @"常用.显示图片(行[""文件资源""].ToString(),true)");

            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 编译器.编译内容分页(
                "Content",
                "Page", ID, 无分页代码);
        }

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

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