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

svn commit: r1781776 [2/2] - in /openmeetings/application: branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/ branches/3.2.x/ope...

Modified: openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Sun Feb  5 15:46:17 2017
@@ -111,13 +111,13 @@ public class ImportInitvalues {
 	private RoomDao roomDao;
 	@Autowired
 	private LabelDao labelDao;
-	
+
 	private int progress = 0;
 
 	public int getProgress() {
 		return progress;
 	}
-	
+
 	public void loadMainMenu() {
 		/*
 		 * ######################## Dashboard Menu Points
@@ -157,7 +157,7 @@ public class ImportInitvalues {
 		navimanagement.addMainStructure("adminModuleEmail", null, 24, "main.menu.admin.email", LEVEL_ADMIN, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc");
 		log.debug("MainMenu ADDED");
 	}
-	
+
 	public void loadErrorMappingsFromXML() throws Exception {
 		SAXReader reader = new SAXReader();
 		Document document = reader.read(new File(OmFileHelper.getLanguagesDir(), OmFileHelper.nameOfErrorFile));
@@ -222,10 +222,10 @@ public class ImportInitvalues {
 		cfgDao.add("email_userpass", cfg.mailAuthPass, null, "System auth email password");
 
 		cfgDao.add("mail.smtp.starttls.enable", cfg.mailUseTls, null, "Enable TLS 1=true, 0=false");
-		
+
 		cfgDao.add("mail.smtp.connection.timeout", "30000", null,
 				"Socket connection timeout value in milliseconds. Default is 30 seconds (30000).");
-		
+
 		cfgDao.add("mail.smtp.timeout", "30000", null,
 				"Socket I/O timeout value in milliseconds. Default is 30 seconds (30000).");
 
@@ -268,7 +268,7 @@ public class ImportInitvalues {
 					+ "The Font has to exist on the Server which runs Red5");
 
 		cfgDao.add(CONFIG_APPLICATION_BASE_URL, cfg.baseUrl, null, "Base URL your OPenmeetings installation will be accessible at.");
-		
+
 		// ***************************************
 		// ***************************************
 		// red5SIP Integration Coniguration Values
@@ -329,7 +329,7 @@ public class ImportInitvalues {
 		// mute/unmute audio key code
 		cfgDao.add("mute.keycode", "118", null,
 				"A hot key code for the 'mute/unmute audio' functionality. Keycode 118 is F7");
-		
+
 		// system-wide ldap params
 		cfgDao.add(CONFIG_DEFAULT_LDAP_ID, "0", null, "Ldap domain selected by default in the login screen");
 
@@ -341,9 +341,9 @@ public class ImportInitvalues {
 				, "Area to be shown to the user after login. Possible values are: "
 					+ "user/dashboard, user/calendar, user/record, rooms/my, rooms/group, rooms/public, admin/user, admin/connection"
 					+ ", admin/group, admin/room, admin/config, admin/lang, admin/ldap, admin/backup, admin/server, admin/oauth2");
-		
+
 		// oauth2 params
-		cfgDao.add(CONFIG_IGNORE_BAD_SSL, "no", null, 
+		cfgDao.add(CONFIG_IGNORE_BAD_SSL, "no", null,
 				"Set \"yes\" or \"no\" to enable/disable ssl certifications checking for OAuth2");
 
 		cfgDao.add(CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY, "", null,
@@ -382,7 +382,7 @@ public class ImportInitvalues {
 
 		r.setWaitForRecording(false);
 		r.setAllowRecording(true);
-		
+
 		if (groupId != null) {
 			RoomGroup ro = new RoomGroup();
 			ro.setRoom(r);
@@ -393,7 +393,7 @@ public class ImportInitvalues {
 		r = roomDao.update(r, null);
 		return r;
 	}
-	
+
 	public void loadDefaultRooms(boolean createRooms, long langId) {
 		if (createRooms) {
 			createRoom(labelDao.getString("install.room.public.interview", langId), Type.interview, 16L, true, null);
@@ -461,7 +461,7 @@ public class ImportInitvalues {
 		yandexServer.setFirstnameParamName("first_name");
 		yandexServer.setLastnameParamName("last_name");
 		oauthDao.update(yandexServer, null);
-		
+
 		// Google
 		OAuthServer googleServer = new OAuthServer();
 		googleServer.setName("Google");
@@ -480,7 +480,7 @@ public class ImportInitvalues {
 		googleServer.setFirstnameParamName("given_name");
 		googleServer.setLastnameParamName("family_name");
 		oauthDao.update(googleServer, null);
-		
+
 		// Facebook
 		OAuthServer facebookServer = new OAuthServer();
 		facebookServer.setName("Facebook");
@@ -499,7 +499,7 @@ public class ImportInitvalues {
 		facebookServer.setLastnameParamName("last_name");
 		oauthDao.update(facebookServer, null);
 	}
-	
+
 	// ------------------------------------------------------------------------------
 
 	public void loadSystem(InstallationConfig cfg, boolean force) throws Exception {

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Sun Feb  5 15:46:17 2017
@@ -54,7 +54,7 @@ public class OpenmeetingsVariables {
 
 	public static int DEFAULT_MINUTES_REMINDER_SEND = 15;
 	public static String DEFAULT_BASE_URL = "http://localhost:5080/openmeetings/";
-	
+
 	public static final String WEB_DATE_PATTERN = "dd.MM.yyyy HH:mm:ss"; //FIXME need to be made locale based
 	public static String webAppRootKey = null;
 	public static String webAppRootPath = null;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java Sun Feb  5 15:46:17 2017
@@ -75,9 +75,9 @@ import com.googlecode.wicket.jquery.ui.w
 
 /**
  * CRUD operations in form for {@link User}
- * 
+ *
  * @author swagner
- * 
+ *
  */
 public class UserForm extends AdminBaseForm<User> {
 	private static final long serialVersionUID = 1L;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Sun Feb  5 15:46:17 2017
@@ -40,6 +40,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.RoomPanel.Action;
+import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -47,6 +48,7 @@ import org.apache.wicket.extensions.mark
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 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.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
@@ -78,8 +80,7 @@ public class RoomSidebar extends Panel {
 	public static final String PARAM_SETTINGS = "s";
 	private final RoomPanel room;
 	private final TabbedPanel tabs;
-	private final ITab userTab;
-	private final ITab fileTab;
+	private final ITab userTab, fileTab;
 	private UploadDialog upload;
 	private RoomFilePanel roomFiles;
 	private final SelfIconsPanel selfRights;
@@ -232,7 +233,7 @@ public class RoomSidebar extends Panel {
 		this.room = room;
 		updateShowFiles();
 
-		userTab = new ITab() {
+		userTab = new OmTab() {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -241,6 +242,11 @@ public class RoomSidebar extends Panel {
 			}
 
 			@Override
+			public String getCssClass() {
+				return "om-icon big tab user";
+			}
+
+			@Override
 			public IModel<String> getTitle() {
 				return Model.of(getString("613"));
 			}
@@ -250,7 +256,7 @@ public class RoomSidebar extends Panel {
 				return new UserFragment(containerId, "user-panel");
 			}
 		};
-		fileTab = new ITab() {
+		fileTab = new OmTab() {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -259,6 +265,11 @@ public class RoomSidebar extends Panel {
 			}
 
 			@Override
+			public String getCssClass() {
+				return "om-icon big tab file";
+			}
+
+			@Override
 			public IModel<String> getTitle() {
 				return Model.of(getString("614"));
 			}
@@ -281,6 +292,17 @@ public class RoomSidebar extends Panel {
 			public void onActivate(AjaxRequestTarget target, int index, ITab tab) {
 				selectedIdx = index;
 			}
+
+			@Override
+			protected WebMarkupContainer newTabContainer(String id, String tabId, ITab tab, int index) {
+				WebMarkupContainer t = super.newTabContainer(id, tabId, tab, index);
+				Label link = newTitleLabel("link", tab.getTitle());
+				link.add(AttributeModifier.replace("href", "#" + tabId));
+				link.add(AttributeModifier.append("class", ((OmTab)tab).getCssClass()));
+				link.add(AttributeModifier.append("title", tab.getTitle()));
+				t.replace(link);
+				return t;
+			}
 		}).setOutputMarkupId(true));
 		selfRights = new SelfIconsPanel("icons", room.getClient(), room, true);
 		add(addFolder);
@@ -433,4 +455,11 @@ public class RoomSidebar extends Panel {
 		selectedIdx = 1;
 		tabs.reload(handler);
 	}
+
+	private static abstract class OmTab implements ITab {
+		private static final long serialVersionUID = 1L;
+
+		public abstract String getCssClass();
+	}
 }
+

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html?rev=1781776&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html Sun Feb  5 15:46:17 2017
@@ -0,0 +1,45 @@
+<?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 id="chatTabs">
+		<ul>
+			<li><a href="#chatTab-all"><wicket:message key="1494"/></a></li>
+		</ul>
+		<div id="chatTab-all" class="messageArea"></div>
+	</div>
+	<form wicket:id="sendForm">
+		<div style="display: inline-block;" wicket:id="toolbarContainer"></div>
+		<div style="display: inline-block; float: right; margin-right: 10px;">
+			<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:442"></div>
+		</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>
+</wicket:panel>
+</html>

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java?rev=1781776&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java Sun Feb  5 15:46:17 2017
@@ -0,0 +1,350 @@
+/*
+ * 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.chat;
+
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+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.getRoomClients;
+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.getRights;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
+import static org.apache.openmeetings.web.user.chat.EmotionsResources.EMOTIONS_CSS_REFERENCE;
+import static org.apache.openmeetings.web.user.chat.EmotionsResources.EMOTIONS_JS_REFERENCE;
+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.time.Duration;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+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.room.Room.Right;
+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.common.ConfirmableAjaxBorder;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+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.head.PriorityHeaderItem;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.markup.html.panel.Panel;
+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.json.JSONArray;
+import org.json.JSONObject;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
+import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
+
+public class Chat extends Panel {
+	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(Chat.class, webAppRootKey);
+	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 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 JSONObject getMessage(List<ChatMessage> list) {
+		return getMessage(getUserId(), list);
+	}
+
+	private JSONObject getMessage(long curUserId, List<ChatMessage> list) {
+		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", smsg)
+				.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("actions", curUserId == m.getFromUser().getId() ? "short" : "full")
+				.put("sent", getDateFormat().format(m.getSent())));
+		}
+		return new JSONObject()
+			.put("type", "chat")
+			.put("msg", arr);
+	}
+
+	public Chat(String id) {
+		super(id);
+		setOutputMarkupPlaceholderTag(true);
+		setMarkupId(id);
+
+		add(acceptMessage, new Behavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void renderHead(Component component, IHeaderResponse response) {
+				ChatDao dao = getBean(ChatDao.class);
+				//FIXME limited count should be loaded with "earlier" link
+				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)));
+				}
+				list.addAll(dao.getUserRecent(getUserId(), Date.from(Instant.now().minus(Duration.ofHours(1L))), 0, 30));
+				if (list.size() > 0) {
+					StringBuilder sb = new StringBuilder();
+					sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
+					response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
+				}
+				super.renderHead(component, response);
+			}
+		});
+		add(new ChatForm("sendForm"));
+	}
+
+	public CharSequence addRoom(Room r) {
+		StringBuilder sb = new StringBuilder();
+		sb.append(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ID_ROOM_PREFIX, r.getId(), Application.getString(406)));
+		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(");");
+		}
+		return sb;
+	}
+
+	@Override
+	public void renderHead(IHeaderResponse response) {
+		super.renderHead(response);
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(EMOTIONS_JS_REFERENCE)));
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(Chat.class, "chat.js"))));
+		response.render(CssHeaderItem.forReference(EMOTIONS_CSS_REFERENCE));
+		response.render(CssHeaderItem.forUrl("css/chat.css"));
+		response.render(new PriorityHeaderItem(getNamedFunction("acceptMessage", acceptMessage, explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
+	}
+
+	private static void sendRoom(ChatMessage m, String msg) {
+		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
+		for (Client c : getRoomClients(m.getToRoom().getId())) {
+			try {
+				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Right.moderator))) {
+					IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
+					if (con != null) {
+						con.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;
+
+					@Override
+					protected void onSubmit(AjaxRequestTarget target) {
+						ChatDao dao = getBean(ChatDao.class);
+						ChatMessage m = new ChatMessage();
+						m.setMessage(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);
+						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 {
+									IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
+									if (con != null) {
+										con.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 {
+									IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
+									if (con != null) {
+										con.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);
+					};
+				});
+		}
+
+		@Override
+		protected void onInitialize() {
+			super.onInitialize();
+			ConfirmableAjaxBorder delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), this) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onError(AjaxRequestTarget target, Form<?> form) {
+				}
+
+				@Override
+				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+					ChatDao dao = getBean(ChatDao.class);
+					String scope = activeTab.getModelObject();
+					boolean clean = false;
+					try {
+						if (scope == null || ID_ALL.equals(scope)) {
+							scope = ID_ALL;
+							dao.deleteGlobal();
+							clean = true;
+						} else if (scope.startsWith(ID_ROOM_PREFIX)) {
+							Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+							if (r != null) {
+								dao.deleteRoom(r.getId());
+								clean = true;
+							}
+						} else if (scope.startsWith(ID_USER_PREFIX)) {
+							User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+							if (u != null) {
+								dao.deleteUser(u.getId());
+								clean = true;
+							}
+						}
+					} catch (Exception e) {
+						//no-op
+					}
+					if (clean) {
+						target.appendJavaScript("$('#" + scope + "').html('')");
+					}
+				}
+			};
+			add(delBtn.setVisible(hasAdminLevel(getRights())));
+		}
+	}
+}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.html?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.html Sun Feb  5 15:46:17 2017
@@ -22,27 +22,8 @@
 <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-caret-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>
-		<form wicket:id="sendForm">
-			<div style="display: inline-block;" wicket:id="toolbarContainer"></div>
-			<div style="display: inline-block; float: right; margin-right: 10px;">
-				<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:442"></div>
-			</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:id="chat"></div>
 	</div>
 </wicket:panel>
 </html>
+

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.java?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatPanel.java Sun Feb  5 15:46:17 2017
@@ -18,174 +18,31 @@
  */
 package org.apache.openmeetings.web.user.chat;
 
-import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_CHAT;
-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.getRoomClients;
-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.getRights;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
-import static org.apache.openmeetings.web.user.chat.EmotionsResources.EMOTIONS_CSS_REFERENCE;
-import static org.apache.openmeetings.web.user.chat.EmotionsResources.EMOTIONS_JS_REFERENCE;
-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.time.Duration;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
-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.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-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.common.BasePanel;
-import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
-import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
-import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-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.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.json.JSONArray;
-import org.json.JSONObject;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-
-import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
-import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 
 @AuthorizeInstantiation({"Dashboard", "Room"})
 public class ChatPanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
-	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
-	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 boolean showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
-	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 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 JSONObject getMessage(List<ChatMessage> list) {
-		return getMessage(getUserId(), list);
-	}
-
-	private JSONObject getMessage(long curUserId, List<ChatMessage> list) {
-		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", smsg)
-				.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("actions", curUserId == m.getFromUser().getId() ? "short" : "full")
-				.put("sent", getDateFormat().format(m.getSent())));
-		}
-		return new JSONObject()
-			.put("type", "chat")
-			.put("msg", arr);
-	}
+	private final Chat chat;
 
 	public ChatPanel(String id) {
 		super(id);
 		setOutputMarkupPlaceholderTag(true);
 		setMarkupId(id);
 
-		add(acceptMessage, new Behavior() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void renderHead(Component component, IHeaderResponse response) {
-				ChatDao dao = getBean(ChatDao.class);
-				//FIXME limited count should be loaded with "earlier" link
-				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)));
-				}
-				list.addAll(dao.getUserRecent(getUserId(), Date.from(Instant.now().minus(Duration.ofHours(1L))), 0, 30));
-				if (list.size() > 0) {
-					StringBuilder sb = new StringBuilder();
-					sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
-					response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
-				}
-				super.renderHead(component, response);
-			}
-		});
-		add(new ChatForm("sendForm"));
+		add(chat = new Chat("chat"));
 	}
 
 	public void roomEnter(Room r, AjaxRequestTarget target) {
@@ -198,12 +55,8 @@ public class ChatPanel extends BasePanel
 		if (!showDashboardChat) {
 			sb.append("$('#chat').show();");
 		}
-		sb.append(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ID_ROOM_PREFIX, r.getId(), Application.getString(406)));
+		sb.append(chat.addRoom(r));
 		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);
 	}
@@ -212,7 +65,7 @@ public class ChatPanel extends BasePanel
 		if (r.isHidden(RoomElement.Chat)) {
 			return;
 		}
-		handler.appendJavaScript(String.format("if (typeof removeChatTab == 'function') { removeChatTab('%1$s%2$d'); }", ID_ROOM_PREFIX, r.getId()));
+		handler.appendJavaScript(String.format("if (typeof removeChatTab == 'function') { removeChatTab('%1$s%2$d'); }", Chat.ID_ROOM_PREFIX, r.getId()));
 		if (!showDashboardChat) {
 			StringBuilder sb = new StringBuilder();
 			sb.append("$(function() {");
@@ -227,7 +80,7 @@ public class ChatPanel extends BasePanel
 		if (handler != null) {
 			handler.add(this);
 			if (visible) {
-				handler.appendJavaScript("reinit();");
+				handler.appendJavaScript("chatReinit();");
 			}
 		}
 	}
@@ -235,11 +88,6 @@ public class ChatPanel extends BasePanel
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
-		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(EMOTIONS_JS_REFERENCE)));
-		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(ChatPanel.class, "chat.js"))));
-		response.render(CssHeaderItem.forReference(EMOTIONS_CSS_REFERENCE));
-		response.render(CssHeaderItem.forUrl("css/chat.css"));
-		response.render(new PriorityHeaderItem(getNamedFunction("acceptMessage", acceptMessage, explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
 		if (!showDashboardChat) {
 			StringBuilder sb = new StringBuilder();
 			sb.append("$(document).ready(function(){");
@@ -249,151 +97,5 @@ public class ChatPanel extends BasePanel
 			response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
 		}
 	}
-
-	private static void sendRoom(ChatMessage m, String msg) {
-		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
-		for (Client c : getRoomClients(m.getToRoom().getId())) {
-			try {
-				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Right.moderator))) {
-					IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
-					if (con != null) {
-						con.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;
-
-					@Override
-					protected void onSubmit(AjaxRequestTarget target) {
-						ChatDao dao = getBean(ChatDao.class);
-						ChatMessage m = new ChatMessage();
-						m.setMessage(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);
-						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 {
-									IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
-									if (con != null) {
-										con.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 {
-									IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
-									if (con != null) {
-										con.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);
-					};
-				});
-		}
-
-		@Override
-		protected void onInitialize() {
-			super.onInitialize();
-			ConfirmableAjaxBorder delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), this) {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onError(AjaxRequestTarget target, Form<?> form) {
-				}
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-					ChatDao dao = getBean(ChatDao.class);
-					String scope = activeTab.getModelObject();
-					boolean clean = false;
-					try {
-						if (scope == null || ID_ALL.equals(scope)) {
-							scope = ID_ALL;
-							dao.deleteGlobal();
-							clean = true;
-						} else if (scope.startsWith(ID_ROOM_PREFIX)) {
-							Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
-							if (r != null) {
-								dao.deleteRoom(r.getId());
-								clean = true;
-							}
-						} else if (scope.startsWith(ID_USER_PREFIX)) {
-							User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
-							if (u != null) {
-								dao.deleteUser(u.getId());
-								clean = true;
-							}
-						}
-					} catch (Exception e) {
-						//no-op
-					}
-					if (clean) {
-						target.appendJavaScript("$('#" + scope + "').html('')");
-					}
-				}
-			};
-			add(delBtn.setVisible(hasAdminLevel(getRights())));
-		}
-	}
 }
+

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html Sun Feb  5 15:46:17 2017
@@ -36,31 +36,36 @@
 			var editor = $('#chatMessage .wysiwyg-editor');
 			editor.html(editor.html() + ' ' + emoticon + ' ');
 		}
-		$(function() {
-			var emots = [":-)", ":)", ":o)", ":c)", ":^)", ":-D", ":-(", ":-9", ";-)", ":-P", ":-p", ":-Þ", ":-b"
-				, ":-O", ":-/", ":-X", ":-#", ":'(", "B-)", "8-)", ":-\\", ";*(", ":-*", ":]", ":>", "=]", "=)", "8)"
-				, ":}", ":D", "8D", "XD", "xD", "=D", ":(", ":<", ":[", ":{", "=(", ";)", ";]", ";D", ":P", ":p"
-				, "=P", "=p", ":b", ":Þ", ":O", "8O", ":/", "=/", ":S", ":#", ":X", "B)", "O:)", "<3", ";(", ">:)"
-				, ">;)", ">:(", "O_o", "O_O", "o_o", "0_o", "T_T", "^_^", "?-)"];
+		function initChatToolbar() {
+			var emtBtn = $('#emoticons');
+			emtBtn.html('');
+			emtBtn.append(' ' + emoticon.emoticonize(':)') + ' <b class="caret"></b>');
+			var emots = [].concat.apply([], [emoticon.threeCharEmoticons, emoticon.twoCharEmoticons]);
+			for (var ei in emoticon.specialEmoticons) {
+				emots.push(ei);
+			}
 			var emotMenuList = $('#emotMenuList');
-			var rowSize = 15;
+			emotMenuList.html('');
+			var rowSize = 20;
 			var row = $('<tr></tr>');
 			for (var i = 0; i < emots.length; ++i) {
 				row.append('<td><div class="emt" onclick="emtClick(\'' + emots[i] + '\');">'
-					+ emots[i] + '</div></td>');
+					+ emoticon.emoticonize(emots[i]) + '</div></td>');
 				if (i != 0 && i % rowSize == 0) {
 					emotMenuList.append(row);
 					row = $('<tr></tr>');
 				}
 			}
-			//$('.emt').emoticonize();
+		}
+		$(function() {
+			initChatToolbar();
 		});
 	</script>
 </wicket:head>
 <wicket:panel>
 	<div wicket:id="toolbar" class="btn-toolbar" data-role="editor-toolbar">
 		<div class="btn-group">
-			<a id="emoticons" class="chat btn emt dropdown-toggle" data-toggle="dropdown" title="Emoticons"> :) <b class="caret"></b></a>
+			<a id="emoticons" class="chat btn emt dropdown-toggle" data-toggle="dropdown" title="Emoticons"></a>
 			<ul class="chat dropdown-menu" >
 				<li>
 					<table id="emotMenuList">
@@ -83,3 +88,4 @@
 	</div>
 </wicket:panel>
 </html>
+

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js Sun Feb  5 15:46:17 2017
@@ -42,9 +42,10 @@ $(function() {
 			//no-op
 		}
 	});
-	reinit();
+	chatReinit();
 });
-function reinit() {
+function chatReinit() {
+	initChatToolbar();
 	chatTabs = $("#chatTabs").tabs({
 		activate: function(event, ui) {
 			$('#activeChatTab').val(ui.newPanel[0].id);
@@ -84,9 +85,12 @@ function toggleChat() {
 function activateTab(id) {
 	chatTabs.tabs("option", "active", chatTabs.find('a[href="#' + id + '"]').parent().index());
 }
+function chatInited() {
+	return !!$("#chatTabs").data("ui-tabs");
+}
 function addChatTab(id, label) {
-	if (!$("#chatTabs").data("ui-tabs")) {
-		reinit();
+	if (!chatInited()) {
+		chatReinit();
 	}
 	if ($('#chat').length < 1 || $('#' + id).length) {
 		return;
@@ -103,7 +107,9 @@ function addChatTab(id, label) {
 function removeChatTab(id) {
 	$('li[aria-controls="' + id + '"]').remove();
 	$('#' + id).remove();
-	chatTabs.tabs("refresh");
+	if (chatInited()) {
+		chatTabs.tabs("refresh");
+	}
 }
 function addChatMessage(m) {
 	if ($('#chat').length > 0 && m && m.type == "chat") {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.js?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.js Sun Feb  5 15:46:17 2017
@@ -16,10 +16,11 @@ var CSSEmoticon = function() {
 		":-)", ":o)", ":c)", ":^)", ":-D", ":-(", ":-9", ";-)", ":-P", ":-p", ":-Þ", ":-b", ":-O", ":-/", ":-X", ":-#", ":'(", "B-)", "8-)", ";*(", ":-*", ":-\\",
 		"?-)" // <== This is my own invention, it's a smiling pirate (with an eye-patch)!
 	];
-
+	this.threeCharEmoticons = this.threeCharacterEmoticons.slice();
 	this.twoCharacterEmoticons = [ // separate these out so that we can add a letter-spacing between the characters for better proportions
 		":)", ":]", "=]", "=)", "8)", ":}", ":D", ":(", ":[", ":{", "=(", ";)", ";]", ";D", ":P", ":p", "=P", "=p", ":b", ":Þ", ":O", ":/", "=/", ":S", ":#", ":X", "B)", ":|", ":\\", "=\\", ":*", ":&gt;", ":&lt;"
 	];
+	this.twoCharEmoticons = this.twoCharacterEmoticons.slice();
 
 	this.specialEmoticons = { // emoticons to be treated with a special class, hash specifies the additional class to add, along with standard css-emoticon class
 		"&gt;:)": {cssClass: "red-emoticon small-emoticon spaced-emoticon"},

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js Sun Feb  5 15:46:17 2017
@@ -1,2 +1,2 @@
 /* Dual licensed under the MIT and GPL licenses */
-var CSSEmoticon=function(){this.escapeCharacters=[")","(","*","[","]","{","}","|","^","<",">","\\","?","+","=","."];this.threeCharacterEmoticons=[":-)",":o)",":c)",":^)",":-D",":-(",":-9",";-)",":-P",":-p",":-Þ",":-b",":-O",":-/",":-X",":-#",":'(","B-)","8-)",";*(",":-*",":-\\","?-)"];this.twoCharacterEmoticons=[":)",":]","=]","=)","8)",":}",":D",":(",":[",":{","=(",";)",";]",";D",":P",":p","=P","=p",":b",":Þ",":O",":/","=/",":S",":#",":X","B)",":|",":\\","=\\",":*",":&gt;",":&lt;"];this.specialEmoticons={"&gt;:)":{cssClass:"red-emoticon small-emoticon spaced-emoticon"},"&gt;;)":{cssClass:"red-emoticon small-emoticon spaced-emoticon"},"&gt;:(":{cssClass:"red-emoticon small-emoticon spaced-emoticon"},"&gt;: )":{cssClass:"red-emoticon small-emoticon"},"&gt;; )":{cssClass:"red-emoticon small-emoticon"},"&gt;: (":{cssClass:"red-emoticon small-emoticon"},";(":{cssClass:"red-emoticon spaced-emoticon"},"&lt;3":{cssClass:"pink-emoticon counter-rotated"},"O_O":{cssClass:"no-rotate"},"o
 _o":{cssClass:"no-rotate"},"0_o":{cssClass:"no-rotate"},"O_o":{cssClass:"no-rotate"},"T_T":{cssClass:"no-rotate"},"^_^":{cssClass:"no-rotate"},"O:)":{cssClass:"small-emoticon spaced-emoticon"},"O: )":{cssClass:"small-emoticon"},"8D":{cssClass:"small-emoticon spaced-emoticon"},"XD":{cssClass:"small-emoticon spaced-emoticon"},"xD":{cssClass:"small-emoticon spaced-emoticon"},"=D":{cssClass:"small-emoticon spaced-emoticon"},"8O":{cssClass:"small-emoticon spaced-emoticon"},"[+=..]":{cssClass:"no-rotate nintendo-controller"}};var a=new RegExp('(\\'+this.escapeCharacters.join('|\\')+')','g');var b='(^|[\\s\\0])';for(var c=this.threeCharacterEmoticons.length-1;c>=0;--c){this.threeCharacterEmoticons[c]=this.threeCharacterEmoticons[c].replace(a,'\\$1');this.threeCharacterEmoticons[c]=new RegExp(b+'('+this.threeCharacterEmoticons[c]+')','g');}for(var c=this.twoCharacterEmoticons.length-1;c>=0;--c){this.twoCharacterEmoticons[c]=this.twoCharacterEmoticons[c].replace(a,'\\$1');this.twoCharacterEm
 oticons[c]=new RegExp(b+'('+this.twoCharacterEmoticons[c]+')','g');}for(var d in this.specialEmoticons){this.specialEmoticons[d].regexp=d.replace(a,'\\$1');this.specialEmoticons[d].regexp=new RegExp(b+'('+this.specialEmoticons[d].regexp+')','g');}this.defaults={animate:true,delay:500,exclude:'pre,code,.no-emoticons'};};CSSEmoticon.prototype.emoticonize=function(a,b){var c={};for(var d in this.defaults)c[d]=this.defaults[d];for(var d in b)c[d]=b[d];var e='span.css-emoticon';if(c.exclude)e+=','+c.exclude;var f=e.split(',');var g='css-emoticon';if(c.animate)g+=' un-transformed-emoticon animated-emoticon';for(var h in this.specialEmoticons){var i=g+" "+this.specialEmoticons[h].cssClass;a=a.replace(this.specialEmoticons[h].regexp,"$1<span class='"+i+"'>$2</span>");}for(var d in this.threeCharacterEmoticons){var j=this.threeCharacterEmoticons[d];a=a.replace(j,"$1<span class='"+g+"'>$2</span>");}for(var d in this.twoCharacterEmoticons){var j=this.twoCharacterEmoticons[d];a=a.replace(j,"$1<
 span class='"+g+" spaced-emoticon'>$2</span>");}if(c.animate)setTimeout(function(){var a=document.body.getElementsByClassName("un-transformed-emoticon");for(var b in a)if(typeof a[b]=="object")a[b].classList.remove("un-transformed-emoticon");},c.delay);return a;};
\ No newline at end of file
+var CSSEmoticon=function(){this.escapeCharacters=[")","(","*","[","]","{","}","|","^","<",">","\\","?","+","=","."];this.threeCharacterEmoticons=[":-)",":o)",":c)",":^)",":-D",":-(",":-9",";-)",":-P",":-p",":-Þ",":-b",":-O",":-/",":-X",":-#",":'(","B-)","8-)",";*(",":-*",":-\\","?-)"];this.threeCharEmoticons=this.threeCharacterEmoticons.slice();this.twoCharacterEmoticons=[":)",":]","=]","=)","8)",":}",":D",":(",":[",":{","=(",";)",";]",";D",":P",":p","=P","=p",":b",":Þ",":O",":/","=/",":S",":#",":X","B)",":|",":\\","=\\",":*",":&gt;",":&lt;"];this.twoCharEmoticons=this.twoCharacterEmoticons.slice();this.specialEmoticons={"&gt;:)":{cssClass:"red-emoticon small-emoticon spaced-emoticon"},"&gt;;)":{cssClass:"red-emoticon small-emoticon spaced-emoticon"},"&gt;:(":{cssClass:"red-emoticon small-emoticon spaced-emoticon"},"&gt;: )":{cssClass:"red-emoticon small-emoticon"},"&gt;; )":{cssClass:"red-emoticon small-emoticon"},"&gt;: (":{cssClass:"red-emoticon small-emoticon"},";(":{cssCl
 ass:"red-emoticon spaced-emoticon"},"&lt;3":{cssClass:"pink-emoticon counter-rotated"},"O_O":{cssClass:"no-rotate"},"o_o":{cssClass:"no-rotate"},"0_o":{cssClass:"no-rotate"},"O_o":{cssClass:"no-rotate"},"T_T":{cssClass:"no-rotate"},"^_^":{cssClass:"no-rotate"},"O:)":{cssClass:"small-emoticon spaced-emoticon"},"O: )":{cssClass:"small-emoticon"},"8D":{cssClass:"small-emoticon spaced-emoticon"},"XD":{cssClass:"small-emoticon spaced-emoticon"},"xD":{cssClass:"small-emoticon spaced-emoticon"},"=D":{cssClass:"small-emoticon spaced-emoticon"},"8O":{cssClass:"small-emoticon spaced-emoticon"},"[+=..]":{cssClass:"no-rotate nintendo-controller"}};var a=new RegExp('(\\'+this.escapeCharacters.join('|\\')+')','g');var b='(^|[\\s\\0])';for(var c=this.threeCharacterEmoticons.length-1;c>=0;--c){this.threeCharacterEmoticons[c]=this.threeCharacterEmoticons[c].replace(a,'\\$1');this.threeCharacterEmoticons[c]=new RegExp(b+'('+this.threeCharacterEmoticons[c]+')','g');}for(var c=this.twoCharacterEmoticon
 s.length-1;c>=0;--c){this.twoCharacterEmoticons[c]=this.twoCharacterEmoticons[c].replace(a,'\\$1');this.twoCharacterEmoticons[c]=new RegExp(b+'('+this.twoCharacterEmoticons[c]+')','g');}for(var d in this.specialEmoticons){this.specialEmoticons[d].regexp=d.replace(a,'\\$1');this.specialEmoticons[d].regexp=new RegExp(b+'('+this.specialEmoticons[d].regexp+')','g');}this.defaults={animate:true,delay:500,exclude:'pre,code,.no-emoticons'};};CSSEmoticon.prototype.emoticonize=function(a,b){var c={};for(var d in this.defaults)c[d]=this.defaults[d];for(var d in b)c[d]=b[d];var e='span.css-emoticon';if(c.exclude)e+=','+c.exclude;var f=e.split(',');var g='css-emoticon';if(c.animate)g+=' un-transformed-emoticon animated-emoticon';for(var h in this.specialEmoticons){var i=g+" "+this.specialEmoticons[h].cssClass;a=a.replace(this.specialEmoticons[h].regexp,"$1<span class='"+i+"'>$2</span>");}for(var d in this.threeCharacterEmoticons){var j=this.threeCharacterEmoticons[d];a=a.replace(j,"$1<span clas
 s='"+g+"'>$2</span>");}for(var d in this.twoCharacterEmoticons){var j=this.twoCharacterEmoticons[d];a=a.replace(j,"$1<span class='"+g+" spaced-emoticon'>$2</span>");}if(c.animate)setTimeout(function(){var a=document.body.getElementsByClassName("un-transformed-emoticon");for(var b in a)if(typeof a[b]=="object")a[b].classList.remove("un-transformed-emoticon");},c.delay);return a;};

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java Sun Feb  5 15:46:17 2017
@@ -75,7 +75,7 @@ public class OmUrlFragment implements Se
 	public static final OmUrlFragment PROFILE_MESSAGES = new OmUrlFragment(AreaKeys.profile, TYPE_MESSAGES);
 	public static final OmUrlFragment CALENDAR = new OmUrlFragment(AreaKeys.user, TYPE_CALENDAR);
 	public static final OmUrlFragment ROOMS_PUBLIC = new OmUrlFragment(AreaKeys.rooms, TYPE_PUBLIC);
-	
+
 	public enum AreaKeys {
 		user
 		, admin
@@ -83,7 +83,7 @@ public class OmUrlFragment implements Se
 		, room
 		, rooms
 	}
-	
+
 	public enum MenuActions {
 		dashboardModuleStartScreen
 		, dashboardModuleCalendar
@@ -104,13 +104,13 @@ public class OmUrlFragment implements Se
 		, adminModuleOAuth
 		, adminModuleEmail
 	}
-	
+
 	public enum MenuParams {
 		publicTabButton
 		, privateTabButton
 		, myTabButton
 	}
-	
+
 	public static OmUrlFragment get() {
 		String[] arr = getBean(ConfigurationDao.class).getConfValue(CONFIG_DEFAULT_LANDING_ZONE, String.class, "").split("/");
 		if (arr != null && arr.length == 2) {
@@ -122,16 +122,16 @@ public class OmUrlFragment implements Se
 		}
 		return DASHBOARD;
 	}
-	
+
 	public OmUrlFragment(AreaKeys area, String type) {
 		this.setArea(area);
 		this.setType(type);
 	}
-	
+
 	public OmUrlFragment(MenuActions action) {
 		this(action, MenuParams.myTabButton);
 	}
-	
+
 	public OmUrlFragment(MenuActions action, MenuParams params) {
 		switch(action) {
 			case dashboardModuleStartScreen:
@@ -228,7 +228,7 @@ public class OmUrlFragment implements Se
 	public void setType(String type) {
 		this.type = type;
 	}
-	
+
 	public static BasePanel getPanel(AreaKeys area, String type) {
 		BasePanel basePanel = null;
 		switch(area) {
@@ -301,7 +301,7 @@ public class OmUrlFragment implements Se
 		}
 		return basePanel;
 	}
-	
+
 	public String getLink() {
 		return getBean(ConfigurationDao.class).getBaseUrl() + "#" + getArea().name() + "/" + getType();
 	}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/chat.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/chat.css?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/chat.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/chat.css Sun Feb  5 15:46:17 2017
@@ -27,47 +27,47 @@
 #chatPanel #chat {
 	height: 20px;
 }
-#chatPanel #chat .btn-toolbar {
+##chat .btn-toolbar {
 	margin-top: 2px;
 	margin-bottom: 0;
 	margin-left: 5px;
 }
-#chatPanel #chat #chatTabs.ui-tabs {
+#chat #chatTabs.ui-tabs {
 	padding: 0;
 }
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav {
+#chat #chatTabs.ui-tabs .ui-tabs-nav {
 	padding: 0;
 }
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav li {
+#chat #chatTabs.ui-tabs .ui-tabs-nav li {
 	margin: 0;
 }
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav li .ui-icon.ui-icon-close {
+#chat #chatTabs.ui-tabs .ui-tabs-nav li .ui-icon.ui-icon-close {
 	float: left;
 }
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+#chat #chatTabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
 	padding: 2px .5em;
 	float: left;
 }
-#chatPanel #chat .control.block .ui-icon {
+#chat .control.block .ui-icon {
 	text-align: center;
 }
-#chatPanel #chat .control.block .label {
+#chat .control.block .label {
 	display: inline-block;
 	padding-left: 20px;
 }
-#chatPanel #chat .messageArea .date {
-    margin-right: 5px;
-    font-style: italic;
-    font-size: smaller;
+#chat .messageArea .date {
+	margin-right: 5px;
+	font-style: italic;
+	font-size: smaller;
 }
-#chatPanel #chat .messageArea img.profile {
+#chat .messageArea img.profile {
 	vertical-align: middle;
-    max-height: 38px;
-    max-width: 38px;
+	max-height: 38px;
+	max-width: 38px;
 }
-#chatPanel #chat .messageArea .from {
+#chat .messageArea .from {
 	margin-left: 5px;
-    margin-right: 5px;
+	margin-right: 5px;
 	font-weight: bold;
 }
 .ui-tabs .ui-tabs-panel.messageArea {

Added: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/images/folder_explore.png
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/images/folder_explore.png?rev=1781776&view=auto
==============================================================================
Binary file - no diff available.

Propchange: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/images/folder_explore.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/images/group.png
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/images/group.png?rev=1781776&view=auto
==============================================================================
Binary file - no diff available.

Propchange: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/images/group.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css Sun Feb  5 15:46:17 2017
@@ -271,3 +271,14 @@
 	padding: .1em .7em;
 	font-weight: bolder;
 }
+.room.sidebar.left .tab.om-icon.big {
+	padding: 0em 1em 0 2.5em;
+	line-height: 30px;
+}
+.room.sidebar.left .tab.om-icon.big.user {
+	background-image: url(images/group.png);
+}
+.room.sidebar.left .tab.om-icon.big.file {
+	background-image: url(images/folder_explore.png);
+}
+

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css?rev=1781776&r1=1781775&r2=1781776&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css Sun Feb  5 15:46:17 2017
@@ -322,7 +322,7 @@ html, body {
 	background-image: url(images/email_add.png);
 }
 .user.om-icon {
-	background: url(images/user.png);
+	background-image: url(images/user.png);
 }
 .refresh.om-icon {
 	background-image: url(images/refresh.png);
@@ -686,3 +686,4 @@ form .input {
 	width: 75%;
 	vertical-align: middle;
 }
+