public List<DirEventsReplyData> FindEvents(string queryText, uint eventFlags, int StartQuery, UUID scopeID)
        {
            object remoteValue = DoRemote(queryText, eventFlags, StartQuery, scopeID);
            if (remoteValue != null || m_doRemoteOnly)
                return (List<DirEventsReplyData>)remoteValue;

            List<DirEventsReplyData> Data = new List<DirEventsReplyData>();

            QueryFilter filter = new QueryFilter();

            //|0| means search between some days
            if (queryText.Contains("|0|"))
            {
                string StringDay = queryText.Split('|')[0];
                if (StringDay == "u") //"u" means search for events that are going on today
                {
                    filter.andGreaterThanEqFilters["UNIX_TIMESTAMP(date)"] = Util.ToUnixTime(DateTime.Today);
                }
                else
                {
                    //Pull the day out then and search for that many days in the future/past
                    int Day = int.Parse(StringDay);
                    DateTime SearchedDay = DateTime.Today.AddDays(Day);
                    //We only look at one day at a time
                    DateTime NextDay = SearchedDay.AddDays(1);
                    filter.andGreaterThanEqFilters["UNIX_TIMESTAMP(date)"] = Util.ToUnixTime(SearchedDay);
                    filter.andLessThanEqFilters["UNIX_TIMESTAMP(date)"] = Util.ToUnixTime(NextDay);
                    filter.andLessThanEqFilters["flags"] = (int)eventFlags;
                }
            }
            else
            {
                filter.andLikeFilters["name"] = "%" + queryText + "%";
            }
            if (scopeID != UUID.Zero)
                filter.andFilters["scopeID"] = scopeID;

            List<string> retVal = GD.Query(new[]{
                "EID",
                "creator",
                "date",
                "maturity",
                "flags",
                "name"
            }, "asevents", filter, null, (uint)StartQuery, 50);

            if (retVal.Count > 0)
            {
                for (int i = 0; i < retVal.Count; i += 6)
                {
                    DirEventsReplyData replyData = new DirEventsReplyData
                                                       {
                                                           eventID = Convert.ToUInt32(retVal[i]),
                                                           ownerID = new UUID(retVal[i + 1]),
                                                           name = retVal[i + 5],
                                                       };
                    DateTime date = DateTime.Parse(retVal[i + 2]);
                    replyData.date = date.ToString(new DateTimeFormatInfo());
                    replyData.unixTime = (uint)Util.ToUnixTime(date);
                    replyData.eventFlags = Convert.ToUInt32(retVal[i + 4]);

                    //Check the maturity levels
                    uint maturity = Convert.ToUInt32(retVal[i + 3]);
                    if(
                            (maturity == 0 && (eventFlags & (uint)EventFlags.PG) == (uint)EventFlags.PG) ||
                            (maturity == 1 && (eventFlags & (uint)EventFlags.Mature) == (uint)EventFlags.Mature) ||
                            (maturity == 2 && (eventFlags & (uint)EventFlags.Adult) == (uint)EventFlags.Adult)
                    )
                    {
                        Data.Add(replyData);
                    }
                }
            }

            return Data;
        }
        public void DirEventsQuery(IClientAPI remoteClient, UUID queryID,
            string queryText, uint queryFlags, int queryStart)
        {
            Hashtable ReqHash = new Hashtable();
            ReqHash["text"] = queryText;
            ReqHash["flags"] = queryFlags.ToString();
            ReqHash["query_start"] = queryStart.ToString();

            Hashtable result = GenericXMLRPCRequest(ReqHash,
                    "dir_events_query");

            if (!Convert.ToBoolean(result["success"]))
            {
                remoteClient.SendAgentAlertMessage(
                        result["errorMessage"].ToString(), false);
                return;
            }

            ArrayList dataArray = (ArrayList)result["data"];

            int count = dataArray.Count;
            if (count > 100)
                count = 101;

            DirEventsReplyData[] data = new DirEventsReplyData[count];

            int i = 0;

            foreach (Object o in dataArray)
            {
                Hashtable d = (Hashtable)o;

                data[i] = new DirEventsReplyData();
                data[i].ownerID = new UUID(d["owner_id"].ToString());
                data[i].name = d["name"].ToString();
                data[i].eventID = Convert.ToUInt32(d["event_id"]);
                data[i].date = d["date"].ToString();
                data[i].unixTime = Convert.ToUInt32(d["unix_time"]);
                data[i].eventFlags = Convert.ToUInt32(d["event_flags"]);
                i++;
                if (i >= count)
                    break;
            }

            remoteClient.SendDirEventsReply(queryID, data);
        }
        public List<DirEventsReplyData> FindAllEventsInRegion(string regionName, int maturity)
        {
            object remoteValue = DoRemote(regionName, maturity);
            if (remoteValue != null || m_doRemoteOnly)
                return (List<DirEventsReplyData>)remoteValue;

            List<DirEventsReplyData> Data = new List<DirEventsReplyData>();

            IRegionData regiondata = DataManager.DataManager.RequestPlugin<IRegionData>();
            if (regiondata != null)
            {
                List<GridRegion> regions = regiondata.Get(regionName, null, null, null);
                if (regions.Count >= 1)
                {
                    QueryFilter filter = new QueryFilter();
                    filter.andFilters["region"] = regions[0].RegionID.ToString();
                    filter.andFilters["maturity"] = maturity;

                    List<string> retVal = GD.Query(new[]{
                        "EID",
                        "creator",
                        "date",
                        "maturity",
                        "flags",
                        "name"
                    }, "asevents", filter, null, null, null);

                    if (retVal.Count > 0)
                    {
                        for (int i = 0; i < retVal.Count; i += 6)
                        {
                            DirEventsReplyData replyData = new DirEventsReplyData
                                                               {
                                                                   eventID = Convert.ToUInt32(retVal[i]),
                                                                   ownerID = new UUID(retVal[i + 1]),
                                                                   name = retVal[i + 5],
                                                               };
                            DateTime date = DateTime.Parse(retVal[i + 2]);
                            replyData.date = date.ToString(new DateTimeFormatInfo());
                            replyData.unixTime = (uint)Util.ToUnixTime(date);
                            replyData.eventFlags = Convert.ToUInt32(retVal[i + 4]);

                            Data.Add(replyData);
                        }
                    }
                }
            }

            return Data;
        }
        /// <summary>
        ///   Retrives all events in the given region by their maturity level
        /// </summary>
        /// <param name = "regionName"></param>
        /// <param name = "maturity">Uses DirectoryManager.EventFlags to determine the maturity requested</param>
        /// <returns></returns>
        public DirEventsReplyData[] FindAllEventsInRegion(string regionName, int maturity)
        {
            List<DirEventsReplyData> Data = new List<DirEventsReplyData>();

            IRegionData regiondata = Aurora.DataManager.DataManager.RequestPlugin<IRegionData>();
            if (regiondata != null)
            {
                List<GridRegion> regions = regiondata.Get(regionName, UUID.Zero);
                if (regions.Count >= 1)
                {
                    Dictionary<string, object> whereClause = new Dictionary<string, object>();
                    whereClause["region"] = regions[0].RegionID.ToString();
                    whereClause["maturity"] = maturity;

                    List<string> retVal = GD.Query(new string[]{
                        "EID",
                        "creator",
                        "date",
                        "maturity",
                        "flags",
                        "name"
                    }, "asevents", new QueryFilter
                    {
                        andFilters = whereClause
                    }, null, null, null);

                    if (retVal.Count > 0)
                    {
                        DirEventsReplyData replyData;
                        for (int i = 0; i < retVal.Count; i += 6)
                        {
                            replyData = new DirEventsReplyData
                            {
                                eventID = Convert.ToUInt32(retVal[i]),
                                ownerID = new UUID(retVal[i + 1]),
                                name = retVal[i + 5],
                            };
                            DateTime date = DateTime.Parse(retVal[i + 2].ToString());
                            replyData.date = date.ToString(new DateTimeFormatInfo());
                            replyData.unixTime = (uint)Util.ToUnixTime(date);
                            replyData.eventFlags = Convert.ToUInt32(retVal[i + 4]);

                            Data.Add(replyData);
                        }
                    }
                }
            }

            return Data.ToArray();
        }