public void JsonPCallback()
    {
        string Callback = Request.QueryString["jsonp"];
        if (!string.IsNullOrEmpty(Callback))
        {
            var attendeesQuery = new AttendeesQuery();
            if (HttpContext.Current.Request["query"] != null)
            {
                attendeesQuery = HttpContext.Current.Request["query"].FromJson<AttendeesQuery>();
            }
            //attendeesQuery.CodeCampYearId = Utils.CurrentCodeCampYear;
           // attendeesQuery.Id = 6061;
            attendeesQuery.PresentersOnly = true;
            attendeesQuery.CodeCampYearIds = new List<int>() {7};

            int bioMaxLen = 4096;
            if (HttpContext.Current.Request["biomaxlen"] != null)
            {
                Int32.TryParse(HttpContext.Current.Request["biomaxlen"] ?? "", out bioMaxLen);
            }

            var attendeesManager = new AttendeesManager();
            var listDataSpeakers = attendeesManager.Get(attendeesQuery);

            var sessionsManager = new SessionsManager();
            var sessionsResults = sessionsManager.Get(new SessionsQuery()
            {
                CodeCampYearId = Utils.CurrentCodeCampYear
            });

            //var xxx = listDataSpeakers.Where(a => a.Id == 6061).ToList();

            //var yyy = sessionsResults.Where(a => a.Attendeesid == 6061).ToList();

            var listDataResults = (from data in listDataSpeakers
                                   orderby data.UserLastName
                                   select new
                                   {
                                       AttendeesId = data.Id,
                                       data.UserFirstName,
                                       data.UserLastName,
                                       data.UserWebsite,
                                       data.PKID,
                                       UserBio = TruncateStringWithEllipse(data.UserBio,4090),
                                       UserBioShort = TruncateStringWithEllipse(data.UserBio, bioMaxLen),
                                       data.SpeakerPictureUrl,
                                       data.TwitterHandle

                                       // AFTER REMOVING ATTENDEESID FROM SESSION THIS BROKE. NEED TO FIX IF WE WANT TO
                                       // MAKE JSONP WORK AGAIN CORRECTLY
                                       //Sessions = (from data1 in sessionsResults
                                       //           where data1.Attendeesid == data.Id &&
                                       //                 data1.CodeCampYearId == Utils.CurrentCodeCampYear
                                       //           select new
                                       //           {
                                       //               data1.Id,
                                       //               data1.Title,
                                       //               data1.Description,
                                       //               data.UserFirstName,
                                       //               data.UserLastName
                                       //           }).ToList()

                                   }).ToList();

            //var xx = listDataResults.Where(a => a.AttendeesId == 6061).ToList();

            //foreach (var rec in listDataResults)
            //{
            //    if (bioMaxLen != 0)
            //    {
            //        int oriLen = rec.UserBio.Length;
            //        if (oriLen > bioMaxLen)
            //        {
            //            rec.UserBio = rec.UserBio.Substring(0, bioMaxLen) + "...";
            //        }
            //    }
            //}

            var ret = new { success = true, rows = listDataResults, total = attendeesQuery.OutputTotal };
            Response.Write(Callback + "( " + ret.ToJson() + " );");
        }

        Response.End();
    }
 public List<SpeakerResult> GetSpeakerResults(AttendeesQuery query)
 {
     List<AttendeesResult> recs = Get(query);
     var speakers = new List<SpeakerResult>();
     recs.ForEach(a => speakers.Add(new SpeakerResult()
                                        {
                                            AttendeeId = a.Id,
                                            PKID = a.PKID,
                                            Username = a.Username,
                                            UserWebsite = a.UserWebsite,
                                            UserLocation = a.UserLocation,
                                            UserFirstName = a.UserFirstName,
                                            UserLastName = a.UserLastName,
                                            UserZipCode = a.UserZipCode,
                                            UserBio = a.UserBio,
                                            UserBioEllipsized = Utils.GetEllipsized(a.UserBio, 90, "..."),
                                            SaturdayClasses = a.SaturdayClasses,
                                            SundayClasses = a.SundayClasses,
                                            PhoneNumber = a.PhoneNumber,
                                            AddressLine1 = a.AddressLine1,
                                            EmailSubscription = a.EmailSubscription,
                                            TwitterHandle = a.TwitterHandle,
                                            ImageUrl = String.Format("/attendeeimage/{0}.jpg", a.Id),
                                            Sessions = a.Sessions,
                                            SpeakerLocalUrl =
                                                CreateSpeakerLocalUrl(a,query)
                                        }));
     return speakers;
 }
 /// <summary>
 ///  only create a URL if this person is really a speaker for the given year
 /// </summary>
 /// <param name="speaker"></param>
 /// <param name="query"></param>
 /// <returns></returns>
 private static string CreateSpeakerLocalUrl(AttendeesResult speaker,AttendeesQuery query)
 {
     var retStr = "NOT SPEAKER";
        if (query.PresentersOnly.HasValue && query.PresentersOnly.Value && query.CodeCampYearIds != null && query.CodeCampYearIds.Count == 1)
        {
        retStr = String.Format("/Presenter/{0}/{1}-{2}-{3}",
                               Utils.ConvertCodeCampYearToActualYear(
                                   query.CodeCampYearIds[0].ToString(CultureInfo.InvariantCulture)),
                               speaker.UserFirstName,
                               speaker.UserLastName, speaker.Id);
        }
        return retStr;
 }
        public List<AttendeesResult> Get(AttendeesQuery query)
        {
            var meta = new CodeCampDataContext();

            // add to codecampyearids (make sure List is always populated)
            if (query.CodeCampYearId.HasValue)
            {
                if (query.CodeCampYearIds != null && query.CodeCampYearIds.Count > 0)
                {
                    if (!query.CodeCampYearIds.Contains(query.CodeCampYearId.Value))
                    {
                        query.CodeCampYearIds.Add(query.CodeCampYearId.Value);
                    }
                }
                else
                {
                    query.CodeCampYearIds = new List<int> {query.CodeCampYearId.Value};
                }
            }
            // query.CodeCampYearId should not be used for hear on out, just the array

            IQueryable<Attendees> baseQuery = from myData in meta.Attendees select myData;

            if (query.Emails != null && query.Emails.Count > 0)
            {
                baseQuery = baseQuery.Where(data => query.Emails.Contains(data.Email));
            }

            if (!String.IsNullOrEmpty(query.SpeakerNameWithId))
            {
                // looking for "Peter-Kellner-903"   (all we really care about is Id at end which is third item. I can't think of any reason (at the moment) why this is bad
                //                                    someone could get this url to work  /hate-codecamp-903 but I don't really see the problem for code camp at any rate
                //                                    I prefer not to check the first two words because there could be funny data in the old data that was not checked and I still
                //                                    want the links to work. later we can fix it to check the first/last name if it is an issue.
                List<string> parts = query.SpeakerNameWithId.Split(new[] {'-'}).ToList();
                if (parts.Count == 3)
                {
                    int attendeeId;
                    if (Int32.TryParse(parts[2], out attendeeId))
                    {
                            baseQuery = baseQuery.Where(a => a.Id == attendeeId);
                    }
                }
            }

            if (query.CodeCampYearIds != null && query.CodeCampYearIds.Count > 0)
            {
                if (query.PresentersOnly != null && query.PresentersOnly.Value)
                {
                    var speakerIds = (from sessionPresenter in meta.SessionPresenter
                                      join session in meta.Sessions on sessionPresenter.SessionId equals session.Id
                                      where query.CodeCampYearIds.Contains(session.CodeCampYearId)
                                      select sessionPresenter.AttendeeId).ToList();
                    baseQuery = baseQuery.Where(data => speakerIds.Contains(data.Id));
                }
                //else
                //{
                //    // this may blow up with two many attendees in contains (which translates to sql IN)
                //    var speakerIds = (from data in meta.AttendeesCodeCampYear
                //                      where query.CodeCampYearIds.Contains(data.CodeCampYearId)
                //                      select data.AttendeesId).ToList();
                //    baseQuery = baseQuery.Where(data => speakerIds.Contains(data.Id));
                //}
            }
            else
            {
                // if codecampyear not specified, thenw we need to deal with presentersonly separately
                if (query.PresentersOnly != null)
                {
                    var presenterAttendeeIds = from data in meta.SessionPresenter
                                               select data.AttendeeId;
                    baseQuery = baseQuery.Where(a => presenterAttendeeIds.Contains(a.Id));
                }
            }

            //  next is automated query formation from AutoGen Shared Class
            //  (do not remove next line or filters will go away)
            baseQuery = BaseQueryAutoGen(baseQuery, query);

            if (query.EmailContains != null)
            {
                baseQuery = baseQuery.Where(a => a.Email.Contains(query.EmailContains));
            }

            if (query.AttendeesOnlyNoPresenters != null)
            {
                var presenterAttendeIds = from data in meta.SessionPresenter
                                          select data.AttendeeId;
                baseQuery = baseQuery.Where(a => !presenterAttendeIds.Contains(a.Id));
            }

            IQueryable<AttendeesResult> results = GetBaseResultIQueryable(baseQuery);

            List<AttendeesResult> resultList = GetFinalResults(results, query);

            foreach (var rec in resultList)
            {
                rec.AttendeesId = rec.Id;
            }

            var sessionsBySpeakerdict = new Dictionary<int, List<SessionPresentResultSmall>>();
            if (query.IncludeSessions.HasValue && query.IncludeSessions.Value)
            {

                IQueryable<SessionPresentResultSmall> sessionPresentResultSmalls =
                    from sessionPresenter in meta.SessionPresenter
                    join session in meta.Sessions on sessionPresenter.SessionId equals session.Id
                    join roomdata in meta.LectureRooms on session.LectureRoomsId equals roomdata.Id
                    join timedata in meta.SessionTimes on session.SessionTimesId equals timedata.Id
                    select new SessionPresentResultSmall
                               {
                                   SessionId = session.Id,
                                   CodeCampYearId = session.CodeCampYearId,
                                   AttendeeId = sessionPresenter.AttendeeId,
                                   PrimarySpeakerId = sessionPresenter.AttendeeId, // PROBLEM, THIS NOW PICKS FIRST AS PRIMARY, WILL BE WRONG  3/14/2013
                                   DoNotShowPrimarySpeaker = session.DoNotShowPrimarySpeaker,
                                   Title = session.Title,
                                   TitleEllipsized = Utils.GetEllipsized(session.Title, 45, "..."),
                                   RoomNumber = roomdata.Number,
                                   SessionTime = timedata.StartTimeFriendly,
                                   Description = session.Description,
                                   DescriptionEllipsized = Utils.GetEllipsized(session.Description, 75, "..."),
                                   SessionUrl =
                                       String.Format("/Session/{0}/{1}",
                                                     Utils.ConvertCodeCampYearToActualYear(
                                                         session.CodeCampYearId.ToString(CultureInfo.InvariantCulture)),
                                                     Utils.GenerateSlug(session.Title)),
                               };

                if (query.CodeCampYearIds != null && query.CodeCampYearIds.Count > 0)
                {
                    sessionPresentResultSmalls =
                        sessionPresentResultSmalls.Where(a => query.CodeCampYearIds.Contains(a.CodeCampYearId));
                }

                foreach (var rec in sessionPresentResultSmalls)
                {
                    if (!sessionsBySpeakerdict.ContainsKey(rec.AttendeeId))
                    {
                        // no speakers in session dictionary so add it from scarch
                        sessionsBySpeakerdict.Add(rec.AttendeeId, new List<SessionPresentResultSmall>
                                                                      {
                                                                          rec
                                                                      });
                    }
                    else
                    {
                        // add one more speaker to this session
                        List<SessionPresentResultSmall> sessionPresentResultSmallsTemp =
                            sessionsBySpeakerdict[rec.AttendeeId];
                        sessionPresentResultSmallsTemp.Add(rec);
                        sessionsBySpeakerdict[rec.AttendeeId] = sessionPresentResultSmallsTemp;

                    }
                }

            }

            if (query.IncludeSessions.HasValue && query.IncludeSessions.Value)
            {
                foreach (var attendee in resultList)
                {
                    attendee.SessionIds = new List<int>();
                    attendee.Sessions = new List<SessionPresentResultSmall>();

                    List<SessionPresentResultSmall> sessionPresentResultSmallsTemp = sessionsBySpeakerdict[attendee.Id];
                    if (sessionPresentResultSmallsTemp != null && sessionPresentResultSmallsTemp.Count > 0)
                    {
                        // check and see if this person owns the session AND there name is to be supressed

                        var sessionPresentResultSmallsFiltered = new List<SessionPresentResultSmall>();
                        foreach (var recc in sessionPresentResultSmallsTemp)
                        {
                            bool supressSpeaker = recc.DoNotShowPrimarySpeaker &&
                                                  recc.PrimarySpeakerId == recc.AttendeeId;
                            if (!supressSpeaker)
                            {
                                sessionPresentResultSmallsFiltered.Add(recc);
                            }
                        }
                        attendee.SessionIds = sessionPresentResultSmallsTemp.Select(a => a.SessionId).ToList();
                        attendee.Sessions = sessionPresentResultSmallsTemp.ToList();
                    }
                }
            }

            // blank out info not to be shown
            if (query.RespectQRCodes != null && query.RespectQRCodes.Value)
            {
                foreach (var rec in resultList)
                {
                    rec.SpeakerPictureUrl =
                        String.Format("http://www.siliconvalley-codecamp.com/DisplayImage.ashx?PKID={0}", rec.PKID);

                    if (!(rec.QRAddressLine1Allow != null && rec.QRAddressLine1Allow.Value))
                    {
                        rec.AddressLine1 = string.Empty;
                    }

                    if (!(rec.QREmailAllow != null && rec.QREmailAllow.Value))
                    {
                        rec.Email = string.Empty;
                    }

                    if (!(rec.QRPhoneAllow != null && rec.QRPhoneAllow.Value))
                    {
                        rec.PhoneNumber = string.Empty;
                    }

                    if (!(rec.QRWebSiteAllow != null && rec.QRWebSiteAllow.Value))
                    {
                        rec.UserWebsite = string.Empty;
                    }

                    if (!(rec.QRZipCodeAllow != null && rec.QRZipCodeAllow.Value))
                    {
                        rec.UserZipCode = string.Empty;
                    }
                    else
                    {
                        // Grab up city state from zip
                        rec.City = "CityToSet";
                        rec.State = "StateToSet";
                    }
                }
            }

            // only pull AttendeesCodeCampYearData when current code camp year and attendeeId (Id) is specified.
            // otherwise, quietly ignore.
            if (query.CodeCampYearId.HasValue &&
                query.IncludeAttendeesCodeCampYearResult.HasValue && query.IncludeAttendeesCodeCampYearResult.Value)
            {
                List<int> attendeeIds = resultList.Select(a => a.Id).ToList();
                Dictionary<int, AttendeesCodeCampYearResult> codeCampYearResults = meta.AttendeesCodeCampYear.Where(
                    data => attendeeIds.Contains(data.Id) &&
                            data.CodeCampYearId ==
                            query.CodeCampYearId).Select(a => new AttendeesCodeCampYearResult
                                                                  {
                                                                      Id = a.Id,
                                                                      AttendeesId = a.AttendeesId,
                                                                      AttendSaturday = a.AttendSaturday,
                                                                      AttendSunday = a.AttendSunday,
                                                                      CodeCampYearId = a.CodeCampYearId,
                                                                      Volunteer = a.Volunteer,
                                                                      CreateDate = a.CreateDate
                                                                  })
                                                                                       .ToDictionary(
                                                                                           k => k.AttendeesId, v => v);
                foreach (var rec in resultList)
                {
                    if (codeCampYearResults.ContainsKey(rec.Id))
                    {
                        rec.AttendeesCodeCampYearResult = codeCampYearResults[rec.Id];
                    }
                }
            }

            // need to fill out base record for all current stuff about code camp attendee this year
            //public bool RegisteredCurrentYear { get; set; }
            //public bool HasSessionsCurrentYear { get; set; }
            //public string AttendingDaysChoiceCurrentYear { get; set; }
            //public bool VolunteeredCurrentYear { get; set; }

            if (query.CodeCampYearId.HasValue && query.IncludeAttendeesCodeCampYearResult.HasValue && query.IncludeAttendeesCodeCampYearResult.Value)
            {
                // avoid to big IN clauses
                Dictionary<int, AttendeesCodeCampYear> attendeesCodeCampYearResultsDict;
                List<int> attendeeIdsThatArePresentersThisYear;

                if (resultList.Count < 100)
                {
                    List<int> attendeeIds = resultList.Select(a => a.Id).ToList();
                        attendeesCodeCampYearResultsDict = (from data in meta.AttendeesCodeCampYear
                                                        where attendeeIds.Contains(data.AttendeesId) && data.CodeCampYearId == query.CodeCampYearId.Value
                                                        select data).ToDictionary(k => k.AttendeesId, v => v);

                    attendeeIdsThatArePresentersThisYear = (from attendee in meta.Attendees
                                                            join sessionPresenter in meta.SessionPresenter on attendee.Id equals
                                                                sessionPresenter.AttendeeId
                                                            where attendeeIds.Contains(attendee.Id)
                                                            select attendee.Id).ToList();

                }
                else
                {
                    attendeesCodeCampYearResultsDict = (from data in meta.AttendeesCodeCampYear
                                                        where data.CodeCampYearId == query.CodeCampYearId.Value
                                                        select data).ToDictionary(k => k.AttendeesId, v => v);

                    attendeeIdsThatArePresentersThisYear = (from attendee in meta.Attendees
                                                            join sessionPresenter in meta.SessionPresenter on attendee.Id equals
                                                                sessionPresenter.AttendeeId
                                                            join session in meta.Sessions on sessionPresenter.SessionId equals
                                                                session.Id
                                                            where session.CodeCampYearId == query.CodeCampYearId
                                                            select attendee.Id).ToList();

                }

                foreach (var attendee in resultList)
                {
                   if (attendeesCodeCampYearResultsDict.ContainsKey(attendee.Id))
                   {
                       var attendeeCodeCampYear  = attendeesCodeCampYearResultsDict[attendee.Id];
                       attendee.AttendingDaysChoiceCurrentYear = attendeeCodeCampYear.AttendingDaysChoice;
                       attendee.HasSessionsCurrentYear = attendeeIdsThatArePresentersThisYear.Contains(attendee.Id);
                       attendee.RegisteredCurrentYear = attendeesCodeCampYearResultsDict.ContainsKey(attendee.Id);
                       attendee.VolunteeredCurrentYear = attendeesCodeCampYearResultsDict.ContainsKey(attendee.Id) &&
                                                         attendeesCodeCampYearResultsDict[attendee.Id].Volunteer
                                                                                                      .HasValue &&
                                                         attendeesCodeCampYearResultsDict[attendee.Id].Volunteer.Value;
                   }
                }
            }

            return resultList;
        }