public ArrayList SearchPaymentAdviceByCriteria(long idPAList,
        StringSearchPredicate[] aryS, IntegerSearchPredicate[] aryI,
        string lockKey)
    {
        ApasSearchManager s = new ApasSearchManager(lockKey);

        List<SearchPredicate> c = new List<SearchPredicate>();

        foreach (StringSearchPredicate ps in aryS)
        {
            ps.PredicateTemplate = " {0} like '%'+{1}+'%' ";
            c.Add(ps);
        }

        foreach (IntegerSearchPredicate pi in aryI)
        {
            pi.PredicateTemplate = " {0} = {1} ";
            c.Add(pi);
        }

        return s.SearchPaymentAdviceByCriteria(idPAList,c);
    }
        //public ArrayList SearchPaymentAdviceByDay
        //(long idPAList, string strDay, int branchId){
        //    try{
        //        return SearchPaymentAdviceByDayImpl(idPAList, strDay, branchId);
        //    }catch(Exception e){
        //        string source = "APAS";
        //        string log = "Application";
        //        string strEvent = "Exception";
        //        string machine = ".";
        //        if(!EventLog.SourceExists(source,machine)){
        //            EventLog.CreateEventSource(source, log, machine);
        //        }
        //        EventLog eLog = new EventLog(log, machine, source);
        //        eLog.WriteEntry(e.StackTrace);
        //        throw e;
        //    }
        //}
        public ArrayList SearchPaymentAdviceByDay(long idPAList, string strDay, int branchId)
        {
            //1. Create criteria to query PAs in the chosen day
            //2. Aggregate PAs under their principal RegularView
            //2.1. If principal class is not in the chosen day, don't display
            //2.2. If non-principal classes are in the chosen day, add a dummy reference

            ISession ses = NHibernateManager.GetCurrentSession();
            EntityConverter ecov = new EntityConverter();

            Dictionary<int, ApasRegularView> result = new Dictionary<int, ApasRegularView>();
            ApasRegularView pReg;
            ApasRegular tempReg;
            int pRegId;

            PALockManager lMgr = new PALockManager(
               ApasAccessControlManager.GetCurrentInstance().LogonUser.Id,
               PALockKey);

            List<SearchPredicate> criteria = new List<SearchPredicate>();
            StringSearchPredicate sp = new StringSearchPredicate();
            sp.FieldName = "strDayRegular";
            sp.TableName = "Regular";
            sp.Value = strDay;
            sp.PredicateTemplate = " {0} = {1} ";

            criteria.Add(sp);

            IntegerSearchPredicate ip = new IntegerSearchPredicate();
            ip.FieldName = "intIdBranch";
            ip.TableName = "Branch";
            ip.Value = branchId;
            ip.PredicateTemplate = " {0} = {1} ";

            criteria.Add(ip);

            IList<PaymentAdvice> pList = executeQuery(idPAList, criteria);

            //if no result, return
            if (pList.Count == 0)
                return new ArrayList();

            //aggregate PAs under respective ApasRegularViews
            foreach (PaymentAdvice objPA in pList)
            {

                //check if chosen day of week is principal day for the objPA.
                //Principal day = leftmost day of week start from monday
                int[] aryDow = new int[objPA.ClassFees.Count];
                ApasRegular[] aryReg = new ApasRegular[aryDow.Length];

                int i = 0;
                foreach (ClassFee objCF in objPA.ClassFees.Values)
                {
                    tempReg = objCF.GetAssociatedClass();

                    aryDow[i] = convertDow(tempReg.Day);
                    aryReg[i] = tempReg;
                    i++;
                }

                Array.Sort(aryDow, aryReg);

                pRegId = aryReg[0].Id; //principal class Id

                //add all the classes in the chosen day to result dictionary
                foreach (ApasRegular objAR in aryReg)
                {
                    if (objAR.Day.ToLower() == strDay.ToLower() &&
                        !result.ContainsKey(objAR.Id))
                        result.Add(objAR.Id, ecov.ConvertRegular(objAR));
                }

                //check if principal class is in chosen day
                if (result.TryGetValue(pRegId, out pReg))
                {
                    //lock
                    lMgr.Hold(objPA.Id);

                    ses.Evict(objPA);

                    //requery the objPA
                    PaymentAdvice principalPA = new PaymentAdvice(objPA.Id, false, PALockKey);

                    //add to class
                    pReg.PaymentAdvices.Add(ecov.ConvertPaymentAdvice(principalPA));

                }

                foreach (ClassFee objCF in objPA.ClassFees.Values)
                {
                    //add dummy references
                    if (objCF.IdRegular != pRegId &&
                        result.ContainsKey(objCF.IdRegular))
                    {
                        result[objCF.IdRegular].PaymentAdviceReferences.Add
                        (ecov.ConvertPaymentAdviceReference(objPA, ecov.ConvertRegular(aryReg[0])));
                    }
                }

            }

            //put the result into an arraylist
            ArrayList resultArray = new ArrayList();
            foreach (ApasRegularView objARV in result.Values)
            {
                resultArray.Add(objARV);
            }

            return resultArray;
        }