You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/05/18 05:36:15 UTC

[08/26] openmeetings git commit: Normalize all the line endings

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index aa234b5..7484e44 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -1,412 +1,412 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.admin.rooms;
-
-import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
-import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.getRights;
-import static org.apache.openmeetings.web.app.WebSession.getSid;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.dao.server.ISessionManager;
-import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.dao.user.IUserService;
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.room.Client;
-import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.db.entity.room.RoomGroup;
-import org.apache.openmeetings.db.entity.room.RoomModerator;
-import org.apache.openmeetings.db.entity.user.Address;
-import org.apache.openmeetings.db.entity.user.Group;
-import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.web.admin.AdminBaseForm;
-import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
-import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
-import org.apache.openmeetings.web.util.RoomTypeDropDown;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
-import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.CheckBox;
-import org.apache.wicket.markup.html.form.ChoiceRenderer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.RequiredTextField;
-import org.apache.wicket.markup.html.form.TextArea;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.time.Duration;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Response;
-import org.wicketstuff.select2.Select2Choice;
-import org.wicketstuff.select2.Select2MultiChoice;
-
-public class RoomForm extends AdminBaseForm<Room> {
-	private static final long serialVersionUID = 1L;
-	private final static List<Long> DROPDOWN_NUMBER_OF_PARTICIPANTS = Arrays.asList(2L, 4L, 6L, 8L, 10L, 12L, 14L, 16L, 20L, 25L, 32L, 50L,
-			100L, 150L, 200L, 500L, 1000L);
-	private final WebMarkupContainer roomList;
-	private final TextField<String> pin = new TextField<>("pin");
-	private final WebMarkupContainer moderatorContainer = new WebMarkupContainer("moderatorContainer");
-	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
-	private final ListView<Client> clients = new ListView<Client>("clients", new ArrayList<>()) {
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		protected void populateItem(final ListItem<Client> item) {
-			Client client = item.getModelObject();
-			item.add(new Label("clientId", "" + client.getId()))
-				.add(new Label("clientLogin", "" + client.getUsername()))
-				.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onSubmit(AjaxRequestTarget target) {
-						Client c = item.getModelObject();
-						getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
-								, c.getServer() == null ? 0 : c.getServer().getId());
-
-						updateClients(target);
-					}
-				});
-		}
-	};
-	private IModel<User> moderator2add = Model.of((User)null);
-
-	public RoomForm(String id, WebMarkupContainer roomList, final Room room) {
-		super(id, new CompoundPropertyModel<>(room));
-		this.roomList = roomList;
-		setOutputMarkupId(true);
-	}
-
-	@Override
-	protected void onInitialize() {
-		super.onInitialize();
-		RequiredTextField<String> name = new RequiredTextField<>("name");
-		name.setLabel(new Model<>(Application.getString(193)));
-		add(name);
-
-		add(new DropDownChoice<>("numberOfPartizipants", //
-				DROPDOWN_NUMBER_OF_PARTICIPANTS, //
-				new ChoiceRenderer<Long>() {
-					private static final long serialVersionUID = 1L;
-					@Override
-					public Object getDisplayValue(Long id) {
-						return id;
-					}
-					@Override
-					public String getIdValue(Long id, int index) {
-						return "" + id;
-					}
-				}));
-
-		add(new RoomTypeDropDown("type").setRequired(true).setLabel(Model.of(Application.getString(194))));
-
-		add(new TextArea<String>("comment"));
-
-		boolean isGroupAdmin = hasGroupAdminLevel(getRights());
-		add(new CheckBox("appointment").setEnabled(false));
-		add(new CheckBox("ispublic").setEnabled(!isGroupAdmin));
-
-		List<Group> orgList = isGroupAdmin
-				? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
-				: getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
-		final List<RoomGroup> orgRooms = new ArrayList<>(orgList.size());
-		for (Group org : orgList) {
-			orgRooms.add(new RoomGroup(org, getModelObject()));
-		}
-		add(new Select2MultiChoice<>("roomGroups", null, new ChoiceProvider<RoomGroup>() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public String getDisplayValue(RoomGroup choice) {
-				String name = choice.getGroup().getName();
-				return name == null ? "" : name;
-			}
-
-			@Override
-			public String getIdValue(RoomGroup choice) {
-				Long id = choice.getGroup().getId();
-				return id == null ? null : "" + id;
-			}
-
-			@Override
-			public void query(String term, int page, Response<RoomGroup> response) {
-				for (RoomGroup or : orgRooms) {
-					if (Strings.isEmpty(term) || or.getGroup().getName().contains(term)) {
-						response.add(or);
-					}
-				}
-			}
-
-			@Override
-			public Collection<RoomGroup> toChoices(Collection<String> _ids) {
-				List<Long> ids = new ArrayList<>();
-				for (String id : _ids) {
-					ids.add(Long.valueOf(id));
-				}
-				List<RoomGroup> list = new ArrayList<>();
-				for (Group o : getBean(GroupDao.class).get(ids)) {
-					list.add(new RoomGroup(o, RoomForm.this.getModelObject()));
-				}
-				return list;
-			}
-		}).setLabel(Model.of(getString("828"))).setRequired(isGroupAdmin));
-
-		add(new CheckBox("isDemoRoom"));
-		TextField<Integer> demoTime = new TextField<>("demoTime");
-		demoTime.setLabel(new Model<>(Application.getString(637)));
-		add(demoTime);
-		add(new CheckBox("allowUserQuestions"));
-		add(new CheckBox("audioOnly"));
-		add(new CheckBox("closed"));
-		add(new TextField<String>("redirectURL"));
-		add(new CheckBox("waitForRecording"));
-		add(new CheckBox("allowRecording"));
-		add(new CheckBox("chatModerated"));
-
-		add(new Select2MultiChoice<>("hiddenElements", null, new ChoiceProvider<RoomElement>() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public String getDisplayValue(RoomElement choice) {
-				return choice.name();
-			}
-
-			@Override
-			public String getIdValue(RoomElement choice) {
-				return choice.name();
-			}
-
-			@Override
-			public void query(String term, int page, Response<RoomElement> response) {
-				for (RoomElement r : RoomElement.values()) {
-					if (Strings.isEmpty(term) || r.name().contains(term)) {
-						response.add(r);
-					}
-				}
-			}
-
-			@Override
-			public Collection<RoomElement> toChoices(Collection<String> ids) {
-				Collection<RoomElement> rights = new ArrayList<>(ids.size());
-				for (String id : ids) {
-					rights.add(RoomElement.valueOf(id));
-				}
-				return rights;
-			}
-		}));
-		add(new CheckBox("chatOpened"));
-		add(new CheckBox("filesOpened"));
-		add(new CheckBox("autoVideoSelect"));
-
-		// Users in this Room
-		add(clientsContainer.add(clients.setOutputMarkupId(true)).setOutputMarkupId(true));
-
-		// Moderators
-		final Select2Choice<User> moderatorChoice = new Select2Choice<>("moderator2add", moderator2add, new AdminUserChoiceProvider() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void query(String term, int page, Response<User> response) {
-				response.addAll(getBean(UserDao.class).get(term, false, page * PAGE_SIZE, PAGE_SIZE));
-				response.setHasMore(PAGE_SIZE == response.getResults().size());
-			}
-
-			@Override
-			public String getDisplayValue(User choice) {
-				Address a = choice.getAddress();
-				return String.format("\"%s %s\" <%s>", choice.getFirstname(), choice.getLastname(), a == null ? "" : a.getEmail());
-			}
-		});
-		add(moderatorChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				Room r = RoomForm.this.getModelObject();
-				User u = moderator2add.getObject();
-				boolean found = false;
-				if (u != null) {
-					if (r.getModerators() == null) {
-						r.setModerators(new ArrayList<RoomModerator>());
-					}
-					for (RoomModerator rm : r.getModerators()) {
-						if (rm.getUser().getId().equals(u.getId())) {
-							found = true;
-							break;
-						}
-					}
-					if (!found) {
-						RoomModerator rm = new RoomModerator();
-						rm.setRoomId(r.getId());
-						rm.setUser(u);
-						r.getModerators().add(0, rm);
-						moderator2add.setObject(null);
-						target.add(moderatorContainer, moderatorChoice);
-					}
-				}
-			}
-		}).setOutputMarkupId(true));
-		add(moderatorContainer.add(new ListView<RoomModerator>("moderators") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(final ListItem<RoomModerator> item) {
-				RoomModerator moderator = item.getModelObject();
-				Label name = new Label("uName", moderator.getUser().getFirstname() + " " + moderator.getUser().getLastname());
-				if (moderator.getId() == null) {
-					name.add(AttributeModifier.append("class", "newItem"));
-				}
-				item.add(new CheckBox("superModerator", new PropertyModel<Boolean>(moderator, "superModerator")))
-					.add(new Label("userId", "" + moderator.getUser().getId()))
-					.add(name)
-					.add(new Label("email", moderator.getUser().getAddress().getEmail()))
-					.add(new ConfirmableAjaxBorder("delete", getString("80"), getString("833")) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						protected void onSubmit(AjaxRequestTarget target) {
-							RoomForm.this.getModelObject().getModerators().remove(item.getIndex());
-							target.add(moderatorContainer);
-						}
-					});
-			}
-		}).setOutputMarkupId(true));
-
-		add(new CheckBox("moderated"));
-
-		add(new TextField<String>("confno").setEnabled(false));
-		add(pin);
-		pin.setEnabled(getModelObject().isSipEnabled());
-		add(new TextField<String>("ownerId").setEnabled(false));
-		add(new AjaxCheckBox("sipEnabled") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				updateView(target);
-			}
-		}.setOutputMarkupId(true));
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
-	}
-
-	void updateClients(AjaxRequestTarget target) {
-		long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0);
-		final List<Client> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId);
-		clients.setDefaultModelObject(clientsInRoom);
-		target.add(clientsContainer);
-	}
-
-	@Override
-	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
-		Room r = getModelObject();
-		boolean newRoom = r.getId() == null;
-		r = getBean(RoomDao.class).update(r, getUserId());
-		if (newRoom) {
-			for (RoomModerator rm : r.getModerators()) {
-				rm.setRoomId(r.getId());
-			}
-			// FIXME double update
-			getBean(RoomDao.class).update(getModelObject(), getUserId());
-		}
-		hideNewRecord();
-		updateView(target);
-	}
-
-	@Override
-	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
-		setModelObject(new Room());
-		updateView(target);
-	}
-
-	@Override
-	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
-		Room r = getModelObject();
-		if (r.getId() != null) {
-			r = getBean(RoomDao.class).get(r.getId());
-		} else {
-			r = new Room();
-		}
-		setModelObject(r);
-		updateView(target);
-	}
-
-	@Override
-	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
-		getBean(RoomDao.class).delete(getModelObject(), getUserId());
-		target.add(roomList);
-		setModelObject(new Room());
-		updateView(target);
-	}
-
-	@Override
-	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	public void updateView(AjaxRequestTarget target) {
-		target.add(this);
-		target.add(roomList);
-		target.add(pin.setEnabled(getModelObject().isSipEnabled()));
-		updateClients(target);
-		target.appendJavaScript("adminPanelInit();");
-	}
-
-	@Override
-	protected void onDetach() {
-		moderator2add.detach();
-		super.onDetach();
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.admin.rooms;
+
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getSid;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.server.ISessionManager;
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.dao.user.IUserService;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.room.Room.RoomElement;
+import org.apache.openmeetings.db.entity.room.RoomGroup;
+import org.apache.openmeetings.db.entity.room.RoomModerator;
+import org.apache.openmeetings.db.entity.user.Address;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.admin.AdminBaseForm;
+import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
+import org.apache.openmeetings.web.util.RoomTypeDropDown;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
+import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.ChoiceRenderer;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.util.string.Strings;
+import org.apache.wicket.util.time.Duration;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
+
+public class RoomForm extends AdminBaseForm<Room> {
+	private static final long serialVersionUID = 1L;
+	private final static List<Long> DROPDOWN_NUMBER_OF_PARTICIPANTS = Arrays.asList(2L, 4L, 6L, 8L, 10L, 12L, 14L, 16L, 20L, 25L, 32L, 50L,
+			100L, 150L, 200L, 500L, 1000L);
+	private final WebMarkupContainer roomList;
+	private final TextField<String> pin = new TextField<>("pin");
+	private final WebMarkupContainer moderatorContainer = new WebMarkupContainer("moderatorContainer");
+	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
+	private final ListView<Client> clients = new ListView<Client>("clients", new ArrayList<>()) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void populateItem(final ListItem<Client> item) {
+			Client client = item.getModelObject();
+			item.add(new Label("clientId", "" + client.getId()))
+				.add(new Label("clientLogin", "" + client.getUsername()))
+				.add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onSubmit(AjaxRequestTarget target) {
+						Client c = item.getModelObject();
+						getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
+								, c.getServer() == null ? 0 : c.getServer().getId());
+
+						updateClients(target);
+					}
+				});
+		}
+	};
+	private IModel<User> moderator2add = Model.of((User)null);
+
+	public RoomForm(String id, WebMarkupContainer roomList, final Room room) {
+		super(id, new CompoundPropertyModel<>(room));
+		this.roomList = roomList;
+		setOutputMarkupId(true);
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		RequiredTextField<String> name = new RequiredTextField<>("name");
+		name.setLabel(new Model<>(Application.getString(193)));
+		add(name);
+
+		add(new DropDownChoice<>("numberOfPartizipants", //
+				DROPDOWN_NUMBER_OF_PARTICIPANTS, //
+				new ChoiceRenderer<Long>() {
+					private static final long serialVersionUID = 1L;
+					@Override
+					public Object getDisplayValue(Long id) {
+						return id;
+					}
+					@Override
+					public String getIdValue(Long id, int index) {
+						return "" + id;
+					}
+				}));
+
+		add(new RoomTypeDropDown("type").setRequired(true).setLabel(Model.of(Application.getString(194))));
+
+		add(new TextArea<String>("comment"));
+
+		boolean isGroupAdmin = hasGroupAdminLevel(getRights());
+		add(new CheckBox("appointment").setEnabled(false));
+		add(new CheckBox("ispublic").setEnabled(!isGroupAdmin));
+
+		List<Group> orgList = isGroupAdmin
+				? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+				: getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
+		final List<RoomGroup> orgRooms = new ArrayList<>(orgList.size());
+		for (Group org : orgList) {
+			orgRooms.add(new RoomGroup(org, getModelObject()));
+		}
+		add(new Select2MultiChoice<>("roomGroups", null, new ChoiceProvider<RoomGroup>() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public String getDisplayValue(RoomGroup choice) {
+				String name = choice.getGroup().getName();
+				return name == null ? "" : name;
+			}
+
+			@Override
+			public String getIdValue(RoomGroup choice) {
+				Long id = choice.getGroup().getId();
+				return id == null ? null : "" + id;
+			}
+
+			@Override
+			public void query(String term, int page, Response<RoomGroup> response) {
+				for (RoomGroup or : orgRooms) {
+					if (Strings.isEmpty(term) || or.getGroup().getName().contains(term)) {
+						response.add(or);
+					}
+				}
+			}
+
+			@Override
+			public Collection<RoomGroup> toChoices(Collection<String> _ids) {
+				List<Long> ids = new ArrayList<>();
+				for (String id : _ids) {
+					ids.add(Long.valueOf(id));
+				}
+				List<RoomGroup> list = new ArrayList<>();
+				for (Group o : getBean(GroupDao.class).get(ids)) {
+					list.add(new RoomGroup(o, RoomForm.this.getModelObject()));
+				}
+				return list;
+			}
+		}).setLabel(Model.of(getString("828"))).setRequired(isGroupAdmin));
+
+		add(new CheckBox("isDemoRoom"));
+		TextField<Integer> demoTime = new TextField<>("demoTime");
+		demoTime.setLabel(new Model<>(Application.getString(637)));
+		add(demoTime);
+		add(new CheckBox("allowUserQuestions"));
+		add(new CheckBox("audioOnly"));
+		add(new CheckBox("closed"));
+		add(new TextField<String>("redirectURL"));
+		add(new CheckBox("waitForRecording"));
+		add(new CheckBox("allowRecording"));
+		add(new CheckBox("chatModerated"));
+
+		add(new Select2MultiChoice<>("hiddenElements", null, new ChoiceProvider<RoomElement>() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public String getDisplayValue(RoomElement choice) {
+				return choice.name();
+			}
+
+			@Override
+			public String getIdValue(RoomElement choice) {
+				return choice.name();
+			}
+
+			@Override
+			public void query(String term, int page, Response<RoomElement> response) {
+				for (RoomElement r : RoomElement.values()) {
+					if (Strings.isEmpty(term) || r.name().contains(term)) {
+						response.add(r);
+					}
+				}
+			}
+
+			@Override
+			public Collection<RoomElement> toChoices(Collection<String> ids) {
+				Collection<RoomElement> rights = new ArrayList<>(ids.size());
+				for (String id : ids) {
+					rights.add(RoomElement.valueOf(id));
+				}
+				return rights;
+			}
+		}));
+		add(new CheckBox("chatOpened"));
+		add(new CheckBox("filesOpened"));
+		add(new CheckBox("autoVideoSelect"));
+
+		// Users in this Room
+		add(clientsContainer.add(clients.setOutputMarkupId(true)).setOutputMarkupId(true));
+
+		// Moderators
+		final Select2Choice<User> moderatorChoice = new Select2Choice<>("moderator2add", moderator2add, new AdminUserChoiceProvider() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void query(String term, int page, Response<User> response) {
+				response.addAll(getBean(UserDao.class).get(term, false, page * PAGE_SIZE, PAGE_SIZE));
+				response.setHasMore(PAGE_SIZE == response.getResults().size());
+			}
+
+			@Override
+			public String getDisplayValue(User choice) {
+				Address a = choice.getAddress();
+				return String.format("\"%s %s\" <%s>", choice.getFirstname(), choice.getLastname(), a == null ? "" : a.getEmail());
+			}
+		});
+		add(moderatorChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onUpdate(AjaxRequestTarget target) {
+				Room r = RoomForm.this.getModelObject();
+				User u = moderator2add.getObject();
+				boolean found = false;
+				if (u != null) {
+					if (r.getModerators() == null) {
+						r.setModerators(new ArrayList<RoomModerator>());
+					}
+					for (RoomModerator rm : r.getModerators()) {
+						if (rm.getUser().getId().equals(u.getId())) {
+							found = true;
+							break;
+						}
+					}
+					if (!found) {
+						RoomModerator rm = new RoomModerator();
+						rm.setRoomId(r.getId());
+						rm.setUser(u);
+						r.getModerators().add(0, rm);
+						moderator2add.setObject(null);
+						target.add(moderatorContainer, moderatorChoice);
+					}
+				}
+			}
+		}).setOutputMarkupId(true));
+		add(moderatorContainer.add(new ListView<RoomModerator>("moderators") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(final ListItem<RoomModerator> item) {
+				RoomModerator moderator = item.getModelObject();
+				Label name = new Label("uName", moderator.getUser().getFirstname() + " " + moderator.getUser().getLastname());
+				if (moderator.getId() == null) {
+					name.add(AttributeModifier.append("class", "newItem"));
+				}
+				item.add(new CheckBox("superModerator", new PropertyModel<Boolean>(moderator, "superModerator")))
+					.add(new Label("userId", "" + moderator.getUser().getId()))
+					.add(name)
+					.add(new Label("email", moderator.getUser().getAddress().getEmail()))
+					.add(new ConfirmableAjaxBorder("delete", getString("80"), getString("833")) {
+						private static final long serialVersionUID = 1L;
+
+						@Override
+						protected void onSubmit(AjaxRequestTarget target) {
+							RoomForm.this.getModelObject().getModerators().remove(item.getIndex());
+							target.add(moderatorContainer);
+						}
+					});
+			}
+		}).setOutputMarkupId(true));
+
+		add(new CheckBox("moderated"));
+
+		add(new TextField<String>("confno").setEnabled(false));
+		add(pin);
+		pin.setEnabled(getModelObject().isSipEnabled());
+		add(new TextField<String>("ownerId").setEnabled(false));
+		add(new AjaxCheckBox("sipEnabled") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onUpdate(AjaxRequestTarget target) {
+				updateView(target);
+			}
+		}.setOutputMarkupId(true));
+
+		// attach an ajax validation behavior to all form component's keydown
+		// event and throttle it down to once per second
+		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
+	}
+
+	void updateClients(AjaxRequestTarget target) {
+		long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0);
+		final List<Client> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId);
+		clients.setDefaultModelObject(clientsInRoom);
+		target.add(clientsContainer);
+	}
+
+	@Override
+	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
+		Room r = getModelObject();
+		boolean newRoom = r.getId() == null;
+		r = getBean(RoomDao.class).update(r, getUserId());
+		if (newRoom) {
+			for (RoomModerator rm : r.getModerators()) {
+				rm.setRoomId(r.getId());
+			}
+			// FIXME double update
+			getBean(RoomDao.class).update(getModelObject(), getUserId());
+		}
+		hideNewRecord();
+		updateView(target);
+	}
+
+	@Override
+	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
+		setModelObject(new Room());
+		updateView(target);
+	}
+
+	@Override
+	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
+		Room r = getModelObject();
+		if (r.getId() != null) {
+			r = getBean(RoomDao.class).get(r.getId());
+		} else {
+			r = new Room();
+		}
+		setModelObject(r);
+		updateView(target);
+	}
+
+	@Override
+	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
+		getBean(RoomDao.class).delete(getModelObject(), getUserId());
+		target.add(roomList);
+		setModelObject(new Room());
+		updateView(target);
+	}
+
+	@Override
+	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	public void updateView(AjaxRequestTarget target) {
+		target.add(this);
+		target.add(roomList);
+		target.add(pin.setEnabled(getModelObject().isSipEnabled()));
+		updateClients(target);
+		target.appendJavaScript("adminPanelInit();");
+	}
+
+	@Override
+	protected void onDetach() {
+		moderator2add.detach();
+		super.onDetach();
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
index 0fa1f60..761b34e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
@@ -1,91 +1,91 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.admin.rooms;
-
-import static org.apache.openmeetings.web.app.Application.getBean;
-
-import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.web.admin.AdminPanel;
-import org.apache.openmeetings.web.admin.SearchableDataView;
-import org.apache.openmeetings.web.common.PagedEntityListPanel;
-import org.apache.openmeetings.web.data.DataViewContainer;
-import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.ajax.AjaxEventBehavior;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.repeater.Item;
-
-@AuthorizeInstantiation({"Admin", "GroupAdmin"})
-public class RoomsPanel extends AdminPanel {
-	private static final long serialVersionUID = -1L;
-	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
-	private RoomForm form;
-
-	public RoomsPanel(String id) {
-		super(id);
-		SearchableDataView<Room> dataView = new SearchableDataView<Room>("roomList", new SearchableGroupAdminDataProvider<>(RoomDao.class)) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(final Item<Room> item) {
-				Room room = item.getModelObject();
-				final Long roomId = room.getId();
-				item.add(new Label("id"));
-				item.add(new Label("name"));
-				item.add(new Label("ispublic"));
-				item.add(new AjaxEventBehavior("click") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
-						form.setModelObject(getBean(RoomDao.class).get(roomId));
-						form.updateView(target);
-						target.add(form, listContainer);
-						target.appendJavaScript("adminPanelInit();");
-					}
-				});
-				item.add(AttributeModifier.replace("class", getRowClass(room.getId(), form.getModelObject().getId())));
-			}
-		};
-
-		add(listContainer.add(dataView).setOutputMarkupId(true));
-		PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) {
-			private static final long serialVersionUID = -1L;
-
-			@Override
-			protected void onEvent(AjaxRequestTarget target) {
-				target.add(listContainer);
-			}
-		};
-		DataViewContainer<Room> container = new DataViewContainer<>(listContainer, dataView, navigator);
-		container.addLink(new OmOrderByBorder<>("orderById", "id", container))
-			.addLink(new OmOrderByBorder<>("orderByName", "name", container))
-			.addLink(new OmOrderByBorder<>("orderByPublic", "ispublic", container));
-		add(container.getLinks());
-		add(navigator);
-
-		add(form = new RoomForm("form", listContainer, new Room()));
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.admin.rooms;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.web.admin.AdminPanel;
+import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.PagedEntityListPanel;
+import org.apache.openmeetings.web.data.DataViewContainer;
+import org.apache.openmeetings.web.data.OmOrderByBorder;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.Item;
+
+@AuthorizeInstantiation({"Admin", "GroupAdmin"})
+public class RoomsPanel extends AdminPanel {
+	private static final long serialVersionUID = -1L;
+	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
+	private RoomForm form;
+
+	public RoomsPanel(String id) {
+		super(id);
+		SearchableDataView<Room> dataView = new SearchableDataView<Room>("roomList", new SearchableGroupAdminDataProvider<>(RoomDao.class)) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(final Item<Room> item) {
+				Room room = item.getModelObject();
+				final Long roomId = room.getId();
+				item.add(new Label("id"));
+				item.add(new Label("name"));
+				item.add(new Label("ispublic"));
+				item.add(new AjaxEventBehavior("click") {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onEvent(AjaxRequestTarget target) {
+						form.hideNewRecord();
+						form.setModelObject(getBean(RoomDao.class).get(roomId));
+						form.updateView(target);
+						target.add(form, listContainer);
+						target.appendJavaScript("adminPanelInit();");
+					}
+				});
+				item.add(AttributeModifier.replace("class", getRowClass(room.getId(), form.getModelObject().getId())));
+			}
+		};
+
+		add(listContainer.add(dataView).setOutputMarkupId(true));
+		PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) {
+			private static final long serialVersionUID = -1L;
+
+			@Override
+			protected void onEvent(AjaxRequestTarget target) {
+				target.add(listContainer);
+			}
+		};
+		DataViewContainer<Room> container = new DataViewContainer<>(listContainer, dataView, navigator);
+		container.addLink(new OmOrderByBorder<>("orderById", "id", container))
+			.addLink(new OmOrderByBorder<>("orderByName", "name", container))
+			.addLink(new OmOrderByBorder<>("orderByPublic", "ispublic", container));
+		add(container.getLinks());
+		add(navigator);
+
+		add(form = new RoomForm("form", listContainer, new Room()));
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java
index e93a4a2..c40315e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java
@@ -1,140 +1,140 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.admin.servers;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN;
-import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern;
-
-import org.apache.openmeetings.db.dao.server.ServerDao;
-import org.apache.openmeetings.db.entity.server.Server;
-import org.apache.openmeetings.web.admin.AdminBaseForm;
-import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.app.WebSession;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.CheckBox;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.RequiredTextField;
-import org.apache.wicket.markup.html.form.TextArea;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.util.time.Duration;
-
-/**
- * Form component to insert/update/delete {@link Server}
- *
- * @author swagner
- *
- */
-public class ServerForm extends AdminBaseForm<Server> {
-	private final WebMarkupContainer listContainer;
-	private static final long serialVersionUID = 1L;
-
-	public ServerForm(String id, WebMarkupContainer listContainer, final Server server) {
-		super(id, new CompoundPropertyModel<>(server));
-		setOutputMarkupId(true);
-		this.listContainer = listContainer;
-
-		add(new RequiredTextField<String>("name").setLabel(Model.of(Application.getString(1500))));
-		add(new CheckBox("active"));
-		add(new RequiredTextField<String>("address").setLabel(Model.of(Application.getString(1501))));
-		add(new TextField<Integer>("port"));
-		add(new TextField<String>("user"));
-		add(new TextField<String>("pass"));
-		add(new TextField<String>("webapp"));
-		add(new TextField<String>("protocol"));
-		add(forDatePattern("lastPing", WEB_DATE_PATTERN));
-		//add(new Label("pingRunning"));
-		add(forDatePattern("inserted", WEB_DATE_PATTERN));
-		add(new Label("insertedby.login"));
-		add(forDatePattern("updated", WEB_DATE_PATTERN));
-		add(new Label("updatedby.login"));
-		add(new TextArea<String>("comment"));
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
-	}
-
-	@Override
-	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
-		Application.getBean(ServerDao.class).update(getModelObject(), WebSession.getUserId());
-		Server server = Application.getBean(ServerDao.class).get(getModelObject().getId());
-		setModelObject(server);
-		hideNewRecord();
-		target.add(this);
-		target.add(listContainer);
-		target.appendJavaScript("adminPanelInit();");
-	}
-
-	@Override
-	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
-		Server s = new Server();
-		s.setWebapp("openmeetings");
-		s.setProtocol("http");
-		setModelObject(s);
-		target.add(this);
-		target.appendJavaScript("adminPanelInit();");
-	}
-
-	@Override
-	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
-		Server server = getModelObject();
-		if (server.getId() != null) {
-			server = Application.getBean(ServerDao.class).get(server.getId());
-		} else {
-			server = new Server();
-		}
-		setModelObject(server);
-		target.add(this);
-		target.appendJavaScript("adminPanelInit();");
-	}
-
-	@Override
-	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
-		Application.getBean(ServerDao.class).delete(getModelObject(), WebSession.getUserId());
-		this.setModelObject(new Server());
-		target.add(listContainer);
-		target.add(this);
-		target.appendJavaScript("adminPanelInit();");
-	}
-
-	@Override
-	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.admin.servers;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN;
+import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern;
+
+import org.apache.openmeetings.db.dao.server.ServerDao;
+import org.apache.openmeetings.db.entity.server.Server;
+import org.apache.openmeetings.web.admin.AdminBaseForm;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.time.Duration;
+
+/**
+ * Form component to insert/update/delete {@link Server}
+ *
+ * @author swagner
+ *
+ */
+public class ServerForm extends AdminBaseForm<Server> {
+	private final WebMarkupContainer listContainer;
+	private static final long serialVersionUID = 1L;
+
+	public ServerForm(String id, WebMarkupContainer listContainer, final Server server) {
+		super(id, new CompoundPropertyModel<>(server));
+		setOutputMarkupId(true);
+		this.listContainer = listContainer;
+
+		add(new RequiredTextField<String>("name").setLabel(Model.of(Application.getString(1500))));
+		add(new CheckBox("active"));
+		add(new RequiredTextField<String>("address").setLabel(Model.of(Application.getString(1501))));
+		add(new TextField<Integer>("port"));
+		add(new TextField<String>("user"));
+		add(new TextField<String>("pass"));
+		add(new TextField<String>("webapp"));
+		add(new TextField<String>("protocol"));
+		add(forDatePattern("lastPing", WEB_DATE_PATTERN));
+		//add(new Label("pingRunning"));
+		add(forDatePattern("inserted", WEB_DATE_PATTERN));
+		add(new Label("insertedby.login"));
+		add(forDatePattern("updated", WEB_DATE_PATTERN));
+		add(new Label("updatedby.login"));
+		add(new TextArea<String>("comment"));
+
+		// attach an ajax validation behavior to all form component's keydown
+		// event and throttle it down to once per second
+		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
+	}
+
+	@Override
+	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
+		Application.getBean(ServerDao.class).update(getModelObject(), WebSession.getUserId());
+		Server server = Application.getBean(ServerDao.class).get(getModelObject().getId());
+		setModelObject(server);
+		hideNewRecord();
+		target.add(this);
+		target.add(listContainer);
+		target.appendJavaScript("adminPanelInit();");
+	}
+
+	@Override
+	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
+		Server s = new Server();
+		s.setWebapp("openmeetings");
+		s.setProtocol("http");
+		setModelObject(s);
+		target.add(this);
+		target.appendJavaScript("adminPanelInit();");
+	}
+
+	@Override
+	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
+		Server server = getModelObject();
+		if (server.getId() != null) {
+			server = Application.getBean(ServerDao.class).get(server.getId());
+		} else {
+			server = new Server();
+		}
+		setModelObject(server);
+		target.add(this);
+		target.appendJavaScript("adminPanelInit();");
+	}
+
+	@Override
+	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
+		Application.getBean(ServerDao.class).delete(getModelObject(), WebSession.getUserId());
+		this.setModelObject(new Server());
+		target.add(listContainer);
+		target.add(this);
+		target.appendJavaScript("adminPanelInit();");
+	}
+
+	@Override
+	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java
index b7889b3..1a60552 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java
@@ -1,95 +1,95 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.admin.servers;
-
-import org.apache.openmeetings.db.dao.server.ServerDao;
-import org.apache.openmeetings.db.entity.server.Server;
-import org.apache.openmeetings.web.admin.AdminPanel;
-import org.apache.openmeetings.web.admin.SearchableDataView;
-import org.apache.openmeetings.web.common.PagedEntityListPanel;
-import org.apache.openmeetings.web.data.DataViewContainer;
-import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.ajax.AjaxEventBehavior;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.repeater.Item;
-
-/**
- * Form component with list and form to manipulate {@link Server}
- *
- * @author swagner
- *
- */
-public class ServersPanel extends AdminPanel {
-	private static final long serialVersionUID = 1L;
-	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
-	private ServerForm form;
-
-	public ServersPanel(String id) {
-		super(id);
-		SearchableDataView<Server> dataView = new SearchableDataView<Server>("serverList",
-				new SearchableDataProvider<>(ServerDao.class)) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(final Item<Server> item) {
-				final Server server = item.getModelObject();
-				item.add(new Label("id"));
-				item.add(new Label("name"));
-				item.add(new Label("address"));
-				item.add(new AjaxEventBehavior("click") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(server);
-						form.hideNewRecord();
-						target.add(form, listContainer);
-						target.appendJavaScript("adminPanelInit();");
-					}
-				});
-				item.add(AttributeModifier.replace("class", getRowClass(server.getId(), form.getModelObject().getId())));
-			}
-		};
-
-		add(listContainer.add(dataView).setOutputMarkupId(true));
-		PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onEvent(AjaxRequestTarget target) {
-				target.add(listContainer);
-			}
-		};
-		DataViewContainer<Server> container = new DataViewContainer<>(listContainer, dataView, navigator);
-		container.addLink(new OmOrderByBorder<>("orderById", "id", container))
-			.addLink(new OmOrderByBorder<>("orderByName", "name", container))
-			.addLink(new OmOrderByBorder<>("orderByAddress", "address", container));
-		add(container.getLinks());
-		add(navigator);
-
-		form = new ServerForm("form", listContainer, new Server());
-		form.showNewRecord();
-		add(form);
-
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.admin.servers;
+
+import org.apache.openmeetings.db.dao.server.ServerDao;
+import org.apache.openmeetings.db.entity.server.Server;
+import org.apache.openmeetings.web.admin.AdminPanel;
+import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.PagedEntityListPanel;
+import org.apache.openmeetings.web.data.DataViewContainer;
+import org.apache.openmeetings.web.data.OmOrderByBorder;
+import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.Item;
+
+/**
+ * Form component with list and form to manipulate {@link Server}
+ *
+ * @author swagner
+ *
+ */
+public class ServersPanel extends AdminPanel {
+	private static final long serialVersionUID = 1L;
+	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
+	private ServerForm form;
+
+	public ServersPanel(String id) {
+		super(id);
+		SearchableDataView<Server> dataView = new SearchableDataView<Server>("serverList",
+				new SearchableDataProvider<>(ServerDao.class)) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(final Item<Server> item) {
+				final Server server = item.getModelObject();
+				item.add(new Label("id"));
+				item.add(new Label("name"));
+				item.add(new Label("address"));
+				item.add(new AjaxEventBehavior("click") {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onEvent(AjaxRequestTarget target) {
+						form.setModelObject(server);
+						form.hideNewRecord();
+						target.add(form, listContainer);
+						target.appendJavaScript("adminPanelInit();");
+					}
+				});
+				item.add(AttributeModifier.replace("class", getRowClass(server.getId(), form.getModelObject().getId())));
+			}
+		};
+
+		add(listContainer.add(dataView).setOutputMarkupId(true));
+		PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onEvent(AjaxRequestTarget target) {
+				target.add(listContainer);
+			}
+		};
+		DataViewContainer<Server> container = new DataViewContainer<>(listContainer, dataView, navigator);
+		container.addLink(new OmOrderByBorder<>("orderById", "id", container))
+			.addLink(new OmOrderByBorder<>("orderByName", "name", container))
+			.addLink(new OmOrderByBorder<>("orderByAddress", "address", container));
+		add(container.getLinks());
+		add(navigator);
+
+		form = new ServerForm("form", listContainer, new Server());
+		form.showNewRecord();
+		add(form);
+
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index 30644c6..dadb391 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -1,314 +1,314 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.admin.users;
-
-import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
-import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.getRights;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern;
-import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
-import org.apache.openmeetings.db.dao.server.LdapConfigDao;
-import org.apache.openmeetings.db.dao.server.OAuth2Dao;
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.server.LdapConfig;
-import org.apache.openmeetings.db.entity.server.OAuthServer;
-import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.db.entity.user.User.Right;
-import org.apache.openmeetings.db.entity.user.User.Type;
-import org.apache.openmeetings.service.mail.EmailManager;
-import org.apache.openmeetings.web.admin.AdminBaseForm;
-import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.ComunityUserForm;
-import org.apache.openmeetings.web.common.GeneralUserForm;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
-import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.CheckBox;
-import org.apache.wicket.markup.html.form.ChoiceRenderer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.RequiredTextField;
-import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
-import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.time.Duration;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Response;
-import org.wicketstuff.select2.Select2MultiChoice;
-
-import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
-
-/**
- * CRUD operations in form for {@link User}
- *
- * @author swagner
- *
- */
-public class UserForm extends AdminBaseForm<User> {
-	private static final long serialVersionUID = 1L;
-	private static final Logger log = Red5LoggerFactory.getLogger(UserForm.class, webAppRootKey);
-	private final WebMarkupContainer listContainer;
-	private final WebMarkupContainer domain = new WebMarkupContainer("domain");
-	private GeneralUserForm generalForm;
-	private final RequiredTextField<String> login = new RequiredTextField<>("login");
-	private final MessageDialog warning;
-	private final DropDownChoice<Long> domainId = new DropDownChoice<>("domainId");
-
-	public UserForm(String id, WebMarkupContainer listContainer, final User user, MessageDialog warning) {
-		super(id, new CompoundPropertyModel<>(user));
-		setOutputMarkupId(true);
-		this.listContainer = listContainer;
-		this.warning = warning;
-		// Add form fields
-		addFormFields();
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
-	}
-
-	@Override
-	protected void onModelChanged() {
-		super.onModelChanged();
-		generalForm.updateModelObject(getModelObject(), true);
-	}
-
-	@Override
-	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
-		User u = getModelObject();
-		try {
-			boolean isNew = (u.getId() == null);
-			boolean sendEmailAtRegister = (1 == getBean(ConfigurationDao.class).getConfValue("sendEmailAtRegister", Integer.class, "0"));
-			if (isNew && sendEmailAtRegister) {
-				u.setActivatehash(UUID.randomUUID().toString());
-			}
-			u = getBean(UserDao.class).update(u, generalForm.getPasswordField().getConvertedInput(), getUserId());
-			if (isNew && sendEmailAtRegister) {
-				String sendMail = getBean(EmailManager.class).sendMail(login.getValue(), generalForm.getEmail(), u.getActivatehash(), false, null);
-				if (!sendMail.equals("success")) {
-					throw new Exception("Mail for new user is not sent");
-				}
-			}
-		} catch (Exception e) {
-			// FIXME update feedback with the error details
-			log.error("[onSaveSubmit]: ", e);
-		}
-		setModelObject(u);
-		hideNewRecord();
-		target.add(this);
-		target.add(listContainer);
-		target.appendJavaScript("adminPanelInit();");
-		if (u.getGroupUsers().isEmpty()) {
-			warning.open(target);
-		}
-	}
-
-	@Override
-	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
-		UserDao userDao = getBean(UserDao.class);
-		setModelObject(userDao.getNewUserInstance(userDao.get(getUserId())));
-		update(target);
-	}
-
-	@Override
-	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
-		User user = getModelObject();
-		if (user.getId() != null) {
-			user = getBean(UserDao.class).get(user.getId());
-		} else {
-			user = getBean(UserDao.class).getNewUserInstance(null);
-		}
-		setModelObject(user);
-		update(target);
-	}
-
-	@Override
-	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
-		UserDao userDao = getBean(UserDao.class);
-		userDao.delete(getModelObject(), getUserId());
-		setModelObject(userDao.getNewUserInstance(userDao.get(getUserId())));
-		update(target);
-	}
-
-	/**
-	 * Add the fields to the form
-	 */
-	private void addFormFields() {
-		ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
-		login.setLabel(Model.of(Application.getString(132)));
-		add(login.add(minimumLength(getMinLoginLength(cfgDao))));
-
-		add(generalForm = new GeneralUserForm("general", getModel(), true));
-
-		add(new DropDownChoice<>("type", Arrays.asList(Type.values())).add(new OnChangeAjaxBehavior() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				updateDomain(target);
-			}
-		}));
-		update(null);
-		add(domain.add(domainId).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
-		add(new Label("ownerId"));
-		add(forDatePattern("inserted", WEB_DATE_PATTERN));
-		add(forDatePattern("updated", WEB_DATE_PATTERN));
-
-		add(new CheckBox("forceTimeZoneCheck"));
-
-		add(new Select2MultiChoice<>("rights", null, new ChoiceProvider<Right>() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public String getDisplayValue(Right choice) {
-				return choice.name();
-			}
-
-			@Override
-			public String getIdValue(Right choice) {
-				return choice.name();
-			}
-
-			@Override
-			public void query(String term, int page, Response<Right> response) {
-				boolean isGroupAdmin = hasGroupAdminLevel(getRights());
-				for (Right r : Right.values()) {
-					if (Right.GroupAdmin == r) {
-						continue;
-					}
-					if (isGroupAdmin && (Right.Admin == r || Right.Soap == r)) {
-						continue;
-					}
-					if (Strings.isEmpty(term) || r.name().contains(term)) {
-						response.add(r);
-					}
-				}
-			}
-
-			@Override
-			public Collection<Right> toChoices(Collection<String> ids) {
-				Collection<Right> rights = new ArrayList<>(ids.size());
-				for (String id : ids) {
-					rights.add(Right.valueOf(id));
-				}
-				return rights;
-			}
-		}));
-		add(new ComunityUserForm("comunity", getModel()));
-	}
-
-	public void updateDomain(AjaxRequestTarget target) {
-		User u = getModelObject();
-		final Map<Long, String> values = new Hashtable<>();
-		List<Long> ids = new ArrayList<>();
-		if (u.getType() == Type.ldap) {
-			for (LdapConfig c : getBean(LdapConfigDao.class).getActive()) {
-				ids.add(c.getId());
-				values.put(c.getId(), c.getName());
-			}
-		}
-		if (u.getType() == Type.oauth) {
-			for (OAuthServer s : getBean(OAuth2Dao.class).getActive()) {
-				ids.add(s.getId());
-				values.put(s.getId(), s.getName());
-			}
-		}
-		domainId.setChoices(ids);
-		domainId.setChoiceRenderer(new ChoiceRenderer<Long>() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object getDisplayValue(Long object) {
-				return values.get(object);
-			}
-
-			@Override
-			public String getIdValue(Long object, int index) {
-				return "" + object;
-			}
-		});
-		domain.setVisible(u.getType() == Type.ldap || u.getType() == Type.oauth);
-		if (target != null) {
-			target.add(domain);
-		}
-	}
-
-	public void update(AjaxRequestTarget target) {
-		updateDomain(target);
-		if (target != null) {
-			target.add(this, listContainer);
-			target.appendJavaScript("adminPanelInit();");
-		}
-	}
-
-	@Override
-	protected void onValidate() {
-		User u = getModelObject();
-		if(!getBean(UserDao.class).checkLogin(login.getConvertedInput(), u.getType(), u.getDomainId(), u.getId())) {
-			error(getString("105"));
-		}
-	}
-
-	@Override
-	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
-		//ignore validation errors
-		onNewSubmit(target, form);
-	}
-
-	@Override
-	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
-		// TODO Auto-generated method stub
-	}
-
-	@Override
-	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
-		//ignore validation errors
-		onDeleteSubmit(target, form);
-	}
-
-	@Override
-	protected IMarkupSourcingStrategy newMarkupSourcingStrategy() {
-		return new PanelMarkupSourcingStrategy(false);
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.admin.users;
+
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern;
+import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
+import org.apache.openmeetings.db.dao.server.LdapConfigDao;
+import org.apache.openmeetings.db.dao.server.OAuth2Dao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.server.LdapConfig;
+import org.apache.openmeetings.db.entity.server.OAuthServer;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.db.entity.user.User.Right;
+import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.openmeetings.service.mail.EmailManager;
+import org.apache.openmeetings.web.admin.AdminBaseForm;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.ComunityUserForm;
+import org.apache.openmeetings.web.common.GeneralUserForm;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
+import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.ChoiceRenderer;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
+import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.string.Strings;
+import org.apache.wicket.util.time.Duration;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+import org.wicketstuff.select2.Select2MultiChoice;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
+
+/**
+ * CRUD operations in form for {@link User}
+ *
+ * @author swagner
+ *
+ */
+public class UserForm extends AdminBaseForm<User> {
+	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(UserForm.class, webAppRootKey);
+	private final WebMarkupContainer listContainer;
+	private final WebMarkupContainer domain = new WebMarkupContainer("domain");
+	private GeneralUserForm generalForm;
+	private final RequiredTextField<String> login = new RequiredTextField<>("login");
+	private final MessageDialog warning;
+	private final DropDownChoice<Long> domainId = new DropDownChoice<>("domainId");
+
+	public UserForm(String id, WebMarkupContainer listContainer, final User user, MessageDialog warning) {
+		super(id, new CompoundPropertyModel<>(user));
+		setOutputMarkupId(true);
+		this.listContainer = listContainer;
+		this.warning = warning;
+		// Add form fields
+		addFormFields();
+
+		// attach an ajax validation behavior to all form component's keydown
+		// event and throttle it down to once per second
+		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
+	}
+
+	@Override
+	protected void onModelChanged() {
+		super.onModelChanged();
+		generalForm.updateModelObject(getModelObject(), true);
+	}
+
+	@Override
+	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
+		User u = getModelObject();
+		try {
+			boolean isNew = (u.getId() == null);
+			boolean sendEmailAtRegister = (1 == getBean(ConfigurationDao.class).getConfValue("sendEmailAtRegister", Integer.class, "0"));
+			if (isNew && sendEmailAtRegister) {
+				u.setActivatehash(UUID.randomUUID().toString());
+			}
+			u = getBean(UserDao.class).update(u, generalForm.getPasswordField().getConvertedInput(), getUserId());
+			if (isNew && sendEmailAtRegister) {
+				String sendMail = getBean(EmailManager.class).sendMail(login.getValue(), generalForm.getEmail(), u.getActivatehash(), false, null);
+				if (!sendMail.equals("success")) {
+					throw new Exception("Mail for new user is not sent");
+				}
+			}
+		} catch (Exception e) {
+			// FIXME update feedback with the error details
+			log.error("[onSaveSubmit]: ", e);
+		}
+		setModelObject(u);
+		hideNewRecord();
+		target.add(this);
+		target.add(listContainer);
+		target.appendJavaScript("adminPanelInit();");
+		if (u.getGroupUsers().isEmpty()) {
+			warning.open(target);
+		}
+	}
+
+	@Override
+	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
+		UserDao userDao = getBean(UserDao.class);
+		setModelObject(userDao.getNewUserInstance(userDao.get(getUserId())));
+		update(target);
+	}
+
+	@Override
+	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
+		User user = getModelObject();
+		if (user.getId() != null) {
+			user = getBean(UserDao.class).get(user.getId());
+		} else {
+			user = getBean(UserDao.class).getNewUserInstance(null);
+		}
+		setModelObject(user);
+		update(target);
+	}
+
+	@Override
+	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
+		UserDao userDao = getBean(UserDao.class);
+		userDao.delete(getModelObject(), getUserId());
+		setModelObject(userDao.getNewUserInstance(userDao.get(getUserId())));
+		update(target);
+	}
+
+	/**
+	 * Add the fields to the form
+	 */
+	private void addFormFields() {
+		ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
+		login.setLabel(Model.of(Application.getString(132)));
+		add(login.add(minimumLength(getMinLoginLength(cfgDao))));
+
+		add(generalForm = new GeneralUserForm("general", getModel(), true));
+
+		add(new DropDownChoice<>("type", Arrays.asList(Type.values())).add(new OnChangeAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onUpdate(AjaxRequestTarget target) {
+				updateDomain(target);
+			}
+		}));
+		update(null);
+		add(domain.add(domainId).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
+		add(new Label("ownerId"));
+		add(forDatePattern("inserted", WEB_DATE_PATTERN));
+		add(forDatePattern("updated", WEB_DATE_PATTERN));
+
+		add(new CheckBox("forceTimeZoneCheck"));
+
+		add(new Select2MultiChoice<>("rights", null, new ChoiceProvider<Right>() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public String getDisplayValue(Right choice) {
+				return choice.name();
+			}
+
+			@Override
+			public String getIdValue(Right choice) {
+				return choice.name();
+			}
+
+			@Override
+			public void query(String term, int page, Response<Right> response) {
+				boolean isGroupAdmin = hasGroupAdminLevel(getRights());
+				for (Right r : Right.values()) {
+					if (Right.GroupAdmin == r) {
+						continue;
+					}
+					if (isGroupAdmin && (Right.Admin == r || Right.Soap == r)) {
+						continue;
+					}
+					if (Strings.isEmpty(term) || r.name().contains(term)) {
+						response.add(r);
+					}
+				}
+			}
+
+			@Override
+			public Collection<Right> toChoices(Collection<String> ids) {
+				Collection<Right> rights = new ArrayList<>(ids.size());
+				for (String id : ids) {
+					rights.add(Right.valueOf(id));
+				}
+				return rights;
+			}
+		}));
+		add(new ComunityUserForm("comunity", getModel()));
+	}
+
+	public void updateDomain(AjaxRequestTarget target) {
+		User u = getModelObject();
+		final Map<Long, String> values = new Hashtable<>();
+		List<Long> ids = new ArrayList<>();
+		if (u.getType() == Type.ldap) {
+			for (LdapConfig c : getBean(LdapConfigDao.class).getActive()) {
+				ids.add(c.getId());
+				values.put(c.getId(), c.getName());
+			}
+		}
+		if (u.getType() == Type.oauth) {
+			for (OAuthServer s : getBean(OAuth2Dao.class).getActive()) {
+				ids.add(s.getId());
+				values.put(s.getId(), s.getName());
+			}
+		}
+		domainId.setChoices(ids);
+		domainId.setChoiceRenderer(new ChoiceRenderer<Long>() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public Object getDisplayValue(Long object) {
+				return values.get(object);
+			}
+
+			@Override
+			public String getIdValue(Long object, int index) {
+				return "" + object;
+			}
+		});
+		domain.setVisible(u.getType() == Type.ldap || u.getType() == Type.oauth);
+		if (target != null) {
+			target.add(domain);
+		}
+	}
+
+	public void update(AjaxRequestTarget target) {
+		updateDomain(target);
+		if (target != null) {
+			target.add(this, listContainer);
+			target.appendJavaScript("adminPanelInit();");
+		}
+	}
+
+	@Override
+	protected void onValidate() {
+		User u = getModelObject();
+		if(!getBean(UserDao.class).checkLogin(login.getConvertedInput(), u.getType(), u.getDomainId(), u.getId())) {
+			error(getString("105"));
+		}
+	}
+
+	@Override
+	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
+		//ignore validation errors
+		onNewSubmit(target, form);
+	}
+
+	@Override
+	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
+		//ignore validation errors
+		onDeleteSubmit(target, form);
+	}
+
+	@Override
+	protected IMarkupSourcingStrategy newMarkupSourcingStrategy() {
+		return new PanelMarkupSourcingStrategy(false);
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/LabelResourceLoader.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/LabelResourceLoader.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/LabelResourceLoader.java
index aecfe6d..a1352ec 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/LabelResourceLoader.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/LabelResourceLoader.java
@@ -1,65 +1,65 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.app;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.resource.loader.IStringResourceLoader;
-
-/**
- * Map property values to OpenMeetings labelid's and get the string
- *
- * @author swagner
- *
- */
-public class LabelResourceLoader implements IStringResourceLoader {
-
-	private static Map<String,Long> STRING_LABEL_MAPPING = new HashMap<>();
-
-	static {
-		STRING_LABEL_MAPPING.put("PagingNavigator.first", 368L);
-		STRING_LABEL_MAPPING.put("PagingNavigator.previous", 369L);
-		STRING_LABEL_MAPPING.put("PagingNavigator.next", 370L);
-		STRING_LABEL_MAPPING.put("PagingNavigator.last", 371L);
-	}
-
-	@Override
-	public String loadStringResource(Class<?> clazz, String key, Locale locale,
-			String style, String variation) {
-		return getStringByPropertyKey(key);
-	}
-
-	@Override
-	public String loadStringResource(Component component, String key,
-			Locale locale, String style, String variation) {
-		return getStringByPropertyKey(key);
-	}
-
-	private static String getStringByPropertyKey(String key) {
-		Long labelId = STRING_LABEL_MAPPING.get(key);
-		if (labelId == null) {
-			return null;
-		}
-		return Application.getString(labelId);
-	}
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.app;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.resource.loader.IStringResourceLoader;
+
+/**
+ * Map property values to OpenMeetings labelid's and get the string
+ *
+ * @author swagner
+ *
+ */
+public class LabelResourceLoader implements IStringResourceLoader {
+
+	private static Map<String,Long> STRING_LABEL_MAPPING = new HashMap<>();
+
+	static {
+		STRING_LABEL_MAPPING.put("PagingNavigator.first", 368L);
+		STRING_LABEL_MAPPING.put("PagingNavigator.previous", 369L);
+		STRING_LABEL_MAPPING.put("PagingNavigator.next", 370L);
+		STRING_LABEL_MAPPING.put("PagingNavigator.last", 371L);
+	}
+
+	@Override
+	public String loadStringResource(Class<?> clazz, String key, Locale locale,
+			String style, String variation) {
+		return getStringByPropertyKey(key);
+	}
+
+	@Override
+	public String loadStringResource(Component component, String key,
+			Locale locale, String style, String variation) {
+		return getStringByPropertyKey(key);
+	}
+
+	private static String getStringByPropertyKey(String key) {
+		Long labelId = STRING_LABEL_MAPPING.get(key);
+		if (labelId == null) {
+			return null;
+		}
+		return Application.getString(labelId);
+	}
+
+}