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);
+       }
+
+}

Reply via email to