using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Text;
using System.Reflection;
using System.Collections;
using System.Data.Common;
using System.Xml;
using System.Web.Script.Serialization;
namespace BeginScreen
{
    /// 
    /// Handler1 的摘要说明
    /// 
    public abstract class Handler1 : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        public virtual void OnInit()
        {
        }
        #region 虚 方法
        public void ProcessRequest(HttpContext context)
        {
            OnInit();
            context.Response.ContentType = "text/plain";
            //context.Response.ContentType = "application/json";
            context.Response.Buffer = true;
            context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
            context.Response.AddHeader("pragma", "no-cache");
            context.Response.AddHeader("cache-control", "");
            context.Response.CacheControl = "no-cache";
            try
            {
                if (HttpContext.Current.Request["cmd"] != null)
                {
                    //if (HttpContext.Current.Session["userName"] == null && HttpContext.Current.Request["cmd"] != "userLogin")
                    //{
                    //    string json = ToJson("SessionOut");
                    //    context.Response.Write(json);//返回给前台页面  
                    //    context.Response.End();
                    //}
                    string cmd = HttpContext.Current.Request["cmd"];
                    var method = this.GetType().GetMethod(cmd);
                    if (method != null)
                    {
                        method.Invoke(this, new object[] { context });
                    }
                }
            }
            catch (Exception)
            {
            }
        }
        #endregion
        #region DataTable转换成Json格式
        ///   
        /// DataTable转换成Json格式    分页格式
        ///     
        /// DataSet   
        ///     
        public static string Dataset2Json(DataTable dt, int total = -1)
        {
            StringBuilder json = new System.Text.StringBuilder();
            //{"total":5,"rows":[  
            json.Append("{\"total\":");
            if (total == -1)
            {
                json.Append(dt.Rows.Count);
            }
            else
            {
                json.Append(total);
            }
            json.Append(",\"rows\":[");
            //json.Append("[");
            json.Append(DataTable2Json(dt));
            json.Append("]}");
            return json.ToString();
        }
        #endregion
        /// 
        /// 不需要分页的Json格式
        /// 
        /// 
        /// 
        public static string Dataset1Json(DataTable dt)
        {
            StringBuilder jsonBuilder = new StringBuilder();
            jsonBuilder.Append("[");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                jsonBuilder.Append("{");
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    jsonBuilder.Append("\"");
                    jsonBuilder.Append(dt.Columns[j].ColumnName);
                    jsonBuilder.Append("\":\"");
                    jsonBuilder.Append(dt.Rows[i][j].ToString());
                    jsonBuilder.Append("\",");
                }
                if (dt.Columns.Count > 0)
                {
                    jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
                }
                jsonBuilder.Append("},");
            }
            if (dt.Rows.Count > 0)
            {
                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            }
            jsonBuilder.Append("]");
            return jsonBuilder.ToString();
        }
        #region  sql语句分页
        public string GetListByPage(string tbName, string strWhere, string orderby, int startIndex, int endIndex)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("SELECT * FROM ( ");
            strSql.Append(" SELECT ROW_NUMBER() OVER (");
            if (!string.IsNullOrEmpty(orderby.Trim()))
            {
                strSql.Append("order by T." + orderby);
            }
            else
            {
                strSql.Append("order by T.Id desc");
            }
            strSql.Append(")AS Row, T.*  from " + tbName + " T ");
            if (!string.IsNullOrEmpty(strWhere.Trim()))
            {
                strSql.Append(" WHERE " + strWhere);
            }
            strSql.Append(" ) TT");
            strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);
            return strSql.ToString();
        }
        #endregion
        #region dataTable转换成Json格式
        ///     
        /// dataTable转换成Json格式   子方法 
        ///     
        ///     
        ///     
        public static string DataTable2Json(DataTable dt)
        {
            StringBuilder jsonBuilder = new StringBuilder();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                jsonBuilder.Append("{");
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    jsonBuilder.Append("\"");
                    jsonBuilder.Append(dt.Columns[j].ColumnName);
                    jsonBuilder.Append("\":\"");
                    jsonBuilder.Append(dt.Rows[i][j].ToString());
                    jsonBuilder.Append("\",");
                }
                if (dt.Columns.Count > 0)
                {
                    jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
                }
                jsonBuilder.Append("},");
            }
            if (dt.Rows.Count > 0)
            {
                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            }
            return jsonBuilder.ToString();
        }
        #endregion dataTable转换成Json格式
        #region 私有方法
        /// 
        /// 过滤特殊字符
        /// 
        private static string String2Json(String s)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.Length; i++)
            {
                char c = s.ToCharArray()[i];
                switch (c)
                {
                    case '\"':
                        sb.Append("\\\""); break;
                    case '\\':
                        sb.Append("\\\\"); break;
                    case '/':
                        sb.Append("\\/"); break;
                    case '\b':
                        sb.Append("\\b"); break;
                    case '\f':
                        sb.Append("\\f"); break;
                    case '\n':
                        sb.Append("\\n"); break;
                    case '\r':
                        sb.Append("\\r"); break;
                    case '\t':
                        sb.Append("\\t"); break;
                    default:
                        sb.Append(c); break;
                }
            }
            return sb.ToString();
        }
        /// 
        /// 格式化字符型、日期型、布尔型
        /// 
        private static string StringFormat(string str, Type type)
        {
            if (type == typeof(string))
            {
                str = String2Json(str);
                str = "\"" + str + "\"";
            }
            else if (type == typeof(DateTime))
            {
                str = "\"" + str + "\"";
            }
            else if (type == typeof(bool))
            {
                str = str.ToLower();
            }
            else if (type != typeof(string) && string.IsNullOrEmpty(str))
            {
                str = "\"" + str + "\"";
            }
            return str;
        }
        #endregion
        #region List转换成Json
        /// 
        /// List转换成Json
        /// 
        public static string ListToJson(IList list)
        {
            object obj = list[0];
            return ListToJson(list, obj.GetType().Name);
        }
        /// 
        /// List转换成Json 
        /// 
        public static string ListToJson(IList list, string jsonName)
        {
            StringBuilder Json = new StringBuilder();
            if (string.IsNullOrEmpty(jsonName)) jsonName = list[0].GetType().Name;
            Json.Append("{\"" + jsonName + "\":[");
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    T obj = Activator.CreateInstance();
                    PropertyInfo[] pi = obj.GetType().GetProperties();
                    Json.Append("{");
                    for (int j = 0; j < pi.Length; j++)
                    {
                        Type type = pi[j].GetValue(list[i], null).GetType();
                        Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(pi[j].GetValue(list[i], null).ToString(), type));
                        if (j < pi.Length - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < list.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}");
            return Json.ToString();
        }
        #endregion
        #region 对象转换为Json
        ///  
        /// 对象转换为Json 
        ///  
        /// 对象 
        /// Json字符串 
        public static string ToJson(object jsonObject)
        {
            string jsonString = "{";
            PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties();
            for (int i = 0; i < propertyInfo.Length; i++)
            {
                object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);
                string value = string.Empty;
                if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan)
                {
                    value = "'" + objectValue.ToString() + "'";
                }
                else if (objectValue is string)
                {
                    value = "'" + ToJson(objectValue.ToString()) + "'";
                }
                else if (objectValue is IEnumerable)
                {
                    value = ToJson((IEnumerable)objectValue);
                }
                else
                {
                    value = ToJson(objectValue.ToString());
                }
                jsonString += "\"" + ToJson(propertyInfo[i].Name) + "\":" + value + ",";
            }
            //jsonString.Remove(jsonString.Length - 1, jsonString.Length);
            jsonString = jsonString.Substring(0, jsonString.Length - 1);
            return jsonString + "}";
        }
        #endregion
        #region 对象集合转换Json
        ///  
        /// 对象集合转换Json 
        ///  
        /// 集合对象 
        /// Json字符串 
        public static string ToJson(IEnumerable array)
        {
            string jsonString = "[";
            foreach (object item in array)
            {
                jsonString += ToJson(item) + ",";
            }
            //jsonString.Remove(jsonString.Length - 1, jsonString.Length);
            jsonString = jsonString.Substring(0, jsonString.Length - 1);
            return jsonString + "]";
        }
        #endregion
        #region 普通集合转换Json
        ///  
        /// 普通集合转换Json 
        ///  
        /// 集合对象 
        /// Json字符串 
        public static string ToArrayString(IEnumerable array)
        {
            string jsonString = "[";
            foreach (object item in array)
            {
                jsonString = ToJson(item.ToString()) + ",";
            }
            jsonString.Remove(jsonString.Length - 1, jsonString.Length);
            return jsonString + "]";
        }
        #endregion
        #region  DataSet转换为Json
        ///  
        /// DataSet转换为Json 
        ///  
        /// DataSet对象 
        /// Json字符串 
        public static string ToJson(DataSet dataSet)
        {
            string jsonString = "{";
            foreach (DataTable table in dataSet.Tables)
            {
                jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";
            }
            jsonString = jsonString.TrimEnd(',');
            return jsonString + "}";
        }
        #endregion
        #region Datatable转换为Json
        ///  
        /// Datatable转换为Json 
        ///  
        /// Datatable对象 
        /// Json字符串 
        public static string ToJson(DataTable dt)
        {
            StringBuilder jsonString = new StringBuilder();
            jsonString.Append("[");
            DataRowCollection drc = dt.Rows;
            for (int i = 0; i < drc.Count; i++)
            {
                jsonString.Append("{");
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    string strKey = dt.Columns[j].ColumnName;
                    string strValue = drc[i][j].ToString();
                    Type type = dt.Columns[j].DataType;
                    jsonString.Append("\"" + strKey + "\":");
                    strValue = StringFormat(strValue, type);
                    if (j < dt.Columns.Count - 1)
                    {
                        jsonString.Append(strValue + ",");
                    }
                    else
                    {
                        jsonString.Append(strValue);
                    }
                }
                jsonString.Append("},");
            }
            jsonString.Remove(jsonString.Length - 1, 1);
            jsonString.Append("]");
            return jsonString.ToString();
        }
        /// 
        /// DataTable转换为Json 
        /// 
        public static string ToJson(DataTable dt, string jsonName)
        {
            StringBuilder Json = new StringBuilder();
            if (string.IsNullOrEmpty(jsonName)) jsonName = dt.TableName;
            Json.Append("{\"" + jsonName + "\":[");
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Json.Append("{");
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        Type type = dt.Rows[i][j].GetType();
                        Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j].ToString(), type));
                        if (j < dt.Columns.Count - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < dt.Rows.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}");
            return Json.ToString();
        }
        #endregion
        #region DataReader转换为Json
        ///  
        /// DataReader转换为Json 
        ///  
        /// DataReader对象 
        /// Json字符串 
        public static string ToJson(DbDataReader dataReader)
        {
            StringBuilder jsonString = new StringBuilder();
            jsonString.Append("[");
            while (dataReader.Read())
            {
                jsonString.Append("{");
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    Type type = dataReader.GetFieldType(i);
                    string strKey = dataReader.GetName(i);
                    string strValue = dataReader[i].ToString();
                    jsonString.Append("\"" + strKey + "\":");
                    strValue = StringFormat(strValue, type);
                    if (i < dataReader.FieldCount - 1)
                    {
                        jsonString.Append(strValue + ",");
                    }
                    else
                    {
                        jsonString.Append(strValue);
                    }
                }
                jsonString.Append("},");
            }
            dataReader.Close();
            jsonString.Remove(jsonString.Length - 1, 1);
            jsonString.Append("]");
            return jsonString.ToString();
        }
        #endregion
        #region 错误处理方法
        public class message
        {
            public message(bool success, string msg, string countPage, string workerCurrentPage)
            {
                this.msg = msg;
                this.success = success;
                this.countPage = countPage;
                this.workerCurrentPage = workerCurrentPage;
            }
            public bool success { get; set; }
            public string msg { get; set; }
            public string countPage { get; set; }
            public string workerCurrentPage { get; set; }
        }
        public class message1
        {
            public message1(bool success, string html, string msg, string systemType, string sendType,int messId, string countPage, string workerCurrentPage)
            {
                this.msg = msg;
                this.success = success;
                this.html = html;
                this.countPage = countPage;
                this.workerCurrentPage = workerCurrentPage;
                this.sendType = sendType;
                this.systemType = systemType;
                this.messId = messId;
            }
            public int messId { get; set; }
            public bool success { get; set; }
            public string html { get; set; }
            public string msg { get; set; }
            public string countPage { get; set; }
            public string workerCurrentPage { get; set; }
            public string sendType { get; set; }
            public string systemType { get; set; }
        }
        public string Error2String(ENTValidationError.ENTValidationErrors validationErrors)
        {
            string errText = "";
            foreach (ENTValidationError validationError in validationErrors)
            {
                if (errText.Length > 0)
                {
                    errText += "\r\n";
                }
                errText += validationError.ErrorMessage;
            }
            return errText;
        }
        #endregion
        #region  字符串int验证
        public static bool CheckInt(string strValue)
        {
            if (strValue == null || strValue == "")
            {
                return false;
            }
            else
            {
                return System.Text.RegularExpressions.Regex.IsMatch(strValue, @"^\d*$");
            }
        }
        #endregion
        #region DataTable转xml格式字符串
        public static string Serialize(DataTable dt)
        {
            string zqSpecial = "";
            string xmlName = "";
            string xmlNameEnd = "";
            string xmlValuse = "";
            string xmlValuseEnd = "";
            if (dt.Rows.Count <= 0) return "";
            foreach (DataRow row in dt.Rows)
            {
                zqSpecial += "";
                zqSpecial += xmlName + row["name"].ToString() + xmlNameEnd;
                zqSpecial += xmlValuse + ConvertXml(row["value"].ToString()) + xmlValuseEnd;
                zqSpecial += "";
            }
            return "" + zqSpecial + "";
        }
        #endregion
        #region ShiftXML处理
        /// 
        /// 处理交班记录Xml
        /// 
        /// 
        /// 
        public static string SerializeShiftXml(DataTable dt)
        {
            string zqSpecial = "";
            string sign = "";
            string signend = "";
            string xmlName = "";
            string xmlNameEnd = "";
            string xmlValuse = "";
            string xmlValuseEnd = "";
            string xmlFlag = "";
            string xmlFlagEnd = "";
            string xmlShift = "";
            string xmlShiftEnd = "";
            if (dt.Rows.Count <= 0) return "";
            foreach (DataRow row in dt.Rows)
            {
                zqSpecial += "";
                zqSpecial += sign + row["sign"].ToString() + signend;
                zqSpecial += xmlName + row["name"].ToString() + xmlNameEnd;
                zqSpecial += xmlValuse + ConvertXml(row["value"].ToString()) + xmlValuseEnd;
                zqSpecial += xmlFlag + ConvertXml(row["flag"].ToString()) + xmlFlagEnd;
                zqSpecial += xmlShift + ConvertXml(row["shift"].ToString()) + xmlShiftEnd;
                zqSpecial += "";
            }
            return "" + zqSpecial + "";
        }
        public static DataTable AnalysisShiftXML(string xml, int id)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            DataTable dt = new DataTable("Datas");
            dt.Columns.Add("sign", Type.GetType("System.String"));
            dt.Columns.Add("name", Type.GetType("System.String"));
            dt.Columns.Add("value", Type.GetType("System.String"));
            dt.Columns.Add("flag", Type.GetType("System.String"));
            XmlNodeList rows = doc.GetElementsByTagName("root");
            foreach (XmlNode xn in rows)
            {
                DataRow dr = dt.NewRow();
                for (int i = 1; i < xn.ChildNodes.Count - 1; i++)
                {
                    dr[i] = xn.ChildNodes[i].InnerText;
                    if (xn.ChildNodes[1].InnerText == "ShiftId")
                    {
                        dr["value"] = id;
                    }
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion
        #region XML转义字符处理 frank
        /// 
        /// XML转义字符处理
        /// 
        public static string ConvertXml(string xml)
        {
            xml = (char)1 + xml;   //为了避免首字母为要替换的字符,前加前缀
            for (int intNext = 0; true; )
            {
                int intIndexOf = xml.IndexOf("&", intNext);
                intNext = intIndexOf + 1;  //避免&被重复替换
                if (intIndexOf <= 0)
                {
                    break;
                }
                else
                {
                    xml = xml.Substring(0, intIndexOf) + "&" + xml.Substring(intIndexOf + 1);
                }
            }
            for (; true; )
            {
                int intIndexOf = xml.IndexOf("<");
                if (intIndexOf <= 0)
                {
                    break;
                }
                else
                {
                    xml = xml.Substring(0, intIndexOf) + "<" + xml.Substring(intIndexOf + 1);
                }
            }
            for (; true; )
            {
                int intIndexOf = xml.IndexOf(">");
                if (intIndexOf <= 0)
                {
                    break;
                }
                else
                {
                    xml = xml.Substring(0, intIndexOf) + ">" + xml.Substring(intIndexOf + 1);
                }
            }
            for (; true; )
            {
                int intIndexOf = xml.IndexOf("\"");
                if (intIndexOf <= 0)
                {
                    break;
                }
                else
                {
                    xml = xml.Substring(0, intIndexOf) + """ + xml.Substring(intIndexOf + 1);
                }
            }
            for (; true; )
            {
                int intIndexOf = xml.IndexOf("'");
                if (intIndexOf <= 0)
                {
                    break;
                }
                else
                {
                    xml = xml.Substring(0, intIndexOf) + "'" + xml.Substring(intIndexOf + 1);
                }
            }
            return xml.Replace(((char)1).ToString(), "");
        }
        #endregion
        #region 解析xml生成DataTable frank
        public static DataTable AnalysisXML(string xml)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            DataTable dt = new DataTable("Datas");
            dt.Columns.Add("name", Type.GetType("System.String"));
            dt.Columns.Add("value", Type.GetType("System.String"));
            XmlNodeList rows = doc.GetElementsByTagName("root");
            foreach (XmlNode xn in rows)
            {
                DataRow dr = dt.NewRow();
                for (int i = 0; i < xn.ChildNodes.Count; i++)
                {
                    dr[i] = xn.ChildNodes[i].InnerText;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion
        #region Json 字符串 转换为 DataTable数据集合
        ///   
        /// Json 字符串 转换为 DataTable数据集合  
        ///   
        ///   
        ///   
        public static DataTable ToDataTable(string json)
        {
            DataTable dataTable = new DataTable();  //实例化  
            DataTable result;
            try
            {
                JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
                javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值  
                ArrayList arrayList = javaScriptSerializer.Deserialize(json);
                if (arrayList.Count > 0)
                {
                    foreach (Dictionary dictionary in arrayList)
                    {
                        if (dictionary.Keys.Count() == 0)
                        {
                            result = dataTable;
                            return result;
                        }
                        if (dataTable.Columns.Count == 0)
                        {
                            foreach (string current in dictionary.Keys)
                            {
                                dataTable.Columns.Add(current, dictionary[current].GetType());
                            }
                        }
                        DataRow dataRow = dataTable.NewRow();
                        foreach (string current in dictionary.Keys)
                        {
                            dataRow[current] = dictionary[current];
                        }
                        dataTable.Rows.Add(dataRow); //循环添加行到DataTable中  
                    }
                }
            }
            catch
            {
            }
            result = dataTable;
            return result;
        }
        #endregion
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}