protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            try
            {
                conversation = new ConversationModel();

                //(App.Current as App).SecondPageObject = null;
                progressIndicator = SystemTray.ProgressIndicator;
                progressIndicator = new ProgressIndicator();
                SystemTray.SetProgressIndicator(this, progressIndicator);
                progressIndicator.IsIndeterminate = true;
                progressIndicator.Text = "Pulling Messages...";
                if (SettingsMobile.Instance.User == null)
                {
                    SqlFactory fact = new SqlFactory();
                    SettingsMobile.Instance.User = fact.GetProfile();
                }
                conversation.GroupMessageId = Convert.ToInt64(this.NavigationContext.QueryString["mid"]);
                PullTopic();

                _timer = new DispatcherTimer();
                _timer.Interval = TimeSpan.FromSeconds(20);
                _timer.Tick += (s, eee) => Tick();
                _timer.Start();
            }
            catch (Exception exception)
            {
                ErrorHandler.Save(exception, MobileTypeEnum.WP8);
            }

        }
        void ReturnMessageTopic(ConversationModel model)
        {
            try
            {
                if (conversation.Messages.Count < model.Messages.Count)
                {
                    Dispatcher.BeginInvoke(delegate
                    {
                        try
                        {
                            topicName.Title = conversation.Title;
                            MessageList.ItemsSource = conversation.Messages;
                            RecipientsList.ItemsSource = conversation.Recipients;
                            MessageList.ScrollTo(conversation.Messages.LastOrDefault());
                        }
                        catch (Exception exception)
                        {
                            ErrorHandler.Save(exception, MobileTypeEnum.WP8);
                        }
                    });
                }
                conversation = model;

                Dispatcher.BeginInvoke(delegate
                  {
                      progressIndicator.IsVisible = false;
                  });
            }
            catch (Exception exception)
            {
                ErrorHandler.Save(exception, MobileTypeEnum.WP8);
            }
        }
 public static ConversationModel ReplyToMessage(ConversationModel message)
 {
     var response = Network.SendPackage(Network.ConvertObjectToStream(message), MobileConfig.MEMBER_MESSAGES_REPLY_URL);
     var stream = response.GetResponseStream();
     StreamReader read = new StreamReader(stream);
     string json = read.ReadToEnd();
     return Json.DeserializeObject<ConversationModel>(json);
 }
 public static ConversationModel SendNewMessage(ConversationModel message)
 {
     HttpWebResponse response = null;
     if (message.MessageTypeEnum == MessageTypeEnum.Regular)
         response = Network.SendPackage(Network.ConvertObjectToStream(message), MobileConfig.MEMBER_MESSAGES_NEW_URL);
     else if (message.MessageTypeEnum == MessageTypeEnum.Text)
         response = Network.SendPackage(Network.ConvertObjectToStream(message), MobileConfig.MEMBER_MESSAGES_NEW_TEXT_URL);
     var stream = response.GetResponseStream();
     StreamReader read = new StreamReader(stream);
     string json = read.ReadToEnd();
     return Json.DeserializeObject<ConversationModel>(json);
 }
        private void SendPost_Click(object sender, EventArgs e)
        {
            progressIndicator.Text = "Sending Message...";
            progressIndicator.IsVisible = true;
            try
            {
                ConversationModel con = new ConversationModel();
                if (Regular.IsChecked.GetValueOrDefault())
                    con.MessageTypeEnum = MessageTypeEnum.Regular;
                else if (Text.IsChecked.GetValueOrDefault())
                    con.MessageTypeEnum = MessageTypeEnum.Text;
                con.MemberId = SettingsMobile.Instance.User.MemberId;
                con.Message = MessageInput.Text;
                con.Title = Title.Text;
                con.UserId = SettingsMobile.Instance.User.LoginId;
                con.FromId = SettingsMobile.Instance.User.MemberId;
                foreach (var id in Names)
                {
                    long idOfGroup = 0;
                    Guid tempId = new Guid();
                    if (Int64.TryParse(id.Id, out idOfGroup))
                    {
                        con.GroupIds.Add(idOfGroup);
                    }
                    else if (Guid.TryParse(id.Id, out tempId))
                    {
                        con.Recipients.Add(new MemberDisplayMessage() { MemberId = tempId });
                    }
                }
                con.SendEmailForMessage = SendEmail.IsChecked.GetValueOrDefault();

                Task.Run(new Action(() =>
                {
                    try
                    {
                        var m = MessagesMobile.SendNewMessage(con);

                        (App.Current as App).SecondPageObject = conversationModel;
                        Dispatcher.BeginInvoke(delegate
                                                {
                                                    progressIndicator.IsVisible = false;
                                                    ToastPrompt t = new ToastPrompt
                                                    {
                                                        Title = "Message Sent",
                                                        TextOrientation = System.Windows.Controls.Orientation.Vertical

                                                    };
                                                    t.Show();
                                                    NavigationService.Navigate(new Uri("/View/MyLeague/MyLeague.xaml", UriKind.RelativeOrAbsolute));
                                                });
                    }
                    catch (Exception exception)
                    {
                        ErrorHandler.Save(exception, MobileTypeEnum.WP8);
                    }
                }));

            }
            catch (Exception exception)
            {
                ErrorHandler.Save(exception, MobileTypeEnum.WP8);
            }
        }
        public static ConversationModel GetConversationFromGroup(long groupId, Guid memId)
        {
            ConversationModel con = new ConversationModel();
            try
            {
                con.GroupMessageId = groupId;
                con.OwnerUserId = memId;
                var toMem = MemberCache.GetMemberDisplay(memId);
                con.FromName = toMem.DerbyName;

                var dc = new ManagementContext();
                var gro = (from xx in dc.GroupMessages.Include("Messages")
                           where xx.GroupId == groupId
                           where xx.IsDeleted == false
                           select new
                           {
                               xx.TitleOfMessage,
                               Messages = (from yy in xx.Messages
                                           select new
                                           {
                                               yy.FromUser,
                                               yy.Created,
                                               yy.MessageId,
                                               yy.MessageText,
                                               yy.MessagesInbox

                                           }).OrderBy(z => z.MessageId),
                               Recipients = xx.Recipients.Where(x => x.IsRemovedFromGroup == false),

                           }).AsParallel().FirstOrDefault();

                if (gro == null)
                    return null;

                foreach (var user in gro.Recipients)
                {
                    MemberDisplayMessage mem = new MemberDisplayMessage();
                    mem.DerbyName = user.Recipient.DerbyName;
                    mem.Firstname = user.Recipient.Firstname;
                    mem.LastName = user.Recipient.Lastname;
                    if (user.Recipient.Photos.OrderByDescending(x => x.Created).FirstOrDefault() != null)
                        mem.ThumbUrl = user.Recipient.Photos.OrderByDescending(x => x.Created).FirstOrDefault().ImageUrlThumb;
                    mem.MemberId = user.Recipient.MemberId;
                    mem.UserId = user.Recipient.AspNetUserId;
                    con.Recipients.Add(mem);
                }

                con.Title = gro.TitleOfMessage;
                foreach (var message in gro.Messages)
                {
                    try
                    {
                        MessageSingleModel ms = new MessageSingleModel();
                        ms.FromId = message.FromUser.MemberId;
                        ms.FromName = message.FromUser.DerbyName;
                        if (message.FromUser.Photos.OrderByDescending(x => x.Created).FirstOrDefault() != null)
                            ms.ThumbUrl = message.FromUser.Photos.OrderByDescending(x => x.Created).FirstOrDefault().ImageUrlThumb;
                        ms.MessageCreated = message.Created;
                        ms.MessageId = message.MessageId;
                        foreach (var inbox in message.MessagesInbox)
                        {
                            var user = con.Recipients.Where(x => x.MemberId == inbox.ToUser.MemberId).FirstOrDefault();
                            user.HasNotReadConversation = true;
                        }
                        if (!String.IsNullOrEmpty(message.MessageText))
                        {
                            ms.MessageText = message.MessageText;
                            ms.MessageTextHtml = message.MessageText;

                        }
                        if (ms.MessageCreated > con.LastPostDate)
                        {
                            con.LastPostDate = ms.MessageCreated;
                            //con.IsConversationRead = ms.IsMessageRead;
                            con.LastPostBy = ms.FromName;
                        }
                        if (con.Messages.Where(x => x.MessageId == ms.MessageId).FirstOrDefault() == null)
                            con.Messages.Add(ms);
                    }
                    catch (Exception exception)
                    {
                        ErrorDatabaseManager.AddException(exception, exception.GetType());
                    }
                }

            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return con;
        }
        private static void GetGroupMessages(Guid ownerId, MessageModel mess, ManagementContext dc, int page, int take)
        {
            //TODO: add Take(50) a few days from now.
            var to = (from xx in dc.GroupMessages
                      where xx.IsDeleted == false
                      where xx.Recipients.Where(z => z.IsRemovedFromGroup == false).Select(x => x.Recipient.MemberId).Contains(ownerId)
                      select xx).AsParallel().OrderByDescending(x => x.LastModified).Skip(page * take).Take(take).ToList();
            List<RDN.Library.DataModels.Messages.GroupMessage> groups = new List<DataModels.Messages.GroupMessage>();

            //foreach (var recipient in to)
            foreach (var group in to)
            {
                try
                {
                    //var group = recipient.Group;
                    //var messages = recipient.Group.Messages;
                    foreach (var message in group.Messages)
                    {
                        MessageSingleModel ms = new MessageSingleModel();
                        if (message.FromUser == null)
                        {
                            ms.FromId = new Guid();
                        }
                        else
                        {
                            ms.FromId = message.FromUser.MemberId;
                            ms.FromName = message.FromUser.DerbyName;
                        }
                        ms.MessageCreated = message.Created;
                        ms.MessageId = message.MessageId;
                        if (!String.IsNullOrEmpty(message.MessageText))
                        {
                            ms.MessageText = RDN.Portable.Util.Strings.StringExt.HtmlDecode(message.MessageText);
                            if (ms.MessageText.Length > 20)
                                ms.MessageText = ms.MessageText.Remove(20);
                        }

                        var convo = mess.Conversations.Where(x => x.GroupMessageId == group.GroupId).FirstOrDefault();
                        if (convo == null)
                        {

                            ConversationModel con = new ConversationModel();
                            con.CanDelete = true;
                            if (message.FromUser != null)
                            {
                                con.FromName = message.FromUser.DerbyName;
                                con.FromId = message.FromUser.MemberId;
                            }
                            con.LastPostDate = ms.MessageCreated;
                            if (message.MessagesInbox.Where(x => x.ToUser.MemberId == ownerId).FirstOrDefault() == null)
                                con.IsConversationRead = true;

                            con.GroupMessageId = group.GroupId;

                            if (!String.IsNullOrEmpty(group.TitleOfMessage))
                                con.Title = group.TitleOfMessage;
                            else
                                con.Title = "Message";
                            if (message.FromUser != null)
                            {
                                con.LastPostBy = message.FromUser.DerbyName;
                            }
                            var recips = group.Recipients.Where(x => x.IsRemovedFromGroup == false);
                            foreach (var rec in recips)
                            {
                                MemberDisplayMessage mem = new MemberDisplayMessage();
                                mem.DerbyName = rec.Recipient.DerbyName;
                                mem.MemberId = rec.Recipient.MemberId;
                                mem.UserId = rec.Recipient.AspNetUserId;
                                var photo = rec.Recipient.Photos.FirstOrDefault();
                                if (photo != null)
                                    mem.ThumbUrl = photo.ImageUrlThumb;

                                con.Recipients.Add(mem);
                            }
                            con.Messages.Add(ms);
                            mess.Conversations.Add(con);
                        }
                        else
                        {
                            if (ms.MessageCreated > convo.LastPostDate)
                            {
                                convo.LastPostBy = ms.FromName;
                                convo.LastPostDate = ms.MessageCreated;
                            }
                            else
                            {
                                convo.FromId = ms.FromId;
                                convo.FromName = ms.FromName;
                            }

                            if (message.MessagesInbox.Where(x => x.ToUser.MemberId == ownerId).FirstOrDefault() != null)
                                convo.IsConversationRead = false;
                            else
                                convo.IsConversationRead = true;
                            convo.Messages.Add(ms);

                        }

                        groups.Add(group);
                    }
                }
                catch (Exception exception)
                {
                    ErrorDatabaseManager.AddException(exception, exception.GetType());
                }
            }
            mess.Conversations = mess.Conversations.OrderByDescending(x => x.LastPostDate).ToList();
        }
        public static bool CreateNewMessageForGroup(ConversationModel con)
        {
            try
            {
                string conversationLink = ServerConfig.VIEW_MESSAGE_CONVERSATION;
                var dc = new ManagementContext();
                DataModels.Messages.Message m = new DataModels.Messages.Message();
                m.FromUser = dc.Members.Where(x => x.MemberId == con.MemberId).FirstOrDefault();
                m.MessageText = con.Message;
                dc.Message.Add(m);
                dc.SaveChanges();

                string ownerName = String.Empty;
                string messageId = String.Empty;

                if (m.FromUser != null)
                    ownerName = m.FromUser.DerbyName;

                DataModels.Messages.GroupMessage group = new DataModels.Messages.GroupMessage();
                group.Messages.Add(m);
                group.TitleOfMessage = con.Title;
                group.GroupOwnerId = con.FromId;
                group.LastModified = DateTime.UtcNow;
                var fed = dc.Federations.Where(x => x.FederationId == con.FromId).FirstOrDefault();
                if (fed != null)
                    ownerName = fed.Name;
                else
                {
                    var leag = dc.Leagues.Where(x => x.LeagueId == con.FromId).FirstOrDefault();
                    if (leag != null)
                        ownerName = leag.Name;
                }
                dc.GroupMessages.Add(group);
                dc.SaveChanges();
                messageId = group.GroupId.ToString();
                var tempGroups = MemberCache.GetLeagueGroupsOfMember(con.FromId);
                //add all members of the groups
                foreach (var g in con.GroupIds)
                {
                    var tempG = tempGroups.Where(x => x.Id == g).FirstOrDefault();
                    if (tempG != null)
                    {
                        foreach (var mTemp in tempG.GroupMembers)
                        {
                            if (con.Recipients.Where(x => x.MemberId == mTemp.MemberId).FirstOrDefault() == null)
                                con.Recipients.Add(new MemberDisplayMessage() { MemberId = mTemp.MemberId });
                        }
                    }
                }
                foreach (var mem in con.Recipients)
                {
                    try
                    {
                        DataModels.Messages.MessageInbox inbox = new DataModels.Messages.MessageInbox();
                        inbox.Message = m;
                        inbox.ToUser = dc.Members.Where(x => x.MemberId == mem.MemberId).FirstOrDefault();
                        inbox.MessageReadDateTime = DateTime.UtcNow;
                        inbox.NotifiedEmailDateTime = DateTime.UtcNow;
                        if (inbox.ToUser.MemberId == m.FromUser.MemberId)
                            inbox.IsRead = true;
                        else
                            MemberCache.AddMessageCountToCache(+1, mem.MemberId);

                        DataModels.Messages.MessageRecipient recipient = new DataModels.Messages.MessageRecipient();
                        recipient.Group = group;
                        recipient.Recipient = inbox.ToUser;
                        group.Recipients.Add(recipient);

                        if (con.SendEmailForMessage && inbox.ToUser.AspNetUserId != new Guid())
                        {

                            var emailData = new Dictionary<string, string>
                                        {
                                            { "derbyname", inbox.ToUser.DerbyName }, 
                                            { "FromUserName", ownerName }, 
                                            { "messageBody", HtmlSanitize.ReplaceCarriageReturnsWithBreaks( m.MessageText )},
                                            { "viewConversationLink", conversationLink +  messageId}
                                        };

                            var user = System.Web.Security.Membership.GetUser((object)inbox.ToUser.AspNetUserId);
                            if (user != null)
                            {
                                inbox.UserNotifiedViaEmail = true;
                                EmailServer.EmailServer.SendEmail(ServerConfig.DEFAULT_EMAIL_MESSAGES, ServerConfig.DEFAULT_EMAIL_FROM_NAME, user.UserName, EmailServer.EmailServer.DEFAULT_SUBJECT + " New Message From " + ownerName, emailData, EmailServer.EmailServerLayoutsEnum.SendMessageToUserFromOtherUser);
                            }

                        }
                        dc.MessageInbox.Add(inbox);
                    }
                    catch (Exception exception)
                    {
                        ErrorDatabaseManager.AddException(exception, exception.GetType());
                    }
                }

                int c = dc.SaveChanges();

                MobileNotificationFactory fact = new MobileNotificationFactory();
                fact.Initialize("New Message", m.MessageText, Mobile.Enums.NotificationTypeEnum.Message)
                    .AddId(group.GroupId)
                    .AddMembers(con.Recipients.Select(x => x.MemberId).ToList())
                    .SendNotifications();

                return c > 0;
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return false;
        }
        public static bool CreateNewTextMessageForGroup(ConversationModel con)
        {
            try
            {
                string conversationLink = ServerConfig.VIEW_MESSAGE_CONVERSATION;
                var member = MemberCache.GetMemberDisplay(con.MemberId);
                string ownerName = String.Empty;
                ownerName = member.DerbyName;
                var leagueMembers = MemberCache.GetCurrentLeagueMembers(con.MemberId);
                var tempGroups = MemberCache.GetLeagueGroupsOfMember();
                foreach (var g in con.GroupIds)
                {
                    var tempG = tempGroups.Where(x => x.Id == g).FirstOrDefault();
                    if (tempG != null)
                    {
                        foreach (var mTemp in tempG.GroupMembers)
                        {
                            if (con.Recipients.Where(x => x.MemberId == mTemp.MemberId).FirstOrDefault() == null)
                                con.Recipients.Add(new MemberDisplayMessage() { MemberId = mTemp.MemberId });
                        }
                    }
                }


                foreach (var mem in con.Recipients)
                {
                    try
                    {
                        var tempMem = leagueMembers.Where(x => x.MemberId == mem.MemberId).FirstOrDefault();
                        if (tempMem != null)
                        {
                            var emailData = new Dictionary<string, string>
                                        {
                                                                           { "name",tempMem.DerbyName},
                                                                           { "fromName",ownerName},
                                            { "body",ownerName+":"+ con.Message},
                                            { "setupLink",ServerConfig.MEMBER_SETTINGS_URL},

                                        };
                            if (tempMem.IsCarrierVerified)
                            {
                                if (!String.IsNullOrEmpty(tempMem.PhoneNumber))
                                    EmailServer.EmailServer.SendEmail(ServerConfig.DEFAULT_EMAIL_MESSAGES, ServerConfig.DEFAULT_EMAIL_FROM_NAME, ServerConfig.TEXT_MESSAGE_EMAIL, tempMem.PhoneNumber, emailData, EmailServer.EmailServerLayoutsEnum.TextMessage);
                            }
                            else
                            {
                                if (!String.IsNullOrEmpty(tempMem.UserName))
                                    EmailServer.EmailServer.SendEmail(ServerConfig.DEFAULT_EMAIL_MESSAGES, ServerConfig.DEFAULT_EMAIL_FROM_NAME, tempMem.UserName, "Text Message From " + ownerName, emailData, EmailServer.EmailServerLayoutsEnum.TextMessageNotVerified);
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        ErrorDatabaseManager.AddException(exception, exception.GetType());
                    }
                }

                return true;
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return false;
        }
        public static int EmailMembersAboutMessagesWaitingInInbox()
        {
            int emailsSent = 0;
            try
            {
                var dc = new ManagementContext();
                int type = Convert.ToInt32(TaskTypeEnum.EmailMembersThatHaveMessagesSittingInInbox);
                var emailTask = dc.AutomatedTasks.Where(x => x.TaskIdForDescription == type).FirstOrDefault();

                if (emailTask == null)
                {
                    TaskForRunning newTask = new TaskForRunning();
                    newTask.FirstRun = DateTime.UtcNow;
                    newTask.HoursBetweenEachRunOfTask = HOURS_BETWEEN_EMAILS_FOR_MESSAGES_IN_INBOX;
                    newTask.LastRun = DateTime.UtcNow;
                    newTask.TaskIdForDescription = type;
                    dc.AutomatedTasks.Add(newTask);
                    dc.SaveChanges();
                }
                else
                {
                    emailTask.HoursBetweenEachRunOfTask = HOURS_BETWEEN_EMAILS_FOR_MESSAGES_IN_INBOX;
                    if (emailTask.LastRun.AddHours(HOURS_BETWEEN_EMAILS_FOR_MESSAGES_IN_INBOX) < DateTime.UtcNow)
                    {
                        List<Guid> membersToEmail = new List<Guid>();
                        MessageModel mess = new MessageModel();

                        emailTask.LastRun = DateTime.UtcNow;

                        var to = (from xx in dc.MessageInbox.Include("Message").Include("Message.FromUser").Include("ToUser")
                                  where xx.UserNotifiedViaEmail == false
                                  where xx.IsRead == false
                                  select xx).ToList();

                        foreach (var message in to)
                        {
                            message.UserNotifiedViaEmail = true;
                            message.NotifiedEmailDateTime = DateTime.UtcNow;
                            try
                            {
                                MessageSingleModel ms = new MessageSingleModel();
                                ms.FromId = message.Message.FromUser.MemberId;
                                ms.MessageText = RDN.Portable.Util.Strings.StringExt.HtmlDecode(message.Message.MessageText);
                                membersToEmail.Add(message.ToUser.MemberId);
                                if (ms.MessageText.Length > 20)
                                    ms.MessageText = ms.MessageText.Remove(20);
                                var convo = mess.Conversations.Where(x => x.ConversationWithUser == ms.FromId && x.OwnerUserId == message.ToUser.MemberId).FirstOrDefault();
                                if (convo != null)
                                {
                                    convo.Messages.Add(ms);
                                }
                                else
                                {
                                    ConversationModel con = new ConversationModel();
                                    con.ConversationWithUser = ms.FromId;
                                    con.FromName = message.Message.FromUser.DerbyName;
                                    con.OwnerUserId = message.ToUser.MemberId;
                                    con.Messages.Add(ms);
                                    mess.Conversations.Add(con);
                                }
                            }
                            catch (Exception exception)
                            {
                                ErrorDatabaseManager.AddException(exception, exception.GetType());
                            }
                        }
                        dc.SaveChanges();
                        membersToEmail = membersToEmail.Distinct().ToList();

                        var members = dc.Members.Where(x => x.AspNetUserId != null && x.AspNetUserId != new Guid()).Where(x => membersToEmail.Contains(x.MemberId)).ToList();

                        foreach (var mem in members)
                        {
                            string membersWhoSentThisMemberAMessage = String.Empty;
                            foreach (var conv in mess.Conversations.Where(x => x.OwnerUserId == mem.MemberId))
                            {
                                membersWhoSentThisMemberAMessage += conv.FromName;
                                membersWhoSentThisMemberAMessage += "<br/>";
                            }

                            try
                            {
                                var user = System.Web.Security.Membership.GetUser((object)mem.AspNetUserId);
                                var emailData = new Dictionary<string, string>
                                        {
                                            { "derbyname",mem.DerbyName}, 
                                            { "membersWhoSentMessages", membersWhoSentThisMemberAMessage}, 
                                            { "viewConversationLink",ServerConfig.VIEW_MESSAGES_INBOX_MEMBER + mem.MemberId.ToString().Replace("-","") }
                                        };

                                EmailServer.EmailServer.SendEmail(ServerConfig.DEFAULT_EMAIL, ServerConfig.DEFAULT_EMAIL_FROM_NAME, user.UserName, EmailServer.EmailServer.DEFAULT_SUBJECT + " New Messages", emailData, EmailServer.EmailServerLayoutsEnum.SendLatestConversationsThreadToUser);
                                emailsSent += 1;
                            }
                            catch (Exception exception)
                            {
                                Error.ErrorDatabaseManager.AddException(exception, exception.GetType());
                            }
                        }
                        dc.SaveChanges();
                    }
                }
            }
            catch (Exception exception)
            {
                Error.ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return emailsSent;
        }