public async Task LoadNotifications( Session session )
		{
			IXList<Notification> notifications = await _notificationsProvider.GetNotifications( session.Token );

		    if (notifications.Count > 200)
		    {
                notifications =  new XSubRangeCollection<Notification>(notifications, 0, 200);
		    }
            
			Notifications.Update(notifications);

			NotificationsEmpty = Notifications.Count == 0;
		}
        public MainViewModel(
         //   IExpirationGuardian expirationGuardian, 
            IProfileProvider profileProvider, 
            IGenresProvider genresProvider, 
            ICatalogProvider catalogProvider, 
            ICredentialsProvider credentialsProvider,
            IBookProvider bookProvider,
            INavigationService navigationService, 
            INetworkAvailabilityService networkAvailability,
            IDeviceInfoService deviceInfoService, ILitresPurchaseService litresPurchaseService)
        {            
            _genresProvider = genresProvider;
			_catalogProvider = catalogProvider;
			_credentialsProvider = credentialsProvider;
			_profileProvider = profileProvider;
			_bookProvider = bookProvider;
			_navigationService = navigationService;
		//    _expirationGuardian = expirationGuardian;
		    _networkAvailability = networkAvailability;
            _deviceInfoService = deviceInfoService;
            _litresPurchaseService = litresPurchaseService;

            var deviceFamily = _deviceInfoService.DeviceFamily;
            if (!string.IsNullOrEmpty(deviceFamily) && deviceFamily.Equals("Windows.Desktop"))
            {
                _booksPerPage = 30;
            }
            ////MyBooks reload allways, may change account information
            RegisterAction(BuyBookPart).AddPart((session) => BuyBookAsync(session, Book), (session) => true);
            RegisterAction(GiftBookPart).AddPart((session) => GetGiftAsync(session, Book), (session) => true);
            RegisterAction(MyBooksPart).AddPart( LoadMyBooks, session => true);
            RegisterAction(BuyBookLitresPart).AddPart((session) => BuyBookFromLitres(session, Book), (session) => true);
            RegisterAction(CreditCardInfoPart).AddPart(session => CreditCardInfoAsync(session), (session) => true);
            RegisterAction(LoadMoreNoveltyBooksPart).AddPart(session => LoadNoveltyBooks(session), session => true);
            RegisterAction(LoadMorePopularBooksPart).AddPart(session => LoadPopularBooks(session), session => true);
            RegisterAction(LoadMoreInterestingBooksPart).AddPart(session => LoadInterestingBooks(session), session => true);
            RegisterAction(MyOffersPart).AddPart(LoadOffers, session => true);
            //RegisterPart(MyBooksPart, (session, part) => LoadMyBooks(session), (session, part) => true, false);
            ////RegisterPart(NewBooksPart, (session, part) => LoadNewBooks(session), (session, part) => true, false);

            MyBooksViewState = MyBooksViewStateEnum.Loading;

			Genres = new XCollection<Genre>();
			Banners = new XCollection<Banner>();

			_myBooks = new XCollection<Book>();
			_noveltyBooks = new XCollection<Book>();
			_popularBooks = new XCollection<Book>();
			_interestingBooks = new XCollection<Book>();

			MyBooks = new XSubRangeCollection<Book>(_myBooks, 0, 10);
            
            NoveltyBooks = new XCollection<Book>();
			PopularBooks = new XCollection<Book>();
			InterestingBooks = new XCollection<Book>();
			ShowMyBooks = new RelayCommand( ToMyBooks );
            BookSelected = new RelayCommand<Book>(book =>  _navigationService.Navigate("Book", XParameters.Create("BookEntity", book)), book => book != null);
            BuyBook = new RelayCommand<Book>(BuyBookFromLitresAsync);
            GiftBook = new RelayCommand<Book>(GiftBookFromLitresAsync);
            ShowInterestingBooks = new RelayCommand(() => _navigationService.Navigate("BooksByCategory", XParameters.Create("category", (int) BooksByCategoryViewModel.BooksViewModelTypeEnum.Interesting)));
			ShowPopularBooks = new RelayCommand(() => _navigationService.Navigate("BooksByCategory", XParameters.Create("category", (int) BooksByCategoryViewModel.BooksViewModelTypeEnum.Popular)));
			ShowNewBooks = new RelayCommand(() => _navigationService.Navigate("BooksByCategory", XParameters.Create("category", (int) BooksByCategoryViewModel.BooksViewModelTypeEnum.Novelty)));
            LoadMoreNoveltyBooks = new RelayCommand(LoadMoreNoveltyBooksProceed, () => true);
            LoadMorePopularBooks = new RelayCommand(LoadMorePopularBooksProceed, () => true);
            LoadMoreInterestingBooks = new RelayCommand(LoadMoreInterestingBooksProceed, () => true);
            GenreSelected = new RelayCommand<int>(ChooseGenre);
			ShowSearchHistory = new RelayCommand(() => _navigationService.Navigate("Search"));
            BuyBookFromMicrosoft = new RelayCommand(BuyBookFromMicrosoftAsync);
            Read = new RelayCommand<Book>(book =>
            {
                if (!book.IsExpiredBook)
                    _navigationService.Navigate("Reader", XParameters.Create("BookEntity", book), false);
                else new MessageDialog("Истёк срок выдачи.").ShowAsync();
            });

            ShowAuthorization = new RelayCommand(() => _navigationService.Navigate("Authorization"));
            ShowRegistration = new RelayCommand(() => _navigationService.Navigate("Registration"));
			ShowUserInfo = new RelayCommand( ToUserInfo );
            RunCreditCardPaymentProcess = new RelayCommand(CreditCardInfo);
           
            ShowAccountInfo = new RelayCommand(ToAccountInfo);
			ShowSettings = new RelayCommand(() => _navigationService.Navigate("Settings"));
			ShowBookmarks = new RelayCommand( () => _navigationService.Navigate( "Bookmarks" ) );
			ShowAbout = new RelayCommand( () => _navigationService.Navigate( "About" ) );
			ShowNotifications = new RelayCommand(() => _navigationService.Navigate("NotificationsEdit"));
            ShowCreditCardView = new RelayCommand<Book>(book => _navigationService.Navigate("CreditCardPurchase", XParameters.Create("BookEntity", book)), book => book != null);

            ShowAppSettings = new RelayCommand(ToAppSettings);

            //_expirationGuardian.StartGuardian();		    
        }
        //public void ShowAllCollections()
        //{
        //    FirstCollections = new XSubRangeCollection<Book.CollectionsInfo>(FoundCollections, 0, FoundCollections.Count);
        //    OnPropertyChanged(new PropertyChangedEventArgs("MoreCollectionsCount"));
        //    OnPropertyChanged(new PropertyChangedEventArgs("FirstCollections"));
        //}

        public void ShowAllBooks()
        {
            FirstBooks = new XSubRangeCollection<Book>(FoundBooks, 0, FoundBooks.Count);
            OnPropertyChanged(new PropertyChangedEventArgs("MoreOtherBooksCount"));
            OnPropertyChanged(new PropertyChangedEventArgs("FirstBooks"));
        }
 public void ShowAllSequences()
 {
     FirstSequeces = new XSubRangeCollection<Book.SequenceInfo>(FoundSequeses, 0, FoundSequeses.Count);
     OnPropertyChanged(new PropertyChangedEventArgs("MoreSequencesCount"));
     OnPropertyChanged(new PropertyChangedEventArgs("FirstSequeces"));
 }
	    public void ShowAllPersons()
	    {
            FirstPersons = new XSubRangeCollection<Person>(FoundPersons,0, FoundPersons.Count);
            OnPropertyChanged(new PropertyChangedEventArgs("MorePersonsCount"));
            OnPropertyChanged(new PropertyChangedEventArgs("FirstPersons"));
        }
        private async Task SearchAll(Session session)
	    {
            try
            {
                IsTagsAndGenresLoaded = false;
                TagsAndGenresCollection.Clear();
                OnPropertyChanged(new PropertyChangedEventArgs("TagsAndGenresCollection"));

                BestResult.Clear();
                OnPropertyChanged(new PropertyChangedEventArgs("BestResult"));
                AllResultsObject = null;
                OnPropertyChanged(new PropertyChangedEventArgs("IsBestResultExists"));

                FoundBooks.Clear();
                OnPropertyChanged(new PropertyChangedEventArgs("FoundBooks"));
                FoundPersons.Clear();
                OnPropertyChanged(new PropertyChangedEventArgs("FoundPersons"));
                FoundSequeses.Clear();
                OnPropertyChanged(new PropertyChangedEventArgs("FoundSequeses"));
                //FoundCollections.Clear();
                //OnPropertyChanged(new PropertyChangedEventArgs("FoundCollections"));

                FoundedCount = string.Empty;
                OnPropertyChanged(new PropertyChangedEventArgs("FoundedCount"));
                OnPropertyChanged(new PropertyChangedEventArgs("MoreOtherBooksCount"));
                OnPropertyChanged(new PropertyChangedEventArgs("MorePersonsCount"));
                OnPropertyChanged(new PropertyChangedEventArgs("MoreSequencesCount"));
                //OnPropertyChanged(new PropertyChangedEventArgs("MoreCollectionsCount"));

                FirstPersons = new XSubRangeCollection<Person>(FoundPersons, 0, 3);
                FirstSequeces = new XSubRangeCollection<Book.SequenceInfo>(FoundSequeses, 0, 3);
                //FirstCollections = new XSubRangeCollection<Book.CollectionsInfo>(FoundCollections, 0, 3);
                FirstBooks = new XSubRangeCollection<Book>(FoundBooks, 0, 3);

                AllResultsObject = await _catalogProvider.SearchAll(30, SearchQuery, session.Token);

                if (AllResultsObject != null)
                {
                    SortBestResult();

                    FoundSequeses.BeginUpdate();
                    FoundSequeses.Update(AllResultsObject.GetSequences());
                    FoundSequeses.EndUpdate();
                    OnPropertyChanged(new PropertyChangedEventArgs("MoreSequencesCount"));

                    //FoundCollections.BeginUpdate();
                    //FoundCollections.Update(AllResultsObject.GetCollection());
                    //FoundCollections.EndUpdate();
                    //OnPropertyChanged(new PropertyChangedEventArgs("FoundCollections"));

                    InitGenresAndTagsList();
                    FoundedCount = AllResultsObject.FoundResults();

                    var books = AllResultsObject.GetBooks();
                    _catalogProvider.CheckMyBooks(books);

                    FoundBooks.BeginUpdate();
                    FoundBooks.Update(books);
                    FoundBooks.EndUpdate();
                    OnPropertyChanged(new PropertyChangedEventArgs("MoreOtherBooksCount"));

                    FoundPersons.BeginUpdate();
                    FoundPersons.Update(AllResultsObject.GetPersons());
                    FoundPersons.EndUpdate();
                    OnPropertyChanged(new PropertyChangedEventArgs("MorePersonsCount"));

                    InitBestResult();
                    if (Convert.ToInt32(FoundedCount) > 0)
                        OnPropertyChanged(new PropertyChangedEventArgs("Found"));
                    else
                        OnPropertyChanged(new PropertyChangedEventArgs("NotFound"));
                }
                else
                {
                    OnPropertyChanged(new PropertyChangedEventArgs("NotFound"));
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                OnPropertyChanged(new PropertyChangedEventArgs("NotFound"));
            }
	    }
        public SearchViewModel(ICatalogProvider catalogProvider, INavigationService navigationService, ILitresPurchaseService litresPurchaseService, ICredentialsProvider credentialsProvider, IProfileProvider profileProvider)
        {
            _catalogProvider = catalogProvider;
            _navigationService = navigationService;
            _litresPurchaseService = litresPurchaseService;
            _credentialsProvider = credentialsProvider;
            _profileProvider = profileProvider;

            FoundBooks = new XCollection<Book>();
            FoundPersons = new XCollection<Person>();
            FoundSequeses = new XCollection<Book.SequenceInfo>();
           
            FirstBooks = new XSubRangeCollection<Book>(FoundBooks, 0, 3);
            FirstPersons = new XSubRangeCollection<Person>(FoundPersons, 0, 3);
            FirstSequeces = new XSubRangeCollection<Book.SequenceInfo>(FoundSequeses, 0, 3);
            //FoundCollections = new XCollection<Book.CollectionsInfo>();
            //FirstCollections = new XSubRangeCollection<Book.CollectionsInfo>(FoundCollections, 0, 3);

            TagsAndGenresCollection = new List<object>(6);
            BestResult = new List<object>();

            RegisterAction(LoadAllDataPart).AddPart(SearchAll, session => true);
            RegisterAction(BuyBookLitresPart).AddPart((session) => BuyBookFromLitres(session, Book), (session) => true);
            RegisterAction(CreditCardInfoPart).AddPart(session => CreditCardInfoAsync(session), (session) => true);
            RegisterAction(BuyBookPart).AddPart((session) => BuyBookAsync(session, Book), (session) => true);

            BuyBook = new RelayCommand<Book>(book => BuyBookFromLitresAsync(book));
            RunCreditCardPaymentProcess = new RelayCommand(CreditCardInfo);
            ShowCreditCardView = new RelayCommand<Book>(book => _navigationService.Navigate("CreditCardPurchase", XParameters.Create("BookEntity", book)), book => book != null);
            BuyBookFromMicrosoft = new RelayCommand(BuyBookFromMicrosoftAsync);

            BookSelected = new RelayCommand<Book>(book => _navigationService.Navigate("Book", XParameters.Create("BookEntity", book)), book => book != null);
            PersonSelected = new RelayCommand<Person>(person => _navigationService.Navigate("Person", XParameters.Create("Id", person.Id)), person => person != null);
            GenreSelected = new RelayCommand<Genre>(genre => _navigationService.Navigate("BooksByCategory", XParameters.Empty.ToBuilder()
                .AddValue("category", 6)
                .AddValue("id", int.Parse(genre.id))
                .AddValue("title", genre.name)
                .ToImmutable()), genre => genre != null);
            TagSelected = new RelayCommand<Tag>(tag => _navigationService.Navigate("BooksByCategory", XParameters.Empty.ToBuilder()
                .AddValue("category", 5)
                .AddValue("id", int.Parse(tag.id))
                .AddValue("title", tag.name)
                .ToImmutable()), tag => tag != null);
            SequenceSelected = new RelayCommand<Book.SequenceInfo>(sequence => _navigationService.Navigate("BooksByCategory", XParameters.Empty.ToBuilder()
                .AddValue("category", 7)
                .AddValue("id", sequence.Id)
                .AddValue("title", sequence.Name)
                .ToImmutable()), sequence => sequence != null);
            Read = new RelayCommand<Book>(book =>
            {
                if (!book.IsExpiredBook)
                    _navigationService.Navigate("Reader", XParameters.Create("BookEntity", book), false);
                else new MessageDialog("Истёк срок выдачи.").ShowAsync();
            });

            //CollectionSelected = new RelayCommand<Book.SequenceInfo>(sequence => _navigationService.Navigate("BooksByCategory", XParameters.Empty.ToBuilder()
            //    .AddValue("category", 8)
            //    .AddValue("id", sequence.Id)
            //    .AddValue("title", sequence.Name)
            //    .ToImmutable()), sequence => sequence != null);

            LoadMoreFoundBooks = new RelayCommand(() => Load(new Session()));
        }