/**
   * Refreshes the members, filtered by any fixed criteria, as well as any user-specified filters.
   */
  public void refresh() {
    Criteria criteria = getCurrentCriteria();

    Map<String, Object> criteriaMap =
        (criteria != null) ? criteria.getValues() : Collections.<String, Object>emptyMap();

    try {
      carouselSizeFilter = Integer.valueOf((String) criteriaMap.get(FILTER_CAROUSEL_SIZE));
    } catch (Exception e) {
      carouselSizeFilter = null;
    }

    try {
      carouselStartFilter = (Integer) criteriaMap.get(FILTER_CAROUSEL_START);
    } catch (Exception e) {
      carouselStartFilter = null;
    }

    // on refresh remove any end filter as the criteria may have changed completely
    carouselEndFilter = null;

    // Any change to filters means we have to rebuild the carousel because the set of members may
    // change, because
    // "empty" members (i.e. members whose relevant data has been completely filtered) may be
    // omitted completely
    // from the carousel.
    buildCarousel(true);

    // TODO: it would be best if this was actually called after the async return of the member
    // refreshes
    refreshCarouselInfo();
  }
  private void next() {
    if (null == carouselSizeFilter) {
      carouselSizeFilter = getDefaultCarouselSize();
    }

    if (null != carouselEndFilter) {
      int newStart = carouselEndFilter - 1;
      newStart = (newStart < carouselSizeFilter) ? carouselSizeFilter : newStart;
      setCarouselStartFilter(newStart);
    }

    setCarouselEndFilter(null);

    buildCarousel(true);
  }
  private void previous() {
    if (null == carouselSizeFilter) {
      carouselSizeFilter = getDefaultCarouselSize();
    }

    if (null != carouselStartFilter) {
      int newEnd = carouselStartFilter + 1;
      setCarouselEndFilter(newEnd);

      // it's ok if this is higher than the current max, the actual fetch will make sure the
      // values are sane.
      setCarouselStartFilter(carouselStartFilter + carouselSizeFilter);
    }

    buildCarousel(true);
  }