public JsonResult CalendarLoad(CalendarLoadViewModel clvm)
        {
            var begin = DateTimeExtensions.FromUnixTimeStamp(clvm.start);
            var finish = DateTimeExtensions.FromUnixTimeStamp(clvm.end);

            var now = DateTime.Now;
            //check values
            if (String.IsNullOrEmpty(clvm.userid)) clvm.userid = OrgUser.Id;
            
            var myTimeline = clvm.userid==OrgUser.Id;
            var timeline = new Timeline();

            using (var session = OrgStore.OpenSession())
            {
                List<ITimelineItem> items;
                 
                if (myTimeline)
                {
                    var query = session.Query<TimelineItemsWithContext.Result, TimelineItemsWithContext>()
                                       .Where(item => item.SubjectUserId == clvm.userid)
                                       .Where(a => a.Start <= finish && a.End >= begin);
                       
                    items = query.As<dynamic>().As<ITimelineItem>().ToList();

                    var timelineitems = items.ToTimelineItems();
                    timelineitems.RemoveAll(ti => ti.datatype.ToLower() == "concern"); //REMOVE CONCERN ITEMS
                    timeline.items.AddRange(timelineitems);
                }
                else
                {
                    var query = session.Query<TimelineItemsWithContext.Result, TimelineItemsWithContext>()
                                       .Where(
                                           item =>
                                           item.PerspectiveUserId == clvm.userid ||
                                           String.IsNullOrEmpty(item.PerspectiveUserId))
                                       .Where(item => item.SubjectUserId == clvm.userid)
                                       .Where(a => a.Start <= finish && a.End >= begin);
                        
                    items = query.As<dynamic>().As<ITimelineItem>().ToList();

                    timeline.items.AddRange(items.ToTimelineItems());
                }

                if (!Modules.Contains("Leave"))
                {
                    timeline.items.RemoveAll(ti => ti.datatype.ToLower() == "leave"); //REMOVE LEAVE ITEMS
                }
                if (!Modules.Contains("Sickness"))
                {
                    timeline.items.RemoveAll(ti => ti.datatype.ToLower() == "sickness"); //REMOVE LEAVE ITEMS
                }

            }

            //Email comms. Separate as may be taken out of Illumniate
            //TODO: Cc recipients on timeline selection?
            using (var session = OrgStore.OpenSession())
            {

                var Subject = session.Load<User>(clvm.userid);
                var Viewer = OrgUser;

                if (myTimeline)
                {
                    var emails = session.Query<SocialItemsWithContext.Result, SocialItemsWithContext>()
                                        .Where(
                                            item =>
                                            item.Email1 == Viewer.EmailAddress || item.Email2 == Viewer.EmailAddress)
                                        .Where(a => a.Date <= finish && a.Date >= begin)
                                        .As<dynamic>()
                                        .As<ITimelineItem>()
                                        .ToList();

                    timeline.items.AddRange(emails.ToTimelineItems());

                }
                else
                {
                    var emails = session.Query<SocialItemsWithContext.Result, SocialItemsWithContext>()
                                        .Where(
                                            item =>
                                            (item.Email1 == Viewer.EmailAddress && item.Email2 == Subject.EmailAddress) ||
                                            (item.Email2 == Viewer.EmailAddress && item.Email1 == Subject.EmailAddress))
                                        .Where(a => a.Date <= finish && a.Date >= begin)
                                        .As<dynamic>()
                                        .As<ITimelineItem>()
                                        .ToList()
                        ;
                    timeline.items.AddRange(emails.ToTimelineItems());
                }
            }



            var results = timeline.items.Where(i => i.channel.In(clvm.channels)).Select(i => new
                                                         {
                                                             id = i.id,
                                                             title = i.title??"Hig",
                                                             start = i.start.ToUnixTimeStamp(),
                                                             end = i.end.HasValue ? i.end.Value.ToUnixTimeStamp() : null,
                                                             allDay = false,
                                                             datatype=i.datatype,
                                                             className=i.classes
                                                         }).ToArray();


            //var result = new {id="1", title = "test", allDay = false, start =DateTime.Now.ToUnixTimeStamp(),end=DateTime.Now.AddHours(1).ToUnixTimeStamp() };
            return JsonVanilla(results, JsonRequestBehavior.DenyGet);
        }
        public ActionResult FractionalLoad(TimelineLoadViewModel tvm)
        {
            var now = DateTime.Now;
            //check values
            if (String.IsNullOrEmpty(tvm.UserId)) tvm.UserId = OrgUser.Id;
            if (tvm.NewStartDate == DateTime.MinValue) tvm.NewStartDate = now.AddDays(-180);
            if (tvm.NewEndDate == DateTime.MinValue) tvm.NewEndDate = now.AddDays(14);

            var subjectUserId = tvm.UserId;
            var viewerUserId = OrgUser.Id;
            var myTimeline = subjectUserId.Equals(viewerUserId);
            var timeline = new Timeline();

            using (var session = OrgStore.OpenSession())
            {
                List<ITimelineItem> items;
                if (myTimeline)
                {
                    var query = session.Query<TimelineItemsWithContext.Result, TimelineItemsWithContext>()
                                       .Where(item => item.SubjectUserId == viewerUserId)
                                       .Where(a => a.Start <= tvm.NewEndDate && a.End >= tvm.NewStartDate)
                        //overlaps new date boundaries
                                       .Where(a => a.Start > tvm.CurrentEndDate || a.End < tvm.CurrentStartDate);
                        //but not old boundaries (already loaded)); 
                        
                    items = query.As<dynamic>().As<ITimelineItem>().ToList();

                    var timelineitems = items.ToTimelineItems();
                    timelineitems.RemoveAll(ti => ti.datatype.ToLower() == "concern"  ); //REMOVE CONCERN ITEMS and any social items which cant appear on my timeline
                    timeline.items.AddRange(timelineitems);
                }
                else
                {
                    var query = session.Query<TimelineItemsWithContext.Result, TimelineItemsWithContext>()
                                       .Where(
                                           item =>
                                           item.PerspectiveUserId == viewerUserId ||
                                           String.IsNullOrEmpty(item.PerspectiveUserId))
                                       .Where(item => item.SubjectUserId == subjectUserId)

                                       .Where(a => a.Start <= tvm.NewEndDate && a.End >= tvm.NewStartDate)
                        //overlaps new date boundaries
                                       .Where(a => a.Start > tvm.CurrentEndDate || a.End < tvm.CurrentStartDate);
                        //but not old boundaries (already loaded)); 
                    items = query.As<dynamic>().As<ITimelineItem>().ToList();

                    timeline.items.AddRange(items.ToTimelineItems());
                }
            }

            //Email comms. Separate as may be taken out of Illumniate
            //TODO: Cc recipients on timeline selection?
            using (var session = OrgStore.OpenSession())
            {
              
                var subject = session.Load<User>(subjectUserId);
                var viewer = session.Load<User>(viewerUserId);

                if (myTimeline)
                {
                    var emails = session.Query<SocialItemsWithContext.Result, SocialItemsWithContext>()
                                        .Where(
                                            item =>
                                            item.Email1 == viewer.EmailAddress || item.Email2 == viewer.EmailAddress)
                                        .Where(a => a.Date <= tvm.NewEndDate && a.Date >= tvm.NewStartDate)
                        //overlaps new date boundaries
                                        .Where(a => a.Date > tvm.CurrentEndDate || a.Date < tvm.CurrentStartDate)
                        //but not old boundaries (already loaded)); 
                                        .As<dynamic>()
                                        .As<ITimelineItem>()
                                        .ToList()
                        ;
                    timeline.items.AddRange(emails.ToTimelineItems());

                }
                else
                {
                    var emails = session.Query<SocialItemsWithContext.Result, SocialItemsWithContext>()
                                        .Where(
                                            item =>
                                            (item.Email1 == viewer.EmailAddress && item.Email2 == subject.EmailAddress) ||
                                            (item.Email2 == viewer.EmailAddress && item.Email1 == subject.EmailAddress))
                                        .Where(a => a.Date <= tvm.NewEndDate && a.Date >= tvm.NewStartDate)
                        //overlaps new date boundaries
                                        .Where(a => a.Date > tvm.CurrentEndDate || a.Date < tvm.CurrentStartDate)
                        //but not old boundaries (already loaded)); 
                                        .As<dynamic>()
                                        .As<ITimelineItem>()
                                        .ToList()
                        ;
                    timeline.items.AddRange(emails.ToTimelineItems());
                }
            }

            //serialise and return
            return Json(timeline);

        }