public bool IsOverlapLeaveApplication(DatabaseConnection dbConn, out ArrayList OverlapLeaveApplicationList)
        {
            OverlapLeaveApplicationList = new ArrayList();

            DBFilter overlapCheckingFilter = new DBFilter();

            overlapCheckingFilter.add(new Match("EmpID", EmpID));
            overlapCheckingFilter.add(new Match("RequestLeaveAppID", "<>", RequestLeaveAppID));
            overlapCheckingFilter.add(new Match("RequestLeaveAppDateFrom", "<=", RequestLeaveAppDateTo));
            overlapCheckingFilter.add(new Match("RequestLeaveAppDateTo", ">=", RequestLeaveAppDateFrom));
            if (RequestLeaveAppUnit.Equals("H"))
            {
                overlapCheckingFilter.add(new Match("RequestLeaveAppUnit", "D"));
            }
            //// Start 0000201, Ricky S0, 2015-06-01
            //else if (RequestLeaveAppUnit.Equals("D"))
            //{
            //    if (RequestLeaveAppDateToAM == "AM")
            //    {
            //        OR m_orFrom = new OR();
            //        m_orFrom.add(new Match("RequestLeaveAppDateFromAM", "AM"));
            //        m_orFrom.add(new NullTerm("RequestLeaveAppDateFrom"));
            //        overlapCheckingFilter.add(m_orFrom);
            //    }
            //    else if (RequestLeaveAppDateFromAM == "PM")
            //    {
            //        OR m_orTo = new OR();
            //        m_orFrom.add(new Match("RequestLeaveAppDateToAM", "PM"));
            //        m_orFrom.add(new NullTerm("RequestLeaveAppDateTo"));
            //        overlapCheckingFilter.add(m_orTo);
            //    }
            //}
            //// End 0000201, Ricky S0, 2015-06-01
            else if (RequestLeaveAppUnit.Equals("A"))
            {
                //  AM Leave Application
                OR orLeaveAppUnit = new OR();
                orLeaveAppUnit.add(new Match("RequestLeaveAppUnit", "D"));
                orLeaveAppUnit.add(new Match("RequestLeaveAppUnit", "A"));
                overlapCheckingFilter.add(orLeaveAppUnit);
            }
            else if (RequestLeaveAppUnit.Equals("P"))
            {
                //  PM Leave Application
                OR orLeaveAppUnit = new OR();
                orLeaveAppUnit.add(new Match("RequestLeaveAppUnit", "D"));
                orLeaveAppUnit.add(new Match("RequestLeaveAppUnit", "P"));
                overlapCheckingFilter.add(orLeaveAppUnit);
            }

            // Start 0000201, Ricky So, 2015-06-01
            // remove those are not classified as overlap
            //ArrayList overlapDailyLeaveAppList = db.select(dbConn, overlapCheckingFilter);
            ArrayList overlapDailyLeaveAppList     = new ArrayList();
            ArrayList potentialOverlapLeaveAppList = db.select(dbConn, overlapCheckingFilter);

            foreach (ERequestLeaveApplication potentialOverlapLeaveApp in potentialOverlapLeaveAppList)
            {
                if (this.RequestLeaveAppDateFrom == potentialOverlapLeaveApp.RequestLeaveAppDateTo)
                {
                    if (this.RequestLeaveAppDateFromAM == "PM" || this.RequestLeaveAppUnit == "P")
                    {
                        if (potentialOverlapLeaveApp.RequestLeaveAppDateToAM == "AM")
                        {
                            continue;
                        }
                        else if (potentialOverlapLeaveApp.RequestLeaveAppUnit == "A")
                        {
                            continue;
                        }
                    }
                    else if (this.RequestLeaveAppUnit == "A")
                    {
                        //if (potentialOverlapLeaveApp.RequestLeaveAppDateToAM == "PM")
                        //    continue;
                        //else if (potentialOverlapLeaveApp.RequestLeaveAppUnit == "P")
                        //    continue;
                    }
                    //else if (this.RequestLeaveAppUnit == "")
                    //{
                    //}
                }

                if (this.RequestLeaveAppDateTo == potentialOverlapLeaveApp.RequestLeaveAppDateFrom)
                {
                    if (this.RequestLeaveAppDateToAM == "AM")
                    {
                        if (potentialOverlapLeaveApp.RequestLeaveAppDateFromAM == "PM")
                        {
                            continue;
                        }
                        else if (potentialOverlapLeaveApp.RequestLeaveAppUnit == "P")
                        {
                            continue;
                        }
                    }
                    else if (this.RequestLeaveAppUnit == "P")
                    {
                    }
                    //else if (this.RequestLeaveAppUnit == "")
                    //{
                    //}
                }

                if (this.RequestLeaveAppDateFrom == potentialOverlapLeaveApp.RequestLeaveAppDateFrom)
                {
                    if (this.RequestLeaveAppUnit == "A")
                    {
                        if (potentialOverlapLeaveApp.RequestLeaveAppUnit == "P" || potentialOverlapLeaveApp.RequestLeaveAppDateFromAM == "PM")
                        {
                            continue;
                        }
                    }
                    else if (this.RequestLeaveAppUnit == "P")
                    {
                        if (potentialOverlapLeaveApp.RequestLeaveAppUnit == "A")
                        {
                            continue;
                        }
                    }
                    else if (this.RequestLeaveAppUnit == "D")
                    {
                        if (this.RequestLeaveAppDateFromAM == "PM" && (potentialOverlapLeaveApp.RequestLeaveAppDateFromAM == "AM" || potentialOverlapLeaveApp.RequestLeaveAppUnit == "A"))
                        {
                            continue;
                        }
                    }
                }

                overlapDailyLeaveAppList.Add(potentialOverlapLeaveApp);
            }
            // End 0000201, Ricky So, 2015-06-01

            if (overlapDailyLeaveAppList.Count > 0)
            {
                foreach (ERequestLeaveApplication previousRequestLeaveApp in overlapDailyLeaveAppList)
                {
                    //------------------------------------------------------
                    //Check record status from the EmpRequest table
                    DBFilter filterStatus = new DBFilter();

                    filterStatus.add(new Match("EmpID", EmpID));
                    filterStatus.add(new Match("EmpRequestRecordID", previousRequestLeaveApp.RequestLeaveAppID));
                    filterStatus.add(new Match("EmpRequestType", EEmpRequest.TYPE_EELEAVEAPP));
                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_USRCANCEL));

                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_FSTREJ));

                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_SNDREJ));

                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_SNDAPP));

                    filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_CANCELLED));
                    filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_REJECTED));
                    filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_APPROVED));

                    if (EEmpRequest.db.count(dbConn, filterStatus) > 0)
                    {
                        OverlapLeaveApplicationList.Add(previousRequestLeaveApp);
                    }

                    //------------------------------------------------------
                }
                //OverlapLeaveApplicationList.AddRange(overlapDailyLeaveAppList);
            }
            if (!RequestLeaveAppUnit.Equals("D"))
            {
                DateTime newLeaveAppTimeFrom = RequestLeaveAppDateFrom.Date.Add(new TimeSpan(RequestLeaveAppTimeFrom.Hour, RequestLeaveAppTimeFrom.Minute, RequestLeaveAppTimeFrom.Second));
                DateTime newLeaveAppTimeTo   = RequestLeaveAppDateTo.Date.Add(new TimeSpan(RequestLeaveAppTimeTo.Hour, RequestLeaveAppTimeTo.Minute, RequestLeaveAppTimeTo.Second));
                while (newLeaveAppTimeFrom > newLeaveAppTimeTo)
                {
                    newLeaveAppTimeTo = newLeaveAppTimeTo.AddDays(1);
                }

                overlapCheckingFilter = new DBFilter();
                overlapCheckingFilter.add(new Match("EmpID", EmpID));
                overlapCheckingFilter.add(new Match("RequestLeaveAppID", "<>", RequestLeaveAppID));
                overlapCheckingFilter.add(new Match("RequestLeaveAppDateFrom", "<=", RequestLeaveAppDateTo));

                overlapCheckingFilter.add(new Match("RequestLeaveAppDateTo", ">=", RequestLeaveAppDateFrom));
                overlapCheckingFilter.add(new Match("RequestLeaveAppUnit", "<>", "D"));
                ArrayList leaveAppList = db.select(dbConn, overlapCheckingFilter);
                foreach (ERequestLeaveApplication previousRequestLeaveApp in leaveAppList)
                {
                    //------------------------------------------------------
                    //Check record status from the EmpRequest table
                    DBFilter filterStatus = new DBFilter();

                    filterStatus.add(new Match("EmpID", EmpID));
                    filterStatus.add(new Match("EmpRequestRecordID", previousRequestLeaveApp.RequestLeaveAppID));
                    filterStatus.add(new Match("EmpRequestType", EEmpRequest.TYPE_EELEAVEAPP));
                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_USRCANCEL));

                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_FSTREJ));

                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_SNDREJ));

                    //filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_SNDAPP));
                    filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_CANCELLED));
                    filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_REJECTED));
                    filterStatus.add(new Match("EmpRequestStatus", "<>", EEmpRequest.STATUS_APPROVED));


                    if (EEmpRequest.db.count(dbConn, filterStatus) > 0)
                    {
                        DateTime oldLeaveAppTimeFrom = previousRequestLeaveApp.RequestLeaveAppDateFrom.Date.Add(new TimeSpan(previousRequestLeaveApp.RequestLeaveAppTimeFrom.Hour, previousRequestLeaveApp.RequestLeaveAppTimeFrom.Minute, previousRequestLeaveApp.RequestLeaveAppTimeFrom.Second));
                        DateTime oldLeaveAppTimeTo   = previousRequestLeaveApp.RequestLeaveAppDateTo.Date.Add(new TimeSpan(previousRequestLeaveApp.RequestLeaveAppTimeTo.Hour, previousRequestLeaveApp.RequestLeaveAppTimeTo.Minute, previousRequestLeaveApp.RequestLeaveAppTimeTo.Second));
                        while (oldLeaveAppTimeFrom > oldLeaveAppTimeTo)
                        {
                            oldLeaveAppTimeTo = oldLeaveAppTimeTo.AddDays(1);
                        }

                        if (!newLeaveAppTimeFrom.Equals(newLeaveAppTimeTo) && !oldLeaveAppTimeFrom.Equals(oldLeaveAppTimeTo))
                        {
                            //  Only check if the following case exists
                            // Time A From------- Time B From ---------- Time B To ------------Time A To
                            if (newLeaveAppTimeFrom <= oldLeaveAppTimeFrom && oldLeaveAppTimeTo <= newLeaveAppTimeTo || oldLeaveAppTimeFrom <= newLeaveAppTimeFrom && newLeaveAppTimeTo <= oldLeaveAppTimeTo)
                            {
                                OverlapLeaveApplicationList.Add(previousRequestLeaveApp);
                            }
                        }
                    }
                }
            }
            //  Also Check Leave Application
            ArrayList         OverlapOutstandardLeaveApplicationList;
            ELeaveApplication leaveApp = new ELeaveApplication();

            leaveApp.EmpID              = EmpID;
            leaveApp.LeaveAppDateFrom   = RequestLeaveAppDateFrom;
            leaveApp.LeaveAppDateFromAM = RequestLeaveAppDateFromAM;
            leaveApp.LeaveAppDateTo     = RequestLeaveAppDateTo;
            leaveApp.LeaveAppDateToAM   = RequestLeaveAppDateToAM;
            leaveApp.LeaveAppDays       = RequestLeaveDays;
            leaveApp.LeaveAppTimeFrom   = RequestLeaveAppTimeFrom;
            leaveApp.LeaveAppTimeTo     = RequestLeaveAppTimeTo;
            leaveApp.LeaveAppUnit       = RequestLeaveAppUnit;
            leaveApp.LeaveCodeID        = RequestLeaveCodeID;
            if (leaveApp.IsOverlapLeaveApplication(dbConn, out OverlapOutstandardLeaveApplicationList))
            {
                // Start 0000233, Miranda, 2015-07-05
                if (RequestLeaveAppUnit.Equals("D"))
                {
                    OverlapLeaveApplicationList.AddRange(OverlapOutstandardLeaveApplicationList);
                }
                // End 0000233, Miranda, 2015-07-05
            }

            if (OverlapLeaveApplicationList.Count > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }