@Override
  public boolean validateFormLogic(UserRequest ureq) {
    boolean allOk = true;

    if (mail.isEmpty("email.address.maynotbeempty")) {
      allOk &= false;
    } else if (!MailHelper.isValidEmailAddress(mail.getValue())) {
      mail.setErrorKey("email.address.notregular", null);
      allOk &= false;
    } else {
      String val = mail.getValue();

      boolean valid = registrationManager.validateEmailUsername(val);
      if (!valid) {
        mail.setErrorKey("form.mail.whitelist.error", null);
      }
      allOk &= valid;
    }

    return allOk && super.validateFormLogic(ureq);
  }
  @Override
  public void event(UserRequest ureq, Controller source, Event event) {
    if (source == tableListParticipants) {
      if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
        TableEvent tableEvent = (TableEvent) event;
        // open window for choosen date to manage the enrolled users or manually add
        if (tableEvent.getActionId().equals(DENListTableDataModel.CHANGE_ACTION)) {
          selectedEvent = (KalendarEvent) listTableData.getObject(tableEvent.getRowId());
          List<Identity> participants = denManager.getEventParticipants(selectedEvent);
          participantsTableData = new DENParticipantsTableDataModel(participants);

          removeAsListenerAndDispose(tableManageParticipants);
          tableManageParticipants =
              denManager.createParticipantsTable(
                  ureq, getWindowControl(), getTranslator(), participantsTableData);
          listenTo(tableManageParticipants);

          removeAsListenerAndDispose(formManageParticipants);
          formManageParticipants = new DENManageParticipantsForm(ureq, getWindowControl());
          listenTo(formManageParticipants);

          participantsVC = createVelocityContainer("participants");
          SimpleText dateTitle =
              new SimpleText(
                  "dateTitle",
                  translate("dates.table.subject") + ": " + selectedEvent.getSubject());
          DateFormat df = new SimpleDateFormat();
          SimpleText dateTimeframe =
              new SimpleText(
                  "dateTimeframe",
                  translate("dates.table.date")
                      + ": "
                      + df.format(selectedEvent.getBegin())
                      + " - "
                      + df.format(selectedEvent.getEnd()));
          participantsVC.put("dateTitle", dateTitle);
          participantsVC.put("dateTimeframe", dateTimeframe);
          participantsVC.put("participantsTable", tableManageParticipants.getInitialComponent());
          participantsVC.put("addParticipants", formManageParticipants.getInitialComponent());

          removeAsListenerAndDispose(manageParticipantsModalCntrl);
          manageParticipantsModalCntrl =
              new CloseableModalController(
                  getWindowControl(),
                  "close",
                  participantsVC,
                  true,
                  translate("dates.table.participant.manage"));
          listenTo(manageParticipantsModalCntrl);

          manageParticipantsModalCntrl.activate();
        }
      } else {
        TableMultiSelectEvent tmse = (TableMultiSelectEvent) event;
        BitSet selection = tmse.getSelection();
        // delete all users from the selected dates
        if (tmse.getAction().equals(DENListTableDataModel.DELETE_ACTION)
            && selection.cardinality() > 0) {
          removed = denManager.getSelectedEventParticipants(dateList, selection);
          dateList =
              denManager.deleteParticipants(
                  ores, courseNode, denManager.getSelectedEventIDs(dateList, selection));
          listTableData.setObjects(dateList);
          // send notification mail
          createRemovedNotificationMail(ureq, dateList.get(0).getSubject());
        } else if (tmse.getAction().equals(DENListTableDataModel.MAIL_ACTION)
            && selection.cardinality() > 0) {
          // send email to all users from the selected dates
          List<Identity> participants =
              denManager.getSelectedEventParticipants(dateList, selection);
          createParticipantsMail(ureq, participants);
        } else if (selection.cardinality() == 0) {
          showWarning("participants.message.empty");
        }
      }
    } else if (source == formManageParticipants
        && event == DENManageParticipantsForm.ADD_PARTICIPANTS) {
      // open user search controller to manually add users in date
      removeAsListenerAndDispose(userSearchCntrl);
      userSearchCntrl = new UserSearchController(ureq, getWindowControl(), true, true);
      listenTo(userSearchCntrl);

      removeAsListenerAndDispose(userSearchCMC);
      userSearchCMC =
          new CloseableModalController(
              getWindowControl(), "close", userSearchCntrl.getInitialComponent());
      listenTo(userSearchCMC);

      userSearchCMC.activate();
    } else if (source == userSearchCntrl) {
      if (event == Event.CANCELLED_EVENT) {
        userSearchCMC.deactivate();
      } else {
        List<Identity> toAdd = null;
        added = new ArrayList<Identity>();
        if (event instanceof SingleIdentityChosenEvent) {
          SingleIdentityChosenEvent singleEvent = (SingleIdentityChosenEvent) event;
          Identity choosenIdentity = singleEvent.getChosenIdentity();
          toAdd = new ArrayList<Identity>();
          toAdd.add(choosenIdentity);
        } else if (event instanceof MultiIdentityChosenEvent) {
          MultiIdentityChosenEvent multiEvent = (MultiIdentityChosenEvent) event;
          toAdd = multiEvent.getChosenIdentities();
        }
        boolean showMessage = false;
        if (toAdd != null && toAdd.size() > 0) {
          for (Identity identity : toAdd) {
            status = denManager.doEnroll(identity, selectedEvent, ores, courseNode, true);
            if (!status.isEnrolled()
                && status.getErrorMessage().equals(DENStatus.ERROR_ALREADY_ENROLLED))
              showMessage = true;
            else added.add(identity);
          }
          if (showMessage) showWarning("enrollment.warning.manual");
          refreshTables();
        }
        userSearchCMC.deactivate();
        if (added.size() > 0) {
          // write notification mail
          createAddedNotificationMail(ureq, dateList.get(0).getSubject());
        }
      }

    } else if (source == tableManageParticipants) {
      if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
        TableEvent tableEvent = (TableEvent) event;
        // delete single user from event
        if (tableEvent.getActionId().equals(DENParticipantsTableDataModel.REMOVE_ACTION)) {
          Identity identity = participantsTableData.getEntryAt(tableEvent.getRowId());
          status = denManager.cancelEnroll(identity, selectedEvent, ores, courseNode);
          if (!status.isCancelled()) showError();
          // send notification mail
          else {
            removed.clear();
            removed.add(identity);
            createRemovedNotificationMail(ureq, dateList.get(0).getSubject());
          }
          refreshTables();
          // write email to single user
        } else if (tableEvent.getActionId().equals(DENParticipantsTableDataModel.MAIL_ACTION)) {
          List<Identity> participants = new ArrayList<Identity>();
          participants.add(participantsTableData.getEntryAt(tableEvent.getRowId()));
          createParticipantsMail(ureq, participants);
        }
      }
    } else if (source == addedNotificationCtr && event == Event.DONE_EVENT) {
      if (addedNotificationCtr.getMailTemplate() != null) {
        Identity sender = ureq.getIdentity();
        MailerResult result = new MailerResult();
        String metaId = UUID.randomUUID().toString().replace("-", "");
        MailContext context =
            new MailContextImpl(getWindowControl().getBusinessControl().getAsString());
        MailBundle[] bundles =
            mailManager.makeMailBundles(
                context, added, addedNotificationCtr.getMailTemplate(), sender, metaId, result);
        result.append(mailManager.sendMessage(bundles));
        if (addedNotificationCtr.getMailTemplate().getCpfrom()) {
          MailBundle ccBundles =
              mailManager.makeMailBundle(
                  context, sender, addedNotificationCtr.getMailTemplate(), sender, metaId, result);
          result.append(mailManager.sendMessage(ccBundles));
        }
        MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
      }
      notificationCmc.deactivate();
      added.clear();
    } else if (source == removedNotificationCtr && event == Event.DONE_EVENT) {
      if (removedNotificationCtr.getMailTemplate() != null) {

        // fxdiff VCRP-16: intern mail system
        Identity sender = ureq.getIdentity();
        MailerResult result = new MailerResult();
        String metaId = UUID.randomUUID().toString().replace("-", "");
        MailContext context =
            new MailContextImpl(getWindowControl().getBusinessControl().getAsString());
        MailBundle[] bundles =
            mailManager.makeMailBundles(
                context, added, addedNotificationCtr.getMailTemplate(), sender, metaId, result);
        result.append(mailManager.sendMessage(bundles));
        if (addedNotificationCtr.getMailTemplate().getCpfrom()) {
          MailBundle ccBundle =
              mailManager.makeMailBundle(
                  context, sender, addedNotificationCtr.getMailTemplate(), sender, metaId, result);
          result.append(mailManager.sendMessage(ccBundle));
        }
        MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
      }
      notificationCmc.deactivate();
      removed.clear();
    } else if (source == contactCtr) {
      notificationCmc.deactivate();
    }
  }