You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2015/11/06 07:18:49 UTC

svn commit: r1712911 [10/16] - in /openmeetings/branches/3.1.x: openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ openmeetings-core/src/main/java/org/apache/openmeetings/core/data/conference/ openmeetings-core/src/main/java/org/ap...

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1712911&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Fri Nov  6 06:18:44 2015
@@ -0,0 +1,178 @@
+/*
+ * 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.common.tree;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.Date;
+
+import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.time.Duration;
+
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
+
+public abstract class FileTreePanel extends Panel {
+	private static final long serialVersionUID = 1L;
+	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
+	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
+	protected final IModel<FileItem> selectedFile = new CompoundPropertyModel<FileItem>((FileItem)null);
+	protected final IModel<String> homeSize = Model.of((String)null);
+	protected final IModel<String> publicSize = Model.of((String)null);
+	final ConvertingErrorsDialog errorsDialog = new ConvertingErrorsDialog("errors", Model.of((Recording)null));
+	protected FileItemTree<? extends FileItem> selected;
+	protected RepeatingView treesView = new RepeatingView("tree");
+
+	public FileTreePanel(String id) {
+		super(id);
+		defineTrees();
+		selectedFile.getObject().setId(Long.MIN_VALUE);
+		final AddFolderDialog addFolder = new AddFolderDialog("addFolder", Application.getString(712)) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				createFolder(getModelObject());
+				target.add(trees); //FIXME add correct refresh
+			}
+		};
+		add(addFolder);
+		Droppable<FileItem> trashToolbar = new Droppable<FileItem>("trash-toolbar") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onConfigure(JQueryBehavior behavior) {
+				super.onConfigure(behavior);
+				behavior.setOption("hoverClass", Options.asString("ui-state-hover trash-toolbar-hover"));
+				behavior.setOption("accept", Options.asString(".recorditem, .fileitem"));
+			}
+			
+			@Override
+			public void onDrop(AjaxRequestTarget target, Component component) {
+				Object o = component.getDefaultModelObject();
+				if (o instanceof FileItem) {
+					delete((FileItem)o, target);
+				}
+			}
+		};
+		add(trashToolbar);
+		trashToolbar.add(new WebMarkupContainer("create").add(new AjaxEventBehavior("click") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onEvent(AjaxRequestTarget target) {
+				addFolder.open(target);
+			}
+		}));
+		trashToolbar.add(new WebMarkupContainer("refresh").add(new AjaxEventBehavior("click") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onEvent(AjaxRequestTarget target) {
+				target.add(trees); //FIXME add correct refresh
+			}
+		}));
+		trashToolbar.add(new ConfirmableAjaxBorder("trash", getString("80"), getString("713")) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+				delete(selectedFile.getObject(), target);
+			}
+		});
+		
+		add(trees.add(treesView).setOutputMarkupId(true));
+		updateSizes();
+		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
+		sizes.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
+			private static final long serialVersionUID = 1L;
+
+			protected void onPostProcessTarget(AjaxRequestTarget target) {
+				updateSizes();
+			}
+		});
+		add(errorsDialog);
+	}
+	
+	void delete(FileItem f, AjaxRequestTarget target) {
+		long id = f.getId();
+		if (id > 0) {
+			if (f instanceof Recording) {
+				getBean(RecordingDao.class).delete((Recording)f);
+			} else {
+				getBean(FileExplorerItemDao.class).delete((FileExplorerItem)f);
+			}
+		}
+		target.add(trees); //FIXME add correct refresh
+	}
+	
+	public void createRecordingFolder(String name) {
+		Recording f = new Recording();
+		f.setFileName(name);
+		f.setInsertedBy(getUserId());
+		f.setInserted(new Date());
+		f.setType(Type.Folder);;
+		Recording p = (Recording)selectedFile.getObject();
+		long parentId = p.getId();
+		if (Type.Folder == p.getType()) {
+			f.setParentItemId(parentId);
+		}
+		f.setOwnerId(p.getOwnerId());
+		f.setOrganization_id(p.getOrganization_id());
+		getBean(RecordingDao.class).update(f);
+	}
+	
+	public abstract void defineTrees();
+	
+	public abstract void update(AjaxRequestTarget target, FileItem f);
+
+	public abstract void createFolder(String name);
+
+	public abstract void updateSizes();
+	
+	@Override
+	protected void onDetach() {
+		selectedFile.detach();
+		homeSize.detach();
+		publicSize.detach();
+		super.onDetach();
+	}
+}

Copied: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html (from r1712825, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingPanel.html)
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html?p2=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html&p1=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingPanel.html&r1=1712825&r2=1712911&rev=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingPanel.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html Fri Nov  6 06:18:44 2015
@@ -20,6 +20,6 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div wicket:id="drop" class="recording item"><div wicket:id="drag"><wicket:child /><span wicket:id="name" class="name"></span></div></div>
+	<div wicket:id="drop" class="file item"><div wicket:id="drag"><wicket:child /><span wicket:id="name" class="name"></span></div></div>
 </wicket:panel>
 </html>

Copied: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java (from r1712825, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingPanel.java)
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java?p2=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java&p1=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingPanel.java&r1=1712825&r2=1712911&rev=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingPanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java Fri Nov  6 06:18:44 2015
@@ -16,12 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.user.record;
+package org.apache.openmeetings.web.common.tree;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
 
-import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
-import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -38,48 +42,53 @@ import com.googlecode.wicket.jquery.core
 import com.googlecode.wicket.jquery.ui.interaction.draggable.Draggable;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
 
-public class RecordingPanel extends Panel {
+public class FolderPanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	protected final MarkupContainer drop;
 	protected final MarkupContainer drag;
 
-	public RecordingPanel(String id, final IModel<FlvRecording> model, final RecordingsPanel treePanel) {
+	public FolderPanel(String id, final IModel<? extends FileItem> model, final FileTreePanel treePanel) {
 		super(id, model);
-		FlvRecording r = model.getObject();
-		drop = r.isFolder() ? new Droppable<FlvRecording>("drop", model) {
+		FileItem r = model.getObject();
+		drop = r.getType() == Type.Folder ? new Droppable<FileItem>("drop", Model.of(r)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onConfigure(JQueryBehavior behavior) {
 				super.onConfigure(behavior);
 				behavior.setOption("hoverClass", Options.asString("ui-state-hover"));
-				behavior.setOption("accept", Options.asString(".recorditem"));
+				behavior.setOption("accept", Options.asString(getDefaultModelObject() instanceof Recording ? ".recorditem" : ".fileitem"));
 			}
 			
 			@Override
 			public void onDrop(AjaxRequestTarget target, Component component) {
 				Object o = component.getDefaultModelObject();
-				if (o instanceof FlvRecording) {
-					FlvRecording p = (FlvRecording)drop.getDefaultModelObject();
-					FlvRecording f = (FlvRecording)o;
-					long pid = p.getFlvRecordingId();
+				if (o instanceof FileItem) {
+					FileItem p = (FileItem)drop.getDefaultModelObject();
+					FileItem f = (FileItem)o;
+					long pid = p.getId();
 					//FIXME parent should not be moved to child !!!!!!!
-					if (pid == f.getFlvRecordingId()) {
+					if (pid == f.getId()) {
 						return;
 					}
-					f.setParentFileExplorerItemId(pid > 0 ? pid : null);
+					f.setParentItemId(pid > 0 ? pid : null);
 					f.setOwnerId(p.getOwnerId());
-					f.setRoom_id(p.getRoom_id());
-					f.setOrganization_id((p).getOrganization_id());
-					getBean(FlvRecordingDao.class).update(f);
+					f.setRoomId(p.getRoomId());
+					if (f instanceof Recording) {
+						Recording r = (Recording)f;
+						r.setOrganization_id(((Recording)p).getOrganization_id());
+						getBean(RecordingDao.class).update(r);
+					} else {
+						getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
+					}
 				}
 				target.add(treePanel.trees); //FIXME add correct refresh
 			}
 		} : new WebMarkupContainer("drop");
-		if (r.getFlvRecordingId() < 1) {
+		if (r.getId() < 1) {
 			drag = new WebMarkupContainer("drag");
 		} else {
-			Draggable<FlvRecording> d = new Draggable<FlvRecording>("drag", model) {
+			Draggable<? extends FileItem> d = new Draggable<FileItem>("drag", Model.of(r)) {
 				private static final long serialVersionUID = 1L;
 
 				@Override
@@ -90,10 +99,10 @@ public class RecordingPanel extends Pane
 				}
 			};
 			d.setContainment(".file.tree");
-			d.add(AttributeAppender.append("class", "recorditem"));
+			d.add(AttributeAppender.append("class", r instanceof Recording ? "recorditem" : "fileitem"));
 			drag = d;
 		}
-		drag.add(r.getFlvRecordingId() < 1 ? new Label("name", r.getFileName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
+		drag.add(r.getId() < 1 ? new Label("name", r.getFileName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
 			private static final long serialVersionUID = 1L;
 			
 			@Override
@@ -104,9 +113,13 @@ public class RecordingPanel extends Pane
 			@Override
 			protected void onSubmit(AjaxRequestTarget target) {
 				super.onSubmit(target);
-				FlvRecording fi = model.getObject();
+				FileItem fi = model.getObject();
 				fi.setFileName(getEditor().getModelObject());
-				getBean(FlvRecordingDao.class).update(fi);
+				if (fi instanceof Recording) {
+					getBean(RecordingDao.class).update((Recording)fi);
+				} else {
+					getBean(FileExplorerItemDao.class).update((FileExplorerItem)fi);
+				}
 			}
 			
 			@Override

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java?rev=1712911&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java Fri Nov  6 06:18:44 2015
@@ -0,0 +1,51 @@
+/*
+ * 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.common.tree;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.web.app.Application;
+
+public class MyRecordingTreeProvider extends RecordingTreeProvider {
+	private static final long serialVersionUID = 1L;
+
+	public Iterator<? extends Recording> getRoots() {
+		Recording r = new Recording();
+		r.setId(0L);
+		r.setType(Type.Folder);
+		r.setFileName(Application.getString(860));
+		r.setOwnerId(getUserId());
+		return Arrays.asList(r).iterator();
+	}
+	
+	public Iterator<? extends Recording> getChildren(Recording node) {
+		if (node.getId() == 0) {
+			return getBean(RecordingDao.class).getRootByOwner(getUserId()).iterator();
+		} else {
+			return super.getChildren(node);
+		}
+	}
+}

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java?rev=1712911&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java Fri Nov  6 06:18:44 2015
@@ -0,0 +1,59 @@
+/*
+ * 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.common.tree;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.web.app.Application;
+
+public class PublicRecordingTreeProvider extends RecordingTreeProvider {
+	private static final long serialVersionUID = 1L;
+	private final Long groupId;
+	private final String name;
+
+	public PublicRecordingTreeProvider(Long groupId, String name) {
+		this.groupId = groupId;
+		this.name = name;
+	}
+	
+	public Iterator<? extends Recording> getRoots() {
+		Recording r = new Recording();
+		r.setId(groupId == null ? -1 : -groupId);
+		r.setOrganization_id(groupId);
+		r.setOwnerId(null);
+		r.setType(Type.Folder);
+		String pub = Application.getString(861);
+		r.setFileName(groupId == null ? pub : String.format("%s (%s)", pub, name));
+		return Arrays.asList(r).iterator();
+	}
+	
+	public Iterator<? extends Recording> getChildren(Recording node) {
+		if (node.getId() < 0) {
+			return getBean(RecordingDao.class).getRootByPublic(groupId).iterator();
+		} else {
+			return super.getChildren(node);
+		}
+	}
+}

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/RecordingTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/RecordingTreeProvider.java?rev=1712911&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/RecordingTreeProvider.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/RecordingTreeProvider.java Fri Nov  6 06:18:44 2015
@@ -0,0 +1,52 @@
+/*
+ * 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.common.tree;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.Iterator;
+
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+public abstract class RecordingTreeProvider implements ITreeProvider<Recording> {
+	private static final long serialVersionUID = 1L;
+
+	public void detach() {
+		// TODO LDM should be used
+	}
+
+	public boolean hasChildren(Recording node) {
+		return node.getId() <= 0 || Type.Folder == node.getType();
+	}
+
+	public Iterator<? extends Recording> getChildren(Recording node) {
+		return getBean(RecordingDao.class).getByParent(node.getId()).iterator();
+	}
+
+	public IModel<Recording> model(Recording object) {
+		// TODO LDM should be used
+		return Model.of(object);
+	}
+	
+}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseNotInitedPage.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseNotInitedPage.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseNotInitedPage.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseNotInitedPage.java Fri Nov  6 06:18:44 2015
@@ -26,7 +26,7 @@ import org.apache.wicket.ajax.AjaxReques
 import org.apache.wicket.request.IRequestParameters;
 
 public abstract class BaseNotInitedPage extends BasePage {
-	private static final long serialVersionUID = 5716753033219700254L;
+	private static final long serialVersionUID = 1L;
 	private static final InstallationConfig installCfg = new InstallationConfig(); 
 
 	@Override

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html Fri Nov  6 06:18:44 2015
@@ -25,9 +25,11 @@
 		<link rel="shortcut icon" href="public/favicon.ico" type="image/x-icon"/>
 		<title wicket:id="pageTitle">[title]</title>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/theme.css"/>
+		<link media="screen" type="text/css" rel="stylesheet" href="css/chat.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/forms.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/calendar.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/admin.css"/>
+		<link media="screen" type="text/css" rel="stylesheet" href="css/room.css"/>
 	</head>
 	<body>
 		<div wicket:id="header"></div>

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java Fri Nov  6 06:18:44 2015
@@ -41,6 +41,7 @@ import org.wicketstuff.urlfragment.Async
 public abstract class BasePage extends AsyncUrlFragmentAwarePage {
 	private static final long serialVersionUID = 1L;
 	private final Map<String, String> options;
+	private final HeaderPanel header;
 
 	public abstract boolean isRtl();
 	protected abstract String getLanguageCode();
@@ -58,7 +59,7 @@ public abstract class BasePage extends A
 	    	.add(new AttributeModifier("lang", code))
 	    	.add(new AttributeModifier("dir", isRtl() ? "rtl" : "ltr"))); 
 		add(new Label("pageTitle", appName));
-		add(new HeaderPanel("header", appName));
+		add(header = new HeaderPanel("header", appName));
 	}
 	
 	protected OmUrlFragment getUrlFragment(IRequestParameters params) {
@@ -71,6 +72,10 @@ public abstract class BasePage extends A
 		return null;
 	}
 	
+	public HeaderPanel getHeader() {
+		return header;
+	}
+	
 	@Override
 	protected Map<String, String> getOptions() {
 		return options;

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html Fri Nov  6 06:18:44 2015
@@ -19,39 +19,41 @@
   
 -->
 <html xmlns:wicket="http://wicket.apache.org">
-	<wicket:head>
-		<script type="text/javascript">
-			function showBusyIndicator() {
-				$('#busy_indicator').show();
-			}
-			function hideBusyIndicator() {
-				$('#busy_indicator').hide();
-			}
-		</script>
-	</wicket:head>
-	<wicket:extend>
-		<script type="text/javascript">
-			$(function() {
-				Wicket.Event.subscribe('/ajax/call/failure', hideBusyIndicator);
-				Wicket.Event.subscribe('/ajax/call/before', showBusyIndicator);
-				Wicket.Event.subscribe('/ajax/call/success', hideBusyIndicator);
-				Wicket.Event.subscribe('/ajax/call/complete', hideBusyIndicator);
-			});
-		</script>
-		<div id="topControls">
-			<div id="topLinks"><span 
-				id="contactsAndMessages"><a wicket:id="messages"><wicket:message key="1188"/></a></span><span 
-				id="profile"><a wicket:id="profile"><wicket:message key="5"/></a></span><span 
-				id="logout"><a wicket:id="logout" href="#"><wicket:message key="310"/></a></span><span 
-				id="reportBug"><a target="_blank" wicket:id="bug"><wicket:message key="284"/></a></span><span><a 
-				wicket:id="about"><wicket:message key="1549"/></a></span>
-				</div>
-			<div wicket:id="dev" id="devMenu"/>
-			<div id="busy_indicator"><wicket:message key="1554"/></div>
-			<div wicket:id="menu"></div>
+<wicket:head>
+	<link media="screen" type="text/css" rel="stylesheet" href="css/jquery.ui.menubar.css"/>
+	<script type="text/javascript" src="js/jquery.ui.menubar.js"></script>
+	<script type="text/javascript">
+		function showBusyIndicator() {
+			$('#busy_indicator').show();
+		}
+		function hideBusyIndicator() {
+			$('#busy_indicator').hide();
+		}
+	</script>
+</wicket:head>
+<wicket:extend>
+	<script type="text/javascript">
+		$(function() {
+			Wicket.Event.subscribe('/ajax/call/failure', hideBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/before', showBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/success', hideBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/complete', hideBusyIndicator);
+		});
+	</script>
+	<div id="topControls">
+		<div wicket:id="topLinks"><span 
+			id="contactsAndMessages"><a wicket:id="messages"><wicket:message key="1188"/></a></span><span 
+			id="profile"><a wicket:id="profile"><wicket:message key="5"/></a></span><span 
+			id="logout"><a wicket:id="logout" href="#"><wicket:message key="310"/></a></span><span 
+			id="reportBug"><a target="_blank" wicket:id="bug"><wicket:message key="284"/></a></span><span><a 
+			wicket:id="about"><wicket:message key="1549"/></a></span>
 		</div>
-		<div wicket:id="contents"><div wicket:id="child"></div></div>
-		<div wicket:id="chatPanel"></div>
-		<div wicket:id="aboutDialog"></div>
-	</wicket:extend>
+		<div wicket:id="dev" id="devMenu"/>
+		<div id="busy_indicator" class="ui-widget-header"><span><wicket:message key="1554"/></span></div>
+		<div wicket:id="menu"></div>
+	</div>
+	<div wicket:id="contents"><div wicket:id="child"></div></div>
+	<div wicket:id="chatPanel"></div>
+	<div wicket:id="aboutDialog"></div>
+</wicket:extend>
 </html>
\ No newline at end of file

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Fri Nov  6 06:18:44 2015
@@ -29,7 +29,7 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
 
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.app.WebClient;
+import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
@@ -62,7 +62,7 @@ import org.wicketstuff.urlfragment.UrlFr
 
 @AuthorizeInstantiation({"Admin", "Dashboard", "Room"})
 public class MainPage extends BaseInitedPage {
-	private static final long serialVersionUID = 6421960759218157999L;
+	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(MainPage.class, webAppRootKey);
 	private final MenuPanel menu;
 	private final MarkupContainer contents;
@@ -127,13 +127,13 @@ public class MainPage extends BaseInited
 			@Override
 			protected void onConnect(ConnectedMessage message) {
 				super.onConnect(message);
-				addOnlineUser(new WebClient(WebSession.get().getId(), message.getKey(), getUserId()));
+				addOnlineUser(new Client(WebSession.get().getId(), message.getKey(), getUserId()));
 				log.debug("WebSocketBehavior::onConnect");
 			}
 			
 			@Override
 			protected void onClose(ClosedMessage message) {
-				WebClient client = getClientByKeys(getUserId(), WebSession.get().getId());
+				Client client = getClientByKeys(getUserId(), WebSession.get().getId());
 				removeOnlineUser(client);
 				super.onClose(message);
 				log.debug("WebSocketBehavior::onClose");

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java Fri Nov  6 06:18:44 2015
@@ -21,8 +21,8 @@ package org.apache.openmeetings.web.page
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getRecordingId;
 
-import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
-import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.user.record.VideoInfo;
 import org.apache.openmeetings.web.user.record.VideoPlayer;
@@ -35,11 +35,11 @@ public class RecordingPage extends BaseI
 
 	public RecordingPage(PageParameters p) {
 		String hash = p.get("hash").toString();
-		FlvRecording r = null;
+		Recording r = null;
 		if (WebSession.get().signIn(hash)) {
 			Long recId = getRecordingId();
 			if (recId != null) {
-				r = getBean(FlvRecordingDao.class).get(recId);
+				r = getBean(RecordingDao.class).get(recId);
 			}
 		}
 		add(new VideoInfo("info", r).setVisible(r != null), new VideoPlayer("player", r).setVisible(r != null));

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java Fri Nov  6 06:18:44 2015
@@ -245,7 +245,7 @@ public class ForgetPasswordDialog extend
 		userDao.update(us, -1L);
 		String reset_link = appLink + "?hash=" + us.getResethash();
 
-		String email = us.getAdresses().getEmail();
+		String email = us.getAddress().getEmail();
 
 		String template = ResetPasswordTemplate.getEmail(reset_link);
 

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java Fri Nov  6 06:18:44 2015
@@ -197,7 +197,7 @@ public class RegisterDialog extends Abst
 		try {
 			getBean(IUserManager.class).registerUserInit(UserDao.getDefaultRights(), login, password, lastName
 					, firstName, email, null /* age/birthday */, "" /* street */
-					, "" /* additionalname */, "" /* fax */, "" /* zip */, state.getState_id()
+					, "" /* additionalname */, "" /* fax */, "" /* zip */, state.getId()
 					, "" /* town */, lang, true /* sendWelcomeMessage */
 					, Arrays.asList(getBean(ConfigurationDao.class).getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, null)),
 					"" /* phone */, false, sendConfirmation, TimeZone.getTimeZone(tzModel.getObject()),
@@ -255,7 +255,7 @@ public class RegisterDialog extends Abst
 			langField.setRequired(true).setLabel(Model.of(Application.getString(111)));
 			add(tzDropDown.setRequired(true).setLabel(Model.of(Application.getString(1143))));
 			add(stateField = new DropDownChoice<State>("state", new PropertyModel<State>(RegisterDialog.this, "state"),
-					getBean(StateDao.class).getStates(), new ChoiceRenderer<State>("name", "state_id")));
+					getBean(StateDao.class).get(), new ChoiceRenderer<State>("name", "state_id")));
 			stateField.setRequired(true).setLabel(Model.of(Application.getString(120)));
 			add(new AjaxButton("submit") { // FAKE button so "submit-on-enter" works as expected
 				private static final long serialVersionUID = 1L;

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java Fri Nov  6 06:18:44 2015
@@ -155,7 +155,7 @@ public class ResetPasswordDialog extends
 	@Override
 	protected void onSubmit(AjaxRequestTarget target) {
 		try {
-			getBean(UserDao.class).update(user, password.getConvertedInput(), user.getUser_id());
+			getBean(UserDao.class).update(user, password.getConvertedInput(), user.getId());
 		} catch (Exception e) {
 			error(e.getMessage());
 		}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java Fri Nov  6 06:18:44 2015
@@ -172,11 +172,11 @@ public class SignInDialog extends Abstra
 		}
 		OmAuthenticationStrategy strategy = getAuthenticationStrategy();
 		WebSession ws = WebSession.get();
-		Type type = domain.getLdapConfigId() > 0 ? Type.ldap : Type.user;
-		if (ws.signIn(login, password, type, domain.getLdapConfigId())) {
+		Type type = domain.getId() > 0 ? Type.ldap : Type.user;
+		if (ws.signIn(login, password, type, domain.getId())) {
  			setResponsePage(Application.get().getHomePage());
 			if (rememberMe) {
-				strategy.save(login, password, type, domain.getLdapConfigId());
+				strategy.save(login, password, type, domain.getId());
 			} else {
 				strategy.remove();
 			}
@@ -185,7 +185,7 @@ public class SignInDialog extends Abstra
 			if (ws.getLoginError() != null) {
 				ErrorValue eValue = getBean(ErrorDao.class).get(-1 * ws.getLoginError());
 				if (eValue != null) {
-					error(Application.getString(eValue.getFieldvalues_id()));
+					error(Application.getString(eValue.getLabelId()));
 					target.add(feedback);
 				}
 			}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/InvitationDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/InvitationDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/InvitationDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/InvitationDialog.java Fri Nov  6 06:18:44 2015
@@ -142,7 +142,7 @@ public class InvitationDialog extends Ab
 
 				@Override
 				protected Object getId(Organisation choice) {
-					return choice.getOrganisation_id();
+					return choice.getId();
 				}
 			});
 
@@ -182,7 +182,7 @@ public class InvitationDialog extends Ab
 		groups.setModelObject(new ArrayList<Organisation>());
 		groups.setEnabled(false);
 		tzId.setObject(u.getTimeZoneId());
-		lang = u.getLanguage_id();
+		lang = u.getLanguageId();
 		url.setModelObject(null);
 		inviteeType.setObject(InviteeType.user);
 		form.setModelObject(i);
@@ -242,7 +242,7 @@ public class InvitationDialog extends Ab
 					}
 				} else {
 					for (Organisation g : groups.getModelObject()) {
-						for (Organisation_Users ou : getBean(OrganisationUserDao.class).get(g.getOrganisation_id(), 0, Integer.MAX_VALUE)) {
+						for (Organisation_Users ou : getBean(OrganisationUserDao.class).get(g.getId(), 0, Integer.MAX_VALUE)) {
 							Invitation i = create(ou.getUser());
 							try {
 								getBean(InvitationManager.class).sendInvitionLink(i, MessageType.Create, subject.getObject(), message.getObject(), false);
@@ -280,7 +280,7 @@ public class InvitationDialog extends Ab
 		i.setInvitee(u);
 		if (Type.contact == u.getType()) {
 			//TODO not sure it is right
-			u.setLanguage_id(lang);
+			u.setLanguageId(lang);
 		}
 		return getBean(InvitationDao.class).update(i);
 	}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java Fri Nov  6 06:18:44 2015
@@ -42,7 +42,7 @@ public class RoomBroadcaster {
 		sa.new MessageSender(sa.getRoomScope("" + roomId), method, obj) {
 			public boolean filter(IConnection conn) {
 				Client rcl = sessionMgr.getClientByStreamId(conn.getClient().getId(), null);
-				return rcl.getIsScreenClient()
+				return rcl.isScreenClient()
 						|| rcl.getRoom_id() == null || !rcl.getRoom_id().equals(roomId) || userDao.get(rcl.getUser_id()) == null;
 			}
 		}.start();

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Fri Nov  6 06:18:44 2015
@@ -20,6 +20,7 @@ package org.apache.openmeetings.web.room
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getRoomUsers;
 import static org.apache.openmeetings.web.app.WebSession.getLanguage;
 import static org.apache.openmeetings.web.app.WebSession.getSid;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
@@ -31,6 +32,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dao.room.InvitationDao;
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
@@ -39,7 +41,6 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.server.Server;
-import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.room.poll.CreatePollDialog;
@@ -149,7 +150,7 @@ public class RoomPanel extends BasePanel
 			} else if (!secureHash.isEmpty()) {
 				roomId = getBean(SOAPLoginDao.class).get(secureHash.toString()).getRoom_id();
 			} else if (!invitationHash.isEmpty()) {
-				roomId = getBean(InvitationDao.class).getInvitationByHashCode(invitationHash.toString(), true).getRoom().getRooms_id();
+				roomId = getBean(InvitationDao.class).getInvitationByHashCode(invitationHash.toString(), true).getRoom().getId();
 			}
 		} catch (Exception e) {
 			//no-op
@@ -231,6 +232,15 @@ public class RoomPanel extends BasePanel
 		}
 	}
 
+	public static boolean isModerator(long userId, long roomId) {
+		for (org.apache.openmeetings.web.app.Client c : getRoomUsers(roomId)) {
+			if (c.getUserId() == userId && c.hasRight(org.apache.openmeetings.web.app.Client.Right.moderator)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
 	private ResourceReference newResourceReference() {
 		return new JavaScriptResourceReference(RoomPanel.class, "swf-functions.js");
 	}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java Fri Nov  6 06:18:44 2015
@@ -26,7 +26,7 @@ import java.util.List;
 
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
-import org.apache.openmeetings.db.entity.room.RoomPollAnswers;
+import org.apache.openmeetings.db.entity.room.RoomPollAnswer;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
@@ -212,11 +212,11 @@ public class PollResultsDialog extends A
 	private Integer[] getValues(RoomPoll p) {
 		Integer[] values = initValues(p != null && p.getPollType().getIsNumericAnswer() ? 10 : 2);
 		if (p != null && p.getPollType().getIsNumericAnswer()) {
-			for (RoomPollAnswers a : p.getRoomPollAnswerList()) {
+			for (RoomPollAnswer a : p.getRoomPollAnswerList()) {
 				values[a.getPointList() - 1] ++;
 			}
 		} else if (p != null) {
-			for (RoomPollAnswers a : p.getRoomPollAnswerList()) {
+			for (RoomPollAnswer a : p.getRoomPollAnswerList()) {
 				values[a.getAnswer() ? 0 : 1] ++;
 			}
 		}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java Fri Nov  6 06:18:44 2015
@@ -27,7 +27,7 @@ import java.util.List;
 
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.room.RoomPollAnswers;
+import org.apache.openmeetings.db.entity.room.RoomPollAnswer;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -50,7 +50,7 @@ import com.googlecode.wicket.kendo.ui.pa
  * @author solomax
  *
  */
-public class VoteDialog extends AbstractFormDialog<RoomPollAnswers> {
+public class VoteDialog extends AbstractFormDialog<RoomPollAnswer> {
 	private static final long serialVersionUID = 1L;
 	private final static List<Integer> answers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);  //TODO max vote should be added 
 	private final long roomId;
@@ -63,15 +63,15 @@ public class VoteDialog extends Abstract
 	public VoteDialog(String id, long roomId) {
 		super(id, Application.getString(18));
 		this.roomId = roomId;
-		add(form = new PollAnswerForm("form", new CompoundPropertyModel<RoomPollAnswers>(new RoomPollAnswers())));
+		add(form = new PollAnswerForm("form", new CompoundPropertyModel<RoomPollAnswer>(new RoomPollAnswer())));
 	}
 	
 	static String getName(User u) {
-		return u == null ? "" : getUserId() == u.getUser_id() ? Application.getString(1411) : u.getFirstname() + " " + u.getLastname();
+		return u == null ? "" : getUserId() == u.getId() ? Application.getString(1411) : u.getFirstname() + " " + u.getLastname();
 	}
 	
 	public void updateModel(AjaxRequestTarget target) {
-		RoomPollAnswers a = new RoomPollAnswers();
+		RoomPollAnswer a = new RoomPollAnswer();
 		a.setRoomPoll(getBean(PollDao.class).getPoll(roomId));
 		User u = getBean(UserDao.class).get(getUserId());
 		a.setVotedUser(u);
@@ -117,7 +117,7 @@ public class VoteDialog extends Abstract
 	 */
 	@Override
 	protected void onSubmit(AjaxRequestTarget target) {
-		RoomPollAnswers a = form.getModelObject();
+		RoomPollAnswer a = form.getModelObject();
 		a.setVoteDate(new Date());
 		a.getRoomPoll().getRoomPollAnswerList().add(a);
 		getBean(PollDao.class).updatePoll(a.getRoomPoll());
@@ -128,12 +128,12 @@ public class VoteDialog extends Abstract
 		user.detach();
 		super.onDetach();
 	}
-	private class PollAnswerForm extends Form<RoomPollAnswers> {
+	private class PollAnswerForm extends Form<RoomPollAnswer> {
 		private static final long serialVersionUID = 1L;
 		private final WebMarkupContainer typeBool = new WebMarkupContainer("typeBool");
 		private final WebMarkupContainer typeInt = new WebMarkupContainer("typeInt");
 
-		PollAnswerForm(String id, IModel<RoomPollAnswers> model) {
+		PollAnswerForm(String id, IModel<RoomPollAnswer> model) {
 			super(id, model);
 			add(feedback);
 			add(new Label("user", user));

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java Fri Nov  6 06:18:44 2015
@@ -21,6 +21,7 @@ package org.apache.openmeetings.web.user
 import static org.apache.openmeetings.util.Version.getBuildDate;
 import static org.apache.openmeetings.util.Version.getRevision;
 import static org.apache.openmeetings.util.Version.getVersion;
+import static org.apache.openmeetings.web.app.Application.getBean;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,15 +35,12 @@ import com.googlecode.wicket.jquery.ui.w
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
 public class AboutDialog extends AbstractDialog<String> {
-	private static final long serialVersionUID = 1400355222295594321L;
+	private static final long serialVersionUID = 1L;
 	
 	public AboutDialog(String id) {
 		super(id, Application.getString(1549));
 		
-		add(new Label("name", Application.getBean(ConfigurationDao.class).getConfValue(
-				"application.name"
-				, String.class
-				, ConfigurationDao.DEFAULT_APP_NAME)));
+		add(new Label("name", getBean(ConfigurationDao.class).getAppName()));
 		add(new Label("version", getVersion()));
 		add(new Label("revision", getRevision()));
 		add(new Label("buildDate", getBuildDate()));
@@ -53,6 +51,7 @@ public class AboutDialog extends Abstrac
 		return new ArrayList<DialogButton>();
 	}
 
-	public void onClose(IPartialPageRequestHandler arg0, DialogButton arg1) {
+	@Override
+	public void onClose(IPartialPageRequestHandler handler, DialogButton arg1) {
 	}
 }

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html Fri Nov  6 06:18:44 2015
@@ -19,47 +19,27 @@
   
 -->
 <html xmlns:wicket="http://wicket.apache.org">
-	<wicket:head>
-		<script type="text/javascript">
-			function toggleChat() {
-				var chat = $('#chat');
-				$('#chat #controlBlock #control')
-					.removeClass('ui-icon-carat-1-' + (chat.height() < 24 ? 'n' : 's'))
-					.addClass('ui-icon-carat-1-' + (chat.height() < 24 ? 's' : 'n'));
-				chat.animate({ height: chat.height() < 24 ? "320px" : "20px" }, 1000);
-			}
-			function addChatMessageInternal(m) {
-				if (m && m.type == "chat") {
-					var msg = $('<div><span class="from">' + m.msg.from + '</span><span class="date">'
-							+ m.msg.sent + '</span>' + m.msg.message + '</div>');
-					$('#messageArea').append(msg);
-					msg[0].scrollIntoView();
-				}
-			}
-			function addChatMessage(m) {
-				if (m && m.type == "chat") {
-					addChatMessageInternal(m)
-					$('#messageArea').emoticonize();
-				}
-			}
-			Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
-				addChatMessage(jQuery.parseJSON(msg)); 
-			});
-		</script>
-	</wicket:head>
-	<wicket:panel>
-		<div id="chat" class="ui-state-default">
-			<div id="controlBlock" onclick="toggleChat();" class="ui-state-active clickable"><span id="control" class="ui-icon ui-icon-carat-1-n sort-icon"></span><span><wicket:message key="244"/></span></div>
-			<div wicket:id="messages"></div>
-			<form wicket:id="sendForm">
-				<div wicket:id="toolbarContainer"></div>
-				<table style="width: 100%">
-					<tr>
-						<td><div id="chatMessage" wicket:id="chatMessage"></div></td>
-						<td style="width: 50px"><div wicket:id="send"><wicket:message key="220"/></div></td>
-					</tr>
-				</table>
-			</form>
+<wicket:panel>
+	<div id="chat" class="ui-state-default">
+		<div onclick="toggleChat();" class="control block clickable ui-widget-header ui-state-active"><div class="ui-icon ui-icon-carat-1-n sort-icon"></div><div class="label"><wicket:message key="244"/></div></div>
+		<div id="chatTabs">
+			<ul>
+				<li><a href="#chatTab-all"><wicket:message key="1494"/></a></li>
+			</ul>
+			<div id="chatTab-all" class="messageArea"></div>
 		</div>
-	</wicket:panel>
+		<form wicket:id="sendForm">
+			<div wicket:id="toolbarContainer"></div>
+			<table style="width: 100%">
+				<tr>
+					<td><div id="chatMessage" wicket:id="chatMessage"></div></td>
+					<td style="width: 50px">
+						<div wicket:id="send"><wicket:message key="220"/></div>
+						<input type="hidden" wicket:id="activeTab" id="activeChatTab"/>
+					</td>
+				</tr>
+			</table>
+		</form>
+	</div>
+</wicket:panel>
 </html>

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Fri Nov  6 06:18:44 2015
@@ -21,29 +21,52 @@ package org.apache.openmeetings.web.user
 import static org.apache.commons.lang3.StringEscapeUtils.unescapeXml;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getUserRooms;
+import static org.apache.openmeetings.web.app.Application.isUserInRoom;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
+import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 import org.apache.openmeetings.db.dao.basic.ChatDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.json.JSONArray;
 import org.apache.wicket.ajax.json.JSONException;
 import org.apache.wicket.ajax.json.JSONObject;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.head.CssHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
-import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
 import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
 import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
+import org.apache.wicket.protocol.ws.api.registry.PageIdKey;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
@@ -54,41 +77,97 @@ import com.googlecode.wicket.jquery.ui.p
 @AuthorizeInstantiation({"Dashboard", "Room"})
 public class ChatPanel extends BasePanel {
 	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
-	private static final long serialVersionUID = -9144707674886211557L;
-	private static final String MESSAGE_AREA_ID = "messageArea";
+	private static final long serialVersionUID = 1L;
+	private static final String ID_TAB_PREFIX = "chatTab-";
+	private static final String ID_USER_PREFIX = ID_TAB_PREFIX + "u";
+	public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
+	private static final String ID_ALL = ID_TAB_PREFIX + "all";
+	private static final String PARAM_MSG_ID = "msgid";
+	private static final String PARAM_ROOM_ID = "roomid";
+	private final AbstractDefaultAjaxBehavior acceptMessage = new AbstractDefaultAjaxBehavior() {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void respond(AjaxRequestTarget target) {
+			try {
+				long msgId = getRequest().getRequestParameters().getParameterValue(PARAM_MSG_ID).toLong(); 
+				long roomId = getRequest().getRequestParameters().getParameterValue(PARAM_ROOM_ID).toLong();
+				ChatDao dao = getBean(ChatDao.class);
+				ChatMessage m = dao.get(msgId);
+				if (m.isNeedModeration() && isModerator(getUserId(), roomId)) {
+					m.setNeedModeration(false);
+					dao.update(m);
+					sendRoom(m, getMessage(Arrays.asList(m)).put("mode",  "accept").toString());
+				} else {
+					log.error("It seems like we are being hacked!!!!");
+				}
+			} catch (Exception e) {
+				log.error("Unexpected exception while accepting chat message", e);
+			}
+		}
+	};
 	
-	private JSONObject getMessage(ChatMessage m) throws JSONException {
-		String msg = m.getMessage();
-		msg = msg == null ? msg : " " + msg.replaceAll("&nbsp;", " ") + " ";
-		return new JSONObject()
-			.put("type", "chat")
-			.put("msg", new JSONObject()
+	private static JSONObject setScope(JSONObject o, ChatMessage m, long curUserId) {
+		String scope, scopeName;
+		if (m.getToUser() != null) {
+			User u = curUserId == m.getToUser().getId() ? m.getFromUser() : m.getToUser();
+			scope = ID_USER_PREFIX + u.getId();
+			scopeName = String.format("%s %s", u.getFirstname(), u.getLastname());
+		} else if (m.getToRoom() != null) {
+			scope = ID_ROOM_PREFIX + m.getToRoom().getId();
+			scopeName = String.format("%s %s", Application.getString(406), m.getToRoom().getId());
+			o.put("needModeration", m.isNeedModeration());
+		} else {
+			scope = ID_ALL;
+			scopeName = Application.getString(1494);
+		}
+		return o.put("scope", scope).put("scopeName", scopeName);
+	}
+	
+	public static JSONObject getMessage(List<ChatMessage> list) throws JSONException {
+		return getMessage(getUserId(), list);
+	}
+	
+	private static JSONObject getMessage(long curUserId, List<ChatMessage> list) throws JSONException {
+		JSONArray arr = new JSONArray();
+		for (ChatMessage m : list) {
+			String smsg = m.getMessage();
+			smsg = smsg == null ? smsg : " " + smsg.replaceAll("&nbsp;", " ") + " ";
+			arr.put(setScope(new JSONObject(), m, curUserId)
 				.put("id", m.getId())
-				.put("message", msg)
+				.put("message", smsg)
 				.put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
-				.put("sent", getDateFormat().format(m.getSent()))
-			);
+				.put("sent", getDateFormat().format(m.getSent())));
+		}
+		return new JSONObject()
+			.put("type", "chat")
+			.put("msg", arr);
 	}
 
 	public ChatPanel(String id) {
 		super(id);
-		setOutputMarkupId(true);
+		setOutputMarkupPlaceholderTag(true);
 		setMarkupId(id);
 
-		add(new Behavior() {
-			private static final long serialVersionUID = -2205036360048419129L;
+		add(acceptMessage, new Behavior() {
+			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void renderHead(Component component, IHeaderResponse response) {
 				ChatDao dao = getBean(ChatDao.class);
 				try {				
-					StringBuilder sb = new StringBuilder();
 					//FIXME limited count should be loaded with "earlier" link
-					for (ChatMessage m : dao.get(0, 30)) {
-						sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+					List<ChatMessage> list = new ArrayList<ChatMessage>(dao.getGlobal(0, 30));
+					for(Long roomId : getUserRooms(getUserId())) {
+						Room r = getBean(RoomDao.class).get(roomId);
+						list.addAll(dao.getRoom(roomId, 0, 30, !r.isChatModerated() || isModerator(getUserId(), roomId)));
 					}
-					if (sb.length() > 0) {
-						sb.append("$('#").append(MESSAGE_AREA_ID).append("').emoticonize();");
+					Calendar c = WebSession.getCalendar();
+					c.add(Calendar.HOUR_OF_DAY, -1);
+					list.addAll(dao.getUserRecent(getUserId(), c.getTime(), 0, 30));
+					if (list.size() > 0) {
+						StringBuilder sb = new StringBuilder();
+						sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
 						response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
 					}
 				} catch (JSONException e) {
@@ -97,12 +176,58 @@ public class ChatPanel extends BasePanel
 				super.renderHead(component, response);
 			}
 		});
-		add(new EmoticonsBehavior("#" + MESSAGE_AREA_ID));
-		add(new WebMarkupContainer("messages").setMarkupId(MESSAGE_AREA_ID));
-		ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
-		final WysiwygEditor chatMessage = new WysiwygEditor("chatMessage", Model.of(""), toolbar);
-		add(new Form<Void>("sendForm").add(
-				toolbar
+		add(new EmoticonsBehavior(".messageArea"));
+		add(new ChatForm("sendForm"));
+	}
+
+	public void roomEnter(Room r, AjaxRequestTarget target) {
+		if (r.isChatHidden()) {
+			target.add(setVisible(false));
+			return;
+		}
+		StringBuilder sb = new StringBuilder();
+		sb.append("$(function() {");
+		sb.append(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ID_ROOM_PREFIX, r.getId(), Application.getString(406)));
+		sb.append(r.isChatOpened() ? "openChat();" : "closeChat();");
+		List<ChatMessage> list = getBean(ChatDao.class).getRoom(r.getId(), 0, 30, !r.isChatModerated() || isModerator(getUserId(), r.getId()));
+		if (list.size() > 0) {
+			sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
+		}
+		sb.append("});");
+		target.appendJavaScript(sb);
+	}
+	
+	@Override
+	public void renderHead(IHeaderResponse response) {
+		super.renderHead(response);
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(ChatPanel.class, "chat.js"))));
+		response.render(CssHeaderItem.forUrl("css/chat.css"));
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("acceptMessage", acceptMessage, explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID)), "acceptMessage")));
+	}
+	
+	private void sendRoom(ChatMessage m, String msg) {
+		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
+		for (Client c : getRoomUsers(m.getToRoom().getId())) {
+			try {
+				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Client.Right.moderator))) {
+					reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+				}
+			} catch (Exception e) {
+				log.error("Error while sending message to room", e);
+			}
+		}
+	}
+	
+	private class ChatForm extends Form<Void> {
+		private static final long serialVersionUID = 1L;
+		private final ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
+		private final WysiwygEditor chatMessage = new WysiwygEditor("chatMessage", Model.of(""), toolbar);
+		private final HiddenField<String> activeTab = new HiddenField<String>("activeTab", Model.of(""));
+		
+		ChatForm(String id) {
+			super(id);
+			add(toolbar
+				, activeTab
 				, chatMessage.setOutputMarkupId(true)
 				, new AjaxButton("send") {
 					private static final long serialVersionUID = 1L;
@@ -114,18 +239,63 @@ public class ChatPanel extends BasePanel
 						m.setMessage(unescapeXml(chatMessage.getDefaultModelObjectAsString()));
 						m.setSent(new Date());
 						m.setFromUser(getBean(UserDao.class).get(getUserId()));
+						try {
+							String scope = activeTab.getModelObject();
+							if (scope != null) {
+								if (ID_ALL.equals(scope)) {
+									//we done
+								} else if (scope.startsWith(ID_ROOM_PREFIX)) {
+									Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+									if (isUserInRoom(r.getId(), getUserId())) {
+										m.setToRoom(r);
+									} else {
+										log.error("It seems like we are being hacked!!!!");
+										return;
+									}
+									m.setNeedModeration(r.isChatModerated() && !isModerator(m.getFromUser().getId(), r.getId()));
+								} else if (scope.startsWith(ID_USER_PREFIX)) {
+									User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+									m.setToUser(u);
+								}
+							}
+						} catch (Exception e) {
+							//no-op
+						}
 						dao.update(m);
-						IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
-						for (IWebSocketConnection c : reg.getConnections(getApplication())) {
-							try {
-								c.sendMessage(getMessage(m).toString());
-							} catch(Exception e) {
-								log.error("Error while sending message", e);
+						String msg = getMessage(Arrays.asList(m)).toString();
+						if (m.getToRoom() != null) {
+							sendRoom(m, msg);
+						} else if (m.getToUser() != null) {
+							IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
+							for (Client c : Application.getClients(getUserId())) {
+								try {
+									reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+								} catch (Exception e) {
+									log.error("Error while sending message to room", e);
+								}
+							}
+							msg = getMessage(m.getToUser().getId(), Arrays.asList(m)).toString();
+							for (Client c : Application.getClients(m.getToUser().getId())) {
+								try {
+									reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+								} catch (Exception e) {
+									log.error("Error while sending message to room", e);
+								}
+							}
+						} else {
+							IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
+							for (IWebSocketConnection c : reg.getConnections(getApplication())) {
+								try {
+									c.sendMessage(msg);
+								} catch(Exception e) {
+									log.error("Error while sending message", e);
+								}
 							}
 						}
 						chatMessage.setDefaultModelObject("");
 						target.add(chatMessage);
 					};
-				}));
+				});
+		}
 	}
 }

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html Fri Nov  6 06:18:44 2015
@@ -37,7 +37,7 @@
 				</tr>
 				<tr>
 					<td><wicket:message key="565" /></td>
-					<td><select wicket:id="remind" ></select></td>
+					<td><select wicket:id="reminder" ></select></td>
 				</tr>
 				<tr>
 					<td colspan="2"><input type="checkbox" wicket:id="createRoom" /><label wicket:for="createRoom"><wicket:message key="1509" /></label></td>

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java Fri Nov  6 06:18:44 2015
@@ -20,11 +20,9 @@ package org.apache.openmeetings.web.user
 
 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.getLanguage;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getDate;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getDateTime;
-import static org.apache.openmeetings.web.util.RoomTypeDropDown.getRoomTypes;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -35,14 +33,12 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
-import org.apache.openmeetings.db.dao.calendar.AppointmentReminderTypDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
-import org.apache.openmeetings.db.entity.calendar.AppointmentReminderTyps;
+import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
 import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.RoomType;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.FormatHelper;
@@ -60,6 +56,7 @@ import org.apache.wicket.markup.html.bas
 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.IChoiceRenderer;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.markup.html.form.TextField;
@@ -130,18 +127,19 @@ public class AppointmentDialog extends A
 		confirmDelete = new MessageDialog("confirmDelete", Application.getString(814), Application.getString(833), DialogButtons.OK_CANCEL, DialogIcon.WARN){
 			private static final long serialVersionUID = 1L;
 
-			public void onClose(IPartialPageRequestHandler target, DialogButton button) {
+			@Override
+			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
 				if (button != null && button.match(AbstractDialog.OK)){
-					deleteAppointment(target);
+					deleteAppointment(handler);
 				}
 			}
 		};
 		add(confirmDelete);
 	}
 
-	protected void deleteAppointment(IPartialPageRequestHandler target) {
+	protected void deleteAppointment(IPartialPageRequestHandler handler) {
 		getBean(AppointmentDao.class).delete(getModelObject(), getUserId());
-		calendarPanel.refresh(target);		
+		calendarPanel.refresh(handler);		
 	}
 
 	@Override
@@ -160,16 +158,16 @@ public class AppointmentDialog extends A
 	}
 
 	@Override
-	protected void onOpen(IPartialPageRequestHandler target) {
-		target.add(this.form);
+	protected void onOpen(IPartialPageRequestHandler handler) {
+		handler.add(this.form);
 	}
 	
 	@Override
-	public void onClose(IPartialPageRequestHandler target, DialogButton button) {
+	public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
 		if (delete.equals(button)) {
-			confirmDelete.open(target);
+			confirmDelete.open(handler);
 		} else if (enterRoom.equals(button)) {
-			RoomEnterBehavior.roomEnter((MainPage)getPage(), target, getModelObject().getRoom().getRooms_id());
+			RoomEnterBehavior.roomEnter((MainPage)getPage(), handler, getModelObject().getRoom().getId());
 		}
 	}
 	
@@ -184,25 +182,25 @@ public class AppointmentDialog extends A
         final List<MeetingMember> attendees = a.getMeetingMembers() == null ? new ArrayList<MeetingMember>() : a.getMeetingMembers();
         Set<Long> currentIds = new HashSet<Long>();
         for (User u : attendeesModel.getObject()) {
-        	if (u.getUser_id() != null) {
-        		currentIds.add(u.getUser_id());
+        	if (u.getId() != null) {
+        		currentIds.add(u.getId());
         	}
         }
         
         //remove users
         for (Iterator<MeetingMember> i = attendees.iterator(); i.hasNext();) {
         	MeetingMember m = i.next();
-        	if (!currentIds.contains(m.getUser().getUser_id())) {
+        	if (!currentIds.contains(m.getUser().getId())) {
         		i.remove();
         	}
         }
         Set<Long> originalIds = new HashSet<Long>();
         for (MeetingMember m : attendees) {
-        	originalIds.add(m.getUser().getUser_id());
+        	originalIds.add(m.getUser().getId());
         }
         //add users
         for (User u : attendeesModel.getObject()) {
-        	if (u.getUser_id() == null || !originalIds.contains(u.getUser_id())) {
+        	if (u.getId() == null || !originalIds.contains(u.getId())) {
         		MeetingMember mm = new MeetingMember();
         		mm.setUser(u);
         		mm.setDeleted(false);
@@ -221,7 +219,7 @@ public class AppointmentDialog extends A
 	}
 	
 	public static boolean isOwner(Appointment object) {
-		return object.getOwner() != null && getUserId() == object.getOwner().getUser_id();
+		return object.getOwner() != null && getUserId() == object.getOwner().getId();
 	}
 	
 	@Override
@@ -237,32 +235,30 @@ public class AppointmentDialog extends A
 		private final DateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
 		private final PasswordTextField pwd = new PasswordTextField("password");
 		private final Label owner = new Label("aowner", Model.of(""));
-		private final DropDownChoice<RoomType> roomType = new RoomTypeDropDown("room.roomtype");
+		private final DropDownChoice<Room.Type> roomType = new RoomTypeDropDown("room.type");
 		private final DropDownChoice<Room> room = new DropDownChoice<Room>(
 				"room"
 				, getRoomList()
-				, new ChoiceRenderer<Room>("name", "rooms_id"));
+				, new ChoiceRenderer<Room>("name", "id"));
 
 		@Override
 		protected void onModelChanged() {
 			super.onModelChanged();
 
 			Appointment a = getModelObject();
-			List<AppointmentReminderTyps> remindTypes = getRemindTypes();
-			if (a.getRemind() == null && !remindTypes.isEmpty()) {
-				a.setRemind(remindTypes.get(0));
+			if (a.getReminder() == null) {
+				a.setReminder(Reminder.none);
 			}
 			
-			List<RoomType> roomTypes = getRoomTypes();
 			if (a.getRoom() == null) {
 				Room r = new Room();
 				r.setAppointment(true);
 				a.setRoom(r);
 			}
-			if (a.getRoom().getRoomtype() == null && !roomTypes.isEmpty()) {
-				a.getRoom().setRoomtype(roomTypes.get(0));
+			if (a.getRoom().getType() == null) {
+				a.getRoom().setType(Room.Type.conference);
 			}
-			createRoom = Boolean.TRUE.equals(a.getRoom().getAppointment());
+			createRoom = a.getRoom().isAppointment();
 			roomType.setEnabled(createRoom);
 			room.setEnabled(!createRoom);
 			if (a.getId() == null) {
@@ -304,21 +300,30 @@ public class AppointmentDialog extends A
 			pwd.setOutputMarkupId(true);
 			add(pwd);
 			
-			List<AppointmentReminderTyps> remindTypes = getRemindTypes();
-			add(new DropDownChoice<AppointmentReminderTyps>(
-					"remind"
-					, remindTypes
-					, new ChoiceRenderer<AppointmentReminderTyps>() {
+			add(new DropDownChoice<Reminder>(
+					"reminder"
+					, Arrays.asList(Reminder.values())
+					, new IChoiceRenderer<Reminder>() {
 						private static final long serialVersionUID = 1L;
 
 						@Override
-						public Object getDisplayValue(AppointmentReminderTyps object) {
-							return getString("" + object.getFieldvalues_id());
+						public Object getDisplayValue(Reminder art) {
+							return getString("appointment.reminder." + art.name());
 						}
 
 						@Override
-						public String getIdValue(AppointmentReminderTyps object, int index) {
-							return "" + object.getTypId();
+						public String getIdValue(Reminder art, int index) {
+							return art.name();
+						}
+
+						@Override
+						public Reminder getObject(String id, IModel<? extends List<? extends Reminder>> choices) {
+							for (Reminder art : choices.getObject()) {
+								if (art.name().equals(id)) {
+									return art;
+								}
+							}
+							return null;
 						}
 					}));
 			
@@ -349,19 +354,15 @@ public class AppointmentDialog extends A
 			add(owner);
 		}
 		
-		private List<AppointmentReminderTyps> getRemindTypes() {
-			return getBean(AppointmentReminderTypDao.class).getAppointmentReminderTypList(getLanguage());
-		}
-		
 		private List<Room> getRoomList() {
 			//FIXME need to be reviewed
 			List<Room> result = new ArrayList<Room>();
 			RoomDao dao = getBean(RoomDao.class);
 			result.addAll(dao.getPublicRooms());
 			for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
-				result.addAll(dao.getOrganisationRooms(ou.getOrganisation().getOrganisation_id()));
+				result.addAll(dao.getOrganisationRooms(ou.getOrganisation().getId()));
 			}
-			if (getModelObject().getRoom() != null && getModelObject().getRoom().getAppointment()) { //FIXME review
+			if (getModelObject().getRoom() != null && getModelObject().getRoom().isAppointment()) { //FIXME review
 				result.add(getModelObject().getRoom());
 			}
 			return result;

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java Fri Nov  6 06:18:44 2015
@@ -42,7 +42,7 @@ public class AppointmentModel extends Ca
 	@Override
 	protected List<? extends CalendarEvent> load() {
 		List<CalendarEvent> list = new ArrayList<CalendarEvent>();
-		for (Appointment a : getBean(AppointmentDao.class).getAppointmentsByRange(getUserId(), getDate(getStart()), getDate(getEnd()))) {
+		for (Appointment a : getBean(AppointmentDao.class).getInRange(getUserId(), getDate(getStart()), getDate(getEnd()))) {
 			list.add(new OmCalendarEvent(a));
 		}
 		return list;

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java?rev=1712911&r1=1712910&r2=1712911&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java Fri Nov  6 06:18:44 2015
@@ -29,9 +29,9 @@ import java.util.Date;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
-import org.apache.openmeetings.db.dao.calendar.AppointmentReminderTypDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
+import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.UserPanel;
@@ -84,10 +84,6 @@ public class CalendarPanel extends UserP
 		return getBean(AppointmentDao.class);
 	}
 	
-	private AppointmentReminderTypDao getAppointmentReminderTypDao() {
-		return getBean(AppointmentReminderTypDao.class);
-	}
-	
 	public void refresh(IPartialPageRequestHandler target) {
 		calendar.refresh(target);
 	}
@@ -265,7 +261,7 @@ public class CalendarPanel extends UserP
 	
 	private Appointment getDefault() {
 		Appointment a = new Appointment();
-		a.setRemind(getAppointmentReminderTypDao().get(3L)); //TODO: Make configurable
+		a.setReminder(Reminder.email); //TODO: Make configurable
 		a.setOwner(getBean(UserDao.class).get(getUserId()));
 		a.setTitle(Application.getString(1444));
 		log.debug(" -- getDefault -- Current model " + a);