using System;
using System.Text;
using System.Collections;
using System.Security.Cryptography;
using System.Web;
using System.IO;
using System.Drawing;

public class Util
{
	public static string TruncStr(string str, int len)
	{
		if (str.Length <= len)
		{
			return str;
		}
		else
		{
			return str.Substring(len);
		}
	}

	public static string GenRand()
	{
		return ByteToStr(Hash(Guid.NewGuid().ToByteArray()));
	}

	public static bool StrCmpi(string s1, string s2)
	{
		try
		{
			if (s1.ToUpper() == s2.ToUpper())
			{
				return true;
			}

			return false;
		}
		catch
		{
			return false;
		}
	}

	public static bool StrCmp(string s1, string s2)
	{
		try
		{
			if (s1 == s2)
			{
				return true;
			}

			return false;
		}
		catch
		{
			return false;
		}
	}

	public static Encoding UTF8()
	{
		return Encoding.UTF8;
	}

	public static Encoding EucJP()
	{
		return Encoding.GetEncoding("euc-jp");
	}

	public static Encoding ShiftJIS()
	{
		return Encoding.GetEncoding("shift_jis");
	}

	public static byte[] Hash(string str)
	{
		return Hash(Encoding.UTF8.GetBytes(str));
	}

	public static byte[] Hash(byte[] data)
	{
		SHA1 sha1 = SHA1.Create();
		return sha1.ComputeHash(data);
	}

	public static string ByteToStr(byte[] data)
	{
		StringBuilder sb = new StringBuilder();
		foreach (byte b in data)
		{
			sb.Append(b.ToString("X2"));
		}

		return sb.ToString();
	}

	public static string RandToStr6(string rand)
	{
		byte[] hash = Hash(rand + "packetix.net");
		return ByteToStr(hash).Substring(0, 6);
	}

	public static bool CheckImageRand(string rand, string str)
	{
		string s = RandToStr6(rand);
		string tmp = str.ToUpper();
		tmp = tmp.Replace("O", "0").Replace("I", "1");
		return StrCmpi(s, tmp);
	}

	public static bool IsAscii(char c)
	{
		if (c >= '0' && c <= '9')
		{
			return true;
		}
		if (c >= 'A' && c <= 'Z')
		{
			return true;
		}
		if (c >= 'a' && c <= 'z')
		{
			return true;
		}
		if (c == '!' || c == '\"' || c == '#' || c == '$' || c == '%' || c == '&' || c == '\'' ||
			c == '(' || c == ')' || c == '-' || c == ' ' || c == '=' || c == '~' || c == '^' || c == '_' ||
			c == '\\' || c == '|' || c == '{' || c == '}' || c == '[' || c == ']' || c == '@' ||
			c == '*' || c == '+' || c == '.' || c == '<' || c == '>' ||
			c == ',' || c == '?' || c == '/')
		{
			return true;
		}
		return false;
	}
	public static bool IsAscii(string str)
	{
		foreach (char c in str)
		{
			if (IsAscii(c) == false)
			{
				return false;
			}
		}
		return true;
	}

	public static bool CheckMailAddress(string str)
	{
		str = str.Trim();
		if (str.Length == 0)
		{
			return false;
		}

		string[] tokens = str.Split('@');

		if (tokens.Length != 2)
		{
			return false;
		}

		string a = tokens[0];
		string b = tokens[1];

		if (a.Length == 0 || b.Length == 0)
		{
			return false;
		}

		if (b.IndexOf(".") == -1)
		{
			return false;
		}

		return IsAscii(str);
	}

	public static string GetFileSizeStr(int size)
	{
		if (size >= 1024 * 1024)
		{
			return ((double)(size) / 1024.0f / 1024.0f).ToString(".##") + " MB";
		}
		if (size >= 1024)
		{
			return ((double)(size) / 1024.0f).ToString(".##") + " KB";
		}
		return ((double)(size)).ToString() + " Bytes";
	}


	public static string IntToStr(int i)
	{
		return i.ToString();
	}
	public static string IntToStr(uint i)
	{
		return i.ToString();
	}

	public static string LongToStr(long i)
	{
		return i.ToString();
	}
	public static string LongToStr(ulong i)
	{
		return i.ToString();
	}

	public static int StrToInt(string str)
	{
		try
		{
			return int.Parse(str);
		}
		catch
		{
			try
			{
				return (int)double.Parse(str);
			}
			catch
			{
				return 0;
			}
		}
	}
	public static uint StrToUInt(string str)
	{
		try
		{
			return uint.Parse(str);
		}
		catch
		{
			return 0;
		}
	}

	public static long StrToLong(string str)
	{
		try
		{
			return long.Parse(str);
		}
		catch
		{
			return 0;
		}
	}
	public static ulong StrToULong(string str)
	{
		try
		{
			return ulong.Parse(str);
		}
		catch
		{
			return 0;
		}
	}

	public static DateTime StrToDate(string str)
	{
		DateTime ret = new DateTime(0);
		str = str.Trim();
		if (str.Length == 8)
		{
			int year = StrToInt(str.Substring(0, 4));
			int month = StrToInt(str.Substring(4, 2));
			int day = StrToInt(str.Substring(6, 2));

			ret = new DateTime(year, month, day);
		}
		return ret;
	}

	public static string SafeSql(string str)
	{
		return str.Replace("'", "");
	}

	public static bool IsFileExists(string name)
	{
		try
		{
			return File.Exists(name);
		}
		catch
		{
			return false;
		}
	}

	public static string GetDefaultDocumentIfExists(string dir)
	{
		string[] targets =
			{
				"default.aspx",
				"default.asp",
				"default.html",
				"default.htm",
				"index.html",
				"index.htm",
			};

		foreach (string s in targets)
		{
			string name = dir + s;

			if (IsFileExists(name))
			{
				return name;
			}
		}

		return null;
	}

	public static string ReadHtmlFile(string filename)
	{
		return File.ReadAllText(filename, Encoding.GetEncoding("shift_jis"));
	}

	public static string GetAlternativeTitleFromHtml(string src)
	{
		string tmp;
		string upper;
		int i;

		upper = src.ToLower();
		i = upper.IndexOf("</at>");
		if (i == -1)
		{
			return null;
		}

		tmp = src.Substring(0, i);

		i = tmp.IndexOf("<at>");
		if (i == -1)
		{
			return null;
		}

		string ret = tmp.Substring(i + 4);

		if (ret.Length == 0)
		{
			return null;
		}
		else
		{
			return ret;
		}
	}

	public static string GetTitleFromHtml(string src)
	{
		string tmp;
		string upper;
		int i;

		upper = src.ToLower();
		i = upper.IndexOf("</title>");
		if (i == -1)
		{
			return null;
		}

		tmp = src.Substring(0, i);

		i = tmp.IndexOf("<title>");
		if (i == -1)
		{
			return null;
		}

		return tmp.Substring(i + 7);
	}

	public static string GetTitleFromHtmlFile(string filename)
	{
		return GetTitleFromHtml(ReadHtmlFile(filename));
	}
	public static string GetAlternativeTitleFromHtmlFile(string filename)
	{
		return GetAlternativeTitleFromHtml(ReadHtmlFile(filename));
	}

	public static string GetUrlFileNameFromPath(string url)
	{
		string folder = GetUrlDirNameFromPath(url);

		return url.Substring(folder.Length);
	}

	public static string GetUrlDirNameFromPath(string url)
	{
		string ret = "";
		string[] strs = url.Split('/');
		int i;
		if (strs.Length >= 1)
		{
			for (i = 0; i < strs.Length - 1; i++)
			{
				ret += strs[i] + "/";
			}
		}
		return ret;
	}

	public static string Encode64(string str)
	{
		return Convert.ToBase64String(Encoding.UTF8.GetBytes(str)).Replace("/", "(").Replace("+", ")");
	}

	public static string Decode64(string str)
	{
		return Encoding.UTF8.GetString(Convert.FromBase64String(str.Replace(")", "+").Replace("(", "/")));
	}

	public static string RemoveDefaultHtml(string url)
	{
		string tmp = url.ToLower();
		if (tmp.EndsWith("/default.asp") || tmp.EndsWith("/default.aspx") || tmp.EndsWith("/default.htm") || tmp.EndsWith("/default.html"))
		{
			return GetUrlDirNameFromPath(url);
		}
		else
		{
			return url;
		}
	}

	public static string RemovePortFromHostHeader(string str)
	{
		try
		{
			string[] ret = str.Split(':');

			return ret[0];
		}
		catch
		{
			return str;
		}
	}

	public static string ToStr3(ulong v)
	{
		string tmp = LongToStr(v);
		int len, i;
		string tmp2 = "";

		len = tmp.Length;

		for (i = len - 1; i >= 0; i--)
		{
			tmp2 += tmp[i];
		}

		tmp = "";

		for (i = 0; i < len; i++)
		{
			if (i != 0 && (i % 3) == 0)
			{
				tmp += ",";
			}
			tmp += tmp2[i];
		}

		tmp2 = "";
		len = tmp.Length;

		for (i = len - 1; i >= 0; i--)
		{
			tmp2 += tmp[i];
		}

		return tmp2;
	}

	public static string DateTimeToStr(DateTime dt)
	{
		return DateTimeToStr(dt, false);
	}
	public static string DateTimeToStr(DateTime dt, bool toLocalTime)
	{
		if (toLocalTime)
		{
			dt = dt.ToLocalTime();
		}

		return dt.ToString("yyyy年M月d日(ddd) H時m分s秒");
	}

	public static byte[] IntToByte(uint value)
	{
		MemoryStream st = new MemoryStream();
		BinaryWriter w = new BinaryWriter(st);
		w.Write(value);
		st.Seek(0, SeekOrigin.Begin);
		return st.ToArray();
	}

	public static uint ByteToInt(byte[] b)
	{
		MemoryStream st = new MemoryStream();
		st.Write(b, 0, b.Length);
		st.Seek(0, SeekOrigin.Begin);
		BinaryReader r = new BinaryReader(st);
		return r.ReadUInt32();
	}

	public static byte[] ReverseByteArray(byte[] b)
	{
		int i, num, j;
		num = b.Length;
		byte[] ret = new byte[num];
		j = 0;

		for (i = num - 1; i >= 0; i--)
		{
			ret[j++] = b[i];
		}

		return ret;
	}

	public static uint ReverseEndian(uint value)
	{
		return ByteToInt(ReverseByteArray(IntToByte(value)));
	}

	public static string SafeDomainStr(string str)
	{
		string ret = str.Replace("(", "").Replace(")", "").Replace(" ", "").Replace("-", "").Replace("#", "")
			.Replace("%", "").Replace("%", "").Replace("&", "").Replace(".", "");
		if (ret == "")
		{
			ret = "host";
		}

		return ret;
	}

	public static bool CompareByte(byte[] b1, byte[] b2)
	{
		if (b1.Length != b2.Length)
		{
			return false;
		}
		int i, len;
		len = b1.Length;
		for (i = 0; i < len; i++)
		{
			if (b1[i] != b2[i])
			{
				return false;
			}
		}
		return true;
	}

	public static int CompareByteRetInt(byte[] b1, byte[] b2)
	{
		int i;
		for (i = 0; ; i++)
		{
			int a1 = -1, a2 = -1;
			if (b1.Length < i)
			{
				a1 = (int)b1[i];
			}
			if (b2.Length < i)
			{
				a2 = (int)b2[i];
			}

			if (a1 > a2)
			{
				return 1;
			}
			else if (a1 < a2)
			{
				return -1;
			}
			if (a1 == -1 && a2 == -1)
			{
				return 0;
			}
		}
	}

	public static byte[] CloneByteArray(byte[] src)
	{
		return (byte[])src.Clone();
	}
}