/**
   * Prepares the GUI
   *
   * @param entity PerunEntity GROUP or VO
   * @param applicationType INITIAL | EXTENSION
   */
  protected void prepareGui(PerunEntity entity, String applicationType) {

    // trigger email verification as first if present in URL

    if (Location.getParameterMap().keySet().contains("m")
        && Location.getParameterMap().keySet().contains("i")) {

      String verifyI = Location.getParameter("i");
      String verifyM = Location.getParameter("m");

      if (verifyI != null && !verifyI.isEmpty() && verifyM != null && !verifyM.isEmpty()) {

        final SimplePanel verifContent = new SimplePanel();
        leftMenu.addItem(
            ApplicationMessages.INSTANCE.emailValidationMenuItem(),
            SmallIcons.INSTANCE.documentSignatureIcon(),
            verifContent);

        ValidateEmail request =
            new ValidateEmail(
                verifyI,
                verifyM,
                new JsonCallbackEvents() {
                  @Override
                  public void onLoadingStart() {
                    verifContent.clear();
                    verifContent.add(new AjaxLoaderImage());
                  }

                  @Override
                  public void onFinished(JavaScriptObject jso) {

                    BasicOverlayType obj = jso.cast();
                    if (obj.getBoolean() == true) {

                      verifContent.clear();
                      FlexTable ft = new FlexTable();
                      ft.setSize("100%", "300px");
                      ft.setHTML(
                          0,
                          0,
                          new Image(LargeIcons.INSTANCE.acceptIcon())
                              + "<h2>"
                              + ApplicationMessages.INSTANCE.emailValidationSuccess()
                              + "</h2>");
                      ft.getFlexCellFormatter()
                          .setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER);
                      ft.getFlexCellFormatter()
                          .setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_MIDDLE);
                      verifContent.add(ft);

                    } else {

                      verifContent.clear();
                      FlexTable ft = new FlexTable();
                      ft.setSize("100%", "300px");
                      ft.setHTML(
                          0,
                          0,
                          new Image(LargeIcons.INSTANCE.deleteIcon())
                              + "<h2>"
                              + ApplicationMessages.INSTANCE.emailValidationFail()
                              + "</h2>");
                      ft.getFlexCellFormatter()
                          .setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER);
                      ft.getFlexCellFormatter()
                          .setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_MIDDLE);
                      verifContent.add(ft);
                    }
                  }

                  @Override
                  public void onError(PerunError error) {
                    ((AjaxLoaderImage) verifContent.getWidget()).loadingError(error);
                  }
                });
        request.retrieveData();

        leftMenu.addLogoutItem();

        return;
      }
    }

    // group and extension is not allowed
    if (group != null && applicationType.equalsIgnoreCase("EXTENSION")) {

      RootLayoutPanel panel = RootLayoutPanel.get();
      panel.clear();
      FlexTable ft = new FlexTable();
      ft.setSize("100%", "300px");
      ft.setHTML(
          0,
          0,
          new Image(LargeIcons.INSTANCE.errorIcon())
              + "<h2>Error: "
              + ApplicationMessages.INSTANCE.groupMembershipCantBeExtended(
                  group.getName(), vo.getName())
              + "</h2>");
      ft.getFlexCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER);
      ft.getFlexCellFormatter().setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_MIDDLE);
      panel.add(ft);
      return;
    }

    // application form page
    ApplicationFormPage formPage = new ApplicationFormPage(vo, group, applicationType);
    // even user "not yet in perun" can have some applications sent (therefore display by session
    // info)
    UsersApplicationsPage appsPage = new UsersApplicationsPage();

    // if rt test
    if ("true".equals(Location.getParameter("rttest"))) {
      TestRtReportingTabItem tabItem = new TestRtReportingTabItem();
      Widget rtTab = tabItem.draw();
      leftMenu.addItem("RT test", SmallIcons.INSTANCE.settingToolsIcon(), rtTab);
    }

    // proper menu text
    String appMenuText = ApplicationMessages.INSTANCE.applicationFormForVo(vo.getName());
    if (group != null) {
      appMenuText = ApplicationMessages.INSTANCE.applicationFormForGroup(group.getName());
    }
    if (applicationType.equalsIgnoreCase("EXTENSION")) {
      appMenuText = ApplicationMessages.INSTANCE.membershipExtensionForVo(vo.getName());
      if (group != null) {
        appMenuText = ApplicationMessages.INSTANCE.membershipExtensionForGroup(group.getName());
      }
    }

    // load list of applications first if param in session
    if ("apps".equals(Location.getParameter("page"))) {
      Anchor a =
          leftMenu.addItem(
              ApplicationMessages.INSTANCE.applications(),
              SmallIcons.INSTANCE.applicationFromStorageIcon(),
              appsPage);
      leftMenu.addItem(appMenuText, SmallIcons.INSTANCE.applicationFormIcon(), formPage);
      a.fireEvent(new ClickEvent() {});
      // appsPage.menuClick(); // load list of apps
    } else {
      Anchor a = leftMenu.addItem(appMenuText, SmallIcons.INSTANCE.applicationFormIcon(), formPage);
      leftMenu.addItem(
          ApplicationMessages.INSTANCE.applications(),
          SmallIcons.INSTANCE.applicationFromStorageIcon(),
          appsPage);
      a.fireEvent(new ClickEvent() {});
      // formPage.menuClick(); // load application form
    }

    leftMenu.addLogoutItem();
  }
  private void isUserMemberOfVo() {

    // CHECK USER IF PRESENT
    if (session.getUser() != null) {

      GetMemberByUser req =
          new GetMemberByUser(
              vo.getId(),
              session.getUser().getId(),
              new JsonCallbackEvents() {
                @Override
                public void onFinished(JavaScriptObject jso) {

                  Member member = jso.cast();
                  if (member.getVoId() == vo.getId()) {

                    // USER IS MEMBER OF VO
                    if (groupName != null && !groupName.isEmpty()) {

                      GetMemberGroups call =
                          new GetMemberGroups(
                              member.getId(),
                              new JsonCallbackEvents() {
                                @Override
                                public void onFinished(JavaScriptObject jso) {

                                  ArrayList<Group> groups = JsonUtils.jsoAsList(jso);
                                  for (Group g : groups) {
                                    if (g.getId() == group.getId()) {
                                      // USER IS MEMBER OF GROUP
                                      prepareGui(PerunEntity.GROUP, "EXTENSION");
                                      return;
                                    }
                                  }
                                  // USER IS NOT MEMBER OF GROUP
                                  prepareGui(PerunEntity.GROUP, "INITIAL");
                                }

                                @Override
                                public void onError(PerunError error) {

                                  RootLayoutPanel panel = RootLayoutPanel.get();
                                  panel.clear();
                                  panel.add(getErrorWidget(error));
                                }
                              });
                      call.retrieveData();

                    } else {
                      // only VO application
                      prepareGui(PerunEntity.VIRTUAL_ORGANIZATION, "EXTENSION");
                    }
                  } else {

                    // TODO display error ? - retrieved member is not member of VO ??

                  }
                }

                public void onError(PerunError error) {

                  // not member of VO - load initial
                  if (error.getName().equalsIgnoreCase("MemberNotExistsException")) {
                    if (groupName != null && !groupName.isEmpty()) {

                      // load application to group for NOT vo members
                      prepareGui(PerunEntity.GROUP, "INITIAL");

                      // Do NOT display application to Group if not member of VO
                      // RootLayoutPanel panel = RootLayoutPanel.get();
                      // panel.clear();
                      // panel.add(getCustomErrorWidget(error,
                      // ApplicationMessages.INSTANCE.mustBeVoMemberFirst()));

                    } else {
                      prepareGui(PerunEntity.VIRTUAL_ORGANIZATION, "INITIAL");
                    }
                  } else {

                    RootLayoutPanel panel = RootLayoutPanel.get();
                    panel.clear();
                    panel.add(getErrorWidget(error));
                  }
                }
              });
      req.setHidden(true);
      req.retrieveData();
      return;
    }

    // UNKNOWN USER - LOAD INITIAL
    if (groupName != null && !groupName.isEmpty()) {
      prepareGui(PerunEntity.GROUP, "INITIAL");
    } else {
      prepareGui(PerunEntity.VIRTUAL_ORGANIZATION, "INITIAL");
    }

    return;
  }