You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2015/12/03 20:03:34 UTC

svn commit: r1717837 [1/2] - in /openmeetings: branches/3.1.x/openmeetings-flash/src/main/swf/base/hibernate/ branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ branches/3.1.x/openmeetings-web/src/main/java/org/apache/openme...

Author: solomax
Date: Thu Dec  3 19:03:33 2015
New Revision: 1717837

URL: http://svn.apache.org/viewvc?rev=1717837&view=rev
Log:
[OPENMEETINGS-887] actions are added to the global chat

Added:
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
      - copied, changed from r1717826, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
      - copied, changed from r1717714, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.html
      - copied unchanged from r1717712, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
      - copied, changed from r1717712, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/images/connect.png   (with props)
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
      - copied unchanged from r1717651, openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
      - copied, changed from r1717714, openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.html
      - copied unchanged from r1717651, openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
      - copied, changed from r1717651, openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/connect.png   (with props)
Removed:
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java
Modified:
    openmeetings/branches/3.1.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomEnterBehavior.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html
    openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
    openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/chat.css
    openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/forms.css
    openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/theme.css
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomEnterBehavior.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/forms.css
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css

Modified: openmeetings/branches/3.1.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx (original)
+++ openmeetings/branches/3.1.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx Thu Dec  3 19:03:33 2015
@@ -1437,11 +1437,6 @@
 				canvas._drawarea.stopStreaming(value);
 			} else if (value.message=='roomClosed'){
 				canvas.roomClosed();
-			} else if (value.message=='inviteToRoom'){
-				if ($debug) Debug.write("Incoming Room Invitation ",value);
-			} else if (value.message=='inviteToRoomAnswer'){
-				if ($debug) Debug.write("Incoming Room inviteToRoomAnswer ",value);
-				new lz.errorPopup(canvas, {error: value.usermessage});
 			} else {
 				if ($debug) Debug.warn("Unknown Event -newMessageByRoomAndDomain- ",value);
 			}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Thu Dec  3 19:03:33 2015
@@ -67,6 +67,7 @@ import org.apache.openmeetings.web.util.
 import org.apache.openmeetings.web.util.JpgRecordingResourceReference;
 import org.apache.openmeetings.web.util.Mp4RecordingResourceReference;
 import org.apache.openmeetings.web.util.OggRecordingResourceReference;
+import org.apache.openmeetings.web.util.ProfileImageResourceReference;
 import org.apache.openmeetings.web.util.UserDashboardPersister;
 import org.apache.wicket.Localizer;
 import org.apache.wicket.Page;
@@ -154,6 +155,7 @@ public class Application extends Authent
 		mountResource("/recordings/mp4/${id}", new Mp4RecordingResourceReference());
 		mountResource("/recordings/ogg/${id}", new OggRecordingResourceReference());
 		mountResource("/recordings/jpg/${id}", new JpgRecordingResourceReference()); //should be in sync with VideoPlayer
+		mountResource("/profile/${id}", new ProfileImageResourceReference()); //should be in sync with VideoPlayer
 	}
 
 	private static class NoVersionMapper extends MountedMapper {

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java Thu Dec  3 19:03:33 2015
@@ -18,68 +18,24 @@
  */
 package org.apache.openmeetings.web.common;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URI;
-
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.image.Image;
-import org.apache.wicket.request.resource.ByteArrayResource;
-import org.apache.wicket.util.io.IOUtils;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
 
 public class ProfileImagePanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
-	private static final Logger log = Red5LoggerFactory.getLogger(ProfileImagePanel.class, webAppRootKey);
 	protected final WebMarkupContainer profile;
 	
 	public ProfileImagePanel(String id, final long userId) {
 		super(id);
 		
 		profile = new TransparentWebMarkupContainer("profile");
-		String uri = getBean(UserDao.class).get(userId).getPictureuri();
-		boolean absolute = false;
-		try {
-			absolute = URI.create(uri).isAbsolute();
-		} catch (Exception e) {
-			//no-op
-		}
-		if (absolute) {
-			profile.add(new WebMarkupContainer("img").add(AttributeModifier.append("alt", Application.getString(5L)), AttributeModifier.append("src", uri)));
-		} else {
-			profile.add(new Image("img", new ByteArrayResource("image/jpeg") {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected ResourceResponse newResourceResponse(Attributes attributes) {
-					ResourceResponse rr = super.newResourceResponse(attributes);
-					rr.disableCaching();
-					return rr;
-				}
-				
-				@Override
-				protected byte[] getData(Attributes attributes) {
-					String uri = getBean(UserDao.class).get(userId).getPictureuri();
-					File img = OmFileHelper.getUserProfilePicture(userId, uri);
-					try (InputStream is = new FileInputStream(img)) {
-						return IOUtils.toByteArray(is);
-					} catch (Exception e) {
-						log.error("failed to get bytes from image", e);
-					}
-					return null;
-				}
-			}));
-		}
+		profile.add(new WebMarkupContainer("img").add(
+				AttributeModifier.append("alt", Application.getString(5L))
+				, AttributeModifier.append("src", getUrl(getRequestCycle(), userId))));
 		add(profile.setOutputMarkupId(true));
 	}
 }

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=1717837&r1=1717836&r2=1717837&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 Thu Dec  3 19:03:33 2015
@@ -57,5 +57,6 @@
 	<div wicket:id="aboutDialog"></div>
 	<div wicket:id="userInfoDialog"></div>
 	<div wicket:id="newMessageDialog"></div>
+	<div wicket:id="inviteUserDialog"></div>
 </wicket:extend>
 </html>

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=1717837&r1=1717836&r2=1717837&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 Thu Dec  3 19:03:33 2015
@@ -50,8 +50,9 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.menu.MenuPanel;
 import org.apache.openmeetings.web.user.AboutDialog;
 import org.apache.openmeetings.web.user.ChatPanel;
-import org.apache.openmeetings.web.user.profile.MessageDialog;
-import org.apache.openmeetings.web.user.profile.UserInfoDialog;
+import org.apache.openmeetings.web.user.InviteUserToRoomDialog;
+import org.apache.openmeetings.web.user.MessageDialog;
+import org.apache.openmeetings.web.user.UserInfoDialog;
 import org.apache.openmeetings.web.util.ContactsHelper;
 import org.apache.openmeetings.web.util.OmUrlFragment;
 import org.apache.wicket.Component;
@@ -96,6 +97,7 @@ public class MainPage extends BaseInited
 	private final ChatPanel chat;
 	private final MessageDialog newMessage;
 	private final UserInfoDialog userInfo;
+	private final InviteUserToRoomDialog inviteUser;
 	
 	public MainPage(PageParameters pp) {
 		super();
@@ -161,6 +163,7 @@ public class MainPage extends BaseInited
 			}
 		});
 		add(userInfo = new UserInfoDialog("userInfoDialog", newMessage));
+		add(inviteUser = new InviteUserToRoomDialog("inviteUserDialog"));
 		add(new AbstractDefaultAjaxBehavior() {
 			private static final long serialVersionUID = 1L;
 
@@ -221,6 +224,20 @@ public class MainPage extends BaseInited
 				log.debug("WebSocketBehavior::onClose");
 			}
 		});
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				inviteUser.open(target, getParam(getComponent(), PARAM_USER_ID).toLong());
+			}
+			
+			@Override
+			public void renderHead(Component component, IHeaderResponse response) {
+				super.renderHead(component, response);
+				response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("inviteUser", this, explicit(PARAM_USER_ID)), "inviteUser")));
+			}
+		});
 		//load preselected content
 		add(areaBehavior = new AbstractAjaxTimerBehavior(Duration.ONE_SECOND) {
 			private static final long serialVersionUID = 1L;

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=1717837&r1=1717836&r2=1717837&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 Thu Dec  3 19:03:33 2015
@@ -28,6 +28,7 @@ import static org.apache.openmeetings.we
 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.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
 import java.util.ArrayList;
@@ -124,11 +125,11 @@ public class ChatPanel extends BasePanel
 		return o.put("scope", scope).put("scopeName", scopeName);
 	}
 	
-	public static JSONObject getMessage(List<ChatMessage> list) throws JSONException {
+	public JSONObject getMessage(List<ChatMessage> list) throws JSONException {
 		return getMessage(getUserId(), list);
 	}
 	
-	private static JSONObject getMessage(long curUserId, List<ChatMessage> list) throws JSONException {
+	private JSONObject getMessage(long curUserId, List<ChatMessage> list) throws JSONException {
 		JSONArray arr = new JSONArray();
 		for (ChatMessage m : list) {
 			String smsg = m.getMessage();
@@ -136,7 +137,12 @@ public class ChatPanel extends BasePanel
 			arr.put(setScope(new JSONObject(), m, curUserId)
 				.put("id", m.getId())
 				.put("message", smsg)
-				.put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
+				.put("from", new JSONObject()
+						.put("id", m.getFromUser().getId())
+						.put("name", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
+						.put("img", getUrl(getRequestCycle(), m.getFromUser().getId()))
+
+					)
 				.put("sent", getDateFormat().format(m.getSent())));
 		}
 		return new JSONObject()

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html Thu Dec  3 19:03:33 2015
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<form wicket:id="form">
+		<textarea wicket:id="message" style="width: 100%; height: 100px;"></textarea>
+		<div>
+			<input type="checkbox" wicket:id="enterRoom" /><label wicket:for="enterRoom"><wicket:message key="1134"/></label>
+		</div>
+	</form>
+</wicket:panel>
+</html>

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java Thu Dec  3 19:03:33 2015
@@ -0,0 +1,90 @@
+/*
+ * 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.user;
+
+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.List;
+
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+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.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+
+public class InviteUserMessageDialog extends AbstractFormDialog<String>  {
+	private static final long serialVersionUID = 1L;
+	private final DialogButton send = new DialogButton("send", Application.getString(1139));
+	private final DialogButton cancel = new DialogButton("cancel", Application.getString(219));
+	private final Form<Void> form = new Form<Void>("form");
+	private final TextArea<String> message = new TextArea<>("message", Model.of(""));
+	private final CheckBox enterRoom = new CheckBox("enterRoom", Model.of(false));
+	
+	public InviteUserMessageDialog(String id) {
+		super(id, Application.getString(1138));
+		add(form.add(message.setRequired(true), enterRoom).setOutputMarkupId(true));
+	}
+
+	public void open(IPartialPageRequestHandler handler, Long roomId, Long userId) {
+		Room r = getBean(RoomDao.class).get(roomId);
+		User u = getBean(UserDao.class).get(getUserId());
+		message.setModelObject(String.format("%s %s %s %s", u.getFirstname(), u.getLastname(), getString("1137"), r.getName()));
+		enterRoom.setModelObject(false);
+		handler.add(form);
+		open(handler);
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return Arrays.asList(send, cancel);
+	}
+	
+	@Override
+	protected DialogButton getSubmitButton() {
+		return send;
+	}
+
+	@Override
+	public Form<?> getForm() {
+		return form;
+	}
+
+	@Override
+	protected void onError(AjaxRequestTarget target) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	protected void onSubmit(AjaxRequestTarget target) {
+		// TODO Auto-generated method stub
+		
+	}
+}

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html Thu Dec  3 19:03:33 2015
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div class="rooms desc info-text"><wicket:message key="1132"/></div>
+	<div class="rooms title"><wicket:message key="777"/></div>
+	<div class="room list container">
+		<div wicket:id="publicRooms"></div>
+	</div>
+	<div class="rooms title"><wicket:message key="779"/></div>
+	<div class="room list container">
+		<div wicket:id="privateRooms"></div>
+	</div>
+	<div wicket:id="inviteMsg"/>
+</wicket:panel>
+</html>

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java Thu Dec  3 19:03:33 2015
@@ -0,0 +1,103 @@
+/*
+ * 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.user;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.GroupUser;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.user.rooms.RoomListPanel;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+
+public class InviteUserToRoomDialog extends AbstractDialog<String> {
+	private static final long serialVersionUID = 1L;
+	private DialogButton cancel = new DialogButton("cancel", Application.getString(219));
+	private final RoomListPanel publicRooms;
+	private final RoomListPanel privateRooms;
+	private final InviteUserMessageDialog inviteMsg = new InviteUserMessageDialog("inviteMsg"); 
+	private Long userId;
+
+	private class InviteRoomListPanel extends RoomListPanel {
+		private static final long serialVersionUID = 1L;
+
+		public InviteRoomListPanel(String id, List<Room> rooms, final String label) {
+			super(id, rooms, label);
+		}
+		
+		@Override
+		public void onRoomEnter(AjaxRequestTarget target, Long roomId) {
+			//FIXME TODO only show message if other user is online
+			inviteMsg.open(target, roomId, userId);
+		}
+	}
+	
+	public InviteUserToRoomDialog(String id) {
+		super(id, Application.getString(1131));
+		add(publicRooms = new InviteRoomListPanel("publicRooms", new ArrayList<Room>(), Application.getString(1135)));
+		add(privateRooms = new InviteRoomListPanel("privateRooms", new ArrayList<Room>(), Application.getString(1135)));
+		add(inviteMsg);
+	}
+	
+	private List<Room> getPrivateRooms(Long userId1, Long userId2, RoomDao roomDao) {
+		List<Long> orgIds = new ArrayList<>();
+		List<Long> orgIds2 = new ArrayList<>();
+		UserDao userDao = getBean(UserDao.class);
+		for (GroupUser gu : userDao.get(userId1).getGroupUsers()) {
+			orgIds.add(gu.getGroup().getId());
+		}
+		for (GroupUser gu : userDao.get(userId2).getGroupUsers()) {
+			orgIds2.add(gu.getGroup().getId());
+		}
+		orgIds.retainAll(orgIds2);
+		List<Room> result = new ArrayList<>();
+		for (Long orgId : orgIds) {
+			result.addAll(roomDao.getGroupRooms(orgId));
+		}
+		return result;
+	}
+	
+	public void open(IPartialPageRequestHandler handler, Long userId) {
+		this.userId = userId;
+		RoomDao roomDao = getBean(RoomDao.class);
+		publicRooms.update(handler, roomDao.getPublicRooms());
+		privateRooms.update(handler, getPrivateRooms(getUserId(), userId, roomDao));
+		open(handler);
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return Arrays.asList(cancel);
+	}
+	
+	@Override
+	public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
+	}
+}

Copied: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html (from r1717826, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html)
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html?p2=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html&p1=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html&r1=1717826&r2=1717837&rev=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html Thu Dec  3 19:03:33 2015
@@ -77,4 +77,4 @@
 		</table>
 	</form>
 </wicket:panel>
-</html>
\ No newline at end of file
+</html>

Copied: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java (from r1717714, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java)
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java?p2=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java&p1=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java&r1=1717714&r2=1717837&rev=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessageDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java Thu Dec  3 19:03:33 2015
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.user.profile;
+package org.apache.openmeetings.web.user;
 
 import static org.apache.openmeetings.db.entity.user.PrivateMessage.INBOX_FOLDER_ID;
 import static org.apache.openmeetings.db.entity.user.PrivateMessage.SENT_FOLDER_ID;

Copied: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java (from r1717712, openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java)
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java?p2=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java&p1=openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java&r1=1717712&r2=1717837&rev=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserInfoDialog.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java Thu Dec  3 19:03:33 2015
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.user.profile;
+package org.apache.openmeetings.web.user;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
@@ -26,6 +26,7 @@ import java.util.List;
 
 import org.apache.openmeetings.db.dao.user.UserContactDao;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.user.profile.UserProfilePanel;
 import org.apache.openmeetings.web.util.ContactsHelper;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js Thu Dec  3 19:03:33 2015
@@ -17,8 +17,13 @@
  * under the License.
  */
 var chatTabs, tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
-	, msgTemplate = "<div id='chat-msg-id-#{id}'><span class='from'>#{from}</span><span class='date'>#{sent}</span>#{msg}</div>"
-	, acceptTemplate = "<span class='tick om-icon align-right clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='var e=$(this);acceptMessage(e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></span>"
+	, msgTemplate = "<div id='chat-msg-id-#{id}'><img class='profile' src='#{imgSrc}'/><span class='from' data-user-id='#{userId}'>#{from}</span><span class='date align-right'>#{sent}</span>#{msg}</div>"
+	, acceptTemplate = "<div class='tick om-icon align-right clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='var e=$(this);acceptMessage(e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
+	, infoTemplate = "<div class='user om-icon align-right clickable' data-user-id='#{userId}' onclick='var e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
+	, addTemplate = "<div class='add om-icon align-right clickable' data-user-id='#{userId}' onclick='var e=$(this);addContact(e.data(\"userId\"));'></div>"
+	, messageTemplate = "<div class='new-email om-icon align-right clickable' data-user-id='#{userId}' onclick='var e=$(this);privateMessage(e.data(\"userId\"));'></div>"
+	, inviteTemplate = "<div class='invite om-icon align-right clickable' data-user-id='#{userId}' onclick='var e=$(this);inviteUser(e.data(\"userId\"));'></div>"
+	, clearBlock = "<div class='clear'></div>"
 	, closeBlock = "<span class='ui-icon ui-icon-close' role='presentation'></span>"
 	, closedHeight = "20px", openedHeight = "345px";
 $(function() {
@@ -86,8 +91,17 @@ function addChatMessage(m) {
 		var msg;
 		for (var i = 0; i < m.msg.length; ++i) {
 			var cm = m.msg[i];
-			//needModeration
-			msg = $(msgTemplate.replace(/#\{id\}/g, cm.id).replace(/#\{from\}/g, cm.from).replace(/#\{sent\}/g, cm.sent).replace(/#\{msg\}/g, cm.message));
+			msg = $(msgTemplate.replace(/#\{id\}/g, cm.id)
+					.replace(/#\{userId\}/g, cm.from.id)
+					.replace(/#\{imgSrc\}/g, cm.from.img)
+					.replace(/#\{from\}/g, cm.from.name)
+					.replace(/#\{sent\}/g, cm.sent)
+					.replace(/#\{msg\}/g, cm.message));
+			var date = msg.children('.date');
+			date.after(infoTemplate.replace(/#\{userId\}/g, cm.from.id));
+			date.after(addTemplate.replace(/#\{userId\}/g, cm.from.id));
+			date.after(messageTemplate.replace(/#\{userId\}/g, cm.from.id));
+			date.after(inviteTemplate.replace(/#\{userId\}/g, cm.from.id));
 			if (cm.needModeration) {
 				msg.append(acceptTemplate.replace(/#\{msgid\}/g, cm.id).replace(/#\{roomid\}/g, cm.scope.substring(9)));
 			}
@@ -97,6 +111,7 @@ function addChatMessage(m) {
 			if (m.mode == "accept") {
 				$('#chat-msg-id-' + cm.id).remove();
 			}
+			msg.append(clearBlock);
 			$('#' + cm.scope).append(msg);
 		}
 		if (msg[0]) {

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html Thu Dec  3 19:03:33 2015
@@ -56,7 +56,8 @@
 								<td wicket:id="search"></td>
 								<td style="white-space: nowrap;"><div wicket:id="add" class="add om-icon clickable" wicket:message="title:1186"
 									></div><div wicket:id="message" class="new-email om-icon clickable" wicket:message="title:1253"
-									></div><div wicket:id="view" class="user om-icon clickable" wicket:message="title:1236"></div></td>
+									></div><div wicket:id="view" class="user om-icon clickable" wicket:message="title:1236"
+									></div><div wicket:id="invite" class="invite om-icon clickable" wicket:message="title:1131"></div></td>
 							</tr>
 						</tbody>
 					</table>

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java Thu Dec  3 19:03:33 2015
@@ -125,6 +125,7 @@ public class UserSearchPanel extends Use
 				item.add(new WebMarkupContainer("add").setVisible(userId != getUserId() && !contactsDao.isContact(userId, getUserId()))
 						.add(AttributeAppender.append("onclick", String.format("addContact(%s);", userId))));
 				item.add(new WebMarkupContainer("message").setVisible(userId != getUserId()).add(AttributeAppender.append("onclick", String.format("privateMessage(%s);", userId))));
+				item.add(new WebMarkupContainer("invite").setVisible(userId != getUserId()).add(AttributeAppender.append("onclick", String.format("inviteUser(%s);", userId))));
 				//item.add(new TooltipBehavior(new Options("content", "TODO:: Picture will be displayed"))); //FIXME 
 			}
 		};

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomEnterBehavior.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomEnterBehavior.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomEnterBehavior.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomEnterBehavior.java Thu Dec  3 19:03:33 2015
@@ -27,11 +27,11 @@ import org.apache.wicket.core.request.ha
 
 public class RoomEnterBehavior extends AjaxEventBehavior {
 	private static final long serialVersionUID = 1L;
-	private final long roomid;
+	protected final long roomId;
 	
-	public RoomEnterBehavior(long roomid) {
+	public RoomEnterBehavior(long roomId) {
 		super("click");
-		this.roomid = roomid;
+		this.roomId = roomId;
 	}
 
 	public static OmUrlFragment getRoomUrlFragment(long roomId) {
@@ -44,6 +44,6 @@ public class RoomEnterBehavior extends A
 	
 	@Override
 	protected void onEvent(AjaxRequestTarget target) {
-		roomEnter((MainPage)getComponent().getPage(), target, roomid);
+		roomEnter((MainPage)getComponent().getPage(), target, roomId);
 	}
 }

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html Thu Dec  3 19:03:33 2015
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<table class="room-list">
+		<tr wicket:id="list" class="room-row">
+			<td>
+				<div wicket:id="roomContainer">		
+					<span wicket:id="roomName">[room name]</span><br/>
+					<wicket:message key="398" />&nbsp;<span wicket:id="curUsers"></span>&nbsp;/&nbsp;<span
+					wicket:id="totalUsers"></span>&nbsp;&nbsp;<span wicket:id="refresh" 
+					class="ui-icon ui-icon-arrowrefresh-1-n" style="display: inline-block"></span>
+				</div>
+			</td>
+			<td><button wicket:id="btn"><span wicket:id="label"></span></button></td>
+		</tr>
+	</table>
+</wicket:panel>
+</html>

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java Thu Dec  3 19:03:33 2015
@@ -0,0 +1,110 @@
+/*
+ * 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.user.rooms;
+
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.server.ISessionManager;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.UserPanel;
+import org.apache.openmeetings.web.pages.MainPage;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.ui.form.button.Button;
+
+public class RoomListPanel extends UserPanel {
+	private static final long serialVersionUID = 1L;
+	private final ListView<Room> list;
+
+	public RoomListPanel(String id, List<Room> rooms, final String label) {
+		super(id);
+		setOutputMarkupId(true);
+		add(list = new ListView<Room>("list", rooms) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(ListItem<Room> item) {
+				final Room r = item.getModelObject();
+				WebMarkupContainer roomContainer;
+				item.add((roomContainer = new WebMarkupContainer("roomContainer")).add(new AjaxEventBehavior("click"){
+					private static final long serialVersionUID = 1L;
+					
+					@Override
+					protected void onEvent(AjaxRequestTarget target) {
+						onContainerClick(target, r);
+					}
+				}));
+				roomContainer.add(new Label("roomName", r.getName()));
+				final Label curUsers = new Label("curUsers", new Model<Integer>(Application.getBean(ISessionManager.class).getClientListByRoom(r.getId()).size()));
+				roomContainer.add(curUsers.setOutputMarkupId(true));
+				roomContainer.add(new Label("totalUsers", r.getNumberOfPartizipants()));
+				item.add(new Button("btn").add(new Label("label", label)).add(new RoomEnterBehavior(r.getId()) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onEvent(AjaxRequestTarget target) {
+						onRoomEnter(target, roomId);
+					}
+				}));
+				roomContainer.add(new AjaxLink<Void>("refresh") {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void onClick(AjaxRequestTarget target) {
+						target.add(curUsers.setDefaultModelObject(Application.getBean(ISessionManager.class).getClientListByRoom(r.getId()).size()));
+						onRefreshClick(target, r);
+					}
+				});
+			}
+		});
+	}
+	
+	public void update(IPartialPageRequestHandler handler, List<Room> rooms) {
+		list.setList(rooms);
+		handler.add(this);
+	}
+
+	/**
+	 * this method need to be overriden to perform custom actions on room container click
+	 */
+	public void onContainerClick(AjaxRequestTarget target, Room r) {
+	}
+
+	/**
+	 * this method need to be overriden to perform custom actions on room refresh click
+	 */
+	public void onRefreshClick(AjaxRequestTarget target, Room r) {
+	}
+
+	/**
+	 * this method need to be overriden to perform custom actions on room enter click
+	 */
+	public void onRoomEnter(AjaxRequestTarget target, Long roomId) {
+		RoomEnterBehavior.roomEnter((MainPage)getPage(), target, roomId);
+	}
+}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.html?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.html Thu Dec  3 19:03:33 2015
@@ -23,19 +23,7 @@
 	<table>
 		<tr>
 			<td style="vertical-align: top">
-				<table class="room-list">
-					<tr wicket:id="list" class="room-row">
-						<td>
-							<div wicket:id="roomContainer">		
-								<span wicket:id="roomName">[room name]</span><br/>
-								<wicket:message key="398" />&nbsp;<span wicket:id="curUsers"></span>&nbsp;/&nbsp;<span
-								wicket:id="totalUsers"></span>&nbsp;&nbsp;<span wicket:id="refresh" 
-								class="ui-icon ui-icon-arrowrefresh-1-n" style="display: inline-block"></span>
-							</div>
-						</td>
-						<td><button wicket:id="enter"><wicket:message key="131"/></button></td>
-					</tr>
-				</table>
+				<div wicket:id="list"></div>
 			</td>
 			<td style="vertical-align: top">
 				<!-- Users in this Room -->

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java Thu Dec  3 19:03:33 2015
@@ -32,9 +32,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.common.UserPanel;
-import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.image.Image;
@@ -45,8 +43,6 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.request.resource.ByteArrayResource;
 import org.apache.wicket.util.io.IOUtils;
 
-import com.googlecode.wicket.jquery.ui.form.button.Button;
-
 public class RoomsPanel extends UserPanel {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
@@ -60,37 +56,20 @@ public class RoomsPanel extends UserPane
 
 	public RoomsPanel(String id, List<Room> rooms) {
 		super(id);
-		add(new ListView<Room>("list", rooms) {
+		add(new RoomListPanel("list", rooms, Application.getString(131)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void populateItem(ListItem<Room> item) {
-				final Room r = item.getModelObject();
-				WebMarkupContainer roomContainer;
-				item.add((roomContainer = new WebMarkupContainer("roomContainer")).add(new AjaxEventBehavior("click"){
-					private static final long serialVersionUID = 1L;
-					
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						roomId = r.getId();
-						updateRoomDetails(target);
-					}
-				}));
-				roomContainer.add(new Label("roomName", r.getName()));
-				final Label curUsers = new Label("curUsers", new Model<Integer>(Application.getBean(ISessionManager.class).getClientListByRoom(r.getId()).size()));
-				roomContainer.add(curUsers.setOutputMarkupId(true));
-				roomContainer.add(new Label("totalUsers", r.getNumberOfPartizipants()));
-				item.add(new Button("enter").add(new RoomEnterBehavior(r.getId())));
-				roomContainer.add(new AjaxLink<Void>("refresh") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					public void onClick(AjaxRequestTarget target) {
-						roomId = r.getId();
-						target.add(curUsers.setDefaultModelObject(Application.getBean(ISessionManager.class).getClientListByRoom(r.getId()).size()));
-						updateRoomDetails(target);
-					}
-				});
+			public void onContainerClick(AjaxRequestTarget target, Room r) {
+				roomId = r.getId();
+				updateRoomDetails(target);
+			}
+			
+			@Override
+			public void onRefreshClick(AjaxRequestTarget target, Room r) {
+				super.onRefreshClick(target, r);
+				roomId = r.getId();
+				updateRoomDetails(target);
 			}
 		});
 		

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html Thu Dec  3 19:03:33 2015
@@ -19,9 +19,9 @@
   
 -->
 <html xmlns:wicket="http://wicket.apache.org">
-	<wicket:panel>
-		<div wicket:id="title" class="rooms title"></div>
-		<div wicket:id="desc" class="rooms desc info-text"></div>
-		<div wicket:id="rooms"></div>
-	</wicket:panel>
+<wicket:panel>
+	<div wicket:id="title" class="rooms title"></div>
+	<div wicket:id="desc" class="rooms desc info-text"></div>
+	<div wicket:id="rooms"></div>
+</wicket:panel>
 </html>

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java?rev=1717837&view=auto
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java (added)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java Thu Dec  3 19:03:33 2015
@@ -0,0 +1,101 @@
+/*
+ * 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.util;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URI;
+
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ByteArrayResource;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.io.IOUtils;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+public class ProfileImageResourceReference extends ResourceReference {
+	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(ProfileImageResourceReference.class, webAppRootKey);
+
+	public ProfileImageResourceReference() {
+		super(ProfileImageResourceReference.class, "profile");
+	}
+	
+	public static String getUrl(RequestCycle rc, Long userId) {
+		return getUrl(rc, getBean(UserDao.class).get(userId));
+	}
+	
+	public static String getUrl(RequestCycle rc, User u) {
+		String uri = u.getPictureuri();
+		if (!isAbsolute(uri)) {
+			uri = rc.urlFor(new ProfileImageResourceReference(), new PageParameters().add("id", u.getId())).toString();
+		}
+		return uri;
+	}
+
+	private static boolean isAbsolute(String uri) {
+		boolean absolute = false;
+		try {
+			absolute = URI.create(uri).isAbsolute();
+		} catch (Exception e) {
+			//no-op
+		}
+		return absolute;
+	}
+	
+	@Override
+	public IResource getResource() {
+		return new ByteArrayResource("image/jpeg") {
+			private static final long serialVersionUID = 1L;
+			private Long userId = null;
+
+			@Override
+			protected ResourceResponse newResourceResponse(Attributes attributes) {
+				PageParameters params = attributes.getParameters();
+				userId = params.get("id").toOptionalLong();
+				ResourceResponse rr = super.newResourceResponse(attributes);
+				rr.disableCaching();
+				return rr;
+			}
+			
+			@Override
+			protected byte[] getData(Attributes attributes) {
+				String uri = getBean(UserDao.class).get(userId).getPictureuri();
+				if (!isAbsolute(uri)) {
+					File img = OmFileHelper.getUserProfilePicture(userId, uri);
+					try (InputStream is = new FileInputStream(img)) {
+						return IOUtils.toByteArray(is);
+					} catch (Exception e) {
+						log.error("failed to get bytes from image", e);
+					}
+				}
+				return null;
+			}
+		};
+	}
+}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java Thu Dec  3 19:03:33 2015
@@ -49,7 +49,6 @@ import org.apache.wicket.util.io.IOUtils
 import org.apache.wicket.util.resource.FileResourceStream;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
-import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.time.Time;
 import org.slf4j.Logger;
 
@@ -138,16 +137,6 @@ public abstract class RecordingResourceR
 	abstract String getFileName(Recording r);
 	abstract File getFile(Recording r);
 	
-	private Long getLong(StringValue id) {
-		Long result = null;
-		try {
-			result = id.toLongObject();
-		} catch(Exception e) {
-			//no-op
-		}
-		return result;
-	}
-	
 	private Recording getRecording(Long id) {
 		Recording r = getBean(RecordingDao.class).get(id);
 		// TODO should we process public?
@@ -171,14 +160,13 @@ public abstract class RecordingResourceR
 	
 	private Recording getRecording(Attributes attributes) {
 		PageParameters params = attributes.getParameters();
-		StringValue idStr = params.get("id");
-		Long id = getLong(idStr);
+		Long id = params.get("id").toOptionalLong();
 		WebSession ws = WebSession.get();
 		if (id != null && ws.isSignedIn()) {
 			return getRecording(id);
 		} else {
 			ws.invalidate();
-			if (ws.signIn(idStr.toString())) {
+			if (ws.signIn(params.get("id").toString())) {
 				return getRecording(getRecordingId());
 			}
 		}

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/chat.css
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/chat.css?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/chat.css (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/chat.css Thu Dec  3 19:03:33 2015
@@ -60,6 +60,11 @@
     font-style: italic;
     font-size: smaller;
 }
+#chatPanel #chat .messageArea img.profile {
+	vertical-align: middle;
+    max-height: 38px;
+    max-width: 38px;
+}
 #chatPanel #chat .messageArea .from {
 	margin-left: 5px;
     margin-right: 5px;
@@ -73,4 +78,5 @@
 #chatMessage .wysiwyg-editor {
 	height: 70px;
 	max-height: 70px;
+	max-width: 500px;
 }

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/forms.css
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/forms.css?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/forms.css (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/forms.css Thu Dec  3 19:03:33 2015
@@ -75,4 +75,4 @@ div.formCancelButton>div {
 	border: none;
 	margin-left: 2px;
 	margin-top: 2px;
-}
\ No newline at end of file
+}

Added: openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/images/connect.png
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/images/connect.png?rev=1717837&view=auto
==============================================================================
Binary file - no diff available.

Propchange: openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/images/connect.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/theme.css?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/branches/3.1.x/openmeetings-web/src/main/webapp/css/theme.css Thu Dec  3 19:03:33 2015
@@ -377,6 +377,9 @@ html, body {
 .doc.file.om-icon {
 	background-image: url(images/report.png);
 }
+.invite.om-icon {
+	background-image: url(images/connect.png);
+}
 .selected .file.item {
 	background-color: #0099FF;
 }
@@ -629,3 +632,9 @@ form .input {
 #contents .btn-file>input {
 	transform: translate(-3000px, 0) scale(1);
 }
+.room.list.container {
+	height: 150px;
+	max-height: 150px;
+	overflow-y: auto;
+	border: 1px solid #cccccc;
+}

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Thu Dec  3 19:03:33 2015
@@ -67,6 +67,7 @@ import org.apache.openmeetings.web.util.
 import org.apache.openmeetings.web.util.JpgRecordingResourceReference;
 import org.apache.openmeetings.web.util.Mp4RecordingResourceReference;
 import org.apache.openmeetings.web.util.OggRecordingResourceReference;
+import org.apache.openmeetings.web.util.ProfileImageResourceReference;
 import org.apache.openmeetings.web.util.UserDashboardPersister;
 import org.apache.wicket.Localizer;
 import org.apache.wicket.Page;
@@ -154,6 +155,7 @@ public class Application extends Authent
 		mountResource("/recordings/mp4/${id}", new Mp4RecordingResourceReference());
 		mountResource("/recordings/ogg/${id}", new OggRecordingResourceReference());
 		mountResource("/recordings/jpg/${id}", new JpgRecordingResourceReference()); //should be in sync with VideoPlayer
+		mountResource("/profile/${id}", new ProfileImageResourceReference()); //should be in sync with VideoPlayer
 	}
 
 	private static class NoVersionMapper extends MountedMapper {

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java Thu Dec  3 19:03:33 2015
@@ -18,68 +18,24 @@
  */
 package org.apache.openmeetings.web.common;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URI;
-
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.image.Image;
-import org.apache.wicket.request.resource.ByteArrayResource;
-import org.apache.wicket.util.io.IOUtils;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
 
 public class ProfileImagePanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
-	private static final Logger log = Red5LoggerFactory.getLogger(ProfileImagePanel.class, webAppRootKey);
 	protected final WebMarkupContainer profile;
 	
 	public ProfileImagePanel(String id, final long userId) {
 		super(id);
 		
 		profile = new TransparentWebMarkupContainer("profile");
-		String uri = getBean(UserDao.class).get(userId).getPictureuri();
-		boolean absolute = false;
-		try {
-			absolute = URI.create(uri).isAbsolute();
-		} catch (Exception e) {
-			//no-op
-		}
-		if (absolute) {
-			profile.add(new WebMarkupContainer("img").add(AttributeModifier.append("alt", Application.getString(5L)), AttributeModifier.append("src", uri)));
-		} else {
-			profile.add(new Image("img", new ByteArrayResource("image/jpeg") {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected ResourceResponse newResourceResponse(Attributes attributes) {
-					ResourceResponse rr = super.newResourceResponse(attributes);
-					rr.disableCaching();
-					return rr;
-				}
-				
-				@Override
-				protected byte[] getData(Attributes attributes) {
-					String uri = getBean(UserDao.class).get(userId).getPictureuri();
-					File img = OmFileHelper.getUserProfilePicture(userId, uri);
-					try (InputStream is = new FileInputStream(img)) {
-						return IOUtils.toByteArray(is);
-					} catch (Exception e) {
-						log.error("failed to get bytes from image", e);
-					}
-					return null;
-				}
-			}));
-		}
+		profile.add(new WebMarkupContainer("img").add(
+				AttributeModifier.append("alt", Application.getString(5L))
+				, AttributeModifier.append("src", getUrl(getRequestCycle(), userId))));
 		add(profile.setOutputMarkupId(true));
 	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html Thu Dec  3 19:03:33 2015
@@ -57,5 +57,6 @@
 	<div wicket:id="aboutDialog"></div>
 	<div wicket:id="userInfoDialog"></div>
 	<div wicket:id="newMessageDialog"></div>
+	<div wicket:id="inviteUserDialog"></div>
 </wicket:extend>
 </html>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Thu Dec  3 19:03:33 2015
@@ -51,8 +51,9 @@ import org.apache.openmeetings.web.room.
 import org.apache.openmeetings.web.room.message.RoomMessage;
 import org.apache.openmeetings.web.user.AboutDialog;
 import org.apache.openmeetings.web.user.ChatPanel;
-import org.apache.openmeetings.web.user.profile.MessageDialog;
-import org.apache.openmeetings.web.user.profile.UserInfoDialog;
+import org.apache.openmeetings.web.user.InviteUserToRoomDialog;
+import org.apache.openmeetings.web.user.MessageDialog;
+import org.apache.openmeetings.web.user.UserInfoDialog;
 import org.apache.openmeetings.web.util.ContactsHelper;
 import org.apache.openmeetings.web.util.OmUrlFragment;
 import org.apache.wicket.Component;
@@ -97,6 +98,7 @@ public class MainPage extends BaseInited
 	private final ChatPanel chat;
 	private final MessageDialog newMessage;
 	private final UserInfoDialog userInfo;
+	private final InviteUserToRoomDialog inviteUser;
 	
 	public MainPage(PageParameters pp) {
 		super();
@@ -162,6 +164,7 @@ public class MainPage extends BaseInited
 			}
 		});
 		add(userInfo = new UserInfoDialog("userInfoDialog", newMessage));
+		add(inviteUser = new InviteUserToRoomDialog("inviteUserDialog"));
 		add(new AbstractDefaultAjaxBehavior() {
 			private static final long serialVersionUID = 1L;
 
@@ -227,6 +230,20 @@ public class MainPage extends BaseInited
 				}
 			}
 		});
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				inviteUser.open(target, getParam(getComponent(), PARAM_USER_ID).toLong());
+			}
+			
+			@Override
+			public void renderHead(Component component, IHeaderResponse response) {
+				super.renderHead(component, response);
+				response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("inviteUser", this, explicit(PARAM_USER_ID)), "inviteUser")));
+			}
+		});
 		//load preselected content
 		add(areaBehavior = new AbstractAjaxTimerBehavior(Duration.ONE_SECOND) {
 			private static final long serialVersionUID = 1L;

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1717837&r1=1717836&r2=1717837&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Thu Dec  3 19:03:33 2015
@@ -28,6 +28,7 @@ import static org.apache.openmeetings.we
 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.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
 import java.util.ArrayList;
@@ -124,11 +125,11 @@ public class ChatPanel extends BasePanel
 		return o.put("scope", scope).put("scopeName", scopeName);
 	}
 	
-	public static JSONObject getMessage(List<ChatMessage> list) throws JSONException {
+	public JSONObject getMessage(List<ChatMessage> list) throws JSONException {
 		return getMessage(getUserId(), list);
 	}
 	
-	private static JSONObject getMessage(long curUserId, List<ChatMessage> list) throws JSONException {
+	private JSONObject getMessage(long curUserId, List<ChatMessage> list) throws JSONException {
 		JSONArray arr = new JSONArray();
 		for (ChatMessage m : list) {
 			String smsg = m.getMessage();
@@ -136,7 +137,12 @@ public class ChatPanel extends BasePanel
 			arr.put(setScope(new JSONObject(), m, curUserId)
 				.put("id", m.getId())
 				.put("message", smsg)
-				.put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
+				.put("from", new JSONObject()
+						.put("id", m.getFromUser().getId())
+						.put("name", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
+						.put("img", getUrl(getRequestCycle(), m.getFromUser().getId()))
+
+					)
 				.put("sent", getDateFormat().format(m.getSent())));
 		}
 		return new JSONObject()

Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html?rev=1717837&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html (added)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.html Thu Dec  3 19:03:33 2015
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<form wicket:id="form">
+		<textarea wicket:id="message" style="width: 100%; height: 100px;"></textarea>
+		<div>
+			<input type="checkbox" wicket:id="enterRoom" /><label wicket:for="enterRoom"><wicket:message key="1134"/></label>
+		</div>
+	</form>
+</wicket:panel>
+</html>

Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java?rev=1717837&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java (added)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java Thu Dec  3 19:03:33 2015
@@ -0,0 +1,90 @@
+/*
+ * 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.user;
+
+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.List;
+
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+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.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+
+public class InviteUserMessageDialog extends AbstractFormDialog<String>  {
+	private static final long serialVersionUID = 1L;
+	private final DialogButton send = new DialogButton("send", Application.getString(1139));
+	private final DialogButton cancel = new DialogButton("cancel", Application.getString(219));
+	private final Form<Void> form = new Form<Void>("form");
+	private final TextArea<String> message = new TextArea<>("message", Model.of(""));
+	private final CheckBox enterRoom = new CheckBox("enterRoom", Model.of(false));
+	
+	public InviteUserMessageDialog(String id) {
+		super(id, Application.getString(1138));
+		add(form.add(message.setRequired(true), enterRoom).setOutputMarkupId(true));
+	}
+
+	public void open(IPartialPageRequestHandler handler, Long roomId, Long userId) {
+		Room r = getBean(RoomDao.class).get(roomId);
+		User u = getBean(UserDao.class).get(getUserId());
+		message.setModelObject(String.format("%s %s %s %s", u.getFirstname(), u.getLastname(), getString("1137"), r.getName()));
+		enterRoom.setModelObject(false);
+		handler.add(form);
+		open(handler);
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return Arrays.asList(send, cancel);
+	}
+	
+	@Override
+	protected DialogButton getSubmitButton() {
+		return send;
+	}
+
+	@Override
+	public Form<?> getForm() {
+		return form;
+	}
+
+	@Override
+	protected void onError(AjaxRequestTarget target) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	protected void onSubmit(AjaxRequestTarget target) {
+		// TODO Auto-generated method stub
+		
+	}
+}

Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html?rev=1717837&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html (added)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html Thu Dec  3 19:03:33 2015
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div class="rooms desc info-text"><wicket:message key="1132"/></div>
+	<div class="rooms title"><wicket:message key="777"/></div>
+	<div class="room list container">
+		<div wicket:id="publicRooms"></div>
+	</div>
+	<div class="rooms title"><wicket:message key="779"/></div>
+	<div class="room list container">
+		<div wicket:id="privateRooms"></div>
+	</div>
+	<div wicket:id="inviteMsg"/>
+</wicket:panel>
+</html>