// from interface Context
 public String getEverythingURL(String vector, Page page, Object... args) {
   return _data.everythingURL + "?token=" + Args.createLinkToken(page, args) + "&vec=" + vector;
 }
  // from interface ValueChangeHandler<String>
  public void onValueChange(ValueChangeEvent<String> event) {
    Args args = new Args(event.getValue());

    // if we have showing popups, clear them out
    _pstack.clear();

    // these are OK to view as a guest
    switch (args.page) {
      case ATTRACTOR:
        setContent(LandingPage.attractor(this, args.get(0, 0), args.get(1, 0)));
        return;
      case LANDING:
        setContent(LandingPage.news(this, _news));
        return;
      case CARD:
        setContent(LandingPage.card(this, args.get(0, 0), args.get(1, 0), args.get(2, 0L)));
        return;
      case CREDITS:
        setContent(new CreditsPage(this));
        return;
      case BROWSE:
        if (args.get(0, getMe().userId) != 0) {
          if (!(_content instanceof BrowsePage)) {
            setContent(new BrowsePage(this));
          }
          ((BrowsePage) _content)
              .setArgs(args.get(0, getMe().userId), args.get(1, 0), args.get(1, ""));
          return;
        }
        break;
      default:
        break; // keep going
    }

    // otherwise guests see the "add this app to play" button
    if (getMe().isGuest()) {
      setContent(LandingPage.news(this, _news));
      return;
    }

    // these are OK as a regular player
    switch (args.page) {
      case FLIP:
        setContent(new FlipPage(this));
        return;
      case SHOP:
        setContent(new ShopPage(this));
        return;
      case GET_COINS:
        setContent(new BuyCoinsPage(this, args.get(0, "")));
        return;
      case FRIENDS:
        if (!(_content instanceof FriendsPage)) {
          setContent(new FriendsPage(this));
        }
        ((FriendsPage) _content).setMode(args.get(0, ""));
        return;
      case EDIT_INTRO:
        setContent(new EditIntroPage(this));
        return;
      default:
        break; // keep going
    }

    // these are OK for editors
    if (isEditor()) {
      switch (args.page) {
        case EDIT_CATS:
          if (!(_content instanceof EditCatsPage)) {
            setContent(new EditCatsPage(this));
          }
          ((EditCatsPage) _content).setArgs(args);
          return;
        case EDIT_PENDING:
          setContent(new EditPendingPage(this));
          return;
        case EDIT_INDEV:
          if (!(_content instanceof InDevPage)) {
            setContent(new InDevPage(this));
          }
          ((InDevPage) _content).setMode(args.get(0, ""));
          return;
        case EDIT_FAQ:
          setContent(new EditFAQPage(this));
          return;
        case EDIT_SERIES:
          setContent(new EditSeriesPage(this, args.get(0, 0)));
          return;
        default:
          break; // keep going
      }
    }

    // these are OK for admins
    if (isAdmin()) {
      switch (args.page) {
        case ADMIN_STATS:
          setContent(new StatsPage(this));
          return;
        case ADMIN_NEWS:
          setContent(new EditNewsPage(this, _news));
          return;
        default:
          break; // keep going
      }
    }

    // otherwise default to displaying the landing panel
    setContent(LandingPage.news(this, _news));
  }