/*
|-------------------------------------------------------------------------------|
|	Copyright © Computer Ease Limited								            |
|	Address: 1/9 Bloack-A Lalmatia, Dhaka-1207, Bangladesh			            |
|	Email: info@celimited.com, cease@bol-online.com, web: www.celimited.com     |
|	Unauthorized copy or distribution is strictly prohibited		            |
|	Author: S. M. Russel,  Last modified date: 23/07/2012						|
|-------------------------------------------------------------------------------|
*/

using System;
using System.Net;
using System.Text;
using System.Linq;
//using System.Management;
using System.Net.Sockets;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace Ease.Core.Utility
{
    #region Delegates

    public delegate IntPtr KeyboardProc(int code, IntPtr wParam, IntPtr lParam);

    public delegate IntPtr MouseProc(int code, IntPtr wParam, IntPtr lParam);

    #endregion

    #region Win32Structure & Class

    internal class AnimateWindow
    {
        private AnimateWindow()
        {
        }

        public static int AW_HOR_POSITIVE = 0x1;
        public static int AW_HOR_NEGATIVE = 0x2;
        public static int AW_VER_POSITIVE = 0x4;
        public static int AW_VER_NEGATIVE = 0x8;
        public static int AW_CENTER = 0x10;
        public static int AW_HIDE = 0x10000;
        public static int AW_ACTIVATE = 0x20000;
        public static int AW_SLIDE = 0x40000;
        public static int AW_BLEND = 0x80000;
    }


    [StructLayout(LayoutKind.Sequential)]
    internal struct POINT
    {
        public int x;
        public int y;
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct SIZE
    {
        public int cx;
        public int cy;
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct TRACKMOUSEEVENTS
    {
        public uint cbSize;
        public uint dwFlags;
        public IntPtr hWnd;
        public uint dwHoverTime;
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct MSG
    {
        public IntPtr hwnd;
        public int message;
        public IntPtr wParam;
        public IntPtr lParam;
        public int time;
        public int pt_x;
        public int pt_y;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct BLENDFUNCTION
    {
        public byte BlendOp;
        public byte BlendFlags;
        public byte SourceConstantAlpha;
        public byte AlphaFormat;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct LOGBRUSH
    {
        public uint lbStyle;
        public uint lbColor;
        public uint lbHatch;
    }

    #endregion


    #region Global Class

    public sealed class Global
    {
        #region Declartion/Constructor

        private Global()
        {
        }

        #endregion

        #region String functions

        public class StringFuncions
        {
            public static bool IsEmptyOrNull(object o)
            {
                string s = (o == null) ? string.Empty : o.ToString();
                return StringFuncions.IsEmptyOrNull(s);
            }

            public static bool IsEmptyOrNull(string s)
            {
                s = (s == null) ? string.Empty : s;
                return string.IsNullOrEmpty(s);
            }

            public static bool IsEmpty(object o)
            {
                string s = (o == null) ? string.Empty : o.ToString();
                return StringFuncions.IsEmpty(s);
            }

            public static bool IsEmpty(string s)
            {
                s = (s == null) ? string.Empty : s;
                return (s == string.Empty || s.Trim().Length <= 0);
            }

            public static bool IsNotEmpty(string s)
            {
                return !StringFuncions.IsEmpty(s);
            }

            public static bool IsNotEmpty(object o)
            {
                return !StringFuncions.IsEmpty(o);
            }

            public static string FormatString(string format, params object[] args)
            {
                return string.Format(format, args);
            }

            public static string StringReverse(string s)
            {
                string tmp = string.Empty;
                for (int i = s.Length - 1; i >= 0; i--)
                    tmp = string.Format("{0}{1}", tmp, s[i]);

                return tmp;
            }

            public static string MakeItSentence(string inputString)
            {
                for (int i = 0; i < inputString.Length; i++)
                {
                    char a = Convert.ToChar(inputString.Substring(i, 1));
                    if (Char.IsUpper(a))
                    {
                        if (i != 0 && inputString.Substring(i - 1, 1) != " ")
                            inputString = inputString.Insert(i, " ");
                    }
                }

                return inputString;
            }

            public static string Left(string inputString, int length)
            {
                if (length < inputString.Length && length > 0)
                    return inputString.Substring(0, length);
                else
                    return inputString;
            }

            public static string Right(string inputString, int length)
            {
                if (length < inputString.Length && length > 0)
                    return inputString.Substring((inputString.Length - length), length);
                else
                    return inputString;
            }

            public static string Mid(string inputString, int start, int length)
            {
                if ((start + length) < inputString.Length)
                    return inputString.Substring(start, length);
                else if (start < inputString.Length)
                    return inputString.Substring(start);
                else
                    return inputString;
            }

            public static string Mid(string inputString, int start)
            {
                if (start < inputString.Length)
                    return inputString.Substring(start);
                else
                    return inputString;
            }

            public static void Mid(ref string inputString, int start, int length, string value)
            {
                if ((start + length) > inputString.Length)
                    throw new Exception("Inputstring has not enough length");

                string part1 = inputString.Substring(0, start);
                string part2 = inputString.Substring(start + length);

                value = value.Length < length ? value.PadRight(length, ' ') : value;
                value = value.Length > length ? StringFuncions.Left(value, length) : value;

                inputString = string.Format("{0}{1}{2}", part1, value, part2);
            }

            public static bool IsStrongPassword(string password)
            {
                string pattern = @"(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$";

                return Regex.IsMatch(password, pattern);
            }

            public static bool IsEmailAddress(string emailAddress)
            {
                string pattern =
                    @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
                    + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";

                return Regex.IsMatch(emailAddress, pattern);
            }
        }

        #endregion

        #region Date Functions

        public class DateFunctions
        {
            public static bool IsDateTime(string s, FormatOptions f)
            {
                if (string.IsNullOrEmpty(s))
                    throw new Exception("Invalid use of empty string.");

                string[] vals = s.Split(new char[] { '-', '/', '.', ' ' });
                if (vals == null || vals.Length < 3)
                    throw new Exception("Invalid use of date format.");

                bool ret = true;
                int day = 0, month = 0, year = 0;

                #region For the format "MM/dd/yyyy"

                if (f == FormatOptions.MMddyyyy)
                {
                    if (!NumericFunctions.IsNumeric(vals[1].Trim()))
                        return false;

                    day = Convert.ToInt32(vals[1].Trim());

                    if (!NumericFunctions.IsNumeric(vals[0].Trim()))
                        return false;

                    month = Convert.ToInt32(vals[0].Trim());

                    if (!NumericFunctions.IsNumeric(vals[2].Trim()))
                        return false;

                    year = Convert.ToInt32(vals[2].Trim());

                    //Making year
                    if (year < 100 && vals[2].Trim().Length < 4)
                        year = 2000 + year;

                    //Month validation
                    if (month < 1 || month > 12)
                        ret = false;

                    //Day validation
                    if (ret && (day < 1 || day > DateTime.DaysInMonth(year, month)))
                        ret = false;
                }

                #endregion

                #region For the format "dd/MM/yyyy" or "dd/MM/yyyy hh:mm:ss AM/PM"

                if (f == FormatOptions.ddMMyyyy)
                {
                    if (!NumericFunctions.IsNumeric(vals[0].Trim()))
                        return false;
                    day = Convert.ToInt32(vals[0].Trim());

                    if (!NumericFunctions.IsNumeric(vals[1].Trim()))
                        return false;
                    month = Convert.ToInt32(vals[1].Trim());

                    if (!NumericFunctions.IsNumeric(vals[2].Trim()))
                        return false;
                    year = Convert.ToInt32(vals[2].Trim());

                    //Making year
                    if (year < 100 && vals[2].Trim().Length < 4)
                        year = 2000 + year;

                    //Month validation
                    if (month < 1 || month > 12)
                        ret = false;

                    //Day validation
                    if (ret && (day < 1 || day > DateTime.DaysInMonth(year, month)))
                        ret = false;
                }

                #endregion

                #region For the format "dd/MMM/yyyy" or "dd/MMM/yyyy hh:mm:ss AM/PM"

                if (f == FormatOptions.ddMMMyyyy)
                {
                    if (!NumericFunctions.IsNumeric(vals[0].Trim()))
                        return false;
                    day = Convert.ToInt32(vals[0].Trim());

                    if (!NumericFunctions.IsNumeric(vals[2].Trim()))
                        return false;
                    year = Convert.ToInt32(vals[2].Trim());

                    //Making year
                    if (year < 100 && vals[2].Trim().Length < 4)
                        year = 2000 + year;

                    //Month validation
                    month = monthIndex(vals[1]);
                    if (month < 1 || month > 12)
                        ret = false;

                    //Day validation
                    if (ret && (day < 1 || day > DateTime.DaysInMonth(year, month)))
                        ret = false;
                }

                #endregion

                return ret;
            }

            public static bool IsDateTime(object o, FormatOptions f)
            {
                string s = (o == null) ? string.Empty : o.ToString();

                return DateFunctions.IsDateTime(s, f);
            }

            public static DateTime GetDate(string s, FormatOptions f)
            {
                if (StringFuncions.IsEmptyOrNull(s))
                    throw new Exception("Invalid use of empty string.");

                string[] vals = s.Split(new char[] { '-', '/', '.', ' ' });

                if (vals == null || vals.Length < 3)
                    throw new Exception("Invalid use of date format.");

                int day = 0, month = 0, year = 0;

                #region For format$ "MM/dd/yyyy"

                if (f == FormatOptions.MMddyyyy)
                {
                    day = Convert.ToInt32(vals[1].Trim());
                    month = Convert.ToInt32(vals[0].Trim());
                    year = Convert.ToInt32(vals[2].Trim());

                    //Making year
                    if (year < 100 && vals[2].Trim().Length < 4)
                        year = 2000 + year;

                    //Month validation
                    if (month < 1 || month > 12)
                        throw new Exception("Invalid date format for month overflow.");

                    //Day validation
                    if (day < 1 || day > DateTime.DaysInMonth(year, month))
                        throw new Exception("Invalid date format for day overflow.");

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

                #endregion

                #region For format "dd/MM/yyyy"

                if (f == FormatOptions.ddMMyyyy)
                {
                    day = Convert.ToInt32(vals[0].Trim());
                    month = Convert.ToInt32(vals[1].Trim());
                    year = Convert.ToInt32(vals[2].Trim());
                    if (year < 100 && vals[2].Trim().Length < 4)
                        year = 2000 + year;

                    //Month validation
                    if (month < 1 || month > 12)
                        throw new Exception("Invalid date format for month overflow.");

                    //Day validation
                    if (day < 1 || day > DateTime.DaysInMonth(year, month))
                        throw new Exception("Invalid date format for day overflow.");

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

                #endregion

                #region For format "dd/MMM/yyyy"

                if (f == FormatOptions.ddMMMyyyy)
                {
                    day = Convert.ToInt32(vals[0].Trim());
                    year = Convert.ToInt32(vals[2].Trim());
                    if (year < 100 && vals[2].Trim().Length < 4)
                        year = 2000 + year;

                    //Month Validation
                    month = monthIndex(vals[1]);
                    if (month < 1 || month > 12)
                        throw new Exception("Invalid date format for month overflow.");

                    //Day validation
                    if (day < 1 || day > DateTime.DaysInMonth(year, month))
                        throw new Exception("Invalid date format for day overflow.");

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

                #endregion

                return new DateTime(1, 1, 1);
            }

            public static DateTime GetDate(object o, FormatOptions f)
            {
                if (o == null)
                    throw new Exception("Invalid use of null reference.");

                string s = o.ToString();

                return DateFunctions.GetDate(s, f);
            }

            /// <summary>
            /// This function return the first date of month of param date
            /// </summary>
            /// <param name="forDate">A valid date</param>
            /// <returns>Return the date of month</returns>
            public static DateTime FirstDateOfMonth(DateTime forDate)
            {
                return new DateTime(forDate.Year, forDate.Month, 1);
            }

            public static DateTime FirstDateOfMonth(int year, int month)
            {
                return new DateTime(year, month, 1);
            }

            public static DateTime FirstDateOfYear(DateTime forDate)
            {
                return new DateTime(forDate.Year, 1, 1);
            }

            public static DateTime FirstDateOfYear(int year)
            {
                return new DateTime(year, 1, 1);
            }

            public static DateTime LastDateOfYear(DateTime forDate)
            {
                return new DateTime(forDate.Year, 12, 31);
            }

            public static DateTime LastDateOfYear(int year)
            {
                return new DateTime(year, 12, 31);
            }

            public static DateTime LastDateOfMonth(DateTime forDate)
            {
                DateTime ldom = new DateTime(forDate.Year, forDate.Month, 1);
                ldom = ldom.AddMonths(1);
                ldom = ldom.AddDays(-1);
                return ldom;
            }

            public static DateTime LastDateOfMonth(int year, int month)
            {
                DateTime ldom = new DateTime(year, month, 1);
                ldom = ldom.AddMonths(1);
                ldom = ldom.AddDays(-1);
                return ldom;
            }

            public static bool IsFirstDayOfMonth(DateTime onDate)
            {
                return (onDate.Day == 1);
            }

            public static bool IsFirstDayOfYear(DateTime onDate)
            {
                return (onDate.Month == 1 && onDate.Day == 1);
            }

            public static bool IsLastDayOfMonth(DateTime onDate)
            {
                int days = DateTime.DaysInMonth(onDate.Year, onDate.Month);

                return (days <= onDate.Day);
            }

            public static bool IsLastDayOfYear(DateTime onDate)
            {
                return (onDate.Month == 12 && onDate.Day == 31);
            }


            /// <summary>
            /// This function return the integer value in accordance with stringformat
            /// </summary>
            /// <param name="Date1">Subtract from this value and must be datetime</param>
            /// <param name="Date2">Subtract this value and must be datetime</param>
            /// <param name="Interval">There are three types of format 1=d/D return difference in days, 2=m/M return difference in month, 3=y/Y return difference in years//   </param>
            /// <returns></returns>
            public static int DateDiff(string interval, DateTime date1, DateTime date2)
            {
                int diffVale = 0;
                DateTime fromDate, toDate;

                if (date1 > date2)
                {
                    toDate = date1;
                    fromDate = date2;
                }
                else
                {
                    fromDate = date1;
                    toDate = date2;
                }

                switch (interval)
                {
                    case "D":
                    case "d":
                        for (int curYear = fromDate.Year + 1; curYear <= toDate.Year; curYear++)
                            diffVale += new DateTime(curYear, 12, 31).DayOfYear;

                        diffVale += toDate.DayOfYear - fromDate.DayOfYear;
                        break;

                    case "M":
                    case "m":
                        diffVale = toDate.Year - fromDate.Year;
                        diffVale = diffVale * 12;
                        diffVale += toDate.Month - fromDate.Month;
                        break;

                    case "Y":
                    case "y":
                        if (toDate.DayOfYear < fromDate.DayOfYear)
                            diffVale = toDate.Year - fromDate.Year - 1;
                        else
                            diffVale = toDate.Year - fromDate.Year;
                        break;
                }

                if (date1 > date2)
                    diffVale = -diffVale;

                return diffVale;
            }

            /// <summary>
            /// This function return the year, month, day with space delimeter 
            /// </summary>
            /// <param name="Date1">Subtract from this value and must be datetime</param>
            /// <param name="Date2">Subtract this value and must be datetime</param>
            /// <returns>Return a string year, month, day with space delimeter
            /// e.g 2 Years 9 months 27 days or 8 months 16 days or 16 days 
            /// </returns>
            public static string DateDiff(DateTime Date1, DateTime Date2)
            {
                int diff = 0;
                DateTime calcDate;
                string retVal = string.Empty;

                if (Date1 > Date2)
                {
                    calcDate = Date2;
                    Date2 = Date1;
                    Date1 = calcDate;
                }

                //Finding the year difference
                diff = DateFunctions.DateDiff("Y", Date1, Date2);
                if (diff > 0)
                {
                    if (diff == 1)
                        retVal = "1 Year ";
                    else
                        retVal = diff + " Years ";
                }

                //Finding the month difference
                calcDate = new DateTime(Date1.Year, Date1.Month, Date1.Day);
                calcDate = calcDate.AddYears(diff);

                diff = Math.Abs(DateFunctions.DateDiff("M", calcDate, Date2));
                if (diff > 0)
                {
                    if (diff == 1)
                        retVal = retVal + "1 Month ";
                    else
                        retVal = retVal + diff + " Months ";
                }

                //Finding the day difference
                calcDate = calcDate.AddMonths(diff);
                diff = Math.Abs(DateFunctions.DateDiff("D", calcDate, Date2));

                if (diff > 0)
                {
                    if (diff == 1)
                        retVal = retVal + "1 Day";
                    else
                        retVal = retVal + diff + " Days";
                }

                //Finally trimming the spaces 
                retVal = retVal.Trim();

                return retVal;
            }

            /// <summary>
            /// This function add number with date in accordance with interval
            /// </summary>
            /// <param name="Interval">There are three types of interval 1:= d/D add day(s), 2:= m/M add month(s), 3: =y/Y add year(s) with input date</param>
            /// <param name="Number">Value to be added</param>
            /// <param name="Date">Input date add with this value</param>
            /// <returns>Return datatime after operation</returns>
            public static DateTime DateAdd(string interval, int number, DateTime date)
            {
                DateTime retValue = date;
                switch (interval)
                {
                    case "D":
                    case "d":
                        retValue = retValue.AddDays(number);
                        break;

                    case "M":
                    case "m":
                        retValue = retValue.AddMonths(number);
                        break;

                    case "Y":
                    case "y":
                        retValue = retValue.AddYears(number);
                        break;
                }

                return retValue;
            }

            private static int monthIndex(string monthName)
            {
                int index = 0;
                string[] months = null;

                System.Globalization.DateTimeFormatInfo df = new System.Globalization.DateTimeFormatInfo();

                if (monthName.Trim().Length <= 2)
                    if (NumericFunctions.IsNumeric(monthName))
                        return Convert.ToInt32((monthName.Trim()));

                if (monthName.Trim().Length == 3)
                    months = df.AbbreviatedMonthNames;
                else
                    months = df.MonthNames;

                foreach (string item in months)
                {
                    index++;
                    if (item.ToLower() == monthName.ToLower())
                        return index;
                }

                return -1;
            }

            public static List<DateTime> DatesOfDay(DayOfWeek day, DateTime date1, DateTime date2)
            {
                return DateFunctions.DatesOfDay(day, date1, date2, null);
            }

            public static List<DateTime> DatesOfDay(DayOfWeek day, DateTime date1, DateTime date2,
                List<DateTime> holidays)
            {
                List<DateTime> dates = new List<DateTime>();
                DateTime onDate = date1 < date2 ? date1 : date2;
                date2 = date1 > date2 ? date1 : date2;

                while (onDate.DayOfWeek != day)
                    onDate = onDate.AddDays(1);

                while (onDate <= date2)
                {
                    if (holidays == null || !holidays.Contains(onDate))
                        dates.Add(onDate);

                    onDate = onDate.AddDays(7);
                }

                return dates;
            }
        }

        #endregion

        #region Numeric functions

        public class NumericFunctions
        {
            private static string HundredWords(int inputValue)
            {
                string hundredWords = "", numStr = "", pos1 = "", pos2 = "", pos3 = "";
                string[] digits = new string[10]
                    { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
                string[] teens = new string[10]
                {
                    "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                    "nineteen"
                };
                string[] tens = new string[10]
                    { "", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };

                numStr = StringFuncions.Right(inputValue.ToString("000"), 3);
                if (StringFuncions.Left(numStr, 1) != "0")
                    pos1 = digits.GetValue(Convert.ToInt32(StringFuncions.Left(numStr, 1))) + " hundred";
                else
                    pos1 = "";

                numStr = StringFuncions.Right(numStr, 2);
                if (StringFuncions.Left(numStr, 1) == "1")
                {
                    pos2 = Convert.ToString(teens.GetValue(Convert.ToInt32(StringFuncions.Right(numStr, 1))));
                    pos3 = "";
                }
                else
                {
                    pos2 = Convert.ToString(tens.GetValue(Convert.ToInt32(StringFuncions.Left(numStr, 1))));
                    pos3 = Convert.ToString(digits.GetValue(Convert.ToInt32(StringFuncions.Right(numStr, 1))));
                }

                hundredWords = pos1;
                if (hundredWords != "")
                {
                    if (pos2 != "")
                    {
                        hundredWords = hundredWords + " ";
                    }
                }

                hundredWords = hundredWords + pos2;

                if (hundredWords != "")
                {
                    if (pos3 != "")
                    {
                        hundredWords = hundredWords + " ";
                    }
                }

                hundredWords = hundredWords + pos3;

                return hundredWords;
            }

            private static string InWords(double inputValue, string beforeDecimal, string afterDecimal)
            {
                int commaCount = 0, digitCount = 0;
                string sign = "", takaWords = "", numStr = "", taka = "", paisa = "", pow = "";
                string[] pows = new string[3] { "crore", "thousand", "lakh" };

                if (inputValue < 0)
                {
                    sign = "Minus";
                    inputValue = Math.Abs(inputValue);
                }

                numStr = inputValue.ToString("0.00");
                paisa = HundredWords(Convert.ToInt32(StringFuncions.Right(numStr, 2)));

                if (paisa != "")
                {
                    paisa = paisa.Substring(0, 1).ToUpper() + paisa.Substring(1);
                    paisa = afterDecimal + " " + paisa;
                }

                numStr = StringFuncions.Left(numStr, numStr.Length - 3);
                taka = HundredWords(Convert.ToInt32(StringFuncions.Right(numStr, 3)));

                if (numStr.Length <= 3)
                {
                    numStr = "";
                }
                else
                {
                    numStr = StringFuncions.Left(numStr, numStr.Length - 3);
                }

                commaCount = 1;
                if (numStr != "")
                {
                    do
                    {
                        if (commaCount % 3 == 0)
                        {
                            digitCount = 3;
                        }
                        else
                        {
                            digitCount = 2;
                        }

                        pow = HundredWords(Convert.ToInt32(StringFuncions.Right(numStr, digitCount)));
                        if (pow != "")
                        {
                            if (Convert.ToString(inputValue).Length > 10)
                            {
                                pow = pow + " " + pows.GetValue(commaCount % 3) + " crore ";
                            }
                            else
                            {
                                pow = pow + " " + pows.GetValue(commaCount % 3);
                            }
                        }

                        if (taka != "")
                        {
                            if (pow != "")
                            {
                                pow = pow + " ";
                            }
                        }

                        taka = pow + taka;
                        if (numStr.Length <= digitCount)
                        {
                            numStr = "";
                        }
                        else
                        {
                            numStr = StringFuncions.Left(numStr, numStr.Length - digitCount);
                        }

                        commaCount = commaCount + 1;
                    } while (numStr != "");
                }

                if (taka != "")
                {
                    taka = taka.Substring(0, 1).ToUpper() + taka.Substring(1);
                    taka = beforeDecimal + " " + taka;
                }

                takaWords = taka;

                if (takaWords != "")
                {
                    if (paisa != "")
                    {
                        takaWords = takaWords + " and ";
                    }
                }

                takaWords = takaWords + paisa;

                if (takaWords == "")
                {
                    takaWords = beforeDecimal + " Zero";
                }

                takaWords = sign + takaWords + " Only";
                return takaWords;
            }

            public static string AmountInWords(decimal inputValue, string beforeDecimal, string afterDecimal)
            {
                return NumericFunctions.InWords(Convert.ToDouble(inputValue), beforeDecimal, afterDecimal);
            }

            public static string AmountInWords(float inputValue, string beforeDecimal, string afterDecimal)
            {
                return NumericFunctions.InWords(Convert.ToDouble(inputValue), beforeDecimal, afterDecimal);
            }

            public static string AmountInWords(double inputValue, string beforeDecimal, string afterDecimal)
            {
                return NumericFunctions.InWords(inputValue, beforeDecimal, afterDecimal);
            }

            public static string TakaWords(decimal inputValue)
            {
                return NumericFunctions.TakaWords(Convert.ToDouble(inputValue));
            }

            public static string TakaWords(float inputValue)
            {
                return NumericFunctions.TakaWords(Convert.ToDouble(inputValue));
            }

            public static string TakaWords(double inputValue)
            {
                return NumericFunctions.InWords(inputValue, "Taka", "Paisa");
            }

            public static bool IsNumeric(char chrValue)
            {
                return char.IsDigit(chrValue);
            }

            /// <summary>
            /// Checks the string whether it is numeric or not
            /// </summary>
            /// <param name="str">String Type</param>
            /// <returns>Returns true if number otherwise false</returns>
            public static bool IsNumeric(string s)
            {
                if (string.IsNullOrEmpty(s))
                    return false;

                s = s.Trim();
                if (s.StartsWith("+") || s.StartsWith("-"))
                    s = s.Substring(1);

                for (int i = 0; i < s.Length; i++)
                {
                    char c = s[i];
                    if (!char.IsNumber(c) && c != '.')
                        return false;
                }

                return true;
            }

            /// <summary>
            /// Checks the string whether it is numeric or not
            /// </summary>
            /// <param name="objValue">Object Type</param>
            /// <returns>Returns true if number otherwise false</returns>
            public static bool IsNumeric(object o)
            {
                string s = o == null ? String.Empty : Convert.ToString(o);
                return (StringFuncions.IsNotEmpty(s) && IsNumeric(s));
            }

            /// <summary>
            /// Checks the string whether it is decimal or not
            /// </summary>
            /// <param name="str"></param>
            /// <returns>Returns true if decimal otherwise false</returns>
            public static bool IsDecimal(string strValue)
            {
                return (!string.IsNullOrEmpty(strValue) && new Regex("[^0-9\\.\\-\\+]").IsMatch(strValue) == false);
            }

            /// <summary>
            /// Checks the string whether it is currency or not
            /// </summary>
            /// <param name="str"></param>
            /// <returns>Returns true if currency otherwise false</returns>
            public static bool IsCurrency(string s)
            {
                return (!string.IsNullOrEmpty(s) && new Regex("[^$0-9\\,\\.\\-\\+]").IsMatch(s) == false);
            }

            public static double RoundOff(decimal inputValue)
            {
                return Convert.ToDouble(Math.Round(inputValue));
            }

            public static double RoundOff(decimal inputValue, int digits)
            {
                return RoundOff(Convert.ToDouble(inputValue), digits);
            }

            public static double RoundOff(double inputValue, int digits)
            {
                double rmndr = 0.0, retVal = 0.0;
                if (digits < 0)
                {
                    retVal = Math.Pow(10, Math.Abs(digits));
                    rmndr = ((inputValue % retVal) / retVal);
                    if (rmndr >= 0.5)
                    {
                        rmndr = 1 * retVal;
                    }
                    else
                    {
                        rmndr = 0;
                    }

                    retVal = (((inputValue - (inputValue % retVal)) / retVal) * retVal) + rmndr;
                }
                else
                {
                    retVal = Math.Round(inputValue, digits);
                }

                return retVal;
            }

            public static double RoundOff(double inputValue)
            {
                return Math.Round(inputValue);
            }

            public static double RoundOff(float inputValue, int digits)
            {
                return RoundOff(Convert.ToDouble(inputValue), digits);
            }

            public static double RoundOff(float inputValue)
            {
                return Math.Round(inputValue);
            }

            public static string TakaFormat(decimal inputValue, char digitSeparator, char decimalSeparator, byte digits)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), digitSeparator, decimalSeparator,
                    digits);
            }

            public static string TakaFormat(decimal inputValue, byte digits)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), ',', '.', digits);
            }

            public static string TakaFormat(decimal inputValue, char digitSeparator, char decimalSeparator)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), digitSeparator, decimalSeparator);
            }

            public static string TakaFormat(decimal inputValue)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), ',', '.');
            }

            public static string TakaFormat(float inputValue, char digitSeparator, char decimalSeparator, byte digits)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), digitSeparator, decimalSeparator,
                    digits);
            }

            public static string TakaFormat(float inputValue, byte digits)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), ',', '.', digits);
            }

            public static string TakaFormat(float inputValue, char digitSeparator, char decimalSeparator)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), digitSeparator, decimalSeparator);
            }

            public static string TakaFormat(float inputValue)
            {
                return NumericFunctions.TakaFormat(Convert.ToDouble(inputValue), ',', '.');
            }

            public static string TakaFormat(double inputValue, char digitSeparator, char decimalSeparator, byte digits)
            {
                string format = "##,##,###";
                if (digits > 0)
                    format = string.Format("{0}.{1}", format, new string('0', digits));

                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator, format);
            }

            public static string TakaFormat(double inputValue, byte digits)
            {
                return NumericFunctions.TakaFormat(inputValue, ',', '.', digits);
            }

            public static string TakaFormat(double inputValue, char digitSeparator, char decimalSeparator)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator, "##,##,###.00");
            }

            public static string TakaFormat(double inputValue)
            {
                return NumericFunctions.TakaFormat(inputValue, ',', '.');
            }

            public static string MillionFormat(decimal inputValue, char digitSeparator, char decimalSeparator,
                byte digits)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator,
                    string.Format("N{0}", digits));
            }

            public static string MillionFormat(decimal inputValue, byte digits)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', string.Format("N{0}", digits));
            }

            public static string MillionFormat(decimal inputValue, char digitSeparator, char decimalSeparator)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator, "N2");
            }

            public static string MillionFormat(decimal inputValue)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', "N2");
            }

            public static string MillionFormat(float inputValue, char digitSeparator, char decimalSeparator,
                byte digits)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator,
                    string.Format("N{0}", digits));
            }

            public static string MillionFormat(float inputValue, byte digits)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', string.Format("N{0}", digits));
            }

            public static string MillionFormat(float inputValue, char digitSeparator, char decimalSeparator)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator, "N2");
            }

            public static string MillionFormat(float inputValue)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', "N2");
            }

            public static string MillionFormat(double inputValue, char digitSeparator, char decimalSeparator,
                byte digits)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator,
                    string.Format("N{0}", digits));
            }

            public static string MillionFormat(double inputValue, byte digits)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', string.Format("N{0}", digits));
            }

            public static string MillionFormat(double inputValue, char digitSeparator, char decimalSeparator)
            {
                return NumericFunctions.CustomFormat(inputValue, digitSeparator, decimalSeparator, "N2");
            }

            public static string MillionFormat(double inputValue)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', "N2");
            }

            public static string CustomFormat(decimal inputValue, string format)
            {
                return NumericFunctions.CustomFormat(Convert.ToDouble(inputValue), ',', '.', format);
            }

            public static string CustomFormat(decimal inputValue, char digitSeparator, char decimalSeparator,
                string format)
            {
                return NumericFunctions.CustomFormat(Convert.ToDouble(inputValue), digitSeparator, decimalSeparator,
                    format);
            }

            public static string CustomFormat(float inputValue, string format)
            {
                return NumericFunctions.CustomFormat(Convert.ToDouble(inputValue), ',', '.', format);
            }

            public static string CustomFormat(float inputValue, char digitSeparator, char decimalSeparator,
                string format)
            {
                return NumericFunctions.CustomFormat(Convert.ToDouble(inputValue), digitSeparator, decimalSeparator,
                    format);
            }

            public static string CustomFormat(double inputValue, string format)
            {
                return NumericFunctions.CustomFormat(inputValue, ',', '.', format);
            }

            public static string CustomFormat(double inputValue, char digitSeparator, char decimalSeparator,
                string format)
            {
                string sign = string.Empty, formattedValue = string.Empty;

                if (inputValue < 0)
                {
                    sign = "-";
                    inputValue = (-inputValue);
                }

                //Format starts with N
                if (format.ToUpper().StartsWith("N"))
                {
                    formattedValue = inputValue.ToString(format);
                    formattedValue = formattedValue.Replace(',', digitSeparator);
                    formattedValue = formattedValue.Replace('.', decimalSeparator);

                    return string.Format("{0}{1}", sign, formattedValue);
                }

                //Split whole number foramt wnd faction number
                string wPart = string.Empty, fPart = string.Empty;
                string[] tokens = format.Split(decimalSeparator);
                if (tokens.Length >= 2)
                {
                    wPart = tokens[0];
                    fPart = tokens[1];
                }
                else
                {
                    wPart = format;
                    fPart = string.Empty;
                }

                //Split whole number and faction number
                string fNum = string.Empty;
                string wNum = string.Empty;
                tokens = inputValue.ToString("0.00000000").Split('.');
                if (tokens.Length >= 2)
                {
                    wNum = tokens[0];
                    fNum = tokens[1];
                }
                else
                {
                    wNum = tokens[0];
                }

                //Format whole part first
                int remLn = wNum.Length;
                tokens = wPart.Split(',');
                while (remLn > 0)
                {
                    for (int i = tokens.Length - 1; i >= 0; i--)
                    {
                        if (remLn > 0)
                        {
                            int ln = tokens[i].Length;
                            string s = string.Empty;
                            remLn -= ln;
                            if (remLn < wNum.Length && remLn > 0)
                                s = wNum.Substring(remLn);
                            else
                                s = wNum;

                            if (remLn > 0)
                                wNum = wNum.Substring(0, remLn);
                            else
                                wNum = string.Empty;

                            if (remLn > 0)
                                formattedValue = string.Format("{0}{1}{2}", digitSeparator, s, formattedValue);
                            else
                                formattedValue = string.Format("{0}{1}", s, formattedValue);
                        }
                    }
                }

                //Add afranctional part
                if (fNum.Length > 0 && fPart.Length > 0)
                {
                    if (fNum.Length > fPart.Length)
                        formattedValue = string.Format("{0}{1}{2}", formattedValue, decimalSeparator,
                            fNum.Substring(0, fPart.Length));
                    else
                        formattedValue = string.Format("{0}{1}{2}", formattedValue, decimalSeparator,
                            Convert.ToInt32(fNum).ToString(fPart));
                }

                return string.Format("{0}{1}", sign, formattedValue);
            }
        }

        #endregion

        #region Cipher functions

        public class CipherFunctions
        {
            public static string Encrypt(string data)
            {
                try
                {
                    return new Encryption().Encrypt(Encryption.DefaultPrivateKey, data);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message, e);
                }
            }

            public static string Encrypt(string key, string data)
            {
                try
                {
                    return new Encryption().Encrypt(key, data);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message, e);
                }
            }

            public static string Decrypt(string data)
            {
                try
                {
                    return new Encryption().Decrypt(Encryption.DefaultPrivateKey, data);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message, e);
                }
            }

            public static string Decrypt(string key, string data)
            {
                try
                {
                    return new Encryption().Decrypt(key, data);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message, e);
                }
            }

            public static string EncryptByTDS(string data)
            {
                try
                {
                    return new TDSEncryption().Encrypt(Encryption.DefaultPrivateKey, Encryption.DefaultPublicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string EncryptByTDS(string privateKey, string publicKey, string data)
            {
                try
                {
                    return new TDSEncryption().Encrypt(privateKey, publicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string DecryptByTDS(string data)
            {
                try
                {
                    return new TDSEncryption().Decrypt(Encryption.DefaultPrivateKey, Encryption.DefaultPublicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string DecryptByTDS(string privateKey, string publicKey, string data)
            {
                try
                {
                    return new TDSEncryption().Decrypt(privateKey, publicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string EncryptByAES(string data)
            {
                try
                {
                    return new AESEncryption().Encrypt(Encryption.DefaultPrivateKey, Encryption.DefaultPublicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string EncryptByAES(string privateKey, string publicKey, string data)
            {
                try
                {
                    return new AESEncryption().Encrypt(privateKey, publicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string DecryptByAES(string data)
            {
                try
                {
                    return new AESEncryption().Decrypt(Encryption.DefaultPrivateKey, Encryption.DefaultPublicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            public static string DecryptByAES(string privateKey, string publicKey, string data)
            {
                try
                {
                    return new AESEncryption().Decrypt(privateKey, publicKey, data);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        #endregion


        //#region Mac Address

        ///// <summary>
        ///// Returns MAC Address from first Network Card in Computer
        ///// </summary>
        ///// <returns>MAC Address in string format</returns>
        //public static string GetMacAddress()
        //{
        //    string mcAddress = string.Empty;
        //    try
        //    {
        //        //Create out management class object using the Win32_NetworkAdapterConfiguration class to get the attributes af the network adapter
        //        ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapterConfiguration");
        //        ManagementObjectCollection objCol = mgmt.GetInstances();

        //        foreach (ManagementObject obj in objCol)
        //        {
        //            if (mcAddress == String.Empty)  // only return MAC Address from first card
        //            {
        //                //grab the value from the first network adapter we find you can change the string to an array and get all network adapters found as well
        //                if (Convert.ToBoolean(obj["IPEnabled"]) == true)
        //                {
        //                    mcAddress = obj["MacAddress"].ToString();
        //                }
        //            }

        //            //dispose of our object
        //            obj.Dispose();
        //        }

        //        //replace the ":" with an empty space, this could also be removed if you wish
        //        mcAddress = mcAddress.Replace(":", "-");
        //    }
        //    catch
        //    {
        //    }

        //    return mcAddress;
        //}

        //#endregion

        #region IP Address

        static string getLocalIP()
        {
            string ipAddress = string.Empty;
            try
            {
                IPAddress[] ipHost = Dns.GetHostAddresses(Dns.GetHostName());
                foreach (IPAddress item in ipHost)
                {
                    if (item.AddressFamily == AddressFamily.InterNetwork)
                    {
                        ipAddress = item.ToString();
                        break;
                    }
                }

                if (string.IsNullOrEmpty(ipAddress) && ipHost.Length > 0)
                    ipAddress = ipHost[0].ToString();
            }
            catch
            {
            }

            return ipAddress;
        }

        /// <summary>
        /// For external address 
        /// </summary>
        /// <returns>External IP address.</returns>
        public static string GetIPAddress()
        {
            string ipAddress = string.Empty;
            try
            {
                ipAddress = Global.GetIPAddress(false);
            }
            catch
            {
            }

            return ipAddress;
        }

        /// <summary>
        /// Find IP address of the machine
        /// </summary>
        /// <param name="localIP">True if want to find local IP.</param>
        /// <returns>Return IP address. </returns>
        public static string GetIPAddress(bool localIP)
        {
            string myIP = string.Empty;
            try
            {
                myIP = getLocalIP();
                string href = ""; //#### ConfigUtility.GetAppSettings("hrefIP");
                if (!string.IsNullOrEmpty(href) && !localIP)
                {
                    byte[] data = new WebClient().DownloadData(href);
                    string fIP = new System.Text.UTF8Encoding().GetString(data);
                    if (!string.IsNullOrEmpty(fIP))
                        myIP = fIP;
                }
            }
            catch
            {
            }

            return myIP;
        }

        #endregion
    }

    #endregion
}