/***************************************************************************
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 ***************************************************************************/
package org.exoplatform.forum.webui.popup;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.exoplatform.commons.utils.StringCommonUtils;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.common.UserHelper;
import org.exoplatform.forum.common.webui.UIPermissionPanel;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumServiceUtils;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIBreadcumbs;
import org.exoplatform.forum.webui.UICategories;
import org.exoplatform.forum.webui.UICategory;
import org.exoplatform.forum.webui.UIForumContainer;
import org.exoplatform.forum.webui.UIForumDescription;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.forum.webui.UITopicContainer;
import org.exoplatform.services.organization.User;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormInputWithActions;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import org.exoplatform.webui.form.validator.PositiveNumberFormatValidator;

@ComponentConfigs({
    @ComponentConfig(lifecycle = UIFormLifecycle.class, 
      template = "app:/templates/forum/webui/popup/UIForumForm.gtmpl", 
      events = {
        @EventConfig(listeners = UIForumForm.SaveActionListener.class), 
        @EventConfig(listeners = UIForumForm.CancelActionListener.class, phase = Phase.DECODE),
        @EventConfig(listeners = UIForumForm.SelectTabActionListener.class, phase = Phase.DECODE),
        @EventConfig(listeners = UIForumForm.OnChangeAutoEmailActionListener.class, phase = Phase.DECODE) 
    })
})

public class UIForumForm extends BaseForumForm implements UIPopupComponent {
  private boolean            isCategoriesUpdate                  = true;

  private boolean            isForumUpdate                       = false;

  private boolean            isActionBar                         = false;

  private boolean            isMode                              = false;

  private boolean            isUpdate                            = false;

  private String             forumId                             = ForumUtils.EMPTY_STR;

  private String             categoryId                          = ForumUtils.EMPTY_STR;

  private int                id                                  = 0;

  private boolean            isDoubleClickSubmit;

  public static final String FIELD_NEWFORUM_FORM                 = "newForum";

  public static final String FIELD_MODERATOROPTION_FORM          = "moderationOptions";

  public static final String FIELD_CATEGORY_SELECTBOX            = "Category";

  public static final String FIELD_FORUMTITLE_INPUT              = "ForumTitle";

  public static final String FIELD_FORUMORDER_INPUT              = "ForumOrder";

  public static final String FIELD_FORUMSTATUS_SELECTBOX         = "ForumStatus";

  public static final String FIELD_FORUMSTATE_SELECTBOX          = "ForumState";

  public static final String FIELD_DESCRIPTION_TEXTAREA          = "Description";

  public static final String FIELD_AUTOADDEMAILNOTIFY_CHECKBOX   = "AutoAddEmailNotify";

  public static final String FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE = "NotifyWhenAddTopic";

  public static final String FIELD_NOTIFYWHENADDPOST_MULTIVALUE  = "NotifyWhenAddPost";

  public static final String FIELD_MODERATETHREAD_CHECKBOX       = "ModerateThread";

  public static final String FIELD_MODERATEPOST_CHECKBOX         = "ModeratePost";

  public static final String PERMISSION_TAB                      = "forumPermission";

  public static final String MODERATOR                           = "Moderator";

  public static final String VIEWER                              = "Viewer";

  public static final String POSTABLE                            = "Postable";

  public static final String TOPICABLE                           = "Topicable";

  public static final String USER_SELECTOR_POPUPWINDOW           = "UIForumUserPopupWindow";
  
  private Forum forum = null;

  public UIForumForm() throws Exception {
    isDoubleClickSubmit = false;
    setAddColonInLabel(true);
  }

  public boolean isMode() {
    return isMode;
  }

  public void setMode(boolean isMode) {
    this.isMode = isMode;
  }

  public void initForm(String spaceGroupId) throws Exception {
    forum = new Forum();
    List<SelectItemOption<String>> list = new ArrayList<SelectItemOption<String>>();
    if (ForumUtils.isEmpty(categoryId)) {
      List<Category> categorys = getForumService().getCategories(false);
      for (Category category : categorys) {
        list.add(new SelectItemOption<String>(category.getCategoryName(), category.getId()));
      }
      if (list.size() > 0) {
        categoryId = list.get(0).getValue();
      }
    } else {
      Category category = getForumService().getCategory(categoryId);
      list.add(new SelectItemOption<String>(category.getCategoryName(), categoryId));
    }

    UIFormSelectBox selictCategoryId = new UIFormSelectBox(FIELD_CATEGORY_SELECTBOX, FIELD_CATEGORY_SELECTBOX, list);
    selictCategoryId.setDefaultValue(categoryId);

    UIFormStringInput forumTitle = new UIFormStringInput(FIELD_FORUMTITLE_INPUT, FIELD_FORUMTITLE_INPUT, null);
    forumTitle.addValidator(MandatoryValidator.class);
    UIFormStringInput forumOrder = new UIFormStringInput(FIELD_FORUMORDER_INPUT, FIELD_FORUMORDER_INPUT, "0");
    forumOrder.addValidator(PositiveNumberFormatValidator.class);
    List<SelectItemOption<String>> ls = new ArrayList<SelectItemOption<String>>();
    ls.add(new SelectItemOption<String>(getLabel("Open"), "open"));
    ls.add(new SelectItemOption<String>(getLabel("Closed"), "closed"));
    UIFormSelectBox forumState = new UIFormSelectBox(FIELD_FORUMSTATE_SELECTBOX, FIELD_FORUMSTATE_SELECTBOX, ls);
    forumState.setDefaultValue("open");
    ls = new ArrayList<SelectItemOption<String>>();
    ls.add(new SelectItemOption<String>(this.getLabel("UnLock"), "unlock"));
    ls.add(new SelectItemOption<String>(this.getLabel("Locked"), "locked"));
    UIFormSelectBox forumStatus = new UIFormSelectBox(FIELD_FORUMSTATUS_SELECTBOX, FIELD_FORUMSTATUS_SELECTBOX, ls);
    forumStatus.setDefaultValue("unlock");
    UIFormTextAreaInput description = new UIFormTextAreaInput(FIELD_DESCRIPTION_TEXTAREA, FIELD_DESCRIPTION_TEXTAREA, null);

    UICheckBoxInput checkWhenAddTopic = new UICheckBoxInput(FIELD_MODERATETHREAD_CHECKBOX, FIELD_MODERATETHREAD_CHECKBOX, false);

    UIFormTextAreaInput notifyWhenAddPost = new UIFormTextAreaInput(FIELD_NOTIFYWHENADDPOST_MULTIVALUE, FIELD_NOTIFYWHENADDPOST_MULTIVALUE, null);

    UIFormTextAreaInput notifyWhenAddTopic = new UIFormTextAreaInput(FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE, FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE, null);


    UICheckBoxInput autoAddEmailNotify = new UICheckBoxInput(FIELD_AUTOADDEMAILNOTIFY_CHECKBOX, FIELD_AUTOADDEMAILNOTIFY_CHECKBOX, true);
    autoAddEmailNotify.setValue(true);
    autoAddEmailNotify.setOnChange("OnChangeAutoEmail");
    //addUIFormInput(selictCategoryId);
    UIFormInputWithActions newForum = new UIFormInputWithActions(FIELD_NEWFORUM_FORM);
    newForum.addUIFormInput(forumTitle);
    newForum.addUIFormInput(selictCategoryId);
    newForum.addUIFormInput(forumOrder);
    newForum.addUIFormInput(forumState);
    newForum.addUIFormInput(forumStatus);
    newForum.addUIFormInput(description);

    notifyWhenAddPost.setReadOnly(autoAddEmailNotify.getValue());
    notifyWhenAddTopic.setReadOnly(autoAddEmailNotify.getValue());
    
    UIFormInputWithActions moderationOptions = new UIFormInputWithActions(FIELD_MODERATOROPTION_FORM);
    moderationOptions.addUIFormInput(autoAddEmailNotify);
    moderationOptions.addUIFormInput(notifyWhenAddPost);
    moderationOptions.addUIFormInput(notifyWhenAddTopic);
    moderationOptions.addUIFormInput(checkWhenAddTopic);

    addUIFormInput(newForum);
    addUIFormInput(moderationOptions);

    UIPermissionPanel permissionTab = createUIComponent(UIPermissionPanel.class, null, PERMISSION_TAB);
    String []permssion = (isMode == true) ? new String[] { VIEWER, TOPICABLE, POSTABLE } : 
                                            new String[] { MODERATOR, VIEWER, TOPICABLE, POSTABLE }; 
    permissionTab.setPermission(spaceGroupId, permssion);
    addChild(permissionTab);

    setActions(new String[] { "Save", "Cancel" });
  }

  public void activate() {
  }

  public void deActivate() {
  }

  protected boolean getIsSelected(int id) {
    if (this.id == id)
      return true;
    return false;
  }

  public void setForumValue(Forum forum_, boolean isUpdate) throws Exception {
    this.isUpdate = isUpdate;
    if (isUpdate) {
      forumId = forum_.getId();
      forum = getForumService().getForum(categoryId, forumId);
      UIFormInputWithActions newForum = this.getChildById(FIELD_NEWFORUM_FORM);
      newForum.getUIStringInput(FIELD_FORUMTITLE_INPUT).setValue(StringCommonUtils.decodeSpecialCharToHTMLnumber(forum.getForumName()));
      newForum.getUIStringInput(FIELD_FORUMORDER_INPUT).setValue(String.valueOf(forum.getForumOrder()));
      String stat = "open";
      if (forum.getIsClosed())
        stat = "closed";
      newForum.getUIFormSelectBox(FIELD_FORUMSTATE_SELECTBOX).setValue(stat);
      if (forum.getIsLock())
        stat = "locked";
      else
        stat = "unlock";
      newForum.getUIFormSelectBox(FIELD_FORUMSTATUS_SELECTBOX).setValue(stat);
      newForum.getUIFormTextAreaInput(FIELD_DESCRIPTION_TEXTAREA).setDefaultValue(StringCommonUtils.decodeSpecialCharToHTMLnumber(forum.getDescription()));

      UIFormInputWithActions moderationOptions = this.getChildById(FIELD_MODERATOROPTION_FORM);
      boolean isAutoAddEmail = forum.getIsAutoAddEmailNotify();
      UICheckBoxInput boxInput = getUICheckBoxInput(FIELD_AUTOADDEMAILNOTIFY_CHECKBOX);
      boxInput.setChecked(isAutoAddEmail);
      boxInput.setReadOnly(isMode);

      UIFormTextAreaInput notifyWhenAddPost = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDPOST_MULTIVALUE);
      UIFormTextAreaInput notifyWhenAddTopic = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE);
      notifyWhenAddPost.setValue(ForumUtils.unSplitForForum(forum.getNotifyWhenAddPost()));
      notifyWhenAddTopic.setValue(ForumUtils.unSplitForForum(forum.getNotifyWhenAddTopic()));
      notifyWhenAddPost.setReadOnly(isAutoAddEmail);
      notifyWhenAddTopic.setReadOnly(isAutoAddEmail);
      getUICheckBoxInput(FIELD_MODERATETHREAD_CHECKBOX).setChecked(forum.getIsModerateTopic());

      UIPermissionPanel permisisonTab = this.getChildById(PERMISSION_TAB);
      if(isMode == false) {
        permisisonTab.addPermissionForOwners(MODERATOR, forum.getModerators());
      }
      permisisonTab.addPermissionForOwners(VIEWER, forum.getViewer());
      permisisonTab.addPermissionForOwners(TOPICABLE, forum.getCreateTopicRole());
      permisisonTab.addPermissionForOwners(POSTABLE, forum.getPoster());
    }
  }

  public void setCategoryValue(String categoryId, boolean isEditable) throws Exception {
    UIFormInputWithActions newForum = this.getChildById(FIELD_NEWFORUM_FORM);
    if (!ForumUtils.isEmpty(categoryId)) {
      newForum.getUIFormSelectBox(FIELD_CATEGORY_SELECTBOX).setValue(categoryId);
    }
    newForum.getUIFormSelectBox(FIELD_CATEGORY_SELECTBOX).setDisabled(!isEditable);
    isCategoriesUpdate = isEditable;
    this.categoryId = categoryId;
    isUpdate = false;
  }

  public void setForumUpdate(boolean isForumUpdate) {
    this.isForumUpdate = isForumUpdate;
  }

  public boolean isActionBar() {
    return isActionBar;
  }

  public void setActionBar(boolean isActionBar) {
    this.isActionBar = isActionBar;
  }

  private static String listToString(Collection<String> list) {
    return list.toString().replace("[", ForumUtils.EMPTY_STR).replace("]", ForumUtils.EMPTY_STR);
  }

  static public class SaveActionListener extends EventListener<UIForumForm> {
    public void execute(Event<UIForumForm> event) throws Exception {
      UIForumForm uiForm = event.getSource();
      if (uiForm.isDoubleClickSubmit)
        return;
      uiForm.isDoubleClickSubmit = true;
      UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);

      UIFormInputWithActions newForumForm = uiForm.getChildById(FIELD_NEWFORUM_FORM);
      
      UIFormSelectBox categorySelectBox = newForumForm.getUIFormSelectBox(FIELD_CATEGORY_SELECTBOX);
      String categoryId = categorySelectBox.getValue();
      Category category = uiForm.getForumService().getCategory(categoryId);
      if (category == null) {
        uiForm.warning("UICategory.msg.CategoryNotExist");
        forumPortlet.renderForumHome();
        forumPortlet.cancelAction();
        event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
        return;
      }
      String forumTitle = newForumForm.getUIStringInput(FIELD_FORUMTITLE_INPUT).getValue();
      forumTitle = forumTitle.trim();
      int maxText = 50;// ForumUtils.MAXTITLE ;
      if (forumTitle.length() > maxText) {
        uiForm.warning("NameValidator.msg.warning-long-text", new String[] { uiForm.getLabel(FIELD_FORUMTITLE_INPUT), String.valueOf(maxText) });
        uiForm.isDoubleClickSubmit = false;
        return;
      }
      forumTitle = StringCommonUtils.encodeSpecialCharForSimpleInput(forumTitle);
      String forumOrder = newForumForm.getUIStringInput(FIELD_FORUMORDER_INPUT).getValue();
      if (ForumUtils.isEmpty(forumOrder))
        forumOrder = "0";
      forumOrder = ForumUtils.removeZeroFirstNumber(forumOrder);
      if (forumOrder.length() > 3) {
        uiForm.warning("NameValidator.msg.erro-large-number", new String[] { uiForm.getLabel(FIELD_FORUMORDER_INPUT) });
        uiForm.isDoubleClickSubmit = false;
        return;
      }
      String forumState = newForumForm.getUIFormSelectBox(FIELD_FORUMSTATE_SELECTBOX).getValue();
      String forumStatus = newForumForm.getUIFormSelectBox(FIELD_FORUMSTATUS_SELECTBOX).getValue();
      String description = newForumForm.getUIFormTextAreaInput(FIELD_DESCRIPTION_TEXTAREA).getValue();
      description = StringCommonUtils.encodeSpecialCharForSimpleInput(description);
      
      UIPermissionPanel permissionTab = uiForm.getChildById(PERMISSION_TAB);
      String moderators = permissionTab.getOwnersByPermission(MODERATOR);
      String topicable = permissionTab.getOwnersByPermission(TOPICABLE);
      String postable = permissionTab.getOwnersByPermission(POSTABLE);
      String viewer = permissionTab.getOwnersByPermission(VIEWER);

      UIFormInputWithActions moderationOptions = uiForm.getChildById(FIELD_MODERATOROPTION_FORM);
      boolean isAutoAddEmail = uiForm.getUICheckBoxInput(FIELD_AUTOADDEMAILNOTIFY_CHECKBOX).isChecked();
      // set email
      if(uiForm.isMode == false) {
        if (isAutoAddEmail) {
          uiForm.setDefaultEmail(moderationOptions, moderators);
        }
      }
      String notifyWhenAddTopics = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE).getValue();
      String notifyWhenAddPosts = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDPOST_MULTIVALUE).getValue();

      if (!ForumUtils.isValidEmailAddresses(notifyWhenAddPosts) || !ForumUtils.isValidEmailAddresses(notifyWhenAddTopics)) {
        uiForm.warning("MessagePost.msg.invalid-email");
        uiForm.isDoubleClickSubmit = false;
        return;
      }
      String[] notifyWhenAddTopic = ForumUtils.splitForForum(notifyWhenAddTopics);
      String[] notifyWhenAddPost = ForumUtils.splitForForum(notifyWhenAddPosts);
      boolean ModerateTopic = uiForm.getUICheckBoxInput(FIELD_MODERATETHREAD_CHECKBOX).getValue();

      String userName = UserHelper.getCurrentUser();
      Forum newForum = uiForm.forum;
      newForum.setForumName(forumTitle);
      newForum.setOwner(userName);
      newForum.setForumOrder(Integer.valueOf(forumOrder).intValue());
      newForum.setCreatedDate(new Date());
      newForum.setDescription(description);
      newForum.setLastTopicPath(ForumUtils.EMPTY_STR);
      newForum.setPath(ForumUtils.EMPTY_STR);
      newForum.setModifiedBy(userName);
      newForum.setModifiedDate(new Date());
      newForum.setPostCount(0);
      newForum.setTopicCount(0);
      newForum.setIsAutoAddEmailNotify(isAutoAddEmail);
      newForum.setNotifyWhenAddPost(notifyWhenAddPost);
      newForum.setNotifyWhenAddTopic(notifyWhenAddTopic);
      newForum.setIsModeratePost(false);
      newForum.setIsModerateTopic(ModerateTopic);
      if (forumState.equals("closed")) {
        newForum.setIsClosed(true);
      } else {
        newForum.setIsClosed(false);
      }
      if (forumStatus.equals("locked")) {
        newForum.setIsLock(true);
      } else {
        newForum.setIsLock(false);
      }
      
      String[] setTopicable = ForumUtils.splitForForum(topicable);
      String[] setPostable = ForumUtils.splitForForum(postable);
      String[] setViewer = ForumUtils.splitForForum(viewer);

      if(uiForm.isMode == false) {
        String[] setModerators = ForumUtils.splitForForum(moderators);
        newForum.setModerators(setModerators);
      }

      newForum.setCreateTopicRole(setTopicable);
      newForum.setPoster(setPostable);
      newForum.setViewer(setViewer);

      try {
        if (!ForumUtils.isEmpty(uiForm.forumId)) {
          newForum.setId(uiForm.forumId);
          uiForm.getForumService().saveForum(categoryId, newForum, false);
        } else {
          uiForm.getForumService().saveForum(categoryId, newForum, true);
          List<String> invisibleCategories = forumPortlet.getInvisibleCategories();
          List<String> invisibleForums = forumPortlet.getInvisibleForums();
          String listForumId = ForumUtils.EMPTY_STR, listCategoryId = ForumUtils.EMPTY_STR;
          if (!invisibleCategories.isEmpty()) {
            if (invisibleCategories.contains(categoryId)) {
              invisibleForums.add(newForum.getId());
              listForumId = listToString(invisibleForums).replaceAll(" ", ForumUtils.EMPTY_STR);
              listCategoryId = listToString(invisibleCategories).replaceAll(" ", ForumUtils.EMPTY_STR);
              ForumUtils.savePortletPreference(listCategoryId, listForumId);
            }
          }
        }
      } catch (Exception e) {
        uiForm.log.error("Save portlet preference is fall, exception: ", e);
      }

      forumPortlet.cancelAction();
      WebuiRequestContext context = event.getRequestContext();

      if (uiForm.isUpdate && !uiForm.isForumUpdate) {
        if (uiForm.isCategoriesUpdate && uiForm.isActionBar == false) {
          UICategories uiCategories = forumPortlet.findFirstComponentOfType(UICategories.class);
           context.addUIComponentToUpdateByAjax(uiCategories);
        } else {
          UICategory uiCategory = forumPortlet.findFirstComponentOfType(UICategory.class);
          uiCategory.setIsEditForum(true);
          if (!uiForm.isActionBar)
            context.addUIComponentToUpdateByAjax(uiCategory);
        }
        if (uiForm.isActionBar) {
          forumPortlet.findFirstComponentOfType(UICategory.class).setIsEditForum(true);
          context.addUIComponentToUpdateByAjax(forumPortlet);
        }
      } else {
        UITopicContainer uiTopicContainer = forumPortlet.findFirstComponentOfType(UITopicContainer.class);
        UIForumContainer uiForumContainer = forumPortlet.getChild(UIForumContainer.class);
        if (!uiForm.isForumUpdate) {
          forumPortlet.updateIsRendered(ForumUtils.FORUM);
          uiForumContainer.setIsRenderChild(true);
          uiTopicContainer.updateByBreadcumbs(categoryId, newForum.getId(), true, 1);
        }
        UIForumDescription forumDescription = uiForumContainer.getChild(UIForumDescription.class);
        forumDescription.setForum(newForum);
        UIBreadcumbs breadcumbs = forumPortlet.getChild(UIBreadcumbs.class);
        breadcumbs.setUpdataPath(categoryId + ForumUtils.SLASH + newForum.getId());
        context.addUIComponentToUpdateByAjax(forumPortlet);
      }
    }
  }

  static public class CancelActionListener extends EventListener<UIForumForm> {
    public void execute(Event<UIForumForm> event) throws Exception {
      UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
      forumPortlet.cancelAction();
    }
  }

  static public class OnChangeAutoEmailActionListener extends EventListener<UIForumForm> {
    public void execute(Event<UIForumForm> event) throws Exception {
      UIForumForm forumForm = event.getSource();
      UIFormInputWithActions moderationOptions = forumForm.getChildById(FIELD_MODERATOROPTION_FORM);
      UIFormTextAreaInput notifyWhenAddTopics = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE);
      UIFormTextAreaInput notifyWhenAddPosts = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDPOST_MULTIVALUE);
      boolean isCheck = forumForm.getUICheckBoxInput(FIELD_AUTOADDEMAILNOTIFY_CHECKBOX).isChecked();
      if (isCheck) {
        UIPermissionPanel permissionTab = forumForm.getChildById(PERMISSION_TAB);
        String moderators = permissionTab.getOwnersByPermission(MODERATOR);
        forumForm.setDefaultEmail(moderationOptions, moderators);
        notifyWhenAddTopics.setReadOnly(true);
        notifyWhenAddPosts.setReadOnly(true);
      } else {
        notifyWhenAddTopics.setReadOnly(false);
        notifyWhenAddPosts.setReadOnly(false);
      }
      event.getRequestContext().addUIComponentToUpdateByAjax(moderationOptions);
    }
  }

  private void setDefaultEmail(UIFormInputWithActions moderationOptions, String moderators) throws Exception {
    UIFormTextAreaInput notifyWhenAddTopics = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDTOPIC_MULTIVALUE);
    UIFormTextAreaInput notifyWhenAddPosts = moderationOptions.getUIFormTextAreaInput(FIELD_NOTIFYWHENADDPOST_MULTIVALUE);
    UICheckBoxInput boxInput = getUICheckBoxInput(FIELD_AUTOADDEMAILNOTIFY_CHECKBOX);
    if (! boxInput.isChecked()) {
      return;
    }
    if (isMode()) {
      moderators = ForumUtils.unSplitForForum(forum.getModerators());
    }
    Set<String> listModerator = new HashSet<String>();
    if (!ForumUtils.isEmpty(moderators)) {
      String[] moderators_ = ForumUtils.splitForForum(moderators);
      String email;
      User user = null;
      List<String> list = ForumServiceUtils.getUserPermission(moderators_);
      for (String string : list) {
        user = UserHelper.getUserByUserId(string);
        if (user != null && user.isEnabled()) {
          email = user.getEmail();
          listModerator.add(email);
        }
      }
    }
    notifyWhenAddTopics.setValue(listToString(listModerator));
    notifyWhenAddPosts.setValue(listToString(listModerator));
  }

  static public class SelectTabActionListener extends EventListener<UIForumForm> {
    public void execute(Event<UIForumForm> event) throws Exception {
      String id = event.getRequestContext().getRequestParameter(OBJECTID);
      UIForumForm forumForm = event.getSource();
      forumForm.id = Integer.parseInt(id);
      if (forumForm.id == 1 && !forumForm.isMode) {
        UIFormInputWithActions moderationOptions = forumForm.getChildById(FIELD_MODERATOROPTION_FORM);
        UIPermissionPanel permissionTab = forumForm.getChildById(PERMISSION_TAB);
        String moderators = permissionTab.getOwnersByPermission(MODERATOR);
        forumForm.setDefaultEmail(moderationOptions, moderators);
      }
      event.getRequestContext().addUIComponentToUpdateByAjax(forumForm);
    }
  }
}
