using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using UUN;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;

public partial class Admin_NeiRong_TuPianCaiJi_LanMu_PiLiang : System.Web.UI.Page
{
    private 访问 访问;
    protected int 网站ID;
    protected String 网站名称;
    protected new int ID;
    protected String 栏目名称;
    private Hashtable 采集栏目;
    protected void Page_Load(object sender, EventArgs e)
    {
        访问 = new 访问(this.Context);
        访问.开始处理("批量采集图片", "网站后台", "批量采集图片", new 访问.回调委托(ZhiXing));
        访问.关闭连接();
    }

    private void ZhiXing()
    {
        访问.验证管理员();
        ID = Convert.ToInt32(Request.QueryString["ID"]);
        采集栏目 = 常用.SQL_获取(new SqlCommand("SELECT * FROM [" + 程序.数据表前缀 + "内容_图片采集_栏目] WHERE [ID]=" + ID, 访问.连接));

        if (采集栏目 == null)
            throw new Exception("采集栏目不存在");

        栏目名称 = Convert.ToString(采集栏目["栏目名称"]);

        Hashtable 采集网站 = 常用.SQL_获取(new SqlCommand("SELECT * FROM [" + 程序.数据表前缀 + "内容_图片采集_网站] WHERE [ID]=" + ID, 访问.连接));

        if (采集网站 == null)
            throw new Exception("采集网站不存在");

        网站ID = Convert.ToInt32(采集网站["ID"]);
        网站名称 = Convert.ToString(采集网站["网站名称"]);

        if (this.IsPostBack)
            批量采集();
        else
            初始化();
    }

    private void 批量采集()
    {
        访问.验证权限("13");
        Server.ScriptTimeout = 99999999;

        if (SuoShuFenLei.SelectedValue == null || SuoShuFenLei.SelectedValue == "")
            throw new Exception("请选择分类");

        int 首页 = Convert.ToInt32(ShouYe.Text);
        int 尾页 = Convert.ToInt32(WeiYe.Text);
        int 所属分类 = Convert.ToInt32(SuoShuFenLei.SelectedValue);
        String 标题样式_颜色 = BianTiYangShi_YanSe.Text;
        bool 标题样式_粗体 = BiaoTiYangShi_ChuTi.Checked;
        bool 标题样式_斜体 = BiaoTiYangShi_XieTi.Checked;
        bool 标题样式_删除线 = BiaoTiYangShi_ShanChuXian.Checked;
        bool 是否推荐 = ShiFouTuiJian.Checked;
        int 一页显示图片数 = Convert.ToInt32(YiYeXianShiTuPianShu.Text);
        bool 是否关闭评论 = ShiFouGuanBiPingLun.Checked;
        bool 是否增加水印 = ZengJiaShuiYin.Checked;
        int 内容模板 = Convert.ToInt32(NeiRongMoBan.SelectedValue);
        int 内容模板_3G = Convert.ToInt32(NeiRongMoBan_3G.SelectedValue);
        int 评论模板 = Convert.ToInt32(PingLunMoBan.SelectedValue);
        int 评论模板_3G = Convert.ToInt32(PingLunMoBan_3G.SelectedValue);
        bool 权限_仅限会员 = QuanXian_JinXianHuiYuan.Checked;
        int 权限_需要等级 = Convert.ToInt32(QuanXian_XuYaoDenJi.Text);
        int 权限_扣除积分 = Convert.ToInt32(QuanXian_KouChuJiFen.Text);
        当前时间 = DateTime.Now;
        String 当前地址 = 采集栏目["开始列表地址"].ToString();

        Response.Write("<style type=\"text/css\">body{font-size:12px}</style>");

        for (int i = 1; i < 99999999; i++)
        {
            if (!Response.IsClientConnected)
                Response.End();
            int 状态 = 0;
            if (尾页 == 0)
            {
                if (i < 首页)
                    状态 = 2;
                else
                    状态 = 1;
            }
            else
            {
                if (i > 尾页)
                    状态 = 0;
                else
                {
                    if (i < 首页)
                        状态 = 2;
                    else
                        状态 = 1;
                }
            }

            if (状态 == 0)
                break;

            图片采集 图片采集 = new 图片采集(this.Context, 访问.连接, 网站ID);
            String 网页内容 = 图片采集.获取网页内容(当前地址);
            if (状态 == 1)
            {
                Hashtable 标题地址;
                图片采集.获取标题和地址(当前地址, 网页内容,
                    Convert.ToBoolean(采集栏目["标题和地址_是否通配符"]),
                    Convert.ToString(采集栏目["标题和地址_表达式"]),
                    out 标题地址);

                输出内容("共" + 标题地址.Count + "组图片");

                foreach (int 键 in 标题地址.Keys)
                {
                    if (!Response.IsClientConnected)
                        Response.End();
                    String[] 数组 = (String[])标题地址[键];
                    if(GuoLvChongFu.Checked)
                        if (是否重复信息(数组[1]))
                        {
                            输出内容("正在跳过数据：" + Server.HtmlEncode(数组[1]));
                            continue;
                        }

                    输出内容("正在采集图片：" + Server.HtmlEncode(数组[1]));
                    输出内容("正在获取数据：<a href=\"" + Server.HtmlEncode(数组[0]) + "\" target=\"_blank\">" + Server.HtmlEncode(数组[0]) + "</a>");

                    String 文件资源 = 图片采集.获取图片内容(数组[0],
                        Convert.ToBoolean(采集栏目["图片地址_是否通配符"]),
                        Convert.ToString(采集栏目["图片地址_表达式"]),
                        Convert.ToBoolean(采集栏目["图片下页_是否通配符"]),
                        Convert.ToString(采集栏目["图片下页_表达式"]),
                        Convert.ToString(采集栏目["图片过滤"]));

                    int ZGID = 常用.SQL_最高ID(访问.连接, 程序.数据表前缀 + "内容_图片_图片");

                    String 文件夹位置 = "~/Data/DT_TuPian/" + (ZGID /500) + "/";
                    if (!Directory.Exists(Server.MapPath(文件夹位置)))
                        Directory.CreateDirectory(Server.MapPath(文件夹位置));
                    String 图片文件夹 = "~/Data/DT_TuPian/IMG_" + (ZGID /500) + "/";
                    if (!Directory.Exists(Server.MapPath(图片文件夹)))
                        Directory.CreateDirectory(Server.MapPath(图片文件夹));

                    文件资源 = 保存图片(ZGID, 文件资源,ZengJiaShuiYin.Checked);
                    输出内容("正在保存图片：" + Server.HtmlEncode(数组[1]));

                    SqlCommand 语句 = new SqlCommand("INSERT INTO [" + 程序.数据表前缀 + "内容_图片_图片]" +
                        "([ID],[所属栏目],[标题],[标题样式_粗体],[标题样式_斜体],[标题样式_删除线],[标题样式_颜色],[是否推荐],[是否审核],[是否删除],[外部链接],[发布时间],[一页显示图片数],[是否关闭评论],[内容模板],[3G内容模板],[评论模板],[3G评论模板],[权限_仅限会员],[权限_需要等级],[权限_扣除积分],[文件资源])" +
                        "VALUES(" + ZGID + ",@所属栏目,@标题,@标题样式_粗体,@标题样式_斜体,@标题样式_删除线,@标题样式_颜色,@是否推荐,@是否审核,@是否删除,@外部链接,@发布时间,@一页显示图片数,@是否关闭评论,@内容模板,@3G内容模板,@评论模板,@3G评论模板,@权限_仅限会员,@权限_需要等级,@权限_扣除积分,@文件资源)", 访问.连接);
                    语句.Parameters.Add("@所属栏目", SqlDbType.Int).Value = 所属分类;
                    语句.Parameters.Add("@标题", SqlDbType.NVarChar).Value = 数组[1];
                    语句.Parameters.Add("@标题样式_粗体", SqlDbType.Bit).Value = 标题样式_粗体;
                    语句.Parameters.Add("@标题样式_斜体", SqlDbType.Bit).Value = 标题样式_斜体;
                    语句.Parameters.Add("@标题样式_删除线", SqlDbType.Bit).Value = 标题样式_删除线;
                    语句.Parameters.Add("@标题样式_颜色", SqlDbType.NVarChar).Value = 标题样式_颜色;
                    语句.Parameters.Add("@是否推荐", SqlDbType.Bit).Value = 是否推荐;
                    语句.Parameters.Add("@是否审核", SqlDbType.Bit).Value = !访问.是否包含权限("46");
                    语句.Parameters.Add("@是否删除", SqlDbType.Bit).Value = false;
                    语句.Parameters.Add("@外部链接", SqlDbType.NVarChar).Value = "";
                    语句.Parameters.Add("@发布时间", SqlDbType.DateTime).Value = 当前时间;
                    语句.Parameters.Add("@一页显示图片数", SqlDbType.Int).Value = 一页显示图片数;
                    语句.Parameters.Add("@是否关闭评论", SqlDbType.Bit).Value = 是否关闭评论;
                    语句.Parameters.Add("@内容模板", SqlDbType.Int).Value = 内容模板;
                    语句.Parameters.Add("@3G内容模板", SqlDbType.Int).Value = 内容模板_3G;
                    语句.Parameters.Add("@评论模板", SqlDbType.Int).Value = 评论模板;
                    语句.Parameters.Add("@3G评论模板", SqlDbType.Int).Value = 评论模板_3G;
                    语句.Parameters.Add("@权限_仅限会员", SqlDbType.Bit).Value = 权限_仅限会员;
                    语句.Parameters.Add("@权限_需要等级", SqlDbType.Int).Value = 权限_需要等级;
                    语句.Parameters.Add("@权限_扣除积分", SqlDbType.Int).Value = 权限_扣除积分;
                    语句.Parameters.Add("@文件资源", SqlDbType.NVarChar).Value = 文件资源;
                    语句.ExecuteNonQuery();

                    if (ShiFouDaoXu.Checked)
                        当前时间 = 当前时间 - new TimeSpan(0, 0, 1);
                }
            }

            当前地址 = 图片采集.获取下页地址(当前地址, 网页内容,
                Convert.ToBoolean(采集栏目["下页地址_是否通配符"]),
                Convert.ToString(采集栏目["下页地址_表达式"]),
                i + 1);

            if (当前地址 == "")
                break;

            输出内容("跳转至第" + (i + 1) + "页");
        }

        输出内容("采集完成。。");

        Response.Write(@"
<script type=""text/javascript"">
location.href='" + Request.QueryString["rurl"] + @"';
</script>
");
        Response.End();
    }
    private String 保存图片(int ZGID, String 所有图片,bool 是否增加水印)
    {
        String[] 图片数组 = 所有图片.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        String 返回值 = "";
        设置 图片数据 = new 设置("");
        
        int 图片缩放宽度 = Convert.ToInt32(采集栏目["图片缩放_宽度"]);
        int 图片缩放高度 = Convert.ToInt32(采集栏目["图片缩放_高度"]);

        int i1 = 1;
        for (int i = 0; i < 图片数组.Length; i++)
        {
            String 后缀 = Path.GetExtension(图片数组[i]).Substring(1);
            if (常用.是否允许后缀("gif,jpg,jpe,jpeg,png,tif,tiff,bmp", 后缀))
            {
                输出内容("正在下载图片：" + Server.HtmlEncode(图片数组[i]));
                String 随机值 = "T" + ZGID + 常用.随机字符(30);
                String 文件名 = 程序.安装位置 + "Data/DT_TuPian/IMG_" + (ZGID /500) + "/" + 随机值 + "." + 后缀;
                常用.下载文件(图片数组[i], Server.MapPath(文件名));

                if (图片缩放宽度 > 0 && 图片缩放高度 > 0)
                    常用.缩放图片(Server.MapPath(文件名), 图片缩放宽度, 图片缩放高度);

                if (是否增加水印)
                    new 水印().增加水印(Server.MapPath(文件名));
                返回值 += 返回值 == "" ? "" : ",";
                返回值 += 文件名;
                图片数据[i1] = Server.HtmlEncode(文件名) + "\"";
                i1++;
            }
        }

        File.WriteAllText(Server.MapPath(程序.安装位置 + "Data/DT_TuPian/" + (ZGID /500) + "/" + ZGID + ".xml"),
            图片数据.生成XML(),Encoding.UTF8);

        return 返回值;
    }
    private bool 是否重复信息(String 标题)
    {
        bool 返回值;
        SqlCommand 语句 = new SqlCommand("SELECT [ID] FROM [" + 程序.数据表前缀 + "内容_图片_图片] WHERE [标题]=@标题", 访问.连接);
        语句.Parameters.Add("@标题", SqlDbType.NVarChar).Value = 标题;
        SqlDataReader 读取 = 语句.ExecuteReader();
        返回值 = 读取.HasRows;
        读取.Close();

        return 返回值;
    }
    private int 信息位置 = 0;
    private DateTime 当前时间;
    private void 输出内容(String 信息内容)
    {
        Response.Write("<a name=\"w" + 信息位置 + "\">_</a>");
        Response.Write(信息内容);
        Response.Write("<br/>");
        Response.Write(@"<script type=""text/javascript"">
location.href='#w" + 信息位置 + @"';
</script>");
        Response.Flush();
        信息位置++;
    }

    private void 生成列表(DataSet 数据, int 父栏目, int 深度)
    {
        for (int i = 0; i < 数据.Tables[0].Rows.Count; i++)
        {
            DataRow 行 = 数据.Tables[0].Rows[i];
            if (Convert.ToInt32(行["所属栏目"]) == 父栏目)
            {
                ListItem 列表项 = new ListItem(生成空格(深度) + Convert.ToString(行["栏目名称"]), Convert.ToString(行["ID"]));
                列表项.Attributes["style"] = Convert.ToBoolean(行["是否拥有子栏目"]) ? "" : "background:#eeeeee";
                SuoShuFenLei.Items.Add(列表项);
                生成列表(数据, Convert.ToInt32(行["ID"]), 深度 + 1);
            }
        }
    }

    private String 生成空格(int 数量)
    {
        String 返回值 = "";
        for (int i = 0; i < 数量; i++)
            返回值 += "　";
        return 返回值 + "|-";
    }

    private void 初始化()
    {
        NeiRongMoBan.Items.Add(new ListItem("默认模板", "0"));
        NeiRongMoBan_3G.Items.Add(new ListItem("默认模板", "0"));
        PingLunMoBan.Items.Add(new ListItem("默认模板", "0"));
        PingLunMoBan_3G.Items.Add(new ListItem("默认模板", "0"));

        FileInfo[] FIS = new DirectoryInfo(Server.MapPath("~/Template/Content/" + 程序.设置["默认模板"] + "/Content/")).GetFiles();

        for (int i = 0; i < FIS.Length; i++)
        {
            int ID = 0;
            String 模板名称 = "";
            String 模板类型 = "";
            String _内容类型 = "";
            bool 是否WAP = true;

            XmlReader 读取 = XmlReader.Create(FIS[i].OpenRead());
            while (读取.Read())
                if (读取.NodeType == XmlNodeType.Element)
                    if (读取.Name == "set")
                        if (读取.GetAttribute("name") == "ID")
                            ID = Convert.ToInt32(读取.GetAttribute("value"));
                        else if (读取.GetAttribute("name") == "模板名称")
                            模板名称 = 读取.GetAttribute("value");
                        else if (读取.GetAttribute("name") == "模板类型")
                            模板类型 = 读取.GetAttribute("value");
                        else if (读取.GetAttribute("name") == "内容类型")
                            _内容类型 = 读取.GetAttribute("value");
                        else if (读取.GetAttribute("name") == "是否WAP")
                            是否WAP = Convert.ToBoolean(读取.GetAttribute("value"));
            读取.Close();

            if (_内容类型 == "图片")
                switch (模板类型)
                {
                    case "查看内容":
                        if (是否WAP)
                            NeiRongMoBan.Items.Add(new ListItem(模板名称, ID.ToString()));
                        else
                            NeiRongMoBan_3G.Items.Add(new ListItem(模板名称, ID.ToString()));
                        break;
                    case "评论列表":
                        if (是否WAP)
                            PingLunMoBan.Items.Add(new ListItem(模板名称, ID.ToString()));
                        else
                            PingLunMoBan_3G.Items.Add(new ListItem(模板名称, ID.ToString()));
                        break;
                }
        }

        DataSet 内容栏目 = new DataSet();
        SqlCommand 语句 = new SqlCommand("SELECT [ID],[栏目名称],[所属栏目],[是否拥有子栏目] FROM [" + 程序.数据表前缀 + "内容_栏目] WHERE [栏目类型]='图片'", 访问.连接);
        SqlDataAdapter 填充 = new SqlDataAdapter(语句);
        填充.Fill(内容栏目, "内容栏目");

        生成列表(内容栏目, 0, 1);
    }
}
