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


Reply via email to